{"version":3,"sources":["../../../src/index.ts","../../../src/config/Config.ts","../../../src/model/enum/BitType.ts","../../../src/model/enum/Count.ts","../../../src/model/enum/ExampleType.ts","../../../src/model/enum/Tag.ts","../../../src/model/enum/TagFormat.ts","../../../src/model/enum/TextFormat.ts","../../../src/model/config/enum/CardSetConfigKey.ts","../../../src/model/config/enum/GroupConfigType.ts","../../../src/model/enum/BitTagConfigKeyType.ts","../../../src/model/config/AbstractTagConfig.ts","../../../src/model/config/MarkupTagConfig.ts","../../../src/model/config/PropertyTagConfig.ts","../../../src/model/config/ResourceTagConfig.ts","../../../src/model/config/CardVariantConfig.ts","../../../src/model/config/CardSideConfig.ts","../../../src/model/config/CardSetConfig.ts","../../../src/model/config/BitConfig.ts","../../../src/model/config/enum/ConfigKey.ts","../../../src/model/enum/GroupKey.ts","../../../src/model/enum/PropertyKey.ts","../../../src/model/enum/ResourceKey.ts","../../../src/model/enum/ResourceType.ts","../../../src/utils/StringUtils.ts","../../../src/model/config/ResourcesConfig.ts","../../../src/utils/ObjectUtils.ts","../../../src/config/ConfigHydrator.ts","../../../src/config/raw/cardSets.ts","../../../src/config/raw/groups.ts","../../../src/config/raw/bits.ts","../../../src/generated/package_info.ts","../../../src/utils/env/Environment.ts","../../../src/utils/env/Os.ts","../../../src/utils/env/userAgent.ts","../../../src/utils/env/Version.ts","../../../src/utils/env/Env.ts","../../../src/init/init.ts","../../../src/ast/Ast.ts","../../../src/model/enum/BodyBitType.ts","../../../src/model/enum/TextMarkType.ts","../../../src/model/enum/TextNodeType.ts","../../../src/model/ast/NodeType.ts","../../../src/ast/Builder.ts","../../../src/model/enum/TextLocation.ts","../../../src/model/enum/BodyTextFormat.ts","../../../src/breakscaping/RegexConfigs.ts","../../../src/breakscaping/BreakscapeRegex.ts","../../../src/breakscaping/Breakscape.ts","../../../src/model/enum/DeprecatedTextFormat.ts","../../../src/parser/json/TableUtils.ts","../../../src/utils/ArrayUtils.ts","../../../src/generator/text/TextGenerator.ts","../../../src/model/enum/BitmarkVersion.ts","../../../src/generator/AstWalkerGenerator.ts","../../../src/generated/parser/text/text-peggy-parser.js","../../../src/parser/text/peg/TextPegParser.ts","../../../src/parser/text/TextParser.ts","../../../src/utils/BooleanUtils.ts","../../../src/utils/NumberUtils.ts","../../../src/ast/BaseBuilder.ts","../../../src/utils/BitUtils.ts","../../../src/ast/ResourceBuilder.ts","../../../src/utils/UrlUtils.ts","../../../src/ast/rules/NodeValidator.ts","../../../src/ast/writer/StringWriter.ts","../../../src/BitmarkParserGenerator.ts","../../../src/generator/bitmark/BitmarkGenerator.ts","../../../src/model/enum/CardSetVersion.ts","../../../src/generator/bitmark/BitmarkStringGenerator.ts","../../../src/generator/json/JsonGenerator.ts","../../../src/generator/json/JsonObjectGenerator.ts","../../../src/info/InfoBuilder.ts","../../../src/model/enum/BitmarkParserType.ts","../../../src/model/info/enum/InfoFormat.ts","../../../src/model/info/enum/InfoType.ts","../../../src/parser/json/JsonParser.ts","../../../src/parser/bitmark/peg/BitmarkPegParserTypes.ts","../../../src/parser/bitmark/peg/PeggyGrammarLocation.ts","../../../src/parser/bitmark/peg/BitmarkPegParserHelper.ts","../../../src/parser/bitmark/peg/BitmarkPegParserProcessor.ts","../../../src/parser/bitmark/peg/BitmarkPegParserValidator.ts","../../../src/parser/bitmark/peg/contentProcessors/ContentProcessorUtils.ts","../../../src/parser/bitmark/peg/contentProcessors/BodyContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/CardContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/DefaultTagContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/FooterContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/GapChainContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/ClozeTagContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/ItemLeadChainContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/ItemLeadTagContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/MarkChainContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/MarkTagContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/PropertyContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/BookChainContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/ExampleTagContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/GroupTagChainContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/ImageSourceChainContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/InternalCommentTagContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/MarkConfigChainContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/PersonChainContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/RatingLevelChainContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/ServingsChainContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/TechnicalTermChainContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/ReferenceTagContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/ResourceContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/TitleTagContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/TrueFalseTagContentProcessor.ts","../../../src/parser/bitmark/peg/contentProcessors/TrueFalseChainContentProcessor.ts","../../../src/generated/parser/bitmark/bitmark-peggy-parser.js","../../../src/parser/bitmark/peg/BitmarkPegParser.ts","../../../src/parser/bitmark/BitmarkParser.ts","../../../src/generator/json/JsonStringGenerator.ts"],"sourcesContent":["import { init } from './init/init.ts';\n\nexport { Ast } from './ast/Ast.ts';\nexport { Builder } from './ast/Builder.ts';\nexport { ResourceBuilder } from './ast/ResourceBuilder.ts';\nexport { StringWriter } from './ast/writer/StringWriter.ts';\nexport { BitmarkParserGenerator, Input, InputFormat, Output } from './BitmarkParserGenerator.ts';\nexport { BitmarkGenerator } from './generator/bitmark/BitmarkGenerator.ts';\nexport { BitmarkStringGenerator } from './generator/bitmark/BitmarkStringGenerator.ts';\nexport { JsonGenerator } from './generator/json/JsonGenerator.ts';\nexport { JsonStringGenerator } from './generator/json/JsonStringGenerator.ts';\nexport { NodeType } from './model/ast/NodeType.ts';\nexport { BitmarkParserType } from './model/enum/BitmarkParserType.ts';\nexport { BitmarkVersion } from './model/enum/BitmarkVersion.ts';\nexport { BitType } from './model/enum/BitType.ts';\nexport { BodyTextFormat } from './model/enum/BodyTextFormat.ts';\nexport { CardSetVersion } from './model/enum/CardSetVersion.ts';\nexport { TextMarkType } from './model/enum/TextMarkType.ts';\nexport { TextNodeType } from './model/enum/TextNodeType.ts';\nexport { InfoFormat } from './model/info/enum/InfoFormat.ts';\nexport { InfoType } from './model/info/enum/InfoType.ts';\nexport { BitmarkParser } from './parser/bitmark/BitmarkParser.ts';\nexport { JsonParser } from './parser/json/JsonParser.ts';\n\n//\n// Direct text parser export\n//\nexport { parse as bitmarkTextParse } from './parser/text/peg/TextPegParser.ts';\n\n//\n// Exports that are stripped out for the browser\n//\n\n/*\n * NOTE:\n *\n * We want to be able to strip out the NodeJS specific functions from the final bundle.\n * Any code between the comments STRIP:START and STRIP:END will be removed.\n *\n * However, the prettifier will move comments that it does not believe are associated with code.\n *\n * Therefore we have to use some dummy code to prevent it from removing the STRIP stripping comments.\n */\nconst STRIP = 0;\n\nSTRIP; // eslint-disable-line @typescript-eslint/no-unused-expressions\n\n//\n// Type only exports\n//\n\nexport type { AstWalkCallbacks, NodeInfo } from './ast/Ast.ts';\nexport type { FileOptions } from './ast/writer/FileWriter.ts';\nexport { type Writer } from './ast/writer/Writer.ts';\nexport type {\n  BreakscapeOptions,\n  ConvertOptions,\n  ConvertTextOptions,\n  CreateAstOptions,\n  InfoOptions,\n  InputFormatType,\n  InputType,\n  OutputType,\n  UpgradeOptions as PrettifyOptions,\n  TextJsonOptions,\n  UnbreakscapeOptions,\n  UpgradeOptions,\n} from './BitmarkParserGenerator.ts';\nexport type { BitmarkOptions } from './generator/bitmark/BitmarkGenerator.ts';\nexport type { Generator } from './generator/Generator.ts';\nexport type { JsonOptions } from './generator/json/JsonGenerator.ts';\nexport { type BreakscapedString } from './model/ast/BreakscapedString.ts';\nexport type {\n  Bit,\n  BitmarkAst,\n  Body,\n  BodyPart,\n  CardBit,\n  CardNode,\n  Example,\n  ExtraProperties,\n  Footer,\n  Node,\n  Property,\n} from './model/ast/Nodes.ts';\nexport type { NodeTypeType } from './model/ast/NodeType.ts';\nexport type {\n  CodeBlockTextNode,\n  CodeBlockTextNodeAttributes,\n  CommentMark,\n  ExtRefMark,\n  ExtRefMarkAttibutes,\n  FootnoteAttibutes,\n  FootnoteMark,\n  HeadingTextNode,\n  HeadingTextNodeAttributes,\n  ImageInlineTextNode,\n  ImageTextNode,\n  ImageTextNodeAttributes,\n  LatexTextNode,\n  LatexTextNodeAttributes,\n  LinkMark,\n  LinkMarkAttibutes,\n  ListTextNode,\n  ListTextNodeAttributes,\n  MediaAttributes,\n  RefMark,\n  RefMarkAttibutes,\n  SectionTextNode,\n  SymbolMark,\n  TaskItemTextNode,\n  TaskItemTextNodeAttributes,\n  JsonText as Text,\n  TextAst,\n  TextMark,\n  TextMarkAttibutes,\n  TextNode,\n  TextNodeAttibutes,\n  XRefMark,\n  XRefMarkAttibutes,\n} from './model/ast/TextNodes.ts';\nexport type { BitmarkParserTypeType } from './model/enum/BitmarkParserType.ts';\nexport type { BitmarkVersionType } from './model/enum/BitmarkVersion.ts';\nexport type { BitTypeType } from './model/enum/BitType.ts';\nexport type { BodyTextFormatType } from './model/enum/BodyTextFormat.ts';\nexport type { CardSetVersionType } from './model/enum/CardSetVersion.ts';\nexport type { ResourceTypeType } from './model/enum/ResourceType.ts';\nexport type { TextMarkTypeType } from './model/enum/TextMarkType.ts';\nexport type { TextNodeTypeType } from './model/enum/TextNodeType.ts';\nexport type { InfoFormatType } from './model/info/enum/InfoFormat.ts';\nexport type { InfoTypeType } from './model/info/enum/InfoType.ts';\nexport type {\n  BitJson,\n  BookJson,\n  BookReferenceJson,\n  BotResponseJson,\n  ChoiceJson,\n  DefinitionListItemJson,\n  ExampleJson,\n  FeedbackChoiceJson,\n  FeedbackJson,\n  FeedbackReasonJson,\n  FlashcardJson,\n  GroupTagJson,\n  HeadingJson,\n  ImageSourceJson,\n  IngredientJson,\n  ListItemJson,\n  MarkConfigJson,\n  MatrixCellJson,\n  MatrixJson,\n  PairJson,\n  PersonJson,\n  PronunciationTableCellJson,\n  PronunciationTableJson,\n  QuestionJson,\n  QuizJson,\n  RatingLevelStartEndJson,\n  ResponseJson,\n  ServingsJson,\n  StatementJson,\n  TableCellJson,\n  TableExtendedJson,\n  TableJson,\n  TableRowJson,\n  TableSectionJson,\n  TechnicalTermJson,\n  TextAndIconJson,\n} from './model/json/BitJson.ts';\nexport type { BitWrapperJson } from './model/json/BitWrapperJson.ts';\nexport type {\n  BodyBitJson,\n  BodyBitsJson,\n  GapJson,\n  HighlightJson,\n  HighlightTextJson,\n  MarkJson,\n  SelectJson,\n  SelectOptionJson,\n} from './model/json/BodyBitJson.ts';\nexport type { ParserJson } from './model/json/ParserJson.ts';\nexport type {\n  AppLinkResourceJson,\n  AppLinkResourceWrapperJson,\n  ArticleResourceJson,\n  ArticleResourceWrapperJson,\n  AudioEmbedResourceJson,\n  AudioEmbedResourceWrapperJson,\n  AudioLinkResourceJson,\n  AudioLinkResourceWrapperJson,\n  AudioResourceJson,\n  AudioResourceWrapperJson,\n  DocumentDownloadResourceJson,\n  DocumentDownloadResourceWrapperJson,\n  DocumentEmbedResourceJson,\n  DocumentEmbedResourceWrapperJson,\n  DocumentLinkResourceJson,\n  DocumentLinkResourceWrapperJson,\n  DocumentResourceJson,\n  DocumentResourceWrapperJson,\n  ImageLinkResourceJson,\n  ImageLinkResourceWrapperJson,\n  ImageResourceJson,\n  ImageResourceWrapperJson,\n  ResourceDataJson,\n  ResourceJson,\n  ResourceWrapperJson,\n  StillImageFilmEmbedResourceJson,\n  StillImageFilmEmbedResourceWrapperJson,\n  StillImageFilmLinkResourceJson,\n  StillImageFilmLinkResourceWrapperJson,\n  StillImageFilmResourceJson,\n  StillImageFilmResourceWrapperJson,\n  VideoEmbedResourceJson,\n  VideoEmbedResourceWrapperJson,\n  VideoLinkResourceJson,\n  VideoLinkResourceWrapperJson,\n  VideoResourceJson,\n  VideoResourceWrapperJson,\n  WebsiteLinkResourceJson,\n  WebsiteLinkResourceWrapperJson,\n} from './model/json/ResourceJson.ts';\n\n// Initialise the application\ninit();\n","import { Enum } from '@ncoderz/superenum';\n\nimport { type _BitConfig, type _PropertiesConfig } from '../model/config/_Config.ts';\nimport { BitConfig } from '../model/config/BitConfig.ts';\nimport type { CardVariantConfig } from '../model/config/CardVariantConfig.ts';\nimport { ConfigKey, type ConfigKeyType } from '../model/config/enum/ConfigKey.ts';\nimport { GroupConfigType } from '../model/config/enum/GroupConfigType.ts';\nimport { ResourcesConfig } from '../model/config/ResourcesConfig.ts';\nimport { ResourceTagConfig } from '../model/config/ResourceTagConfig.ts';\nimport { type TagConfig } from '../model/config/TagConfig.ts';\nimport { type TagsConfig } from '../model/config/TagsConfig.ts';\nimport { BitTagConfigKeyType } from '../model/enum/BitTagConfigKeyType.ts';\nimport { BitType, type BitTypeType } from '../model/enum/BitType.ts';\nimport { Count } from '../model/enum/Count.ts';\nimport type { ResourceKeyType } from '../model/enum/ResourceKey.ts';\nimport { resourceTypeToConfigKey, type ResourceTypeType } from '../model/enum/ResourceType.ts';\nimport { TagFormat } from '../model/enum/TagFormat.ts';\nimport { TextFormat } from '../model/enum/TextFormat.ts';\nimport { ObjectUtils } from '../utils/ObjectUtils.ts';\nimport { ConfigHydrator } from './ConfigHydrator.ts';\nimport { BITS } from './raw/bits.ts';\nimport { GROUPS } from './raw/groups.ts';\n\nexport interface ComboResources {\n  [configKey: string]: TagsConfig;\n}\n\nclass Config {\n  public bitLevelMin = 1;\n  public bitLevelMax = 7;\n  private bitCache: Map<BitTypeType, BitConfig> = new Map();\n  private allResourcesCache: TagsConfig | undefined;\n  private comboResourcesCache: Map<ConfigKeyType, TagsConfig | undefined> = new Map();\n\n  constructor() {\n    //\n  }\n\n  /**\n   * Return the bitType given a bit type that may be invalid\n   *\n   * If the bit type is not found, the _error bit type will be returned.\n   *\n   * @param bitType bit type in (may be invalid)\n   * @returns valid bitType, or _error if the bit type is invalid\n   */\n  public getBitType(bitType: BitTypeType | string | undefined): BitTypeType {\n    if (bitType?.startsWith('|')) bitType = bitType.substring(1);\n    return Enum(BitType).fromValue(bitType) ?? BitType._error;\n  }\n\n  /**\n   * Check if a bit type is and instance of the given root bit type.\n   *\n   * @param bitType the bit type\n   * @param baseBitType the root bit type or types to check\n   */\n  public isOfBitType(\n    bitType: BitTypeType | undefined,\n    baseBitType: BitTypeType | BitTypeType[],\n  ): boolean {\n    if (!bitType) return false;\n    if (bitType === baseBitType) return true;\n    const bitConfig = this.getBitConfig(bitType);\n    if (!bitConfig) return false;\n\n    if (Array.isArray(baseBitType)) {\n      for (const bt of baseBitType) {\n        if (bitConfig.inheritedBitTypesSet.has(bt)) return true;\n      }\n      return false;\n    }\n\n    return bitConfig.inheritedBitTypesSet.has(baseBitType);\n  }\n\n  /**\n   * Return true if the bit type is commented.\n   *\n   * @param bitType bit type in (may be invalid)\n   * @returns true if the bit type is commented\n   */\n  public isBitTypeCommented(bitType: string | undefined): boolean {\n    return !!bitType?.startsWith('|');\n  }\n\n  /**\n   * Get the configuration for a bit.\n   *\n   * @param bitType\n   * @returns the bit configuration\n   */\n  public getBitConfig(bitType: BitTypeType): BitConfig {\n    let bitConfig = this.bitCache.get(bitType);\n    if (!bitConfig) {\n      const throwNotFoundError = () => {\n        throw new Error(`No config found for bit: ${bitType}`);\n      };\n\n      // Get the bit configs, following the inheritance tree\n      const inheritedBitTypes: BitTypeType[] = [];\n      const _bitConfigTree: _BitConfig[] = [];\n      let bitTypeCurrent: BitTypeType | undefined = bitType;\n      while (bitTypeCurrent) {\n        const _bitConfig: _BitConfig = BITS[bitTypeCurrent];\n        if (!_bitConfig) throwNotFoundError();\n\n        inheritedBitTypes.push(bitTypeCurrent);\n        _bitConfigTree.push(_bitConfig);\n        bitTypeCurrent = _bitConfig.baseBitType;\n      }\n\n      // Reverse the tree so that the root is first\n      _bitConfigTree.reverse();\n\n      // Loop the tree, merging the configs\n      const _mergedBitConfig: _BitConfig = _bitConfigTree.reduce((acc, cur) => {\n        acc = ObjectUtils.deepMerge(acc, cur);\n        return acc;\n      }, {} as _BitConfig);\n\n      // Extract the root config\n      const {\n        since,\n        textFormatDefault,\n        quizBit,\n        tags: _tags,\n        cardSet: _cardSet,\n        deprecated,\n        bodyAllowed,\n        bodyRequired,\n        footerAllowed,\n        footerRequired,\n        resourceAttachmentAllowed,\n        rootExampleType,\n      } = _mergedBitConfig;\n\n      // All bits have the internal comment property, so add it to the tags\n      _tags?.push({\n        key: ConfigKey.property_internalComment,\n        description: 'Internal comment for the bit.',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n        minCount: 0,\n      });\n\n      // Hydrate the configuration\n      const zeroCountAllResourcesTags = this.getAllResourcesTagsWithZeroCounts();\n      const bitTags = ConfigHydrator.hydrateTagsConfig(_tags ?? []);\n      const cardSet = ConfigHydrator.hydrateCardSetConfig(_cardSet);\n\n      // Merge the allResourcesTags with the bitTags *in the correct order*\n      const comboResourceConfigKey = bitTags.info?.comboResourceConfigKey;\n      const tags = {\n        ...bitTags.tags,\n      };\n      for (const [k, v] of Object.entries(zeroCountAllResourcesTags)) {\n        if (!tags[k]) tags[k] = v;\n      }\n\n      // Create the bit config\n      bitConfig = new BitConfig({\n        since,\n        bitType,\n        inheritedBitTypes,\n        textFormatDefault: textFormatDefault ?? TextFormat.bitmarkText,\n        tags,\n        cardSet,\n        quizBit,\n        deprecated,\n        bodyAllowed,\n        bodyRequired,\n        footerAllowed,\n        footerRequired,\n        resourceAttachmentAllowed,\n        rootExampleType,\n        comboResourceConfigKey,\n      });\n\n      // Add to cache\n      this.bitCache.set(bitType, bitConfig);\n    }\n\n    return bitConfig;\n  }\n\n  /**\n   * Look up the tag configuration by tag (rather than by config key).\n   *\n   * @param bitType\n   * @param key the configKey to look up - if undefined, will return undefined\n   * @returns\n   */\n  public getTagConfigForTag(\n    tagsConfig: TagsConfig | undefined,\n    key: ConfigKeyType | undefined,\n  ): TagConfig | undefined {\n    if (!tagsConfig) return undefined;\n\n    // // Search the properties in the bit config for the matching tag.\n    // for (const [, t] of Object.entries(tagsConfig)) {\n    //   if (t.tag === tag) {\n    //     return t;\n    //   }\n    // }\n\n    // return undefined;\n\n    // Now a map lookup since the tag now has the & / @ prefix\n    return tagsConfig[key as string];\n  }\n\n  /**\n   * Look up the tag configuration for a cardSet variant.\n   *\n   * @param bitType\n   * @param sideNo\n   * @param variantNo\n   * @param tag\n   * @param parentTagConfig\n   * @returns\n   */\n  public getTagsConfigForCardSet(\n    bitType: BitTypeType,\n    sideNo: number,\n    variantNo: number,\n  ): TagsConfig | undefined {\n    const variantConfig = this.getCardSetVariantConfig(bitType, sideNo, variantNo);\n    if (!variantConfig) return undefined;\n\n    return variantConfig.tags;\n  }\n\n  /**\n   * Get the configuration for a particular card side and variant\n   * (checking for infinitely repeating variants)\n   *\n   * @param config all variant configurations\n   * @param sideNo side index\n   * @param variantNo variant index\n   *\n   * @returns the config if found, otherwise undefined\n   */\n  public getCardSetVariantConfig(\n    bitType: BitTypeType,\n    sideNo: number,\n    variantNo: number,\n  ): CardVariantConfig | undefined {\n    let ret: CardVariantConfig | undefined;\n\n    const bitConfig = this.getBitConfig(bitType);\n    if (!bitConfig) return undefined;\n    const variants = bitConfig.cardSet?.variants;\n    if (!variants) return undefined;\n\n    const sideIdx = Math.min(sideNo, variants.length - 1);\n    const variant = variants[sideIdx];\n\n    // Check for variant\n    const maxVariantIndex = variant.length - 1;\n    if (variantNo > maxVariantIndex) {\n      ret = variant[maxVariantIndex];\n      // Fix: Always assume infinite repeat count\n      // if (ret.repeatCount !== Count.infinity) return undefined;\n    } else {\n      ret = variant[variantNo];\n    }\n\n    return ret;\n  }\n\n  /**\n   * Get the resource configuration for a bit.\n   *\n   * The configuration returned potentially depends on the resourceTypeAttachment which can change the allowed\n   * count of the resource (or comboResource) it matches.\n   *\n   * The function is a bit complicated, but it is actually just manipulating the configuration into a format that\n   * the rest of the app can use easily.\n   *\n   * @param bitType\n   * @param resourceTypeAttachment the resource type specified in the bit header\n   * @returns the definitive resource configuration for the bit\n   */\n  // TODO - this will need fixing.\n  public getBitResourcesConfig(\n    bitType: BitTypeType,\n    resourceTypeAttachment: ResourceTypeType | undefined,\n  ): ResourcesConfig {\n    let finalResourceTags: TagsConfig = {};\n    const comboResourceConfigKeysMap: Map<ConfigKeyType, ConfigKeyType[]> = new Map();\n    const configKeyResourceAttachment = resourceTypeAttachment\n      ? resourceTypeToConfigKey(resourceTypeAttachment)\n      : undefined;\n\n    const bitConfig = this.getBitConfig(bitType);\n\n    // Filter out the resource tags\n    const resourceTags: TagsConfig = {};\n    for (const [k, v] of Object.entries(bitConfig.tags)) {\n      if (v.type === BitTagConfigKeyType.resource) {\n        resourceTags[k] = v;\n      }\n    }\n\n    // Work out the potential combo resource type, which is either fixed by the bit type, or comes from the bit header\n    const comboResourceConfigKey =\n      bitConfig.comboResourceConfigKey ??\n      (bitConfig.resourceAttachmentAllowed ? configKeyResourceAttachment : undefined);\n\n    if (comboResourceConfigKey) {\n      // The comboResourceConfigKey might be a combo resource. Build the comborResourceTagTypesMap\n      const comboResourcesMap: Map<ConfigKeyType, TagConfig> = new Map();\n\n      // The resource type attachment might be a combo resource - handle it\n      const comboResource = this.getComboResource(comboResourceConfigKey);\n      if (comboResource) {\n        // Extract the resource types from the combo resource\n        const comboResourceTagConfigs = Object.values(comboResource).filter((t) => {\n          return t.type === BitTagConfigKeyType.resource;\n        });\n        const comboResourceTypes = comboResourceTagConfigs.map((t) => t.configKey);\n\n        // Combine into a map for easy lookup\n        comboResourceTypes.forEach((type) => {\n          const tags = comboResourceTagConfigs.find((t) => t.configKey === type);\n          if (tags) comboResourcesMap.set(type, tags);\n        });\n\n        // If the resource tag is a combo resource tag, then add it to the comboResourceConfigKeysMap\n        const comboResourceConfigKeys = this.getComboResourceConfigKeys(comboResourceConfigKey);\n        if (comboResourceConfigKeys && comboResourceConfigKeys.length > 0) {\n          comboResourceConfigKeysMap.set(comboResourceConfigKey, comboResourceConfigKeys);\n        }\n      }\n\n      // If the resource is an attachment...\n      // Modify the count for the resource that matched the resource type attachment\n      // (create a copy so as not to modify the original configuration)\n      if (resourceTypeAttachment) {\n        for (const [k, tag] of Object.entries(resourceTags)) {\n          // Check if the tag matches the resource type attachment or the comboResource\n          const singleTagMatch = comboResourceConfigKey === tag.configKey;\n          const comboTagMatch = comboResourcesMap\n            ? comboResourcesMap.has(tag.configKey as ResourceKeyType)\n            : false;\n\n          if (singleTagMatch) {\n            // Single tag match for a resource specified in the bit header\n            const newTag = new ResourceTagConfig({\n              configKey: tag.configKey,\n              tag: tag.tag,\n              minCount: 1,\n              maxCount: 1,\n              chain: tag.chain,\n              jsonKey: tag.jsonKey,\n              deprecated: tag.deprecated,\n            });\n            finalResourceTags[k] = newTag;\n          } else if (comboTagMatch) {\n            // Combo resource tag match for a resource specified in the bit header\n            if (comboResourcesMap) {\n              const newTag = comboResourcesMap.get(tag.configKey as ResourceKeyType);\n              if (newTag) finalResourceTags[k] = newTag;\n            }\n          } else {\n            finalResourceTags[k] = tag;\n          }\n        }\n      } else {\n        // Combo resource, but not a resource type attachement\n        finalResourceTags = resourceTags;\n      }\n    } else {\n      // No combo resource and no resource type attachment\n      finalResourceTags = resourceTags;\n    }\n\n    const resourcesConfig = new ResourcesConfig(\n      finalResourceTags,\n      bitConfig.resourceAttachmentAllowed,\n      configKeyResourceAttachment,\n      comboResourceConfigKeysMap,\n    );\n\n    return resourcesConfig;\n  }\n\n  /**\n   * Get the resourceType tags for a combo resource.\n   *\n   * @param configKeyResourceAttachment\n   * @returns resourceTypes for the combo resource (or undefined if not a combo resource)\n   */\n  private getComboResourceConfigKeys(\n    configKeyResourceAttachment: ConfigKeyType | undefined,\n  ): ConfigKeyType[] | undefined {\n    const comboResource = this.getComboResource(configKeyResourceAttachment);\n    if (comboResource) {\n      const comboResourceTypes = Object.values(comboResource)\n        .filter((t) => {\n          return t.type === BitTagConfigKeyType.resource;\n        })\n        .map((t) => t.configKey);\n\n      return comboResourceTypes;\n    }\n    return undefined;\n  }\n\n  /**\n   * Get the tags for a combo resource.\n   *\n   * Combo resources are resources that contain more than one resource, such as still-image-film.\n   * These resources require special handling in the code and therefore also special configuration.\n   *\n   * @returns TagsConfig for the combo resource or undefined if not found\n   */\n  private getComboResource(resourceConfigKey: ConfigKeyType | undefined): TagsConfig | undefined {\n    if (!resourceConfigKey) return undefined;\n\n    let comboResourcesTags = this.comboResourcesCache.get(resourceConfigKey);\n    if (!comboResourcesTags) {\n      // Filter for all the resource groups and hydrate the tags\n      comboResourcesTags = {};\n      Object.values(GROUPS)\n        .filter(\n          (g) =>\n            g.type === GroupConfigType.comboResource &&\n            g.comboResourceConfigKey === resourceConfigKey,\n        )\n        .forEach((g) => {\n          comboResourcesTags = {\n            ...comboResourcesTags,\n            ...ConfigHydrator.hydrateTagsConfig(g.tags).tags,\n          };\n        });\n\n      // Add to cache\n      if (Object.keys(comboResourcesTags).length === 0) comboResourcesTags = undefined;\n      this.comboResourcesCache.set(resourceConfigKey, comboResourcesTags);\n    }\n\n    return comboResourcesTags;\n  }\n\n  /**\n   * Get the tags for all resources with 0 max/min counts.\n   *\n   * This is required so that any bit can parse all resources correctly. It is necessary to parse all resources\n   * for any bit because of the requirement to add excess resources to the 'parser' output.\n   *\n   * NOTE: These are not used for validation, only for parsing. They will be overridden for individual bits for\n   * validation.\n   *\n   * @returns TagsConfig for all resources\n   */\n  private getAllResourcesTagsWithZeroCounts(): TagsConfig {\n    let allResourcesTags = this.allResourcesCache;\n    if (!allResourcesTags) {\n      // Filter for all the resource groups and hydrate the tags\n      allResourcesTags = {};\n      Object.values(GROUPS)\n        .filter((g) => g.type === GroupConfigType.resource)\n        .forEach((g) => {\n          allResourcesTags = {\n            ...allResourcesTags,\n            ...ConfigHydrator.hydrateTagsConfig(g.tags).tags,\n          };\n        });\n\n      // Ensure the minimum and maximum counts are all set to 0\n      // We only use this config to understand how to parse, not to validate\n      for (const tag of Object.values(allResourcesTags)) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const tagAny = tag as any;\n        tagAny.maxCount = 0;\n        tagAny.minCount = 0;\n      }\n\n      // Add to cache\n      this.allResourcesCache = allResourcesTags;\n    }\n\n    return allResourcesTags;\n  }\n}\n\nconst instance = new Config();\n\nexport { instance as Config };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BitType = {\n  _error: '_error', // Used for error handling to indicate a bit type that is not supported or a bit parse error\n  _comment: '_comment', // Used to indicate a bit is commented out\n  _standard: '_standard', // Not to be used as a bit, but as a base for other bit types\n  advertising: 'advertising',\n  advertisingAdvertorial: 'advertising-advertorial',\n  advertisingAdvertorialPage: 'advertising-advertorial-page',\n  advertisingCallToAction: 'advertising-call-to-action',\n  advertisingCallToActionMeeting: 'advertising-call-to-action-meeting',\n  advertisingBanner: 'advertising-banner',\n  advertisingSkyscraper: 'advertising-skyscraper',\n  advertisingRectangle: 'advertising-rectangle',\n  advertisingFullPage: 'advertising-full-page',\n  advertisingHalfPage: 'advertising-half-page',\n  advertisingQuarterPage: 'advertising-quarter-page',\n  advertisingClassifiedPage: 'advertising-classified-page',\n  advertisingLandscape: 'advertising-landscape',\n  advertisingPortrait: 'advertising-portrait',\n  aiChat: 'ai-chat',\n  aiEditor: 'ai-editor',\n  aiPrompt: 'ai-prompt',\n  aiTutor: 'ai-tutor',\n  aiWbt: 'ai-wbt',\n  anchor: 'anchor',\n  appAiPrompt: 'app-ai-prompt',\n  appBitmarkFromEditor: 'app-bitmark-from-editor',\n  appBitmarkFromJavascript: 'app-bitmark-from-javascript',\n  appCalculatorLatex: 'app-calculator-latex',\n  appCodeCell: 'app-code-cell',\n  appCodeEditor: 'app-code-editor',\n  appCodeIde: 'app-code-ide',\n  appCreateBitsFromImage: 'app-create-bits-from-image',\n  appFlashcards: 'app-flashcards',\n  appFlashcardsLearn: 'app-flashcards-learn',\n  appFlashcardsQuiz: 'app-flashcards-quiz',\n  appGetScreenshot: 'app-get-screenshot',\n  appLink: 'app-link',\n  appRag: 'app-rag',\n  appSearch: 'app-search',\n  article: 'article',\n  articleAi: 'article-ai',\n  articleAlt: 'article-alt',\n  articleAttachment: 'article-attachment',\n  articleAuthor: 'article-author',\n  articleEmbed: 'article-embed',\n  articleLink: 'article-link',\n  articleResponsive: 'article-responsive',\n  articleResponsiveAlt: 'article-responsive-alt',\n  assignment: 'assignment',\n  assignmentList: 'assignment-list',\n  audio: 'audio',\n  audioEmbed: 'audio-embed',\n  audioLink: 'audio-link',\n  audioTranscript: 'audio-transcript',\n  author: 'author',\n  authorContentBitGenerator: 'author-content-bit-generator',\n  bitAlias: 'bit-alias',\n  bitBookEnding: 'bit-book-ending',\n  bitBookSummary: 'bit-book-summary',\n  bitmarkExample: 'bitmark-example',\n  blogArticle: 'blog-article',\n  book: 'book',\n  bookAcknowledgements: 'book-acknowledgements',\n  bookAddendum: 'book-addendum',\n  bookAfterword: 'book-afterword',\n  bookAlias: 'book-alias',\n  bookAppendix: 'book-appendix',\n  bookArticle: 'book-article',\n  bookAuthor: 'book-author',\n  bookAutherBio: 'book-author-bio',\n  bookBibliography: 'book-bibliography',\n  bookClose: 'book-close',\n  bookComingSoon: 'book-coming-soon',\n  bookConclusion: 'book-conclusion',\n  bookCopyright: 'book-copyright',\n  bookCopyrightPermissions: 'book-copyright-permissions',\n  bookCover: 'book-cover',\n  bookDedication: 'book-dedication',\n  bookDiff: 'book-diff',\n  bookEnd: 'book-end',\n  bookEndnotes: 'book-endnotes',\n  bookEpigraph: 'book-epigraph',\n  bookEpilogue: 'book-epilogue',\n  bookForword: 'book-foreword',\n  bookFrontispiece: 'book-frontispiece',\n  bookImprint: 'book-imprint',\n  bookIncitingIncident: 'book-inciting-incident',\n  bookIntroduction: 'book-introduction',\n  bookLink: 'book-link',\n  bookLinkNext: 'book-link-next',\n  bookLinkPrev: 'book-link-prev',\n  bookListOfContributors: 'book-list-of-contributors',\n  bookNotes: 'book-notes',\n  bookPostscript: 'book-postscript',\n  bookPreface: 'book-preface',\n  bookPrologue: 'book-prologue',\n  bookReadMore: 'book-read-more',\n  bookReference: 'book-reference',\n  bookReferenceList: 'book-reference-list',\n  bookRequestForABookReview: 'book-request-for-a-book-review',\n  bookSummary: 'book-summary',\n  bookTeaser: 'book-teaser',\n  bookTitle: 'book-title',\n  botActionAnnounce: 'bot-action-announce',\n  botActionRatingNumber: 'bot-action-rating-number',\n  botActionRemind: 'bot-action-remind',\n  botActionResponse: 'bot-action-response',\n  botActionSave: 'bot-action-save',\n  botActionSend: 'bot-action-send',\n  botActionTrueFalse: 'bot-action-true-false',\n  botInterview: 'bot-interview',\n  brandColor: 'brand-color',\n  browserImage: 'browser-image',\n  bug: 'bug',\n  bugAlt: 'bug-alt',\n  bugCollapsible: 'bug-collapsible',\n  buttonCopyText: 'button-copy-text',\n  catalogItemBook: 'catalog-item-book',\n  catalogItemExternalBook: 'catalog-item-external-book',\n  catalogItemProduct: 'catalog-item-product',\n  callToAction: 'call-to-action',\n  callToActionBookNow: 'call-to-action-book-now',\n  callToActionContact: 'call-to-action-contact',\n  callToActionCreateAccount: 'call-to-action-create-account',\n  callToActionDownload: 'call-to-action-download',\n  callToActionGetNow: 'call-to-action-get-now',\n  callToActionGetOffer: 'call-to-action-get-offer',\n  callToActionJoin: 'call-to-action-join',\n  callToActionLearnMore: 'call-to-action-learn-more',\n  callToActionMail: 'call-to-action-mail',\n  callToActionSeeMore: 'call-to-action-see-more',\n  callToActionShopNow: 'call-to-action-shop-now',\n  callToActionStartNow: 'call-to-action-start-now',\n  callToActionSubscribe: 'call-to-action-subscribe',\n  callToActionWatch: 'call-to-action-watch',\n  card1: 'card-1',\n  chapter: 'chapter',\n  chapterSubjectMatter: 'chapter-subject-matter',\n  chat: 'chat',\n  checklist: 'checklist',\n  cloze: 'cloze',\n  clozeAndMultipleChoiceText: 'cloze-and-multiple-choice-text',\n  clozeInstructionGrouped: 'cloze-instruction-grouped',\n  clozeList: 'cloze-list',\n  clozeSeveral: 'cloze-several',\n  clozeSolutionGrouped: 'cloze-solution-grouped',\n  coachAudioTranscript: 'coach-audio-transcript',\n  coachCallToActionChecklist: 'coach-call-to-action-checklist',\n  coachCallToActionCloze: 'coach-call-to-action-cloze',\n  coachCallToActionClozeAndMultipleChoiceText:\n    'coach-call-to-action-cloze-and-multiple-choice-text',\n  coachCallToActionEssay: 'coach-call-to-action-essay',\n  coachCallToActionMultipleChoiceText: 'coach-call-to-action-multiple-choice-text',\n  coachHomeRules: 'coach-home-rules',\n  coachSelfReflectionCloze: 'coach-self-reflection-cloze',\n  coachSelfReflectionEssay: 'coach-self-reflection-essay',\n  coachSelfReflectionMultipleChoice: 'coach-self-reflection-multiple-choice',\n  coachSelfReflectionMultipleChoice1: 'coach-self-reflection-multiple-choice-1',\n  coachSelfReflectionMultipleChoiceText: 'coach-self-reflection-multiple-choice-text',\n  coachSelfReflectionMultipleResponse: 'coach-self-reflection-multiple-response',\n  coachSelfReflectionMultipleResponse1: 'coach-self-reflection-multiple-response-1',\n  coachSelfReflectionRating: 'coach-self-reflection-rating',\n  coachVideoTranscript: 'coach-video-transcript',\n  code: 'code',\n  codeRuntime: 'code-runtime',\n  collapsible: 'collapsible',\n  conclusion: 'conclusion',\n  conclusionAlt: 'conclusion-alt',\n  consoleLog: 'console-log',\n  container: 'container',\n  containerAccordionTabs: 'container-accordion-tabs',\n  containerBits2: 'container-bits-2',\n  containerCards: 'container-cards',\n  containerCarousel: 'container-carousel',\n  containerCookRecipe: 'container-cook-recipe',\n  containerFolder: 'container-folder',\n  containerFolderAll: 'container-folder-all',\n  containerGallery: 'container-gallery',\n  containerGrid: 'container-grid',\n  containerGroup: 'container-group',\n  containerNewsArticle: 'container-news-article',\n  containerNowrap: 'container-nowrap',\n  containerNowrapStretch: 'container-nowrap-stretch',\n  containerPreview: 'container-preview',\n  containerScroller: 'container-scroller',\n  containerSlides: 'container-slides',\n  containerStack: 'container-stack',\n  containerTabs: 'container-tabs',\n  containerWrap: 'container-wrap',\n  conversationLeft1: 'conversation-left-1',\n  conversationLeft1Scream: 'conversation-left-1-scream',\n  conversationLeft1Thought: 'conversation-left-1-thought',\n  conversationRight1: 'conversation-right-1',\n  conversationRight1Scream: 'conversation-right-1-scream',\n  conversationRight1Thought: 'conversation-right-1-thought',\n  clozeAndMultipleChoiceTextConversationLeft1: 'cloze-and-multiple-choice-text-conversation-left-1',\n  clozeAndMultipleChoiceTextConversationLeft1Scream:\n    'cloze-and-multiple-choice-text-conversation-left-1-scream',\n  clozeAndMultipleChoiceTextConversationLeft1Thought:\n    'cloze-and-multiple-choice-text-conversation-left-1-thought',\n  clozeAndMultipleChoiceTextConversationRight1:\n    'cloze-and-multiple-choice-text-conversation-right-1',\n  clozeAndMultipleChoiceTextConversationRight1Scream:\n    'cloze-and-multiple-choice-text-conversation-right-1-scream',\n  clozeAndMultipleChoiceTextConversationRight1Thought:\n    'cloze-and-multiple-choice-text-conversation-right-1-thought',\n  cookArrangement: 'cook-arrangement',\n  cookIngredients: 'cook-ingredients',\n  cookInsert: 'cook-insert',\n  cookNoteOnQuantity: 'cook-note-on-quantity',\n  cookPersonalRecommendation: 'cook-personal-recommendation',\n  cookPlate: 'cook-plate',\n  cookPracticeAdvise: 'cook-practice-advise',\n  cookPreparation: 'cook-preparation',\n  cookRecommendation: 'cook-recommendation',\n  cookRemark: 'cook-remark',\n  cookSideDish: 'cook-side-dish',\n  cookSideDrink: 'cook-side-drink',\n  cookStep: 'cook-step',\n  cookTimer: 'cook-timer',\n  cookVariation: 'cook-variation',\n  correction: 'correction',\n  danger: 'danger',\n  dangerAlt: 'danger-alt',\n  dangerCollapsible: 'danger-collapsible',\n  definitionList: 'definition-list',\n  definitionTerm: 'definition-term',\n  deleted: 'deleted',\n  details: 'details',\n  details1: 'details-1',\n  detailsImage: 'details-image',\n  diff: 'diff',\n  document: 'document',\n  documentDownload: 'document-download',\n  documentEmbed: 'document-embed',\n  documentLink: 'document-link',\n  documentUpload: 'document-upload',\n  editorial: 'editorial',\n  editorNote: 'editor-note',\n  essay: 'essay',\n  example: 'example',\n  exampleAlt: 'example-alt',\n  exampleCollapsible: 'example-collapsible',\n  exampleList: 'example-list',\n  extractorAiChat: 'extractor-ai-chat',\n  extractorBlock: 'extractor-block',\n  extractorBlueprint: 'extractor-blueprint',\n  extractorBlueprintConfiguration: 'extractor-blueprint-configuration',\n  extractorConfiguration: 'extractor-configuration',\n  extractorImage: 'extractor-image',\n  extractorImageCollapsible: 'extractor-image-collapsible',\n  extractorInformation: 'extractor-information',\n  extractorPage: 'extractor-page',\n  extractorPageCollapsible: 'extractor-page-collapsible',\n  extractorPageFooter: 'extractor-page-footer',\n  extractorPageFooterCollapsible: 'extractor-page-footer-collapsible',\n  extractorPageHeader: 'extractor-page-header',\n  extractorPageHeaderCollapsible: 'extractor-page-header-collapsible',\n  extractorPageNumber: 'extractor-page-number',\n  extractorPageNumberCollapsible: 'extractor-page-number-collapsible',\n  extractorPageWithBlocks: 'extractor-page-with-blocks',\n  extractorPageWithBlocksCollapsible: 'extractor-page-with-blocks-collapsible',\n  extractorRepeatedText: 'extractor-repeated-text',\n  extractorRule: 'extractor-rule',\n  extractorTheme: 'extractor-theme',\n  featured: 'featured',\n  feedback: 'feedback',\n  figure: 'figure',\n  flashcard: 'flashcard',\n  flashcard1: 'flashcard-1',\n  focusImage: 'focus-image',\n  footNote: 'foot-note',\n  formFreeText: 'form-free-text',\n  formula: 'formula',\n  gapText: 'gap-text',\n  gapTextInstructionGrouped: 'gap-text-instruction-grouped',\n  glossaryTerm: 'glossary-term',\n  groupBorn: 'group-born',\n  groupDied: 'group-died',\n  handInAudio: 'hand-in-audio',\n  handInContact: 'hand-in-contact',\n  handInDocument: 'hand-in-document',\n  handInFeedbackExpert: 'hand-in-feedback-expert',\n  handInFeedbackSelf: 'hand-in-feedback-self',\n  handInFile: 'hand-in-file',\n  handInFreeText: 'hand-in-free-text',\n  handInFreeTextExpert: 'hand-in-free-text-expert',\n  handInLocation: 'hand-in-location',\n  handInPhoto: 'hand-in-photo',\n  handInScan: 'hand-in-scan',\n  handInSubmit: 'hand-in-submit',\n  handInSystemMedia: 'hand-in-system-media',\n  handInVideo: 'hand-in-video',\n  handInVoice: 'hand-in-voice',\n  help: 'help',\n  helpAlt: 'help-alt',\n  highlightText: 'highlight-text',\n  hint: 'hint',\n  hintAlt: 'hint-alt',\n  hintCollapsible: 'hint-collapsible',\n  image: 'image',\n  imageBanner: 'image-banner',\n  imageFigure: 'image-figure',\n  imageFigureAlt: 'image-figure-alt',\n  imageLandscape: 'image-landscape',\n  imageLink: 'image-link',\n  imageMood: 'image-mood',\n  imageOnDevice: 'image-on-device',\n  imagePortrait: 'image-portrait',\n  imagePrototype: 'image-prototype',\n  imageResponsive: 'image-responsive',\n  imageScreenshot: 'image-screenshot',\n  imageSeparator: 'image-separator',\n  imageSeparatorAlt: 'image-separator-alt',\n  imagesLogoGrave: 'images-logo-grave',\n  imageStyled: 'image-styled',\n  imageSuperWide: 'image-super-wide',\n  imageZoom: 'image-zoom',\n  indexTerm: 'index-term',\n  info: 'info',\n  infoAlt: 'info-alt',\n  infoCollapsible: 'info-collapsible',\n  internalLink: 'internal-link',\n  interview: 'interview',\n  interviewInstructionGrouped: 'interview-instruction-grouped',\n  langAudioScript: 'lang-audio-script',\n  langEnablingLanguageSkills: 'lang-enabling-language-skills',\n  langEnglishAroundWorld: 'lang-english-around-world',\n  langExtraActivity: 'lang-extra-activity',\n  langGoodToKnow: 'lang-good-to-know',\n  langHomework: 'lang-homework',\n  langLearningGoal: 'lang-learning-goal',\n  langLearningOutcomes: 'lang-learning-outcomes',\n  langLearningStrategy: 'lang-learning-strategy',\n  langLevelDown: 'lang-level-down',\n  langLevelUp: 'lang-level-up',\n  langLifeSkillIcon: 'lang-life-skill-icon',\n  langLifeSkills: 'lang-life-skills',\n  langLikeALocal: 'lang-like-a-local',\n  langMaterial: 'lang-material',\n  langTeacherNote: 'lang-teacher-note',\n  langTeacherPronunciation: 'lang-teacher-pronunciation',\n  langUsefulPhrases: 'lang-useful-phrases',\n  langVideoScript: 'lang-video-script',\n  langVocabulary: 'lang-vocabulary',\n  learningDocumentationFeedback: 'learning-documentation-feedback',\n  learningPathBook: 'learning-path-book',\n  learningPathBotTraining: 'learning-path-bot-training',\n  learningPathClassroomEvent: 'learning-path-classroom-event',\n  learningPathClassroomTraining: 'learning-path-classroom-training',\n  learningPathClosing: 'learning-path-closing',\n  learningPathExternalLink: 'learning-path-external-link',\n  learningPathFeedback: 'learning-path-feedback',\n  learningPathLearningGoal: 'learning-path-learning-goal',\n  learningPathLti: 'learning-path-lti',\n  learningPathSign: 'learning-path-sign',\n  learningPathStep: 'learning-path-step',\n  learningPathVideoCall: 'learning-path-video-call',\n  leAssignment: 'le-assignment',\n  leClassroomEvent: 'le-classroom-event',\n  leCompletion: 'le-completion',\n  leExternalLink: 'le-external-link',\n  leFinishingTask: 'le-finishing-task',\n  leFollowUpTask: 'le-follow-up-task',\n  leMultiDayEvent: 'le-multi-day-event',\n  legend: 'legend',\n  leDocumentDownload: 'le-document-download',\n  leLearningObjectives: 'le-learning-objectives',\n  leLearningStep: 'le-learning-step',\n  leListenAudioEmbed: 'le-listen-audio-embed',\n  lePreparationTask: 'le-preparation-task',\n  leRead: 'le-read',\n  leReadBook: 'le-read-book',\n  leTask: 'le-task',\n  leTodo: 'le-todo',\n  leVideoCall: 'le-video-call',\n  leWatchVideoEmbed: 'le-watch-video-embed',\n  lifeSkillSticker: 'life-skill-sticker',\n  list: 'list',\n  listItem: 'list-item',\n  mark: 'mark',\n  match: 'match',\n  matchAll: 'match-all',\n  matchAllReverse: 'match-all-reverse',\n  matchAudio: 'match-audio',\n  matchMatrix: 'match-matrix',\n  matchPicture: 'match-picture',\n  matchReverse: 'match-reverse',\n  matchSolutionGrouped: 'match-solution-grouped',\n  message: 'message',\n  metalevelExplanation: 'metalevel-explanation',\n  metaSearchDefaultTerms: 'meta-search-default-terms',\n  metaSearchDefaultTopics: 'meta-search-default-topics',\n  milestone: 'milestone',\n  module: 'module',\n  moduleProduct: 'module-product',\n  multipleChoice: 'multiple-choice',\n  multipleChoice1: 'multiple-choice-1',\n  multipleChoiceText: 'multiple-choice-text',\n  multipleResponse: 'multiple-response',\n  multipleResponse1: 'multiple-response-1',\n  newspaperArticle: 'newspaper-article',\n  nonProductionPrototypeIframe: 'non-production-prototype-iframe',\n  note: 'note',\n  noteAi: 'note-ai',\n  noteAlt: 'note-alt',\n  notebookArticle: 'notebook-article',\n  noteCollapsible: 'note-collapsible',\n  output: 'output',\n  page: 'page',\n  pageAcademy: 'page-academy',\n  pageArticle: 'page-article',\n  pageArticleAlt: 'page-article-alt',\n  pageArticleResponsive: 'page-article-responsive',\n  pageBanner: 'page-banner',\n  pageBuyButton: 'page-buy-button',\n  pageBuyButtonAlt: 'page-buy-button-alt',\n  pageBuyButtonPromotion: 'page-buy-button-promotion',\n  pageCategory: 'page-category',\n  pageCollapsible: 'page-collapsible',\n  pageContainer: 'page-container',\n  pageContainerFolder: 'page-container-folder',\n  pageContainerGroup: 'page-container-group',\n  pageContainerNowrap: 'page-container-nowrap',\n  pageContainerNowrapStretch: 'page-container-nowrap-stretch',\n  pageContainerWrap: 'page-container-wrap',\n  pageCoverImage: 'page-cover-image',\n  pageFooter: 'page-footer',\n  pageHero: 'page-hero',\n  pageOpenBook: 'page-open-book',\n  pageOpenBookList: 'page-open-book-list',\n  printBook: 'print-book',\n  openBookChapter: 'open-book-chapter',\n  openBookChapterTeaser: 'open-book-chapter-teaser',\n  pagePerson: 'page-person',\n  pageProduct: 'page-product',\n  pageProductList: 'page-product-list',\n  pageProductVideo: 'page-product-video',\n  pageProductVideoList: 'page-product-video-list',\n  pagePromotion: 'page-promotion',\n  pageSectionFolder: 'page-section-folder',\n  pageShopInShop: 'page-shop-in-shop',\n  pageSpecial: 'page-special',\n  pageSubpage: 'page-subpage',\n  pageSubscribe: 'page-subscribe',\n  parameters: 'parameters',\n  photo: 'photo',\n  platform: 'platform',\n  platformBrandTarget: 'platform-brand-target',\n  platformHeader: 'platform-header',\n  platformMain: 'platform-main',\n  platformMainButton: 'platform-main-button',\n  platformMainInput: 'platform-main-input',\n  platformPath: 'platform-path',\n  platformSection: 'platform-section',\n  platformSectionButton: 'platform-section-button',\n  platformSectionChat: 'platform-section-chat',\n  platformSectionHeader: 'platform-section-header',\n  platformSectionInput: 'platform-section-input',\n  platformSystemIcon: 'platform-system-icon',\n  preparationNote: 'preparation-note',\n  printThisBook: 'print-this-book',\n  printThisChapter: 'print-this-chapter',\n  printPageBreak: 'print-page-break',\n  pronunciationTable: 'pronunciation-table',\n  prototypeImages: 'prototype-images',\n  qAndA: 'q-and-a',\n  qAndACard: 'q-and-a-card',\n  question1: 'question-1',\n  quote: 'quote',\n  rating: 'rating',\n  recipe: 'recipe',\n  recordAudio: 'record-audio',\n  recordVideo: 'record-video',\n  releaseNote: 'release-note',\n  releaseNotesSummary: 'release-notes-summary',\n  remark: 'remark',\n  remarkAlt: 'remark-alt',\n  remarkCollapsible: 'remark-collapsible',\n  reviewApprovedNote: 'review-approved-note',\n  reviewAuthorNote: 'review-author-note',\n  reviewCustomerNote: 'review-customer-note',\n  reviewError: 'review-error',\n  reviewErrorAi: 'review-error-ai',\n  reviewErrorTranslation: 'review-error-translation',\n  reviewNote: 'review-note',\n  reviewRequestForReviewNote: 'review-request-for-review-note',\n  reviewReviewerNote: 'review-reviewer-note',\n  sampleSolution: 'sample-solution',\n  sandbox: 'sandbox',\n  sandboxOutputJson: 'sandbox-output-json',\n  sandboxOutputMarkup: 'sandbox-output-markup',\n  sandboxOutputRender: 'sandbox-output-render',\n  scorm: 'scorm',\n  screenshot: 'screenshot',\n  selfAssessment: 'self-assessment',\n  separator: 'separator',\n  separatorAlt: 'separator-alt',\n  sequence: 'sequence',\n  sideNote: 'side-note',\n  sideNoteCollapsible: 'side-note-collapsible',\n  smartStandardArticleNonNormative: 'smart-standard-article-non-normative',\n  smartStandardArticleNonNormativeCollapsible: 'smart-standard-article-non-normative-collapsible',\n  smartStandardArticleNormative: 'smart-standard-article-normative',\n  smartStandardArticleNormativeCollapsible: 'smart-standard-article-normative-collapsible',\n  smartStandardExampleNonNormative: 'smart-standard-example-non-normative',\n  smartStandardExampleNonNormativeCollapsible: 'smart-standard-example-non-normative-collapsible',\n  smartStandardExampleNormative: 'smart-standard-example-normative',\n  smartStandardExampleNormativeCollapsible: 'smart-standard-example-normative-collapsible',\n  smartStandardFormula: 'smart-standard-formula',\n  smartStandardFormulaNonNormative: 'smart-standard-formula-non-normative',\n  smartStandardFormulaNormative: 'smart-standard-formula-normative',\n  smartStandardImageFigureNonNormative: 'smart-standard-image-figure-non-normative',\n  smartStandardImageFigureNonNormativeCollapsible:\n    'smart-standard-image-figure-non-normative-collapsible',\n  smartStandardImageFigureNormative: 'smart-standard-image-figure-normative',\n  smartStandardImageFigureNormativeCollapsible: 'smart-standard-image-figure-normative-collapsible',\n  smartStandardLegend: 'smart-standard-legend',\n  smartStandardLegendNonNormative: 'smart-standard-legend-non-normative',\n  smartStandardLegendNormative: 'smart-standard-legend-normative',\n  smartStandardList: 'smart-standard-list',\n  smartStandardListCollapsible: 'smart-standard-list-collapsible',\n  smartStandardListItem: 'smart-standard-list-item',\n  smartStandardListItemCollapsible: 'smart-standard-list-item-collapsible',\n  smartStandardNoteNonNormative: 'smart-standard-note-non-normative',\n  smartStandardNoteNonNormativeCollapsible: 'smart-standard-note-non-normative-collapsible',\n  smartStandardNoteNormative: 'smart-standard-note-normative',\n  smartStandardNoteNormativeCollapsible: 'smart-standard-note-normative-collapsible',\n  smartStandardRemarkLegend: 'smart-standard-remark-legend',\n  smartStandardRemarkLegendNonNormative: 'smart-standard-remark-legend-non-normative',\n  smartStandardRemarkLegendNormative: 'smart-standard-remark-legend-normative',\n  smartStandardRemarkFormula: 'smart-standard-remark-formula',\n  smartStandardRemarkFormulaNonNormative: 'smart-standard-remark-formula-non-normative',\n  smartStandardRemarkFormulaNormative: 'smart-standard-remark-formula-normative',\n  smartStandardRemarkNonNormative: 'smart-standard-remark-non-normative',\n  smartStandardRemarkNonNormativeCollapsible: 'smart-standard-remark-non-normative-collapsible',\n  smartStandardRemarkNormative: 'smart-standard-remark-normative',\n  smartStandardRemarkNormativeCollapsible: 'smart-standard-remark-normative-collapsible',\n  smartStandardRemarkTableImageNonNormative: 'smart-standard-remark-table-image-non-normative',\n  smartStandardRemarkTableImageNonNormativeCollapsible:\n    'smart-standard-remark-table-image-non-normative-collapsible',\n  smartStandardRemarkTableImageNormative: 'smart-standard-remark-table-image-normative',\n  smartStandardRemarkTableImageNormativeCollapsible:\n    'smart-standard-remark-table-image-normative-collapsible',\n  smartStandardRemarkTableNonNormative: 'smart-standard-remark-table-non-normative',\n  smartStandardRemarkTableNonNormativeCollapsible:\n    'smart-standard-remark-table-non-normative-collapsible',\n  smartStandardRemarkTableNormative: 'smart-standard-remark-table-normative',\n  smartStandardRemarkTableNormativeCollapsible: 'smart-standard-remark-table-normative-collapsible',\n  smartStandardTableImageNonNormative: 'smart-standard-table-image-non-normative',\n  smartStandardTableImageNonNormativeCollapsible:\n    'smart-standard-table-image-non-normative-collapsible',\n  smartStandardTableImageNormative: 'smart-standard-table-image-normative',\n  smartStandardTableImageNormativeCollapsible: 'smart-standard-table-image-normative-collapsible',\n  smartStandardTableNonNormative: 'smart-standard-table-non-normative',\n  smartStandardTableNonNormativeCollapsible: 'smart-standard-table-non-normative-collapsible',\n  smartStandardTableNormative: 'smart-standard-table-normative',\n  smartStandardTableNormativeCollapsible: 'smart-standard-table-normative-collapsible',\n  standardArticleNonNormative: 'standard-article-non-normative',\n  standardArticleNormative: 'standard-article-normative',\n  standardExampleNonNormative: 'standard-example-non-normative',\n  standardExampleNormative: 'standard-example-normative',\n  standardImageFigureNonNormative: 'standard-image-figure-non-normative',\n  standardImageFigureNormative: 'standard-image-figure-normative',\n  standardList: 'standard-list',\n  standardListItem: 'standard-list-item',\n  standardNoteNonNormative: 'standard-note-non-normative',\n  standardNoteNormative: 'standard-note-normative',\n  standardRemarkNonNormative: 'standard-remark-non-normative',\n  standardRemarkNormative: 'standard-remark-normative',\n  standardRemarkTableImageNonNormative: 'standard-remark-table-image-non-normative',\n  standardRemarkTableImageNormative: 'standard-remark-table-image-normative',\n  standardRemarkTableNonNormative: 'standard-remark-table-non-normative',\n  standardRemarkTableNormative: 'standard-remark-table-normative',\n  standardTableImageNonNormative: 'standard-table-image-non-normative',\n  standardTableImageNormative: 'standard-table-image-normative',\n  standardTableNonNormative: 'standard-table-non-normative',\n  standardTableNormative: 'standard-table-normative',\n  statement: 'statement',\n  stdout: 'stdout',\n  step: 'step',\n  stepImageScreenshot: 'step-image-screenshot',\n  stepImageScreenshotWithPointer: 'step-image-screenshot-with-pointer',\n  sticker: 'sticker',\n  stickyNote: 'sticky-note',\n  stillImageFilm: 'still-image-film',\n  stillImageFilmEmbed: 'still-image-film-embed',\n  stillImageFilmLink: 'still-image-film-link',\n  summary: 'summary',\n  summaryAi: 'summary-ai',\n  survey: 'survey',\n  survey1: 'survey-1',\n  surveyAnonymous: 'survey-anonymous',\n  surveyAnonymous1: 'survey-anonymous-1',\n  surveyMatrix: 'survey-matrix',\n  surveyMatrixMe: 'survey-matrix-me',\n  surveyRating: 'survey-rating',\n  surveyRatingDisplay: 'survey-rating-display',\n  surveyRatingOnce: 'survey-rating-once',\n  table: 'table',\n  tableAlt: 'table-alt',\n  tableExtended: 'table-extended',\n  tableExtendedImage: 'table-extended-image',\n  tableImage: 'table-image',\n  tableImageAlt: 'table-image-alt',\n  takePicture: 'take-picture',\n  toc: 'toc',\n  tocChapter: 'toc-chapter',\n  tocInline: 'toc-inline',\n  tocResource: 'toc-resource',\n  tocContent: 'toc-content',\n  trueFalse: 'true-false',\n  trueFalse1: 'true-false-1',\n  vendorAmcharts5Chart: 'vendor-amcharts-5-chart',\n  vendorDatadogDashboard: 'vendor-datadog-dashboard',\n  vendorDatadogDashboardEmbed: 'vendor-datadog-dashboard-embed',\n  vendorFormbricksEmbed: 'vendor-formbricks-embed',\n  vendorFormbricksLink: 'vendor-formbricks-link',\n  vendorFormbricksEmbedAnonymous: 'vendor-formbricks-embed-anonymous',\n  vendorFormbricksLinkAnonymous: 'vendor-formbricks-link-anonymous',\n  vendorHighchartsChart: 'vendor-highcharts-chart',\n  vendorIframelyCard: 'vendor-iframely-card',\n  vendorIframelyEmbed: 'vendor-iframely-embed',\n  vendorIframelyPreview: 'vendor-iframely-preview',\n  vendorIframelyPreviewMini: 'vendor-iframely-preview-mini',\n  vendorJupyterCellCode: 'vendor-jupyter-cell-code',\n  vendorJupyterCellMarkdown: 'vendor-jupyter-cell-markdown',\n  vendorJupyterCellRaw: 'vendor-jupyter-cell-raw',\n  vendorJupyterIpynb: 'vendor-jupyter-ipynb',\n  vendorJupyterOutput: 'vendor-jupyter-output',\n  vendorLearndashEmbed: 'vendor-learndash-embed',\n  vendorPadletEmbed: 'vendor-padlet-embed',\n  vendorStripePricingTable: 'vendor-stripe-pricing-table',\n  vendorStripePricingTableExternal: 'vendor-stripe-pricing-table-external',\n  video: 'video',\n  videoEmbed: 'video-embed',\n  videoEmbedLandscape: 'video-embed-landscape',\n  videoEmbedPortrait: 'video-embed-portrait',\n  videoLandscape: 'video-landscape',\n  videoLink: 'video-link',\n  videoLinkLandscape: 'video-link-landscape',\n  videoLinkPortrait: 'video-link-portrait',\n  videoPortrait: 'video-portrait',\n  videoTranscript: 'video-transcript',\n  warning: 'warning',\n  warningAlt: 'warning-alt',\n  warningCollapsible: 'warning-collapsible',\n  websiteLink: 'website-link',\n  workbookArticle: 'workbook-article',\n} as const;\n\nexport type BitTypeType = EnumType<typeof BitType>;\n\nexport { BitType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst Count = {\n  infinity: 'infinity',\n} as const;\n\nexport type CountType = EnumType<typeof Count> | number;\n\nexport { Count };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst ExampleType = {\n  none: 'none', // Example is not allowed\n  string: 'string', // Example is a string value\n  boolean: 'boolean', // Example is a boolean value\n} as const;\n\nexport type ExampleTypeType = EnumType<typeof ExampleType>;\n\nexport { ExampleType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst tags = {\n  tag_title: '#',\n  tag_anchor: '▼',\n  tag_reference: '►',\n  tag_property: '@',\n  tag_item: '%',\n  tag_instruction: '!',\n  tag_hint: '?',\n  tag_true: '+',\n  tag_false: '-',\n  tag_sampleSolution: '$',\n  tag_gap: '_',\n  tag_mark: '=',\n  tag_resource: '&',\n} as const;\n\nconst Tag = tags;\n\nexport type TagType = EnumType<typeof Tag>;\n\nexport { Tag, tags };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst TagFormat = {\n  none: 'none', // The property does not have a value\n  plainText: 'plainText', // If the value of the property is treated as a trimmed plain text string\n  bitmarkText: 'bitmarkText', // If the value of the property is treated as a bitmark+\n  number: 'number', // If the value is treated as a number\n  boolean: 'boolean', // If the value is treated as a boolean\n  invertedBoolean: 'invertedBoolean', // If the value is treated as a boolean with the value inverted (e.g. isLongAnswer ==> isShortAnswer = false)\n  enumeration: 'enumeration', // If the value is treated as an enumeration (the value is a string that must be one of a predefined set of values)\n} as const;\n\nexport type TagFormatType = EnumType<typeof TagFormat>;\n\nexport { TagFormat as TagFormat };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst TextFormat = {\n  // plain text\n  plainText: 'text',\n  latex: 'latex', // LaTeX code, alias for text\n  json: 'json', // json, alias for text\n  xml: 'xml', // xml, alias for text\n\n  // bitmarkText\n  // bitmarkText in the body is bitmark++ and bitmarkText in a tag is bitmark+\n  bitmarkText: 'bitmark++',\n} as const;\n\nexport type TextFormatType = EnumType<typeof TextFormat>;\n\nexport { TextFormat };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst CardSetConfigKey = {\n  flashcard: 'flashcard',\n  definitionList: 'definitionList',\n  elements: 'elements',\n  statements: 'statements',\n  quiz: 'quiz',\n  feedback: 'feedback',\n  questions: 'questions',\n  matchPairs: 'matchPairs',\n  matchAudioPairs: 'matchAudioPairs',\n  matchImagePairs: 'matchImagePairs',\n  matchMatrix: 'matchMatrix',\n  table: 'table',\n  tableExtended: 'tableExtended',\n  pronunciationTable: 'pronunciationTable',\n  botActionResponses: 'botActionResponses',\n  exampleBitList: 'exampleBitList',\n  clozeList: 'clozeList',\n  ingredients: 'ingredients',\n  // DEPRECATED - TO BE REMOVED IN THE FUTURE\n  // captionDefinitionsList: 'captionDefinitionsList',\n  bookReferenceList: 'bookReferenceList',\n} as const;\n\nexport type CardSetConfigKeyType = EnumType<typeof CardSetConfigKey>;\n\nexport { CardSetConfigKey };\n","import { type EnumType } from '@ncoderz/superenum';\n\n/**\n * Type of group config\n */\nconst GroupConfigType = {\n  standard: 'standard', // Any ordinary group\n  resource: 'resource', // A resource group\n  comboResource: 'comboResource', // A combo resource group\n} as const;\n\nexport type GroupConfigTypeType = EnumType<typeof GroupConfigType>;\n\nexport { GroupConfigType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BitTagConfigKeyType = {\n  unknown: 'unknown', // Unknown tag type, used for error handling\n\n  tag: 'tag', // A standard tag\n  property: 'property', // A property tag\n  resource: 'resource', // A resource tag\n\n  //\n  group: 'group', // A reusable group of tags\n} as const;\n\nexport type BitTagConfigKeyTypeType = EnumType<typeof BitTagConfigKeyType>;\n\nexport { BitTagConfigKeyType };\n","import { type BitTagConfigKeyTypeType } from '../enum/BitTagConfigKeyType.ts';\nimport { type CountType } from '../enum/Count.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\nabstract class AbstractTagConfig {\n  readonly type: BitTagConfigKeyTypeType;\n  readonly configKey: ConfigKeyType;\n  readonly tag: string;\n  readonly maxCount: CountType; // Default: 1\n  readonly minCount: number; // Default: 0\n  readonly chain?: TagsConfig;\n\n  readonly jsonKey?: string; // If the json key is different from the tag\n\n  readonly deprecated?: string; // Deprecated version\n\n  public constructor(params: {\n    type: BitTagConfigKeyTypeType;\n    configKey: ConfigKeyType;\n    tag: string;\n    maxCount: CountType;\n    minCount: number;\n    chain: TagsConfig | undefined;\n    jsonKey: string | undefined;\n    deprecated: string | undefined;\n  }) {\n    this.type = params.type;\n    this.configKey = params.configKey;\n    this.tag = params.tag;\n    this.maxCount = params.maxCount;\n    this.minCount = params.minCount;\n    this.chain = params.chain;\n    this.jsonKey = params.jsonKey;\n    this.deprecated = params.deprecated;\n  }\n}\n\nexport { AbstractTagConfig };\n","import { BitTagConfigKeyType, type BitTagConfigKeyTypeType } from '../enum/BitTagConfigKeyType.ts';\nimport { type CountType } from '../enum/Count.ts';\nimport { type TagType } from '../enum/Tag.ts';\nimport { AbstractTagConfig } from './AbstractTagConfig.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass MarkupTagConfig extends AbstractTagConfig {\n  readonly type: BitTagConfigKeyTypeType = BitTagConfigKeyType.tag;\n\n  public constructor(params: {\n    configKey: ConfigKeyType;\n    tag: TagType;\n    maxCount: CountType;\n    minCount: number;\n    chain: TagsConfig | undefined;\n    deprecated: string | undefined;\n  }) {\n    super({\n      type: BitTagConfigKeyType.tag,\n      jsonKey: undefined,\n      ...params,\n    });\n\n    // TODO\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = `TAG[${this.tag}`;\n    if (opts.includeConfigs) {\n      if (this.deprecated != null) s += `, deprecated=${this.deprecated}`;\n      if (this.maxCount != null) s += `, max=${this.maxCount}`;\n      if (this.minCount != null) s += `, min=${this.minCount}`;\n    }\n    s += ']';\n\n    if (this.chain && opts.includeChains) {\n      s += `\\n|__`;\n      let first = true;\n      for (const tag of Object.values(this.chain)) {\n        if (!first) s += ` `;\n        s += `${tag.toString(opts)}`;\n        first = false;\n      }\n    }\n\n    return s;\n  }\n}\n\nexport { MarkupTagConfig };\n","import { BitTagConfigKeyType, type BitTagConfigKeyTypeType } from '../enum/BitTagConfigKeyType.ts';\nimport { Count, type CountType } from '../enum/Count.ts';\nimport { type TagFormatType } from '../enum/TagFormat.ts';\nimport { AbstractTagConfig } from './AbstractTagConfig.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass PropertyTagConfig extends AbstractTagConfig {\n  readonly type: BitTagConfigKeyTypeType = BitTagConfigKeyType.property;\n\n  readonly array?: boolean; // If the property is treated as an array rather than a single value\n  readonly format?: TagFormatType; // How the property is formatted\n  readonly values?: string[]; // If the format is an enumeration, the possible values of the property\n  readonly defaultValue?: string; // The default value of the property - this value can be omitted from the markup\n\n  public constructor(params: {\n    configKey: ConfigKeyType;\n    tag: string;\n    maxCount: CountType;\n    minCount: number;\n    chain: TagsConfig | undefined;\n    jsonKey: string | undefined;\n    format: TagFormatType | undefined;\n    values: string[] | undefined;\n    defaultValue: string | undefined;\n    deprecated: string | undefined;\n  }) {\n    super({\n      type: BitTagConfigKeyType.property,\n      ...params,\n    });\n\n    this.array = params.maxCount === Count.infinity || params.maxCount > 1;\n    this.format = params.format;\n    this.values = params.values;\n    this.defaultValue = params.defaultValue;\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = `PTY[${this.tag}`;\n    if (opts.includeConfigs) {\n      if (this.deprecated != null) s += `, deprecated=${this.deprecated}`;\n      if (this.maxCount != null) s += `, max=${this.maxCount}`;\n      if (this.minCount != null) s += `, min=${this.minCount}`;\n      if (this.array != null) s += `, arr=${this.array}`;\n      if (this.format != null) s += `, fmt=${this.format}`;\n      if (this.values != null) s += `, vals=[${this.values.join(',')}]`;\n      if (this.defaultValue != null) s += `, def=${this.defaultValue}`;\n      if (this.jsonKey != null) s += `, json=${this.jsonKey}`;\n    }\n    s += ']';\n\n    if (this.chain && opts.includeChains) {\n      s += `\\n|__`;\n      let first = true;\n      for (const tag of Object.values(this.chain)) {\n        if (!first) s += ` `;\n        s += `${tag.toString(opts)}`;\n        first = false;\n      }\n    }\n\n    return s;\n  }\n}\n\nexport { PropertyTagConfig };\n","import { BitTagConfigKeyType, type BitTagConfigKeyTypeType } from '../enum/BitTagConfigKeyType.ts';\nimport { type CountType } from '../enum/Count.ts';\nimport { AbstractTagConfig } from './AbstractTagConfig.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass ResourceTagConfig extends AbstractTagConfig {\n  readonly type: BitTagConfigKeyTypeType = BitTagConfigKeyType.resource;\n\n  public constructor(params: {\n    configKey: ConfigKeyType;\n    tag: string;\n    maxCount: CountType;\n    minCount: number;\n    chain: TagsConfig | undefined;\n    jsonKey: string | undefined;\n    deprecated: string | undefined;\n  }) {\n    super({\n      type: BitTagConfigKeyType.resource,\n      ...params,\n    });\n\n    // TODO\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = `RES[${this.tag}`;\n    if (opts.includeConfigs) {\n      if (this.deprecated != null) s += `, deprecated=${this.deprecated}`;\n      if (this.maxCount != null) s += `, max=${this.maxCount}`;\n      if (this.minCount != null) s += `, min=${this.minCount}`;\n      if (this.jsonKey != null) s += `, json=${this.jsonKey}`;\n    }\n    s += ']';\n\n    if (this.chain && opts.includeChains) {\n      s += `\\n|__`;\n      let first = true;\n      for (const tag of Object.values(this.chain)) {\n        if (!first) s += ` `;\n        s += `${tag.toString(opts)}`;\n        first = false;\n      }\n    }\n\n    return s;\n  }\n}\n\nexport { ResourceTagConfig };\n","import { type CountType } from '../enum/Count.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass CardVariantConfig {\n  tags: TagsConfig;\n  bodyAllowed?: boolean; // Default: true\n  bodyRequired?: boolean; // Default: false\n  repeatCount?: CountType; // Default: 1\n  // JSON mapping fields\n  readonly jsonKey?: string | null; // JSON path for body text\n\n  public constructor(\n    tags: TagsConfig,\n    bodyAllowed?: boolean,\n    bodyRequired?: boolean,\n    repeatCount?: CountType,\n    jsonKey?: string | null,\n  ) {\n    this.tags = tags;\n    this.bodyAllowed = bodyAllowed == null ? true : bodyAllowed;\n    this.bodyRequired = bodyRequired;\n    this.repeatCount = repeatCount;\n    this.jsonKey = jsonKey;\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = '';\n\n    // Flags\n    const flags: string[] = [];\n    if (this.bodyAllowed) flags.push('bodyAllowed');\n    if (this.bodyRequired) flags.push('bodyRequired');\n    if (this.repeatCount != null) flags.push(`repeatCount=${this.repeatCount}`);\n    s += `[Flags]\\n${flags.join(', ')}`;\n\n    // Tags\n    s += `\\n\\n[Tags]`;\n\n    for (const tag of Object.values(this.tags)) {\n      s += `\\n${tag.toString(opts)}`;\n    }\n\n    return s;\n  }\n}\n\nexport { CardVariantConfig };\n","import { CardVariantConfig } from './CardVariantConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass CardSideConfig {\n  readonly name: string;\n  readonly repeat: boolean;\n  readonly jsonKey: string | null | undefined;\n  readonly variants: CardVariantConfig[];\n\n  public constructor(\n    name: string,\n    repeat: boolean,\n    variants: CardVariantConfig[],\n    jsonKey?: string | null,\n  ) {\n    this.name = name;\n    this.repeat = repeat;\n    this.jsonKey = jsonKey;\n    this.variants = variants;\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = '';\n\n    s += `[Side: ${this.name}]`;\n    if (this.repeat) s += ' (repeat)';\n\n    let variantNo = 0;\n    for (const variant of this.variants) {\n      s += `\\n  [Variant ${variantNo}]`;\n      s += `\\n  ${variant.toString(opts)}`;\n      variantNo++;\n    }\n\n    return s;\n  }\n}\n\nexport { CardSideConfig };\n","import { type CardSideConfig } from './CardSideConfig.ts';\nimport { type CardVariantConfig } from './CardVariantConfig.ts';\nimport { type CardSetConfigKeyType } from './enum/CardSetConfigKey.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass CardSetConfig {\n  readonly configKey: CardSetConfigKeyType;\n  readonly jsonKey: string | null;\n  readonly sections:\n    | Record<string, { jsonKey: string; isDefault?: boolean; sideJsonKey?: string }>\n    | undefined;\n  readonly sides: CardSideConfig[];\n\n  // Legacy accessor — provides the same shape as the old `variants: CardVariantConfig[][]`\n  // so downstream consumers (Config.getCardSetVariantConfig, etc.) continue to work.\n  get variants(): CardVariantConfig[][] {\n    return this.sides.map((side) => side.variants);\n  }\n\n  public constructor(\n    configKey: CardSetConfigKeyType,\n    jsonKey: string | null,\n    sections:\n      | Record<string, { jsonKey: string; isDefault?: boolean; sideJsonKey?: string }>\n      | undefined,\n    sides: CardSideConfig[],\n  ) {\n    this.configKey = configKey;\n    this.jsonKey = jsonKey;\n    this.sections = sections;\n    this.sides = sides;\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = '';\n\n    s += `[CardSet: ${this.configKey}]`;\n    s += `\\n  jsonKey: ${this.jsonKey}`;\n\n    for (const side of this.sides) {\n      s += `\\n${side.toString(opts)}`;\n    }\n\n    return s;\n  }\n}\n\nexport { CardSetConfig };\n","import { type BitTypeType } from '../enum/BitType.ts';\nimport { Count } from '../enum/Count.ts';\nimport { type ExampleTypeType } from '../enum/ExampleType.ts';\nimport { type TextFormatType } from '../enum/TextFormat.ts';\nimport { CardSetConfig } from './CardSetConfig.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass BitConfig {\n  readonly since: string; // Supported since version\n  readonly bitType: BitTypeType;\n  readonly inheritedBitTypes: BitTypeType[]; // Bit inheritance tree (array for order)\n  readonly inheritedBitTypesSet: Set<BitTypeType>; // Bit inheritance tree (set for faster lookup)\n  readonly textFormatDefault: TextFormatType; // Default text format\n  readonly tags: TagsConfig = {};\n  readonly cardSet?: CardSetConfig;\n  readonly quizBit?: boolean; // True if the bit is a quiz bit\n  readonly deprecated?: string; // Deprecated version\n  readonly bodyAllowed?: boolean; // Default: true\n  readonly bodyRequired?: boolean; // Default: false\n  readonly footerAllowed?: boolean; // Default: true\n  readonly footerRequired?: boolean; // Default: false\n  readonly resourceAttachmentAllowed?: boolean; // Default: true\n  readonly rootExampleType?: ExampleTypeType;\n  readonly comboResourceConfigKey?: ConfigKeyType;\n\n  public constructor(config: {\n    since: string;\n    bitType: BitTypeType;\n    inheritedBitTypes: BitTypeType[];\n    textFormatDefault: TextFormatType;\n    tags: TagsConfig;\n    cardSet: CardSetConfig | undefined;\n    quizBit: boolean | undefined;\n    deprecated: string | undefined;\n    bodyAllowed: boolean | undefined;\n    bodyRequired: boolean | undefined;\n    footerAllowed: boolean | undefined;\n    footerRequired: boolean | undefined;\n    resourceAttachmentAllowed: boolean | undefined;\n    rootExampleType: ExampleTypeType | undefined;\n    comboResourceConfigKey: ConfigKeyType | undefined;\n  }) {\n    const {\n      since,\n      bitType,\n      inheritedBitTypes,\n      textFormatDefault,\n      tags,\n      cardSet,\n      quizBit,\n      deprecated,\n      bodyAllowed,\n      bodyRequired,\n      footerAllowed,\n      footerRequired,\n      resourceAttachmentAllowed,\n      rootExampleType,\n      comboResourceConfigKey,\n    } = config;\n    this.since = since;\n    this.bitType = bitType;\n    this.inheritedBitTypes = inheritedBitTypes;\n    this.inheritedBitTypesSet = new Set(inheritedBitTypes);\n    this.textFormatDefault = textFormatDefault;\n    this.tags = tags;\n    this.cardSet = cardSet;\n    this.quizBit = quizBit;\n    this.deprecated = deprecated;\n    this.bodyAllowed = bodyAllowed == null ? true : bodyAllowed;\n    this.bodyRequired = bodyRequired;\n    this.footerAllowed = footerAllowed == null ? true : footerAllowed;\n    this.footerRequired = footerRequired;\n    this.resourceAttachmentAllowed =\n      resourceAttachmentAllowed == null ? true : resourceAttachmentAllowed;\n    this.rootExampleType = rootExampleType;\n    this.comboResourceConfigKey = comboResourceConfigKey;\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = `[Bit]\\n${this.bitType}`;\n\n    // Aliases\n    if (this.inheritedBitTypes.length > 0) {\n      s += `\\n\\n[Inheritance]`;\n\n      s += `\\n${this.inheritedBitTypes.join(' => ')}`;\n    }\n\n    // Default text format\n    s += `\\n\\n[Default text format]\\n${this.textFormatDefault}`;\n\n    // Flags\n    const flags: string[] = [];\n    if (this.since != null) flags.push(`since=${this.since}`);\n    if (this.deprecated != null) flags.push(`deprecated=${this.deprecated}`);\n    if (this.bodyAllowed) flags.push('bodyAllowed');\n    if (this.bodyRequired) flags.push('bodyRequired');\n    if (this.footerAllowed) flags.push('footerAllowed');\n    if (this.footerRequired) flags.push('footerRequired');\n    if (this.resourceAttachmentAllowed) flags.push('resourceAttachmentAllowed');\n    if (this.rootExampleType != null) flags.push(`rootExampleType=${this.rootExampleType}`);\n    if (this.comboResourceConfigKey != null)\n      flags.push(`comboResourceConfigKey=${this.comboResourceConfigKey}`);\n    s += `\\n\\n[Flags]\\n${flags.join(', ')}`;\n\n    // Tags\n    s += `\\n\\n[Tags]`;\n\n    for (const tag of Object.values(this.tags)) {\n      if (tag.maxCount === Count.infinity || tag.maxCount > 0) {\n        s += `\\n${tag.toString(opts)}`;\n      }\n    }\n\n    // Cards\n    if (this.cardSet) {\n      s += `\\n\\n${this.cardSet.toString(opts)}`;\n    }\n\n    return s;\n  }\n}\n\nexport { BitConfig };\n","import { Enum, type EnumType } from '@ncoderz/superenum';\n\nimport {\n  BitTagConfigKeyType,\n  type BitTagConfigKeyTypeType,\n} from '../../enum/BitTagConfigKeyType.ts';\nimport { groupKeys } from '../../enum/GroupKey.ts';\nimport { propertyKeys } from '../../enum/PropertyKey.ts';\nimport { resourceKeys } from '../../enum/ResourceKey.ts';\nimport { ResourceType, type ResourceTypeType } from '../../enum/ResourceType.ts';\nimport { tags } from '../../enum/Tag.ts';\n\n/**\n * Config keys for tags, resources, properties, and groups.\n *\n * Each type has a different prefix so there are no conflicts:\n * - Resources: `&`\n * - Properties: `@`\n * - Groups: `group_`\n * - Tags: <none>\n *\n */\nconst ConfigKey = {\n  // Internal\n  _unknown: '_unknown',\n\n  // Tags\n  ...tags,\n\n  // Resources\n  ...resourceKeys,\n\n  // Properties\n  ...propertyKeys,\n\n  // Groups\n  ...groupKeys,\n} as const;\n\nexport type ConfigKeyType = EnumType<typeof ConfigKey>;\n\nfunction typeFromConfigKey(tagKey: ConfigKeyType): BitTagConfigKeyTypeType {\n  if (!tagKey) return BitTagConfigKeyType.unknown;\n\n  if (tagKey.startsWith('@')) return BitTagConfigKeyType.property;\n  if (tagKey.startsWith('&')) return BitTagConfigKeyType.resource;\n  if (tagKey.startsWith('group_')) return BitTagConfigKeyType.group;\n\n  return BitTagConfigKeyType.tag;\n}\n\nfunction configKeyToPropertyType(configKey: string): string {\n  return configKey.replace(/^@/, '');\n}\n\nfunction configKeyToResourceType(configKey: string): ResourceTypeType {\n  return Enum(ResourceType).fromKey(configKey.replace(/^&/, '')) as ResourceTypeType;\n}\n\nexport { ConfigKey, configKeyToPropertyType, configKeyToResourceType, typeFromConfigKey };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst groupKeys = {\n  group_standardAllBits: 'group_standardAllBits',\n  group_standardItemLead: 'group_standardItemLead',\n  group_standardItemLeadInstructionHint: 'group_standardItemLeadInstructionHint',\n  group_standardTags: 'group_standardTags',\n  group_imageSource: 'group_imageSource',\n  group_technicalTerm: 'group_technicalTerm',\n  group_person: 'group_person',\n  group_gap: 'group_gap',\n  group_trueFalse: 'group_trueFalse',\n  group_markConfig: 'group_markConfig',\n  group_mark: 'group_mark',\n  group_bookCommon: 'group_bookCommon',\n  group_learningPathCommon: 'group_learningPathCommon',\n  group_advertisingCommon: 'group_advertisingCommon',\n  group_platformStylesCommon: 'group_platformStylesCommon',\n  group_quizCommon: 'group_quizCommon',\n  group_resourceBitTags: 'group_resourceBitTags',\n  group_resourceCommon: 'group_resourceCommon',\n  group_resourceImageCommon: 'group_resourceImageCommon',\n  group_resourceAudioCommon: 'group_resourceAudioCommon',\n  group_resourceVideoCommon: 'group_resourceVideoCommon',\n  group_resourceIcon: 'group_resourceIcon', // Alias for image\n  group_resourceImage: 'group_resourceImage',\n  group_resourceImageEmbed: 'group_resourceImageEmbed',\n  group_resourceImageLink: 'group_resourceImageLink',\n  group_resourceImageResponsive: 'group_resourceImageResponsive', // Combo resource\n  group_resourceImagePortrait: 'group_resourceImagePortrait',\n  group_resourceImageLandscape: 'group_resourceImageLandscape',\n  group_resourceAudio: 'group_resourceAudio',\n  group_resourceAudioEmbed: 'group_resourceAudioEmbed',\n  group_resourceAudioLink: 'group_resourceAudioLink',\n  group_resourceVideo: 'group_resourceVideo',\n  group_resourceVideoEmbed: 'group_resourceVideoEmbed',\n  group_resourceVideoLink: 'group_resourceVideoLink',\n  group_resourceStillImageFilm: 'group_resourceStillImageFilm', // Combo resource\n  group_resourceStillImageFilmEmbed: 'group_resourceStillImageFilmEmbed',\n  group_resourceStillImageFilmLink: 'group_resourceStillImageFilmLink',\n  group_resourceArticle: 'group_resourceArticle',\n  group_resourceArticleEmbed: 'group_resourceArticleEmbed',\n  group_resourceArticleLink: 'group_resourceArticleLink',\n  group_resourceDocument: 'group_resourceDocument',\n  group_resourceDocumentEmbed: 'group_resourceDocumentEmbed',\n  group_resourceDocumentLink: 'group_resourceDocumentLink',\n  group_resourceDocumentDownload: 'group_resourceDocumentDownload',\n  group_resourceAppLink: 'group_resourceAppLink',\n  group_resourceWebsiteLink: 'group_resourceWebsiteLink',\n  group_previewImages: 'group_previewImages',\n  group_previewVideos: 'group_previewVideos',\n} as const;\n\nconst GroupKey = groupKeys;\n\nexport type GroupKeyType = EnumType<typeof GroupKey>;\n\nexport { GroupKey, groupKeys };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst propertyKeys = {\n  property_action: '@action',\n  property_activityType: '@activityType',\n  property_additionalSolutions: '@additionalSolutions',\n  property_advertisingClickUrl: '@advertisingClickUrl',\n  property_ageRange: '@ageRange',\n  property_aiGenerated: '@aiGenerated',\n  property_allowedBit: '@allowedBit',\n  property_allowPrint: '@allowPrint',\n  property_allowSubtitles: '@allowSubtitles',\n  property_alt: '@alt',\n  property_altLangTag: '@altLangTag',\n  property_analyticsTag: '@analyticsTag',\n  property_author: '@author',\n  property_authorFullName: '@authorFullName',\n  property_authorJobTitle: '@authorJobTitle',\n  property_authorPseudonym: '@authorPseudonym',\n  property_authorTitle: '@authorTitle',\n  property_autoplay: '@autoplay',\n  property_availableClassifications: '@availableClassifications',\n  property_brandColor: '@brandColor',\n  property_brandColorName: '@brandColorName',\n  property_backgroundImage: '@backgroundImage',\n  property_blockId: '@blockId',\n  property_book: '@book',\n  property_bookAlias: '@bookAlias',\n  property_bookDiff: '@bookDiff',\n  property_bot: '@bot',\n  property_bubbleTag: '@bubbleTag',\n  property_extractorTag: '@extractorTag',\n  property_extractorInternal: '@extractorInternal',\n  property_buttonCaption: '@buttonCaption',\n  property_callToActionUrl: '@callToActionUrl',\n  property_caption: '@caption',\n  property_categoryTag: '@categoryTag',\n  property_chatWithBook: '@chatWithBook',\n  property_chatWithBookBrainKey: '@chatWithBookBrainKey',\n  property_currency: '@currency',\n  property_bookIsbn: '@bookIsbn',\n  property_bookAuthor: '@bookAuthor',\n  property_bookType: '@bookType',\n  property_bookBindingType: '@bookBindingType',\n  property_bookNumberOfPages: '@bookNumberOfPages',\n  property_bookRating: '@bookRating',\n  property_bookSeriesTitle: '@bookSeriesTitle',\n  property_bookSeriesId: '@bookSeriesId',\n  property_bookSeriesNumber: '@bookSeriesNumber',\n  property_bookLanguage: '@bookLanguage',\n  property_bookPublishingDate: '@bookPublishingDate',\n  property_bookPublisher: '@bookPublisher',\n  property_bookTranslator: '@bookTranslator',\n  property_bookOriginalTitle: '@bookOriginalTitle',\n  property_gmbExternalShop: '@gmbExternalShop',\n  property_gmbExternalShopItems: '@gmbExternalShopItems',\n  property_citationStyle: '@citationStyle',\n  property_classification: '@classification',\n  property_codeLineNumbers: '@codeLineNumbers',\n  property_codeMinimap: '@codeMinimap',\n  property_color: '@color',\n  property_colorTag: '@colorTag',\n  property_computerLanguage: '@computerLanguage',\n  property_content2Buy: '@content2Buy',\n  property_listPrice: '@listPrice',\n  property_customerProductId: '@customerProductId',\n  property_customerProductShopLink: '@customerProductShopLink',\n  property_copyright: '@copyright',\n  property_coverColor: '@coverColor',\n  property_coverImage: '@coverImage',\n  property_customerExternalId: '@customerExternalId',\n  property_customerId: '@customerId',\n  property_date: '@date',\n  property_dateEnd: '@dateEnd',\n  property_decimalPlaces: '@decimalPlaces',\n  property_deeplink: '@deeplink',\n  property_diffContext: '@diffContext',\n  property_diffOp: '@diffOp',\n  property_diffRef: '@diffRef',\n  property_diffTime: '@diffTime',\n  property_diffTo: '@diffTo',\n  property_disableCalculation: '@disableCalculation',\n  property_disableFeedback: '@disableFeedback',\n  property_duration: '@duration',\n  property_isEditable: '@isEditable',\n  property_needsValidation: '@needsValidation',\n  property_validationDate: '@validationDate',\n  property_emphasis: '@emphasis',\n  property_example: '@example',\n  property_externalId: '@externalId',\n  property_externalLink: '@externalLink',\n  property_externalLinkText: '@externalLinkText',\n  property_feedbackEngine: '@feedbackEngine',\n  property_feedbackType: '@feedbackType',\n  property_flashcardSet: '@flashcardSet',\n  property_focusX: '@focusX',\n  property_focusY: '@focusY',\n  property_format: '@format',\n  property_formula: '@formula',\n  property_fullName: '@fullName',\n  property_groupTag: '@groupTag',\n  property_handInAcceptFileType: '@handInAcceptFileType',\n  property_handInInstruction: '@handInInstruction',\n  property_handInRequirement: '@handInRequirement',\n  property_hasBookNavigation: '@hasBookNavigation',\n  property_hasMarkAsDone: '@hasMarkAsDone',\n  property_height: '@height',\n  property_icon: '@icon',\n  property_iconTag: '@iconTag',\n  property_id: '@id',\n  property_iframeSrc: '@iframeSrc',\n  property_iframeName: '@iframeName',\n  property_imageFirst: '@imageFirst',\n  property_imageSource: '@imageSource',\n  property_index: '@index',\n  property_internalComment: '@internalComment',\n  property_internalPrintPdf: '@internalPrintPdf',\n  property_hasPrintRestriction: '@hasPrintRestriction',\n  property_enforceUpdateOverUserInput: '@enforceUpdateOverUserInput',\n  property_extractorExtractionTimestamp: '@extractorExtractionTimestamp',\n  property_isCaseSensitive: '@isCaseSensitive',\n  property_isInfoOnly: '@isInfoOnly',\n  property_isPublic: '@isPublic',\n  property_isTemplate: '@isTemplate',\n  property_isTemplateStripTheme: '@isTemplateStripTheme',\n  property_isTracked: '@isTracked',\n  property_jobTitle: '@jobTitle',\n  property_jupyterExecutionCount: '@jupyterExecutionCount',\n  property_jupyterId: '@jupyterId',\n  property_kind: '@kind',\n  property_label: '@label',\n  property_labelFalse: '@labelFalse',\n  property_labelTrue: '@labelTrue',\n  property_lang: '@lang',\n  property_language: '@language',\n  property_layer: '@layer',\n  property_layerRole: '@layerRole',\n  property_levelACTFL: '@levelACTFL',\n  property_levelCEFR: '@levelCEFR',\n  property_levelCEFRp: '@levelCEFRp',\n  property_levelILR: '@levelILR',\n  property_license: '@license',\n  property_list: '@list',\n  property_listItemIndent: '@listItemIndent',\n  property_location: '@location',\n  property_machineTranslated: '@machineTranslated',\n  property_translationOf: '@translationOf',\n  property_translationOfBook: '@translationOfBook',\n  property_spansPageBreak: '@spansPageBreak',\n  property_mailingList: '@mailingList',\n  property_mark: '@mark',\n  property_maxCreatedBits: '@maxCreatedBits',\n  property_maxDisplayLevel: '@maxDisplayLevel',\n  property_maxTocChapterLevel: '@maxTocChapterLevel',\n  property_mockupId: '@mockupId',\n  property_mute: '@mute',\n  property_padletId: '@padletId',\n  property_page: '@page',\n  property_printParentChapterLevel: '@printParentChapterLevel',\n  property_pageNo: '@pageNo',\n  property_partialAnswer: '@partialAnswer',\n  property_partner: '@partner', // Deprecated, replaced by person\n  property_path: '@path',\n  property_platformBackgroundColor: '@platformBackgroundColor',\n  property_platformBorderColor: '@platformBorderColor',\n  property_platformBrandTarget: '@platformBrandTarget',\n  property_platformButtonBackgroundColor: '@platformButtonBackgroundColor',\n  property_platformButtonPrimaryColor: '@platformButtonPrimaryColor',\n  property_platformMessageBackgroundColor: '@platformMessageBackgroundColor',\n  property_platformName: '@platformName',\n  property_platformPlaceholderColor: '@platformPlaceholderColor',\n  property_platformPrimaryColor: '@platformPrimaryColor',\n  property_platformScrollbarColor: '@platformScrollbarColor',\n  property_platformSecondaryColor: '@platformSecondaryColor',\n  property_platformSelectionColor: '@platformSelectionColor',\n  property_platformSelectionTextColor: '@platformSelectionTextColor',\n  property_platformBaseLayerColor: '@platformBaseLayerColor',\n  property_platformMargin: '@platformMargin',\n  property_platformBorderRadius: '@platformBorderRadius',\n  property_platformSelectionBorderRadius: '@platformSelectionBorderRadius',\n  property_platformLogoMaxHeight: '@platformLogoMaxHeight',\n  property_platformNeedsShadow: '@platformNeedsShadow',\n  property_platformSeparatorColor: '@platformSeparatorColor',\n  property_platformTextSelectionColor: '@platformTextSelectionColor',\n  property_person: '@person',\n  property_pointerLeft: '@pointerLeft',\n  property_pointerTop: '@pointerTop',\n  property_posterImage: '@posterImage',\n  property_processHandIn: '@processHandIn',\n  property_processHandInLocation: '@processHandInLocation',\n  property_product: '@product',\n  property_productFolder: '@productFolder',\n  property_productId: '@productId',\n  property_productVideo: '@productVideo',\n  property_progress: '@progress',\n  property_pseudonym: '@pseudonym',\n  property_publications: '@publications',\n  property_publisher: '@publisher',\n  property_publisherName: '@publisherName',\n  property_quizCountItems: '@quizCountItems',\n  property_quizStrikethroughSolutions: '@quizStrikethroughSolutions',\n  property_quotedPerson: '@quotedPerson',\n  property_ratingLevelEnd: '@ratingLevelEnd',\n  property_ratingLevelSelected: '@ratingLevelSelected',\n  property_ratingLevelStart: '@ratingLevelStart',\n  property_reaction: '@reaction',\n  property_reasonableNumOfChars: '@reasonableNumOfChars',\n  property_reductionTag: '@reductionTag',\n  property_refAuthor: '@refAuthor',\n  property_refBookTitle: '@refBookTitle',\n  property_reference: '@reference',\n  property_refPublicationYear: '@refPublicationYear',\n  property_refPublisher: '@refPublisher',\n  property_relatedBook: '@relatedBook',\n  property_releaseDate: '@releaseDate',\n  property_releaseKind: '@releaseKind',\n  property_releaseVersion: '@releaseVersion',\n  property_reportTag: '@reportTag',\n  property_resolved: '@resolved',\n  property_resolvedBy: '@resolvedBy',\n  property_resolvedDate: '@resolvedDate',\n  property_revealSolutions: '@revealSolutions',\n  property_sampleSolution: '@sampleSolution',\n  property_scormSource: '@scormSource',\n  property_search: '@search',\n  property_searchIndex: '@searchIndex',\n  property_selected: '@selected',\n  property_servings: '@servings',\n  property_showInIndex: '@showInIndex',\n  property_showSubtitles: '@showSubtitles',\n  property_siteName: '@siteName',\n  property_size: '@size',\n  property_slug: '@slug',\n  property_sourceDocument: '@sourceDocument',\n  property_sourceRL: '@sourceRL',\n  property_spaceId: '@spaceId',\n  property_src1x: '@src1x',\n  property_src2x: '@src2x',\n  property_src3x: '@src3x',\n  property_src4x: '@src4x',\n  property_srcAlt: '@srcAlt',\n  property_stripePricingTableId: '@stripePricingTableId',\n  property_stripePublishableKey: '@stripePublishableKey',\n  property_subject: '@subject',\n  property_subtype: '@subtype',\n  property_tableAutoWidth: '@tableAutoWidth',\n  property_tableColWidth: '@tableColWidth',\n  property_tableColumnMinWidth: '@tableColumnMinWidth',\n  property_tableFixedHeader: '@tableFixedHeader',\n  property_tableHeaderWhitespaceNoWrap: '@tableHeaderWhitespaceNoWrap',\n  property_tableHeight: '@tableHeight',\n  property_tablePagination: '@tablePagination',\n  property_tablePaginationLimit: '@tablePaginationLimit',\n  property_tableResizableColumns: '@tableResizableColumns',\n  property_tableSearch: '@tableSearch',\n  property_tableSort: '@tableSort',\n  property_tableWhitespaceNoWrap: '@tableWhitespaceNoWrap',\n  property_tableCellType: '@tableCellType',\n  property_tableRowSpan: '@tableRowSpan',\n  property_tableColSpan: '@tableColSpan',\n  property_tableScope: '@tableScope',\n  property_tag: '@tag',\n  property_target: '@target',\n  property_technicalTerm: '@technicalTerm',\n  property_textReference: '@textReference',\n  property_theme: '@theme',\n  property_rtl: '@rtl',\n  property_thumbImage: '@thumbImage',\n  property_title: '@title',\n  property_toc: '@toc',\n  property_tocContent: '@tocContent',\n  property_tocResource: '@tocResource',\n  property_topicTag: '@topicTag',\n  property_trim: '@trim',\n  property_unit: '@unit',\n  property_unitAbbr: '@unitAbbr',\n  property_vendorDashboardId: '@vendorDashboardId',\n  property_vendorSurveyId: '@vendorSurveyId',\n  property_vendorUrl: '@vendorUrl',\n  property_videoCallLink: '@videoCallLink',\n  property_width: '@width',\n  property_x: '@x',\n  property_y: '@y',\n  property_zoomDisabled: '@zoomDisabled',\n} as const;\n\nconst PropertyKey = propertyKeys;\n\nexport type PropertyKeyType = EnumType<typeof PropertyKey>;\n\nexport { PropertyKey, propertyKeys };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst resourceKeys = {\n  resource_image: '&image',\n  resource_imageResponsive: '&imageResponsive',\n  resource_imagePortrait: '&imagePortrait',\n  resource_imageLandscape: '&imageLandscape',\n  resource_imageEmbed: '&imageEmbed',\n  resource_imageLink: '&imageLink',\n  resource_audio: '&audio',\n  resource_audioEmbed: '&audioEmbed',\n  resource_audioLink: '&audioLink',\n  resource_video: '&video',\n  resource_videoEmbed: '&videoEmbed',\n  resource_videoLink: '&videoLink',\n  resource_stillImageFilm: '&stillImageFilm',\n  resource_stillImageFilmEmbed: '&stillImageFilmEmbed',\n  resource_stillImageFilmLink: '&stillImageFilmLink',\n  resource_article: '&article',\n  resource_articleEmbed: '&articleEmbed',\n  resource_articleLink: '&articleLink',\n  resource_document: '&document',\n  resource_documentEmbed: '&documentEmbed',\n  resource_documentLink: '&documentLink',\n  resource_documentDownload: '&documentDownload',\n  resource_appLink: '&appLink',\n  resource_websiteLink: '&websiteLink',\n\n  resource_icon: '&icon',\n  resource_platformBackgroundImage: '&platformBackgroundImage',\n  resource_platformIcon: '&platformIcon',\n  resource_platformLogo: '&platformLogo',\n  resource_backgroundWallpaper: '&backgroundWallpaper',\n  resource_imagePlaceholder: '&imagePlaceholder',\n  resource_previewImage: '&previewImage',\n  resource_previewVideo: '&previewVideo',\n  resource_coverImage: '&coverImage',\n  resource_backgroundImage: '&backgroundImage',\n} as const;\n\nconst ResourceKey = resourceKeys;\n\nexport type ResourceKeyType = EnumType<typeof ResourceKey>;\n\nexport { ResourceKey, resourceKeys };\n","import { type EnumType } from '@ncoderz/superenum';\n\nimport { StringUtils } from '../../utils/StringUtils.ts';\nimport type { ConfigKeyType } from '../config/enum/ConfigKey.ts';\n\nconst ResourceType = {\n  unknown: 'unknown',\n\n  image: 'image',\n  imageResponsive: 'image-responsive',\n  imagePortrait: 'image-portrait',\n  imageLandscape: 'image-landscape',\n  imageEmbed: 'image-embed',\n  imageLink: 'image-link',\n  audio: 'audio',\n  audioEmbed: 'audio-embed',\n  audioLink: 'audio-link',\n  video: 'video',\n  videoEmbed: 'video-embed',\n  videoLink: 'video-link',\n  stillImageFilm: 'still-image-film',\n  stillImageFilmEmbed: 'still-image-film-embed',\n  stillImageFilmLink: 'still-image-film-link',\n  article: 'article',\n  articleEmbed: 'article-embed',\n  articleLink: 'article-link',\n  document: 'document',\n  documentEmbed: 'document-embed',\n  documentLink: 'document-link',\n  documentDownload: 'document-download',\n  appLink: 'app-link',\n  websiteLink: 'website-link',\n\n  // Aliases for image\n  icon: 'icon',\n  backgroundWallpaper: 'backgroundWallpaper',\n  imagePlaceholder: 'imagePlaceholder',\n  platformIcon: 'platformIcon',\n  platformLogo: 'platformLogo',\n  platformBackgroundImage: 'platformBackgroundImage',\n  previewImage: 'previewImage',\n  previewVideo: 'previewVideo',\n  coverImage: 'coverImage',\n  backgroundImage: 'backgroundImage',\n} as const;\n\nexport type ResourceTypeType = EnumType<typeof ResourceType>;\n\nfunction resourceTypeToConfigKey(type: ResourceTypeType): ConfigKeyType {\n  return `&${StringUtils.kebabToCamel(type)}` as ConfigKeyType;\n}\n\nexport { ResourceType, resourceTypeToConfigKey };\n","class StringUtils {\n  /**\n   * Check if an object is a string.\n   *\n   * @param obj - The object to check.\n   * @returns true if the object is a string, otherwise false.\n   */\n  isString(obj: unknown): boolean {\n    return typeof obj === 'string' || obj instanceof String;\n  }\n\n  /**\n   * Pass any value and convert it to a string.\n   *\n   * @param str the value to convert to a string\n   * @returns the string or an empty string if the value is undefined\n   */\n  string(str: unknown | undefined): string {\n    return str ? `${str}` : '';\n  }\n\n  /**\n   * Pass any value and convert it to a trimmed string.\n   *\n   * @param str the value to convert to a trimmed string\n   * @returns the trimmed string or an empty string if the value is undefined\n   */\n  trimmedString(str: unknown | undefined): string {\n    return this.string(str).trim();\n  }\n\n  /**\n   * Count the occurrences of a substring in a string.\n   *\n   * @param str the string to search\n   * @param subStr the substring to search for\n   * @returns the number of occurrences of the substring in the string\n   */\n  countOccurrences(str: string, subStr: string): number {\n    return str.split(subStr).length - 1;\n  }\n\n  /**\n   * Count the occurrences of a substring at the start of a string.\n   *\n   * @param str the string to search\n   * @param subStr the substring to search for\n   * @returns the number of occurrences of the substring at the start of the string\n   */\n  countOccurrencesAtStart(str: string, subStr: string): number {\n    let count = 0;\n    while (str.startsWith(subStr)) {\n      count++;\n      str = str.substring(subStr.length);\n    }\n\n    return count;\n  }\n\n  /**\n   * Count the occurrences of a substring at the end of a string.\n   *\n   * @param str the string to search\n   * @param subStr the substring to search for\n   * @returns the number of occurrences of the substring at the end of the string\n   */\n  countOccurrencesAtEnd(str: string, subStr: string): number {\n    let count = 0;\n    while (str.endsWith(subStr)) {\n      count++;\n      str = str.substring(0, str.length - subStr.length);\n    }\n\n    return count;\n  }\n\n  /**\n   * Split a string using a set of placeholders, returning an array of strings and placeholders.\n   *\n   * e.g.\n   * str = \"This {0} a {1} with lots {2} placeholders\"\n   * placeholders = [\"{0}\", \"{1}\", \"{2}\"]\n   *\n   * return = [\"This \", \"{0}\", \" a \", \"{1}\", \" with lots \", \"{2}\", \" placeholders\"]\n   *\n   * @param str\n   * @param placeholders\n   */\n  splitPlaceholders(str: string, placeholders: string[]): string[] {\n    let res: string[] = [str];\n\n    // Split all texts in texts (with key) and return new text array with key inserted at the split points\n    const splitTexts = (texts: string[], key: string): string[] => {\n      const newTexts: string[] = [];\n      for (const text of texts) {\n        const tParts = text.split(key);\n        for (let i = 0, len = tParts.length; i < len; i++) {\n          const tPart = tParts[i];\n          const lastIndex = i === len - 1;\n          newTexts.push(tPart);\n          if (!lastIndex) {\n            newTexts.push(key);\n          }\n        }\n      }\n      return newTexts;\n    };\n\n    for (const p of placeholders) {\n      res = splitTexts(res, p);\n    }\n\n    return res;\n  }\n\n  /**\n   * Return the first line of text to a specified maximum width.\n   * @argument str The string to be truncated.\n   * @argument width The maximum width of the wrapped text in characters.\n   * @returns A string containing the first line, possibly truncated.\n   */\n  firstLine(str: string, width?: number): string {\n    const result: string = str;\n\n    if (width == null) width = str.length;\n    if (width < 1 || str == null || str.length <= width) return result;\n\n    const strs = str.split(`\\n`);\n    if (strs.length > 0) {\n      return strs[0].substring(0, width);\n    }\n\n    return result;\n  }\n\n  /**\n   * Wraps the provided string input to a specified maximum width.\n   * @argument str The string to be wrapped.\n   * @argument width The maximum width of the wrapped text in characters.\n   * @returns A string array containing all lines.\n   */\n  wordWrap(str: string, width: number): string[] {\n    const result: string[] = [];\n\n    if (width < 1 || str == null || str.length <= width) return result;\n\n    const len = str.length;\n    const rangeMax = len - width; // we don't need to split after this position\n    let rangeStart = 0;\n    let subString: string;\n    while (rangeStart < rangeMax) {\n      let subLength: number;\n      const rangeEnd = rangeStart + width;\n      // First test for newlines in this range. If so, don't split on word break but on the newline.\n      const ixNewLine = str.indexOf('\\n', rangeStart);\n      if (ixNewLine > -1 && ixNewLine > rangeStart && ixNewLine < rangeEnd) {\n        subLength = ixNewLine - rangeStart;\n        subString = str.substr(rangeStart, subLength);\n        rangeStart = rangeStart + subLength + 1;\n        result.push(subString);\n        continue;\n      }\n      // No newlines. Find the last wordbreak in the range.\n      const ix = str.lastIndexOf(' ', rangeEnd); // find the last word break\n      let rangeStartNext = 0;\n      if (ix > -1 && ix != rangeStart - 1) {\n        subLength = ix - rangeStart;\n        if (subLength > 0) {\n          rangeStartNext = rangeStart + subLength + 1; // +1 to skip the whitespace\n        }\n        //else { // not needed anymore because of the maxPos check\n        //    sub = str.substr(pos);\n        //    newPos = len + 1;\n        //}\n      } else {\n        // The range has no whitespace.\n        subLength = width;\n        rangeStartNext = rangeStart + width;\n      }\n      subString = str.slice(rangeStart, rangeStart + subLength);\n      rangeStart = rangeStartNext;\n      result.push(subString.trim());\n    }\n    // Add the remainder\n    if (rangeStart < len) {\n      subString = str.slice(rangeStart);\n      result.push(subString);\n    }\n\n    return result;\n  }\n\n  /**\n   * Convert a kebab-case string to camelCase.\n   *\n   * @param str the string to convert\n   * @returns the camelCase version of the string\n   */\n  kebabToCamel(str: string): string {\n    if (!str) return str;\n    return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n  }\n\n  /**\n   * Convert a camelCase string to kebab-case.\n   *\n   * @param str the string to convert\n   * @returns the kebab-case version of the string\n   */\n  camelToKebab(str: string): string {\n    if (!str) return str;\n    return str\n      .replace(/([a-z])([A-Z])/g, '$1-$2')\n      .replace(/[\\s_]+/g, '-')\n      .toLowerCase();\n  }\n}\n\nconst stringUtils = new StringUtils();\n\nexport { stringUtils as StringUtils };\n","import { type CountType } from '../enum/Count.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\nclass ResourcesConfig {\n  readonly tags: TagsConfig;\n  readonly resourceAttachmentAllowed: boolean;\n  readonly resourceAttachmentConfigKey: string | undefined;\n  readonly comboResourceConfigKeysMap: Map<ConfigKeyType, ConfigKeyType[]>;\n\n  public constructor(\n    tags: TagsConfig,\n    resourceAttachmentAllowed: boolean | undefined,\n    resourceAttachmentConfigKey: ConfigKeyType | undefined,\n    comboResourceConfigKeysMap: Map<ConfigKeyType, ConfigKeyType[]>,\n  ) {\n    this.tags = tags;\n    this.resourceAttachmentAllowed = resourceAttachmentAllowed ?? false;\n    this.resourceAttachmentConfigKey = resourceAttachmentConfigKey;\n    this.comboResourceConfigKeysMap = comboResourceConfigKeysMap;\n  }\n\n  public getCountsMin(): Map<ConfigKeyType, number> {\n    const counts: Map<ConfigKeyType, number> = new Map();\n    for (const r of Object.values(this.tags)) {\n      if (r.minCount != null) {\n        counts.set(r.configKey, r.minCount);\n      }\n    }\n    return counts;\n  }\n\n  public getCountsMax(): Map<ConfigKeyType, CountType> {\n    const counts: Map<ConfigKeyType, CountType> = new Map();\n    for (const r of Object.values(this.tags)) {\n      if (r.maxCount != null) {\n        counts.set(r.configKey, r.maxCount);\n      }\n    }\n    return counts;\n  }\n}\n\nexport { ResourcesConfig };\n","export interface GetFilenamesSyncOptions {\n  match?: RegExp;\n  recursive?: boolean;\n  maxDepth?: number;\n}\n\ninterface RemoveUnwantedPropertiesOptions {\n  ignoreAllUndefined?: boolean;\n  ignoreUndefined?: string[];\n  ignoreAllFalse?: boolean;\n  ignoreFalse?: string[];\n  ignoreAllEmptyString?: boolean;\n  ignoreEmptyString?: string[];\n  ignoreAllEmptyArrays?: boolean;\n  ignoreEmptyArrays?: string[];\n  ignoreAllEmptyObjects?: boolean;\n  ignoreEmptyObjects?: string[];\n}\n\nclass ObjectUtils {\n  /**\n   * Check if a variable is a function\n   *\n   * @param val\n   * @returns true if a function\n   */\n  isFunction(val: unknown) {\n    return Object.prototype.toString.call(val) === '[object Function]';\n  }\n\n  /**\n   * Check if a variable is an array\n   *\n   * @param val\n   * @returns true if a array\n   */\n  isArray(val: unknown) {\n    return Array.isArray(val); // Object.prototype.toString.call(val) === '[object Array]';\n  }\n\n  /**\n   * Check if a variable is a date\n   *\n   * @param val\n   * @returns true if a date\n   */\n  isDate(val: unknown) {\n    return Object.prototype.toString.call(val) === '[object Date]';\n  }\n\n  /**\n   * Check if a variable is a object\n   *\n   * @param val\n   * @returns true if an object\n   */\n  isObject(val: unknown) {\n    return Object.prototype.toString.call(val) === '[object Object]';\n  }\n\n  /**\n   * Check if a variable is a value (i.e. a number)\n   *\n   * @param val\n   * @returns true if a value\n   */\n  isValue(val: unknown) {\n    return !this.isObject(val) && !this.isArray(val);\n  }\n\n  /**\n   * Get the value of a property in a plain JS object\n   * using a path string or array.\n   *\n   * @param obj the object to get a property from\n   * @param path the path to the property to set as a dotted string or array or a mix of both\n   * @returns the value of the property, or undefined if the property does not exist\n   */\n  getViaPath(obj: unknown, path: string | string[]): unknown {\n    if (!obj) return undefined;\n    if (!path) return undefined;\n    if (!Array.isArray(path)) path = [path]; // Ensure path is an array\n\n    // Split dotted paths\n    path = path.flatMap((p) => p.split('.'));\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let node = obj as any;\n\n    for (const key of path) {\n      if (node == null) return undefined;\n      node = node[key];\n    }\n\n    return node;\n  }\n\n  /**\n   * Set the value of a property in a plain JS object\n   * using a path string or array.\n   *\n   * @param obj the object to modify\n   * @param path the path to the property to set as a dotted string or array or a mix of both\n   * @param value the value to set\n   * @param create - if true, create plain objects in the path if they do not exist\n   * @returns true if the value was set, false if the value was not set\n   */\n  setViaPath(obj: unknown, path: string | string[], value: unknown, create?: boolean): boolean {\n    if (!obj) return false;\n    if (!path) return false;\n    if (!Array.isArray(path)) path = [path]; // Ensure path is an array\n\n    // Split dotted paths\n    path = path.flatMap((p) => p.split('.'));\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let node = obj as any;\n\n    for (let i = 0; i < path.length - 1; i++) {\n      const key = path[i];\n      if (node[key] == undefined) {\n        if (create) {\n          node[key] = {};\n        } else {\n          return false;\n        }\n      }\n      node = node[key];\n    }\n\n    node[path[path.length - 1]] = value;\n    return true;\n  }\n\n  /**\n   * Return an array of the objects at the end of the paths\n   * specified in the path array.\n   *\n   * e.g.\n   *\n   * const obj = obj = {\n   *   a: {\n   *     b: {\n   *       c: 1,\n   *     },\n   *   },\n   *   d: [{ e: 2 }, { f: 3 }],\n   *   g: [{ h: [{ i: 4 }] }, { h: [{ i: 5 }, { i: 6 }] }, { h: [{ i: 7 }] }],\n   * }\n   *\n   * objectUtils.flatMapPath(obj, ['a']);\n   * [{ b: { c: 1 }]\n   *\n   * objectUtils.flatMapPath(obj, ['a', 'b']);\n   * [{ c: 1 }]\n   *\n   * objectUtils.flatMapPath(obj, ['a', 'b', 'c']);\n   * [1]\n   *\n   * objectUtils.flatMapPath(obj, ['d']);\n   * [{ e: 2 }, { f: 3 }]\n   *\n   * objectUtils.flatMapPath(obj, ['d', 'e']);\n   * [2]\n   *\n   * objectUtils.flatMapPath(obj, ['g']);\n   * [{ h: [{ i: 4 }] }, { h: [{ i: 5 }, { i: 6 }] }, { h: [{ i: 7 }] }]\n   *\n   * objectUtils.flatMapPath(obj, ['g', 'h']);\n   * [{ i: 4 }, { i: 5 }, { i: 6 }, { i: 7 }]\n   *\n   * objectUtils.flatMapPath(obj, ['g', 'h', 'i']);\n   * [4, 5, 6, 7]\n   *\n   * @param obj\n   * @param path\n   * @returns\n   */\n  flatMapPath(obj: unknown, path: string | string[]): unknown[] {\n    if (!obj) return [];\n    if (!path) return [];\n    if (!Array.isArray(path)) path = [path]; // Ensure path is an array\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const node = obj as any;\n\n    const key = path.shift();\n    if (key == null) return node;\n    const data = node[key];\n\n    if (!data) return [];\n    if (Array.isArray(data)) {\n      return data.flatMap((d) => this.flatMapPath(d, path.slice()));\n    } else {\n      return [this.flatMapPath(data, path)].flat();\n    }\n  }\n\n  // testFlatMapPath() {\n  //   const obj = {\n  //     a: {\n  //       b: {\n  //         c: 1,\n  //       },\n  //     },\n  //     d: [{ e: 2 }, { f: 3 }],\n  //     g: [{ h: [{ i: 4 }] }, { h: [{ i: 5 }, { i: 6 }] }, { h: [{ i: 4 }] }],\n  //   };\n\n  //   console.log(this.flatMapPath(obj, 'a')); // [{ b: { c: 1 }]\n  //   console.log(this.flatMapPath(obj, ['a', 'b'])); // [{ c: 1 }]\n  //   console.log(this.flatMapPath(obj, ['a', 'b', 'c'])); // [1]\n  //   console.log(this.flatMapPath(obj, ['d'])); // [{ e: 2 }, { f: 3 }]\n  //   console.log(this.flatMapPath(obj, ['d', 'e'])); // [2]\n  //   console.log(this.flatMapPath(obj, ['g'])); // [{ h: [{ i: 4 }] }, { h: [{ i: 5 }, { i: 6 }] }, { h: [{ i: 4 }] }]\n  //   console.log(this.flatMapPath(obj, ['g', 'h'])); // [{ i: 4 }, { i: 5 }, { i: 6 }, { i: 4 }]\n  //   console.log(this.flatMapPath(obj, ['g', 'h', 'i'])); // [4, 5, 6, 4]\n  // }\n\n  /**\n   * Order the properties of a plain JS object.\n   * The original properties are removed, and re-added in the new order.\n   * Any non-specified properties are dropped.\n   *\n   * NOTE: The JS spec does not specifiy an order for property iteration, but all major JS engines including V8 which\n   * is used by NodeJS and Chrome do have a specific iteration order which is defined by the order properties are\n   * added to an object. Many applications rely on this iteration order.\n   *\n   * @param obj - object with properties to re-order\n   * @param order - array of property keys in the desired order.\n   */\n  orderProperties<T>(obj: T, order: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n    const props = Object.assign({}, objAsAny);\n    for (const k of Object.keys(objAsAny)) {\n      delete objAsAny[k];\n    }\n    for (const k of order) {\n      if (Object.prototype.hasOwnProperty.call(props, k)) {\n        objAsAny[k] = props[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any keys whose value is 'undefined' from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeUndefinedProperties(obj: unknown, excludeKeys?: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    for (const [k, v] of Object.entries(objAsAny)) {\n      if (excludeKeys && excludeKeys.indexOf(k) >= 0) continue;\n\n      if (v == undefined) {\n        delete objAsAny[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any keys whose value is 'false' from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeFalseProperties(obj: unknown, excludeKeys?: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    for (const [k, v] of Object.entries(objAsAny)) {\n      if (excludeKeys && excludeKeys.indexOf(k) >= 0) continue;\n\n      if (v === false) {\n        delete objAsAny[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any keys whose value is '' from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeEmptyStringProperties(obj: unknown, excludeKeys?: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    for (const [k, v] of Object.entries(objAsAny)) {\n      if (excludeKeys && excludeKeys.indexOf(k) >= 0) continue;\n\n      if (v === '') {\n        delete objAsAny[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any keys whose value is '[]' from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeEmptyArrayProperties(obj: unknown, excludeKeys?: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    for (const [k, v] of Object.entries(objAsAny)) {\n      if (excludeKeys && excludeKeys.indexOf(k) >= 0) continue;\n\n      if (Array.isArray(v) && v.length === 0) {\n        delete objAsAny[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any keys whose value is '{}' from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeEmptyObjectProperties(obj: unknown, excludeKeys?: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    for (const [k, v] of Object.entries(objAsAny)) {\n      if (excludeKeys && excludeKeys.indexOf(k) >= 0) continue;\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      if (this.isObject(v) && Object.keys(v as any).length === 0) {\n        delete objAsAny[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any unwanted properties from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeUnwantedProperties(obj: unknown, options?: RemoveUnwantedPropertiesOptions): void {\n    options = Object.assign({}, options);\n\n    if (!options.ignoreAllUndefined) this.removeUndefinedProperties(obj, options.ignoreUndefined);\n    if (!options.ignoreAllFalse) this.removeFalseProperties(obj, options.ignoreFalse);\n    if (!options.ignoreAllEmptyString)\n      this.removeEmptyStringProperties(obj, options.ignoreEmptyString);\n    if (!options.ignoreAllEmptyArrays)\n      this.removeEmptyArrayProperties(obj, options.ignoreEmptyArrays);\n    if (!options.ignoreAllEmptyObjects)\n      this.removeEmptyObjectProperties(obj, options.ignoreEmptyObjects);\n  }\n\n  /**\n   * Extract a single value from a plain JS object\n   *\n   * If the item at the key is not an array, the item is returned.\n   * If the object at the key is an array, the last item in the array is returned.\n   *\n   * @param obj\n   * @param key\n   * @returns a non-array value, or undefined if the key does not exist\n   */\n  extractSingleValue(obj: unknown, key: string): unknown | undefined {\n    if (!obj) return undefined;\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    if (objAsAny[key] == undefined) return undefined;\n\n    let value = objAsAny[key];\n    if (Array.isArray(value)) {\n      if (value.length === 0) return undefined;\n      value = value[value.length - 1];\n    }\n\n    return value;\n  }\n\n  /**\n   * Deep merge two or more objects or arrays.\n   * (c) 2023 Chris Ferdinandi, MIT License, https://gomakethings.com\n   * TypeScript version (c) 2023 RA Sewell\n   *\n   * @param   objs  The arrays or objects to merge\n   * @returns The merged arrays or objects\n   */\n  public deepMerge<T>(...objs: unknown[]): T {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function _deepMerge(...objs: any[]) {\n      /**\n       * Get the object type\n       */\n      function getType(obj: unknown) {\n        return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();\n      }\n\n      /**\n       * Deep merge two objects\n       */\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      function mergeObj(clone: any, obj: any) {\n        for (const [key, value] of Object.entries(obj)) {\n          const type = getType(value);\n          if (\n            clone[key] !== undefined &&\n            getType(clone[key]) === type &&\n            ['array', 'object'].includes(type)\n          ) {\n            clone[key] = _deepMerge(clone[key], value);\n          } else {\n            clone[key] = structuredClone(value);\n          }\n        }\n      }\n\n      // Create a clone of the first item in the objs array\n      let clone = structuredClone(objs.shift());\n\n      // Loop through each item\n      for (const obj of objs) {\n        // Get the object type\n        const type = getType(obj);\n\n        // If the current item isn't the same type as the clone, replace it\n        if (getType(clone) !== type) {\n          clone = structuredClone(obj);\n          continue;\n        }\n\n        // Otherwise, merge\n        if (type === 'array') {\n          clone = [...clone, ...structuredClone(obj)];\n        } else if (type === 'object') {\n          mergeObj(clone, obj);\n        } else {\n          clone = obj;\n        }\n      }\n\n      return clone;\n    }\n\n    return _deepMerge(...objs) as T;\n  }\n}\n\nconst objectUtils = new ObjectUtils();\n\nexport { objectUtils as ObjectUtils };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { type _AbstractTagConfig, type _CardVariantConfig } from '../model/config/_Config.ts';\nimport { CardSetConfig } from '../model/config/CardSetConfig.ts';\nimport { CardSideConfig } from '../model/config/CardSideConfig.ts';\nimport { CardVariantConfig } from '../model/config/CardVariantConfig.ts';\nimport { type CardSetConfigKeyType } from '../model/config/enum/CardSetConfigKey.ts';\nimport { ConfigKey, typeFromConfigKey } from '../model/config/enum/ConfigKey.ts';\nimport { MarkupTagConfig } from '../model/config/MarkupTagConfig.ts';\nimport { PropertyTagConfig } from '../model/config/PropertyTagConfig.ts';\nimport { ResourceTagConfig } from '../model/config/ResourceTagConfig.ts';\nimport { type TagsConfig } from '../model/config/TagsConfig.ts';\nimport { type TagsConfigWithInfo } from '../model/config/TagsConfigWithInfo.ts';\nimport { BitTagConfigKeyType } from '../model/enum/BitTagConfigKeyType.ts';\nimport { Tag } from '../model/enum/Tag.ts';\nimport { CARDS } from './raw/cardSets.ts';\nimport { GROUPS } from './raw/groups.ts';\n\nconst MAX_COUNT_DEFAULT = 1;\nconst MIN_COUNT_DEFAULT = 0;\n\nclass ConfigHydrator {\n  public hydrateTagsConfig(_tags: _AbstractTagConfig[]): TagsConfigWithInfo {\n    const tagsWithInfo: TagsConfigWithInfo = {\n      tags: {},\n    };\n\n    for (const t of _tags) {\n      let expandedTags: TagsConfigWithInfo | undefined;\n      const type = typeFromConfigKey(t.key);\n\n      switch (type) {\n        case BitTagConfigKeyType.tag:\n          expandedTags = this.hydrateTagConfig(t);\n          break;\n\n        case BitTagConfigKeyType.property:\n          expandedTags = this.hydratePropertyTagConfig(t);\n          break;\n\n        case BitTagConfigKeyType.resource:\n          expandedTags = this.hydrateResourceTagConfig(t);\n          break;\n\n        case BitTagConfigKeyType.group:\n          expandedTags = this.hydrateTagGroupConfig(t);\n          break;\n\n        default:\n          throw new Error(`Unknown tag type for config key '${t.key}'`);\n      }\n\n      if (expandedTags) {\n        tagsWithInfo.tags = {\n          ...tagsWithInfo.tags,\n          ...expandedTags.tags,\n        };\n\n        tagsWithInfo.info = Object.assign(tagsWithInfo.info ?? {}, expandedTags.info);\n      }\n    }\n\n    return tagsWithInfo;\n  }\n\n  public hydrateCardSetConfig(\n    _cardSet: CardSetConfigKeyType | undefined,\n  ): CardSetConfig | undefined {\n    if (!_cardSet) return undefined;\n    const _cardSetConfig = CARDS[_cardSet];\n    if (!_cardSetConfig) throw new Error(`No config found for card set config key '${_cardSet}'`);\n\n    const sides: CardSideConfig[] = [];\n\n    for (const _side of _cardSetConfig.sides) {\n      const variantsOfSide: CardVariantConfig[] = [];\n      for (const _variant of _side.variants) {\n        const v = this.hydrateCardVariantConfig(_variant);\n        variantsOfSide.push(v);\n      }\n      const sideConfig = new CardSideConfig(\n        _side.name,\n        _side.repeat ?? false,\n        variantsOfSide,\n        _side.jsonKey,\n      );\n      sides.push(sideConfig);\n    }\n\n    const cardSetConfig = new CardSetConfig(\n      _cardSet,\n      _cardSetConfig.jsonKey,\n      _cardSetConfig.sections,\n      sides,\n    );\n\n    return cardSetConfig;\n  }\n\n  private hydrateTagConfig(_tag: _AbstractTagConfig): TagsConfigWithInfo {\n    const { key: _configKey, maxCount, minCount, chain: _chain, deprecated } = _tag;\n    const configKey = Enum(ConfigKey).fromValue(_configKey) || ConfigKey._unknown;\n    if (!configKey) throw new Error(`No tag key found for config key '${configKey}'`);\n    const tag = Enum(Tag).fromValue(configKey);\n    if (!tag) throw new Error(`No tag found for tag config key '${configKey}'`);\n\n    let chain: TagsConfig | undefined;\n\n    if (_chain) {\n      chain = this.hydrateTagsConfig(_chain).tags;\n    }\n\n    const hydratedTag = new MarkupTagConfig({\n      configKey,\n      tag,\n      maxCount: maxCount ?? MAX_COUNT_DEFAULT,\n      minCount: minCount ?? MIN_COUNT_DEFAULT,\n      chain,\n      deprecated,\n    });\n\n    return {\n      tags: {\n        [configKey]: hydratedTag,\n      },\n    };\n  }\n\n  private hydratePropertyTagConfig(_tag: _AbstractTagConfig): TagsConfigWithInfo {\n    const {\n      key: _configKey,\n      maxCount,\n      minCount,\n      chain: _chain,\n      deprecated,\n      format,\n      values,\n      defaultValue,\n      jsonKey,\n    } = _tag;\n    const configKey = Enum(ConfigKey).fromValue(_configKey) || ConfigKey._unknown;\n    if (!configKey) throw new Error(`No property key found for config key '${configKey}'`);\n    const tag = _configKey.substring(1); // Remove the '@' prefix from the config key\n\n    let chain: TagsConfig | undefined;\n\n    if (_chain) {\n      chain = this.hydrateTagsConfig(_chain).tags;\n    }\n\n    const hydratedTag = new PropertyTagConfig({\n      configKey,\n      tag,\n      maxCount: maxCount ?? MAX_COUNT_DEFAULT,\n      minCount: minCount ?? MIN_COUNT_DEFAULT,\n      chain,\n      jsonKey,\n      format,\n      values,\n      defaultValue,\n      deprecated,\n    });\n\n    return {\n      tags: {\n        [configKey]: hydratedTag,\n      },\n    };\n  }\n\n  private hydrateResourceTagConfig(_tag: _AbstractTagConfig): TagsConfigWithInfo {\n    const { key: _configKey, maxCount, minCount, chain: _chain, deprecated, jsonKey } = _tag;\n    const configKey = Enum(ConfigKey).fromValue(_configKey) || ConfigKey._unknown;\n    if (!configKey) throw new Error(`No resource key found for config key '${configKey}'`);\n    const tag = _configKey.substring(1); // Remove the '&' prefix from the config key\n\n    let chain: TagsConfig | undefined;\n\n    if (_chain) {\n      chain = this.hydrateTagsConfig(_chain).tags;\n    }\n\n    const hydratedTag = new ResourceTagConfig({\n      configKey,\n      tag,\n      maxCount: maxCount ?? MAX_COUNT_DEFAULT,\n      minCount: minCount ?? MIN_COUNT_DEFAULT,\n      chain,\n      jsonKey,\n      deprecated,\n    });\n\n    return {\n      tags: {\n        [configKey]: hydratedTag,\n      },\n    };\n  }\n\n  private hydrateTagGroupConfig(_tag: _AbstractTagConfig): TagsConfigWithInfo {\n    const { key: _configKey } = _tag;\n    const configKey = Enum(ConfigKey).fromValue(_configKey) || ConfigKey._unknown;\n    if (!configKey) throw new Error(`No group key found for config key '${configKey}'`);\n    const _groupConfig = GROUPS[configKey];\n    if (!_groupConfig) throw new Error(`No config found for group config key '${_configKey}'`);\n    const { tags: _tags } = _groupConfig;\n\n    const tags = this.hydrateTagsConfig(_tags).tags;\n\n    // Apply the groups min/max to the first tag in the group (overriding the default value)\n    const tagValues = Object.values(tags);\n    if (tagValues.length > 0) {\n      const firstTag = tagValues[0];\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const firstTagAny = firstTag as any;\n      firstTagAny.maxCount = _tag.maxCount ?? firstTag.maxCount;\n      firstTagAny.minCount = _tag.minCount ?? firstTag.minCount;\n    }\n\n    return {\n      tags,\n      info: {\n        comboResourceConfigKey: _groupConfig.comboResourceConfigKey,\n      },\n    };\n  }\n\n  private hydrateCardVariantConfig(_variant: _CardVariantConfig): CardVariantConfig {\n    const { tags: _tags, bodyAllowed, bodyRequired, repeatCount, jsonKey } = _variant;\n\n    const tags = this.hydrateTagsConfig(_tags);\n\n    const cardSetConfig = new CardVariantConfig(\n      tags.tags,\n      bodyAllowed,\n      bodyRequired,\n      repeatCount,\n      jsonKey,\n    );\n\n    return cardSetConfig;\n  }\n}\n\nconst instance = new ConfigHydrator();\n\nexport { instance as ConfigHydrator };\n","import { type _CardSetsConfig } from '../../model/config/_Config.ts';\nimport { CardSetConfigKey } from '../../model/config/enum/CardSetConfigKey.ts';\nimport { ConfigKey } from '../../model/config/enum/ConfigKey.ts';\nimport { Count } from '../../model/enum/Count.ts';\nimport { TagFormat } from '../../model/enum/TagFormat.ts';\n\nconst CARDSETS: _CardSetsConfig = {\n  //\n  // flashcard\n  //\n  [CardSetConfigKey.flashcard]: {\n    jsonKey: 'cards',\n    sides: [\n      {\n        name: 'question',\n        variants: [\n          {\n            jsonKey: 'question.text',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the flashcard.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the flashcard.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the flashcard.',\n                jsonKey: 'question.icon',\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'answer',\n        variants: [\n          {\n            jsonKey: 'answer.text',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the flashcard.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the flashcard.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the flashcard.',\n                jsonKey: 'answer.icon',\n              },\n            ],\n          },\n          {\n            jsonKey: 'alternativeAnswers[].text',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the flashcard.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the flashcard.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the flashcard.',\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // definition-list\n  //\n  [CardSetConfigKey.definitionList]: {\n    jsonKey: 'definitions',\n    sides: [\n      {\n        name: 'term',\n        variants: [\n          {\n            jsonKey: 'term.text',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the definition.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the definition.',\n                jsonKey: '^heading.forKeys',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the definition.',\n                jsonKey: 'term.icon',\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'definition',\n        variants: [\n          {\n            jsonKey: 'definition.text',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the definition.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the definition.',\n                jsonKey: '^heading.forValues',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the definition.',\n                jsonKey: 'definition.icon',\n              },\n            ],\n          },\n          {\n            jsonKey: 'alternativeDefinitions[].text',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the definition.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the definition.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the definition.',\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // match-pairs\n  //\n  [CardSetConfigKey.matchPairs]: {\n    jsonKey: 'pairs',\n    sides: [\n      {\n        name: 'key',\n        variants: [\n          {\n            jsonKey: 'key',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the match pair.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the match pair.',\n                jsonKey: '^heading.forKeys',\n              },\n              {\n                key: ConfigKey.property_isCaseSensitive,\n                description: 'Property to indicate if the match is case sensitive.',\n                format: TagFormat.boolean,\n              },\n              {\n                key: ConfigKey.resource_audio,\n                description: 'Audio resource for the match pair.',\n                jsonKey: 'keyAudio',\n              },\n              {\n                key: ConfigKey.resource_image,\n                description: 'Image resource for the match pair.',\n                jsonKey: 'keyImage',\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'values',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'values[]',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the match pair.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the match pair.',\n                jsonKey: '^heading.forValues',\n              },\n              {\n                key: ConfigKey.property_isCaseSensitive,\n                description: 'Property to indicate if the match is case sensitive.',\n                format: TagFormat.boolean,\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // match-audio-pairs\n  //\n  [CardSetConfigKey.matchAudioPairs]: {\n    jsonKey: 'pairs',\n    sides: [\n      {\n        name: 'key',\n        variants: [\n          {\n            jsonKey: 'key',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the audio match pair.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the audio match pair.',\n                jsonKey: '^heading.forKeys',\n              },\n              {\n                key: ConfigKey.resource_audio,\n                description: 'Audio resource for the match pair.',\n                jsonKey: 'keyAudio',\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'values',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'values[]',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the audio match pair.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the audio match pair.',\n                jsonKey: '^heading.forValues',\n              },\n              {\n                key: ConfigKey.resource_audio,\n                description: 'Audio resource for the match pair.',\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // match-image-pairs\n  //\n  [CardSetConfigKey.matchImagePairs]: {\n    jsonKey: 'pairs',\n    sides: [\n      {\n        name: 'key',\n        variants: [\n          {\n            jsonKey: 'key',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the image match pair.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the image match pair.',\n                jsonKey: '^heading.forKeys',\n              },\n              {\n                key: ConfigKey.resource_image,\n                description: 'Image resource for the match pair.',\n                jsonKey: 'keyImage',\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'values',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'values[]',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the image match pair.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the image match pair.',\n                jsonKey: '^heading.forValues',\n              },\n              {\n                key: ConfigKey.resource_image,\n                description: 'Image resource for the match pair.',\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // match-matrix\n  //\n  [CardSetConfigKey.matchMatrix]: {\n    jsonKey: 'matrix',\n    sides: [\n      {\n        name: 'key',\n        variants: [\n          {\n            jsonKey: 'key',\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                key: ConfigKey.property_example,\n                description: 'Example text for the match matrix.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the match matrix.',\n                jsonKey: '^heading.forKeys',\n              },\n              {\n                key: ConfigKey.property_isCaseSensitive,\n                description: 'Property to indicate if the match is case sensitive.',\n                format: TagFormat.boolean,\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'cell',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'cells[{s}].values[]',\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                key: ConfigKey.property_example,\n                description: 'Example text for the match matrix.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the match matrix.',\n                jsonKey: '^heading.forValues',\n              },\n              {\n                key: ConfigKey.property_isCaseSensitive,\n                description: 'Property to indicate if the match is case sensitive.',\n                format: TagFormat.boolean,\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // statements\n  //\n  [CardSetConfigKey.statements]: {\n    jsonKey: 'statements',\n    sides: [\n      {\n        name: 'statement',\n        variants: [\n          {\n            jsonKey: 'statement',\n            tags: [\n              {\n                key: ConfigKey.tag_true,\n                description: 'Tag for true statements.',\n                jsonKey: 'statement|set(isCorrect=true)',\n                maxCount: 1,\n              },\n              {\n                key: ConfigKey.tag_false,\n                description: 'Tag for false statements.',\n                jsonKey: 'statement|set(isCorrect=false)',\n                maxCount: 1,\n              },\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the statement.',\n              },\n            ],\n            bodyAllowed: false,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // quiz\n  //\n  [CardSetConfigKey.quiz]: {\n    jsonKey: 'quizzes',\n    sides: [\n      {\n        name: 'choices',\n        variants: [\n          {\n            jsonKey: null,\n            tags: [\n              {\n                key: ConfigKey.group_trueFalse,\n                description: 'Group for true/false questions.',\n              },\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the quiz.',\n              },\n            ],\n            bodyAllowed: false,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // feedback\n  //\n  [CardSetConfigKey.feedback]: {\n    jsonKey: 'feedbacks',\n    sides: [\n      {\n        name: 'choices',\n        variants: [\n          {\n            jsonKey: null,\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                key: ConfigKey.group_trueFalse,\n                description: 'Group for true/false feedback.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the feedback.',\n                jsonKey: '^heading.forKeys',\n              },\n            ],\n            bodyAllowed: false,\n          },\n        ],\n      },\n      {\n        name: 'reason',\n        variants: [\n          {\n            jsonKey: 'reason.text',\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                key: ConfigKey.property_reasonableNumOfChars,\n                description: 'Property for reasonable number of characters.',\n                format: TagFormat.number,\n              },\n              {\n                key: ConfigKey.property_example,\n                description: 'Example text for the feedback.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the feedback.',\n                jsonKey: '^heading.forValues',\n              },\n            ],\n            bodyAllowed: true,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // questions\n  //\n  [CardSetConfigKey.questions]: {\n    jsonKey: 'questions',\n    sides: [\n      {\n        name: 'question',\n        variants: [\n          {\n            jsonKey: 'question',\n            tags: [\n              {\n                key: ConfigKey.property_reasonableNumOfChars,\n                description: 'Property for reasonable number of characters.',\n                format: TagFormat.number,\n              },\n              {\n                key: ConfigKey.tag_sampleSolution,\n                description: 'Sample solution for the question.',\n              },\n              {\n                key: ConfigKey.property_sampleSolution,\n                description: 'Property for sample solution text.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_additionalSolutions,\n                description: 'Property for additional solutions.',\n                format: TagFormat.plainText,\n                maxCount: Count.infinity,\n              },\n              {\n                key: ConfigKey.property_partialAnswer,\n                description: 'Property for partial answer text.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the question.',\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // elements\n  //\n  [CardSetConfigKey.elements]: {\n    jsonKey: null,\n    sides: [\n      {\n        name: 'element',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'elements[]',\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                key: ConfigKey.property_example,\n                description: 'Example text for the element.',\n                format: TagFormat.plainText,\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // table\n  //\n  [CardSetConfigKey.table]: {\n    jsonKey: 'table.data',\n    sides: [\n      {\n        name: 'cell',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: null,\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                jsonKey: '^table.columns[]',\n                description: 'Title of the table.',\n              },\n              {\n                key: ConfigKey.property_tableCellType,\n                description: 'Table cell type (th/td).',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_tableRowSpan,\n                description: 'Number of rows the cell spans.',\n                format: TagFormat.number,\n              },\n              {\n                key: ConfigKey.property_tableColSpan,\n                description: 'Number of columns the cell spans.',\n                format: TagFormat.number,\n              },\n              {\n                key: ConfigKey.property_tableScope,\n                description: 'Scope attribute for header cells.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_tableColWidth,\n                description: 'Width for the column.',\n                format: TagFormat.number,\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // table-extended\n  //\n  [CardSetConfigKey.tableExtended]: {\n    jsonKey: null,\n    sections: {\n      'table-header': { jsonKey: 'table.header.rows', sideJsonKey: 'cells[{s}]|set(title=true)' },\n      'table-body': { jsonKey: 'table.body.rows', isDefault: true },\n      'table-footer': { jsonKey: 'table.footer.rows', sideJsonKey: 'cells[{s}]|set(title=true)' },\n    },\n    sides: [\n      {\n        name: 'cell',\n        repeat: true,\n        jsonKey: 'cells[{s}]',\n        variants: [\n          {\n            jsonKey: 'content',\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                jsonKey: '.',\n                description: 'Title of the table cell.',\n              },\n              {\n                key: ConfigKey.property_tableCellType,\n                jsonKey: 'title|bool(th)',\n                description: 'Table cell type (th/td).',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_tableRowSpan,\n                jsonKey: 'rowspan',\n                description: 'Number of rows the cell spans.',\n                format: TagFormat.number,\n              },\n              {\n                key: ConfigKey.property_tableColSpan,\n                jsonKey: 'colspan',\n                description: 'Number of columns the cell spans.',\n                format: TagFormat.number,\n              },\n              {\n                key: ConfigKey.property_tableScope,\n                jsonKey: 'scope',\n                description: 'Scope attribute for header cells.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_tableColWidth,\n                description: 'Width for the column.',\n                format: TagFormat.number,\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // pronunciation-table\n  //\n  [CardSetConfigKey.pronunciationTable]: {\n    jsonKey: 'pronunciationTable.data',\n    sides: [\n      {\n        name: 'cell',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'body',\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the pronunciation table.',\n              },\n              {\n                key: ConfigKey.resource_audio,\n                description: 'Audio resource for the pronunciation table.',\n                jsonKey: 'audio',\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // bot-action-responses\n  //\n  [CardSetConfigKey.botActionResponses]: {\n    jsonKey: 'responses',\n    sides: [\n      {\n        name: 'response',\n        variants: [\n          {\n            jsonKey: 'feedback',\n            tags: [\n              {\n                key: ConfigKey.property_reaction,\n                description: 'Reaction to the bot action.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.group_standardItemLead,\n                description:\n                  'Item, lead, page number, and margin number for the bot action response.',\n              },\n              {\n                key: ConfigKey.tag_instruction,\n                description: 'The response label for the bot action.',\n                jsonKey: 'response',\n              },\n              {\n                key: ConfigKey.property_example,\n                description: 'Example text for the bot action response.',\n                format: TagFormat.plainText,\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // cloze-list\n  //\n  [CardSetConfigKey.clozeList]: {\n    jsonKey: 'listItems',\n    sides: [\n      {\n        name: 'content',\n        variants: [\n          {\n            jsonKey: 'body',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for cloze items.',\n              },\n              {\n                key: ConfigKey.group_gap,\n                description: 'Group for gap tags in cloze items.',\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // example-bit-list\n  //\n  [CardSetConfigKey.exampleBitList]: {\n    jsonKey: 'listItems',\n    sides: [\n      {\n        name: 'item',\n        variants: [\n          {\n            jsonKey: 'body',\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for example bits.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the example bit.',\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // ingredients\n  //\n  [CardSetConfigKey.ingredients]: {\n    jsonKey: 'ingredients',\n    sides: [\n      {\n        name: 'ingredient',\n        variants: [\n          {\n            jsonKey: 'ingredient',\n            tags: [\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the ingredient.',\n              },\n              {\n                key: ConfigKey.tag_true,\n                description: 'Checked state for the ingredient.',\n                jsonKey: 'ingredient|set(checked=true)',\n                maxCount: 1,\n              },\n              {\n                key: ConfigKey.tag_false,\n                description: 'Unchecked state for the ingredient.',\n                jsonKey: 'ingredient|set(checked=false)',\n                maxCount: 1,\n              },\n              {\n                key: ConfigKey.group_standardItemLead,\n                description: 'Item, lead, page number, and margin number for the ingredient.',\n              },\n              {\n                key: ConfigKey.tag_instruction,\n                description: 'The quantity of the ingredient.',\n                jsonKey: 'quantity',\n              },\n              {\n                key: ConfigKey.tag_hint,\n                description: 'The hint for the ingredient.',\n              },\n              {\n                key: ConfigKey.property_unit,\n                description: 'Unit of measurement for the ingredient.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_unitAbbr,\n                description: 'Abbreviation for the unit of measurement.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_decimalPlaces,\n                description: 'Number of decimal places for the ingredient quantity.',\n                format: TagFormat.number,\n                defaultValue: '1',\n              },\n              {\n                key: ConfigKey.property_disableCalculation,\n                description: 'Disable calculation for the ingredient.',\n                format: TagFormat.boolean,\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // book-reference-list\n  //\n  [CardSetConfigKey.bookReferenceList]: {\n    jsonKey: 'bookReferences',\n    sides: [\n      {\n        name: 'reference',\n        variants: [\n          {\n            jsonKey: null,\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for book references.',\n              },\n              {\n                key: ConfigKey.property_refAuthor,\n                description: 'Author of the book.',\n                format: TagFormat.plainText,\n                maxCount: Count.infinity,\n              },\n              {\n                key: ConfigKey.property_refBookTitle,\n                description: 'Title of the book.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_refPublisher,\n                description: 'Publisher of the book.',\n                format: TagFormat.plainText,\n                maxCount: Count.infinity,\n              },\n              {\n                key: ConfigKey.property_refPublicationYear,\n                description: 'Year of publication of the book.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_citationStyle,\n                description: 'Citation style for the book reference.',\n                format: TagFormat.plainText,\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n};\n\nexport { CARDSETS as CARDS };\n","import { type _GroupsConfig } from '../../model/config/_Config.ts';\nimport { ConfigKey } from '../../model/config/enum/ConfigKey.ts';\nimport { GroupConfigType } from '../../model/config/enum/GroupConfigType.ts';\nimport { Count } from '../../model/enum/Count.ts';\nimport { TagFormat } from '../../model/enum/TagFormat.ts';\n\nconst GROUPS: _GroupsConfig = {\n  [ConfigKey.group_standardAllBits]: {\n    name: 'Standard',\n    description: 'Standard tags which apply to all bits',\n    type: GroupConfigType.standard,\n    tags: [\n      {\n        key: ConfigKey.property_id,\n        description: 'The unique identifier(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_customerId,\n        description: 'The customer-specific identifier for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_externalId,\n        description: 'The external identifier for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_sourceRL,\n        description: 'The original location of the information in the original source material',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_isTemplate,\n        description: 'If true, the bit is a template',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_isTemplateStripTheme,\n        description: 'If true, the bit is a template strip theme',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_needsValidation,\n        description: 'If true, the bit needs validation',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_validationDate,\n        description: 'The date when the bit was validated',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_aiGenerated,\n        description: 'If true, the bit is AI-generated',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_machineTranslated,\n        description: 'If true, the bit is machine-translated',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_translationOf,\n        description: 'Translation source reference',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_spansPageBreak,\n        description: 'If true, the bit spans a page break',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_searchIndex,\n        description: 'The search index(es) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_analyticsTag,\n        description: 'The analytics tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_categoryTag,\n        description: 'The category tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_topicTag,\n        description: 'The topic tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_reportTag,\n        description: 'The report tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_altLangTag,\n        description: 'The alternative language tag for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_feedbackEngine,\n        description: 'The feedback engine for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_feedbackType,\n        description: 'The feedback type for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_disableFeedback,\n        description: 'If true, feedback is disabled for the bit',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_diffTo,\n        description: 'The diff to version for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_diffOp,\n        description: 'The diff operation for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_diffRef,\n        description: 'The diff reference for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_diffContext,\n        description: 'The diff context for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_diffTime,\n        description: 'The diff time for the bit',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_ageRange,\n        description: 'The age range for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_lang,\n        description: 'The language for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_publisher,\n        description: 'The publisher(s) of the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_publisherName,\n        description: 'The name of the publisher of the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_theme,\n        description: 'The theme(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_rtl,\n        description: 'If true, the book is right-to-left',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_target,\n        description: 'The target(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_tag,\n        description: 'The tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_groupTag,\n        jsonKey: 'groupTag.name',\n        description: 'The group tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n        chain: [\n          {\n            key: ConfigKey.property_tag,\n            description: 'The tag(s) for the group',\n            format: TagFormat.plainText,\n            maxCount: Count.infinity,\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_reductionTag,\n        description: 'The reduction tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_bubbleTag,\n        description: 'The bubble tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_extractorTag,\n        description: 'The extractor tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_extractorInternal,\n        description: 'Internal metadata used by the extractor for processing purposes',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_levelCEFRp,\n        description: 'The CEFRp level for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_levelCEFR,\n        description: 'The CEFR level for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_levelILR,\n        description: 'The ILR level for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_levelACTFL,\n        description: 'The ACTFL level for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_icon,\n        description: 'The icon for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_iconTag,\n        description: 'The icon tag for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_colorTag,\n        description: 'The color tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.tag_anchor,\n        name: 'Anchor',\n        description: 'The anchor for the bit',\n      },\n      {\n        key: ConfigKey.property_search,\n        description: 'The search text for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_showInIndex,\n        description: 'If true, the bit is shown in the index',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_layer,\n        description: 'The layer(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_layerRole,\n        description: 'The layer role(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [ConfigKey.group_standardItemLead]: {\n    type: GroupConfigType.standard,\n    description: 'Standard group for item, lead, page number, and margin number tags',\n    tags: [\n      {\n        key: ConfigKey.tag_item,\n        jsonKey: 'item',\n        description: 'The item for the bit',\n        chain: [\n          {\n            key: ConfigKey.tag_item,\n            jsonKey: 'lead',\n            description: 'The lead for the bit',\n            maxCount: 1,\n            chain: [\n              {\n                key: ConfigKey.tag_item,\n                jsonKey: 'pageNumber',\n                description: 'The page number for the bit',\n                maxCount: 1,\n                chain: [\n                  {\n                    key: ConfigKey.tag_item,\n                    jsonKey: 'marginNumber',\n                    description: 'The margin number for the bit',\n                    maxCount: 1,\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_standardItemLeadInstructionHint]: {\n    type: GroupConfigType.standard,\n    description:\n      'Standard group for item, lead, page number, margin number, instruction and hint tags',\n    tags: [\n      {\n        key: ConfigKey.group_standardItemLead,\n        description: 'Item, lead, page number, and margin number tags',\n      },\n      {\n        key: ConfigKey.tag_instruction,\n        name: 'Instruction',\n        description: 'The instruction for the bit',\n      },\n      {\n        key: ConfigKey.tag_hint,\n        name: 'Hint',\n        description: 'The hint for the bit',\n      },\n    ],\n  },\n  [ConfigKey.group_standardTags]: {\n    type: GroupConfigType.standard,\n    description: 'Standard tags which apply to MOST (but not all) bits',\n    tags: [\n      {\n        key: ConfigKey.group_standardAllBits,\n        description: 'All standard tags which apply to all bits',\n      },\n      {\n        key: ConfigKey.group_standardItemLeadInstructionHint,\n        description: 'Item, lead, page number, margin number, instruction and hint tags',\n      },\n      {\n        key: ConfigKey.property_example,\n        description: 'The example(s) for the bit',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [ConfigKey.group_imageSource]: {\n    type: GroupConfigType.standard,\n    description: 'Image source chain',\n    tags: [\n      {\n        key: ConfigKey.property_imageSource,\n        jsonKey: 'imageSource.url',\n        description: 'The source of an image',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.property_mockupId,\n            description: 'The mockup ID for the image',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_size,\n            description: 'The size of the image',\n            format: TagFormat.number,\n          },\n          {\n            key: ConfigKey.property_format,\n            description: 'The format of the image',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_trim,\n            description: 'If true, the image is trimmed',\n            format: TagFormat.boolean,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_technicalTerm]: {\n    type: GroupConfigType.standard,\n    description: 'Technical term chain',\n    tags: [\n      {\n        key: ConfigKey.property_technicalTerm,\n        jsonKey: 'technicalTerm.technicalTerm',\n        description: 'The technical term',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.property_lang,\n            description: 'The language of the technical term',\n            format: TagFormat.plainText,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_person]: {\n    type: GroupConfigType.standard,\n    description: 'Person chain',\n    tags: [\n      {\n        key: ConfigKey.property_person,\n        jsonKey: 'person.name',\n        description: 'A person',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.property_title,\n            description: \"The person's title\",\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_resourceImage,\n            description: 'The image of the person',\n          },\n        ],\n      },\n      {\n        // Deprecated (parter renamed to person)\n        key: ConfigKey.property_partner,\n        jsonKey: 'partner.name',\n        description: 'A partner',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.property_title,\n            description: \"The partner's title\",\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_resourceImage,\n            description: 'The image of the partner',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_gap]: {\n    type: GroupConfigType.standard,\n    description: 'Gap chain',\n    tags: [\n      {\n        key: ConfigKey.tag_gap,\n        description: 'The value of a gap in the content',\n        maxCount: Count.infinity,\n        chain: [\n          {\n            key: ConfigKey.tag_gap,\n            jsonKey: 'solutions[]',\n            description: 'Alternative values for the gaps in the content',\n            maxCount: Count.infinity,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            description: 'An example for the gap',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_isCaseSensitive,\n            jsonKey: 'isCaseSensitive',\n            description: 'If true, the gap text is case sensitive',\n            format: TagFormat.boolean,\n            defaultValue: 'true',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_trueFalse]: {\n    type: GroupConfigType.standard,\n    description: 'True/False chain',\n    tags: [\n      {\n        key: ConfigKey.tag_true,\n        description: 'True value for a true/false statement/question',\n        maxCount: Count.infinity,\n        chain: [\n          {\n            key: ConfigKey.tag_true,\n            jsonKey: 'choices[]|set(isCorrect=true)',\n            description: 'True values for a true/false statement/question',\n            maxCount: Count.infinity,\n          },\n          {\n            key: ConfigKey.tag_false,\n            jsonKey: 'choices[]|set(isCorrect=false)',\n            description: 'False values for a true/false statement/question',\n            maxCount: Count.infinity,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            description: 'An example for the true/false statement/question',\n            format: TagFormat.plainText,\n          },\n        ],\n      },\n      {\n        key: ConfigKey.tag_false,\n        description: 'False value for a true/false statement/question',\n        maxCount: Count.infinity,\n        chain: [\n          {\n            key: ConfigKey.tag_true,\n            jsonKey: 'choices[]|set(isCorrect=true)',\n            description: 'True values for a true/false statement/question',\n            maxCount: Count.infinity,\n          },\n          {\n            key: ConfigKey.tag_false,\n            jsonKey: 'choices[]|set(isCorrect=false)',\n            description: 'False values for a true/false statement/question',\n            maxCount: Count.infinity,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            description: 'An example for the true/false statement/question',\n            format: TagFormat.plainText,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_markConfig]: {\n    type: GroupConfigType.standard,\n    description: 'Mark configuration chain',\n    tags: [\n      {\n        key: ConfigKey.property_mark,\n        jsonKey: 'marks.mark',\n        description: 'The mark configuration',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n        chain: [\n          {\n            key: ConfigKey.property_color,\n            description: 'The color of the mark',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_emphasis,\n            description: 'The emphasis of the mark',\n            format: TagFormat.plainText,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_mark]: {\n    type: GroupConfigType.standard,\n    description: 'Mark chain',\n    tags: [\n      {\n        key: ConfigKey.tag_mark,\n        description: 'The marked content',\n        maxCount: Count.infinity,\n        chain: [\n          {\n            key: ConfigKey.property_mark,\n            jsonKey: 'mark',\n            description: 'The mark configuration',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            description: 'An example for the marked content',\n            format: TagFormat.plainText,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_bookCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common book tags',\n    tags: [\n      {\n        key: ConfigKey.property_language,\n        description: 'The language of the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_customerExternalId,\n        description: 'The customer-specific external identifier for the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_spaceId,\n        description: 'The space ID for the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_kind,\n        description: 'The kind of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_hasMarkAsDone,\n        description: 'If true, the book has a \"Mark as done\" feature',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_processHandIn,\n        description: 'If true, the book will be processed when upon hand-in',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_processHandInLocation,\n        description: 'The location where the book was handed-in',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_isPublic,\n        description: 'If true, the book is public',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_isTemplate,\n        description: 'If true, the book is a template',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_isTemplateStripTheme,\n        description: 'If true, the book is a template strip theme',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_isEditable,\n        description: 'If true, the book is editable',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_chatWithBook,\n        description: 'If true, the user can chat about the book with an AI assistant',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_chatWithBookBrainKey,\n        description: 'The BookBrain key for the book chat',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.tag_title,\n        name: 'Title',\n        description: 'The title of the book',\n        maxCount: 2,\n      },\n      {\n        key: ConfigKey.property_subtype,\n        description: 'The subtype of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_coverImage,\n        description: 'The cover image(s) of the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.resource_coverImage,\n        description: 'The cover image of the book',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the cover image resource',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_backgroundImage,\n        description: 'The background image(s) of the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.resource_backgroundImage,\n        description: 'The background image of the book',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the background image resource',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_coverColor,\n        description: 'The cover color of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_subject,\n        description: 'The subject(s) of the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_author,\n        description: 'The author(s) of the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_publications,\n        description: 'The publication(s) of the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_relatedBook,\n        description: 'Books related to this book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_translationOfBook,\n        description: 'External Id of the translated book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_duration,\n        description: 'The duration of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_maxTocChapterLevel,\n        description: 'The maximum table of contents chapter level',\n        format: TagFormat.number,\n        defaultValue: '-1',\n      },\n      {\n        key: ConfigKey.property_sourceDocument,\n        description: 'Url of the source document for the book (for example, a PDF file)',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_internalPrintPdf,\n        description: 'Url of the internal print PDF for the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_allowPrint,\n        description: 'If true, the book allows printing',\n        format: TagFormat.enumeration,\n        values: ['enforceFalse', 'enforceTrue', 'useSpaceConfiguration'],\n        defaultValue: 'useSpaceConfiguration',\n      },\n      {\n        key: ConfigKey.property_hasPrintRestriction,\n        description: 'If true, the book has print restrictions',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_enforceUpdateOverUserInput,\n        description: 'If true, prioritize new content over legacy content from the instance API',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_extractorExtractionTimestamp,\n        description: 'Extraction timestamps for book conversion',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [ConfigKey.group_learningPathCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common learning path tags',\n    tags: [\n      {\n        key: ConfigKey.property_action,\n        description: 'The action for the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_duration,\n        description: 'The duration of the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_date,\n        description: 'The date of the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_dateEnd,\n        description: 'The end date of the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_location,\n        description: 'The location of the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_list,\n        description: 'The list of items in the learning path',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_textReference,\n        description: 'The text reference for the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_isTracked,\n        description: 'If true, the learning path is tracked',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_isInfoOnly,\n        description: 'If true, the learning path is info only',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_deeplink,\n        description: 'The deeplink(s) for the learning path',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption for the button of the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_book,\n        description: 'The book(s) associated with the learning path',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_reference,\n            description: 'The reference(s) for the book(s) in the learning path',\n            maxCount: 2,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_advertisingCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common advertising tags',\n    tags: [\n      {\n        key: ConfigKey.property_advertisingClickUrl,\n        description: 'The URL to which the advertisement should link',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [ConfigKey.group_platformStylesCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common platform styles',\n    tags: [\n      {\n        key: ConfigKey.property_platformPrimaryColor,\n        description: 'The platform system primary color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformSecondaryColor,\n        description: 'The platform section secondary color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformBackgroundColor,\n        description: 'The platform system background color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformButtonPrimaryColor,\n        description: 'The platform section header button primary color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformButtonBackgroundColor,\n        description: 'The platform section header button background color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformScrollbarColor,\n        description: 'The platform main scrollbar color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformSelectionColor,\n        description: 'The platform main selection color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformTextSelectionColor,\n        description: 'The platform main input text selection color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformSeparatorColor,\n        description: 'The platform main separator color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformPlaceholderColor,\n        description: 'The platform main input placeholder color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformMessageBackgroundColor,\n        description: 'The platform section chat message background color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformBorderColor,\n        description: 'The platform border color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformSelectionTextColor,\n        description: 'The platform selection text color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformBaseLayerColor,\n        description: 'The platform base layer color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformMargin,\n        description: 'The platform margin',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_platformBorderRadius,\n        description: 'The platform border radius',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_platformSelectionBorderRadius,\n        description: 'The platform selection border radius',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_platformNeedsShadow,\n        description: 'If true, the platform needs shadow',\n        format: TagFormat.boolean,\n      },\n    ],\n  },\n  [ConfigKey.group_quizCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common quiz tags',\n    tags: [\n      {\n        key: ConfigKey.property_revealSolutions,\n        description: 'If true, the quiz solutions are revealed',\n        format: TagFormat.boolean,\n        // defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_additionalSolutions,\n        description: 'Additional solutions',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  //\n  // Resource groups\n  //\n  [ConfigKey.group_resourceBitTags]: {\n    type: GroupConfigType.standard,\n    description: 'Resource bit tags',\n    tags: [\n      {\n        key: ConfigKey.resource_imagePlaceholder,\n        description: 'Placeholder image for the resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the placeholder image',\n          },\n        ],\n        maxCount: 1,\n      },\n    ],\n  },\n  //\n  // Common resource properties\n  //\n  [ConfigKey.group_resourceCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common resource properties',\n    tags: [\n      {\n        key: ConfigKey.property_license,\n        description: 'The license for the resource',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_copyright,\n        description: 'The copyright information for the resource',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_caption,\n        description: 'The caption for the resource',\n        format: TagFormat.bitmarkText,\n      },\n      {\n        key: ConfigKey.property_showInIndex,\n        description: 'If true, the resource is shown in the index',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_search,\n        description: 'The search text for the resource',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_selected,\n        description: 'If true, the resource is selected',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_srcAlt,\n        description: 'An alternative source for the resource',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common properties for image resources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceCommon,\n        description: 'Common resource properties',\n      },\n      {\n        key: ConfigKey.property_src1x,\n        description: 'The source URL for the image at 1x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src2x,\n        description: 'The source URL for the image at 2x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src3x,\n        description: 'The source URL for the image at 3x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src4x,\n        description: 'The source URL for the image at 4x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_width,\n        description: 'The width of the image',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_height,\n        description: 'The height of the image',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_alt,\n        description: 'The alternative text for the image',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_zoomDisabled,\n        description: 'If true, zooming is disabled for the image',\n        format: TagFormat.boolean,\n      },\n    ],\n  },\n  [ConfigKey.group_resourceAudioCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common properties for audio resources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceCommon,\n        description: 'Common resource properties',\n      },\n      {\n        key: ConfigKey.property_duration,\n        description: 'The duration of the audio resource',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_mute,\n        description: 'If true, the audio is muted',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_autoplay,\n        description: 'If true, the audio plays automatically',\n        format: TagFormat.boolean,\n      },\n    ],\n  },\n  [ConfigKey.group_resourceVideoCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common properties for video resources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceCommon,\n        description: 'Common resource properties',\n      },\n      {\n        key: ConfigKey.property_width,\n        description: 'The width of the video',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_height,\n        description: 'The height of the video',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_duration,\n        description: 'The duration of the video',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_mute,\n        description: 'If true, the video is muted',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_autoplay,\n        description: 'If true, the video plays automatically',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_allowSubtitles,\n        description: 'If true, subtitles are allowed for the video',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_showSubtitles,\n        description: 'If true, subtitles are shown in the video',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_alt,\n        description: 'The alternative text for the video',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_posterImage,\n        jsonKey: 'posterImage.src',\n        description: 'The poster image for the video',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the poster image',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_src1x,\n        description: 'The source URL for the video at 1x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src2x,\n        description: 'The source URL for the video at 2x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src3x,\n        description: 'The source URL for the video at 3x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src4x,\n        description: 'The source URL for the video at 4x resolution',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  //\n  // Single resources\n  //\n  [ConfigKey.group_resourceIcon]: {\n    type: GroupConfigType.standard,\n    description: 'Common properties for icon resources',\n    tags: [\n      {\n        key: ConfigKey.resource_icon,\n        description: 'The icon resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the icon resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImage]: {\n    type: GroupConfigType.resource,\n    description: 'Common properties for image resources',\n    tags: [\n      {\n        key: ConfigKey.resource_image,\n        description: 'The image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImagePortrait]: {\n    type: GroupConfigType.resource,\n    description: 'Portrait image resource',\n    tags: [\n      {\n        key: ConfigKey.resource_imagePortrait,\n        description: 'The portrait image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the portrait image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageLandscape]: {\n    type: GroupConfigType.resource,\n    description: 'Landscape image resource',\n    tags: [\n      {\n        key: ConfigKey.resource_imageLandscape,\n        description: 'The landscape image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the landscape image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded image resource',\n    tags: [\n      {\n        key: ConfigKey.resource_imageEmbed,\n        description: 'The embedded image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the embedded image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to an image resource',\n    tags: [\n      {\n        key: ConfigKey.resource_imageLink,\n        description: 'The link to the image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the linked image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceAudio]: {\n    type: GroupConfigType.resource,\n    description: 'Audio resource',\n    tags: [\n      {\n        key: ConfigKey.resource_audio,\n        description: 'The audio resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceAudioCommon,\n            description: 'Common audio properties for the audio resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceAudioEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded audio resource',\n    tags: [\n      {\n        key: ConfigKey.resource_audioEmbed,\n        description: 'The embedded audio resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceAudioCommon,\n            description: 'Common audio properties for the embedded audio resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceAudioLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to an audio resource',\n    tags: [\n      {\n        key: ConfigKey.resource_audioLink,\n        description: 'The link to the audio resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceAudioCommon,\n            description: 'Common audio properties for the linked audio resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceVideo]: {\n    type: GroupConfigType.resource,\n    description: 'Video resource',\n    tags: [\n      {\n        key: ConfigKey.resource_video,\n        description: 'The video resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceVideoCommon,\n            description: 'Common video properties for the video resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceVideoEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded video resource',\n    tags: [\n      {\n        key: ConfigKey.resource_videoEmbed,\n        description: 'The embedded video resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceVideoCommon,\n            description: 'Common video properties for the embedded video resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceVideoLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to a video resource',\n    tags: [\n      {\n        key: ConfigKey.resource_videoLink,\n        description: 'The link to the video resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceVideoCommon,\n            description: 'Common video properties for the linked video resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceStillImageFilmEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded still image film resource',\n    tags: [\n      {\n        key: ConfigKey.resource_stillImageFilmEmbed,\n        description: 'The embedded still image film resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceVideoCommon,\n            description: 'Common video properties for the embedded still image film resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceStillImageFilmLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to a still image film resource',\n    tags: [\n      {\n        key: ConfigKey.resource_stillImageFilmLink,\n        description: 'The link to the still image film resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceVideoCommon,\n            description: 'Common video properties for the linked still image film resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceArticle]: {\n    type: GroupConfigType.resource,\n    description: 'Article resource',\n    tags: [\n      {\n        key: ConfigKey.resource_article,\n        description: 'The article resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the article resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceArticleEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded article resource',\n    tags: [\n      {\n        key: ConfigKey.resource_articleEmbed,\n        description: 'The embedded article resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the embedded article resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceArticleLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to an article resource',\n    tags: [\n      {\n        key: ConfigKey.resource_articleLink,\n        description: 'The link to the article resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the linked article resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceDocument]: {\n    type: GroupConfigType.resource,\n    description: 'Document resource',\n    tags: [\n      {\n        key: ConfigKey.resource_document,\n        description: 'The document resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the document resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceDocumentEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded document resource',\n    tags: [\n      {\n        key: ConfigKey.resource_documentEmbed,\n        description: 'The embedded document resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the embedded document resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceDocumentLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to a document resource',\n    tags: [\n      {\n        key: ConfigKey.resource_documentLink,\n        description: 'The link to the document resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the linked document resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceDocumentDownload]: {\n    type: GroupConfigType.resource,\n    description: 'Downloadable document resource',\n    tags: [\n      {\n        key: ConfigKey.resource_documentDownload,\n        description: 'The downloadable document resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the downloadable document resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceAppLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to an app resource',\n    tags: [\n      {\n        key: ConfigKey.resource_appLink,\n        description: 'The link to the app resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the linked app resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceWebsiteLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to a website resource',\n    tags: [\n      {\n        key: ConfigKey.resource_websiteLink,\n        description: 'The link to the website resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the linked website resource',\n          },\n        ],\n      },\n    ],\n  },\n  //\n  // Combo resources - these are resources made up of a combination of multiple resources.\n  //\n  [ConfigKey.group_resourceStillImageFilm]: {\n    type: GroupConfigType.comboResource,\n    description: 'Resource for still image film',\n    comboResourceConfigKey: ConfigKey.resource_stillImageFilm,\n    tags: [\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'The image resource for the still image film',\n        maxCount: 1,\n        minCount: 1,\n      },\n      {\n        key: ConfigKey.group_resourceAudio,\n        description: 'The audio resource for the still image film',\n        maxCount: 1,\n        minCount: 1,\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageResponsive]: {\n    type: GroupConfigType.comboResource,\n    description: 'Responsive image resource',\n    comboResourceConfigKey: ConfigKey.resource_imageResponsive,\n    tags: [\n      {\n        key: ConfigKey.group_resourceImagePortrait,\n        description: 'The portrait image resource',\n        maxCount: 1,\n        minCount: 1,\n      },\n      {\n        key: ConfigKey.group_resourceImageLandscape,\n        description: 'The landscape image resource',\n        maxCount: 1,\n        minCount: 1,\n      },\n    ],\n  },\n  [ConfigKey.group_previewImages]: {\n    type: GroupConfigType.resource,\n    description: 'Array of preview images for catalog items',\n    tags: [\n      {\n        key: ConfigKey.resource_previewImage,\n        description: 'The preview image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_previewVideos]: {\n    type: GroupConfigType.resource,\n    description: 'Array of preview videos for catalog items',\n    tags: [\n      {\n        key: ConfigKey.resource_previewVideo,\n        description: 'The preview video resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the image resource',\n          },\n        ],\n      },\n    ],\n  },\n};\n\nexport { GROUPS };\n","import { type _BitsConfig } from '../../model/config/_Config.ts';\nimport { CardSetConfigKey } from '../../model/config/enum/CardSetConfigKey.ts';\nimport { ConfigKey } from '../../model/config/enum/ConfigKey.ts';\nimport { BitType } from '../../model/enum/BitType.ts';\nimport { Count } from '../../model/enum/Count.ts';\nimport { ExampleType } from '../../model/enum/ExampleType.ts';\nimport { TagFormat } from '../../model/enum/TagFormat.ts';\nimport { TextFormat } from '../../model/enum/TextFormat.ts';\n\nconst BITS: _BitsConfig = {\n  [BitType._error]: {\n    since: '1.3.0',\n    description: 'An error bit, rendered when the bit cannot be interpreted',\n  },\n\n  [BitType._comment]: {\n    since: '1.4.12',\n    description:\n      'A comment bit, used when a bit is commented out by adding | between the . and the bit name, e.g [.|article]',\n  },\n\n  [BitType._standard]: {\n    since: '3.2.0',\n    description:\n      'The standard bit type, used as a base for other bits, should not be used directly',\n    tags: [\n      {\n        key: ConfigKey.group_standardTags,\n        description: 'Standard tags for (almost) all bits',\n      },\n    ],\n  },\n\n  [BitType.appFlashcards]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'App flashcards bit, used for flashcard quizzes in the app',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n      {\n        key: ConfigKey.tag_title,\n        description: 'The title of the flashcard quiz',\n      },\n      {\n        key: ConfigKey.property_flashcardSet,\n        description: 'The flashcard set to use for the app flashcards',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.appFlashcardsQuiz]: {\n    since: '1.3.0',\n    baseBitType: BitType.appFlashcards,\n    description: 'App flashcards quiz bit',\n  },\n  [BitType.appFlashcardsLearn]: {\n    since: '1.3.0',\n    baseBitType: BitType.appFlashcards,\n    description: 'App flashcards learn bit',\n  },\n  [BitType.appLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'App link bit, used to link to other bits in the app',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceAppLink,\n        description: 'Tags for the app link resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.appRag]: {\n    since: '5.14.0',\n    baseBitType: BitType.article,\n    description: 'App RAG (Retrieval-Augmented Generation) bit, equal to article',\n  },\n  [BitType.appSearch]: {\n    since: '5.14.0',\n    baseBitType: BitType.article,\n    description: 'App search bit, equal to article',\n  },\n  [BitType.author]: {\n    since: '4.2.0',\n    baseBitType: BitType._standard,\n    description: 'Represents an author of something',\n    tags: [\n      {\n        key: ConfigKey.property_fullName,\n        description: 'Full name of the author',\n      },\n      {\n        key: ConfigKey.property_pseudonym,\n        description: 'A pseudonym of the author, if any',\n      },\n      {\n        key: ConfigKey.property_title,\n        description: 'The title of the author, e.g. \"Dr.\", \"Prof.\", etc.',\n        jsonKey: 'title',\n      },\n      {\n        key: ConfigKey.property_jobTitle,\n        description: 'The job title of the author, e.g. \"Software Engineer\", \"Professor\", etc.',\n      },\n    ],\n  },\n  [BitType.bookAuthor]: {\n    since: '4.2.0',\n    baseBitType: BitType.author,\n    description: 'Represents an author of a book',\n  },\n  [BitType.articleAuthor]: {\n    since: '4.2.0',\n    baseBitType: BitType.author,\n    description: 'Represents an author of a book',\n  },\n  [BitType.article]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Article bit, used for articles / paragraphs',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'The title of the article',\n      },\n    ],\n  },\n  [BitType.articleAlt]: {\n    since: '1.15.0',\n    baseBitType: BitType.article,\n    description: 'Alternative article bit',\n  },\n  [BitType.articleResponsive]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description: 'Responsive article bit, used for articles that adapt to the screen size',\n    tags: [\n      {\n        key: ConfigKey.property_imageFirst,\n        description: 'If the image should be displayed first in the responsive article',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.articleResponsiveAlt]: {\n    since: '2.0.0',\n    baseBitType: BitType.articleResponsive,\n    description: 'Alternative responsive article bit',\n  },\n  [BitType.standardArticleNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.article,\n    description: 'Standard normative article bit',\n  },\n  [BitType.standardArticleNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.article,\n    description: 'Standard non-normative article bit',\n  },\n  [BitType.smartStandardArticleNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardArticleNormative,\n    description: 'Smart standard normative article bit',\n  },\n  [BitType.smartStandardArticleNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardArticleNonNormative,\n    description: 'Smart standard non-normative article bit',\n  },\n  [BitType.smartStandardArticleNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardArticleNormative,\n    description: 'Smart standard normative article bit that is collapsible',\n  },\n  [BitType.smartStandardArticleNonNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardArticleNonNormative,\n    description: 'Smart standard non-normative article bit that is collapsible',\n  },\n  [BitType.statement]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Statement bit, used for statements in documents',\n  },\n  [BitType.pageArticle]: {\n    since: '1.15.0',\n    baseBitType: BitType.article,\n    description: 'Page article bit',\n  },\n  [BitType.pageArticleAlt]: {\n    since: '1.15.0',\n    baseBitType: BitType.article,\n    description: 'Alternative page article bit',\n  },\n  [BitType.pageArticleResponsive]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description: 'Responsive page article bit, used for articles that adapt to the screen size',\n    tags: [\n      {\n        key: ConfigKey.property_imageFirst,\n        description: 'If the image should be displayed first in the responsive article',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.buttonCopyText]: {\n    since: '1.4.3',\n    baseBitType: BitType.article,\n    description: 'Button copy text bit, used to create a button that copies text to the clipboard',\n    tags: [\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption of the button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.catalogItemBook]: {\n    since: '4.15.0',\n    baseBitType: BitType._standard,\n    description:\n      'Catalog item book bit, used to represent a book product in a catalog with cover and description',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'Title and subtitle of the catalog item',\n        maxCount: 2,\n      },\n      {\n        key: ConfigKey.property_coverImage,\n        description: 'Cover image of the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.resource_coverImage,\n        description: 'Cover image of the catalog item',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the cover image resource',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_content2Buy,\n        description: 'Content to buy identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_listPrice,\n        description: 'List price of the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the buy button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_customerProductId,\n        description: 'Customer-specific product identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_currency,\n        description: 'Currency for the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookIsbn,\n        description: 'ISBN for iBook version',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookAuthor,\n        description: 'Author of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookType,\n        description: 'Type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookBindingType,\n        description: 'Binding type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookNumberOfPages,\n        description: 'Number of pages in the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookRating,\n        description: 'Rating of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesTitle,\n        description: 'Title of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesId,\n        description: 'ID of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesNumber,\n        description: 'Number in the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookLanguage,\n        description: 'Language of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublishingDate,\n        description: 'Publishing date of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublisher,\n        description: 'Publisher of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookTranslator,\n        description: 'Translator of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookOriginalTitle,\n        description: 'Original title of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShop,\n        description: 'External shop identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShopItems,\n        description: 'Array of external shop items',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_imageSource,\n        description: 'Image source chain',\n      },\n      {\n        key: ConfigKey.group_previewImages,\n        description: 'Array of preview images for the catalog item',\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_previewVideos,\n        description: 'Array of preview videos for the catalog item',\n        maxCount: Count.infinity,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.catalogItemExternalBook]: {\n    since: '4.15.0',\n    baseBitType: BitType._standard,\n    description:\n      'Catalog item external book bit, used to represent an external book product in a catalog with link to external shop',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'Title and subtitle of the catalog item',\n        maxCount: 2,\n      },\n      {\n        key: ConfigKey.property_coverImage,\n        description: 'Cover image of the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.resource_coverImage,\n        description: 'Cover image of the catalog item',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the cover image resource',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_customerProductShopLink,\n        description: 'Link to external shop for the product',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_listPrice,\n        description: 'List price of the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the buy button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_customerProductId,\n        description: 'Customer-specific product identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_currency,\n        description: 'Currency for the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookIsbn,\n        description: 'ISBN for iBook version',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookAuthor,\n        description: 'Author of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookType,\n        description: 'Type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookBindingType,\n        description: 'Binding type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookNumberOfPages,\n        description: 'Number of pages in the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookRating,\n        description: 'Rating of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesTitle,\n        description: 'Title of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesId,\n        description: 'ID of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesNumber,\n        description: 'Number in the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookLanguage,\n        description: 'Language of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublishingDate,\n        description: 'Publishing date of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublisher,\n        description: 'Publisher of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookTranslator,\n        description: 'Translator of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookOriginalTitle,\n        description: 'Original title of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShop,\n        description: 'External shop identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShopItems,\n        description: 'Array of external shop items',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_imageSource,\n        description: 'Image source chain',\n      },\n      {\n        key: ConfigKey.group_previewImages,\n        description: 'Array of preview images for the catalog item',\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_previewVideos,\n        description: 'Array of preview videos for the catalog item',\n        maxCount: Count.infinity,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.catalogItemProduct]: {\n    since: '4.15.0',\n    baseBitType: BitType._standard,\n    description:\n      'Catalog item product bit, used to represent a general product in a catalog with cover and description',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'Title and subtitle of the catalog item',\n        maxCount: 2,\n      },\n      {\n        key: ConfigKey.property_coverImage,\n        description: 'Cover image of the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_content2Buy,\n        description: 'Content to buy identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_listPrice,\n        description: 'List price of the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the buy button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_customerProductId,\n        description: 'Customer-specific product identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_currency,\n        description: 'Currency for the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookIsbn,\n        description: 'ISBN for iBook version',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookAuthor,\n        description: 'Author of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookType,\n        description: 'Type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookBindingType,\n        description: 'Binding type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookNumberOfPages,\n        description: 'Number of pages in the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookRating,\n        description: 'Rating of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesTitle,\n        description: 'Title of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesId,\n        description: 'ID of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesNumber,\n        description: 'Number in the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookLanguage,\n        description: 'Language of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublishingDate,\n        description: 'Publishing date of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublisher,\n        description: 'Publisher of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookTranslator,\n        description: 'Translator of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookOriginalTitle,\n        description: 'Original title of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShop,\n        description: 'External shop identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShopItems,\n        description: 'Array of external shop items',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_imageSource,\n        description: 'Image source chain',\n      },\n      {\n        key: ConfigKey.group_previewImages,\n        description: 'Array of preview images for the catalog item',\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_previewVideos,\n        description: 'Array of preview videos for the catalog item',\n        maxCount: Count.infinity,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.callToAction]: {\n    since: '1.15.0',\n    baseBitType: BitType._standard,\n    description: 'Call to action bit, used to create a call to action button',\n    tags: [\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption of the call to action button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_callToActionUrl,\n        description: 'The URL to navigate to when the call to action button is clicked',\n        format: TagFormat.plainText,\n        minCount: 1,\n      },\n    ],\n  },\n  [BitType.callToActionSubscribe]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action subscribe bit',\n  },\n  [BitType.callToActionContact]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action contact bit',\n  },\n  [BitType.callToActionJoin]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action join bit',\n  },\n  [BitType.callToActionMail]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action mail bit',\n  },\n  [BitType.callToActionLearnMore]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action learn more bit',\n  },\n  [BitType.callToActionSeeMore]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action see more bit',\n  },\n  [BitType.callToActionWatch]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action watch bit',\n  },\n  [BitType.callToActionStartNow]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action start now bit',\n  },\n  [BitType.callToActionGetOffer]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action get offer bit',\n  },\n  [BitType.callToActionBookNow]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action book now bit',\n  },\n  [BitType.callToActionShopNow]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action shop now bit',\n  },\n  [BitType.callToActionGetNow]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action get now bit',\n  },\n  [BitType.callToActionDownload]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action download bit',\n  },\n  [BitType.callToActionCreateAccount]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action create account bit',\n  },\n  [BitType.appBitmarkFromJavascript]: {\n    since: '1.4.5',\n    baseBitType: BitType._standard,\n    description: 'App bitmark from JavaScript, used to create bits from JavaScript in the app',\n    tags: [\n      {\n        key: ConfigKey.property_maxCreatedBits,\n        description: 'The maximum number of bits that can be created from this bit',\n        format: TagFormat.number,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.appBitmarkFromEditor]: {\n    since: '1.4.5',\n    baseBitType: BitType.appBitmarkFromJavascript,\n    description: 'App bitmark from editor, used to create bits from the editor in the app',\n  },\n  [BitType.articleEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Article embed bit, used to embed articles from other sources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceArticleEmbed,\n        description: 'Tags for the article embed resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.articleLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Article link bit, used to link to articles from other sources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceArticleLink,\n        description: 'Tags for the article link resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.audio]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Audio bit, used for audio files',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceAudio,\n        description: 'Tags for the audio resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.audioEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Audio embed bit, used to embed audio files from other sources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceAudioEmbed,\n        description: 'Tags for the audio embed resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.audioLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Audio link bit, used to link to audio files from other sources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceAudioLink,\n        description: 'Tags for the audio link resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.bitAlias]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bit alias, used to create an alias for a bit',\n    tags: [\n      {\n        key: ConfigKey.tag_reference,\n        description: 'The reference to the bit that this alias points to',\n      },\n      {\n        key: ConfigKey.tag_anchor,\n        description: 'The anchor for the bit alias, used for linking',\n      },\n    ],\n  },\n  [BitType.diff]: {\n    since: '3.13.0',\n    baseBitType: BitType._standard,\n    description: 'Diff bit, used to show differences between two bits',\n    tags: [\n      {\n        key: ConfigKey.property_diffTo,\n        description: 'The reference to the bit that this diff compares to',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.book]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Book bit, used to represent a book',\n    tags: [\n      {\n        key: ConfigKey.group_bookCommon,\n        description: 'Common tags for book bits',\n      },\n    ],\n  },\n  [BitType.bookEnd]: {\n    since: '3.27.0',\n    baseBitType: BitType.article,\n    description: 'End of book bit',\n  },\n  [BitType.bookAcknowledgements]: {\n    since: '1.17.0',\n    baseBitType: BitType.article,\n    description: 'Acknowledgements section of a book',\n  },\n  [BitType.bookAddendum]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Addendum section of a book',\n  },\n  [BitType.bookAfterword]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Afterword section of a book',\n  },\n  [BitType.bookAppendix]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Appendix section of a book',\n  },\n  [BitType.bookArticle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Article section of a book',\n  },\n  [BitType.bookAutherBio]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Author biography section of a book',\n  },\n  [BitType.bookBibliography]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Bibliography section of a book',\n  },\n  [BitType.bookComingSoon]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Coming soon section of a book',\n  },\n  [BitType.bookConclusion]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Conclusion section of a book',\n  },\n  [BitType.bookCopyright]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Copyright section of a book',\n  },\n  [BitType.bookCopyrightPermissions]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Copyright permissions section of a book',\n  },\n  [BitType.bookDedication]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Dedication section of a book',\n  },\n  [BitType.bookEndnotes]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Endnotes section of a book',\n  },\n  [BitType.bookEpigraph]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Epigraph section of a book',\n  },\n  [BitType.bookEpilogue]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Epilogue section of a book',\n  },\n  [BitType.bookForword]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Foreword section of a book',\n  },\n  [BitType.bookFrontispiece]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Frontispiece section of a book',\n  },\n  [BitType.bookImprint]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Imprint section of a book',\n  },\n  [BitType.bookIncitingIncident]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Inciting incident section of a book',\n  },\n  [BitType.bookIntroduction]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Introduction section of a book',\n  },\n  [BitType.bookListOfContributors]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'List of contributors section of a book',\n  },\n  [BitType.bookNotes]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Notes section of a book',\n  },\n  [BitType.bookPostscript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Postscript section of a book',\n  },\n  [BitType.bookPreface]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Preface section of a book',\n  },\n  [BitType.bookPrologue]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Prologue section of a book',\n  },\n  [BitType.bookReadMore]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Read more section of a book',\n  },\n  [BitType.bookReferenceList]: {\n    //\n    since: '3.2.0',\n    baseBitType: BitType._standard,\n    description: 'Book reference list, used to list references in a book',\n    cardSet: CardSetConfigKey.bookReferenceList,\n  },\n  [BitType.bookRequestForABookReview]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Request for a book review section of a book',\n  },\n  [BitType.bookSummary]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Summary section of a book',\n  },\n  [BitType.bookTeaser]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Teaser section of a book',\n  },\n  [BitType.bookTitle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Title section of a book',\n  },\n  [BitType.bookCover]: {\n    since: '3.27.0',\n    baseBitType: BitType.image,\n    description: 'Cover image of a book',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'The title of the book cover',\n        maxCount: 2, // title & subtitle\n      },\n      {\n        key: ConfigKey.property_coverColor,\n        description: 'The color of the book cover',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.bookAlias]: {\n    since: '1.4.3',\n    baseBitType: BitType.book,\n    description: 'Book alias, used to create an alias for a book',\n    tags: [\n      {\n        key: ConfigKey.property_bookAlias,\n        description: 'The alias for the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.bookDiff]: {\n    since: '3.10.0',\n    baseBitType: BitType.book,\n    description: 'Book diff, used to show differences between two book versions',\n    tags: [\n      {\n        key: ConfigKey.property_bookDiff,\n        description: 'The reference to the book that this diff compares to',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.bookClose]: {\n    since: '1.18.0',\n    baseBitType: BitType.article,\n    description: 'Close section of a book, used to close the book',\n    tags: [\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption of the close button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.bookReference]: {\n    since: '2.2.0',\n    baseBitType: BitType.article,\n    description: 'Book reference, used to reference a book in another book',\n    tags: [\n      {\n        key: ConfigKey.property_refAuthor,\n        description: 'The author of the referenced book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_refBookTitle,\n        description: 'The title of the referenced book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_refPublisher,\n        description: 'The publisher of the referenced book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_refPublicationYear,\n        description: 'The publication year of the referenced book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_citationStyle,\n        description: 'The citation style to use for the book reference',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.botActionResponse]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bot action response bit, used to define responses for bot actions',\n\n    cardSet: CardSetConfigKey.botActionResponses,\n  },\n  [BitType.botActionSend]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bot action send bit, used to define actions for sending messages',\n    tags: [\n      {\n        key: ConfigKey.property_date,\n        description: 'The date when the message should be sent',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.browserImage]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Browser image bit, used to display images in the browser',\n    tags: [\n      {\n        key: ConfigKey.property_focusX,\n        description: 'The X coordinate for focusing the image in the browser',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_focusY,\n        description: 'The Y coordinate for focusing the image in the browser',\n        format: TagFormat.number,\n      },\n    ],\n  },\n  [BitType.card1]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Card bit, used for cards in quizzes',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n    ],\n  },\n  [BitType.question1]: {\n    since: '1.3.0',\n    baseBitType: BitType.card1,\n    description: 'Question card bit',\n  },\n  [BitType.survey1]: { since: '1.3.0', baseBitType: BitType.card1, description: 'Survey card bit' },\n  [BitType.surveyAnonymous1]: {\n    since: '1.3.0',\n    baseBitType: BitType.card1,\n    description: 'Anonymous survey card bit',\n  },\n  [BitType.chapter]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Chapter bit, used to define chapters in books or articles',\n    tags: [\n      {\n        key: ConfigKey.tag_anchor,\n        description: 'The anchor for the chapter, used for linking',\n      },\n      {\n        key: ConfigKey.tag_title,\n        description: 'The title of the chapter',\n      },\n      {\n        key: ConfigKey.property_toc,\n        description: 'If the chapter should be included in the table of contents',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_progress,\n        description: 'The progress of the chapter, used for tracking reading progress',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.clozeAndMultipleChoiceText]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Cloze and multiple choice text bit, used for quizzes with cloze and multiple choice questions',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n      {\n        key: ConfigKey.group_gap,\n        description: 'Tags for gaps in cloze and multiple choice text bits',\n      },\n      {\n        key: ConfigKey.group_trueFalse,\n        description: 'Tags for true/false questions in cloze and multiple choice text bits',\n      },\n    ],\n  },\n  [BitType.coachCallToActionClozeAndMultipleChoiceText]: {\n    since: '1.3.0',\n    baseBitType: BitType.clozeAndMultipleChoiceText,\n    description: 'Coach call to action cloze and multiple choice text bit',\n  },\n  [BitType.cloze]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Cloze bit, used for fill-in-the-blank questions in quizzes',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n      {\n        key: ConfigKey.property_isCaseSensitive,\n        description: 'If the cloze answers are case sensitive',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_quizCountItems,\n        description: 'The number of items in the cloze quiz',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_quizStrikethroughSolutions,\n        description: 'If the cloze solutions should be strikethrough',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.group_gap,\n        description: 'Tags for gaps in cloze bits',\n      },\n    ],\n  },\n  [BitType.clozeInstructionGrouped]: {\n    since: '1.3.0',\n    baseBitType: BitType.cloze,\n    description:\n      'Cloze instruction grouped bit, used for cloze questions with grouped instructions',\n  },\n  [BitType.clozeSolutionGrouped]: {\n    since: '1.3.0',\n    baseBitType: BitType.cloze,\n    description: 'Cloze solution grouped bit, used for cloze questions with grouped solutions',\n  },\n  [BitType.clozeSeveral]: {\n    since: '3.5.0',\n    baseBitType: BitType.cloze,\n    description: 'Cloze several bit, used for cloze questions with multiple answers',\n  },\n  [BitType.gapText]: {\n    since: '1.5.15',\n    baseBitType: BitType.cloze,\n    description: 'Gap text bit, used for fill-in-the-blank questions in quizzes with text gaps',\n  },\n  [BitType.gapTextInstructionGrouped]: {\n    since: '1.5.15',\n    baseBitType: BitType.clozeInstructionGrouped,\n    description:\n      'Gap text instruction grouped bit, used for fill-in-the-blank questions with grouped instructions',\n  },\n  [BitType.coachSelfReflectionCloze]: {\n    since: '1.3.0',\n    baseBitType: BitType.cloze,\n    description: 'Coach self-reflection cloze bit, used for self-reflection questions in coaching',\n  },\n  [BitType.coachCallToActionCloze]: {\n    since: '1.3.0',\n    baseBitType: BitType.cloze,\n    description: 'Coach call to action cloze bit, used for call to action questions in coaching',\n  },\n  [BitType.clozeList]: {\n    since: '1.4.13',\n    baseBitType: BitType._standard,\n    description: 'Cloze list bit, used for lists of cloze questions in quizzes',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n    ],\n    cardSet: CardSetConfigKey.clozeList,\n  },\n  [BitType.code]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Code bit, used for code snippets in articles or documents',\n    tags: [\n      {\n        key: ConfigKey.property_computerLanguage,\n        description: 'The programming language of the code snippet',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_codeLineNumbers,\n        description: 'If line numbers should be displayed for the code snippet',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_codeMinimap,\n        description: 'If a minimap should be displayed for the code snippet',\n        format: TagFormat.boolean,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.formula]: {\n    since: '1.35.0',\n    baseBitType: BitType._standard,\n    description: 'Formula bit, used for mathematical formulas in articles or documents',\n\n    textFormatDefault: TextFormat.latex,\n  },\n  [BitType.smartStandardFormula]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description: 'Smart standard formula bit, used for mathematical formulas in smart standards',\n  },\n  [BitType.smartStandardFormulaNonNormative]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description:\n      'Smart standard non-normative formula bit, used for mathematical formulas in smart standards that are non-normative',\n  },\n  [BitType.smartStandardFormulaNormative]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description:\n      'Smart standard normative formula bit, used for mathematical formulas in smart standards that are normative',\n  },\n  [BitType.smartStandardRemarkFormula]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description:\n      'Smart standard remark formula bit, used for mathematical formulas in smart standards remarks',\n  },\n  [BitType.smartStandardRemarkFormulaNonNormative]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description:\n      'Smart standard non-normative remark formula bit, used for mathematical formulas in smart standards remarks that are non-normative',\n  },\n  [BitType.smartStandardRemarkFormulaNormative]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description:\n      'Smart standard normative remark formula bit, used for mathematical formulas in smart standards remarks that are normative',\n  },\n  [BitType.appCodeCell]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'App code cell, used to create code cells in the app editor',\n  },\n  [BitType.appCodeEditor]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'App code editor, used to create code editors in the app editor',\n  },\n  [BitType.appCodeIde]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'App code IDE, used to create code IDEs in the app editor',\n  },\n  [BitType.codeRuntime]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'Code runtime, used to define the runtime environment for code snippets',\n  },\n  [BitType.consoleLog]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'Console log, used to log messages to the console in code snippets',\n  },\n  [BitType.output]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'Output bit, used to display output from code snippets',\n  },\n  [BitType.stdout]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'Standard output bit, used to display standard output from code snippets',\n  },\n  [BitType.sandbox]: {\n    since: '4.10.0',\n    baseBitType: BitType.code,\n    description: 'A sandbox bit, used to create a sandboxed environment for code execution',\n  },\n  [BitType.sandboxOutputJson]: {\n    since: '4.10.0',\n    baseBitType: BitType.code,\n    description: 'A sandbox output JSON bit, used to display JSON output from sandboxed code',\n  },\n  [BitType.sandboxOutputMarkup]: {\n    since: '4.10.0',\n    baseBitType: BitType.code,\n    description: 'A sandbox output markup bit, used to display markup output from sandboxed code',\n  },\n  [BitType.sandboxOutputRender]: {\n    since: '4.10.0',\n    baseBitType: BitType.code,\n    description: 'A sandbox output render bit, used to display rendered output from sandboxed code',\n  },\n  [BitType.step]: {\n    since: '1.5.1',\n    baseBitType: BitType.article,\n    description: 'Step bit, used to define steps in a process or guide',\n  },\n  [BitType.stepImageScreenshot]: {\n    since: '1.5.1',\n    baseBitType: BitType.image,\n    description: 'Step image screenshot bit, used to display screenshots in steps',\n  },\n  [BitType.stepImageScreenshotWithPointer]: {\n    since: '1.5.1',\n    baseBitType: BitType.image,\n    description:\n      'Step image screenshot with pointer bit, used to display screenshots with pointers in steps',\n    tags: [\n      {\n        key: ConfigKey.property_pointerTop,\n        description: 'The top position of the pointer in the screenshot',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: 1,\n      },\n      {\n        key: ConfigKey.property_pointerLeft,\n        description: 'The left position of the pointer in the screenshot',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: 1,\n      },\n    ],\n  },\n  [BitType.milestone]: {\n    since: '1.20.0',\n    baseBitType: BitType.step,\n    description: 'Milestone bit, used to define milestones in a process or guide',\n  },\n  [BitType.conversationLeft1]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Conversation left bit, used to create a conversation on the left side of the screen',\n    tags: [\n      {\n        key: ConfigKey.group_person,\n        description: 'Tags for the person in the conversation',\n      },\n    ],\n  },\n  [BitType.conversationLeft1Scream]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Conversation left scream bit, used to create a conversation with a scream on the left side of the screen',\n  },\n  [BitType.conversationLeft1Thought]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Conversation left thought bit, used to create a conversation with a thought on the left side of the screen',\n  },\n  [BitType.conversationRight1]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Conversation right bit, used to create a conversation on the right side of the screen',\n  },\n  [BitType.conversationRight1Scream]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Conversation right scream bit, used to create a conversation with a scream on the right side of the screen',\n  },\n  [BitType.conversationRight1Thought]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Conversation right thought bit, used to create a conversation with a thought on the right side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationLeft1]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation left bit, used for conversations with cloze and multiple choice text on the left side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationLeft1Scream]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation left scream bit, used for conversations with cloze and multiple choice text and a scream on the left side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationLeft1Thought]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation left thought bit, used for conversations with cloze and multiple choice text and a thought on the left side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationRight1]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation right bit, used for conversations with cloze and multiple choice text on the right side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationRight1Scream]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation right scream bit, used for conversations with cloze and multiple choice text and a scream on the right side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationRight1Thought]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation right thought bit, used for conversations with cloze and multiple choice text and a thought on the right side of the screen',\n  },\n\n  [BitType.advertising]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'General advertising content bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingAdvertorial]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'Advertorial content bit (sponsored article)',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n\n  [BitType.advertisingCallToAction]: {\n    since: '4.2.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call-to-action for advertising',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingCallToActionMeeting]: {\n    since: '4.2.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call-to-action for meeting or appointment',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n\n  [BitType.advertisingBanner]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Banner advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingSkyscraper]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Skyscraper (vertical) advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingRectangle]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Rectangle advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n\n  [BitType.advertisingFullPage]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Full-page advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingHalfPage]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Half-page advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingQuarterPage]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Quarter-page advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingClassifiedPage]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Classifieds advertisement page bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingLandscape]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Landscape format advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingPortrait]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Portrait format advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n\n  [BitType.cookPreparation]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook preparation bit',\n  },\n  [BitType.cookStep]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook step bit',\n  },\n  [BitType.cookIngredients]: {\n    since: '1.5.16',\n    baseBitType: BitType._standard,\n    description: 'Cook ingredients bit, used to define ingredients for recipes',\n    tags: [\n      {\n        key: ConfigKey.group_technicalTerm,\n        description: 'Tags for technical terms related to ingredients',\n      },\n      {\n        key: ConfigKey.property_servings,\n        jsonKey: 'servings.servings',\n        description: 'The number of servings for the ingredients',\n        format: TagFormat.number,\n        chain: [\n          {\n            key: ConfigKey.property_unit,\n            description: 'The unit of measurement for the ingredients',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_unitAbbr,\n            description: 'The abbreviation for the unit of measurement',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_decimalPlaces,\n            description: 'The number of decimal places for the ingredient quantity',\n            format: TagFormat.number,\n            defaultValue: '1',\n          },\n          {\n            key: ConfigKey.property_disableCalculation,\n            description: 'If the ingredient quantity calculation should be disabled',\n            format: TagFormat.boolean,\n          },\n          {\n            key: ConfigKey.tag_hint,\n            description: 'Hint for the ingredient, used to provide additional information',\n          },\n        ],\n      },\n    ],\n    cardSet: CardSetConfigKey.ingredients,\n  },\n  [BitType.recipe]: {\n    since: '1.5.24',\n    baseBitType: BitType.cookIngredients,\n    description: 'Recipe bit, used to define a recipe',\n  },\n  [BitType.cookRemark]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook remark bit, used to add remarks to recipes',\n  },\n  [BitType.cookVariation]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook variation bit, used to define variations of recipes',\n  },\n  [BitType.cookInsert]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook insert bit, used to insert additional content in recipes',\n  },\n  [BitType.cookNoteOnQuantity]: {\n    since: '3.27.0',\n    baseBitType: BitType.article,\n    description: 'Cook note on quantity bit, used to add notes on ingredient quantities in recipes',\n  },\n  [BitType.cookArrangement]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook arrangement bit, used to arrange ingredients or steps in recipes',\n  },\n  [BitType.cookPracticeAdvise]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook practice advice bit, used to provide practical advice in recipes',\n  },\n  [BitType.cookPlate]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook plate bit, used to define the presentation of a dish',\n  },\n  [BitType.cookRecommendation]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook recommendation bit, used to recommend dishes or ingredients',\n  },\n  [BitType.cookPersonalRecommendation]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Cook personal recommendation bit, used to provide personal recommendations for dishes or ingredients',\n  },\n  [BitType.cookSideDrink]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook side drink bit, used to define side drinks for dishes',\n  },\n  [BitType.cookSideDish]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook side dish bit, used to define side dishes for main courses',\n  },\n  [BitType.cookTimer]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook timer bit, used to set timers for cooking steps',\n  },\n  [BitType.document]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Document bit, used to define documents in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for resource bits, used to categorize documents',\n      },\n      {\n        key: ConfigKey.group_resourceDocument,\n        description: 'Tags for document resources, used to define documents in articles or books',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.documentDownload]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Document download bit, used to define downloadable documents in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for resource bits, used to categorize downloadable documents',\n      },\n      {\n        key: ConfigKey.group_resourceDocumentDownload,\n        description:\n          'Tags for downloadable document resources, used to define downloadable documents in articles or books',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.leDocumentDownload]: {\n    since: '3.18.0',\n    baseBitType: BitType.documentDownload,\n    description:\n      'LE Document download bit, used to define downloadable documents in learning experiences',\n  },\n  [BitType.documentEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Document embed bit, used to embed documents in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for resource bits, used to categorize embedded documents',\n      },\n      {\n        key: ConfigKey.group_resourceDocumentEmbed,\n        description:\n          'Tags for embedded document resources, used to define embedded documents in articles or books',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.documentLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Document link bit, used to link to documents in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for resource bits, used to categorize document links',\n      },\n      {\n        key: ConfigKey.group_resourceDocumentLink,\n        description:\n          'Tags for document link resources, used to define links to documents in articles or books',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.essay]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Essay bit, used to define essays in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n      {\n        key: ConfigKey.property_reasonableNumOfChars,\n        description: 'The reasonable number of characters for the essay',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_sampleSolution,\n        description: 'Sample solution for the essay, used as a reference answer',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_partialAnswer,\n        description: 'Partial answer for the essay, used to indicate incomplete answers',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_reference,\n        description: 'Reference for the essay, used to link to external resources',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.coachSelfReflectionEssay]: {\n    since: '1.3.0',\n    baseBitType: BitType.essay,\n    description: 'Coach self-reflection essay bit',\n  },\n  [BitType.coachCallToActionEssay]: {\n    since: '1.3.0',\n    baseBitType: BitType.essay,\n    description: 'Coach call to action essay bit',\n  },\n  [BitType.example]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Example bit, used to provide examples in articles or books',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'The title of the example',\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.exampleAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.example,\n    description:\n      'Alternative example bit, used to provide alternative examples in articles or books',\n  },\n  [BitType.standardExampleNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.example,\n    description:\n      'Standard normative example bit, used to provide normative examples in articles or books',\n  },\n  [BitType.standardExampleNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.example,\n    description:\n      'Standard non-normative example bit, used to provide non-normative examples in articles or books',\n  },\n  [BitType.smartStandardExampleNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardExampleNormative,\n    description:\n      'Smart standard normative example bit, used to provide normative examples in smart standards',\n  },\n  [BitType.smartStandardExampleNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardExampleNonNormative,\n    description:\n      'Smart standard non-normative example bit, used to provide non-normative examples in smart standards',\n  },\n  [BitType.smartStandardExampleNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardExampleNormative,\n    description:\n      'Smart standard normative example collapsible bit, used to provide normative examples in smart standards that can be collapsed',\n  },\n  [BitType.smartStandardExampleNonNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardExampleNonNormative,\n    description:\n      'Smart standard non-normative example collapsible bit, used to provide non-normative examples in smart standards that can be collapsed',\n  },\n  [BitType.authorContentBitGenerator]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'Body contains the content of one or more bits to be created by the bit generator',\n    tags: [\n      {\n        key: ConfigKey.property_classification,\n        description: 'Classification for the created bits',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.appAiPrompt]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'App AI prompt bit, used to create AI prompts in the app editor',\n  },\n  [BitType.aiPrompt]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'AI prompt bit, used to create AI prompts in articles or books',\n  },\n  [BitType.aiChat]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'AI chat bit, used to create an AI chat',\n  },\n  [BitType.aiEditor]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'AI editor bit, used to create an AI editor',\n  },\n  [BitType.aiTutor]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'AI tutor bit, used to create an AI tutor',\n  },\n  [BitType.aiWbt]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'AI WBT bit, used to create an AI WBT (Web-Based Training)',\n  },\n  [BitType.articleAi]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Article AI bit, used to create AI-generated articles',\n  },\n  [BitType.articleAttachment]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Article attachment bit, used to attach files to articles',\n  },\n  [BitType.assignment]: {\n    since: '1.3.0',\n    baseBitType: BitType.essay,\n    description: 'Assignment bit, used to define assignments in articles or books',\n  },\n  [BitType.audioTranscript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Audio transcript bit, used to provide transcripts for audio files in articles or books',\n  },\n  [BitType.bitmarkExample]: {\n    since: '1.3.0',\n    baseBitType: BitType.example,\n    description: 'Bitmark example bit, used to provide examples for bitmarks in articles or books',\n  },\n  [BitType.blogArticle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Blog article bit, used to define blog articles in articles or books',\n  },\n  [BitType.bug]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Bug bit, used to report bugs in articles or books',\n  },\n  [BitType.bugAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.bug,\n    description:\n      'Alternative bug bit, used to report bugs in articles or books with alternative styling',\n  },\n  [BitType.checklist]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Checklist bit, used to create checklists in articles or books',\n  },\n  [BitType.coachAudioTranscript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Coach audio transcript bit, used to provide transcripts for audio files in coaching articles or books',\n  },\n  [BitType.coachCallToActionChecklist]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Coach call to action checklist bit, used to create checklists in coaching articles or books',\n  },\n  [BitType.coachHomeRules]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Coach home rules bit, used to define home rules in coaching articles or books',\n  },\n  [BitType.coachVideoTranscript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Coach video transcript bit, used to provide transcripts for video files in coaching articles or books',\n  },\n  [BitType.correction]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Correction bit, used to provide corrections in articles or books',\n  },\n  [BitType.danger]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Danger bit, used to highlight dangerous or critical information in articles or books',\n  },\n  [BitType.dangerAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.article,\n    description:\n      'Alternative danger bit, used to highlight dangerous or critical information in articles or books with alternative styling',\n  },\n  [BitType.definitionTerm]: {\n    since: '1.34.0',\n    baseBitType: BitType.article,\n    description: 'Definition term bit, used to define terms in articles or books',\n  },\n  [BitType.deleted]: {\n    since: '3.9.0',\n    baseBitType: BitType.article,\n    description: 'Deleted bit, used to indicate deleted content in articles or books',\n  },\n  [BitType.details1]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Details bit, used to provide additional details in articles or books',\n  },\n  [BitType.details]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Details bit, used to provide additional details in articles or books',\n  },\n  [BitType.qAndA]: {\n    since: '3.5.0',\n    baseBitType: BitType.article,\n    description: 'Q&A bit, used to create question and answer sections in articles or books',\n  },\n  [BitType.editorial]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Editorial bit, used to provide editorial content in articles or books',\n  },\n  [BitType.editorNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Editor note bit, used to provide notes from the editor in articles or books',\n  },\n  [BitType.featured]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Featured bit, used to highlight featured content in articles or books',\n  },\n  [BitType.glossaryTerm]: {\n    since: '1.33.0',\n    baseBitType: BitType.article,\n    description: 'Glossary term bit, used to define glossary terms in articles or books',\n  },\n  [BitType.help]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Help bit, used to provide help or support information in articles or books',\n  },\n  [BitType.helpAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.help,\n    description:\n      'Alternative help bit, used to provide help or support information in articles or books with alternative styling',\n  },\n  [BitType.hint]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Hint bit, used to provide hints or tips in articles or books',\n  },\n  [BitType.hintAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.hint,\n    description:\n      'Alternative hint bit, used to provide hints or tips in articles or books with alternative styling',\n  },\n  [BitType.indexTerm]: {\n    since: '1.33.0',\n    baseBitType: BitType.article,\n    description: 'Index term bit, used to define index terms in articles or books',\n  },\n  [BitType.info]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Info bit, used to provide informational content in articles or books',\n  },\n  [BitType.infoAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.info,\n    description:\n      'Alternative info bit, used to provide informational content in articles or books with alternative styling',\n  },\n  [BitType.langLearningOutcomes]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language learning outcomes bit, used to define learning outcomes in language articles or books',\n  },\n  [BitType.langEnablingLanguageSkills]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language enabling skills bit, used to define enabling language skills in language articles or books',\n  },\n  [BitType.langLifeSkills]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language life skills bit, used to define life skills in language articles or books',\n  },\n  [BitType.langEnglishAroundWorld]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language English around the world bit, used to provide information about English usage around the world in language articles or books',\n  },\n  [BitType.langGoodToKnow]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language good to know bit, used to provide useful information in language articles or books',\n  },\n  [BitType.langLearningGoal]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language learning goal bit, used to define learning goals in language articles or books',\n  },\n  [BitType.langLearningStrategy]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language learning strategy bit, used to define learning strategies in language articles or books',\n  },\n  [BitType.langLikeALocal]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language like a local bit, used to provide tips for speaking like a local in language articles or books',\n  },\n  [BitType.langMaterial]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language material bit, used to provide language learning materials in language articles or books',\n  },\n  [BitType.langUsefulPhrases]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language useful phrases bit, used to provide useful phrases in language articles or books',\n  },\n  [BitType.langLevelDown]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language level down bit, used to provide information about lower language levels in language articles or books',\n  },\n  [BitType.langLevelUp]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language level up bit, used to provide information about higher language levels in language articles or books',\n  },\n  [BitType.langExtraActivity]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language extra activity bit, used to provide additional activities in language articles or books',\n  },\n  [BitType.langVideoScript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language video script bit, used to provide scripts for language learning videos in articles or books',\n  },\n  [BitType.langAudioScript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language audio script bit, used to provide scripts for language learning audio files in articles or books',\n  },\n  [BitType.langVocabulary]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language vocabulary bit, used to provide vocabulary lists in language articles or books',\n  },\n  [BitType.langHomework]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language homework bit, used to define homework assignments in language articles or books',\n  },\n  [BitType.langTeacherNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language teacher note bit, used to provide notes for teachers in language articles or books',\n  },\n  [BitType.langTeacherPronunciation]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language teacher pronunciation bit, used to provide pronunciation guidance for teachers in language articles or books',\n  },\n  [BitType.list]: {\n    since: '1.22.0',\n    baseBitType: BitType.article,\n    description: 'List bit, used to create lists in articles or books',\n  },\n  [BitType.standardList]: {\n    since: '1.22.0',\n    baseBitType: BitType.article,\n    description: 'Standard list bit, used to create standard lists in articles or books',\n  },\n  [BitType.smartStandardList]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardList,\n    description:\n      'Smart standard list bit, used to create smart standard lists in articles or books',\n  },\n  [BitType.smartStandardListCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardList,\n    description:\n      'Smart standard list collapsible bit, used to create collapsible smart standard lists in articles or books',\n  },\n  [BitType.message]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Message bit, used to create messages in articles or books',\n  },\n  [BitType.newspaperArticle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Newspaper article bit, used to define newspaper articles in articles or books',\n  },\n  [BitType.note]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Note bit, used to provide notes in articles or books',\n  },\n  [BitType.noteAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.note,\n    description:\n      'Alternative note bit, used to provide notes in articles or books with alternative styling',\n  },\n  [BitType.standardNoteNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.note,\n    description:\n      'Standard normative note bit, used to provide normative notes in articles or books',\n  },\n  [BitType.standardNoteNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.note,\n    description:\n      'Standard non-normative note bit, used to provide non-normative notes in articles or books',\n  },\n  [BitType.smartStandardNoteNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardNoteNormative,\n    description:\n      'Smart standard normative note bit, used to provide normative notes in smart standards',\n  },\n  [BitType.smartStandardNoteNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardNoteNonNormative,\n    description:\n      'Smart standard non-normative note bit, used to provide non-normative notes in smart standards',\n  },\n  [BitType.smartStandardNoteNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardNoteNormative,\n    description:\n      'Smart standard normative note collapsible bit, used to provide normative notes in smart standards that can be collapsed',\n  },\n  [BitType.smartStandardNoteNonNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardNoteNonNormative,\n    description:\n      'Smart standard non-normative note collapsible bit, used to provide non-normative notes in smart standards that can be collapsed',\n  },\n  [BitType.noteAi]: {\n    since: '1.3.0',\n    baseBitType: BitType.note,\n    description: 'Note AI bit, used to create AI-generated notes in articles or books',\n  },\n  [BitType.notebookArticle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Notebook article bit, used to define notebook articles in articles or books',\n  },\n  [BitType.preparationNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Preparation note bit, used to provide preparation notes in articles or books',\n  },\n  [BitType.printThisBook]: {\n    since: '5.4.0',\n    baseBitType: BitType._standard,\n    description: 'Print this book bit, used to create a button that prints the entire book',\n    tags: [\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption of the print button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.printThisChapter]: {\n    since: '5.4.0',\n    baseBitType: BitType._standard,\n    description: 'Print this chapter bit, used to create a button that prints the current chapter',\n    tags: [\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption of the print button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_printParentChapterLevel,\n        description: 'The parent chapter level to print',\n        format: TagFormat.number,\n        defaultValue: '-1',\n      },\n    ],\n  },\n  [BitType.printPageBreak]: {\n    since: '5.4.0',\n    baseBitType: BitType.separator,\n    description:\n      'Print page break bit, used to create page breaks for printing in articles or books',\n  },\n  [BitType.releaseNotesSummary]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Release notes summary bit, used to summarize release notes in articles or books',\n  },\n  [BitType.remark]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Remark bit, used to provide remarks in articles or books',\n  },\n  [BitType.remarkAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.remark,\n    description:\n      'Alternative remark bit, used to provide remarks in articles or books with alternative styling',\n  },\n  [BitType.standardRemarkNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.article,\n    description:\n      'Standard normative remark bit, used to provide normative remarks in articles or books',\n  },\n  [BitType.standardRemarkNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.article,\n    description:\n      'Standard non-normative remark bit, used to provide non-normative remarks in articles or books',\n  },\n  [BitType.smartStandardRemarkNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkNormative,\n    description:\n      'Smart standard normative remark bit, used to provide normative remarks in smart standards',\n  },\n  [BitType.smartStandardRemarkNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkNonNormative,\n    description:\n      'Smart standard non-normative remark bit, used to provide non-normative remarks in smart standards',\n  },\n  [BitType.smartStandardRemarkNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardRemarkNormative,\n    description:\n      'Smart standard normative remark collapsible bit, used to provide normative remarks in smart standards that can be collapsed',\n  },\n  [BitType.smartStandardRemarkNonNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardRemarkNonNormative,\n    description:\n      'Smart standard non-normative remark collapsible bit, used to provide non-normative remarks in smart standards that can be collapsed',\n  },\n  [BitType.selfAssessment]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Self-assessment bit, used to create self-assessment sections in articles or books',\n  },\n  [BitType.separator]: {\n    since: '1.4.15',\n    baseBitType: BitType.article,\n    description: 'Separator bit, used to create visual separators in articles or books',\n  },\n  [BitType.separatorAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.separator,\n    description:\n      'Alternative separator bit, used to create visual separators in articles or books with alternative styling',\n  },\n  [BitType.sticker]: {\n    since: '1.5.28',\n    baseBitType: BitType.article,\n    description: 'Sticker bit, used to create stickers in articles or books',\n  },\n  [BitType.sideNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Side note bit, used to provide side notes in articles or books',\n  },\n  [BitType.summary]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Summary bit, used to provide summaries in articles or books',\n  },\n  [BitType.summaryAi]: {\n    since: '1.3.0',\n    baseBitType: BitType.summary,\n    description: 'AI-generated summary bit',\n  },\n  [BitType.videoTranscript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Video transcript bit, used to provide transcripts for video files in articles or books',\n  },\n  [BitType.warning]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Warning bit, used to highlight warnings in articles or books',\n  },\n  [BitType.warningAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.warning,\n    description:\n      'Alternative warning bit, used to highlight warnings in articles or books with alternative styling',\n  },\n  [BitType.workbookArticle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Workbook article bit, used to define workbook articles in articles or books',\n  },\n  [BitType.collapsible]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description: 'Collapsible bit, used to create collapsible sections in articles or books',\n  },\n  [BitType.sideNoteCollapsible]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description:\n      'Side note collapsible bit, used to create collapsible side notes in articles or books',\n  },\n  [BitType.infoCollapsible]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description:\n      'Info collapsible bit, used to create collapsible informational sections in articles or books',\n  },\n  [BitType.remarkCollapsible]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description: 'Remark collapsible bit, used to create collapsible remarks in articles or books',\n  },\n  [BitType.warningCollapsible]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description:\n      'Warning collapsible bit, used to create collapsible warnings in articles or books',\n  },\n  [BitType.dangerCollapsible]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description:\n      'Danger collapsible bit, used to create collapsible danger sections in articles or books',\n  },\n  [BitType.noteCollapsible]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description: 'Note collapsible bit, used to create collapsible notes in articles or books',\n  },\n  [BitType.exampleCollapsible]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description:\n      'Example collapsible bit, used to create collapsible examples in articles or books',\n  },\n  [BitType.hintCollapsible]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description: 'Hint collapsible bit, used to create collapsible hints in articles or books',\n  },\n  [BitType.bugCollapsible]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description: 'Bug collapsible bit, used to create collapsible bug reports in articles or books',\n  },\n  [BitType.platformPath]: {\n    since: '3.14.1',\n    baseBitType: BitType._standard,\n    description: 'Platform path bit, used to define paths in the platform',\n    tags: [\n      {\n        key: ConfigKey.property_path,\n        description: 'The path for the platform, used to define navigation paths',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.appCalculatorLatex]: {\n    since: '4.10.0',\n    baseBitType: BitType.article,\n    description:\n      'A LaTeX calculator bit, used to create a calculator that can interpret LaTeX expressions',\n    tags: [\n      {\n        key: ConfigKey.property_formula,\n        description: 'The LaTeX formula for the calculator, used to define the calculation logic',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.container]: {\n    since: '1.9.0',\n    baseBitType: BitType.article,\n    description: 'Container bit, used to group bits together in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_allowedBit,\n        description:\n          'Allowed bits in the container, used to define which bits can be placed inside',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.containerWrap]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description: 'Container wrap bit, used to wrap content in a container',\n  },\n  [BitType.containerNowrap]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description: 'Container nowrap bit, used to prevent wrapping of content in a container',\n  },\n  [BitType.containerNowrapStretch]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description:\n      'Container nowrap stretch bit, used to stretch content without wrapping in a container',\n  },\n  [BitType.containerGroup]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description: 'Container group bit, used to group multiple containers together',\n  },\n  [BitType.containerFolder]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description: 'Container folder bit, used to create folders for organizing bits',\n  },\n  [BitType.containerCarousel]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container carousel bit, used to create carousels for displaying bits',\n  },\n  [BitType.containerCards]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container cards bit, used to create card layouts for displaying bits',\n  },\n  [BitType.containerGrid]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container grid bit, used to create grid layouts for displaying bits',\n  },\n  [BitType.containerStack]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container stack bit, used to create stacked layouts for displaying bits',\n  },\n  [BitType.containerSlides]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container slides bit, used to create slide presentations for displaying bits',\n  },\n  [BitType.containerGallery]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container gallery bit, used to create galleries for displaying bits',\n  },\n  [BitType.containerScroller]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container scroller bit, used to create scrolling sections for displaying bits',\n  },\n  [BitType.containerTabs]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container tabs bit, used to create tabbed sections for displaying bits',\n  },\n  [BitType.containerAccordionTabs]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description:\n      'Container accordion tabs bit, used to create accordion-style tabbed sections for displaying bits',\n  },\n  [BitType.containerFolderAll]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description:\n      'Container folder all bit, used to create folders that can contain all types of bits',\n  },\n  [BitType.containerBits2]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description:\n      'Container bits 2 bit, used to create a container for bits with additional features',\n  },\n  [BitType.containerCookRecipe]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description:\n      'Container cook recipe bit, used to create recipe containers for displaying cooking recipes',\n  },\n  [BitType.containerNewsArticle]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container news article bit, used to create containers for news articles',\n  },\n  [BitType.containerPreview]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container preview bit, used to create preview sections for displaying bits',\n  },\n  [BitType.pageContainer]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description: 'Page container bit, used to create containers for pages in articles or books',\n  },\n  [BitType.pageContainerWrap]: {\n    since: '1.9.0',\n    baseBitType: BitType.pageContainer,\n    description: 'Page container wrap bit, used to wrap content in a page container',\n  },\n  [BitType.pageContainerNowrap]: {\n    since: '1.9.0',\n    baseBitType: BitType.pageContainer,\n    description:\n      'Page container nowrap bit, used to prevent wrapping of content in a page container',\n  },\n  [BitType.pageContainerNowrapStretch]: {\n    since: '1.9.0',\n    baseBitType: BitType.pageContainer,\n    description:\n      'Page container nowrap stretch bit, used to stretch content without wrapping in a page container',\n  },\n  [BitType.pageContainerFolder]: {\n    since: '1.9.0',\n    baseBitType: BitType.pageContainer,\n    description:\n      'Page container folder bit, used to create folders for organizing bits in a page container',\n  },\n  [BitType.pageContainerGroup]: {\n    since: '1.9.0',\n    baseBitType: BitType.pageContainer,\n    description: 'Page container group bit, used to group multiple page containers together',\n  },\n  [BitType.metalevelExplanation]: {\n    since: '1.10.0',\n    baseBitType: BitType.article,\n    description:\n      'Metalevel explanation bit, used to provide explanations for metalevels in articles or books',\n  },\n  [BitType.module]: {\n    since: '1.5.26',\n    baseBitType: BitType.article,\n    description: 'Module bit, used to define modules in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_hasBookNavigation,\n        description: 'Indicates if the module has book navigation',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_productId,\n        description: 'Product ID for the module, used to link to a specific product',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_duration,\n        description: 'Duration of the module, used to indicate how long it takes to complete',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.moduleProduct]: {\n    since: '1.9.0',\n    baseBitType: BitType.module,\n    description: 'Module product bit, used to define products in modules',\n    tags: [\n      {\n        key: ConfigKey.property_productId,\n        description: 'Product ID for the module product, used to link to a specific product',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.exampleList]: {\n    since: '1.4.13',\n    baseBitType: BitType.example,\n    description: 'Example list bit, used to create lists of examples in articles or books',\n    cardSet: CardSetConfigKey.exampleBitList,\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.extractorPage]: {\n    since: '1.5.17',\n    baseBitType: BitType.image,\n    description: 'Extractor page bit, used to extract pages from images',\n  },\n  [BitType.extractorPageCollapsible]: {\n    since: '1.30.0',\n    baseBitType: BitType.extractorPage,\n    description:\n      'Collapsible extractor page bit, used to extract pages from images with collapsible functionality',\n  },\n  [BitType.extractorPageWithBlocks]: {\n    since: '1.5.21',\n    baseBitType: BitType.image,\n    description: 'Extractor page with blocks bit, used to extract pages with blocks from images',\n  },\n  [BitType.extractorPageWithBlocksCollapsible]: {\n    since: '1.30.0',\n    baseBitType: BitType.extractorPageWithBlocks,\n    description:\n      'Collapsible extractor page with blocks bit, used to extract pages with blocks from images with collapsible functionality',\n  },\n  [BitType.extractorConfiguration]: {\n    since: '1.7.1',\n    baseBitType: BitType._standard,\n    description: 'Extractor configuration bit, used to configure extractors in articles or books',\n\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.extractorBlueprintConfiguration]: {\n    since: '5.11.0',\n    baseBitType: BitType._standard,\n    description:\n      'Extractor blueprint configuration bit, used to specify extractor blueprint configuration when extracting from blueprints',\n\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.extractorImage]: {\n    since: '4.3.0',\n    baseBitType: BitType._standard,\n    description: 'Extractor images bit, used for images extracted from PDFs',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for logo grave images, used to define additional properties',\n      },\n      {\n        // Image resource\n\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for logo grave images, used to attach images',\n        minCount: 1,\n        maxCount: Count.infinity,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.extractorImageCollapsible]: {\n    since: '4.3.0',\n    baseBitType: BitType.extractorImage,\n    description: 'Collapsible extractor images bit, used for  images extracted from PDFs',\n  },\n  [BitType.extractorBlueprint]: {\n    since: '5.12.0',\n    baseBitType: BitType._standard,\n    description: 'Extractor blueprint bit, used to provide blueprint information about extractors',\n    textFormatDefault: TextFormat.json,\n  },\n  [BitType.extractorInformation]: {\n    since: '3.8.0',\n    baseBitType: BitType._standard,\n    description:\n      'Extractor information bit, used to provide information about extractors in articles or books',\n\n    textFormatDefault: TextFormat.json,\n  },\n  [BitType.extractorTheme]: {\n    since: '5.7.0',\n    baseBitType: BitType._standard,\n    description: 'Extractor theme bit, used to store design/theme JSON extracted from documents',\n\n    textFormatDefault: TextFormat.json,\n  },\n  [BitType.extractorAiChat]: {\n    since: '3.19.0',\n    baseBitType: BitType._standard,\n    description:\n      'Extractor AI chat bit, used to create AI chat interfaces for extractors in articles or books',\n  },\n  [BitType.extractorBlock]: {\n    since: '1.5.16',\n    baseBitType: BitType._standard,\n    description: 'Extractor block bit, used to define blocks within extractor pages',\n    tags: [\n      {\n        key: ConfigKey.property_blockId,\n        description:\n          'Unique identifier for the block, used to reference the block in extractor pages',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_pageNo,\n        description:\n          'Page number for the block, used to indicate the page on which the block appears',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_x,\n        description: 'X-coordinate for the block, used to position the block on the page',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_y,\n        description: 'Y-coordinate for the block, used to position the block on the page',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_width,\n        description: 'Width of the block, used to define the size of the block on the page',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_height,\n        description: 'Height of the block, used to define the size of the block on the page',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_index,\n        description: 'Index of the block, used to order blocks within the extractor page',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_classification,\n        description:\n          'Classification for the block, used to categorize the block within the extractor',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_availableClassifications,\n        description:\n          'Available classifications for the block, used to define possible classifications',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image for the block, used to attach images to the block',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.extractorRepeatedText]: {\n    since: '1.5.21',\n    baseBitType: BitType.article,\n    description: 'Extractor repeated text bit, used to define repeated text in extractor pages',\n  },\n  [BitType.extractorRule]: {\n    since: '5.17.0',\n    baseBitType: BitType._standard,\n    description:\n      'Extractor rule bit, used to define extraction rules with reference images and instructions',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for extraction rule images',\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for the rule reference image',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.extractorPageNumber]: {\n    since: '1.5.21',\n    baseBitType: BitType.article,\n    description: 'Extractor page number bit, used to define page numbers in extractor pages',\n  },\n  [BitType.extractorPageNumberCollapsible]: {\n    since: '1.30.0',\n    baseBitType: BitType.extractorPageNumber,\n    description:\n      'Collapsible extractor page number bit, used to define page numbers in extractor pages with collapsible functionality',\n  },\n  [BitType.extractorPageHeader]: {\n    since: '1.5.21',\n    baseBitType: BitType.article,\n    description: 'Extractor page header bit, used to define headers in extractor pages',\n  },\n  [BitType.extractorPageHeaderCollapsible]: {\n    since: '1.30.0',\n    baseBitType: BitType.extractorPageHeader,\n    description:\n      'Collapsible extractor page header bit, used to define headers in extractor pages with collapsible functionality',\n  },\n  [BitType.extractorPageFooter]: {\n    since: '1.5.21',\n    baseBitType: BitType.article,\n    description: 'Extractor page footer bit, used to define footers in extractor pages',\n  },\n  [BitType.extractorPageFooterCollapsible]: {\n    since: '1.30.0',\n    baseBitType: BitType.extractorPageFooter,\n    description:\n      'Collapsible extractor page footer bit, used to define footers in extractor pages with collapsible functionality',\n  },\n  [BitType.pageOpenBook]: {\n    since: '1.5.10',\n    baseBitType: BitType.article,\n    description: 'Page open book bit, used to create pages that open books in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the book, used to identify the book in the system',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_book,\n        description: 'Book reference for the page, used to link to a specific book',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_reference,\n            description: 'Reference tag for the book, used to link to the book in the system',\n            maxCount: 2,\n          },\n        ],\n      },\n      {\n        /* Allow incorrectly chained reference tag */\n        key: ConfigKey.tag_reference,\n        description: 'Reference tag for the book, used to link to the book in the system',\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button, used to define the text displayed on the button',\n      },\n      {\n        key: ConfigKey.property_authorFullName,\n        description: 'Full name of the author',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_authorPseudonym,\n        description: 'A pseudonym of the author, if any',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_authorTitle,\n        description: 'The title of the author, e.g. \"Dr.\", \"Prof.\", etc.',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_authorJobTitle,\n        description: 'The job title of the author, e.g. \"Software Engineer\", \"Professor\", etc.',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.printBook]: {\n    since: '5.5.0',\n    baseBitType: BitType.article,\n    description:\n      'Print book bit, used to create pages that open books without author information in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the book, used to identify the book in the system',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_book,\n        description: 'Book reference for the page, used to link to a specific book',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_reference,\n            description: 'Reference tag for the book, used to link to the book in the system',\n            maxCount: 2,\n          },\n        ],\n      },\n      {\n        /* Allow incorrectly chained reference tag */\n        key: ConfigKey.tag_reference,\n        description: 'Reference tag for the book, used to link to the book in the system',\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button, used to define the text displayed on the button',\n      },\n    ],\n  },\n  [BitType.openBookChapter]: {\n    since: '4.16.0',\n    baseBitType: BitType.pageOpenBook,\n    description:\n      'Open book chapter bit, derived from page-open-book, used to create chapter pages that open books',\n  },\n  [BitType.openBookChapterTeaser]: {\n    since: '4.16.0',\n    baseBitType: BitType.openBookChapter,\n    description:\n      'Open book chapter teaser bit, equal to open-book-chapter, used to create teaser chapter pages that open books',\n  },\n  [BitType.pageOpenBookList]: {\n    since: '2.1.0',\n    baseBitType: BitType.article,\n    description:\n      'Page open book list bit, used to create pages that open lists of books in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_book,\n        description: 'Book reference for the page, used to link to a specific book',\n        maxCount: Count.infinity,\n        chain: [\n          {\n            key: ConfigKey.tag_reference,\n            description: 'Reference tag for the book, used to link to the book in the system',\n            maxCount: 2,\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button, used to define the text displayed on the button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageSubscribe]: {\n    since: '1.5.10',\n    baseBitType: BitType.article,\n    description:\n      'Page subscribe bit, used to create pages that allow users to subscribe to content',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the subscription page, used to identify the page in the system',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description:\n          'Caption for the subscription button, used to define the text displayed on the button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_mailingList,\n        description: 'Mailing list for the subscription, used to link to a specific mailing list',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.assignmentList]: {\n    since: '1.4.13',\n    baseBitType: BitType.exampleList,\n    description: 'Assignment list bit, used to create lists of assignments in articles or books',\n  },\n  [BitType.pageFooter]: {\n    since: '1.4.13',\n    baseBitType: BitType.article,\n    description: 'Page footer bit, used to create footers in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the footer, used to identify the footer in the system',\n        format: TagFormat.plainText,\n      },\n    ],\n    cardSet: CardSetConfigKey.exampleBitList,\n  },\n  [BitType.legend]: {\n    since: '3.12.0',\n    baseBitType: BitType._standard,\n    description: 'Legend bit, used to provide legends in articles or books',\n\n    cardSet: CardSetConfigKey.definitionList,\n  },\n  [BitType.smartStandardLegend]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard legend bit, used to provide smart standard legends in articles or books',\n  },\n  [BitType.smartStandardLegendNonNormative]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard non-normative legend bit, used to provide non-normative smart standard legends in articles or books',\n  },\n  [BitType.smartStandardLegendNormative]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard normative legend bit, used to provide normative smart standard legends in articles or books',\n  },\n  [BitType.smartStandardRemarkLegend]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard remark legend bit, used to provide smart standard remarks in legends',\n  },\n  [BitType.smartStandardRemarkLegendNonNormative]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard non-normative remark legend bit, used to provide non-normative smart standard remarks in legends',\n  },\n  [BitType.smartStandardRemarkLegendNormative]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard normative remark legend bit, used to provide normative smart standard remarks in legends',\n  },\n  [BitType.definitionList]: {\n    since: '1.34.0',\n    baseBitType: BitType._standard,\n    description: 'Definition list bit, used to create lists of definitions in articles or books',\n\n    cardSet: CardSetConfigKey.definitionList,\n  },\n  [BitType.metaSearchDefaultTerms]: {\n    since: '3.12.0',\n    baseBitType: BitType._standard,\n    description: 'Meta search default terms bit, used to define default search terms in articles',\n\n    cardSet: CardSetConfigKey.definitionList,\n  },\n  [BitType.metaSearchDefaultTopics]: {\n    since: '3.12.0',\n    baseBitType: BitType.metaSearchDefaultTerms,\n    description: 'Meta search default topics bit, used to define default search topics in articles',\n  },\n  [BitType.flashcard]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Flashcard bit, used to create flashcards in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for flashcards',\n      },\n    ],\n    cardSet: CardSetConfigKey.flashcard,\n  },\n  [BitType.flashcard1]: {\n    since: '1.3.0',\n    baseBitType: BitType.flashcard,\n    description: 'Flashcard 1 bit',\n  },\n  [BitType.qAndACard]: {\n    since: '3.25.0',\n    baseBitType: BitType.flashcard1,\n    description: 'Q&A card bit, used to create question and answer cards in articles or books',\n  },\n  [BitType.focusImage]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Focus image bit, used to create images with focus points in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_focusX,\n        description: 'X-coordinate for the focus point, used to define the focus area in the image',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_focusY,\n        description: 'Y-coordinate for the focus point, used to define the focus area in the image',\n        format: TagFormat.number,\n      },\n    ],\n  },\n  [BitType.highlightText]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Highlight text bit, used to create highlighted text in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for highlighted text',\n      },\n      {\n        key: ConfigKey.group_trueFalse,\n        description: 'True/False quiz tags for highlighted text',\n      },\n    ],\n  },\n  [BitType.image]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Image bit, used to create images in articles or books',\n    tags: [\n      {\n        key: ConfigKey.resource_backgroundWallpaper,\n        description: 'Background wallpaper for the image, used to set a background for the image',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common resource image tags for images',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for images, used to define additional properties for images',\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for images, used to attach images to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.appCreateBitsFromImage]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'App create bits from image bit, used to create bits from images in the app',\n  },\n  [BitType.appGetScreenshot]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'App get screenshot bit, used to capture screenshots in the app',\n  },\n  [BitType.detailsImage]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Details image bit, used to create detailed images in articles or books',\n  },\n  [BitType.figure]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Figure bit, used to create figures in articles or books',\n    cardSet: CardSetConfigKey.definitionList,\n  },\n  [BitType.imageBanner]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image banner bit, used to create banners in articles or books',\n  },\n  [BitType.imageFigure]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image figure bit, used to create figures with images in articles or books',\n    cardSet: CardSetConfigKey.definitionList,\n  },\n  [BitType.imageFigureAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.imageFigure,\n    description:\n      'Alternative image figure bit, used to create figures with alternative images in articles or books',\n  },\n  [BitType.standardImageFigureNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.imageFigure,\n    description:\n      'Standard normative image figure bit, used to create normative image figures in articles or books',\n  },\n  [BitType.standardImageFigureNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.imageFigure,\n    description:\n      'Standard non-normative image figure bit, used to create non-normative image figures in articles or books',\n  },\n  [BitType.smartStandardImageFigureNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardImageFigureNormative,\n    description:\n      'Smart standard normative image figure bit, used to create smart standard normative image figures in articles or books',\n  },\n  [BitType.smartStandardImageFigureNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardImageFigureNonNormative,\n    description:\n      'Smart standard non-normative image figure bit, used to create smart standard non-normative image figures in articles or books',\n  },\n  [BitType.smartStandardImageFigureNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardImageFigureNormative,\n    description:\n      'Collapsible smart standard normative image figure bit, used to create collapsible smart standard normative image figures in articles or books',\n  },\n  [BitType.smartStandardImageFigureNonNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardImageFigureNonNormative,\n    description:\n      'Collapsible smart standard non-normative image figure bit, used to create collapsible smart standard non-normative image figures in articles or books',\n  },\n  [BitType.imageLandscape]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image landscape bit, used to create landscape images in articles or books',\n  },\n  [BitType.imageMood]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image mood bit, used to create mood images in articles or books',\n  },\n  [BitType.imagePortrait]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image portrait bit, used to create portrait images in articles or books',\n  },\n  [BitType.imagePrototype]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image prototype bit, used to create prototype images in articles or books',\n  },\n  [BitType.imageSeparator]: {\n    since: '1.4.15',\n    baseBitType: BitType.image,\n    description: 'Image separator bit, used to create separators in articles or books',\n  },\n  [BitType.imageSeparatorAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.imageSeparator,\n    description:\n      'Alternative image separator bit, used to create alternative separators in articles or books',\n  },\n  [BitType.imageScreenshot]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image screenshot bit, used to create screenshots in articles or books',\n  },\n  [BitType.imageStyled]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image styled bit, used to create styled images in articles or books',\n  },\n  [BitType.imageSuperWide]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image super wide bit, used to create super wide images in articles or books',\n  },\n  [BitType.imageZoom]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image zoom bit, used to create zoomable images in articles or books',\n  },\n  [BitType.langLifeSkillIcon]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description:\n      'Language life skill icon bit, used to create icons for life skills in articles or books',\n  },\n  [BitType.lifeSkillSticker]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description:\n      'Life skill sticker bit, used to create stickers for life skills in articles or books',\n  },\n  [BitType.pageBanner]: {\n    since: '1.4.3',\n    baseBitType: BitType.image,\n    description: 'Page banner bit, used to create banners for pages in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the page banner, used to identify the banner in the system',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageHero]: {\n    since: '1.11.0',\n    baseBitType: BitType.pageBanner,\n    description: 'Page hero bit, used to create hero sections in articles or books',\n  },\n  [BitType.screenshot]: {\n    since: '1.3.0',\n    deprecated: '1.4.0',\n    baseBitType: BitType.image,\n    description: 'Screenshot bit, used to create screenshots in articles or books',\n  },\n  [BitType.tableImage]: {\n    since: '1.5.15',\n    baseBitType: BitType.table,\n    description: 'Table image bit, used to create images in tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_caption,\n        description: 'Caption for the table image, used to provide a description for the image',\n        format: TagFormat.bitmarkText,\n      },\n      {\n        key: ConfigKey.resource_backgroundWallpaper,\n        description: 'Background wallpaper for the image, used to set a background for the image',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common resource image tags for images',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for images, used to define additional properties for images',\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for images, used to attach images to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.tableImageAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.tableImage,\n    description:\n      'Alternative table image bit, used to create alternative images in tables in articles or books',\n  },\n  [BitType.standardTableImageNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.tableImage,\n    description:\n      'Standard normative table image bit, used to create normative images in tables in articles or books',\n  },\n  [BitType.standardTableImageNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.tableImage,\n    description:\n      'Standard non-normative table image bit, used to create non-normative images in tables in articles or books',\n  },\n  [BitType.standardRemarkTableImageNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.tableImage,\n    description:\n      'Standard normative remark table image bit, used to create normative remark images in tables in articles or books',\n  },\n  [BitType.standardRemarkTableImageNonNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.tableImage,\n    description:\n      'Standard non-normative remark table image bit, used to create non-normative remark images in tables in articles or books',\n  },\n  [BitType.smartStandardTableImageNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableImageNormative,\n    description:\n      'Smart standard normative table image bit, used to create smart standard normative images in tables in articles or books',\n  },\n  [BitType.smartStandardTableImageNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableImageNonNormative,\n    description:\n      'Smart standard non-normative table image bit, used to create smart standard non-normative images in tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableImageNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableImageNormative,\n    description:\n      'Smart standard normative remark table image bit, used to create smart standard normative remark images in tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableImageNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableImageNonNormative,\n    description:\n      'Smart standard non-normative remark table image bit, used to create smart standard non-normative remark images in tables in articles or books',\n  },\n  [BitType.smartStandardTableImageNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardTableImageNormative,\n    description:\n      'Collapsible smart standard normative table image bit, used to create collapsible smart standard normative images in tables in articles or books',\n  },\n  [BitType.smartStandardTableImageNonNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardTableImageNonNormative,\n    description:\n      'Collapsible smart standard non-normative table image bit, used to create collapsible smart standard non-normative images in tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableImageNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardRemarkTableImageNormative,\n    description:\n      'Collapsible smart standard normative remark table image bit, used to create collapsible smart standard normative remark images in tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableImageNonNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardRemarkTableImageNonNormative,\n    description:\n      'Collapsible smart standard non-normative remark table image bit, used to create collapsible smart standard non-normative remark images in tables in articles or books',\n  },\n  [BitType.imageLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Image link bit, used to create links with images in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for image links, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceImageLink,\n        description: 'Resource image link tags, used to attach images to the link',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.imageOnDevice]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Image on device bit, used to create images stored on the device in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for images on device, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for images on device, used to attach images',\n      },\n      {\n        key: ConfigKey.group_imageSource,\n        description:\n          'Image source tags for images on device, used to define the source of the image',\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.imageResponsive]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Responsive image bit, used to create responsive images in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for responsive images, used to define additional properties',\n      },\n      {\n        // Combo resource\n\n        key: ConfigKey.group_resourceImageResponsive,\n        description: 'Resource image responsive tags, used to attach responsive images',\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.imagesLogoGrave]: {\n    since: '1.5.11',\n    baseBitType: BitType._standard,\n    description: 'Logo grave images bit, used to create logo grave images in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for logo grave images, used to define additional properties',\n      },\n      {\n        // Image resource\n\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for logo grave images, used to attach images',\n        minCount: 1,\n        maxCount: Count.infinity,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.prototypeImages]: {\n    since: '1.6.1',\n    baseBitType: BitType.imagesLogoGrave,\n    description: 'Prototype images bit, used to create prototype images in articles or books',\n  },\n  [BitType.internalLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Internal link bit, used to create links to other bits in articles or books',\n    tags: [\n      {\n        key: ConfigKey.tag_reference,\n        description: 'Reference tag for the internal link, used to link to the target bit',\n      },\n    ],\n  },\n  [BitType.interview]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Interview bit, used to create interviews in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for interviews',\n      },\n      {\n        key: ConfigKey.property_reasonableNumOfChars,\n        description: 'Reasonable number of characters for the interview, used to limit input size',\n        format: TagFormat.number,\n      },\n    ],\n    cardSet: CardSetConfigKey.questions,\n  },\n  [BitType.interviewInstructionGrouped]: {\n    since: '1.3.0',\n    baseBitType: BitType.interview,\n    description: 'Grouped interview instruction bit',\n  },\n  [BitType.botInterview]: {\n    since: '1.3.0',\n    baseBitType: BitType.interview,\n    description: 'Bot interview bit, used to create bot interviews in articles or books',\n  },\n  [BitType.brandColor]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Brand color bit, used to define brand colors',\n    tags: [\n      {\n        key: ConfigKey.property_brandColor,\n        description: 'The brand color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_brandColorName,\n        description: 'The brand color name',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.learningPathBook]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Learning path book bit, used to create learning paths in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_learningPathCommon,\n        description:\n          'Common tags for learning path books, used to define properties of learning paths',\n      },\n    ],\n  },\n  [BitType.bookLink]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Book link bit, used to create links to books in learning paths',\n  },\n  [BitType.bookLinkNext]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Next book link bit, used to create links to the next book in learning paths',\n  },\n  [BitType.bookLinkPrev]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description:\n      'Previous book link bit, used to create links to the previous book in learning paths',\n  },\n  [BitType.learningPathClassroomEvent]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description:\n      'Learning path classroom event bit, used to create classroom events in learning paths',\n  },\n  [BitType.learningPathClassroomTraining]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description:\n      'Learning path classroom training bit, used to create classroom training in learning paths',\n  },\n  [BitType.learningPathClosing]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path closing bit, used to close learning paths',\n  },\n  [BitType.learningPathFeedback]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path feedback bit, used to provide feedback in learning paths',\n  },\n  [BitType.learningPathLearningGoal]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path learning goal bit, used to define learning goals in learning paths',\n  },\n  [BitType.learningPathLti]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path LTI bit, used to integrate LTI tools in learning paths',\n  },\n  [BitType.learningPathSign]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path sign bit, used to create signs in learning paths',\n  },\n  [BitType.learningPathStep]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path step bit, used to create steps in learning paths',\n  },\n  [BitType.learningPathBotTraining]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path bot training bit, used to create bot training in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_bot,\n        description: 'Bot reference for the training, used to link to a specific bot',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.learningPathExternalLink]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path external link bit, used to create external links in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_externalLink,\n        description: 'External link for the learning path, used to link to external resources',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_externalLinkText,\n        description: 'Text for the external link, used to define the link text displayed',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.learningPathVideoCall]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path video call bit, used to create video calls in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_videoCallLink,\n        description: 'Video call link for the learning path, used to link to video calls',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leLearningObjectives]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathLearningGoal,\n    description: 'Learning objectives bit, used to define learning objectives in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the learning objectives, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leVideoCall]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathVideoCall,\n    description: 'Video call bit, used to create video calls in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the video call, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leClassroomEvent]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathClassroomEvent,\n    description: 'Classroom event bit, used to create classroom events in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the classroom event, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leMultiDayEvent]: {\n    since: '3.32.0',\n    baseBitType: BitType.leClassroomEvent,\n    description: 'Multi-day event bit, used to create multi-day events in learning paths',\n  },\n  [BitType.leCompletion]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathClosing,\n    description: 'Completion bit, used to mark the completion of learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the completion, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leExternalLink]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathExternalLink,\n    description: 'External link bit, used to create external links in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the external link, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leReadBook]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Read book bit, used to create reading tasks in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the reading task, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leLearningStep]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathStep,\n    description: 'Learning step bit, used to create steps in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the learning step, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.lePreparationTask]: {\n    since: '1.26.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Preparation task bit, used to create preparation tasks in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        format: TagFormat.plainText,\n        description: 'Activity type for the preparation task, used to categorize the activity',\n      },\n    ],\n  },\n  [BitType.leRead]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Read task bit, used to create reading tasks in learning paths',\n  },\n  [BitType.leTask]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Task bit, used to create tasks in learning paths',\n  },\n  [BitType.leTodo]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Todo bit, used to create todo tasks in learning paths',\n  },\n  [BitType.leFollowUpTask]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Follow-up task bit, used to create follow-up tasks in learning paths',\n  },\n  [BitType.leFinishingTask]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Finishing task bit, used to create finishing tasks in learning paths',\n  },\n  [BitType.leAssignment]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Assignment bit, used to create assignments in learning paths',\n  },\n  [BitType.leWatchVideoEmbed]: {\n    since: '1.27.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Watch video embed bit, used to embed videos in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the video embed, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for video embeds, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceVideoEmbed,\n        description: 'Resource video embed tags, used to attach video embeds to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.leListenAudioEmbed]: {\n    since: '1.27.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Listen audio embed bit, used to embed audio in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the audio embed, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for audio embeds, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceAudioEmbed,\n        description: 'Resource audio embed tags, used to attach audio embeds to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n\n  [BitType.listItem]: {\n    since: '1.22.0',\n    baseBitType: BitType.article,\n    description: 'List item bit, used to create list items in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_listItemIndent,\n        description:\n          'Indentation level for the list item, used to define the hierarchy of the list',\n        format: TagFormat.number,\n        defaultValue: '0',\n      },\n    ],\n  },\n  [BitType.standardListItem]: {\n    since: '1.22.0',\n    baseBitType: BitType.listItem,\n    description: 'Standard list item bit, used to create standard list items in articles or books',\n  },\n  [BitType.smartStandardListItem]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardListItem,\n    description:\n      'Smart standard list item bit, used to create smart standard list items in articles or books',\n  },\n  [BitType.smartStandardListItemCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardListItem,\n    description:\n      'Collapsible smart standard list item bit, used to create collapsible smart standard list items in articles or books',\n  },\n  [BitType.mark]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Mark bit, used to create marks in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for marks',\n      },\n      {\n        key: ConfigKey.group_markConfig,\n        description: 'Configuration tags for marks, used to define properties of marks',\n      },\n      {\n        key: ConfigKey.group_mark,\n        description: 'Mark tags, used to define the content of marks',\n      },\n    ],\n  },\n  [BitType.match]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Match bit, used to create matching pairs in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for matching pairs',\n      },\n      {\n        key: ConfigKey.property_isCaseSensitive,\n        description:\n          'Case sensitivity for matching pairs, used to define if matches are case-sensitive',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n    cardSet: CardSetConfigKey.matchPairs,\n  },\n  [BitType.matchAll]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Match all bit, used to create matching pairs with all options in articles or books',\n  },\n  [BitType.matchReverse]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Match reverse bit, used to create matching pairs with reversed options in articles or books',\n  },\n  [BitType.matchAllReverse]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Match all reverse bit, used to create matching pairs with all options and reversed in articles or books',\n  },\n  [BitType.matchSolutionGrouped]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Grouped match solution bit, used to create grouped matching solutions in articles or books',\n  },\n  [BitType.matchMatrix]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Match matrix bit, used to create matching pairs in a matrix format in articles or books',\n    cardSet: CardSetConfigKey.matchMatrix,\n  },\n  [BitType.matchAudio]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description: 'Match audio bit, used to create matching pairs with audio in articles or books',\n    cardSet: CardSetConfigKey.matchAudioPairs,\n  },\n  [BitType.matchPicture]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Match picture bit, used to create matching pairs with pictures in articles or books',\n    cardSet: CardSetConfigKey.matchImagePairs,\n  },\n  [BitType.feedback]: {\n    since: '3.13.0',\n    baseBitType: BitType._standard,\n    description: 'Feedback bit, used to provide feedback in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_reasonableNumOfChars,\n        description: 'Reasonable number of characters for feedback, used to limit input size',\n        format: TagFormat.number,\n      },\n    ],\n    cardSet: CardSetConfigKey.feedback,\n  },\n  [BitType.learningDocumentationFeedback]: {\n    since: '3.13.0',\n    baseBitType: BitType.feedback,\n    description: 'Feedback for learning documentation',\n  },\n  [BitType.handInFeedbackExpert]: {\n    since: '3.30.0',\n    baseBitType: BitType.feedback,\n    description: 'Feedback for expert hand-in',\n  },\n  [BitType.handInFeedbackSelf]: {\n    since: '3.30.0',\n    baseBitType: BitType.feedback,\n    description: 'Self-feedback for hand-in',\n  },\n  [BitType.multipleChoice1]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Multiple choice 1 bit, used to create single-choice questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for multiple choice 1 questions',\n      },\n      {\n        key: ConfigKey.group_trueFalse,\n        description: 'True/False tags for multiple choice 1 questions',\n      },\n    ],\n  },\n  [BitType.coachSelfReflectionMultipleChoice1]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleChoice1,\n    description:\n      'Coach self-reflection multiple choice 1 bit, used for self-reflection in coaching',\n  },\n  [BitType.multipleChoice]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Multiple choice bit, used to create multiple-choice questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for multiple choice questions',\n      },\n      {\n        key: ConfigKey.group_trueFalse,\n        description: 'True/False tags for multiple choice questions',\n      }, // This is actually for multiple-choice-1, but we support it here as well (as many bits are wrong)\n    ],\n    cardSet: CardSetConfigKey.quiz,\n  },\n  [BitType.coachSelfReflectionMultipleChoice]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleChoice,\n    description: 'Coach self-reflection multiple choice bit, used for self-reflection in coaching',\n  },\n  [BitType.multipleChoiceText]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Multiple choice text bit, used to create multiple-choice questions with text in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for multiple choice text questions',\n      },\n      {\n        key: ConfigKey.group_trueFalse,\n        description: 'True/False tags for multiple choice text questions',\n      },\n    ],\n  },\n  [BitType.coachCallToActionMultipleChoiceText]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleChoiceText,\n    description:\n      'Coach call to action multiple choice text bit, used for self-reflection in coaching',\n  },\n  [BitType.coachSelfReflectionMultipleChoiceText]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleChoiceText,\n    description:\n      'Coach self-reflection multiple choice text bit, used for self-reflection in coaching',\n  },\n  [BitType.multipleResponse1]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Multiple response 1 bit, used to create multiple-response questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for multiple response 1 questions',\n      },\n      {\n        key: ConfigKey.group_trueFalse,\n        description: 'True/False tags for multiple response 1 questions',\n      },\n    ],\n  },\n  [BitType.coachSelfReflectionMultipleResponse1]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleResponse1,\n    description:\n      'Coach self-reflection multiple response 1 bit, used for self-reflection in coaching',\n  },\n  [BitType.multipleResponse]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Multiple response bit, used to create multiple-response questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for multiple response questions',\n      },\n      {\n        key: ConfigKey.group_trueFalse,\n        description: 'True/False tags for multiple response questions',\n      }, // This is actually for multiple-response-1, but we support it here as well (as many bits are wrong)\n    ],\n    cardSet: CardSetConfigKey.quiz,\n  },\n  [BitType.coachSelfReflectionMultipleResponse]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleResponse,\n    description:\n      'Coach self-reflection multiple response bit, used for self-reflection in coaching',\n  },\n  [BitType.page]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Page bit, used to create pages in articles or books',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'Title of the page, used to display the page title',\n      },\n      {\n        key: ConfigKey.property_thumbImage,\n        description: 'Thumbnail image for the page, used to display a small image representation',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageCollapsible]: {\n    since: '1.30.0',\n    baseBitType: BitType.page,\n    description: 'Collapsible page bit, used to create collapsible sections in pages',\n  },\n  [BitType.pageCoverImage]: {\n    since: '1.22.0',\n    baseBitType: BitType.page,\n    description: 'Page cover image bit, used to create cover images for pages',\n  },\n  [BitType.advertisingAdvertorialPage]: {\n    since: '4.5.0',\n    baseBitType: BitType.page,\n    description: 'Advertorial Page bit, used to create advertorial pages',\n  },\n  [BitType.pageBuyButton]: {\n    since: '1.4.3',\n    baseBitType: BitType._standard,\n    description: 'Page buy button bit, used to create buy buttons on pages',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the page, used to identify the page in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_content2Buy,\n        description: 'Content to buy for the page, used to define what is being sold',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the buy button, used to define the text displayed on the button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageBuyButtonAlt]: {\n    since: '1.31.0',\n    baseBitType: BitType.pageBuyButton,\n    description: 'Alternative page buy button bit, used to create alternative buy buttons on pages',\n  },\n  [BitType.pageBuyButtonPromotion]: {\n    since: '1.5.11',\n    baseBitType: BitType.pageBuyButton,\n    description: 'Page buy button for promotions, used to create buy buttons on promotional pages',\n  },\n  [BitType.pageSubpage]: {\n    since: '1.6.6',\n    baseBitType: BitType._standard,\n    description: 'Page subpage bit, used to create subpages in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the subpage, used to identify the subpage in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_page,\n        description: 'Page reference for the subpage, used to link to the parent page',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageShopInShop]: {\n    since: '1.6.6',\n    baseBitType: BitType.pageSubpage,\n    description: 'Page shop-in-shop bit, used to create shop-in-shop pages in articles or books',\n  },\n  [BitType.pageCategory]: {\n    since: '1.6.6',\n    baseBitType: BitType.pageSubpage,\n    description: 'Page category bit, used to create category pages in articles or books',\n  },\n  [BitType.pageAcademy]: {\n    since: '1.6.6',\n    baseBitType: BitType.pageSubpage,\n    description: 'Page academy bit, used to create academy pages in articles or books',\n  },\n  [BitType.pagePromotion]: {\n    since: '1.6.6',\n    baseBitType: BitType.pageSubpage,\n    description: 'Page promotion bit, used to create promotional pages in articles or books',\n  },\n  [BitType.pageSpecial]: {\n    since: '1.6.6',\n    baseBitType: BitType.pageSubpage,\n    description: 'Page special bit, used to create special pages in articles or books',\n  },\n  [BitType.pagePerson]: {\n    since: '1.5.16',\n    baseBitType: BitType._standard,\n    description: 'Page person bit, used to create person pages in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the person page, used to identify the person in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.group_person,\n        description: 'Person tags, used to define properties of the person',\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button on the person page, used to define the text displayed',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageProduct]: {\n    since: '1.4.17',\n    baseBitType: BitType._standard,\n    description: 'Page product bit, used to create product pages in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the product page, used to identify the product in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_product,\n        description: 'Product reference for the product page, used to link to the product',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageProductList]: {\n    since: '1.4.17',\n    baseBitType: BitType._standard,\n    description: 'Page product list bit, used to create product lists in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the product list page, used to identify the product list in URLs',\n        format: TagFormat.plainText,\n      },\n      // NOTE: Only one of productVideo or productVideoList should be used, not both - TODO: fix when know which one!\n      {\n        key: ConfigKey.property_product,\n        description: 'Product reference for the product list, used to link to the product',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      // {\n      //   key: ConfigKey.property_productList,\n      //   format: TagFormat.plainText,\n      //   maxCount: Count.infinity,\n      // },\n    ],\n  },\n  [BitType.pageProductVideo]: {\n    since: '1.4.17',\n    baseBitType: BitType._standard,\n    description: 'Page product video bit, used to create product video pages in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the product video page, used to identify the product video in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_productVideo,\n        description:\n          'Product video reference for the product video page, used to link to the video',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageProductVideoList]: {\n    since: '1.4.17',\n    baseBitType: BitType._standard,\n    description:\n      'Page product video list bit, used to create product video lists in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description:\n          'Slug for the product video list page, used to identify the product video list in URLs',\n        format: TagFormat.plainText,\n      },\n      // NOTE: Only one of productVideo or productVideoList should be used, not both - TODO: fix when know which one!\n      {\n        key: ConfigKey.property_productVideo,\n        description:\n          'Product video reference for the product video list, used to link to the video',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      // {\n      //   key: ConfigKey.property_productVideoList,\n      //   format: TagFormat.plainText,\n      //   maxCount: Count.infinity,\n      // },\n    ],\n  },\n  [BitType.pageSectionFolder]: {\n    since: '1.4.17',\n    baseBitType: BitType._standard,\n    description: 'Page section folder bit, used to create section folders in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the section folder page, used to identify the section in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_productFolder,\n        description:\n          'Product folder reference for the section folder page, used to link to the folder',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.photo]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Photo bit, used to create photo bits in articles or books',\n  },\n  [BitType.platform]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform bit, used to define platform properties',\n    tags: [\n      {\n        key: ConfigKey.property_platformName,\n        description: 'The platform name',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.resource_platformIcon,\n        description: 'The platform icon',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the platform icon resource',\n          },\n        ],\n        maxCount: 1,\n      },\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformBrandTarget]: {\n    since: '4.15.0',\n    baseBitType: BitType._standard,\n    description: 'Platform brand target bit, used to define the brand target for publishing',\n    tags: [\n      {\n        key: ConfigKey.property_platformBrandTarget,\n        description: 'The platform brand target (typically \"light\", \"dark\" or \"none\")',\n        format: TagFormat.plainText,\n        defaultValue: 'none',\n      },\n    ],\n  },\n  [BitType.platformHeader]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform header bit, used to define platform header properties',\n    tags: [\n      {\n        key: ConfigKey.resource_platformLogo,\n        description: 'The platform logo',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the platform logo resource',\n          },\n        ],\n        maxCount: 1,\n      },\n      {\n        key: ConfigKey.property_platformLogoMaxHeight,\n        description: 'Maximum height for the platform logo',\n        format: TagFormat.number,\n        defaultValue: '40',\n      },\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformMain]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform main bit, used to define platform main properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformMainButton]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform main button bit, used to define platform main button properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformMainInput]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform main input bit, used to define platform main input properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformSection]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform section bit, used to define platform section properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformSectionButton]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform section button bit, used to define platform section button properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformSectionChat]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform section chat bit, used to define platform section chat properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n      {\n        key: ConfigKey.resource_platformBackgroundImage,\n        description: 'The platform section chat background image',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the platform background image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [BitType.platformSectionHeader]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform section header bit, used to define platform section header properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformSectionInput]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform section input bit, used to define platform section input properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformSystemIcon]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform system icon bit, used to define platform system icon properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.quote]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Quote bit, used to create quotes in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_quotedPerson,\n        description: 'Quoted person for the quote, used to define who is being quoted',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.rating]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Rating bit, used to create rating bits in articles or books',\n  },\n  [BitType.coachSelfReflectionRating]: {\n    since: '1.3.0',\n    baseBitType: BitType.rating,\n    description: 'Coach self-reflection rating bit, used for self-reflection in coaching',\n  },\n  [BitType.releaseNote]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Release note bit, used to create release notes in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_releaseVersion,\n        description:\n          'Release version for the release note, used to define the version of the release',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_releaseKind,\n        description: 'Release kind for the release note, used to define the type of release',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_releaseDate,\n        description: 'Release date for the release note, used to define when the release was made',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.reviewNote]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Review note bit, used to create review notes in articles or books',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'Title of the review note, used to display the note title',\n      },\n      {\n        key: ConfigKey.property_resolved,\n        description:\n          'Resolved status for the review note, used to indicate if the note is resolved',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_resolvedDate,\n        description: 'Resolved date for the review note, used to define when the note was resolved',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_resolvedBy,\n        description: 'Resolved by for the review note, used to define who resolved the note',\n        format: TagFormat.plainText,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.reviewAuthorNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Author review note bit, used to create author notes in reviews',\n  },\n  [BitType.reviewCustomerNote]: {\n    //\n    since: '3.5.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Customer review note bit, used to create customer notes in reviews',\n  },\n  [BitType.reviewError]: {\n    since: '5.8.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Review error note bit, used to create error notes in reviews',\n  },\n  [BitType.reviewErrorAi]: {\n    since: '5.8.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Review error AI note bit, used to create AI error notes in reviews',\n  },\n  [BitType.reviewErrorTranslation]: {\n    since: '5.8.0',\n    baseBitType: BitType.reviewNote,\n    description:\n      'Review error translation note bit, used to create translation error notes in reviews',\n  },\n  [BitType.reviewReviewerNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Reviewer review note bit, used to create reviewer notes in reviews',\n  },\n  [BitType.reviewRequestForReviewNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Request for review note bit, used to create notes requesting reviews',\n  },\n  [BitType.reviewApprovedNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Approved review note bit, used to create notes for approved reviews',\n  },\n  [BitType.sampleSolution]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Sample solution bit, used to create sample solutions in articles or books',\n    tags: [\n      // Not sure if these are actually valid here, but include them as they are in the test bit.\n      {\n        key: ConfigKey.tag_anchor,\n        description: 'Anchor for the sample solution, used to link to the solution',\n      },\n      {\n        key: ConfigKey.tag_reference,\n        description:\n          'Reference for the sample solution, used to link to the source of the solution',\n      },\n    ],\n  },\n\n  [BitType.sequence]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Sequence bit, used to create sequences in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for sequences',\n      },\n    ],\n    cardSet: CardSetConfigKey.elements,\n    rootExampleType: ExampleType.boolean,\n  },\n  [BitType.stillImageFilm]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Still image film bit, used to create still image films in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for still image films, used to define additional properties',\n      },\n      {\n        // Combo resource\n\n        key: ConfigKey.group_resourceStillImageFilm,\n        description: 'Resource still image film tags, used to attach still image films to the bit',\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.stillImageFilmEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Still image film embed bit, used to embed still image films in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for still image films, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceStillImageFilmEmbed,\n        description:\n          'Resource still image film embed tags, used to attach still image films to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.stillImageFilmLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Still image film link bit, used to create still image film links in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for still image films, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceStillImageFilmLink,\n        description:\n          'Resource still image film link tags, used to attach still image films to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.surveyAnonymous]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Anonymous survey bit, used to create anonymous surveys in articles or books',\n  },\n  [BitType.survey]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Survey bit, used to create surveys in articles or books',\n  },\n  [BitType.surveyMatrix]: {\n    since: '1.6.2',\n    baseBitType: BitType.image,\n    description: 'Survey matrix bit, used to create survey matrices in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_pointerTop,\n        description: 'Pointer for the top of the survey matrix, used to define the top label',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: 1,\n      },\n      {\n        key: ConfigKey.property_pointerLeft,\n        description: 'Pointer for the left of the survey matrix, used to define the left label',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: 1,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button in the survey matrix, used to define the button text',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: 1,\n      },\n    ],\n  },\n  [BitType.surveyMatrixMe]: {\n    since: '1.6.2',\n    baseBitType: BitType.surveyMatrix,\n    description:\n      'Survey matrix me bit, used to create personal survey matrices in articles or books',\n  },\n  [BitType.surveyRating]: {\n    since: '1.6.0',\n    baseBitType: BitType._standard,\n    description: 'Survey rating bit, used to create rating surveys in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_ratingLevelStart,\n        jsonKey: 'ratingLevelStart.level',\n        description: 'Start level for the rating survey, used to define the lowest rating',\n        format: TagFormat.number,\n        chain: [\n          {\n            key: ConfigKey.property_label,\n            description:\n              'Label for the start level of the rating survey, used to define the text displayed',\n            format: TagFormat.bitmarkText,\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_ratingLevelEnd,\n        jsonKey: 'ratingLevelEnd.level',\n        description: 'End level for the rating survey, used to define the highest rating',\n        format: TagFormat.number,\n        chain: [\n          {\n            key: ConfigKey.property_label,\n            description:\n              'Label for the end level of the rating survey, used to define the text displayed',\n            format: TagFormat.bitmarkText,\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_ratingLevelSelected,\n        description: 'Selected level for the rating survey, used to define the default rating',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button in the rating survey, used to define the button text',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.surveyRatingOnce]: {\n    since: '1.6.0',\n    baseBitType: BitType.surveyRating,\n    description:\n      'Survey rating once bit, used to create one-time rating surveys in articles or books',\n  },\n  [BitType.surveyRatingDisplay]: {\n    since: '1.6.0',\n    baseBitType: BitType.surveyRating,\n    description: 'Survey rating display bit, used to display rating surveys in articles or books',\n  },\n  [BitType.scorm]: {\n    since: '1.5.11',\n    baseBitType: BitType._standard,\n    description: 'SCORM bit, used to embed SCORM content in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_scormSource,\n        description: 'Source for the SCORM content, used to define the SCORM package URL',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_posterImage,\n        description: 'Poster image for the SCORM content, used to display a preview image',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pronunciationTable]: {\n    since: '3.1.0',\n    baseBitType: BitType._standard,\n    description:\n      'Pronunciation table bit, used to create pronunciation tables in articles or books',\n\n    cardSet: CardSetConfigKey.pronunciationTable,\n  },\n  [BitType.table]: {\n    since: '1.5.19',\n    baseBitType: BitType._standard,\n    description: 'Table bit, used to create tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_caption,\n        description: 'Caption for the table, used to define the title of the table',\n        format: TagFormat.bitmarkText,\n      },\n      {\n        key: ConfigKey.property_tableFixedHeader,\n        description: 'Fixed header for the table, used to keep the header visible while scrolling',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tableHeaderWhitespaceNoWrap,\n        description: 'No wrap for table header whitespace, used to prevent header text wrapping',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tableSearch,\n        description:\n          'Search functionality for the table, used to enable searching within the table',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tableSort,\n        description: 'Sorting functionality for the table, used to enable sorting of table columns',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tablePagination,\n        description: 'Pagination for the table, used to limit the number of rows displayed at once',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tablePaginationLimit,\n        description: 'Pagination limit for the table, used to define the number of rows per page',\n        format: TagFormat.number,\n        defaultValue: '0',\n      },\n      {\n        key: ConfigKey.property_tableHeight,\n        description: 'Height for the table, used to define the height of the table in pixels',\n        format: TagFormat.number,\n        defaultValue: '0',\n      },\n      {\n        key: ConfigKey.property_tableWhitespaceNoWrap,\n        description: 'No wrap for table whitespace, used to prevent text wrapping in table cells',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tableAutoWidth,\n        description: 'Auto width for table columns, used to automatically adjust column widths',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_tableResizableColumns,\n        description: 'Resizable columns for the table, used to allow users to resize table columns',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tableColumnMinWidth,\n        description: 'Minimum width for table columns, used to define the minimum width of columns',\n        format: TagFormat.number,\n        defaultValue: '0',\n      },\n    ],\n    cardSet: CardSetConfigKey.table,\n  },\n  [BitType.tableExtended]: {\n    since: '4.14.0',\n    baseBitType: BitType.table,\n    description: 'Extended table bit, used to create complex tables with all HTML table features',\n    cardSet: CardSetConfigKey.tableExtended,\n  },\n  [BitType.tableExtendedImage]: {\n    since: '5.13.0',\n    baseBitType: BitType.tableExtended,\n    description:\n      'Extended table image bit, used to create complex tables with images and all HTML table features',\n    tags: [\n      {\n        key: ConfigKey.property_caption,\n        description: 'Caption for the table image, used to provide a description for the image',\n        format: TagFormat.bitmarkText,\n      },\n      {\n        key: ConfigKey.resource_backgroundWallpaper,\n        description: 'Background wallpaper for the image, used to set a background for the image',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common resource image tags for images',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for images, used to define additional properties for images',\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for images, used to attach images to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.tableAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.table,\n    description: 'Alternative table bit, used to create alternative tables in articles or books',\n  },\n  [BitType.standardTableNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.table,\n    description:\n      'Standard normative table bit, used to create standard normative tables in articles or books',\n  },\n  [BitType.standardTableNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.table,\n    description:\n      'Standard non-normative table bit, used to create standard non-normative tables in articles or books',\n  },\n  [BitType.standardRemarkTableNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.table,\n    description:\n      'Standard normative remark table bit, used to create standard normative remark tables in articles or books',\n  },\n  [BitType.standardRemarkTableNonNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.table,\n    description:\n      'Standard non-normative remark table bit, used to create standard non-normative remark tables in articles or books',\n  },\n  [BitType.smartStandardTableNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableNormative,\n    description:\n      'Smart standard normative table bit, used to create smart standard normative tables in articles or books',\n  },\n  [BitType.smartStandardTableNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableNonNormative,\n    description:\n      'Smart standard non-normative table bit, used to create smart standard non-normative tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableNormative,\n    description:\n      'Smart standard normative remark table bit, used to create smart standard normative remark tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableNonNormative,\n    description:\n      'Smart standard non-normative remark table bit, used to create smart standard non-normative remark tables in articles or books',\n  },\n  [BitType.smartStandardTableNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardTableNormative,\n    description:\n      'Collapsible smart standard normative table bit, used to create collapsible smart standard normative tables in articles or books',\n  },\n  [BitType.smartStandardTableNonNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardTableNonNormative,\n    description:\n      'Collapsible smart standard non-normative table bit, used to create collapsible smart standard non-normative tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardRemarkTableNormative,\n    description:\n      'Collapsible smart standard normative remark table bit, used to create collapsible smart standard normative remark tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableNonNormativeCollapsible]: {\n    since: '1.28.0',\n    baseBitType: BitType.smartStandardRemarkTableNonNormative,\n    description:\n      'Collapsible smart standard non-normative remark table bit, used to create collapsible smart standard non-normative remark tables in articles or books',\n  },\n  [BitType.parameters]: {\n    since: '1.18.0',\n    baseBitType: BitType.table,\n    description: 'Parameters bit, used to create parameter tables in articles or books',\n  },\n  [BitType.toc]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Table of contents bit, used to create a table of contents in articles or books',\n  },\n  [BitType.tocChapter]: {\n    since: '1.5.5',\n    baseBitType: BitType.toc,\n    description: 'Table of contents chapter bit, used to create chapters in the table of contents',\n    tags: [\n      {\n        key: ConfigKey.property_maxDisplayLevel,\n        description: 'Maximum display level for the chapter in the table of contents',\n        format: TagFormat.number,\n      },\n    ],\n  },\n  [BitType.tocInline]: {\n    since: '3.24.0',\n    baseBitType: BitType.toc,\n    description:\n      'Inline table of contents bit, used to create inline tables of contents in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_maxTocChapterLevel,\n        description: 'Maximum chapter level for the inline table of contents',\n        format: TagFormat.number,\n      },\n    ],\n  },\n  [BitType.tocResource]: {\n    since: '3.31.0',\n    baseBitType: BitType.toc,\n    description:\n      'Table of contents resource bit, used to create resources in the table of contents',\n    tags: [\n      {\n        key: ConfigKey.property_tocResource,\n        description: 'Resource content for the table of contents, used to define the resource',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description:\n          'Caption for the button in the table of contents resource, used to define the text displayed on the button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.tocContent]: {\n    since: '3.31.0',\n    baseBitType: BitType.toc,\n    description:\n      'Table of contents content bit, used to create content sections in the table of contents',\n    tags: [\n      {\n        key: ConfigKey.property_tocContent,\n        description: 'Content for the table of contents, used to define the content section',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description:\n          'Caption for the button in the table of contents content, used to define the text displayed on the button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.anchor]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Anchor bit, used to create anchors in articles or books',\n  },\n  [BitType.bitBookEnding]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bit book ending bit, used to create endings in articles or books',\n  },\n  [BitType.bitBookSummary]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bit book summary bit, used to create summaries in articles or books',\n  },\n  [BitType.botActionAnnounce]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bot action announce bit, used to create announcements in articles or books',\n  },\n  [BitType.botActionRatingNumber]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Bot action rating number bit, used to create rating number actions in articles or books',\n  },\n  [BitType.botActionRemind]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bot action remind bit, used to create reminders in articles or books',\n  },\n  [BitType.botActionSave]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bot action save bit, used to create save actions in articles or books',\n  },\n  [BitType.botActionTrueFalse]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Bot action true/false bit, used to create true/false actions in articles or books',\n  },\n  [BitType.chapterSubjectMatter]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Chapter subject matter bit, used to create subject matter chapters in articles or books',\n  },\n  [BitType.chat]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Chat bit, used to create chat sections in articles or books',\n  },\n  [BitType.conclusion]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Conclusion bit, used to create conclusions in articles or books',\n  },\n  [BitType.conclusionAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.conclusion,\n    description:\n      'Alternative conclusion bit, used to create alternative conclusions in articles or books',\n  },\n  [BitType.documentUpload]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Document upload bit, used to create document upload sections in articles or books',\n  },\n  [BitType.footNote]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Footnote bit, used to create footnotes in articles or books',\n  },\n  [BitType.formFreeText]: {\n    since: '5.3.0',\n    baseBitType: BitType.interview,\n    description: 'Form free text bit, used to create free text forms in articles or books',\n  },\n  [BitType.groupBorn]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Group born bit, used to create group born sections in articles or books',\n  },\n  [BitType.groupDied]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Group died bit, used to create group died sections in articles or books',\n  },\n  [BitType.recordAudio]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Record audio bit, used to create audio recording sections in articles or books',\n  },\n  [BitType.recordVideo]: {\n    since: '1.5.24',\n    baseBitType: BitType._standard,\n    description: 'Record video bit, used to create video recording sections in articles or books',\n  },\n  [BitType.stickyNote]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Sticky note bit, used to create sticky notes in articles or books',\n  },\n  [BitType.takePicture]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Take picture bit, used to create picture taking sections in articles or books',\n  },\n  [BitType.handInAudio]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description: 'Hand in audio bit, used to create audio submission sections in articles or books',\n  },\n  [BitType.handInContact]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description:\n      'Hand in contact bit, used to create contact submission sections in articles or books',\n  },\n  [BitType.handInDocument]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description:\n      'Hand in document bit, used to create document submission sections in articles or books',\n  },\n  [BitType.handInFile]: {\n    //\n    since: '3.2.0',\n    baseBitType: BitType._standard,\n    description: 'Hand in file bit, used to create file submission sections in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_handInAcceptFileType,\n        description:\n          'Accepted file types for the hand-in file, used to define allowed file formats',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.handInFreeText]: {\n    since: '5.3.0',\n    baseBitType: BitType.interview,\n    description:\n      'Hand in free text bit, used to create free text submission sections in articles or books',\n  },\n  [BitType.handInFreeTextExpert]: {\n    since: '5.3.0',\n    baseBitType: BitType.interview,\n    description:\n      'Hand in free text expert bit, used to create free text expert submission sections in articles or books',\n  },\n  [BitType.handInLocation]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description:\n      'Hand in location bit, used to create location submission sections in articles or books',\n  },\n  [BitType.handInPhoto]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description: 'Hand in photo bit, used to create photo submission sections in articles or books',\n  },\n  [BitType.handInScan]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description: 'Hand in scan bit, used to create scan submission sections in articles or books',\n  },\n  [BitType.handInSystemMedia]: {\n    //\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description:\n      'Hand in system media bit, used to create system media submission sections in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_handInAcceptFileType,\n        description:\n          'Accepted file types for the hand-in system media, used to define allowed file formats',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.handInSubmit]: {\n    //\n    since: '3.2.0',\n    baseBitType: BitType._standard,\n    description: 'Hand in submit bit, used to create submission sections in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_handInRequirement,\n        description: 'Requirement for the hand-in submission, used to define what is needed',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_handInInstruction,\n        description: 'Instruction for the hand-in submission, used to guide the user',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description:\n          'Caption for the button in the hand-in submission, used to define the button text',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.handInVideo]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description: 'Hand in video bit, used to create video submission sections in articles or books',\n  },\n  [BitType.handInVoice]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description: 'Hand in voice bit, used to create voice submission sections in articles or books',\n  },\n  [BitType.trueFalse1]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'True/False bit, used to create true/false questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for true/false questions',\n      },\n      {\n        key: ConfigKey.property_labelTrue,\n        description: 'Label for the true option in the true/false question',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_labelFalse,\n        description: 'Label for the false option in the true/false question',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.tag_true,\n        description: 'Tag for the true option in the true/false question',\n      },\n      {\n        key: ConfigKey.tag_false,\n        description: 'Tag for the false option in the true/false question',\n      },\n    ],\n    rootExampleType: ExampleType.boolean,\n  },\n\n  [BitType.trueFalse]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'True/False bit, used to create true/false questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for true/false questions',\n      },\n      {\n        key: ConfigKey.property_labelTrue,\n        description: 'Label for the true option in the true/false question',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_labelFalse,\n        description: 'Label for the false option in the true/false question',\n        format: TagFormat.plainText,\n      },\n    ],\n    cardSet: CardSetConfigKey.statements,\n  },\n  [BitType.vendorAmcharts5Chart]: {\n    since: '1.5.8',\n    baseBitType: BitType.code,\n    description: 'AmCharts 5 chart bit, used to embed AmCharts 5 charts in articles or books',\n\n    textFormatDefault: TextFormat.json,\n  },\n  [BitType.vendorDatadogDashboard]: {\n    since: '5.2.0',\n    baseBitType: BitType.nonProductionPrototypeIframe,\n    description: 'A Datadog dashboard bit, used to embed Datadog dashboards',\n  },\n  [BitType.vendorDatadogDashboardEmbed]: {\n    since: '3.12.0',\n    baseBitType: BitType.code,\n    description:\n      'Datadog dashboard embed bit, used to embed Datadog dashboards in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_vendorDashboardId,\n        description:\n          'Dashboard ID for the Datadog dashboard, used to define which dashboard to embed',\n        format: TagFormat.plainText,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorFormbricksEmbed]: {\n    since: '3.8.0',\n    baseBitType: BitType.code,\n    description: 'Formbricks embed bit, used to embed Formbricks surveys in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_vendorSurveyId,\n        description: 'Survey ID for the Formbricks survey, used to define which survey to embed',\n        format: TagFormat.plainText,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorFormbricksEmbedAnonymous]: {\n    since: '3.9.0',\n    baseBitType: BitType.vendorFormbricksEmbed,\n    description:\n      'Anonymous Formbricks embed bit, used to embed anonymous Formbricks surveys in articles or books',\n  },\n  [BitType.vendorFormbricksLink]: {\n    since: '3.8.0',\n    baseBitType: BitType.code,\n    description:\n      'Formbricks link bit, used to create links to Formbricks surveys in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_vendorSurveyId,\n        description: 'Survey ID for the Formbricks survey, used to define which survey to link to',\n        format: TagFormat.plainText,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorFormbricksLinkAnonymous]: {\n    since: '3.9.0',\n    baseBitType: BitType.vendorFormbricksLink,\n    description:\n      'Anonymous Formbricks link bit, used to create links to anonymous Formbricks surveys in articles or books',\n  },\n  [BitType.vendorHighchartsChart]: {\n    since: '1.5.28',\n    baseBitType: BitType.vendorAmcharts5Chart,\n    description: 'Highcharts chart bit, used to embed Highcharts charts in articles or books',\n  },\n  [BitType.vendorIframelyEmbed]: {\n    since: '1.5.10',\n    baseBitType: BitType.code,\n    description:\n      'Iframely embed bit, used to embed content from various sources in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_width, // Same as image\n        description: 'Width for the embedded content, used to define the width in pixels',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_height, // Same as image\n        description: 'Height for the embedded content, used to define the height in pixels',\n        format: TagFormat.number,\n      },\n      {\n        key: ConfigKey.property_vendorUrl,\n        description: 'URL for the content to be embedded, used to define the source URL',\n        format: TagFormat.plainText,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorIframelyCard]: {\n    since: '1.5.10',\n    baseBitType: BitType.vendorIframelyEmbed,\n    description:\n      'Iframely card bit, used to create cards for embedded content in articles or books',\n  },\n  [BitType.vendorIframelyPreview]: {\n    since: '1.5.10',\n    baseBitType: BitType.vendorIframelyEmbed,\n    description:\n      'Iframely preview bit, used to create previews for embedded content in articles or books',\n  },\n  [BitType.vendorIframelyPreviewMini]: {\n    since: '1.5.10',\n    baseBitType: BitType.vendorIframelyEmbed,\n    description:\n      'Iframely preview mini bit, used to create mini previews for embedded content in articles or books',\n  },\n  [BitType.vendorJupyterOutput]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'Jupyter output bit, used to embed Jupyter notebook outputs in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_jupyterId,\n        description: 'Jupyter ID for the notebook, used to define which notebook to embed',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_jupyterExecutionCount,\n        description: 'Execution count for the Jupyter output, used to define the execution order',\n        format: TagFormat.number,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorJupyterCellCode]: {\n    since: '1.4.3',\n    baseBitType: BitType.vendorJupyterOutput,\n    description:\n      'Jupyter cell code bit, used to embed Jupyter notebook cell code in articles or books',\n  },\n  [BitType.vendorJupyterCellMarkdown]: {\n    since: '1.4.3',\n    baseBitType: BitType.vendorJupyterOutput,\n    description:\n      'Jupyter cell markdown bit, used to embed Jupyter notebook cell markdown in articles or books',\n  },\n  [BitType.vendorJupyterCellRaw]: {\n    since: '1.4.3',\n    baseBitType: BitType.vendorJupyterOutput,\n    description:\n      'Jupyter cell raw bit, used to embed Jupyter notebook cell raw content in articles or books',\n  },\n  [BitType.vendorJupyterIpynb]: {\n    since: '1.4.3',\n    baseBitType: BitType.vendorJupyterOutput,\n    description: 'Jupyter IPYNB bit, used to embed Jupyter notebook files in articles or books',\n  },\n  [BitType.vendorPadletEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType.code,\n    description: 'Padlet embed bit, used to embed Padlet boards in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_padletId,\n        description: 'Padlet ID for the board, used to define which Padlet to embed',\n        format: TagFormat.plainText,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorStripePricingTable]: {\n    since: '1.20.0',\n    baseBitType: BitType.article,\n    description:\n      'Stripe pricing table bit, used to embed Stripe pricing tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_stripePricingTableId,\n        description: 'Stripe pricing table ID, used to define which pricing table to embed',\n        format: TagFormat.plainText,\n        minCount: 1,\n      },\n      {\n        key: ConfigKey.property_stripePublishableKey,\n        description: 'Stripe publishable key, used to authenticate the Stripe pricing table',\n        format: TagFormat.plainText,\n        minCount: 1,\n      },\n    ],\n  },\n  [BitType.vendorStripePricingTableExternal]: {\n    since: '3.13.0',\n    baseBitType: BitType.vendorStripePricingTable,\n    description:\n      'External Stripe pricing table bit, used to embed external Stripe pricing tables in articles or books',\n  },\n\n  [BitType.video]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Video bit, used to embed videos in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for videos, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceVideo,\n        description: 'Resource video tags, used to attach videos to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.videoLandscape]: {\n    since: '1.3.0',\n    baseBitType: BitType.video,\n    description: 'Landscape video bit, used to embed landscape videos in articles or books',\n  },\n  [BitType.videoPortrait]: {\n    since: '1.3.0',\n    baseBitType: BitType.video,\n    description: 'Portrait video bit, used to embed portrait videos in articles or books',\n  },\n  [BitType.videoEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Video embed bit, used to embed videos from external sources in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for video embeds, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceVideoEmbed,\n        description: 'Resource video embed tags, used to attach video embeds to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.videoEmbedLandscape]: {\n    since: '1.3.0',\n    baseBitType: BitType.videoEmbed,\n    description:\n      'Landscape video embed bit, used to embed landscape videos from external sources in articles or books',\n  },\n  [BitType.videoEmbedPortrait]: {\n    since: '1.3.0',\n    baseBitType: BitType.videoEmbed,\n    description:\n      'Portrait video embed bit, used to embed portrait videos from external sources in articles or books',\n  },\n  [BitType.videoLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Video link bit, used to create links to videos in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for video links, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceVideoLink,\n        description: 'Resource video link tags, used to attach video links to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.videoLinkLandscape]: {\n    since: '1.3.0',\n    baseBitType: BitType.videoLink,\n    description:\n      'Landscape video link bit, used to create links to landscape videos in articles or books',\n  },\n  [BitType.videoLinkPortrait]: {\n    since: '1.3.0',\n    baseBitType: BitType.videoLink,\n    description:\n      'Portrait video link bit, used to create links to portrait videos in articles or books',\n  },\n  [BitType.websiteLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Website link bit, used to create links to websites in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for website links, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceWebsiteLink,\n        description: 'Resource website link tags, used to attach website links to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.nonProductionPrototypeIframe]: {\n    since: '4.20.0',\n    baseBitType: BitType._standard,\n    description: 'A non-production prototype iframe bit, used to embed prototype iframes',\n    tags: [\n      {\n        key: ConfigKey.property_iframeSrc,\n        description: 'Iframe source URL, used to define the source of the iframe',\n        minCount: 1,\n      },\n      {\n        key: ConfigKey.property_iframeName,\n        description: 'Iframe name, used to define the name of the iframe',\n      },\n    ],\n  },\n  [BitType.vendorLearndashEmbed]: {\n    since: '5.0.0',\n    baseBitType: BitType.nonProductionPrototypeIframe,\n    description: 'Learndash embed bit, used to embed Learndash content in an iframe',\n  },\n};\n\nexport { BITS };\n","// This file is automatically generated. DO NOT EDIT.\n\n/* eslint-disable */\n\nexport const PACKAGE_INFO = {\n  \"name\": \"@gmb/bitmark-parser-generator\",\n  \"version\": \"5.20.0\",\n  \"author\": \"Get More Brain Ltd\",\n  \"license\": \"ISC\",\n  \"description\": \"A bitmark parser and generator using Peggy.js\"\n};\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst Environment = {\n  unknown: '',\n  node: 'node',\n  chrome: 'chrome',\n  safari: 'safari',\n  firefox: 'firefox',\n  edge: 'edge',\n  ie: 'ie',\n} as const;\n\nexport type EnvironmentType = EnumType<typeof Environment>;\n\nexport { Environment };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst Os = {\n  unknown: '',\n  macos: 'macos',\n  windows: 'windows',\n  linux: 'linux',\n  android: 'android',\n  ios: 'ios',\n} as const;\n\nexport type OsType = EnumType<typeof Os>;\n\nexport { Os };\n","import { Environment, type EnvironmentType } from './Environment.ts';\nimport { Os, type OsType } from './Os.ts';\n\nexport interface UserAgentInfo {\n  browser: EnvironmentType;\n  browserVersion?: string;\n  os: OsType;\n  osVersion?: string;\n}\n\ninterface TokenizedUserAgent {\n  keys: Set<string>;\n  versions: {\n    [key: string]: string;\n  };\n}\n\nfunction parseUserAgent(): UserAgentInfo | undefined {\n  if (typeof window === 'undefined' || !window.navigator || !window.navigator.userAgent)\n    return undefined;\n\n  const uai: UserAgentInfo = {\n    browser: Environment.unknown,\n    os: Os.unknown,\n  };\n\n  const userAgent = window.navigator.userAgent;\n  const tua = tokenizeUserAgent(userAgent);\n\n  // const containsIphoneIpadIpod = tua.keys.has('iphone') || tua.keys.has('ipad') || tua.keys.has('ipod');\n  // const containsMobi = tua.keys.has('mobi');\n  const containsFirefox = tua.keys.has('firefox');\n  // const containsSeamonkey = tua.keys.has('seamonkey');\n  const containsChrome = tua.keys.has('chrome');\n  const containsChromium = tua.keys.has('chromium');\n  const containsSafari = tua.keys.has('safari');\n  // const containsOperaOPR = tua.keys.has('opera') || tua.keys.has('opr');\n  // const containsTridentMSIE = tua.keys.has('trident') || tua.keys.has('msie');\n  const containsMacintosh = tua.keys.has('macintosh');\n\n  const isSafari = containsSafari && !containsChrome && !containsChromium;\n  const isChrome = containsChrome;\n  // const isChromium = containsChromium && !containsChrome;\n  const isFirefox = containsFirefox;\n  // const isSeamonkey = containsSeamonkey && !containsFirefox;\n  // const isOpera = containsOperaOPR;\n  // const isIE = containsTridentMSIE;\n  // const isMobileOrTablet = containsMobi;\n  // const isIOS = containsIphoneIpadIpod;\n  const isMacOS = containsMacintosh;\n\n  // Browser\n  if (isSafari) {\n    uai.browser = Environment.safari;\n    uai.browserVersion = tua.versions.version;\n  } else if (isChrome) {\n    uai.browser = Environment.chrome;\n    uai.browserVersion = tua.versions.chrome;\n  } else if (isFirefox) {\n    uai.browser = Environment.firefox;\n    uai.browserVersion = tua.versions.firefox;\n  }\n\n  // OS\n  if (isMacOS) {\n    uai.os = Os.macos;\n    uai.osVersion = tua.versions.x;\n  }\n\n  return uai;\n}\n\nfunction tokenizeUserAgent(userAgent: string): TokenizedUserAgent {\n  const rawKeys = userAgent\n    .toLowerCase()\n    .split(new RegExp('[ /,;()]', 'g'))\n    .reduce((acc, val) => {\n      if (val) acc.push(val);\n      return acc;\n    }, [] as string[]);\n\n  const tua: TokenizedUserAgent = {\n    keys: new Set(),\n    versions: {},\n  };\n\n  let prevRawKey = '';\n  for (let i = 0, len = rawKeys.length; i < len; i++) {\n    const rawKey = rawKeys[i];\n\n    let isNumber = false;\n    for (let i = 0; i <= 9; i++) {\n      if (rawKey.startsWith(`${i}`)) {\n        isNumber = true;\n        break;\n      }\n    }\n    if (isNumber) {\n      tua.versions[prevRawKey] = rawKey.replace('_', '.');\n    } else {\n      tua.keys.add(rawKey);\n    }\n    prevRawKey = rawKey;\n  }\n\n  return tua;\n}\n\nexport { parseUserAgent };\n","export interface Version {\n  full: string;\n  major: string;\n  minor: string;\n  patch: string;\n  build: string;\n}\n\nconst EMPTY_VERSION: Version = {\n  full: '',\n  major: '',\n  minor: '',\n  patch: '',\n  build: '',\n};\n\nexport { EMPTY_VERSION };\n","import { Environment, type EnvironmentType } from './Environment.ts';\nimport { Os, type OsType } from './Os.ts';\nimport { parseUserAgent, type UserAgentInfo } from './userAgent.ts';\nimport { EMPTY_VERSION, type Version } from './Version.ts';\n\ndeclare const process: {\n  env: { [key: string]: string };\n  version?: string;\n  versions?: { [key: string]: string };\n};\n\nclass Env {\n  public bootTimestamp: number;\n  public app: string;\n  public appVersion: Version;\n  public environment: EnvironmentType;\n  public environmentVersion: Version;\n  public os: OsType;\n  public osVersion: Version;\n  public isBrowser: boolean;\n  public isNode: boolean;\n  public isCI: boolean;\n  public NODE_ENV: string;\n\n  // public username: string;\n  // public usergroup: string;\n  // public uid: number;\n  // public gid: number;\n  // public homedir: string;\n  // public shell: string;\n\n  private userAgentInfo: UserAgentInfo | undefined;\n\n  constructor() {\n    Object.defineProperty(this, 'userAgentInfo', {\n      value: parseUserAgent(),\n      enumerable: false,\n    });\n    this.bootTimestamp = Date.now();\n    this.app = '';\n    this.appVersion = EMPTY_VERSION;\n    this.environment = this.getEnvironment();\n    this.environmentVersion = this.getEnvironmentVersion();\n    this.isBrowser = this.getIsBrowser();\n    this.isNode = this.environment === Environment.node;\n    this.isCI = this.getIsCI();\n    this.NODE_ENV = this.getNodeEnv();\n    this.os = this.getOs();\n    this.osVersion = this.getOsVersion();\n  }\n\n  public init(app: string, version: string): void {\n    this.app = app;\n    this.appVersion = this.parseMMBVersion(version);\n  }\n\n  get upTimestamp(): number {\n    return Date.now() - this.bootTimestamp;\n  }\n\n  private getEnvironment(): EnvironmentType {\n    if (this.userAgentInfo) {\n      return this.userAgentInfo.browser;\n    } else if (typeof process !== 'undefined') {\n      if (process.versions !== undefined) {\n        if (process.versions.node) return Environment.node;\n      }\n    }\n\n    return Environment.unknown;\n  }\n\n  private getEnvironmentVersion(): Version {\n    if (this.userAgentInfo) {\n      return this.parseMMBVersion(this.userAgentInfo.browserVersion);\n    } else if (typeof process !== 'undefined') {\n      return this.parseMMBVersion(process.version);\n    }\n    return EMPTY_VERSION;\n  }\n\n  private getOs(): OsType {\n    if (this.userAgentInfo) {\n      return this.userAgentInfo.os;\n    } else if (typeof process !== 'undefined') {\n      if (process.versions !== undefined) {\n        if (process.versions.node) return Os.unknown;\n      }\n    }\n\n    return Os.unknown;\n  }\n\n  private getOsVersion(): Version {\n    if (this.userAgentInfo) {\n      return this.parseMMBVersion(this.userAgentInfo.osVersion);\n    } else if (typeof process !== 'undefined') {\n      return this.parseMMBVersion('');\n    }\n    return EMPTY_VERSION;\n  }\n\n  private getIsBrowser(): boolean {\n    return !!(\n      typeof window !== 'undefined' &&\n      typeof document !== 'undefined' &&\n      typeof navigator !== 'undefined' &&\n      navigator.userAgent\n    );\n  }\n\n  private getIsCI(): boolean {\n    return !!(typeof process !== 'undefined' && process.env && process.env.CI);\n  }\n\n  private getNodeEnv(): string {\n    return (typeof process !== 'undefined' && process.env && process.env.NODE_ENV) || '';\n  }\n\n  /**\n   * TODO:\n   * Parse Senver 2.0 ?? https://semver.org/\n   * and X.Y.Z.B using regex\n   *\n   * @param version\n   */\n  private parseMMBVersion(version?: string): Version {\n    if (!version) return EMPTY_VERSION;\n\n    // Remove leading v\n    if (version.startsWith('v')) {\n      version = version.substring(1);\n    }\n\n    // Parse major/minor/build\n    const s = version.split('.', 1000);\n    let major = '';\n    let minor = '';\n    let build = '';\n    let patch = '';\n    for (let i = 0, len = s.length; i < len; i++) {\n      const v = s[i];\n      if (i === 0) major = v;\n      else if (i === 1) minor = v;\n      else if (i === 2) patch = v;\n      else if (i === 3) build = v;\n    }\n\n    return {\n      full: version,\n      major,\n      minor,\n      patch,\n      build,\n    };\n  }\n}\n\nconst env = new Env();\nconst initEnv = env.init.bind(env);\n\nexport { env, initEnv };\n","import '../config/Config.ts';\n\nimport { PACKAGE_INFO } from '../generated/package_info.ts';\nimport { initEnv } from '../utils/env/Env.ts';\n\nlet initialised = false;\n\n// Initialise the application\nfunction init(): void {\n  if (initialised) return;\n\n  initEnv(PACKAGE_INFO.name, PACKAGE_INFO.version);\n\n  initialised = true;\n}\n\nexport { init };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { init } from '../init/init.ts';\nimport { type BitmarkAst, type Node } from '../model/ast/Nodes.ts';\nimport { NodeType, type NodeTypeType } from '../model/ast/NodeType.ts';\nimport { StringUtils } from '../utils/StringUtils.ts';\n\n/**\n * AST tree node information\n */\nexport interface NodeInfo {\n  /**\n   * Child index of the node\n   */\n  index: number;\n  /**\n   * Node key\n   */\n  key: NodeTypeType;\n  /**\n   * Node value (if any)\n   */\n  value?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\n/**\n * Callbacks for walking the AST\n */\nexport interface AstWalkCallbacks<C = undefined> {\n  /**\n   * Called when a branch node is entered\n   *\n   * @param node - this node info\n   * @param route - route to this node from the root\n   * @returns\n   */\n  enter?: (node: NodeInfo, route: NodeInfo[], context: C) => void | boolean;\n\n  /**\n   * Called when between child nodes\n   *\n   * @param node - this node info (the parent of the children in leftNode / rightNode)\n   * @param leftNode - the left (previous) child node info\n   * @param rightNode - the right (next) child node info\n   * @param route\n   * @returns\n   */\n  between?: (\n    node: NodeInfo,\n    leftNode: NodeInfo,\n    rightNode: NodeInfo,\n    route: NodeInfo[],\n    context: C,\n  ) => void | boolean;\n\n  /**\n   * Called when a branch node is exited\n   * @param node - this node info\n   * @param route - route to this node from the root\n   * @returns\n   */\n  exit?: (node: NodeInfo, route: NodeInfo[], context: C) => void;\n\n  /**\n   * Called when a leaf node is entered\n   * @param node - this node info\n   * @param route - route to this node from the root\n   * @returns\n   */\n  leaf?: (node: NodeInfo, route: NodeInfo[], context: C) => void;\n}\n\n/**\n * An AST (Abstract Syntax Tree) implementation for the bitmark language\n */\nclass Ast {\n  constructor() {\n    // Ensure init has been called - this is not the best place, but there is no standard entry point\n    init();\n  }\n\n  /**\n   * Walk bitmark AST, decending each branch and calling callbacks when entering, leaving, and when in between child\n   * nodes.\n   *\n   * Walking the tree can be used to convert it to another format (e.g. bitmark markup or JSON or text) or for analysis.\n   *\n   * The tree is navigated from root to leaf, decending each branch greedily.\n   *\n   * e.g. for the tree:\n   * ```\n   * A\n   * |__B1\n   * |  |__C1\n   * |  |__C2\n   * |__B2\n   *    |__C3\n   *\n   * Enter A1\n   * Enter B1\n   * Leaf  C1\n   * Betwe B1 (C1, C2)\n   * Leaf  C2\n   * Exit  B1\n   * Betwe A1 (B1, B2)\n   * Enter B2\n   * Leaf  C3\n   * Exit  B2\n   * Exit  A1\n   * ```\n   *\n   * @param context - context object to pass to callbacks\n   * @param ast - bitmark / text AST\n   * @param type - type of AST to walk (i.e. NodeType.bitmarkAst, NodeType.textAst)\n   * @param callbacks - set of callbacks to call while walking the tree\n   */\n  walk<C>(ast: Node, type: NodeTypeType, callbacks: AstWalkCallbacks<C>, context: C): void {\n    this.walkRecursive(ast, [{ index: 0, key: type, value: ast }], callbacks, context);\n  }\n\n  /**\n   * Convert a route to a unique key that describes that route.\n   *\n   * For the route A1 -> B4 -> C2 the route key would be A1_B4_C2\n   *\n   * @param route - the tree path from the root to the curent node\n   * @returns\n   */\n  getRouteKey(route: NodeInfo[]): string {\n    return route.reduce((acc, val, idx) => {\n      if (+val.key !== val.index) {\n        acc += `${val.key}`;\n        if (idx < route.length - 1) {\n          acc += '_';\n        }\n      }\n      return acc;\n    }, '');\n  }\n\n  /**\n   * Print an AST to the console.\n   * Useful for debug / development purposes\n   *\n   * @param ast - AST\n   * @param rootKey - root node key\n   */\n  printTree(ast: Node, rootKey: NodeTypeType = NodeType.bitmarkAst): void {\n    this.walkRecursive(\n      ast,\n      [{ index: 0, key: rootKey, value: ast }],\n      {\n        enter: (_node: NodeInfo, route: NodeInfo[]): boolean => {\n          console.log('Enter:   ' + this.getRouteKey(route));\n\n          // Stop traversing the tree if the last node is bodyJson\n          if (route[route.length - 1].key === NodeType.bodyJson) return false;\n\n          return true;\n        },\n        between: (_node: NodeInfo, _left: NodeInfo, _right: NodeInfo, route: NodeInfo[]) => {\n          console.log('Between: ' + this.getRouteKey(route));\n        },\n        exit: (_node: NodeInfo, route: NodeInfo[]) => {\n          console.log('Exit:    ' + this.getRouteKey(route));\n        },\n        leaf: (_node: NodeInfo, route: NodeInfo[]) => {\n          console.log('Leaf:    ' + this.getRouteKey(route));\n        },\n      },\n      undefined,\n    );\n  }\n\n  /**\n   * Preprocess bitmark AST into a standard format (BitmarkAst object) from bitmark AST either as a string\n   * or a plain JS object\n   *\n   * @param ast - bitmark AST as a string or a plain JS object\n   * @returns bitmark AST in a standard format (BitmarkAst object)\n   */\n  preprocessAst(ast: string | unknown): BitmarkAst | undefined {\n    if (StringUtils.isString(ast)) {\n      const str = ast as string;\n      try {\n        ast = JSON.parse(str);\n      } catch (_e) {\n        // Failed to parse JSON, return empty array\n        return undefined;\n      }\n    }\n\n    if (this.isAst(ast)) {\n      return ast as BitmarkAst;\n    }\n    return undefined;\n  }\n\n  /**\n   * Check if a plain JS object is valid AST\n   *\n   * @param ast - a plain JS object that might be AST\n   * @returns true if AST, otherwise false\n   */\n  isAst(ast: unknown): boolean {\n    if (Object.prototype.hasOwnProperty.call(ast, 'bits')) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      if (Array.isArray((ast as any).bits)) return true;\n    }\n    return false;\n  }\n\n  private walkRecursive<C>(\n    node: Node,\n    route: NodeInfo[],\n    callbacks: AstWalkCallbacks<C>,\n    context: C,\n  ): void {\n    const { enter, between, exit, leaf } = callbacks;\n\n    const parentKey = route[route.length - 1].key;\n    const isValue = this.isValue(node);\n    const isBranch = !isValue;\n    const nodeInfo = route[route.length - 1];\n\n    // Call the enter callback for the node before walking children\n    if (isBranch) {\n      if (enter) {\n        const res = enter(nodeInfo, route, context);\n        // If return is false, stop walking this node\n        if (res === false) return;\n      }\n    } else {\n      if (leaf) leaf(nodeInfo, route, context);\n    }\n\n    // Walk child nodes\n    if (isBranch) {\n      const isArray = this.isArray(node);\n      const keys = Object.keys(node);\n      for (let i = 0, len = keys.length; i < len; i++) {\n        const key = keys[i];\n        const lastChild = i === len - 1;\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const nodeAsAny = node as any;\n        const child = nodeAsAny[key];\n\n        if (child != null) {\n          const childNodeInfo: NodeInfo = {\n            key: this.getAstKey(key, parentKey, isArray),\n            index: i,\n            value: child,\n          };\n\n          const r = route.slice();\n          r.push(childNodeInfo);\n          this.walkRecursive(child, r, callbacks, context);\n\n          if (!lastChild) {\n            const nextKey = keys[i + 1];\n            const nextChild = nodeAsAny[nextKey];\n            const nextChildNodeInfo: NodeInfo = {\n              key: this.getAstKey(nextKey, parentKey, isArray),\n              index: i + 1,\n              value: nextChild,\n            };\n\n            // Call the between callback when between children\n            if (between) {\n              const res = between(nodeInfo, childNodeInfo, nextChildNodeInfo, route, context);\n              // If return is false, stop looping children\n              if (res === false) break;\n            }\n          }\n        }\n      }\n    }\n\n    // Call the exit callback for the node before walking children\n    if (isBranch) {\n      if (exit) exit(nodeInfo, route, context);\n    }\n  }\n\n  private getAstKey(key: string, parentKey: string, isParentArray: boolean): NodeTypeType {\n    let astKey = key;\n\n    if (isParentArray && parentKey) {\n      astKey = `${parentKey}Value`;\n    }\n\n    // return astKey;\n    return Enum(NodeType).fromKey(astKey) || (`unknown(${astKey})` as NodeTypeType);\n    // return AstNodeType.fromKey(astKey) || AstNodeType.unknown;\n  }\n\n  private isArray(x: unknown): boolean {\n    return Array.isArray(x);\n    // return Object.prototype.toString.call(x) === '[object Array]';\n  }\n\n  private isObject(x: unknown): boolean {\n    return Object.prototype.toString.call(x) === '[object Object]';\n  }\n\n  private isValue(x: unknown): boolean {\n    return !this.isObject(x) && !this.isArray(x);\n  }\n}\n\nexport { Ast };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BodyBitTypeRaw = {\n  text: 'text',\n  gap: 'gap',\n  mark: 'mark',\n  select: 'select',\n  highlight: 'highlight',\n} as const;\n\nconst BodyBitType = BodyBitTypeRaw;\n\nexport type BodyBitTypeKeys = keyof typeof BodyBitTypeRaw;\nexport type BodyBitTypeType = EnumType<typeof BodyBitType>;\n\nexport { BodyBitType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst TextMarkType = {\n  // Styles\n  bold: 'bold',\n  light: 'light',\n  italic: 'italic',\n  highlight: 'highlight',\n  highlightOrange: 'highlightOrange',\n  highlightYellow: 'highlightYellow',\n  highlightGreen: 'highlightGreen',\n  highlightBlue: 'highlightBlue',\n  highlightPurple: 'highlightPurple',\n  highlightPink: 'highlightPink',\n  highlightBrown: 'highlightBrown',\n  highlightBlack: 'highlightBlack',\n  highlightWhite: 'highlightWhite',\n  highlightGray: 'highlightGray',\n\n  // Inline only styles\n  strike: 'strike',\n  subscript: 'subscript',\n  superscript: 'superscript',\n  ins: 'ins',\n  del: 'del',\n  underline: 'underline',\n  doubleUnderline: 'doubleUnderline',\n  circle: 'circle',\n  languageEmRed: 'languageEmRed',\n  languageEmOrange: 'languageEmOrange',\n  languageEmYellow: 'languageEmYellow',\n  languageEmGreen: 'languageEmGreen',\n  languageEmBlue: 'languageEmBlue',\n  languageEmPurple: 'languageEmPurple',\n  languageEmPink: 'languageEmPink',\n  languageEmBrown: 'languageEmBrown',\n  languageEmBlack: 'languageEmBlack',\n  languageEmWhite: 'languageEmWhite',\n  languageEmGray: 'languageEmGray',\n  languageEm: 'languageEm',\n  userUnderline: 'userUnderline',\n  userDoubleUnderline: 'userDoubleUnderline',\n  userStrike: 'userStrike',\n  userCircle: 'userCircle',\n  userHighlight: 'userHighlight',\n  notranslate: 'notranslate',\n\n  // Attribute chain\n  link: 'link',\n  ref: 'ref',\n  xref: 'xref',\n  extref: 'extref',\n  footnote: 'footnote',\n  footnoteStar: 'footnote*',\n  symbol: 'symbol',\n  var: 'var',\n  code: 'code',\n  timer: 'timer',\n  duration: 'duration',\n  color: 'color',\n  colorPicker: 'colorPicker',\n  comment: 'comment',\n} as const;\n\nexport type TextMarkTypeType = EnumType<typeof TextMarkType>;\n\nexport { TextMarkType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst TextNodeType = {\n  // Text\n  text: 'text',\n\n  // Blocks\n  hardBreak: 'hardBreak',\n  paragraph: 'paragraph',\n  heading: 'heading',\n  section: 'section',\n  noBulletList: 'noBulletList',\n  bulletList: 'bulletList',\n  orderedList: 'orderedList',\n  orderedListRoman: 'orderedListRoman',\n  orderedListRomanLower: 'orderedListRomanLower',\n  letteredList: 'letteredList',\n  letteredListLower: 'letteredListLower',\n  taskList: 'taskList',\n  listItem: 'listItem',\n  taskItem: 'taskItem',\n  image: 'image',\n  imageInline: 'imageInline',\n  codeBlock: 'codeBlock',\n\n  // Inline blocks\n  latex: 'latex',\n\n  // Body bits\n  gap: 'gap',\n  select: 'select',\n  highlight: 'highlight',\n  mark: 'mark',\n} as const;\n\nexport type TextNodeTypeType = EnumType<typeof TextNodeType>;\n\nexport { TextNodeType };\n","import { type EnumType } from '@ncoderz/superenum';\n\n/**\n * Defines the type of a node in the AST.\n * All valid node types should be defined here.\n *\n * Nodes not defined here will not be walked by the AST walker.\n *\n * @enum\n */\nconst NodeType = {\n  unknown: 'unknown', // unknown\n\n  __isDefaultExample: '__isDefaultExample',\n  __typeAlias: '__typeAlias',\n\n  action: 'action',\n  actionValue: 'actionValue',\n  activityType: 'activityType',\n  activityTypeValue: 'activityTypeValue',\n  additionalSolutions: 'additionalSolutions',\n  additionalSolutionsValue: 'additionalSolutionsValue',\n  advertisingClickUrl: 'advertisingClickUrl',\n  advertisingClickUrlValue: 'advertisingClickUrlValue',\n  ageRange: 'ageRange',\n  ageRangeValue: 'ageRangeValue',\n  aiGenerated: 'aiGenerated',\n  aiGeneratedValue: 'aiGeneratedValue',\n  alias: 'alias', // bit type (alias)\n  alignment: 'alignment',\n  allowedBit: 'allowedBit',\n  allowedBitValue: 'allowedBitValue',\n  allowPrint: 'allowPrint',\n  allowPrintValue: 'allowPrintValue',\n  alt: 'alt',\n  alternativeAnswers: 'alternativeAnswers',\n  alternativeAnswersValue: 'alternativeAnswersValue',\n  alternativeDefinitions: 'alternativeDefinitions',\n  alternativeDefinitionsValue: 'alternativeDefinitionsValue',\n  altLangTag: 'altLangTag',\n  altLangTagValue: 'altLangTagValue',\n  analyticsTag: 'analyticsTag',\n  analyticsTagValue: 'analyticsTagValue',\n  anchor: 'anchor',\n  answer: 'answer',\n  appLink: 'appLink',\n  attrs: 'attrs',\n  audio: 'audio',\n  audioEmbed: 'audioEmbed',\n  audioLink: 'audioLink',\n  author: 'author',\n  authorFullName: 'authorFullName',\n  authorFullNameValue: 'authorFullNameValue',\n  authorJobTitle: 'authorJobTitle',\n  authorJobTitleValue: 'authorJobTitleValue',\n  authorPseudonym: 'authorPseudonym',\n  authorPseudonymValue: 'authorPseudonymValue',\n  authorTitle: 'authorTitle',\n  authorTitleValue: 'authorTitleValue',\n  authorValue: 'authorValue',\n  availableClassifications: 'availableClassifications',\n  availableClassificationsValue: 'availableClassificationsValue',\n  avatarImage: 'avatarImage',\n  backgroundWallpaper: 'backgroundWallpaper',\n  backgroundWallpaperValue: 'backgroundWallpaperValue',\n  backgroundImage: 'backgroundImage',\n  backgroundImageValue: 'backgroundImageValue',\n  bitLevel: 'bitLevel', // bit level\n  bitmarkAst: 'bitmarkAst', // bitmarkAst\n  bitmarkVersion: 'bitmarkVersion',\n  bits: 'bits', // bits\n  bitsValue: 'bitsValue', // bit\n  bitType: 'bitType', // bit type\n  blockId: 'blockId',\n  blockIdValue: 'blockIdValue',\n  body: 'body',\n  bodyBit: 'bodyBit',\n  bodyBits: 'bodyBits',\n  bodyJson: 'bodyJson',\n  bodyParts: 'bodyParts',\n  bodyPartsValue: 'bodyPartsValue',\n  bodyPartText: 'bodyPartText',\n  bodyText: 'bodyText',\n  bodyValue: 'bodyValue',\n  book: 'book',\n  bookAlias: 'bookAlias',\n  bookAliasValue: 'bookAliasValue',\n  bookAuthor: 'bookAuthor',\n  bookBindingType: 'bookBindingType',\n  bookDiff: 'bookDiff',\n  bookDiffValue: 'bookDiffValue',\n  bookIsbn: 'bookIsbn',\n  bookLanguage: 'bookLanguage',\n  bookNumberOfPages: 'bookNumberOfPages',\n  bookOriginalTitle: 'bookOriginalTitle',\n  bookPublisher: 'bookPublisher',\n  bookPublishingDate: 'bookPublishingDate',\n  bookRating: 'bookRating',\n  bookSeriesId: 'bookSeriesId',\n  bookSeriesNumber: 'bookSeriesNumber',\n  bookSeriesTitle: 'bookSeriesTitle',\n  bookTranslator: 'bookTranslator',\n  bookType: 'bookType',\n  bookValue: 'bookValue',\n  bot: 'bot',\n  botResponses: 'botResponses',\n  botResponsesValue: 'botResponsesValue',\n  botValue: 'botValue',\n  brandColor: 'brandColor',\n  brandColorName: 'brandColorName',\n  brandColorNameValue: 'brandColorNameValue',\n  brandColorValue: 'brandColorValue',\n  bubbleTag: 'bubbleTag',\n  bubbleTagValue: 'bubbleTagValue',\n  buttonCaption: 'buttonCaption',\n  buttonCaptionValue: 'buttonCaptionValue',\n  callToActionUrl: 'callToActionUrl',\n  callToActionUrlValue: 'callToActionUrlValue',\n  caption: 'caption',\n  captionDefinitionList: 'captionDefinitionList',\n  captionValue: 'captionValue',\n  cardBits: 'cardBits',\n  cardBitsValue: 'cardBitsValue',\n  cardNode: 'cardNode',\n  categoryTag: 'categoryTag',\n  categoryTagValue: 'categoryTagValue',\n  cells: 'cells',\n  cellsValue: 'cellsValue',\n  chatWithBook: 'chatWithBook',\n  chatWithBookBrainKey: 'chatWithBookBrainKey',\n  chatWithBookBrainKeyValue: 'chatWithBookBrainKeyValue',\n  chatWithBookValue: 'chatWithBookValue',\n  checked: 'checked',\n  choice: 'choice',\n  choices: 'choices',\n  choicesValue: 'choicesValue',\n  citationStyle: 'citationStyle',\n  citationStyleValue: 'citationStyleValue',\n  class: 'class',\n  classification: 'classification',\n  classificationValue: 'classificationValue',\n  codeLineNumbers: 'codeLineNumbers',\n  codeLineNumbersValue: 'codeLineNumbersValue',\n  codeMinimap: 'codeMinimap',\n  codeMinimapValue: 'codeMinimapValue',\n  color: 'color',\n  colorTag: 'colorTag',\n  colorTagValue: 'colorTagValue',\n  column: 'column',\n  columns: 'columns',\n  columnsValue: 'columnsValue',\n  comment: 'comment',\n  commentedBitType: 'commentedBitType',\n  computerLanguage: 'computerLanguage',\n  computerLanguageValue: 'computerLanguageValue',\n  content: 'contentValue',\n  content2Buy: 'content2Buy',\n  contentValue: 'contentValue',\n  contentValueValue: 'contentValueValue',\n  copyright: 'copyright',\n  coverColor: 'coverColor',\n  coverColorValue: 'coverColorValue',\n  coverImage: 'coverImage',\n  coverImageValue: 'coverImageValue',\n  currency: 'currency',\n  customerExternalId: 'customerExternalId',\n  customerId: 'customerId',\n  customerIdValue: 'customerIdValue',\n  customerProductId: 'customerProductId',\n  customerProductShopLink: 'customerProductShopLink',\n  data: 'data',\n  dataValue: 'dataValue',\n  dataValueValue: 'dataValueValue',\n  date: 'date',\n  dateEnd: 'dateEnd',\n  dateEndValue: 'dateEndValue',\n  dateValue: 'dateValue',\n  decimalPlaces: 'decimalPlaces',\n  deeplink: 'deeplink',\n  deeplinkValue: 'deeplinkValue',\n  definition: 'definition',\n  definitions: 'definitions',\n  definitionsValue: 'definitionsValue',\n  diffContext: 'diffContext',\n  diffContextValue: 'diffContextValue',\n  diffOp: 'diffOp',\n  diffOpValue: 'diffOpValue',\n  diffRef: 'diffRef',\n  diffRefValue: 'diffRefValue',\n  diffTime: 'diffTime',\n  diffTimeValue: 'diffTimeValue',\n  diffTo: 'diffTo',\n  diffToValue: 'diffToValue',\n  disableCalculation: 'disableCalculation',\n  disableFeedback: 'disableFeedback',\n  disableFeedbackValue: 'disableFeedbackValue',\n  document: 'document',\n  documentDownload: 'documentDownload',\n  documentEmbed: 'documentEmbed',\n  documentLink: 'documentLink',\n  duration: 'duration',\n  durationValue: 'durationValue',\n  elements: 'elements',\n  elementsValue: 'elementsValue',\n  elementsValueValue: 'elementsValueValue',\n  emphasis: 'emphasis',\n  end: 'end',\n  enforceUpdateOverUserInput: 'enforceUpdateOverUserInput',\n  enforceUpdateOverUserInputValue: 'enforceUpdateOverUserInputValue',\n  errors: 'errors',\n  errorsValue: 'errorsValue',\n  example: 'example',\n  exampleValue: 'exampleValue',\n  externalId: 'externalId',\n  externalIdValue: 'externalIdValue',\n  externalLink: 'externalLink',\n  externalLinkText: 'externalLinkText',\n  extractorExtractionTimestamp: 'extractorExtractionTimestamp',\n  extractorExtractionTimestampValue: 'extractorExtractionTimestampValue',\n  extractorTag: 'extractorTag',\n  extractorTagValue: 'extractorTagValue',\n  extractorInternal: 'extractorInternal',\n  extractorInternalValue: 'extractorInternalValue',\n  extraProperties: 'extraProperties',\n  feedback: 'feedback',\n  feedbackEngine: 'feedbackEngine',\n  feedbackEngineValue: 'feedbackEngineValue',\n  feedbacks: 'feedbacks',\n  feedbacksValue: 'feedbacksValue',\n  feedbackType: 'feedbackType',\n  flashcards: 'flashcards',\n  flashcardSet: 'flashcardSet',\n  flashcardSetValue: 'flashcardSetValue',\n  flashcardsValue: 'flashcardsValue',\n  focusX: 'focusX',\n  focusXValue: 'focusXValue',\n  focusY: 'focusY',\n  focusYValue: 'focusYValue',\n  footer: 'footer',\n  footerText: 'footerText',\n  footerValue: 'footerValue',\n  forKeys: 'forKeys',\n  format: 'format',\n  formula: 'formula',\n  formulaValue: 'formulaValue',\n  forValues: 'forValues',\n  forValuesValue: 'forValuesValue',\n  fullName: 'fullName',\n  fullNameValue: 'fullNameValue',\n  gap: 'gap',\n  gmbExternalShop: 'gmbExternalShop',\n  gmbExternalShopItems: 'gmbExternalShopItems',\n  groupTag: 'groupTag',\n  groupTagValue: 'groupTagValue',\n  handInAcceptFileType: 'handInAcceptFileType',\n  handInAcceptFileTypeValue: 'handInAcceptFileTypeValue',\n  handInInstruction: 'handInInstruction',\n  handInInstructionValue: 'handInInstructionValue',\n  handInRequirement: 'handInRequirement',\n  handInRequirementValue: 'handInRequirementValue',\n  hasBookNavigation: 'hasBookNavigation',\n  hasBookNavigationValue: 'hasBookNavigationValue',\n  hasMarkAsDone: 'hasMarkAsDone',\n  hasMarkAsDoneValue: 'hasMarkAsDoneValue',\n  hasPrintRestriction: 'hasPrintRestriction',\n  hasPrintRestrictionValue: 'hasPrintRestrictionValue',\n  head: 'head',\n  heading: 'heading',\n  height: 'height',\n  heightValue: 'heightValue',\n  highlight: 'highlight',\n  hint: 'hint',\n  hintValue: 'hintValue',\n  href: 'href',\n  icon: 'icon',\n  iconTag: 'iconTag',\n  iconTagValue: 'iconTagValue',\n  iconValue: 'iconValue',\n  id: 'id',\n  idValue: 'idValue',\n  iframeName: 'iframeName',\n  iframeSrc: 'iframeSrc',\n  image: 'image',\n  imageFirst: 'imageFirst',\n  imageFirstValue: 'imageFirstValue',\n  imageLandscape: 'imageLandscape',\n  imageLink: 'imageLink',\n  imagePlaceholder: 'imagePlaceholder',\n  imagePlaceholderValue: 'imagePlaceholderValue',\n  imagePortrait: 'imagePortrait',\n  imageSource: 'imageSource',\n  index: 'index',\n  indexValue: 'indexValue',\n  ingredients: 'ingredients',\n  ingredientsValue: 'ingredientsValue',\n  ingredient: 'ingredient',\n  ingredientValue: 'ingredientValue',\n  instruction: 'instruction',\n  instructionValue: 'instructionValue',\n  internalComment: 'internalComment',\n  internalCommentValue: 'internalCommentValue',\n  internalPrintPdf: 'internalPrintPdf',\n  internalPrintPdfValue: 'internalPrintPdfValue',\n  isCaseSensitive: 'isCaseSensitive',\n  isCommented: 'isCommented',\n  isCorrect: 'isCorrect',\n  isEditable: 'isEditable',\n  isEditableValue: 'isEditableValue',\n  isExample: 'isExample',\n  isInfoOnly: 'isInfoOnly',\n  isInfoOnlyValue: 'isInfoOnlyValue',\n  isPlain: 'isPlain',\n  isPublic: 'isPublic',\n  isPublicValue: 'isPublicValue',\n  isTemplate: 'isTemplate',\n  isTemplateStripTheme: 'isTemplateStripTheme',\n  isTemplateStripThemeValue: 'isTemplateStripThemeValue',\n  isTemplateValue: 'isTemplateValue',\n  isTracked: 'isTracked',\n  isTrackedValue: 'isTrackedValue',\n  item: 'item',\n  itemLead: 'itemLead',\n  itemValue: 'itemValue',\n  jobTitle: 'jobTitle',\n  jobTitleValue: 'jobTitleValue',\n  jupyterExecutionCount: 'jupyterExecutionCount',\n  jupyterExecutionCountValue: 'jupyterExecutionCountValue',\n  jupyterId: 'jupyterId',\n  jupyterIdValue: 'jupyterIdValue',\n  key: 'key',\n  keyAudio: 'keyAudio',\n  keyImage: 'keyImage',\n  kind: 'kind',\n  kindValue: 'kindValue',\n  label: 'label',\n  labelFalse: 'labelFalse',\n  labelFalseValue: 'labelFalseValue',\n  labelTrue: 'labelTrue',\n  labelTrueValue: 'labelTrueValue',\n  lang: 'lang',\n  language: 'language',\n  languageValue: 'languageValue',\n  langValue: 'langValue',\n  layer: 'layer',\n  layerRole: 'layerRole',\n  layerRoleValue: 'layerRoleValue',\n  layerValue: 'layerValue',\n  lead: 'lead',\n  leadValue: 'leadValue',\n  level: 'level',\n  levelACTFL: 'levelACTFL',\n  levelACTFLValue: 'levelACTFLValue',\n  levelCEFR: 'levelCEFR',\n  levelCEFRp: 'levelCEFRp',\n  levelCEFRpValue: 'levelCEFRpValue',\n  levelCEFRValue: 'levelCEFRValue',\n  levelILR: 'levelILR',\n  levelILRValue: 'levelILRValue',\n  license: 'license',\n  line: 'line',\n  list: 'list',\n  listItemIndent: 'listItemIndent',\n  listItemIndentValue: 'listItemIndentValue',\n  listPrice: 'listPrice',\n  listValue: 'listValue',\n  location: 'location',\n  locationValue: 'locationValue',\n  machineTranslated: 'machineTranslated',\n  machineTranslatedValue: 'machineTranslatedValue',\n  mailingList: 'mailingList',\n  marginNumber: 'marginNumber',\n  marginNumberValue: 'marginNumberValue',\n  mark: 'mark',\n  markConfig: 'markConfig',\n  markConfigValue: 'markConfigValue',\n  marks: 'marks',\n  marksValue: 'marksValue',\n  markup: 'markup', // bitmark markup\n  matrix: 'matrix',\n  matrixValue: 'matrixValue',\n  maxCreatedBits: 'maxCreatedBits',\n  maxCreatedBitsValue: 'maxCreatedBitsValue',\n  maxDisplayLevel: 'maxDisplayLevel',\n  maxDisplayLevelValue: 'maxDisplayLevelValue',\n  maxTocChapterLevel: 'maxTocChapterLevel',\n  maxTocChapterLevelValue: 'maxTocChapterLevelValue',\n  message: 'message',\n  mockupId: 'mockupId',\n  name: 'name',\n  needsValidation: 'needsValidation',\n  needsValidationValue: 'needsValidationValue',\n  offset: 'offset',\n  options: 'options',\n  optionsValue: 'optionsValue',\n  original: 'original',\n  padletId: 'padletId',\n  padletIdValue: 'padletIdValue',\n  page: 'page',\n  pageNo: 'pageNo',\n  pageNoValue: 'pageNoValue',\n  pageNumber: 'pageNumber',\n  pageNumberValue: 'pageNumberValue',\n  pageValue: 'pageValue',\n  pairs: 'pairs',\n  pairsValue: 'pairsValue',\n  parent: 'parent',\n  parser: 'parser',\n  partialAnswer: 'partialAnswer',\n  partialAnswerValue: 'partialAnswerValue',\n  path: 'path',\n  pathValue: 'pathValue',\n  person: 'person',\n  platformBackgroundColor: 'platformBackgroundColor',\n  platformBackgroundColorValue: 'platformBackgroundColorValue',\n  platformBackgroundImage: 'platformBackgroundImage',\n  platformBackgroundImageValue: 'platformBackgroundImageValue',\n  platformBaseLayerColor: 'platformBaseLayerColor',\n  platformBaseLayerColorValue: 'platformBaseLayerColorValue',\n  platformBorderColor: 'platformBorderColor',\n  platformBorderColorValue: 'platformBorderColorValue',\n  platformBorderRadius: 'platformBorderRadius',\n  platformBorderRadiusValue: 'platformBorderRadiusValue',\n  platformBrandTarget: 'platformBrandTarget',\n  platformBrandTargetValue: 'platformBrandTargetValue',\n  platformButtonBackgroundColor: 'platformButtonBackgroundColor',\n  platformButtonBackgroundColorValue: 'platformButtonBackgroundColorValue',\n  platformButtonPrimaryColor: 'platformButtonPrimaryColor',\n  platformButtonPrimaryColorValue: 'platformButtonPrimaryColorValue',\n  platformIcon: 'platformIcon',\n  platformIconValue: 'platformIconValue',\n  platformLogo: 'platformLogo',\n  platformLogoMaxHeight: 'platformLogoMaxHeight',\n  platformLogoMaxHeightValue: 'platformLogoMaxHeightValue',\n  platformLogoValue: 'platformLogoValue',\n  platformMargin: 'platformMargin',\n  platformMarginValue: 'platformMarginValue',\n  platformMessageBackgroundColor: 'platformMessageBackgroundColor',\n  platformMessageBackgroundColorValue: 'platformMessageBackgroundColorValue',\n  platformName: 'platformName',\n  platformNameValue: 'platformNameValue',\n  platformNeedsShadow: 'platformNeedsShadow',\n  platformNeedsShadowValue: 'platformNeedsShadowValue',\n  platformPlaceholderColor: 'platformPlaceholderColor',\n  platformPlaceholderColorValue: 'platformPlaceholderColorValue',\n  platformPrimaryColor: 'platformPrimaryColor',\n  platformPrimaryColorValue: 'platformPrimaryColorValue',\n  platformScrollbarColor: 'platformScrollbarColor',\n  platformScrollbarColorValue: 'platformScrollbarColorValue',\n  platformSecondaryColor: 'platformSecondaryColor',\n  platformSecondaryColorValue: 'platformSecondaryColorValue',\n  platformSelectionBorderRadius: 'platformSelectionBorderRadius',\n  platformSelectionBorderRadiusValue: 'platformSelectionBorderRadiusValue',\n  platformSelectionColor: 'platformSelectionColor',\n  platformSelectionColorValue: 'platformSelectionColorValue',\n  platformSelectionTextColor: 'platformSelectionTextColor',\n  platformSelectionTextColorValue: 'platformSelectionTextColorValue',\n  platformSeparatorColor: 'platformSeparatorColor',\n  platformSeparatorColorValue: 'platformSeparatorColorValue',\n  platformTextSelectionColor: 'platformTextSelectionColor',\n  platformTextSelectionColorValue: 'platformTextSelectionColorValue',\n  pointerLeft: 'pointerLeft',\n  pointerLeftValue: 'pointerLeftValue',\n  pointerTop: 'pointerTop',\n  pointerTopValue: 'pointerTopValue',\n  posterImage: 'posterImage',\n  posterImageValue: 'posterImageValue',\n  postfix: 'postfix',\n  prefix: 'prefix',\n  previewImage: 'previewImage',\n  previewImageValue: 'previewImageValue',\n  previewVideo: 'previewVideo',\n  previewVideoValue: 'previewVideoValue',\n  printParentChapterLevel: 'printParentChapterLevel',\n  printParentChapterLevelValue: 'printParentChapterLevelValue',\n  processHandIn: 'processHandIn',\n  processHandInLocation: 'processHandInLocation',\n  processHandInLocationValue: 'processHandInLocationValue',\n  processHandInValue: 'processHandInValue',\n  product: 'product',\n  productFolder: 'productFolder',\n  productFolderValue: 'productFolderValue',\n  productId: 'productId',\n  productIdValue: 'productIdValue',\n  productList: 'productList',\n  productListValue: 'productListValue',\n  productValue: 'productValue',\n  productVideo: 'productVideo',\n  productVideoList: 'productVideoList',\n  productVideoListValue: 'productVideoListValue',\n  productVideoValue: 'productVideoValue',\n  progress: 'progress',\n  progressValue: 'progressValue',\n  pronunciationTable: 'pronunciationTable',\n  properties: 'properties',\n  property: 'property',\n  propertyKey: 'propertyKey',\n  propertyValue: 'propertyValue',\n  propertyValues: 'propertyValues',\n  provider: 'provider',\n  pseudonym: 'pseudonym',\n  pseudonymValue: 'pseudonymValue',\n  publications: 'publications',\n  publicationsValue: 'publicationsValue',\n  publisher: 'publisher',\n  publisherName: 'publisherName',\n  publisherNameValue: 'publisherNameValue',\n  publisherValue: 'publisherValue',\n  quantity: 'quantity',\n  question: 'question',\n  questions: 'questions',\n  questionsValue: 'questionsValue',\n  questionValue: 'questionValue',\n  quizCountItems: 'quizCountItems',\n  quizCountItemsValue: 'quizCountItemsValue',\n  quizStrikethroughSolutions: 'quizStrikethroughSolutions',\n  quizStrikethroughSolutionsValue: 'quizStrikethroughSolutionsValue',\n  quizzes: 'quizzes',\n  quizzesValue: 'quizzesValue',\n  quotedPerson: 'quotedPerson',\n  ratingLevelEnd: 'ratingLevelEnd',\n  ratingLevelSelected: 'ratingLevelSelected',\n  ratingLevelSelectedValue: 'ratingLevelSelectedValue',\n  ratingLevelStart: 'ratingLevelStart',\n  reaction: 'reaction',\n  reason: 'reason',\n  reasonableNumOfChars: 'reasonableNumOfChars',\n  reasonableNumOfCharsValue: 'reasonableNumOfCharsValue',\n  reductionTag: 'reductionTag',\n  reductionTagValue: 'reductionTagValue',\n  refAuthor: 'refAuthor',\n  refBookTitle: 'refBookTitle',\n  reference: 'reference',\n  referenceEnd: 'referenceEnd',\n  referenceProperty: 'referenceProperty',\n  referencePropertyValue: 'referencePropertyValue',\n  refPublicationYear: 'refPublicationYear',\n  refPublisher: 'refPublisher',\n  relatedBook: 'relatedBook',\n  relatedBookValue: 'relatedBookValue',\n  translationOfBook: 'translationOfBook',\n  translationOfBookValue: 'translationOfBookValue',\n  releaseDate: 'releaseDate',\n  releaseDateValue: 'releaseDateValue',\n  releaseKind: 'releaseKind',\n  releaseKindValue: 'releaseKindValue',\n  releaseVersion: 'releaseVersion',\n  releaseVersionValue: 'releaseVersionValue',\n  reportTag: 'reportTag',\n  reportTagValue: 'reportTagValue',\n  resolved: 'resolved',\n  resolvedBy: 'resolvedBy',\n  resolvedByValue: 'resolvedByValue',\n  resolvedDate: 'resolvedDate',\n  resolvedDateValue: 'resolvedDateValue',\n  resolvedValue: 'resolvedValue',\n  resources: 'resources',\n  resourcesValue: 'resourcesValue',\n  resourceType: 'resourceType',\n  response: 'response',\n  responses: 'responses',\n  responsesValue: 'responsesValue',\n  revealSolutions: 'revealSolutions',\n  root: 'root', // bit type (root)\n  rows: 'rows',\n  rowsValue: 'rowsValue',\n  rtl: 'rtl',\n  rtlValue: 'rtlValue',\n  rubric: 'rubric',\n  rubricValue: 'rubricValue',\n  sampleSolution: 'sampleSolution',\n  sampleSolutionValue: 'sampleSolutionValue',\n  scormSource: 'scormSource',\n  scormSourceValue: 'scormSourceValue',\n  search: 'search',\n  searchIndex: 'searchIndex',\n  searchIndexValue: 'searchIndexValue',\n  searchValue: 'searchValue',\n  section: 'section',\n  select: 'select',\n  selected: 'selected',\n  servings: 'servings',\n  servingsValue: 'servingsValue',\n  showInIndex: 'showInIndex',\n  showInIndexValue: 'showInIndexValue',\n  size: 'size',\n  slug: 'slug',\n  slugValue: 'slugValue',\n  solution: 'solution',\n  solutions: 'solutions',\n  solutionsValue: 'solutionsValue',\n  sourceDocument: 'sourceDocument',\n  sourceDocumentValue: 'sourceDocumentValue',\n  sourceRL: 'sourceRL',\n  sourceRLValue: 'sourceRLValue',\n  spaceId: 'spaceId',\n  spaceIdValue: 'spaceIdValue',\n  spansPageBreak: 'spansPageBreak',\n  spansPageBreakValue: 'spansPageBreakValue',\n  src: 'src',\n  src1x: 'src1x',\n  src2x: 'src2x',\n  src3x: 'src3x',\n  src4x: 'src4x',\n  srcAlt: 'srcAlt',\n  srcAltValue: 'srcAltValue',\n  start: 'start',\n  statement: 'statement',\n  statementValue: 'statementValue',\n  statements: 'statements',\n  statementsValue: 'statementsValue',\n  statementText: 'statementText',\n  stillImageFilmEmbed: 'stillImageFilmEmbed',\n  stillImageFilmLink: 'stillImageFilmLink',\n  stripePricingTableId: 'stripePricingTableId',\n  stripePricingTableIdValue: 'stripePricingTableIdValue',\n  stripePublishableKey: 'stripePublishableKey',\n  stripePublishableKeyValue: 'stripePublishableKeyValue',\n  subject: 'subject',\n  subjectValue: 'subjectValue',\n  subtitle: 'subtitle',\n  subtitleValue: 'subtitleValue',\n  subtype: 'subtype',\n  subtypeValue: 'subtypeValue',\n  table: 'table',\n  tableAutoWidth: 'tableAutoWidth',\n  tableAutoWidthValue: 'tableAutoWidthValue',\n  tableColWidth: 'tableColWidth',\n  tableColWidthValue: 'tableColWidthValue',\n  tableColumnMinWidth: 'tableColumnMinWidth',\n  tableColumnMinWidthValue: 'tableColumnMinWidthValue',\n  tableFixedHeader: 'tableFixedHeader',\n  tableFixedHeaderValue: 'tableFixedHeaderValue',\n  tableHeaderWhitespaceNoWrap: 'tableHeaderWhitespaceNoWrap',\n  tableHeaderWhitespaceNoWrapValue: 'tableHeaderWhitespaceNoWrapValue',\n  tableHeight: 'tableHeight',\n  tableHeightValue: 'tableHeightValue',\n  tablePagination: 'tablePagination',\n  tablePaginationLimit: 'tablePaginationLimit',\n  tablePaginationLimitValue: 'tablePaginationLimitValue',\n  tablePaginationValue: 'tablePaginationValue',\n  tableResizableColumns: 'tableResizableColumns',\n  tableResizableColumnsValue: 'tableResizableColumnsValue',\n  tableSearch: 'tableSearch',\n  tableSearchValue: 'tableSearchValue',\n  tableSort: 'tableSort',\n  tableSortValue: 'tableSortValue',\n  tableWhitespaceNoWrap: 'tableWhitespaceNoWrap',\n  tableWhitespaceNoWrapValue: 'tableWhitespaceNoWrapValue',\n  tag: 'tag',\n  tagValue: 'tagValue',\n  target: 'target',\n  targetValue: 'targetValue',\n  technicalTerm: 'technicalTerm',\n  technicalTermValue: 'technicalTermValue',\n  term: 'term',\n  text: 'text',\n  textAlign: 'textAlign',\n  textAst: 'textAst',\n  textAstValue: 'textAstValue',\n  textFormat: 'textFormat',\n  textReference: 'textReference',\n  textReferenceValue: 'textReferenceValue',\n  texts: 'texts',\n  textsValue: 'textsValue',\n  theme: 'theme',\n  themeValue: 'themeValue',\n  thumbImage: 'thumbImage',\n  thumbImageValue: 'thumbImageValue',\n  thumbnails: 'thumbnails',\n  thumbnailsValue: 'thumbnailsValue',\n  title: 'title',\n  titleString: 'titleString',\n  titleValue: 'titleValue',\n  toc: 'toc',\n  tocContent: 'tocContent',\n  tocContentValue: 'tocContentValue',\n  tocResource: 'tocResource',\n  tocResourceValue: 'tocResourceValue',\n  tocValue: 'tocValue',\n  topicTag: 'topicTag',\n  topicTagValue: 'topicTagValue',\n  translationOf: 'translationOf',\n  translationOfValue: 'translationOfValue',\n  trim: 'trim',\n  type: 'type',\n  unit: 'unit',\n  unitAbbr: 'unitAbbr',\n  url: 'url',\n  validationDate: 'validationDate',\n  validationDateValue: 'validationDateValue',\n  value: 'value',\n  values: 'values',\n  valuesValue: 'valuesValue',\n  vendorDashboardId: 'vendorDashboardId',\n  vendorDashboardIdValue: 'vendorDashboardIdValue',\n  vendorSurveyId: 'vendorSurveyId',\n  vendorSurveyIdValue: 'vendorSurveyIdValue',\n  vendorUrl: 'vendorUrl',\n  vendorUrlValue: 'vendorUrlValue',\n  version: 'version',\n  video: 'video',\n  videoCallLink: 'videoCallLink',\n  videoCallLinkValue: 'videoCallLinkValue',\n  videoEmbed: 'videoEmbed',\n  videoLink: 'videoLink',\n  warnings: 'warnings',\n  warningsValue: 'warningsValue',\n  websiteLink: 'websiteLink',\n  width: 'width',\n  widthValue: 'widthValue',\n  x: 'x',\n  xValue: 'xValue',\n  y: 'y',\n  yValue: 'yValue',\n  zoomDisabled: 'zoomDisabled',\n} as const;\n\nexport type NodeTypeType = EnumType<typeof NodeType>;\n\nexport { NodeType };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../breakscaping/Breakscape.ts';\nimport { Config } from '../config/Config.ts';\nimport { type BreakscapedString } from '../model/ast/BreakscapedString.ts';\nimport {\n  type Bit,\n  type BitmarkAst,\n  type Body,\n  type CardBit,\n  type CardNode,\n  type ExtraProperties,\n  type Footer,\n  type Property,\n} from '../model/ast/Nodes.ts';\nimport { type JsonText, type TextAst, type TextNode } from '../model/ast/TextNodes.ts';\nimport { ConfigKey } from '../model/config/enum/ConfigKey.ts';\nimport { BitType, type BitTypeType } from '../model/enum/BitType.ts';\nimport { BodyBitType, type BodyBitTypeType } from '../model/enum/BodyBitType.ts';\nimport { DeprecatedTextFormat } from '../model/enum/DeprecatedTextFormat.ts';\nimport { ResourceType, type ResourceTypeType } from '../model/enum/ResourceType.ts';\nimport { TextFormat, type TextFormatType } from '../model/enum/TextFormat.ts';\nimport { TextLocation } from '../model/enum/TextLocation.ts';\nimport {\n  type BookJson,\n  type BotResponseJson,\n  type ChoiceJson,\n  type DefinitionListItemJson,\n  type ExampleJson,\n  type FeedbackChoiceJson,\n  type FeedbackJson,\n  type FeedbackReasonJson,\n  type FlashcardJson,\n  type GroupTagJson,\n  type HeadingJson,\n  type ImageSourceJson,\n  type IngredientJson,\n  type MarkConfigJson,\n  type MatrixCellJson,\n  type MatrixJson,\n  type PairJson,\n  type PersonJson,\n  type PronunciationTableJson,\n  type QuestionJson,\n  type QuizJson,\n  type RatingLevelStartEndJson,\n  type ResponseJson,\n  type ServingsJson,\n  type StatementJson,\n  type TableCellJson,\n  type TableExtendedJson,\n  type TableJson,\n  type TableRowJson,\n  type TableSectionJson,\n  type TechnicalTermJson,\n  type TextAndIconJson,\n} from '../model/json/BitJson.ts';\nimport {\n  type BodyBitJson,\n  type GapJson,\n  type HighlightJson,\n  type HighlightTextJson,\n  type MarkJson,\n  type SelectJson,\n  type SelectOptionJson,\n} from '../model/json/BodyBitJson.ts';\nimport {\n  type AudioResourceWrapperJson,\n  type ImageResourceWrapperJson,\n  type ResourceJson,\n  type VideoResourceWrapperJson,\n} from '../model/json/ResourceJson.ts';\nimport { type ParserError } from '../model/parser/ParserError.ts';\nimport { type ParserInfo } from '../model/parser/ParserInfo.ts';\nimport { normalizeTableFormat } from '../parser/json/TableUtils.ts';\nimport { ArrayUtils } from '../utils/ArrayUtils.ts';\nimport { BitUtils } from '../utils/BitUtils.ts';\nimport { BooleanUtils } from '../utils/BooleanUtils.ts';\nimport { env } from '../utils/env/Env.ts';\nimport { NumberUtils } from '../utils/NumberUtils.ts';\nimport { ObjectUtils } from '../utils/ObjectUtils.ts';\nimport { StringUtils } from '../utils/StringUtils.ts';\nimport { BaseBuilder, type BuildContext, type WithExampleJson } from './BaseBuilder.ts';\nimport { ResourceBuilder } from './ResourceBuilder.ts';\nimport { NodeValidator } from './rules/NodeValidator.ts';\n\nexport interface BuildBitOptions {\n  cardSet?: {\n    sideNo: number; // Side number of the card set\n    variantNo: number; // Variant number of the card set\n  };\n}\n\n/**\n * Builder to build bitmark AST node programmatically\n */\nclass Builder extends BaseBuilder {\n  private resourceBuilder: ResourceBuilder = new ResourceBuilder();\n\n  /**\n   * Build bitmark node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  buildBitmark(data: { bits?: Bit[]; errors?: ParserError[] }): BitmarkAst {\n    const { bits, errors } = data;\n\n    const node: BitmarkAst = {\n      bits,\n      errors,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node);\n\n    return node;\n  }\n\n  /**\n   * Build bit node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  buildBit(\n    data: {\n      bitType: BitTypeType;\n      bitLevel: number;\n      textFormat?: TextFormatType;\n      resourceType?: ResourceTypeType; // This is optional, it will be inferred from the resource\n      isCommented?: boolean;\n      id?: string | string[];\n      internalComment?: string | string[];\n      customerId?: string;\n      customerExternalId?: string | string[];\n      externalId?: string | string[];\n      spaceId?: string | string[];\n      padletId?: string;\n      jupyterId?: string;\n      jupyterExecutionCount?: number;\n      sourceRL?: string;\n      isPublic?: boolean;\n      isTemplate?: boolean;\n      isTemplateStripTheme?: boolean;\n      isEditable?: boolean;\n      needsValidation?: boolean;\n      validationDate?: string;\n      aiGenerated?: boolean;\n      machineTranslated?: string;\n      translationOf?: string;\n      spansPageBreak?: boolean;\n      searchIndex?: string | string[];\n      analyticsTag?: string | string[];\n      categoryTag?: string | string[];\n      topicTag?: string | string[];\n      reportTag?: string | string[];\n      altLangTag?: string;\n      feedbackEngine?: string;\n      feedbackType?: string;\n      disableFeedback?: boolean;\n      diffTo?: string;\n      diffOp?: string;\n      diffRef?: string;\n      diffContext?: string;\n      diffTime?: number;\n      path?: string;\n      releaseVersion?: string;\n      releaseKind?: string;\n      releaseDate?: string;\n      iframeSrc?: string;\n      iframeName?: string;\n      ageRange?: number | number[];\n      lang?: string;\n      language?: string | string[];\n      publisher?: string | string[];\n      publisherName?: string;\n      theme?: string | string[];\n      rtl?: boolean;\n      computerLanguage?: string;\n      target?: string | string[];\n      slug?: string;\n      tag?: string | string[];\n      groupTag?: Partial<GroupTagJson> | Partial<GroupTagJson>[];\n      reductionTag?: string | string[];\n      bubbleTag?: string | string[];\n      extractorTag?: string | string[];\n      extractorInternal?: string | string[];\n      levelCEFRp?: string | string[];\n      levelCEFR?: string | string[];\n      levelILR?: string | string[];\n      levelACTFL?: string | string[];\n      icon?: string;\n      iconTag?: string;\n      colorTag?: string | string[];\n      flashcardSet?: string | string[];\n      subtype?: string;\n      bookAlias?: string | string[];\n      bookDiff?: string;\n      coverImage?: string | string[] | Partial<ImageResourceWrapperJson>;\n      coverColor?: string;\n      backgroundImage?: string | string[] | Partial<ImageResourceWrapperJson>;\n      publications?: string | string[];\n      relatedBook?: string | string[];\n      translationOfBook?: string;\n      author?: string | string[];\n      subject?: string | string[];\n      date?: string;\n      dateEnd?: string;\n      location?: string;\n      kind?: string;\n      hasMarkAsDone?: boolean;\n      processHandIn?: boolean;\n      processHandInLocation?: string;\n      chatWithBook?: boolean;\n      chatWithBookBrainKey?: string;\n      currency?: string;\n      bookIsbn?: string;\n      bookAuthor?: string;\n      bookType?: string;\n      bookBindingType?: string;\n      bookNumberOfPages?: string;\n      bookRating?: string;\n      bookSeriesTitle?: string;\n      bookSeriesId?: string;\n      bookSeriesNumber?: string;\n      bookLanguage?: string;\n      bookPublishingDate?: string;\n      bookPublisher?: string;\n      bookTranslator?: string;\n      bookOriginalTitle?: string;\n      gmbExternalShop?: string;\n      gmbExternalShopItems?: string | string[];\n      action?: string;\n      showInIndex?: boolean;\n      refAuthor?: string | string[];\n      refBookTitle?: string;\n      refPublisher?: string | string[];\n      refPublicationYear?: string;\n      citationStyle?: string;\n      blockId?: string;\n      pageNo?: number;\n      x?: number;\n      y?: number;\n      width?: string;\n      height?: string;\n      index?: number;\n      classification?: string;\n      availableClassifications?: string | string[];\n      allowedBit?: string | string[];\n      authorFullName?: string;\n      authorPseudonym?: string;\n      authorTitle?: string;\n      authorJobTitle?: string;\n      tableFixedHeader?: boolean;\n      tableHeaderWhitespaceNoWrap?: boolean;\n      tableSearch?: boolean;\n      tableSort?: boolean;\n      tablePagination?: boolean;\n      tablePaginationLimit?: number;\n      tableHeight?: number;\n      tableWhitespaceNoWrap?: boolean;\n      tableAutoWidth?: boolean;\n      tableResizableColumns?: boolean;\n      tableColumnMinWidth?: number;\n      quizCountItems?: boolean;\n      quizStrikethroughSolutions?: boolean;\n      codeLineNumbers?: boolean;\n      codeMinimap?: boolean;\n      stripePricingTableId?: string;\n      stripePublishableKey?: string;\n      thumbImage?: string;\n      scormSource?: string;\n      posterImage?: string;\n      focusX?: number;\n      focusY?: number;\n      pointerLeft?: string;\n      pointerTop?: string;\n      listItemIndent?: number;\n      backgroundWallpaper?: Partial<ImageResourceWrapperJson>;\n      hasBookNavigation?: boolean;\n      duration?: string;\n      referenceProperty?: string | string[];\n      deeplink?: string | string[];\n      externalLink?: string;\n      externalLinkText?: string;\n      videoCallLink?: string;\n      vendorDashboardId?: string;\n      vendorSurveyId?: string;\n      vendorUrl?: string;\n      search?: string;\n      bot?: string | string[];\n      fullName?: string;\n      pseudonym?: string;\n      titleString?: string;\n      jobTitle?: string;\n      list?: string | string[];\n      layer?: string | string[];\n      layerRole?: string | string[];\n      textReference?: string;\n      isTracked?: boolean;\n      isInfoOnly?: boolean;\n      imageFirst?: boolean;\n      activityType?: string;\n      labelTrue?: string;\n      labelFalse?: string;\n      content2Buy?: string;\n      listPrice?: string;\n      customerProductId?: string;\n      customerProductShopLink?: string;\n      mailingList?: string;\n      buttonCaption?: string;\n      callToActionUrl?: string;\n      advertisingClickUrl?: string;\n      brandColor?: string;\n      brandColorName?: string;\n      caption?: JsonText;\n      quotedPerson?: string;\n      reasonableNumOfChars?: number;\n      resolved?: boolean;\n      resolvedDate?: string;\n      resolvedBy?: string;\n      handInAcceptFileType?: string | string[];\n      handInRequirement?: string | string[];\n      handInInstruction?: string;\n      maxCreatedBits?: number;\n      maxDisplayLevel?: number;\n      maxTocChapterLevel?: number;\n      sourceDocument?: string;\n      internalPrintPdf?: string;\n      allowPrint?: string; // 'enforceTrue' | 'enforceFalse' | 'useSpaceConfiguration'\n      hasPrintRestriction?: boolean;\n      enforceUpdateOverUserInput?: boolean;\n      extractorExtractionTimestamp?: string[];\n      tocResource?: string | string[];\n      tocContent?: string | string[];\n      page?: string | string[];\n      printParentChapterLevel?: number;\n      platformBrandTarget?: string;\n      platformName?: string;\n      platformIcon?: Partial<ImageResourceWrapperJson>;\n      platformLogo?: Partial<ImageResourceWrapperJson>;\n      platformLogoMaxHeight?: number;\n      platformPrimaryColor?: string;\n      platformSecondaryColor?: string;\n      platformBackgroundColor?: string;\n      platformScrollbarColor?: string;\n      platformSelectionColor?: string;\n      platformSeparatorColor?: string;\n      platformPlaceholderColor?: string;\n      platformTextSelectionColor?: string;\n      platformButtonPrimaryColor?: string;\n      platformButtonBackgroundColor?: string;\n      platformMessageBackgroundColor?: string;\n      platformBackgroundImage?: Partial<ImageResourceWrapperJson>;\n      platformBorderColor?: string;\n      platformSelectionTextColor?: string;\n      platformBaseLayerColor?: string;\n      platformMargin?: number;\n      platformBorderRadius?: number;\n      platformSelectionBorderRadius?: number;\n      platformNeedsShadow?: boolean;\n      productId?: string | string[];\n      product?: string | string[];\n      // productList?: string | string[];\n      productVideo?: string | string[];\n      // productVideoList?: string | string[];\n      productFolder?: string;\n      technicalTerm?: Partial<TechnicalTermJson>;\n      servings?: Partial<ServingsJson>;\n      ratingLevelStart?: Partial<RatingLevelStartEndJson>;\n      ratingLevelEnd?: Partial<RatingLevelStartEndJson>;\n      ratingLevelSelected?: number;\n      formula?: string;\n      partialAnswer?: string;\n      book?: string | BookJson[];\n      title?: JsonText;\n      subtitle?: JsonText;\n      level?: number | string;\n      toc?: boolean;\n      progress?: boolean;\n      anchor?: string;\n      reference?: string;\n      referenceEnd?: string;\n      revealSolutions?: boolean;\n      isCaseSensitive?: boolean;\n      item?: JsonText;\n      lead?: JsonText;\n      pageNumber?: JsonText;\n      marginNumber?: JsonText;\n      hint?: JsonText;\n      instruction?: JsonText;\n      example?: Partial<ExampleJson>;\n      imageSource?: Partial<ImageSourceJson>;\n      person?: Partial<PersonJson>;\n      extraProperties?: {\n        [key: string]: unknown | unknown[];\n      };\n\n      markConfig?: Partial<MarkConfigJson>[];\n      previewImage?: Partial<ImageResourceWrapperJson> | Partial<ImageResourceWrapperJson>[];\n      previewVideo?: Partial<VideoResourceWrapperJson> | Partial<VideoResourceWrapperJson>[];\n      imagePlaceholder?: Partial<ImageResourceWrapperJson>;\n      resources?: Partial<ResourceJson> | Partial<ResourceJson>[];\n      body?: Partial<Body>;\n      sampleSolution?: string;\n      additionalSolutions?: string | string[];\n      heading?: Partial<HeadingJson>;\n      elements?: JsonText[];\n      flashcards?: Partial<FlashcardJson>[];\n      definitions?: Partial<DefinitionListItemJson>[];\n      legend?: Partial<DefinitionListItemJson>[];\n      statement?: Partial<StatementJson>;\n      statements?: Partial<StatementJson>[];\n      responses?: Partial<ResponseJson>[];\n      quizzes?: Partial<QuizJson>[];\n      pairs?: Partial<PairJson>[];\n      matrix?: Partial<MatrixJson>[];\n      pronunciationTable?: Partial<PronunciationTableJson>;\n      table?: Partial<TableJson | TableExtendedJson>;\n      choices?: Partial<ChoiceJson>[];\n      questions?: Partial<QuestionJson>[];\n      botResponses?: Partial<BotResponseJson>[];\n      ingredients?: Partial<IngredientJson>[];\n      // DEPRECATED - TO BE REMOVED IN THE FUTURE\n      // captionDefinitionList?: Partial<CaptionDefinitionListJson>;\n      cardBits?: Partial<CardBit>[];\n      footer?: Partial<Footer>;\n\n      markup?: string;\n      parser?: ParserInfo;\n      __isDefaultExample?: boolean;\n    },\n    options?: BuildBitOptions,\n  ): Bit | undefined {\n    // Copy all data to a new object to avoid modifying the original data\n    data = structuredClone(data);\n\n    const bitType = data.bitType;\n    const bitConfig = Config.getBitConfig(bitType);\n\n    // Text Format (accepts deprecated values, and converts them to the new format)\n    const deprecatedTextFormat = Enum(DeprecatedTextFormat).fromValue(data.textFormat);\n    let textFormat = Enum(TextFormat).fromValue(data.textFormat) ?? bitConfig.textFormatDefault;\n    if (deprecatedTextFormat === DeprecatedTextFormat.bitmarkMinusMinus) {\n      textFormat = TextFormat.bitmarkText;\n    }\n\n    const context: BuildContext = {\n      bitConfig,\n      bitType,\n      textFormat,\n    };\n\n    // Validate and convert resources, and ensure it is an array\n    // const resources = ArrayUtils.asArray(resourcesIn);\n\n    // Set the card node data\n    const cardNode = this.buildCardNode(context, data);\n\n    // Add reasonableNumOfChars to the bit only for essay bits (in other cases it will be pushed down the tree)\n    const reasonableNumOfCharsProperty = Config.isOfBitType(data.bitType, BitType.essay)\n      ? this.toAstProperty(\n          bitType,\n          ConfigKey.property_reasonableNumOfChars,\n          data.reasonableNumOfChars,\n          options,\n        )\n      : undefined;\n\n    const convertedExample = {\n      ...this.toExample(data.__isDefaultExample, data.example as TextAst),\n    };\n\n    // NOTE: Node order is important and is defined here\n    const node: Bit = {\n      bitType,\n      bitLevel: data.bitLevel,\n      textFormat,\n      resourceType: Enum(ResourceType).fromValue(data.resourceType),\n      isCommented: data.isCommented,\n\n      // Properties\n      id: this.toAstProperty(bitType, ConfigKey.property_id, data.id, options),\n      internalComment: this.toAstProperty(\n        bitType,\n        ConfigKey.property_internalComment,\n        data.internalComment,\n        options,\n      ),\n      customerId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_customerId,\n        data.customerId,\n        options,\n      ),\n      customerExternalId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_customerExternalId,\n        data.customerExternalId,\n        options,\n      ),\n      externalId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_externalId,\n        data.externalId,\n        options,\n      ),\n      spaceId: this.toAstProperty(bitType, ConfigKey.property_spaceId, data.spaceId, options),\n      padletId: this.toAstProperty(bitType, ConfigKey.property_padletId, data.padletId, options),\n      jupyterId: this.toAstProperty(bitType, ConfigKey.property_jupyterId, data.jupyterId, options),\n      jupyterExecutionCount: this.toAstProperty(\n        bitType,\n        ConfigKey.property_jupyterExecutionCount,\n        data.jupyterExecutionCount,\n        options,\n      ),\n      sourceRL: this.toAstProperty(bitType, ConfigKey.property_sourceRL, data.sourceRL, options),\n      isPublic: this.toAstProperty(bitType, ConfigKey.property_isPublic, data.isPublic, options),\n      isTemplate: this.toAstProperty(\n        bitType,\n        ConfigKey.property_isTemplate,\n        data.isTemplate,\n        options,\n      ),\n      isTemplateStripTheme: this.toAstProperty(\n        bitType,\n        ConfigKey.property_isTemplateStripTheme,\n        data.isTemplateStripTheme,\n        options,\n      ),\n      isEditable: this.toAstProperty(\n        bitType,\n        ConfigKey.property_isEditable,\n        data.isEditable,\n        options,\n      ),\n      needsValidation: this.toAstProperty(\n        bitType,\n        ConfigKey.property_needsValidation,\n        data.needsValidation,\n        options,\n      ),\n      validationDate: this.toAstProperty(\n        bitType,\n        ConfigKey.property_validationDate,\n        data.validationDate,\n        options,\n      ),\n      aiGenerated: this.toAstProperty(\n        bitType,\n        ConfigKey.property_aiGenerated,\n        data.aiGenerated,\n        options,\n      ),\n      machineTranslated: this.toAstProperty(\n        bitType,\n        ConfigKey.property_machineTranslated,\n        data.machineTranslated,\n        options,\n      ),\n      translationOf: this.toAstProperty(\n        bitType,\n        ConfigKey.property_translationOf,\n        data.translationOf,\n        options,\n      ),\n      spansPageBreak: this.toAstProperty(\n        bitType,\n        ConfigKey.property_spansPageBreak,\n        data.spansPageBreak,\n        options,\n      ),\n      searchIndex: this.toAstProperty(\n        bitType,\n        ConfigKey.property_searchIndex,\n        data.searchIndex,\n        options,\n      ),\n      analyticsTag: this.toAstProperty(\n        bitType,\n        ConfigKey.property_analyticsTag,\n        data.analyticsTag,\n        options,\n      ),\n      categoryTag: this.toAstProperty(\n        bitType,\n        ConfigKey.property_categoryTag,\n        data.categoryTag,\n        options,\n      ),\n      topicTag: this.toAstProperty(bitType, ConfigKey.property_topicTag, data.topicTag, options),\n      reportTag: this.toAstProperty(bitType, ConfigKey.property_reportTag, data.reportTag, options),\n      altLangTag: this.toAstProperty(\n        bitType,\n        ConfigKey.property_altLangTag,\n        data.altLangTag,\n        options,\n      ),\n      feedbackEngine: this.toAstProperty(\n        bitType,\n        ConfigKey.property_feedbackEngine,\n        data.feedbackEngine,\n        options,\n      ),\n      feedbackType: this.toAstProperty(\n        bitType,\n        ConfigKey.property_feedbackType,\n        data.feedbackType,\n        options,\n      ),\n      disableFeedback: this.toAstProperty(\n        bitType,\n        ConfigKey.property_disableFeedback,\n        data.disableFeedback,\n        options,\n      ),\n      diffTo: this.toAstProperty(bitType, ConfigKey.property_diffTo, data.diffTo, options),\n      diffOp: this.toAstProperty(bitType, ConfigKey.property_diffOp, data.diffOp, options),\n      diffRef: this.toAstProperty(bitType, ConfigKey.property_diffRef, data.diffRef, options),\n      diffContext: this.toAstProperty(\n        bitType,\n        ConfigKey.property_diffContext,\n        data.diffContext,\n        options,\n      ),\n      diffTime: this.toAstProperty(bitType, ConfigKey.property_diffTime, data.diffTime, options),\n      path: this.toAstProperty(bitType, ConfigKey.property_path, data.path, options),\n      releaseVersion: this.toAstProperty(\n        bitType,\n        ConfigKey.property_releaseVersion,\n        data.releaseVersion,\n        options,\n      ),\n      releaseKind: this.toAstProperty(\n        bitType,\n        ConfigKey.property_releaseKind,\n        data.releaseKind,\n        options,\n      ),\n      releaseDate: this.toAstProperty(\n        bitType,\n        ConfigKey.property_releaseDate,\n        data.releaseDate,\n        options,\n      ),\n      iframeSrc: this.toAstProperty(bitType, ConfigKey.property_iframeSrc, data.iframeSrc, options),\n      iframeName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_iframeName,\n        data.iframeName,\n        options,\n      ),\n      book: this.buildBooks(context, data.book),\n      ageRange: this.toAstProperty(bitType, ConfigKey.property_ageRange, data.ageRange, options),\n      lang: this.toAstProperty(bitType, ConfigKey.property_lang, data.lang, options),\n      language: this.toAstProperty(bitType, ConfigKey.property_language, data.language, options),\n      publisher: this.toAstProperty(bitType, ConfigKey.property_publisher, data.publisher, options),\n      publisherName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_publisherName,\n        data.publisherName,\n        options,\n      ),\n      theme: this.toAstProperty(bitType, ConfigKey.property_theme, data.theme, options),\n      rtl: this.toAstProperty(bitType, ConfigKey.property_rtl, data.rtl, options),\n      computerLanguage: this.toAstProperty(\n        bitType,\n        ConfigKey.property_computerLanguage,\n        data.computerLanguage,\n        options,\n      ),\n      target: this.toAstProperty(bitType, ConfigKey.property_target, data.target, options),\n      slug: this.toAstProperty(bitType, ConfigKey.property_slug, data.slug, options),\n      tag: this.toAstProperty(bitType, ConfigKey.property_tag, data.tag, options),\n      groupTag: this.buildGroupTags(context, data.groupTag),\n      reductionTag: this.toAstProperty(\n        bitType,\n        ConfigKey.property_reductionTag,\n        data.reductionTag,\n        options,\n      ),\n      bubbleTag: this.toAstProperty(bitType, ConfigKey.property_bubbleTag, data.bubbleTag, options),\n      extractorTag: this.toAstProperty(\n        bitType,\n        ConfigKey.property_extractorTag,\n        data.extractorTag,\n        options,\n      ),\n      extractorInternal: this.toAstProperty(\n        bitType,\n        ConfigKey.property_extractorInternal,\n        data.extractorInternal,\n        options,\n      ),\n      levelCEFRp: this.toAstProperty(\n        bitType,\n        ConfigKey.property_levelCEFRp,\n        data.levelCEFRp,\n        options,\n      ),\n      levelCEFR: this.toAstProperty(bitType, ConfigKey.property_levelCEFR, data.levelCEFR, options),\n      levelILR: this.toAstProperty(bitType, ConfigKey.property_levelILR, data.levelILR, options),\n      levelACTFL: this.toAstProperty(\n        bitType,\n        ConfigKey.property_levelACTFL,\n        data.levelACTFL,\n        options,\n      ),\n      icon: this.toAstProperty(bitType, ConfigKey.property_icon, data.icon, options),\n      iconTag: this.toAstProperty(bitType, ConfigKey.property_iconTag, data.iconTag, options),\n      colorTag: this.toAstProperty(bitType, ConfigKey.property_colorTag, data.colorTag, options),\n      flashcardSet: this.toAstProperty(\n        bitType,\n        ConfigKey.property_flashcardSet,\n        data.flashcardSet,\n        options,\n      ),\n      subtype: this.toAstProperty(bitType, ConfigKey.property_subtype, data.subtype, options),\n      bookAlias: this.toAstProperty(bitType, ConfigKey.property_bookAlias, data.bookAlias, options),\n      bookDiff: this.toAstProperty(bitType, ConfigKey.property_bookDiff, data.bookDiff, options),\n      coverImage:\n        typeof data.coverImage === 'string' || Array.isArray(data.coverImage)\n          ? this.toAstProperty(\n              bitType,\n              ConfigKey.property_coverImage,\n              ArrayUtils.asArray(data.coverImage),\n              options,\n            )\n          : this.toImageResource(context, data.coverImage),\n      coverColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_coverColor,\n        data.coverColor,\n        options,\n      ),\n      backgroundImage:\n        typeof data.backgroundImage === 'string' || Array.isArray(data.backgroundImage)\n          ? this.toAstProperty(\n              bitType,\n              ConfigKey.property_backgroundImage,\n              ArrayUtils.asArray(data.backgroundImage),\n              options,\n            )\n          : this.toImageResource(context, data.backgroundImage),\n      publications: this.toAstProperty(\n        bitType,\n        ConfigKey.property_publications,\n        data.publications,\n        options,\n      ),\n      relatedBook: this.toAstProperty(\n        bitType,\n        ConfigKey.property_relatedBook,\n        data.relatedBook,\n        options,\n      ),\n      translationOfBook: this.toAstProperty(\n        bitType,\n        ConfigKey.property_translationOfBook,\n        data.translationOfBook,\n        options,\n      ),\n      author: this.toAstProperty(bitType, ConfigKey.property_author, data.author, options),\n      subject: this.toAstProperty(bitType, ConfigKey.property_subject, data.subject, options),\n      date: this.toAstProperty(bitType, ConfigKey.property_date, data.date, options),\n      dateEnd: this.toAstProperty(bitType, ConfigKey.property_dateEnd, data.dateEnd, options),\n      location: this.toAstProperty(bitType, ConfigKey.property_location, data.location, options),\n      kind: this.toAstProperty(bitType, ConfigKey.property_kind, data.kind, options),\n      hasMarkAsDone: this.toAstProperty(\n        bitType,\n        ConfigKey.property_hasMarkAsDone,\n        data.hasMarkAsDone,\n        options,\n      ),\n      processHandIn: this.toAstProperty(\n        bitType,\n        ConfigKey.property_processHandIn,\n        data.processHandIn,\n        options,\n      ),\n      processHandInLocation: this.toAstProperty(\n        bitType,\n        ConfigKey.property_processHandInLocation,\n        data.processHandInLocation,\n        options,\n      ),\n      chatWithBook: this.toAstProperty(\n        bitType,\n        ConfigKey.property_chatWithBook,\n        data.chatWithBook,\n        options,\n      ),\n      chatWithBookBrainKey: this.toAstProperty(\n        bitType,\n        ConfigKey.property_chatWithBookBrainKey,\n        data.chatWithBookBrainKey,\n        options,\n      ),\n      currency: this.toAstProperty(bitType, ConfigKey.property_currency, data.currency, options),\n      bookIsbn: this.toAstProperty(bitType, ConfigKey.property_bookIsbn, data.bookIsbn, options),\n      bookAuthor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookAuthor,\n        data.bookAuthor,\n        options,\n      ),\n      bookType: this.toAstProperty(bitType, ConfigKey.property_bookType, data.bookType, options),\n      bookBindingType: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookBindingType,\n        data.bookBindingType,\n        options,\n      ),\n      bookNumberOfPages: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookNumberOfPages,\n        data.bookNumberOfPages,\n        options,\n      ),\n      bookRating: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookRating,\n        data.bookRating,\n        options,\n      ),\n      bookSeriesTitle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookSeriesTitle,\n        data.bookSeriesTitle,\n        options,\n      ),\n      bookSeriesId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookSeriesId,\n        data.bookSeriesId,\n        options,\n      ),\n      bookSeriesNumber: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookSeriesNumber,\n        data.bookSeriesNumber,\n        options,\n      ),\n      bookLanguage: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookLanguage,\n        data.bookLanguage,\n        options,\n      ),\n      bookPublishingDate: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookPublishingDate,\n        data.bookPublishingDate,\n        options,\n      ),\n      bookPublisher: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookPublisher,\n        data.bookPublisher,\n        options,\n      ),\n      bookTranslator: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookTranslator,\n        data.bookTranslator,\n        options,\n      ),\n      bookOriginalTitle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookOriginalTitle,\n        data.bookOriginalTitle,\n        options,\n      ),\n      gmbExternalShop: this.toAstProperty(\n        bitType,\n        ConfigKey.property_gmbExternalShop,\n        data.gmbExternalShop,\n        options,\n      ),\n      gmbExternalShopItems: this.toAstProperty(\n        bitType,\n        ConfigKey.property_gmbExternalShopItems,\n        data.gmbExternalShopItems,\n        options,\n      ),\n      action: this.toAstProperty(bitType, ConfigKey.property_action, data.action, options),\n      showInIndex: this.toAstProperty(\n        bitType,\n        ConfigKey.property_showInIndex,\n        data.showInIndex,\n        options,\n      ),\n      refAuthor: this.toAstProperty(bitType, ConfigKey.property_refAuthor, data.refAuthor, options),\n      refBookTitle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_refBookTitle,\n        data.refBookTitle,\n        options,\n      ),\n      refPublisher: this.toAstProperty(\n        bitType,\n        ConfigKey.property_refPublisher,\n        data.refPublisher,\n        options,\n      ),\n      refPublicationYear: this.toAstProperty(\n        bitType,\n        ConfigKey.property_refPublicationYear,\n        data.refPublicationYear,\n        options,\n      ),\n      citationStyle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_citationStyle,\n        data.citationStyle,\n        options,\n      ),\n      blockId: this.toAstProperty(bitType, ConfigKey.property_blockId, data.blockId, options),\n      pageNo: this.toAstProperty(bitType, ConfigKey.property_pageNo, data.pageNo, options),\n      x: this.toAstProperty(bitType, ConfigKey.property_x, data.x, options),\n      y: this.toAstProperty(bitType, ConfigKey.property_y, data.y, options),\n      width: this.toAstProperty(bitType, ConfigKey.property_width, data.width, options),\n      height: this.toAstProperty(bitType, ConfigKey.property_height, data.height, options),\n      index: this.toAstProperty(bitType, ConfigKey.property_index, data.index, options),\n      classification: this.toAstProperty(\n        bitType,\n        ConfigKey.property_classification,\n        data.classification,\n        options,\n      ),\n      availableClassifications: this.toAstProperty(\n        bitType,\n        ConfigKey.property_availableClassifications,\n        data.availableClassifications,\n        options,\n      ),\n      allowedBit: this.toAstProperty(\n        bitType,\n        ConfigKey.property_allowedBit,\n        data.allowedBit,\n        options,\n      ),\n      authorFullName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_authorFullName,\n        data.authorFullName,\n        options,\n      ),\n      authorPseudonym: this.toAstProperty(\n        bitType,\n        ConfigKey.property_authorPseudonym,\n        data.authorPseudonym,\n        options,\n      ),\n      authorTitle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_authorTitle,\n        data.authorTitle,\n        options,\n      ),\n      authorJobTitle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_authorJobTitle,\n        data.authorJobTitle,\n        options,\n      ),\n      tableFixedHeader: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableFixedHeader,\n        data.tableFixedHeader,\n        options,\n      ),\n      tableHeaderWhitespaceNoWrap: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableHeaderWhitespaceNoWrap,\n        data.tableHeaderWhitespaceNoWrap,\n        options,\n      ),\n      tableSearch: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableSearch,\n        data.tableSearch,\n        options,\n      ),\n      tableSort: this.toAstProperty(bitType, ConfigKey.property_tableSort, data.tableSort, options),\n      tablePagination: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tablePagination,\n        data.tablePagination,\n        options,\n      ),\n      tablePaginationLimit: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tablePaginationLimit,\n        data.tablePaginationLimit,\n        options,\n      ),\n      tableHeight: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableHeight,\n        data.tableHeight,\n        options,\n      ),\n      tableWhitespaceNoWrap: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableWhitespaceNoWrap,\n        data.tableWhitespaceNoWrap,\n        options,\n      ),\n      tableAutoWidth: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableAutoWidth,\n        data.tableAutoWidth,\n        options,\n      ),\n      tableResizableColumns: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableResizableColumns,\n        data.tableResizableColumns,\n        options,\n      ),\n      tableColumnMinWidth: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableColumnMinWidth,\n        data.tableColumnMinWidth,\n        options,\n      ),\n      quizCountItems: this.toAstProperty(\n        bitType,\n        ConfigKey.property_quizCountItems,\n        data.quizCountItems,\n        options,\n      ),\n      quizStrikethroughSolutions: this.toAstProperty(\n        bitType,\n        ConfigKey.property_quizStrikethroughSolutions,\n        data.quizStrikethroughSolutions,\n        options,\n      ),\n      codeLineNumbers: this.toAstProperty(\n        bitType,\n        ConfigKey.property_codeLineNumbers,\n        data.codeLineNumbers,\n        options,\n      ),\n      codeMinimap: this.toAstProperty(\n        bitType,\n        ConfigKey.property_codeMinimap,\n        data.codeMinimap,\n        options,\n      ),\n      stripePricingTableId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_stripePricingTableId,\n        data.stripePricingTableId,\n        options,\n      ),\n      stripePublishableKey: this.toAstProperty(\n        bitType,\n        ConfigKey.property_stripePublishableKey,\n        data.stripePublishableKey,\n        options,\n      ),\n      thumbImage: this.toAstProperty(\n        bitType,\n        ConfigKey.property_thumbImage,\n        data.thumbImage,\n        options,\n      ),\n      scormSource: this.toAstProperty(\n        bitType,\n        ConfigKey.property_scormSource,\n        data.scormSource,\n        options,\n      ),\n      posterImage: this.toAstProperty(\n        bitType,\n        ConfigKey.property_posterImage,\n        data.posterImage,\n        options,\n      ),\n      focusX: this.toAstProperty(bitType, ConfigKey.property_focusX, data.focusX, options),\n      focusY: this.toAstProperty(bitType, ConfigKey.property_focusY, data.focusY, options),\n      pointerLeft: this.toAstProperty(\n        bitType,\n        ConfigKey.property_pointerLeft,\n        data.pointerLeft,\n        options,\n      ),\n      pointerTop: this.toAstProperty(\n        bitType,\n        ConfigKey.property_pointerTop,\n        data.pointerTop,\n        options,\n      ),\n      listItemIndent: this.toAstProperty(\n        bitType,\n        ConfigKey.property_listItemIndent,\n        data.listItemIndent,\n        options,\n      ),\n      backgroundWallpaper: this.toImageResource(context, data.backgroundWallpaper),\n      hasBookNavigation: this.toAstProperty(\n        bitType,\n        ConfigKey.property_hasBookNavigation,\n        data.hasBookNavigation,\n        options,\n      ),\n      duration: this.toAstProperty(bitType, ConfigKey.property_duration, data.duration, options),\n      deeplink: this.toAstProperty(bitType, ConfigKey.property_deeplink, data.deeplink, options),\n      externalLink: this.toAstProperty(\n        bitType,\n        ConfigKey.property_externalLink,\n        data.externalLink,\n        options,\n      ),\n      externalLinkText: this.toAstProperty(\n        bitType,\n        ConfigKey.property_externalLinkText,\n        data.externalLinkText,\n        options,\n      ),\n      videoCallLink: this.toAstProperty(\n        bitType,\n        ConfigKey.property_videoCallLink,\n        data.videoCallLink,\n        options,\n      ),\n      vendorDashboardId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_vendorDashboardId,\n        data.vendorDashboardId,\n        options,\n      ),\n      vendorSurveyId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_vendorSurveyId,\n        data.vendorSurveyId,\n        options,\n      ),\n      vendorUrl: this.toAstProperty(bitType, ConfigKey.property_vendorUrl, data.vendorUrl, options),\n      search: this.toAstProperty(bitType, ConfigKey.property_search, data.search, options),\n      list: this.toAstProperty(bitType, ConfigKey.property_list, data.list, options),\n      layer: this.toAstProperty(bitType, ConfigKey.property_layer, data.layer, options),\n      layerRole: this.toAstProperty(bitType, ConfigKey.property_layerRole, data.layerRole, options),\n      textReference: this.toAstProperty(\n        bitType,\n        ConfigKey.property_textReference,\n        data.textReference,\n        options,\n      ),\n      isTracked: this.toAstProperty(bitType, ConfigKey.property_isTracked, data.isTracked, options),\n      isInfoOnly: this.toAstProperty(\n        bitType,\n        ConfigKey.property_isInfoOnly,\n        data.isInfoOnly,\n        options,\n      ),\n      imageFirst: this.toAstProperty(\n        bitType,\n        ConfigKey.property_imageFirst,\n        data.imageFirst,\n        options,\n      ),\n      activityType: this.toAstProperty(\n        bitType,\n        ConfigKey.property_activityType,\n        data.activityType,\n        options,\n      ),\n      labelTrue: this.toAstProperty(bitType, ConfigKey.property_labelTrue, data.labelTrue, options),\n      labelFalse: this.toAstProperty(\n        bitType,\n        ConfigKey.property_labelFalse,\n        data.labelFalse,\n        options,\n      ),\n      content2Buy: this.toAstProperty(\n        bitType,\n        ConfigKey.property_content2Buy,\n        data.content2Buy,\n        options,\n      ),\n      listPrice: this.toAstProperty(bitType, ConfigKey.property_listPrice, data.listPrice, options),\n      customerProductId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_customerProductId,\n        data.customerProductId,\n        options,\n      ),\n      customerProductShopLink: this.toAstProperty(\n        bitType,\n        ConfigKey.property_customerProductShopLink,\n        data.customerProductShopLink,\n        options,\n      ),\n      mailingList: this.toAstProperty(\n        bitType,\n        ConfigKey.property_mailingList,\n        data.mailingList,\n        options,\n      ),\n      buttonCaption: this.toAstProperty(\n        bitType,\n        ConfigKey.property_buttonCaption,\n        data.buttonCaption,\n        options,\n      ),\n      callToActionUrl: this.toAstProperty(\n        bitType,\n        ConfigKey.property_callToActionUrl,\n        data.callToActionUrl,\n        options,\n      ),\n      advertisingClickUrl: this.toAstProperty(\n        bitType,\n        ConfigKey.property_advertisingClickUrl,\n        data.advertisingClickUrl,\n        options,\n      ),\n      brandColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_brandColor,\n        data.brandColor,\n        options,\n      ),\n      brandColorName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_brandColorName,\n        data.brandColorName,\n        options,\n      ),\n      caption: this.handleJsonText(context, TextLocation.tag, data.caption),\n      quotedPerson: this.toAstProperty(\n        bitType,\n        ConfigKey.property_quotedPerson,\n        data.quotedPerson,\n        options,\n      ),\n      reasonableNumOfChars: reasonableNumOfCharsProperty,\n      resolved: this.toAstProperty(bitType, ConfigKey.property_resolved, data.resolved, options),\n      resolvedDate: this.toAstProperty(\n        bitType,\n        ConfigKey.property_resolvedDate,\n        data.resolvedDate,\n        options,\n      ),\n      resolvedBy: this.toAstProperty(\n        bitType,\n        ConfigKey.property_resolvedBy,\n        data.resolvedBy,\n        options,\n      ),\n      handInAcceptFileType: this.toAstProperty(\n        bitType,\n        ConfigKey.property_handInAcceptFileType,\n        data.handInAcceptFileType,\n        options,\n      ),\n      handInRequirement: this.toAstProperty(\n        bitType,\n        ConfigKey.property_handInRequirement,\n        data.handInRequirement,\n        options,\n      ),\n      handInInstruction: this.toAstProperty(\n        bitType,\n        ConfigKey.property_handInInstruction,\n        data.handInInstruction,\n        options,\n      ),\n      maxCreatedBits: this.toAstProperty(\n        bitType,\n        ConfigKey.property_maxCreatedBits,\n        data.maxCreatedBits,\n        options,\n      ),\n      maxDisplayLevel: this.toAstProperty(\n        bitType,\n        ConfigKey.property_maxDisplayLevel,\n        data.maxDisplayLevel,\n        options,\n      ),\n      maxTocChapterLevel: this.toAstProperty(\n        bitType,\n        ConfigKey.property_maxTocChapterLevel,\n        data.maxTocChapterLevel,\n        options,\n      ),\n      sourceDocument: this.toAstProperty(\n        bitType,\n        ConfigKey.property_sourceDocument,\n        data.sourceDocument,\n        options,\n      ),\n      internalPrintPdf: this.toAstProperty(\n        bitType,\n        ConfigKey.property_internalPrintPdf,\n        data.internalPrintPdf,\n        options,\n      ),\n      hasPrintRestriction: this.toAstProperty(\n        bitType,\n        ConfigKey.property_hasPrintRestriction,\n        data.hasPrintRestriction,\n        options,\n      ),\n      enforceUpdateOverUserInput: this.toAstProperty(\n        bitType,\n        ConfigKey.property_enforceUpdateOverUserInput,\n        data.enforceUpdateOverUserInput,\n        options,\n      ),\n      extractorExtractionTimestamp: this.toAstProperty(\n        bitType,\n        ConfigKey.property_extractorExtractionTimestamp,\n        data.extractorExtractionTimestamp,\n        options,\n      ),\n      tocResource: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tocResource,\n        data.tocResource,\n        options,\n      ),\n      tocContent: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tocContent,\n        data.tocContent,\n        options,\n      ),\n      page: this.toAstProperty(bitType, ConfigKey.property_page, data.page, options),\n      allowPrint: this.toAstProperty(\n        bitType,\n        ConfigKey.property_allowPrint,\n        data.allowPrint,\n        options,\n      ),\n      printParentChapterLevel: this.toAstProperty(\n        bitType,\n        ConfigKey.property_printParentChapterLevel,\n        data.printParentChapterLevel,\n        options,\n      ),\n      platformBrandTarget: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformBrandTarget,\n        data.platformBrandTarget,\n        options,\n      ),\n      platformName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformName,\n        data.platformName,\n        options,\n      ),\n      platformIcon: this.toImageResource(context, data.platformIcon),\n      platformLogo: this.toImageResource(context, data.platformLogo),\n      platformLogoMaxHeight: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformLogoMaxHeight,\n        data.platformLogoMaxHeight,\n        options,\n      ),\n      platformPrimaryColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformPrimaryColor,\n        data.platformPrimaryColor,\n        options,\n      ),\n      platformSecondaryColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformSecondaryColor,\n        data.platformSecondaryColor,\n        options,\n      ),\n      platformBackgroundColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformBackgroundColor,\n        data.platformBackgroundColor,\n        options,\n      ),\n      platformScrollbarColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformScrollbarColor,\n        data.platformScrollbarColor,\n        options,\n      ),\n      platformSelectionColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformSelectionColor,\n        data.platformSelectionColor,\n        options,\n      ),\n      platformSeparatorColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformSeparatorColor,\n        data.platformSeparatorColor,\n        options,\n      ),\n      platformPlaceholderColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformPlaceholderColor,\n        data.platformPlaceholderColor,\n        options,\n      ),\n      platformTextSelectionColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformTextSelectionColor,\n        data.platformTextSelectionColor,\n        options,\n      ),\n      platformButtonPrimaryColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformButtonPrimaryColor,\n        data.platformButtonPrimaryColor,\n        options,\n      ),\n      platformButtonBackgroundColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformButtonBackgroundColor,\n        data.platformButtonBackgroundColor,\n        options,\n      ),\n      platformMessageBackgroundColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformMessageBackgroundColor,\n        data.platformMessageBackgroundColor,\n        options,\n      ),\n      platformBackgroundImage: this.toImageResource(context, data.platformBackgroundImage),\n      platformBorderColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformBorderColor,\n        data.platformBorderColor,\n        options,\n      ),\n      platformSelectionTextColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformSelectionTextColor,\n        data.platformSelectionTextColor,\n        options,\n      ),\n      platformBaseLayerColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformBaseLayerColor,\n        data.platformBaseLayerColor,\n        options,\n      ),\n      platformMargin: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformMargin,\n        data.platformMargin,\n        options,\n      ),\n      platformBorderRadius: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformBorderRadius,\n        data.platformBorderRadius,\n        options,\n      ),\n      platformSelectionBorderRadius: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformSelectionBorderRadius,\n        data.platformSelectionBorderRadius,\n        options,\n      ),\n      platformNeedsShadow: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformNeedsShadow,\n        data.platformNeedsShadow,\n        options,\n      ),\n      productId: this.toAstProperty(bitType, ConfigKey.property_productId, data.productId, options),\n      product: this.toAstProperty(bitType, ConfigKey.property_product, data.product, options),\n      // productList: this.toAstProperty(\n      //   bitType,\n      //   ConfigKey.property_productList,\n      //   data.productList,\n      //   options,\n      // ),\n      productVideo: this.toAstProperty(\n        bitType,\n        ConfigKey.property_productVideo,\n        data.productVideo,\n        options,\n      ),\n      // productVideoList: this.toAstProperty(\n      //   bitType,\n      //   ConfigKey.property_productVideoList,\n      //   data.productVideoList,\n      //   options,\n      // ),\n      productFolder: this.toAstProperty(\n        bitType,\n        ConfigKey.property_productFolder,\n        data.productFolder,\n        options,\n      ),\n      technicalTerm: this.buildTechnicalTerm(context, data.technicalTerm),\n      servings: this.buildServings(context, data.servings),\n      ratingLevelStart: this.buildRatingLevelStartEnd(context, data.ratingLevelStart),\n      ratingLevelEnd: this.buildRatingLevelStartEnd(context, data.ratingLevelEnd),\n      ratingLevelSelected: this.toAstProperty(\n        bitType,\n        ConfigKey.property_ratingLevelSelected,\n        data.ratingLevelSelected,\n        options,\n      ),\n      formula: this.toAstProperty(bitType, ConfigKey.property_formula, data.formula, options),\n      markConfig: this.buildMarkConfigs(context, data.markConfig),\n      imageSource: this.buildImageSource(context, data.imageSource),\n      person: this.buildPerson(context, data.person),\n      bot: this.toAstProperty(bitType, ConfigKey.property_bot, data.bot, options),\n      referenceProperty: this.toAstProperty(\n        bitType,\n        ConfigKey.property_reference,\n        data.referenceProperty,\n        options,\n      ),\n\n      // Author data\n      fullName: this.toAstProperty(bitType, ConfigKey.property_fullName, data.fullName, options),\n      pseudonym: this.toAstProperty(bitType, ConfigKey.property_pseudonym, data.pseudonym, options),\n      titleString: this.toAstProperty(bitType, ConfigKey.property_title, data.titleString, options),\n      jobTitle: this.toAstProperty(bitType, ConfigKey.property_jobTitle, data.jobTitle, options),\n\n      // Book data\n      title: this.handleJsonText(context, TextLocation.tag, data.title),\n      subtitle: this.handleJsonText(context, TextLocation.tag, data.subtitle),\n      level: NumberUtils.asNumber(data.level),\n      toc: this.toAstProperty(bitType, ConfigKey.property_toc, data.toc, options),\n      progress: this.toAstProperty(bitType, ConfigKey.property_progress, data.progress, options),\n      anchor: data.anchor,\n      reference: data.reference,\n      referenceEnd: data.referenceEnd,\n      revealSolutions: this.toAstProperty(\n        bitType,\n        ConfigKey.property_revealSolutions,\n        data.revealSolutions,\n        options,\n      ),\n\n      // Item, Lead, Hint, Instruction\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      pageNumber: this.handleJsonText(context, TextLocation.tag, data.pageNumber),\n      marginNumber: this.handleJsonText(context, TextLocation.tag, data.marginNumber),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n\n      partialAnswer: this.toAstProperty(\n        bitType,\n        ConfigKey.property_partialAnswer,\n        data.partialAnswer,\n        options,\n      ),\n      sampleSolution: this.toAstProperty(\n        bitType,\n        ConfigKey.property_sampleSolution,\n        data.sampleSolution,\n        options,\n      ),\n      additionalSolutions: this.toAstProperty(\n        bitType,\n        ConfigKey.property_additionalSolutions,\n        data.additionalSolutions,\n        options,\n      ),\n\n      // Example\n      ...this.toExample(data.__isDefaultExample, data.example as TextAst),\n\n      // Person\n\n      previewImage: this.toImageResources(context, data.previewImage),\n      previewVideo: this.toVideoResources(context, data.previewVideo),\n      imagePlaceholder: this.toImageResource(context, data.imagePlaceholder),\n      resources: ArrayUtils.asArray(\n        this.resourceBuilder.resourceFromResourceJson(context, data.resources),\n      ),\n\n      // Body, Card, Footer, must be after all other properties except the extraProperties and markup / parser\n      body: this.buildBody(context, data.body),\n      cardNode,\n      footer: this.buildFooter(context, data.footer),\n\n      // Must be after other properties/tags in the AST so key clashes are avoided correctly\n      extraProperties: this.parseExtraProperties(data.extraProperties),\n\n      markup: data.markup,\n      parser: data.parser,\n\n      // Private properties\n      __isDefaultExample: data.__isDefaultExample ?? false,\n    };\n\n    // Push reasonableNumOfChars down the tree for the interview bits\n    if (Config.isOfBitType(node.bitType, BitType.interview)) {\n      this.pushDownTree(\n        context,\n        undefined,\n        undefined,\n        cardNode,\n        'questions',\n        'reasonableNumOfChars',\n        data.reasonableNumOfChars,\n      );\n    }\n\n    // Push reasonableNumOfChars down the tree for the feedback bits\n    if (Config.isOfBitType(node.bitType, BitType.feedback)) {\n      this.pushDownTree(\n        context,\n        undefined,\n        undefined,\n        cardNode,\n        ['feedbacks', 'reason'],\n        'reasonableNumOfChars',\n        data.reasonableNumOfChars,\n      );\n    }\n\n    // Push isCaseSensitive down the tree for the cloze, match and match-matrix bits\n    this.pushDownTree(\n      context,\n      [node.body, ...(cardNode?.cardBits?.map((cardBit) => cardBit.body) || [])],\n      [BodyBitType.gap],\n      undefined,\n      undefined, //'isCaseSensitive',\n      'isCaseSensitive',\n      data.isCaseSensitive ?? true,\n    );\n\n    this.pushDownTree(\n      context,\n      undefined,\n      undefined,\n      cardNode,\n      'pairs',\n      'isCaseSensitive',\n      data.isCaseSensitive ?? true,\n    );\n    this.pushDownTree(\n      context,\n      undefined,\n      undefined,\n      cardNode,\n      ['matrix', 'cells'],\n      'isCaseSensitive',\n      data.isCaseSensitive ?? true,\n    );\n\n    // If __isDefaultExample is set at the bit level, push the default example down the tree to the relevant nodes\n    this.pushExampleDownTree(\n      context,\n      node.body,\n      cardNode,\n      node.__isDefaultExample,\n      convertedExample.example,\n    );\n\n    // Set default values\n    this.setDefaultBitValues(node);\n\n    // Set the 'isExample' flags\n    this.setIsExampleFlags(node);\n\n    // Add the version to the parser info\n    this.addVersionToParserInfo(node);\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreUndefined: ['example'],\n      ignoreEmptyArrays: ['item', 'lead', 'pageNumber', 'marginNumber', 'hint', 'instruction'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateBit(node);\n  }\n\n  /**\n   * Build books[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildBooks(\n    context: BuildContext,\n    data: Partial<BookJson>[] | string | undefined,\n  ): BookJson[] | string | undefined {\n    if (StringUtils.isString(data)) return data as string;\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildBook(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build choice node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildBook(\n    _context: BuildContext,\n    data: Partial<BookJson> | undefined,\n  ): BookJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: BookJson = {\n      book: data.book ?? '',\n      reference: data.reference ?? '',\n      referenceEnd: (data.referenceEnd ?? undefined) as string,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyString: ['book', 'reference'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build groupTag[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildGroupTags(\n    context: BuildContext,\n    data: Partial<GroupTagJson> | Partial<GroupTagJson>[] | undefined,\n  ): GroupTagJson[] | undefined {\n    if (!data) return undefined;\n    if (!Array.isArray(data)) data = [data];\n    let nodes = data.map((d) => this.buildGroupTag(context, d)).filter((d) => d != null);\n\n    // Combine tags with the same name, filtering out duplicate tags\n    const combinedNodes: Record<string, GroupTagJson> = {};\n    for (const node of nodes) {\n      if (!node) continue;\n      if (!combinedNodes[node.name]) {\n        combinedNodes[node.name] = node;\n      } else {\n        combinedNodes[node.name].tags = ArrayUtils.removeDuplicates([\n          ...combinedNodes[node.name].tags,\n          ...node.tags,\n        ]);\n      }\n    }\n\n    nodes = Object.values(combinedNodes);\n\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build groupTag node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildGroupTag(\n    _context: BuildContext,\n    data: Partial<GroupTagJson> | undefined,\n  ): GroupTagJson | undefined {\n    if (!data) return undefined;\n\n    const tags: string[] = Array.isArray(data.tags) ? data.tags : [];\n\n    // NOTE: Node order is important and is defined here\n    const node: GroupTagJson = {\n      name: data.name ?? '',\n      tags: tags.map((tag) => tag?.trim() ?? '') ?? [],\n    };\n\n    // Remove Unset Optionals\n    // ObjectUtils.removeUnwantedProperties(node, {\n    //   ignoreAllFalse: true,\n    //   ignoreEmptyString: ['book', 'reference'],\n    // });\n\n    return node;\n  }\n\n  /**\n   * Build feedbackChoices[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFeedbackChoices(\n    context: BuildContext,\n    data: Partial<FeedbackChoiceJson>[] | undefined,\n  ): FeedbackChoiceJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildFeedbackChoice(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build feedbackChoice node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFeedbackChoice(\n    context: BuildContext,\n    data: Partial<FeedbackChoiceJson> | undefined,\n  ): FeedbackChoiceJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: FeedbackChoiceJson = {\n      choice: data.choice ?? '',\n      requireReason: !!data.requireReason,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, true),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build feedbackReason node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFeedbackReason(\n    context: BuildContext,\n    data: Partial<FeedbackReasonJson> | undefined,\n  ): FeedbackReasonJson | undefined {\n    if (!data) return undefined;\n\n    // Set default example\n    // Not __testAst - there is no default example\n    const defaultExample = this.handleJsonText(context, TextLocation.tag, 'true');\n\n    // NOTE: Node order is important and is defined here\n    const node: FeedbackReasonJson = {\n      text: data.text ?? '',\n      reasonableNumOfChars: (data.reasonableNumOfChars ?? undefined) as number,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, defaultExample),\n      __textAst: data.__textAst,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n      ignoreUndefined: ['example', 'reasonableNumOfChars'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build choice[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildChoices(\n    context: BuildContext,\n    data: Partial<ChoiceJson>[] | undefined,\n  ): ChoiceJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildChoice(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build choice node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildChoice(\n    context: BuildContext,\n    data: Partial<ChoiceJson> | undefined,\n  ): ChoiceJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: ChoiceJson = {\n      choice: data.choice ?? '',\n      isCorrect: !!data.isCorrect,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, !!data.isCorrect),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build response[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildResponses(\n    context: BuildContext,\n    data: Partial<ResponseJson>[] | undefined,\n  ): ResponseJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildResponse(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build response node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildResponse(\n    context: BuildContext,\n    data: Partial<ResponseJson> | undefined,\n  ): ResponseJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: ResponseJson = {\n      response: data.response ?? '',\n      isCorrect: !!data.isCorrect,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, !!data.isCorrect),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build bot response[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildBotResponses(\n    context: BuildContext,\n    data: Partial<BotResponseJson>[] | undefined,\n  ): BotResponseJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.botResponse(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build bot response node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected botResponse(\n    context: BuildContext,\n    data: Partial<BotResponseJson> | undefined,\n  ): BotResponseJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: BotResponseJson = {\n      response: data.response ?? '',\n      reaction: data.reaction ?? '',\n      feedback: data.feedback ?? '',\n      item: data.item ?? '',\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyString: ['response', 'reaction', 'feedback', 'item'],\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: [],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build feedbacks[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFeedbacks(\n    context: BuildContext,\n    data: Partial<FeedbackJson>[] | undefined,\n  ): FeedbackJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildFeedback(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build feedback node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFeedback(\n    context: BuildContext,\n    data: Partial<FeedbackJson> | undefined,\n  ): FeedbackJson | undefined {\n    if (!data) return undefined;\n\n    let choices: FeedbackChoiceJson[] | undefined;\n    let reason: FeedbackReasonJson | undefined;\n\n    if (data.choices) {\n      choices = this.buildFeedbackChoices(context, data.choices);\n\n      // Push __isDefaultExample down the tree\n      // this.pushExampleDownTreeBoolean(context, data.__isDefaultExample, convertedExample.example, true, choices);\n    } else {\n      // No choices, not a valid feedback\n      return undefined;\n    }\n\n    if (data.reason) {\n      reason = this.buildFeedbackReason(context, data.reason);\n    }\n\n    // NOTE: Node order is important and is defined here\n    const node: FeedbackJson = {\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      // isExample: !!data.__defaultExample,\n      choices: choices as FeedbackChoiceJson[],\n      reason: reason as FeedbackReasonJson, // Might be undefined\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build quizzes[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildQuizzes(\n    context: BuildContext,\n    data: Partial<QuizJson>[] | undefined,\n  ): QuizJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildQuiz(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build quiz node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildQuiz(\n    context: BuildContext,\n    data: Partial<QuizJson> | undefined,\n  ): QuizJson | undefined {\n    if (!data) return undefined;\n\n    const convertedExample = {\n      ...this.toExample(data.__isDefaultExample, data.__defaultExample),\n    };\n\n    let choices: ChoiceJson[] | undefined;\n    let responses: ResponseJson[] | undefined;\n\n    if (data.choices) {\n      choices = this.buildChoices(context, data.choices);\n\n      // Push __isDefaultExample down the tree\n      this.pushExampleDownTreeBoolean(\n        context,\n        data.__isDefaultExample,\n        convertedExample.example,\n        true,\n        choices,\n      );\n    } else if (data.responses) {\n      responses = this.buildResponses(context, data.responses);\n\n      // Push __isDefaultExample down the tree\n      this.pushExampleDownTreeBoolean(\n        context,\n        data.__isDefaultExample,\n        convertedExample.example,\n        false,\n        responses,\n      );\n    } else {\n      // No choices or responses, not a valid quiz\n      return undefined;\n    }\n\n    // NOTE: Node order is important and is defined here\n    const node: QuizJson = {\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      isExample: !!data.__defaultExample,\n      choices: choices as ChoiceJson[],\n      responses: responses as ResponseJson[],\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build heading node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildHeading(\n    _context: BuildContext,\n    data: Partial<HeadingJson> | undefined,\n  ): HeadingJson | undefined {\n    if (!data) return undefined;\n    if (data.forKeys == null) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: HeadingJson = {\n      forKeys: data.forKeys ?? '',\n      forValues: data.forValues ?? data.__forValuesDefault ?? '',\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyString: ['forKeys', 'forValues'],\n      ignoreEmptyArrays: ['forValues'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build pair[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildPairs(\n    context: BuildContext,\n    data: Partial<PairJson>[] | undefined,\n  ): PairJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildPair(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build pair node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildPair(\n    context: BuildContext,\n    data: Partial<PairJson> | undefined,\n  ): PairJson | undefined {\n    if (!data) return undefined;\n\n    // Set default example\n    const defaultExample =\n      Array.isArray(data.__valuesAst) && data.__valuesAst.length > 0 ? data.__valuesAst[0] : null;\n\n    // Process the keyAudio and keyImage resources\n    const keyAudio = this.resourceBuilder.resourceFromResourceJson(\n      context,\n      data.keyAudio,\n    ) as AudioResourceWrapperJson;\n    const keyImage = this.resourceBuilder.resourceFromResourceJson(\n      context,\n      data.keyImage,\n    ) as ImageResourceWrapperJson;\n\n    // NOTE: Node order is important and is defined here\n    const node: PairJson = {\n      key: data.key ?? '',\n      keyAudio,\n      keyImage,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      isCaseSensitive: data.isCaseSensitive as boolean,\n      ...this.toExample(data.__isDefaultExample, data.example, defaultExample),\n      values: data.values || [],\n      __valuesAst: data.__valuesAst,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction', 'values'],\n      ignoreUndefined: ['example', 'isCaseSensitive'],\n    });\n\n    // if (node.key) {\n    //   delete node.keyAudio;\n    //   delete node.keyImage;\n    // }\n    // if (node.keyAudio != null) {\n    //   delete node.key;\n    //   delete node.keyImage;\n    // }\n    // if (node.keyImage != null) {\n    //   delete node.key;\n    //   delete node.keyAudio;\n    // }\n\n    return node;\n  }\n\n  /**\n   * Build matrix[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMatricies(\n    context: BuildContext,\n    data: Partial<MatrixJson>[] | undefined,\n  ): MatrixJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildMatrix(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build matrix node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMatrix(\n    context: BuildContext,\n    data: Partial<MatrixJson> | undefined,\n  ): MatrixJson | undefined {\n    if (!data) return undefined;\n\n    // const convertedExample = {\n    //   ...this.toExample(__isDefaultExample, example),\n    // };\n\n    // // Push __isDefaultExample down the tree\n    // this.pushExampleDownTreeBoolean(__isDefaultExample, convertedExample.example, true, choices);\n    // this.pushExampleDownTreeBoolean(__isDefaultExample, convertedExample.example, false, responses);\n\n    let isExample = false;\n\n    // Set isExample for matrix based on isExample for cells\n    for (const c of data.cells || []) {\n      if (data.__isDefaultExample && !c.isExample) {\n        c.isExample = true;\n      }\n      isExample = c.isExample ? true : isExample;\n    }\n\n    // NOTE: Node order is important and is defined here\n    const node: MatrixJson = {\n      key: data.key ?? '',\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      isExample,\n      cells: (data.cells || [])\n        .map((c) => this.buildMatrixCell(context, c))\n        .filter((c) => c != null),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['hint', 'item', 'cells'],\n      ignoreUndefined: ['isCaseSensitive'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build matrixCell node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMatrixCell(\n    context: BuildContext,\n    data: Partial<MatrixCellJson> | undefined,\n  ): MatrixCellJson | undefined {\n    if (!data) return undefined;\n\n    // Set default example\n    const defaultExample =\n      Array.isArray(data.__valuesAst) && data.__valuesAst.length > 0 ? data.__valuesAst[0] : null;\n\n    // NOTE: Node order is important and is defined here\n    const node: MatrixCellJson = {\n      values: data.values || [],\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      isCaseSensitive: data.isCaseSensitive as boolean,\n      ...this.toExample(data.__isDefaultExample, data.example, defaultExample),\n      __valuesAst: data.__valuesAst,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['instruction', 'item', 'values'],\n      ignoreUndefined: ['example', 'isCaseSensitive'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build pronunciation table node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildPronunciationTable(\n    context: BuildContext,\n    dataIn: Partial<PronunciationTableJson> | undefined,\n  ): PronunciationTableJson | undefined {\n    if (!dataIn) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: PronunciationTableJson = {\n      data: (dataIn.data || []).map((row) =>\n        (row || []).map((cell) => {\n          // Process the audio resource\n          const audio = this.resourceBuilder.resourceFromResourceJson(\n            context,\n            cell.audio,\n          ) as AudioResourceWrapperJson;\n\n          return {\n            title: this.handleJsonText(context, TextLocation.tag, cell.title),\n            body: this.handleJsonText(context, TextLocation.tag, cell.body),\n            audio,\n          };\n        }),\n      ),\n    };\n\n    // Remove Unset Optionals\n    // ObjectUtils.removeUnwantedProperties(node, {\n    //   ignoreAllFalse: true,\n    // });\n\n    return node;\n  }\n\n  /**\n   * Build table / table extended node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildTable(\n    context: BuildContext,\n    dataIn: Partial<TableJson | TableExtendedJson> | undefined,\n  ): TableJson | TableExtendedJson | undefined {\n    if (!dataIn) return undefined;\n\n    const node = normalizeTableFormat(context.bitType, dataIn as TableJson | TableExtendedJson);\n    const nodeTable = node as TableJson;\n    const nodeTableExtended = node as TableExtendedJson;\n\n    // Parse standard table properties\n    if (Array.isArray(nodeTable.columns) && nodeTable.columns.length > 0) {\n      nodeTable.columns = nodeTable.columns.map((col) =>\n        this.handleJsonText(context, TextLocation.tag, col),\n      );\n    }\n\n    if (Array.isArray(nodeTable.data) && nodeTable.data.length > 0) {\n      nodeTable.data = nodeTable.data.map((row) =>\n        (row || []).map((cell) => this.handleJsonText(context, TextLocation.tag, cell)),\n      );\n    }\n\n    // Parse extended table properties\n    const buildSection = (section: TableSectionJson | undefined): TableSectionJson | undefined => {\n      if (!section || !Array.isArray(section.rows)) return undefined;\n\n      const rows = section.rows.map((row: Partial<TableRowJson>) => {\n        const cells = (row.cells || []).map((cell: Partial<TableCellJson>) => {\n          const tableCell: TableCellJson = {\n            content: this.handleJsonText(context, TextLocation.tag, cell.content),\n          };\n\n          if (cell.title != null) tableCell.title = cell.title;\n          if (cell.rowspan != null) tableCell.rowspan = cell.rowspan;\n          if (cell.colspan != null) tableCell.colspan = cell.colspan;\n          if (cell.scope) tableCell.scope = cell.scope;\n          if (cell.colwidth != null) tableCell.colwidth = cell.colwidth;\n\n          return tableCell;\n        });\n\n        return {\n          cells,\n        };\n      });\n\n      return {\n        rows,\n      };\n    };\n\n    const header = buildSection(nodeTableExtended.header);\n    if (header && header.rows?.length > 0) nodeTableExtended.header = header;\n\n    const body = buildSection(nodeTableExtended.body);\n    if (body && body.rows?.length > 0) nodeTableExtended.body = body;\n\n    const footer = buildSection(nodeTableExtended.footer);\n    if (footer && footer.rows?.length > 0) nodeTableExtended.footer = footer;\n\n    // Remove Unset Optionals\n    // ObjectUtils.removeUnwantedProperties(node, {\n    //   ignoreAllFalse: true,\n    // });\n\n    return node;\n  }\n\n  /**\n   * Build question[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildQuestions(\n    context: BuildContext,\n    data: Partial<QuestionJson>[] | undefined,\n  ): QuestionJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildQuestion(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build question node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildQuestion(\n    context: BuildContext,\n    data: Partial<QuestionJson> | undefined,\n  ): QuestionJson | undefined {\n    if (!data) return undefined;\n\n    // Set default example\n    const defaultExample = data.__sampleSolutionAst;\n\n    // NOTE: Node order is important and is defined here\n    const node: QuestionJson = {\n      question: this.handleJsonText(context, TextLocation.body, data.question),\n      partialAnswer: data.partialAnswer ?? '',\n      sampleSolution: data.sampleSolution ?? '',\n      additionalSolutions: (data.additionalSolutions ?? undefined) as string[],\n      reasonableNumOfChars: (data.reasonableNumOfChars ?? undefined) as number,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, defaultExample),\n      __sampleSolutionAst: data.__sampleSolutionAst,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['question', 'item', 'hint', 'instruction'],\n      ignoreUndefined: ['example'],\n      ignoreEmptyString: ['partialAnswer', 'sampleSolution'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build ingredient[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildIngredients(\n    context: BuildContext,\n    data: Partial<IngredientJson>[] | undefined,\n  ): IngredientJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildIngredient(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build ingredient node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildIngredient(\n    context: BuildContext,\n    data: Partial<IngredientJson> | undefined,\n  ): IngredientJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: IngredientJson = {\n      title: this.handleJsonText(context, TextLocation.tag, data.title),\n      checked: data.checked ?? false,\n      ingredient: this.handleJsonText(context, TextLocation.tag, data.ingredient),\n      quantity: data.quantity ?? 0,\n      unit: data.unit ?? '',\n      unitAbbr: data.unitAbbr ?? '',\n      decimalPlaces: data.decimalPlaces ?? 1,\n      disableCalculation: data.disableCalculation ?? false,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      // ignoreAllEmptyArrays: true,\n      // ignoreUndefined: ['example'],\n      ignoreEmptyString: ['item', 'unit'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build body node\n   * - Handles JSON, Bitmark text, and plain text\n   *   - body: set to either string, TextAst, or JSON\n   *   - bodyBits: set to array of BodyBitJson (will be validated and merged into body if it is a string)\n   *   - placeholders: set to placeholders from v2 JSON when body is a v2 JSON string\n   *   - bodyString: set to the original string if body is a string (only used for card body)\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildBody(context: BuildContext, data: Partial<Body> | undefined): Body | undefined {\n    if (!data) return undefined;\n    let body: JsonText | unknown | undefined;\n    const bodyBits: BodyBitJson[] = [];\n    const placeholders = data.placeholders;\n    const bodyString = data.bodyString;\n    const { textFormat } = context;\n\n    // Handle JSON type body\n    const handleJsonBody = () => {\n      // Attempt to parse a string body as JSON to support the legacy format\n      if (typeof data.body === 'string') {\n        try {\n          body = JSON.parse(data.body);\n        } catch (_e) {\n          // Could not parse JSON - set body to null\n          body = null;\n        }\n      } else {\n        body = data.body;\n      }\n    };\n\n    // Handle Bitmark text type body (both AST v3 and plain text v2)\n    const handleBitmarkTextBody = () => {\n      let rawBody: TextAst = data.body as TextAst;\n      let bodyStr: BreakscapedString | undefined;\n      const placeholderNodes: {\n        [keyof: string]: BodyBitJson;\n      } = {};\n      // TODO - process body bits through the correct builders.\n\n      if (StringUtils.isString(data.body)) {\n        // Body is a string (legacy bitmark v2, or not bitmarkText)\n        bodyStr = ((data.body as BreakscapedString) ?? '').trim() as BreakscapedString;\n        rawBody = [];\n      } else if (Array.isArray(data.body)) {\n        // Body is an array (prosemirror like JSON)\n        // Already in the correct format\n      } else {\n        // body is invalid\n        rawBody = [];\n      }\n\n      if (placeholders) {\n        for (const [key, val] of Object.entries(placeholders)) {\n          // const bit = this.bodyBitToAst(val);\n          // placeholderNodes[key] = bit as BodyBit;\n          placeholderNodes[key] = val as BodyBitJson;\n        }\n      }\n\n      if (bodyStr) {\n        // Bug #7141: Use textFormat for textParser, not always bitmarkText if it is a v2 string body\n        // However, only use plain text breakscaping the text from the v2 JSON body\n\n        // Special v2 Breakscaping\n        bodyStr = Breakscape.breakscape(bodyStr, {\n          format: textFormat,\n          location: TextLocation.body,\n          v2: true,\n        });\n\n        // Convert placeholders {1} to [!1], etc.\n        let index = 0;\n        const newPlaceholderNodes: BodyBitJson[] = [];\n        for (const [key, val] of Object.entries(placeholderNodes)) {\n          if (bodyStr) {\n            const newKey = `[!${index}]`;\n            bodyStr = bodyStr.replace(`${key}`, newKey) as BreakscapedString;\n            newPlaceholderNodes.push(val);\n            index++;\n          }\n        }\n\n        // Convert the body string to AST\n        rawBody = this.textParser.toAst(bodyStr, {\n          format: textFormat,\n          location: TextLocation.body,\n        });\n\n        const replaceBitsRecursive = (bodyText: TextAst) => {\n          for (let i = 0, len = bodyText.length; i < len; i++) {\n            const bodyPart = bodyText[i];\n            if ((bodyPart.type as string) === 'bit') {\n              // eslint-disable-next-line @typescript-eslint/no-explicit-any\n              const index = (bodyPart as any).index as number;\n              if (newPlaceholderNodes[index] != null) {\n                bodyText[i] = newPlaceholderNodes[index] as TextNode;\n              }\n            } else {\n              if (bodyPart.content) replaceBitsRecursive(bodyPart.content);\n            }\n          }\n        };\n\n        // Replace the placeholders with the AST\n        replaceBitsRecursive(rawBody);\n      }\n\n      // Process the body bits to ensure they are valid\n      // Walking the body bits will change them, so we should make a copy before processing\n      rawBody = structuredClone(rawBody);\n      this.textParser.walkBodyBits(rawBody, (parent, index, bodyBit) => {\n        // Ensure the body bit is valid\n        let parsedBit: BodyBitJson | undefined;\n        switch (bodyBit.type) {\n          case BodyBitType.gap:\n            parsedBit = this.buildGap(context, bodyBit as GapJson);\n            break;\n          case BodyBitType.mark:\n            parsedBit = this.buildMark(context, bodyBit as MarkJson);\n            break;\n          case BodyBitType.select:\n            parsedBit = this.buildSelect(context, bodyBit as SelectJson);\n            break;\n          case BodyBitType.highlight:\n            parsedBit = this.buildHighlight(context, bodyBit as HighlightJson);\n            break;\n          default:\n          // TODO?? Ensure other parts are valid\n        }\n        if (parsedBit != undefined) {\n          parent[index] = parsedBit as TextNode;\n          bodyBits.push(parsedBit);\n        }\n      });\n\n      // Set the body\n      body = rawBody;\n\n      // Mark the body as text\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (body as any).__tag = 'text';\n    };\n\n    const handlePlainTextBody = () => {\n      body = data.body as string;\n    };\n\n    const isBitmarkText = textFormat === TextFormat.bitmarkText;\n    if (textFormat === TextFormat.json) {\n      // JSON\n      handleJsonBody();\n    } else if (isBitmarkText) {\n      // Bitmark text (either ast or string)\n      handleBitmarkTextBody();\n    } else {\n      // Text but not bitmark (plain text)\n      handlePlainTextBody();\n    }\n\n    const node: Body = {\n      body,\n      bodyBits,\n      bodyString,\n      // Placeholders are only ever parsed into AST, never stored directly\n    };\n\n    return node;\n  }\n\n  /**\n   * Build footer node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFooter(\n    context: BuildContext,\n    data: Partial<Footer> | undefined,\n  ): Footer | undefined {\n    if (!data) return undefined;\n    const node: Footer = {\n      footer: this.handleJsonText(context, TextLocation.body, data.footer),\n    };\n\n    return node;\n  }\n\n  /**\n   * Build gap node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildGap(\n    context: BuildContext,\n    data: Partial<GapJson> | undefined,\n  ): GapJson | undefined {\n    if (!data) return undefined;\n\n    // Set default example\n    const defaultExample =\n      Array.isArray(data.__solutionsAst) && data.__solutionsAst.length > 0\n        ? data.__solutionsAst[0]\n        : null;\n\n    // Copy any attributes from 'attrs' to the body bit (data is in 'attrs' when coming from JSON)\n    data = this.bodyBitCopyFromAttrs(data);\n\n    // NOTE: Node order is important and is defined here\n    const node: GapJson = {\n      type: BodyBitType.gap,\n      solutions: data.solutions || [], // Must be before other properties except type\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      isCaseSensitive: data.isCaseSensitive as boolean,\n      ...this.toExample(data.__isDefaultExample, data.example, defaultExample),\n      __solutionsAst: data.__solutionsAst,\n\n      attrs: {},\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreUndefined: ['example', 'isCaseSensitive'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build mark configs node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMarkConfigs(\n    context: BuildContext,\n    data: Partial<MarkConfigJson>[] | undefined,\n  ): MarkConfigJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildMarkConfig(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build mark config node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMarkConfig(\n    _context: BuildContext,\n    data: Partial<MarkConfigJson> | undefined,\n  ): MarkConfigJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: MarkConfigJson = {\n      mark: data.mark ?? 'unknown',\n      color: data.color ?? '',\n      emphasis: data.emphasis ?? '',\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllEmptyString: true,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build mark node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMark(\n    context: BuildContext,\n    data: Partial<MarkJson> | undefined,\n  ): MarkJson | undefined {\n    if (!data) return undefined;\n\n    // Copy any attributes from 'attrs' to the body bit (data is in 'attrs' when coming from JSON)\n    data = this.bodyBitCopyFromAttrs(data);\n\n    // NOTE: Node order is important and is defined here\n    const node: MarkJson = {\n      type: BodyBitType.mark,\n      solution: data.solution ?? '', // Must be before other properties except type\n      mark: data.mark ?? '',\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, true),\n\n      attrs: {},\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreUndefined: ['example'],\n      ignoreEmptyString: ['solution', 'mark'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build select node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildSelect(\n    context: BuildContext,\n    data: Partial<SelectJson> | undefined,\n  ): SelectJson | undefined {\n    if (!data) return undefined;\n\n    // Copy any attributes from 'attrs' to the body bit (data is in 'attrs' when coming from JSON)\n    data = this.bodyBitCopyFromAttrs(data);\n\n    // NOTE: Node order is important and is defined here\n    const node: SelectJson = {\n      type: BodyBitType.select,\n      options: this.buildSelectOptions(context, data.options) || [], // Must be before other properties except type\n      prefix: data.prefix ?? '',\n      postfix: data.postfix ?? '',\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(false, undefined, undefined), // Will be set in later\n      __hintString: data.__hintString,\n      __instructionString: data.__instructionString,\n\n      attrs: {},\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreEmptyString: ['prefix', 'postfix'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build selectOption[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildSelectOptions(\n    context: BuildContext,\n    data: Partial<SelectOptionJson>[] | undefined,\n  ): SelectOptionJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildSelectOption(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build selectOption node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildSelectOption(\n    context: BuildContext,\n    data: Partial<SelectOptionJson> | undefined,\n  ): SelectOptionJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: SelectOptionJson = {\n      text: data.text ?? '', // Must be before other properties except type\n      isCorrect: !!data.isCorrect,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, !!data.isCorrect),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build highlight node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  buildHighlight(\n    context: BuildContext,\n    data: Partial<HighlightJson> | undefined,\n  ): HighlightJson | undefined {\n    if (!data) return undefined;\n\n    // Copy any attributes from 'attrs' to the body bit (data is in 'attrs' when coming from JSON)\n    data = this.bodyBitCopyFromAttrs(data);\n\n    // NOTE: Node order is important and is defined here\n    const node: HighlightJson = {\n      type: BodyBitType.highlight,\n      texts: this.buildHighlightTexts(context, data.texts) || [], // Must be before other properties except type\n      prefix: data.prefix ?? '',\n      postfix: data.postfix ?? '',\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(false, undefined, undefined), // Will be set in later\n\n      attrs: {},\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreEmptyString: ['prefix', 'postfix'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build highlightText[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildHighlightTexts(\n    context: BuildContext,\n    data: Partial<HighlightTextJson>[] | undefined,\n  ): HighlightTextJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildHighlightText(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build highlightText node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildHighlightText(\n    context: BuildContext,\n    data: Partial<HighlightTextJson> | undefined,\n  ): HighlightTextJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: HighlightTextJson = {\n      text: data.text ?? '', // Must be before other properties except type\n      isCorrect: !!data.isCorrect,\n      isHighlighted: !!data.isHighlighted,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, !!data.isCorrect),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build flashcards node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFlashcards(\n    context: BuildContext,\n    data: Partial<FlashcardJson>[] | undefined,\n  ): FlashcardJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildFlashcard(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build flashcard node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFlashcard(\n    context: BuildContext,\n    data: Partial<FlashcardJson> | undefined,\n  ): FlashcardJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: FlashcardJson = {\n      question: this.buildTextAndIcon(context, data.question) as TextAndIconJson,\n      answer: this.buildTextAndIcon(context, data.answer) as TextAndIconJson,\n      alternativeAnswers: (data.alternativeAnswers || [])\n        .map((d) => this.buildTextAndIcon(context, d))\n        .filter((d) => d != null),\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, true),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: [\n        'question',\n        'answer',\n        'alternativeAnswers',\n        'item',\n        'hint',\n        'instruction',\n      ],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build definitionListItem[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildDefinitionList(\n    context: BuildContext,\n    data: Partial<DefinitionListItemJson>[] | undefined,\n  ): DefinitionListItemJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data\n      .map((d) => this.buildDefinitionListItem(context, d))\n      .filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build definitionListItem node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildDefinitionListItem(\n    context: BuildContext,\n    data: Partial<DefinitionListItemJson> | undefined,\n  ): DefinitionListItemJson | undefined {\n    if (!data) return undefined;\n\n    const { bitType } = context;\n\n    const textAsStrings = Config.isOfBitType(bitType, [BitType.metaSearchDefaultTerms]);\n\n    // NOTE: Node order is important and is defined here\n    const node: DefinitionListItemJson = {\n      term: this.buildTextAndIcon(context, data.term, textAsStrings) as TextAndIconJson,\n      definition: this.buildTextAndIcon(context, data.definition, textAsStrings) as TextAndIconJson,\n      alternativeDefinitions: (data.alternativeDefinitions || [])\n        .map((d) => this.buildTextAndIcon(context, d, textAsStrings))\n        .filter((d) => d != null),\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, true),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: [\n        'question',\n        'answer',\n        'alternativeDefinitions',\n        'item',\n        'hint',\n        'instruction',\n      ],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  protected buildTextAndIcon(\n    context: BuildContext,\n    data: Partial<TextAndIconJson> | undefined,\n    textAsStrings: boolean = false,\n  ): TextAndIconJson | undefined {\n    const icon = this.resourceBuilder.resourceFromResourceJson(\n      context,\n      data?.icon,\n    ) as ImageResourceWrapperJson;\n\n    // Ensure text is bitmark text\n    let text: JsonText = this.handleJsonText(\n      context,\n      TextLocation.tag,\n      data?.text || (data as string),\n    );\n\n    if (textAsStrings) {\n      // Convert the bitmark text to plain text (without breakscaping, as that will happen in the Bitmark Generator)\n      text = this.textGenerator\n        .generateSync(text as TextAst, TextFormat.plainText, TextLocation.body, {\n          noBreakscaping: true,\n        })\n        .trim();\n    }\n\n    // NOTE: Node order is important and is defined here\n    const node: TextAndIconJson = {\n      text,\n      icon,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyArrays: ['text'],\n      ignoreUndefined: ['icon'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build statement[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildStatements(\n    context: BuildContext,\n    data: Partial<StatementJson>[] | undefined,\n  ): StatementJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildStatement(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build statement node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildStatement(\n    context: BuildContext,\n    data: Partial<StatementJson> | undefined,\n  ): StatementJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: StatementJson = {\n      statement: this.handleJsonText(context, TextLocation.tag, data.statement),\n      isCorrect: !!data.isCorrect,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, !!data.isCorrect),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['statement'],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build (image-on-device) imageSource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildImageSource(\n    _context: BuildContext,\n    data: Partial<ImageSourceJson> | undefined,\n  ): ImageSourceJson | undefined {\n    if (!data) return undefined;\n    const { url, mockupId, size, format, trim } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: ImageSourceJson = {\n      url: url ?? '',\n      mockupId: mockupId ?? '',\n      size: (size ?? null) as number,\n      format: (format ?? null) as string,\n      trim: (BooleanUtils.isBoolean(trim) ? trim : null) as boolean,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreFalse: ['trim'],\n      ignoreEmptyString: ['url', 'mockupId'],\n      ignoreAllUndefined: true,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build (chat) person node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildPerson(\n    context: BuildContext,\n    data: Partial<PersonJson> | undefined,\n  ): PersonJson | undefined {\n    if (!data) return undefined;\n    const { name, title, avatarImage } = data;\n    // { name: string; title?: string; avatarImage?: ImageResourceJson }\n\n    // NOTE: Node order is important and is defined here\n    const node: PersonJson = {\n      name: name ?? '',\n      title: (title ?? undefined) as string,\n      avatarImage: this.resourceBuilder.resourceFromResourceJson(\n        context,\n        avatarImage,\n      ) as ImageResourceWrapperJson,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyString: ['name'],\n      ignoreAllUndefined: true,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build (cook-ingredients) technicalTerm node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildTechnicalTerm(\n    _context: BuildContext,\n    data: Partial<TechnicalTermJson> | undefined,\n  ): TechnicalTermJson | undefined {\n    if (!data) return undefined;\n    const { technicalTerm, lang } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: TechnicalTermJson = {\n      technicalTerm: technicalTerm ?? '',\n      lang: lang ?? '',\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyString: ['technicalTerm'],\n      // ignoreAllUndefined: true,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build (cook-ingredients) servings node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildServings(\n    _context: BuildContext,\n    data: Partial<ServingsJson> | undefined,\n  ): ServingsJson | undefined {\n    if (!data) return undefined;\n    const { servings, unit, unitAbbr, decimalPlaces, disableCalculation, hint } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: ServingsJson = {\n      servings: servings ?? 0,\n      unit: unit ?? '',\n      unitAbbr: unitAbbr ?? '',\n      decimalPlaces: decimalPlaces ?? 1,\n      disableCalculation: disableCalculation ?? false,\n      hint: hint ?? '',\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyString: ['servings', 'unit'],\n      // ignoreAllUndefined: true,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build (survey-rating) ratingLevelStart / ratingLevelEnd node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildRatingLevelStartEnd(\n    context: BuildContext,\n    data: Partial<RatingLevelStartEndJson> | undefined,\n  ): RatingLevelStartEndJson | undefined {\n    if (!data) return undefined;\n    const { level, label } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: RatingLevelStartEndJson = {\n      level: level ?? 0,\n      label: this.handleJsonText(context, TextLocation.tag, label),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      // ignoreEmptyArrays: ['servings', 'unit'],\n      // ignoreAllUndefined: true,\n    });\n\n    return node;\n  }\n\n  // DEPRECATED - TO BE REMOVED IN FUTURE\n  // /**\n  //  * Build captionDefinition node\n  //  *\n  //  * @param data - data for the node\n  //  * @returns\n  //  */\n  // protected buildCaptionDefinition(\n  //   _context: BuildContext,\n  //   data: Partial<CaptionDefinitionJson> | undefined,\n  // ): CaptionDefinitionJson | undefined {\n  //   if (!data) return undefined;\n\n  //   // NOTE: Node order is important and is defined here\n  //   const node: CaptionDefinitionJson = {\n  //     // term: this.convertJsonTextToAstText(data.term),\n  //     // description: this.convertJsonTextToAstText(data.description),\n  //     term: data.term ?? '',\n  //     definition: data.definition ?? '',\n  //   };\n\n  //   // Remove Unset Optionals\n  //   ObjectUtils.removeUnwantedProperties(node, {\n  //     ignoreEmptyString: ['term', 'description'],\n  //     // ignoreAllUndefined: true,\n  //   });\n\n  //   return node;\n  // }\n\n  // /**\n  //  * Build captionDefinitionList node\n  //  *\n  //  * @param data - data for the node\n  //  * @returns\n  //  */\n  // protected buildCaptionDefinitionList(\n  //   context: BuildContext,\n  //   data: Partial<CaptionDefinitionListJson> | undefined,\n  // ): CaptionDefinitionListJson | undefined {\n  //   if (!data) return undefined;\n\n  //   // NOTE: Node order is important and is defined here\n  //   const node: CaptionDefinitionListJson = {\n  //     columns: data.columns || [],\n  //     definitions: (data.definitions || [])\n  //       .map((d) => {\n  //         return this.buildCaptionDefinition(context, {\n  //           term: d.term,\n  //           definition: d.definition,\n  //         });\n  //       })\n  //       .filter((d) => d != null),\n  //   };\n\n  //   // Remove Unset Optionals\n  //   ObjectUtils.removeUnwantedProperties(node, {\n  //     ignoreAllEmptyArrays: true,\n  //   });\n\n  //   return node;\n  // }\n\n  /**\n   * Build card bit[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildCardBits(\n    context: BuildContext,\n    data: Partial<CardBit>[] | undefined,\n  ): Bit[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildCardBit(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build card bit node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildCardBit(\n    context: BuildContext,\n    data: Partial<CardBit> | undefined,\n  ): CardBit | undefined {\n    if (!data) return undefined;\n    const { bitType, textFormat } = context;\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const node = this.buildBit({ ...data, bitType, textFormat } as any, {\n      cardSet: {\n        sideNo: 0,\n        variantNo: 0,\n      },\n    }) as CardBit;\n\n    // // NOTE: Node order is important and is defined here\n    // const node: CardBit = {\n    //   item: this.handleJsonText(data.item),\n    //   lead: this.handleJsonText(data.lead),\n    //   hint: this.handleJsonText(data.hint),\n    //   instruction: this.handleJsonText(data.instruction),\n    //   ...this.toExample(data.__isDefaultExample, data.example),\n    //   __isDefaultExample: data.__isDefaultExample ?? false,\n    //   body: this.buildBody(textFormat, data.body),\n\n    //   // Must always be last in the AST so key clashes are avoided correctly with other properties\n    //   extraProperties: this.parseExtraProperties(data.extraProperties),\n    // };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      // ignoreEmptyArrays: ['example'],\n      ignoreUndefined: ['example'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateCardBit(node);\n  }\n\n  protected toImageResource(\n    context: BuildContext,\n    data: Partial<ImageResourceWrapperJson> | undefined,\n  ): ImageResourceWrapperJson {\n    return ArrayUtils.asSingle(\n      this.resourceBuilder.resourceFromResourceDataJson(context, ResourceType.image, data?.image),\n    ) as ImageResourceWrapperJson;\n  }\n\n  protected toImageResources(\n    context: BuildContext,\n    data: Partial<ImageResourceWrapperJson> | Partial<ImageResourceWrapperJson>[] | undefined,\n  ): ImageResourceWrapperJson[] {\n    const arr = ArrayUtils.asArray(data);\n\n    const results: ImageResourceWrapperJson[] = [];\n    if (arr && arr.length > 0) {\n      for (const item of arr) {\n        const res = this.resourceBuilder.resourceFromResourceDataJson(\n          context,\n          ResourceType.image,\n          item.image,\n        );\n        results.push(res as ImageResourceWrapperJson);\n      }\n    }\n\n    return results;\n  }\n\n  protected toVideoResources(\n    context: BuildContext,\n    data: Partial<VideoResourceWrapperJson> | Partial<VideoResourceWrapperJson>[] | undefined,\n  ): VideoResourceWrapperJson[] {\n    const arr = ArrayUtils.asArray(data);\n\n    const results: VideoResourceWrapperJson[] = [];\n    if (arr && arr.length > 0) {\n      for (const item of arr) {\n        const res = this.resourceBuilder.resourceFromResourceDataJson(\n          context,\n          ResourceType.video,\n          item.video,\n        );\n        results.push(res as VideoResourceWrapperJson);\n      }\n    }\n\n    return results;\n  }\n\n  //\n  // Private\n  //\n\n  private buildCardNode(\n    context: BuildContext,\n    data: {\n      flashcards?: Partial<FlashcardJson>[];\n      definitions?: Partial<DefinitionListItemJson>[];\n      legend?: Partial<DefinitionListItemJson>[];\n      questions?: Partial<QuestionJson>[];\n      elements?: JsonText[];\n      statement?: Partial<StatementJson>;\n      statements?: Partial<StatementJson>[];\n      choices?: Partial<ChoiceJson>[];\n      responses?: Partial<ResponseJson>[];\n      feedbacks?: Partial<FeedbackJson>[];\n      quizzes?: Partial<QuizJson>[];\n      heading?: Partial<HeadingJson>;\n      pairs?: Partial<PairJson>[];\n      matrix?: Partial<MatrixJson>[];\n      pronunciationTable?: Partial<PronunciationTableJson>;\n      table?: Partial<TableJson | TableExtendedJson>;\n      botResponses?: Partial<BotResponseJson>[];\n      ingredients?: Partial<IngredientJson>[];\n      // DEPRECATED - TO BE REMOVED IN FUTURE\n      // captionDefinitionList?: Partial<CaptionDefinitionListJson>;\n      cardBits?: Partial<CardBit>[];\n    },\n  ): CardNode | undefined {\n    const node: CardNode = {\n      heading: this.buildHeading(context, data.heading),\n      questions: this.buildQuestions(context, data.questions),\n      elements: this.handleJsonText(context, TextLocation.body, data.elements),\n      flashcards: this.buildFlashcards(context, data.flashcards),\n      definitions: this.buildDefinitionList(context, data.definitions ?? data.legend),\n      statement: this.buildStatement(context, data.statement),\n      statements: this.buildStatements(context, data.statements),\n      choices: this.buildChoices(context, data.choices),\n      responses: this.buildResponses(context, data.responses),\n      feedbacks: this.buildFeedbacks(context, data.feedbacks),\n      quizzes: this.buildQuizzes(context, data.quizzes),\n      pairs: this.buildPairs(context, data.pairs),\n      matrix: this.buildMatricies(context, data.matrix),\n      pronunciationTable: this.buildPronunciationTable(context, data.pronunciationTable),\n      table: this.buildTable(context, data.table),\n      botResponses: this.buildBotResponses(context, data.botResponses),\n      ingredients: this.buildIngredients(context, data.ingredients),\n      // DEPRECATED - TO BE REMOVED IN FUTURE\n      // captionDefinitionList: this.buildCaptionDefinitionList(context, data.captionDefinitionList),\n      cardBits: this.buildCardBits(context, data.cardBits),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyObjects: ['table'],\n    });\n\n    return Object.keys(node).length > 0 ? node : undefined;\n  }\n\n  /**\n   * Copy any attributes from 'attrs' property to the root node (necessary when the input if from JSON)\n   * The values in 'attrs' will overwrite any existing values in the node\n   *\n   * The original object is not modified, a new object is returned\n   *\n   * @param data\n   */\n  private bodyBitCopyFromAttrs<T extends Partial<BodyBitJson>>(data: T): T {\n    const copy = { ...data };\n    // Copy any attributes from 'attrs' to the node (necessary when the input if from JSON)\n    if (data.attrs) {\n      for (const [key, value] of Object.entries(data.attrs)) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (copy as any)[key] = value;\n      }\n    }\n\n    return copy;\n  }\n\n  /**\n   * Set examples down the tree\n   *\n   * @param body\n   * @param cardNode\n   * @param __isDefaultExample\n   * @param example\n   * @returns true if any of the answers has an example, otherwise undefined\n   */\n  private pushExampleDownTree(\n    context: BuildContext,\n    body: Body | undefined,\n    cardNode: CardNode | undefined,\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n  ): void {\n    if (__isDefaultExample || example != null) {\n      if (cardNode) {\n        this.pushExampleDownTreeString(\n          context,\n          __isDefaultExample,\n          example,\n          cardNode.pairs as WithExampleJson[],\n        );\n        this.pushExampleDownTreeBoolean(\n          context,\n          __isDefaultExample,\n          example,\n          false,\n          cardNode.flashcards as WithExampleJson[],\n        );\n        this.pushExampleDownTreeBoolean(\n          context,\n          __isDefaultExample,\n          example,\n          false,\n          cardNode.definitions as WithExampleJson[],\n        );\n        this.pushExampleDownTreeBoolean(\n          context,\n          __isDefaultExample,\n          example,\n          true,\n          cardNode.choices as WithExampleJson[],\n        );\n        this.pushExampleDownTreeBoolean(\n          context,\n          __isDefaultExample,\n          example,\n          false,\n          cardNode.responses,\n          cardNode.statements,\n          cardNode.statement,\n        );\n        if (cardNode.quizzes) {\n          for (const quiz of cardNode.quizzes) {\n            this.pushExampleDownTreeBoolean(\n              context,\n              __isDefaultExample,\n              example,\n              true,\n              quiz.choices as WithExampleJson[] | undefined,\n            );\n            this.pushExampleDownTreeBoolean(\n              context,\n              __isDefaultExample,\n              example,\n              false,\n              quiz.responses as WithExampleJson[] | undefined,\n            );\n          }\n        }\n        if (cardNode.matrix) {\n          for (const m of cardNode.matrix) {\n            this.pushExampleDownTreeString(context, __isDefaultExample, example, m.cells);\n          }\n        }\n      }\n      if (body) {\n        this.pushExampleDownTreeBodyBits(context, __isDefaultExample, example, body);\n      }\n    }\n  }\n\n  /**\n   * Set examples for boolean nodes\n   *\n   * @param __isDefaultExample\n   * @param example\n   * @param onlyCorrect\n   * @param nodes\n   * @returns true if any of the answers has an example, otherwise undefined\n   */\n  private pushExampleDownTreeBoolean(\n    _context: BuildContext,\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n    onlyCorrect: boolean,\n    ...nodes: (WithExampleJson | WithExampleJson[] | undefined)[]\n  ): void {\n    if (!__isDefaultExample && example == null) return;\n\n    if (Array.isArray(nodes)) {\n      for (const ds of nodes) {\n        if (ds) {\n          const exampleNodes = Array.isArray(ds) ? ds : [ds];\n          BitUtils.fillBooleanExample(exampleNodes, __isDefaultExample, example, onlyCorrect);\n        }\n      }\n    }\n  }\n\n  /**\n   * Set examples for string nodes\n   *\n   * @param __isDefaultExample\n   * @param example\n   * @param nodes\n   * @returns true if any of the answers has an example, otherwise undefined\n   */\n  private pushExampleDownTreeString(\n    context: BuildContext,\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n    ...nodes: (WithExampleJson | WithExampleJson[] | undefined)[]\n  ): void {\n    if (!__isDefaultExample && !example) return;\n\n    if (Array.isArray(nodes)) {\n      for (const ds of nodes) {\n        if (ds) {\n          const exampleNodes = Array.isArray(ds) ? ds : [ds];\n          BitUtils.fillStringExample(\n            context.textFormat,\n            exampleNodes,\n            __isDefaultExample,\n            example,\n            false,\n          );\n        }\n      }\n    }\n  }\n\n  private pushExampleDownTreeBodyBits(\n    context: BuildContext,\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n    body: Body | undefined,\n  ): void {\n    if (!__isDefaultExample && !example) return;\n    const bodyBitsJson = this.textParser.extractBodyBits(body?.body as TextAst);\n\n    for (const part of bodyBitsJson) {\n      if (part) {\n        switch (part.type) {\n          case BodyBitType.gap: {\n            const gap = part as GapJson;\n            BitUtils.fillStringExample(\n              context.textFormat,\n              [gap],\n              __isDefaultExample,\n              example,\n              false,\n            );\n            break;\n          }\n          case BodyBitType.mark: {\n            const mark = part as MarkJson;\n            BitUtils.fillBooleanExample([mark], __isDefaultExample, example, false);\n            break;\n          }\n          case BodyBitType.select: {\n            const select = part as SelectJson;\n            BitUtils.fillBooleanExample(select.options, __isDefaultExample, example, true);\n            break;\n          }\n          case BodyBitType.highlight: {\n            const highlight = part as HighlightJson;\n            BitUtils.fillBooleanExample(highlight.texts, __isDefaultExample, example, true);\n            break;\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Push a value down the tree, without overriding existing values\n   *\n   * This function is not type safe and should be used with care\n   *\n   * @param body/body[] set if the value should be passed down the body to the body bits / card body bits\n   * @param bodyBitTypes body bit types to push the value down to\n   * @param cardNode set if the value should be passed down the card node\n   * @param path path for the value\n   * @param value the value to push down\n   */\n  private pushDownTree(\n    _context: BuildContext,\n    body: Body | CardBit | undefined | (Body | CardBit | undefined)[],\n    bodyBitTypes: BodyBitTypeType[] | undefined,\n    cardNode: CardNode | undefined,\n    cardNodePath: string | string[] | undefined,\n    path: string,\n    value: unknown,\n  ): void {\n    if (value === undefined) return;\n\n    // Add value to card nodes if required\n    if (cardNode && cardNodePath) {\n      if (!Array.isArray(cardNodePath)) cardNodePath = [cardNodePath];\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const data = ObjectUtils.flatMapPath(cardNode, cardNodePath) as any[];\n\n      for (const d of data) {\n        if (d[path] == null) {\n          d[path] = value;\n        }\n      }\n    }\n\n    // Add value to body bit types if required\n    if (body) {\n      const bodyArray: Body[] = (Array.isArray(body) ? body : [body]) as Body[];\n      for (const b of bodyArray) {\n        if (b && b.body && bodyBitTypes) {\n          const bodyBitsJson = this.textParser.extractBodyBits(b.body as TextAst);\n\n          if (bodyBitTypes && bodyBitsJson && bodyBitsJson.length > 0) {\n            for (const part of bodyBitsJson) {\n              if (part) {\n                if (bodyBitTypes.indexOf(part.type as BodyBitTypeType) !== -1) {\n                  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                  const data = part as any;\n                  if (data[path] == null) {\n                    data[path] = value;\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private parseExtraProperties(\n    extraProperties: { [key: string]: unknown } | undefined,\n  ): ExtraProperties | undefined {\n    if (!extraProperties) return undefined;\n\n    const entries = Object.entries(extraProperties);\n    if (entries.length === 0) return undefined;\n\n    const res: ExtraProperties = {};\n\n    for (const [key, value] of entries) {\n      res[key] = (ArrayUtils.asArray(value) || [value]) as Property;\n    }\n\n    return res;\n  }\n\n  /**\n   * Set the 'isExample' flags on the bit\n   *\n   * The flag is set if the bit has an example. The flag is set at each branch level up the tree from\n   * where the 'example' exists.\n   *\n   * @param bit\n   */\n  private setIsExampleFlags(bit: Bit) {\n    // bit.isExample = false;\n\n    const checkIsExample = (example: WithExampleJson): boolean => {\n      if (!example) return false;\n\n      if (/*example.__isDefaultExample ||*/ example.isExample || example.example != undefined) {\n        example.isExample = true;\n        bit.isExample = true;\n      } else {\n        if (example === bit) {\n          example.isExample = !!bit.isExample;\n        } else {\n          example.isExample = false;\n        }\n      }\n      return example.isExample;\n    };\n\n    const { body, cardNode } = bit;\n\n    // Body bit level\n    const bodyBitsJson = this.textParser.extractBodyBits(body?.body as TextAst);\n\n    for (const bodyPart of bodyBitsJson) {\n      switch (bodyPart.type) {\n        case BodyBitType.gap:\n        case BodyBitType.mark: {\n          checkIsExample(bodyPart as WithExampleJson);\n          break;\n        }\n\n        case BodyBitType.select: {\n          const select = bodyPart as SelectJson;\n          let hasExample = false;\n          for (const option of select.options) {\n            hasExample = checkIsExample(option as WithExampleJson) ? true : hasExample;\n          }\n          select.isExample = hasExample;\n          break;\n        }\n\n        case BodyBitType.highlight: {\n          const highlight = bodyPart as HighlightJson;\n          let hasExample = false;\n          for (const text of highlight.texts) {\n            hasExample = checkIsExample(text as WithExampleJson) ? true : hasExample;\n          }\n          highlight.isExample = hasExample;\n          break;\n        }\n      }\n    }\n\n    // Card level\n\n    if (cardNode) {\n      // flashcards\n      for (const v of cardNode.flashcards || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n\n      // definitions\n      for (const v of cardNode.definitions || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n\n      // pairs\n      for (const v of cardNode.pairs || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n      // matrix\n      for (const mx of cardNode.matrix || []) {\n        let hasExample = false;\n\n        // matrix cell\n        for (const v of mx.cells || []) {\n          hasExample = checkIsExample(v as WithExampleJson) ? true : hasExample;\n        }\n        mx.isExample = hasExample;\n      }\n      // quizzes\n      for (const quiz of cardNode.quizzes || []) {\n        let hasExample = false;\n\n        // responses\n        for (const v of quiz.responses || []) {\n          hasExample = checkIsExample(v as WithExampleJson) ? true : hasExample;\n        }\n        // choices\n        for (const v of quiz.choices || []) {\n          hasExample = checkIsExample(v as WithExampleJson) ? true : hasExample;\n        }\n        quiz.isExample = hasExample;\n      }\n      // responses\n      for (const v of cardNode.responses || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n      // choices\n      for (const v of cardNode.choices || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n      // statements\n      for (const v of cardNode.statements || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n      // statement\n      checkIsExample(cardNode.statement as WithExampleJson);\n      // NO: elements\n      // questions\n      for (const v of cardNode.questions || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n    }\n\n    // Bit level\n\n    // statement\n    checkIsExample(bit.statement as WithExampleJson);\n    // responses\n    for (const v of bit.responses || []) {\n      checkIsExample(v as WithExampleJson);\n    }\n    // choices\n    for (const v of bit.choices || []) {\n      checkIsExample(v as WithExampleJson);\n    }\n\n    // Bit itself\n    checkIsExample(bit as WithExampleJson);\n  }\n\n  private setDefaultBitValues(bit: Bit) {\n    const { bitType } = bit;\n    // Set aiGenerated == true for all AI generated bits\n    switch (bitType) {\n      case BitType.articleAi:\n      case BitType.noteAi:\n      case BitType.summaryAi:\n        bit.aiGenerated = this.toAstProperty(\n          bitType,\n          ConfigKey.property_aiGenerated,\n          true,\n          undefined,\n        );\n        break;\n    }\n  }\n\n  private addVersionToParserInfo(bit: Bit) {\n    const parser: ParserInfo = bit.parser ?? {};\n    parser.version = env.appVersion.full;\n    bit.parser = parser;\n  }\n}\n\nexport { Builder };\n","import { type EnumType } from '@ncoderz/superenum';\n\n/**\n * The location of text.\n *\n * The location of the text affects how breakscaping is applied.\n */\nconst TextLocation = {\n  tag: 'tag',\n  body: 'body',\n} as const;\n\nexport type TextLocationType = EnumType<typeof TextLocation>;\n\nexport { TextLocation };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BodyTextFormat = {\n  plainText: 'text', // plain text\n  latex: 'latex', // LaTeX code\n  json: 'json', // json\n  xml: 'xml', // xml\n\n  // bitmark++ text\n  bitmarkPlusPlus: 'bitmark++',\n} as const;\n\nexport type BodyTextFormatType = EnumType<typeof BodyTextFormat>;\n\nexport { BodyTextFormat };\n","/**\n * Centralized regex and replacer constants for breakscape and unbreakscape.\n * Extracted from breakscape-regex.ts to simplify core logic.\n */\n\nexport const REGEX_MARKS = /([*`_!=])(?=\\1)/; // BM_TAG: $1^  --BODY: $1^  ++BODY: $1^\nexport const REGEX_BLOCKS = /^(\\|)(code[\\s]*|code:|image:|[\\s]*$)/; // ++BODY: $2^$3\nexport const REGEX_TITLE_BLOCKS = /^([#]{1,3})([^\\S\\r\\n]+)/; // ++BODY: $4^$5\nexport const REGEX_LIST_BLOCKS = /^(•)([0-9]+[iI]*|[a-zA-Z]{1}|_|\\+|-|)([^\\S\\r\\n]+)/; // ++BODY: $6^$7$8\nexport const REGEX_START_OF_TAG = /(\\[)([.@#▼►%!?+\\-$_=&])/; // --BODY: $2^$3  ++BODY: $9^$10\nexport const REGEX_FOOTER_DIVIDER = /^(~)(~~~[ \\t]*)$/; // --BODY: $4^$5  ++BODY: $11^$12\nexport const REGEX_PLAIN_TEXT_DIVIDER = /^(\\$)(\\$\\$\\$[ \\t]*)$/; // --BODY: $6^$7  ++BODY: $13^$14\nexport const REGEX_END_OF_TAG = /(\\^*])/; // BM_TAG: ^$2  PLAIN_TAG: ^$1\nexport const REGEX_BIT_START = /^(\\[)(\\^*)(\\.)/; // PLAIN_BODY: $1^$2$3\nexport const REGEX_HATS = /(\\^+)/; // BM_TAG: $3^  PLAIN_TAG: $2^  --BODY: ^$8  ++BODY: $15^  // Must be last\n\nexport const BREAKSCAPE_BITMARK_TAG_REGEX_SOURCE = `${REGEX_MARKS.source}|${REGEX_END_OF_TAG.source}|${REGEX_HATS.source}`;\nexport const BREAKSCAPE_PLAIN_TAG_REGEX_SOURCE = `${REGEX_END_OF_TAG.source}|${REGEX_HATS.source}`;\nexport const BREAKSCAPE_BITMARK_BODY_REGEX_SOURCE = `${REGEX_MARKS.source}|${REGEX_BLOCKS.source}|${REGEX_TITLE_BLOCKS.source}|${REGEX_LIST_BLOCKS.source}|${REGEX_START_OF_TAG.source}|${REGEX_FOOTER_DIVIDER.source}|${REGEX_PLAIN_TEXT_DIVIDER.source}|${REGEX_HATS.source}`;\nexport const BREAKSCAPE_PLAIN_BODY_REGEX_SOURCE = `${REGEX_BIT_START.source}`;\n\nexport const BREAKSCAPE_BITMARK_TAG_REGEX = new RegExp(BREAKSCAPE_BITMARK_TAG_REGEX_SOURCE, 'gm');\nexport const BREAKSCAPE_BITMARK_TAG_REGEX_REPLACER = '$1$3^$2';\n\nexport const BREAKSCAPE_PLAIN_TAG_REGEX = new RegExp(BREAKSCAPE_PLAIN_TAG_REGEX_SOURCE, 'gm');\nexport const BREAKSCAPE_PLAIN_TAG_REGEX_REPLACER = '$2^$1';\n\nexport const BREAKSCAPE_BITMARK_BODY_REGEX = new RegExp(BREAKSCAPE_BITMARK_BODY_REGEX_SOURCE, 'gm');\nexport const BREAKSCAPE_BITMARK_BODY_REGEX_REPLACER = '$1$2$4$6$9$11$13$15^$3$5$7$8$10$12$14';\n\nexport const BREAKSCAPE_PLAIN_BODY_REGEX = new RegExp(BREAKSCAPE_PLAIN_BODY_REGEX_SOURCE, 'gm');\nexport const BREAKSCAPE_PLAIN_BODY_REGEX_REPLACER = '$1^$2$3';\n\nexport const BREAKSCAPE_V2_BODY_REGEX = new RegExp('^(?:(\\\\[)(\\\\^*)(\\\\.))|(\\\\^+)', 'gm');\nexport const BREAKSCAPE_V2_BODY_REGEX_REPLACER = '$1$4^$2$3';\n\nexport const UNBREAKSCAPE_REGEX = new RegExp('\\\\^([\\\\^]*)', 'gm');\nexport const UNBREAKSCAPE_REGEX_REPLACER = '$1';\n\nexport const UNBREAKSCAPE_PLAIN_IN_BODY_REGEX = new RegExp('^(\\\\[)\\\\^(\\\\^*)(\\\\.)', 'gm');\nexport const UNBREAKSCAPE_PLAIN_IN_BODY_REGEX_REPLACER = '$1$2$3';\n\nexport const BREAKSCAPE_CODE_REGEX = new RegExp('^(\\\\||•|#)', 'gm');\nexport const BREAKSCAPE_CODE_REGEX_REPLACER = '$1^';\n","/**\n *  breakscape.ts\n *  ------------------------------------------------------------\n *  Breakscaping for bitmark text.\n *  (c) 2025 — MIT / public domain\n */\n\nimport { PACKAGE_INFO } from '../generated/package_info.ts';\nimport { BodyTextFormat, type BodyTextFormatType } from '../model/enum/BodyTextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../model/enum/TextLocation.ts';\nimport type { BreakscapeOptions } from './BreakscapeOptions.ts';\nimport * as RC from './RegexConfigs.ts';\n\n// default options\nconst DEF = {\n  format: BodyTextFormat.bitmarkPlusPlus,\n  location: TextLocation.body,\n  v2: false,\n} as const;\n\n/**\n * Check if an object is a string.\n *\n * @param obj - The object to check.\n * @returns true if the object is a string, otherwise false.\n */\nfunction isString(obj: unknown): boolean {\n  return typeof obj === 'string' || obj instanceof String;\n}\n\n/**\n * For breakscaping, select the correct regex and replacer for the text format, location, and v2 flag.\n */\nfunction selectBreakscapeRegexAndReplacer(\n  textFormat: BodyTextFormatType,\n  textLocation: TextLocationType,\n  v2 = false,\n): { regex: RegExp; replacer: string } {\n  if (textLocation === TextLocation.tag) {\n    if (!v2 && textFormat === BodyTextFormat.bitmarkPlusPlus) {\n      return {\n        regex: RC.BREAKSCAPE_BITMARK_TAG_REGEX,\n        replacer: RC.BREAKSCAPE_BITMARK_TAG_REGEX_REPLACER,\n      };\n    }\n    return {\n      regex: RC.BREAKSCAPE_PLAIN_TAG_REGEX,\n      replacer: RC.BREAKSCAPE_PLAIN_TAG_REGEX_REPLACER,\n    };\n  } else {\n    if (textFormat === BodyTextFormat.bitmarkPlusPlus) {\n      if (v2) {\n        return {\n          regex: RC.BREAKSCAPE_V2_BODY_REGEX,\n          replacer: RC.BREAKSCAPE_V2_BODY_REGEX_REPLACER,\n        };\n      }\n      return {\n        regex: RC.BREAKSCAPE_BITMARK_BODY_REGEX,\n        replacer: RC.BREAKSCAPE_BITMARK_BODY_REGEX_REPLACER,\n      };\n    }\n    return {\n      regex: RC.BREAKSCAPE_PLAIN_BODY_REGEX,\n      replacer: RC.BREAKSCAPE_PLAIN_BODY_REGEX_REPLACER,\n    };\n  }\n}\n\n/**\n * For unbreakscaping, select the correct regex and replacer for the text format and location.\n */\nfunction selectUnbreakscapeRegexAndReplacer(\n  textFormat: BodyTextFormatType,\n  textLocation: TextLocationType,\n): { regex: RegExp; replacer: string } {\n  const isPlain = textFormat !== BodyTextFormat.bitmarkPlusPlus;\n  if (textLocation === TextLocation.body && isPlain) {\n    return {\n      regex: RC.UNBREAKSCAPE_PLAIN_IN_BODY_REGEX,\n      replacer: RC.UNBREAKSCAPE_PLAIN_IN_BODY_REGEX_REPLACER,\n    };\n  }\n  return {\n    regex: RC.UNBREAKSCAPE_REGEX,\n    replacer: RC.UNBREAKSCAPE_REGEX_REPLACER,\n  };\n}\n\n// -----------------------------------------------------------------------------\n//  ╭──────────────────────────────────────────────────────────────────────────╮\n//  │ 2.  PUBLIC  API                                                         │\n//  ╰──────────────────────────────────────────────────────────────────────────╯\nclass Breakscape {\n  public readonly EMPTY_STRING = '' as string;\n\n  /**\n   * Escapes special characters in bitmark text by adding caret (^) characters.\n   *\n   * This method processes text to prevent special characters from being interpreted\n   * as bitmark markup. It handles various scenarios including:\n   * - Tag triggers after '[' characters\n   * - Paired punctuation marks\n   * - Hat characters (^)\n   * - End-of-tag brackets\n   * - Beginning-of-line markers\n   *\n   * IMPORTANT: Breakscaping differs depending on the bit text format, and if the text will\n   * be used in a tag or in the body of a bitmark. The default is bitmark++ in the body.\n   * If the text is to be used in a tag, or is not bitmark++, you must specify the textFormat\n   * and textLocation options.\n   *\n   * @param val - The input to breakscape. Can be a string, array of strings, null, or undefined.\n   * @param opts - Optional configuration for the breakscape operation.\n   * @returns The breakscaped result with the same type as the input.\n   *\n   * @example\n   * ```typescript\n   * const breakscape = new Breakscape();\n   *\n   * // Single string\n   * breakscape.breakscape('[.hello]'); // Returns '[^.hello]'\n   *\n   * // Array of strings\n   * breakscape.breakscape(['[.hello]', '[.world]']); // Returns ['[^.hello]', '[^.world]']\n   *\n   * // With options\n   * breakscape.breakscape('[.hello]', {\n   *   textFormat: TextFormat.bitmark++,\n   *   textLocation: TextLocation.body\n   * });\n   * ```\n   */\n  breakscape(val: string, opts?: BreakscapeOptions): string;\n  breakscape(val: string[], opts?: BreakscapeOptions): string[];\n  breakscape(val: undefined | null, opts?: BreakscapeOptions): undefined;\n  breakscape(\n    val: string | string[] | undefined | null,\n    opts: BreakscapeOptions = {},\n  ): string | string[] | undefined {\n    if (val == null) return undefined;\n    const options = Object.assign({}, DEF, opts);\n    if (Array.isArray(val)) {\n      return val.map((v) => this.breakscape(v, options)) as string[];\n    }\n\n    // If an unrecognized type is passed, return it as is (e.g. true, false, 0, 1, etc.)\n    if (!isString(val)) return val as string | undefined;\n\n    const { regex, replacer } = selectBreakscapeRegexAndReplacer(\n      options.format,\n      options.location,\n      options.v2,\n    );\n    let str = val;\n    str = str.replace(regex, replacer);\n    return str;\n  }\n\n  /**\n   * Unbreakscape a string or an array of strings.\n   * If the input is an array, a new array will be returned.\n   *\n   * @param val input value\n   * @param opts options for unbreakscaping\n   * @returns the input value with any strings unbreakscaped.\n   */\n  unbreakscape(val: string, opts?: BreakscapeOptions): string;\n  unbreakscape(val: string[], opts?: BreakscapeOptions): string[];\n  unbreakscape(val: undefined | null, opts?: BreakscapeOptions): undefined;\n  unbreakscape(\n    val: string | string[] | undefined | null,\n    opts: BreakscapeOptions = {},\n  ): string | string[] | undefined {\n    if (val == null) return undefined;\n    const options = Object.assign({}, DEF, opts);\n    if (Array.isArray(val)) {\n      return val.map((v) => this.unbreakscape(v, options)) as string[];\n    }\n\n    // If an unrecognized type is passed, return it as is (e.g. true, false, 0, 1, etc.)\n    if (!isString(val)) return val as string | undefined;\n\n    const { regex, replacer } = selectUnbreakscapeRegexAndReplacer(\n      options.format,\n      options.location,\n    );\n    let str = val;\n    str = str.replace(regex, replacer);\n    return str;\n  }\n\n  /**\n   * Breakscape a code string or an array of code strings.\n   * If the input is an array, a new array will be returned.\n   *\n   * @param val input value\n   * @param modifyArray if true, the original array will be modified rather than a copy being made\n   * @returns the input value with any strings breakscaped\n   */\n  public breakscapeCode<T extends unknown | unknown[] | undefined>(\n    val: T,\n    options?: BreakscapeOptions,\n  ): T extends string ? string : T extends string[] ? string[] : undefined {\n    type R = T extends string ? string : T extends string[] ? string[] : undefined;\n\n    if (val == null) return val as unknown as R;\n\n    const opts = Object.assign({}, DEF, options);\n\n    const breakscapeStr = (str: string) => {\n      if (!str) return str;\n      return str.replace(RC.BREAKSCAPE_CODE_REGEX, RC.BREAKSCAPE_CODE_REGEX_REPLACER);\n    };\n\n    if (Array.isArray(val)) {\n      const newVal: unknown[] = opts.inPlaceArray ? val : [val.length];\n      for (let i = 0, len = val.length; i < len; i++) {\n        const v = val[i];\n        if (isString(v)) {\n          val[i] = breakscapeStr(v);\n        }\n      }\n      val = newVal as T;\n    } else if (isString(val)) {\n      val = breakscapeStr(val as string) as T;\n    }\n\n    return val as unknown as R;\n  }\n\n  /**\n   * Gets the version of the breakscape library.\n   *\n   * @returns The current version string of the library.\n   *\n   * @example\n   * ```typescript\n   * const breakscape = new Breakscape();\n   * console.log(breakscape.version()); // e.g., \"1.0.0\"\n   * ```\n   */\n  version(): string {\n    return PACKAGE_INFO.version;\n  }\n\n  /**\n   * Gets the license information for the breakscape library.\n   *\n   * @returns The license string for the library.\n   *\n   * @example\n   * ```typescript\n   * const breakscape = new Breakscape();\n   * console.log(breakscape.license()); // e.g., \"MIT\"\n   * ```\n   */\n  license(): string {\n    return PACKAGE_INFO.license;\n  }\n}\n\nexport { Breakscape };\n","import { type BreakscapedString } from '../model/ast/BreakscapedString.ts';\nimport { TextFormat } from '../model/enum/TextFormat.ts';\nimport { TextLocation } from '../model/enum/TextLocation.ts';\nimport { type BreakscapeOptions } from './BreakscapeOptions.ts';\nimport { Breakscape as BreakscapeImpl } from './BreakscapeRegex.ts';\n\n/**\n * Utility class for breakscaping strings.\n *\n * For the implementation of breakscaping, see:\n * https://github.com/getMoreBrain/bitmark-breakscape\n *\n */\n\nconst DEFAULT_BREAKSCAPE_OPTIONS: BreakscapeOptions = {\n  format: TextFormat.bitmarkText,\n  location: TextLocation.body,\n  inPlaceArray: false,\n  v2: false,\n};\n\nconst externalBreakscape = new BreakscapeImpl();\n\nclass Breakscape {\n  public readonly EMPTY_STRING = '' as BreakscapedString;\n\n  /**\n   * Breakscape a string or an array of strings.\n   * If the input is an array, a new array will be returned.\n   *\n   * @param val input value\n   * @param options options for breakscaping\n   * @param modifyArray\n   * @returns the input value with any strings breakscaped.\n   */\n  public breakscape<T extends string | string[] | undefined>(\n    val: T,\n    options: BreakscapeOptions,\n  ): T extends string ? BreakscapedString : T extends string[] ? BreakscapedString[] : undefined {\n    type R = T extends string\n      ? BreakscapedString\n      : T extends string[]\n        ? BreakscapedString[]\n        : undefined;\n\n    const opts = Object.assign({}, DEFAULT_BREAKSCAPE_OPTIONS, options);\n\n    return externalBreakscape.breakscape(val as BreakscapedString, {\n      format: opts.format,\n      location: opts.location,\n      inPlaceArray: opts.inPlaceArray,\n      v2: opts.v2,\n    }) as R;\n  }\n\n  /**\n   * Unbreakscape a string or an array of strings.\n   * If the input is an array, a new array will be returned.\n   *\n   * @param val input value\n   * @param modifyArray if true, the original array will be modified rather than a copy being made\n   * @returns the input value with any strings unbreakscaped.\n   */\n  public unbreakscape<T extends BreakscapedString | BreakscapedString[] | undefined>(\n    val: T,\n    options: BreakscapeOptions,\n  ): T extends BreakscapedString ? string : T extends BreakscapedString[] ? string[] : undefined {\n    type R = T extends BreakscapedString\n      ? string\n      : T extends BreakscapedString[]\n        ? string[]\n        : undefined;\n\n    const opts = Object.assign({}, DEFAULT_BREAKSCAPE_OPTIONS, options);\n\n    return externalBreakscape.unbreakscape(val as BreakscapedString, opts) as R;\n  }\n\n  /**\n   * Breakscape a code string or an array of code strings.\n   * If the input is an array, a new array will be returned.\n   *\n   * @param val input value\n   * @param modifyArray if true, the original array will be modified rather than a copy being made\n   * @returns the input value with any strings breakscaped\n   */\n  public breakscapeCode<T extends unknown | unknown[] | undefined>(\n    val: T,\n    options?: BreakscapeOptions,\n  ): T extends string ? BreakscapedString : T extends string[] ? BreakscapedString[] : undefined {\n    type R = T extends string\n      ? BreakscapedString\n      : T extends string[]\n        ? BreakscapedString[]\n        : undefined;\n\n    const opts = Object.assign({}, DEFAULT_BREAKSCAPE_OPTIONS, options);\n\n    return externalBreakscape.breakscapeCode(val as BreakscapedString, opts) as R;\n  }\n\n  /**\n   * Concatenate two breakscaped strings.\n   *\n   * @param s1 first string\n   * @param s2 second string\n   * @returns the concatenated string\n   */\n  public concatenate(s1: BreakscapedString, s2: BreakscapedString): BreakscapedString {\n    return (s1 + s2) as BreakscapedString;\n  }\n}\n\nconst instance = new Breakscape();\n\nexport { instance as Breakscape };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst DeprecatedTextFormat = {\n  bitmarkMinusMinus: 'bitmark--', // bitmark-- text format, deprecated\n} as const;\n\nexport type DeprecatedTextFormatType = EnumType<typeof DeprecatedTextFormat>;\n\nexport { DeprecatedTextFormat };\n","import { Config } from '../../config/Config.ts';\nimport { BitType, type BitTypeType } from '../../model/enum/BitType.ts';\nimport type {\n  TableCellJson,\n  TableExtendedJson,\n  TableJson,\n  TableSectionJson,\n} from '../../model/json/BitJson.ts';\n\n/**\n * Type guard to check if table uses old format (columns/data)\n * @param table - Table JSON to check\n * @returns true if table uses old format\n */\nexport function isTableBasicFormat(table: TableJson | TableExtendedJson): boolean {\n  const t = table as TableJson & TableExtendedJson;\n  return !!(t.columns || t.data) && !(t.header || t.body || t.footer);\n}\n\n/**\n * Type guard to check if table uses new format (head/body/foot)\n * @param table - Table JSON to check\n * @returns true if table uses new format\n */\nexport function isTableExtendedFormat(table: TableJson | TableExtendedJson): boolean {\n  const t = table as TableJson & TableExtendedJson;\n  return !!(t.header || t.body || t.footer);\n}\n\n/**\n * Type guard to check if table uses mixed format (has both old and new fields)\n * @param table - Table JSON to check\n * @returns true if table has both old and new format fields\n */\nexport function isMixedTableFormat(table: TableJson | TableExtendedJson): boolean {\n  const t = table as TableJson & TableExtendedJson;\n  const hasOld = !!(t.columns || t.data);\n  const hasNew = !!(t.header || t.body || t.footer);\n  return hasOld && hasNew;\n}\n\n/**\n * Convert old table format (columns/data) to new format (head/body/foot)\n * @param table - Table in basic format\n * @returns Table in new format\n */\nexport function convertBasicToExtendedTableFormat(table: TableJson): TableExtendedJson {\n  const tableExtended: TableExtendedJson = {};\n\n  // Convert columns to table-header\n  if (table.columns && table.columns.length > 0) {\n    tableExtended.header = {\n      rows: [\n        {\n          cells: table.columns.map((col) => ({\n            content: col,\n            title: true,\n          })),\n        },\n      ],\n    };\n  }\n\n  // Convert data to body\n  if (table.data && table.data.length > 0) {\n    tableExtended.body = {\n      rows: table.data.map((row) => ({\n        cells: row.map((cell) => ({\n          content: cell,\n        })),\n      })),\n    };\n  }\n\n  return tableExtended;\n}\n\n/**\n * Convert extended table format (header/body/footer) to basic format (columns/data)\n * @param table - Table in extended format\n * @returns Table in basic format\n */\nexport function convertExtendedToBasicTableFormat(tableExtended: TableExtendedJson): TableJson {\n  const table = {} as TableJson;\n\n  type LegacyRow = TableCellJson['content'][];\n\n  const extractRowCells = (row: TableSectionJson['rows'][number] | undefined): LegacyRow => {\n    if (!row || !Array.isArray(row.cells)) {\n      return [];\n    }\n\n    return row.cells\n      .map((cell) => cell?.content)\n      .filter((content): content is TableCellJson['content'] => content !== undefined);\n  };\n\n  const dataRows: LegacyRow[] = [];\n\n  const headRows = tableExtended.header?.rows ?? [];\n  if (headRows.length > 0) {\n    const primaryHeader = extractRowCells(headRows[0]);\n\n    if (primaryHeader.length > 0) {\n      table.columns = primaryHeader;\n    }\n\n    const remainingHeadRows = headRows.slice(1);\n    remainingHeadRows.forEach((row) => {\n      const cells = extractRowCells(row);\n      if (cells.length > 0) {\n        dataRows.push(cells);\n      }\n    });\n  }\n\n  const appendSectionRows = (section: TableSectionJson | undefined): void => {\n    if (!section || !Array.isArray(section.rows)) {\n      return;\n    }\n\n    section.rows.forEach((row) => {\n      const cells = extractRowCells(row);\n      if (cells.length > 0) {\n        dataRows.push(cells);\n      }\n    });\n  };\n\n  appendSectionRows(tableExtended.body);\n  appendSectionRows(tableExtended.footer);\n\n  if (dataRows.length > 0) {\n    table.data = dataRows;\n  }\n\n  return table;\n}\n\n/**\n * Validate TableCellJson properties\n * @param cell - Table cell to validate\n * @returns Array of validation error messages (empty if valid)\n */\nexport function validateTableCell(cell: TableCellJson): string[] {\n  const errors: string[] = [];\n\n  // Validate content exists\n  if (!cell.content) {\n    errors.push('Cell content is required');\n  }\n\n  // Validate rowspan\n  if (cell.rowspan !== undefined) {\n    if (!Number.isInteger(cell.rowspan) || cell.rowspan < 1) {\n      errors.push('rowspan must be an integer >= 1');\n    }\n  }\n\n  // Validate colspan\n  if (cell.colspan !== undefined) {\n    if (!Number.isInteger(cell.colspan) || cell.colspan < 1) {\n      errors.push('colspan must be an integer >= 1');\n    }\n  }\n\n  // Validate scope\n  if (cell.scope !== undefined) {\n    const validScopes = ['row', 'col', 'rowgroup', 'colgroup'];\n    if (!validScopes.includes(cell.scope)) {\n      errors.push(`scope must be one of: ${validScopes.join(', ')}`);\n    }\n  }\n\n  return errors;\n}\n\n/**\n * Validate TableSectionJson structure\n * @param section - Table section to validate\n * @returns Array of validation error messages (empty if valid)\n */\nexport function validateTableSection(section: TableSectionJson): string[] {\n  const errors: string[] = [];\n\n  if (!section.rows) {\n    errors.push('Section must have rows array');\n    return errors;\n  }\n\n  if (!Array.isArray(section.rows)) {\n    errors.push('Section rows must be an array');\n    return errors;\n  }\n\n  // Validate each row\n  section.rows.forEach((row, rowIndex) => {\n    if (!row.cells || !Array.isArray(row.cells)) {\n      errors.push(`Row ${rowIndex}: cells must be an array`);\n      return;\n    }\n\n    // Validate each cell\n    row.cells.forEach((cell, cellIndex) => {\n      const cellErrors = validateTableCell(cell);\n      cellErrors.forEach((err) => {\n        errors.push(`Row ${rowIndex}, Cell ${cellIndex}: ${err}`);\n      });\n    });\n  });\n\n  return errors;\n}\n\n/**\n * Validate TableJson structure\n * @param table - Table to validate\n * @returns Array of validation error messages (empty if valid)\n */\nexport function validateTable(table: TableJson | TableExtendedJson): string[] {\n  const errors: string[] = [];\n  const t = table as TableJson & TableExtendedJson;\n\n  // Check if table has any data\n  const hasOld = !!(t.columns || t.data);\n  const hasNew = !!(t.header || t.body || t.footer);\n\n  if (!hasOld && !hasNew) {\n    errors.push('Table must have either old format (columns/data) or new format (head/body/foot)');\n    return errors;\n  }\n\n  // Validate new format sections\n  if (t.header) {\n    const headErrors = validateTableSection(t.header);\n    headErrors.forEach((err) => errors.push(`head: ${err}`));\n  }\n\n  if (t.body) {\n    const bodyErrors = validateTableSection(t.body);\n    bodyErrors.forEach((err) => errors.push(`body: ${err}`));\n  }\n\n  if (t.footer) {\n    const footErrors = validateTableSection(t.footer);\n    footErrors.forEach((err) => errors.push(`foot: ${err}`));\n  }\n\n  return errors;\n}\n\n/**\n * Normalize table to new format if it uses old format\n * @param table - Table in either format\n * @returns Table in new format\n */\nexport function normalizeTableFormat(\n  bitType: BitTypeType,\n  table: TableJson | TableExtendedJson,\n): TableJson | TableExtendedJson {\n  // If mixed format, new takes precedence (ignore old)\n  if (isMixedTableFormat(table)) {\n    const t = table as Partial<TableJson> & TableExtendedJson;\n    delete t.columns;\n    delete t.data;\n  }\n\n  const isExtended =\n    Config.isOfBitType(bitType, BitType.tableExtended) ||\n    Config.isOfBitType(bitType, BitType.tableImage);\n\n  // If old format only, but .table-extended bit, convert to new\n  if (isExtended && isTableBasicFormat(table)) {\n    return convertBasicToExtendedTableFormat(table as TableJson);\n  }\n\n  // If new format only, but .table bit, convert to new\n  if (!isExtended && isTableExtendedFormat(table)) {\n    return convertExtendedToBasicTableFormat(table as TableExtendedJson);\n  }\n\n  // Already in correct (new) format\n  return table;\n}\n","class ArrayUtils {\n  /**\n   * Convert a value to an array, unless it is already an array.\n   *\n   * This function is useful for handling parameters that can be a single value or an array of values.\n   *\n   * @param val input value\n   * @returns the input value if it is an array, otherwise a new array containing the input value\n   */\n  asArray<T>(val: T | T[] | undefined): T[] | undefined {\n    if (val == null) return undefined;\n    if (Array.isArray(val)) return val;\n    return [val];\n  }\n\n  /**\n   * Convert an array or value to a value, unless it is already a value.\n   * The first item in the array will be selected\n   *\n   * This function is useful for handling parameters that can be a single value or an array of values.\n   *\n   * @param val input value\n   * @param last if true, the last item in the array will be selected, rather than the first\n   * @returns the input value if it is not an array, otherwise the first item in the array\n   */\n  asSingle<T>(val: T | T[] | undefined, last?: boolean): T | undefined {\n    if (val == null) return undefined;\n    if (Array.isArray(val)) {\n      if (val.length > 0) return last ? val[val.length - 1] : val[0];\n      return undefined;\n    }\n    return val;\n  }\n\n  /**\n   * Removes all duplicate items, keeping the first duplicate only.\n   * The input array is modified in place.\n   *\n   * @param arr array in which to make items unique\n   * @param keyFunc function(item) to return the key to check for equality. - optional\n   * @returns the input array with all duplicate items removed\n   */\n  public removeDuplicates<T>(arr: T[], keyFunc?: (item: T) => unknown): T[] {\n    const seen = new Set<unknown>();\n    let write = 0;\n\n    for (let read = 0; read < arr.length; read++) {\n      const item = arr[read];\n      const k = keyFunc ? keyFunc(item) : (item as unknown);\n\n      if (!seen.has(k)) {\n        seen.add(k);\n        if (write !== read) arr[write] = item;\n        write++;\n      }\n    }\n\n    if (write < arr.length) arr.length = write;\n    return arr;\n  }\n}\n\nconst instance = new ArrayUtils();\n\nexport { instance as ArrayUtils };\n","import { Enum, type EnumType } from '@ncoderz/superenum';\n\nimport { Ast, type NodeInfo } from '../../ast/Ast.ts';\nimport { Breakscape } from '../../breakscaping/Breakscape.ts';\nimport { type BreakscapeOptions } from '../../breakscaping/BreakscapeOptions.ts';\nimport { type BreakscapedString } from '../../model/ast/BreakscapedString.ts';\nimport { type Bit } from '../../model/ast/Nodes.ts';\nimport { NodeType } from '../../model/ast/NodeType.ts';\nimport {\n  type CodeBlockTextNode,\n  type CommentMark,\n  type ExtRefMark,\n  type FootnoteMark,\n  type HeadingTextNode,\n  type ImageInlineTextNode,\n  type ImageTextNode,\n  type LatexTextNode,\n  type LinkMark,\n  type ListTextNode,\n  type MediaAttributes,\n  type RefMark,\n  type SectionTextNode,\n  type SymbolMark,\n  type TaskItemTextNode,\n  type TextAst,\n  type TextMark,\n  type TextNode,\n  type XRefMark,\n} from '../../model/ast/TextNodes.ts';\nimport {\n  BitmarkVersion,\n  type BitmarkVersionType,\n  DEFAULT_BITMARK_VERSION,\n} from '../../model/enum/BitmarkVersion.ts';\nimport { type BitTypeType } from '../../model/enum/BitType.ts';\nimport { TextFormat, type TextFormatType } from '../../model/enum/TextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../../model/enum/TextLocation.ts';\nimport { TextMarkType, type TextMarkTypeType } from '../../model/enum/TextMarkType.ts';\nimport { TextNodeType, type TextNodeTypeType } from '../../model/enum/TextNodeType.ts';\nimport { type BodyBitJson, type BodyBitsJson } from '../../model/json/BodyBitJson.ts';\nimport { StringUtils } from '../../utils/StringUtils.ts';\nimport { AstWalkerGenerator } from '../AstWalkerGenerator.ts';\n\nconst DEFAULT_OPTIONS: TextOptions = {\n  bodyBitCallback: undefined,\n  debugGenerationInline: false,\n};\n\nconst FIRST_PARAGRAPH_CONTENT_DEPTH = 3;\n\nconst BOLD_HALF_MARK = '*';\nconst LIGHT_HALF_MARK = '`';\nconst ITALIC_HALF_MARK = '_';\nconst HIGHLIGHT_HALF_MARK = '!';\nconst INLINE_HALF_MARK = '=';\n\nconst BOLD_MARK = BOLD_HALF_MARK + BOLD_HALF_MARK;\nconst LIGHT_MARK = LIGHT_HALF_MARK + LIGHT_HALF_MARK;\nconst ITALIC_MARK = ITALIC_HALF_MARK + ITALIC_HALF_MARK;\nconst HIGHLIGHT_MARK = HIGHLIGHT_HALF_MARK + HIGHLIGHT_HALF_MARK;\nconst INLINE_MARK = INLINE_HALF_MARK + INLINE_HALF_MARK;\n\nconst ALL_HALF_MARKS = [\n  BOLD_HALF_MARK,\n  LIGHT_HALF_MARK,\n  ITALIC_HALF_MARK,\n  HIGHLIGHT_HALF_MARK,\n  INLINE_HALF_MARK,\n];\n\nconst ALL_TAG_OPENING_ENDS = '@#▼►%!?+-$_=&';\n\nconst HEADING_TAG = '#';\n\nconst STANDARD_MARKS: { [key: string]: string } = {\n  [TextMarkType.bold]: BOLD_MARK,\n  [TextMarkType.light]: LIGHT_MARK,\n  [TextMarkType.italic]: ITALIC_MARK,\n  [TextMarkType.highlight]: HIGHLIGHT_MARK,\n};\n\nconst STANDARD_MARK_TYPES: TextMarkTypeType[] = [\n  TextMarkType.bold,\n  TextMarkType.light,\n  TextMarkType.italic,\n  TextMarkType.highlight,\n];\nconst INLINE_MARK_TYPES: TextMarkTypeType[] = [\n  TextMarkType.highlightOrange,\n  TextMarkType.highlightYellow,\n  TextMarkType.highlightGreen,\n  TextMarkType.highlightBlue,\n  TextMarkType.highlightPurple,\n  TextMarkType.highlightPink,\n  TextMarkType.highlightBrown,\n  TextMarkType.highlightBlack,\n  TextMarkType.highlightWhite,\n  TextMarkType.highlightGray,\n\n  TextMarkType.strike,\n  TextMarkType.subscript,\n  TextMarkType.superscript,\n  TextMarkType.ins,\n  TextMarkType.del,\n  TextMarkType.underline,\n  TextMarkType.doubleUnderline,\n  TextMarkType.circle,\n  TextMarkType.languageEmRed,\n  TextMarkType.languageEmOrange,\n  TextMarkType.languageEmYellow,\n  TextMarkType.languageEmGreen,\n  TextMarkType.languageEmBlue,\n  TextMarkType.languageEmPurple,\n  TextMarkType.languageEmPink,\n  TextMarkType.languageEmBrown,\n  TextMarkType.languageEmBlack,\n  TextMarkType.languageEmWhite,\n  TextMarkType.languageEmGray,\n  TextMarkType.languageEm,\n  TextMarkType.userUnderline,\n  TextMarkType.userDoubleUnderline,\n  TextMarkType.userStrike,\n  TextMarkType.userCircle,\n  TextMarkType.userHighlight,\n  TextMarkType.notranslate,\n  //\n  TextMarkType.link,\n  TextMarkType.ref,\n  TextMarkType.xref,\n  TextMarkType.extref,\n  TextMarkType.footnote,\n  TextMarkType.footnoteStar,\n  TextMarkType.symbol,\n  TextMarkType.var,\n  TextMarkType.code,\n  TextMarkType.timer,\n  TextMarkType.duration,\n  TextMarkType.color,\n  TextMarkType.colorPicker,\n  TextMarkType.comment,\n];\n\n// Regex explanation:\n// - Match newline or carriage return + newline\nconst INDENTATION_REGEX = new RegExp(/(\\n|\\r\\n)/, 'g');\n\nconst LINK_REGEX = new RegExp(/https?:\\/\\/|mailto:(.*)/, 'g');\nconst LINK_BREAKSCAPE_REGEX = new RegExp(/\\]/, 'g');\n\n/**\n * Text generation options\n */\nexport interface TextOptions {\n  /**\n   * Callback for writing text\n   *\n   * If set, the callback will be called, rather than writing to the output string\n   */\n  writeCallback?: WriteCallback;\n\n  /**\n   * Callback for rendering body bits\n   */\n  bodyBitCallback?: BodyBitCallback;\n\n  /**\n   * [development only]\n   * Generate debug information in the output.\n   */\n  debugGenerationInline?: boolean;\n}\n\nexport type GenerateOptions = {\n  plainTextDividerAllowed?: boolean;\n  noBreakscaping?: boolean;\n  forceInline?: boolean;\n  noMarkup?: boolean;\n};\n\nconst Stage = {\n  enter: 'enter',\n  between: 'between',\n  exit: 'exit',\n};\n\nexport type StageType = EnumType<typeof Stage>;\n\nexport type WriteCallback = (s: string) => void;\nexport type BodyBitCallback = (bodyBit: BodyBitJson, index: number, route: NodeInfo[]) => string;\n\ninterface MediaAttributeOptions {\n  ignoreAttributes?: Set<string>;\n}\n\ninterface TextOptionsInternal extends TextOptions {\n  isInternal?: boolean;\n}\n\n/**\n * Generate text from a bitmark text AST\n */\nclass TextGenerator extends AstWalkerGenerator<TextAst, BreakscapedString> {\n  protected ast = new Ast();\n  private bitmarkVersion: BitmarkVersionType;\n  private options: TextOptionsInternal;\n  private internalTextGenerator: TextGenerator | null = null;\n\n  // State\n  private generateOptions: GenerateOptions = {};\n  private textFormat: TextFormatType = TextFormat.bitmarkText;\n  private textLocation: TextLocationType = TextLocation.body;\n  private writerText = '';\n  private nodeIndex = 0;\n  private currentIndent = 0;\n  private prevIndent = 0;\n  private indentationStringCache = '';\n  private inParagraph = false;\n  private inHeading = false;\n  private inCodeBlock = false;\n  private exitedCodeBlock = false;\n  private inBulletList = false;\n  private inInline = false;\n  private markDepth = 0;\n  private textDepth = 0;\n  private placeholderIndex = 0;\n  private placeholders: BodyBitsJson = {};\n\n  // For pre-text\n  private rootParagraphNodeContentIndex = 0;\n  private previousRootParagraphContextType: TextNodeTypeType = TextNodeType.text;\n  private inPreText = false;\n  private thisNodeIsPreText = false;\n  private preTextIndexTemp = -1;\n  private havePreText = false;\n  private preTextIndex = -1;\n\n  /**\n   * Generate text from a bitmark text AST\n   *\n   * @param bitmarkVersion - bitmark version, use null to use latest version\n   * @param options - text generation options\n   */\n  constructor(bitmarkVersion?: BitmarkVersionType, options?: TextOptions) {\n    super();\n\n    this.bitmarkVersion = Enum(BitmarkVersion).fromValue(bitmarkVersion) ?? DEFAULT_BITMARK_VERSION;\n    this.options = {\n      ...DEFAULT_OPTIONS,\n      ...options,\n    };\n\n    this.debugGenerationInline = this.options.debugGenerationInline ?? false;\n\n    // Set defaults according to bitmark version\n    if (this.bitmarkVersion === BitmarkVersion.v2) {\n      //\n    } else {\n      //\n    }\n\n    this.enter = this.enter.bind(this);\n    this.between = this.between.bind(this);\n    this.exit = this.exit.bind(this);\n    this.leaf = this.leaf.bind(this);\n\n    // Create internal text generator for parsing nested bitmark text.\n    // Only create if this is not already an internal generator\n    if (!this.options.isInternal) {\n      this.internalTextGenerator = new TextGenerator(bitmarkVersion, {\n        ...this.options,\n        writeCallback: undefined,\n        isInternal: true,\n      } as TextOptionsInternal);\n    }\n  }\n\n  /**\n   * Generate text from a bitmark text AST\n   *\n   * @param ast bitmark text AST\n   */\n  public async generate(\n    ast: TextAst,\n    textFormat: TextFormatType,\n    textLocation: TextLocationType,\n    options?: GenerateOptions,\n  ): Promise<BreakscapedString> {\n    return this.generateSync(ast, textFormat, textLocation, options);\n  }\n\n  /**\n   * Generate text from a bitmark text AST synchronously\n   *\n   * @param ast bitmark text AST\n   */\n  public generateSync(\n    ast: TextAst,\n    textFormat: TextFormatType,\n    textLocation: TextLocationType,\n    options?: GenerateOptions,\n  ): BreakscapedString {\n    // Sanity check\n    if (!ast || !Array.isArray(ast)) return '' as BreakscapedString;\n\n    this.generateOptions = Object.assign({}, options);\n\n    this.validateGenerateOptions(ast);\n\n    if (!this.generateOptions.plainTextDividerAllowed) {\n      // Normal case with no pre-text - need only walk once\n\n      // Reset the state\n      this.resetState(textFormat, textLocation);\n\n      // Walk the text AST - this 1st walk is to determine if there is pre-text\n      this.walkAndWrite(ast);\n    } else {\n      // Plain text divider is allowed. We need to walk the text AST twice:\n      // 1. To determine if there is pre-text\n      // 2. To generate the text\n\n      // Save and clear the write callback / body bit callback for the first walk as we don't want to write the text\n      const writeCallback = this.options.writeCallback;\n      const bodyBitCallback = this.options.bodyBitCallback;\n      this.options.writeCallback = undefined;\n      this.options.bodyBitCallback = undefined;\n\n      // Reset the state\n      this.resetState(textFormat, textLocation);\n\n      // Walk the text AST - this 1st walk is to determine if there is pre-text\n      this.walkAndWrite(ast);\n\n      // Restore the write callback\n      this.options.writeCallback = writeCallback;\n      this.options.bodyBitCallback = bodyBitCallback;\n\n      // Reset the state, preserving havePreText / preTextIndex from the first walk\n      const havePreText = this.havePreText;\n      const pti = this.preTextIndex;\n      this.resetState(textFormat, textLocation);\n      this.havePreText = havePreText;\n      this.preTextIndex = pti;\n\n      // Walk the text AST - this is the 2nd walk to generate the text\n      this.walkAndWrite(ast);\n    }\n\n    return this.writerText as BreakscapedString;\n  }\n\n  public getPlaceholders(): BodyBitsJson {\n    return this.placeholders;\n  }\n\n  private resetState(textFormat: TextFormatType, textLocation: TextLocationType): void {\n    this.printed = false;\n\n    this.textFormat = textFormat ?? TextFormat.bitmarkText;\n    this.textLocation = textLocation;\n    this.writerText = '';\n    this.nodeIndex = 0;\n    this.currentIndent = 0;\n    this.prevIndent = 0;\n    this.indentationStringCache = '';\n    this.inParagraph = false;\n    this.inHeading = false;\n    this.inCodeBlock = false;\n    this.exitedCodeBlock = false;\n    this.inBulletList = false;\n    this.inInline = false;\n    this.markDepth = 0;\n    this.textDepth = 0;\n    this.placeholderIndex = 0;\n    this.placeholders = {};\n\n    // For pre-text\n    this.rootParagraphNodeContentIndex = 0;\n    this.previousRootParagraphContextType = TextNodeType.hardBreak;\n    this.inPreText = false;\n    this.thisNodeIsPreText = false;\n    this.preTextIndexTemp = -1;\n    this.havePreText = false;\n    this.preTextIndex = -1;\n  }\n\n  private walkAndWrite(ast: TextAst): void {\n    // Walk the bitmark AST\n    this.ast.walk(ast, NodeType.textAst, this, undefined);\n  }\n\n  //\n  // NODE HANDLERS\n  //\n\n  // * -> textAstValue\n\n  protected enter_textAstValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    return this.handleEnterNode(node.value, route);\n  }\n\n  protected between_textAstValue(\n    node: NodeInfo,\n    left: NodeInfo,\n    right: NodeInfo,\n    route: NodeInfo[],\n  ): void | false {\n    return this.handleBetweenNode(node.value, left, right, route);\n  }\n\n  protected exit_textAstValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    return this.handleExitNode(node.value, route);\n  }\n\n  // * -> contentValue\n\n  protected enter_contentValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    return this.handleEnterContentValueNode(node, route);\n  }\n\n  protected between_contentValue(\n    node: NodeInfo,\n    left: NodeInfo,\n    right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    this.handleBetweenContentValueNode(node, left, right, route);\n  }\n\n  protected exit_contentValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    this.handleExitContentValueNode(node, route);\n  }\n\n  // * -> contentValueValue\n\n  protected enter_contentValueValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    return this.handleEnterNode(node.value, route);\n  }\n\n  protected between_contentValueValue(\n    node: NodeInfo,\n    left: NodeInfo,\n    right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    this.handleBetweenNode(node.value, left, right, route);\n  }\n\n  protected exit_contentValueValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    return this.handleExitNode(node.value, route);\n  }\n\n  // * -> marks\n\n  protected enter_marks(_node: NodeInfo, _route: NodeInfo[]): void | false {\n    this.markDepth++;\n  }\n\n  protected exit_marks(_node: NodeInfo, _route: NodeInfo[]): void | false {\n    this.markDepth--;\n  }\n\n  // END NODE HANDLERS\n\n  protected handleEnterNode(node: TextNode, route: NodeInfo[]): void | false {\n    if (this.markDepth > 0) return; // All marks are handled by themselves\n\n    this.handleEnterNodePreTextCheck(node, route);\n\n    this.handleIndent(node);\n\n    switch (node.type) {\n      case TextNodeType.paragraph:\n        this.inParagraph = true;\n        this.writeParagraph(node);\n        break;\n\n      case TextNodeType.hardBreak:\n        this.writeHardBreak(node);\n        break;\n\n      case TextNodeType.text: {\n        this.writeMarks(node, Stage.enter);\n        this.writeText(node);\n        this.writeMarks(node, Stage.between);\n        if (this.textDepth === 0) {\n          this.inInline = true;\n        }\n        this.textDepth++;\n        break;\n      }\n\n      case TextNodeType.heading:\n        this.writeHeading(node as HeadingTextNode);\n        this.inHeading = true;\n        break;\n\n      case TextNodeType.section:\n        this.writeSection(node as SectionTextNode);\n        break;\n\n      case TextNodeType.listItem:\n      case TextNodeType.taskItem:\n        this.writeBullet(node, route);\n        break;\n\n      case TextNodeType.image:\n        this.writeImage(node as ImageTextNode);\n        break;\n\n      case TextNodeType.imageInline:\n        this.writeImage(node as ImageTextNode);\n        break;\n\n      case TextNodeType.codeBlock:\n        this.inCodeBlock = true;\n        this.writeCodeBlock(node as CodeBlockTextNode);\n        break;\n\n      case TextNodeType.latex:\n        this.writeLatex(node as LatexTextNode);\n        break;\n\n      case TextNodeType.noBulletList:\n      case TextNodeType.bulletList:\n      case TextNodeType.orderedList:\n      case TextNodeType.orderedListRoman:\n      case TextNodeType.orderedListRomanLower:\n      case TextNodeType.letteredList:\n      case TextNodeType.letteredListLower:\n      case TextNodeType.taskList:\n        this.inBulletList = true;\n        break;\n\n      case TextNodeType.gap:\n      case TextNodeType.select:\n      case TextNodeType.highlight:\n      case TextNodeType.mark:\n        this.writeBodyBit(node, route);\n        // Stop parsing the body bit\n        return false;\n      default:\n      // Ignore unknown type\n    }\n\n    // Clear exited flags\n    this.exitedCodeBlock = false;\n  }\n\n  protected handleBetweenNode(\n    node: TextNode,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    switch (node.type) {\n      default:\n      // Ignore unknown type\n    }\n  }\n\n  protected handleExitNode(node: TextNode, _route: NodeInfo[]): void | false {\n    if (this.markDepth > 0) return; // All marks are handled by themselves\n\n    switch (node.type) {\n      case TextNodeType.text:\n        this.textDepth--;\n        if (this.textDepth === 0) {\n          this.inInline = false;\n        }\n        this.writeMarks(node, Stage.exit);\n        break;\n\n      case TextNodeType.paragraph:\n        // if (this.textFormat !== TextFormat.bitmarkText) {\n        // Paragraph Block type node, write 1x newline\n        // Except:\n        // - for bitmark-- where we don't write newlines for the single wrapping block\n        this.writeNL();\n        // }\n        this.inParagraph = false;\n        break;\n\n      case TextNodeType.heading:\n        this.inHeading = false;\n\n      case TextNodeType.section:\n      case TextNodeType.image:\n        if (!this.inParagraph) {\n          // Block type nodes, write 2x newline\n          this.writeNL();\n          this.writeNL();\n        }\n        break;\n\n      case TextNodeType.codeBlock:\n        // CodeBlock type node, write 2x newline\n        this.writeNL();\n        this.writeNL();\n        this.inCodeBlock = false;\n        this.exitedCodeBlock = true;\n        break;\n\n      case TextNodeType.noBulletList:\n      case TextNodeType.bulletList:\n      case TextNodeType.orderedList:\n      case TextNodeType.orderedListRoman:\n      case TextNodeType.orderedListRomanLower:\n      case TextNodeType.letteredList:\n      case TextNodeType.letteredListLower:\n      case TextNodeType.taskList:\n        // List Block type nodes, write a newline only if there is no indent\n        if (this.currentIndent <= 1) {\n          this.writeNL();\n          // Exit 'inBulletList' state only if not in a nested list\n          this.inBulletList = false;\n        }\n        break;\n\n      default:\n      // Ignore unknown type\n    }\n\n    this.handleDedent(node);\n\n    // Increment the node index for the next node\n    this.nodeIndex++;\n  }\n\n  protected handleIndent(node: TextNode) {\n    switch (node.type) {\n      case TextNodeType.noBulletList:\n      case TextNodeType.bulletList:\n      case TextNodeType.orderedList:\n      case TextNodeType.orderedListRoman:\n      case TextNodeType.orderedListRomanLower:\n      case TextNodeType.letteredList:\n      case TextNodeType.letteredListLower:\n      case TextNodeType.taskList:\n        this.currentIndent++;\n        break;\n\n      default:\n      // Ignore unknown type\n    }\n  }\n\n  protected handleDedent(node: TextNode) {\n    switch (node.type) {\n      case TextNodeType.noBulletList:\n      case TextNodeType.bulletList:\n      case TextNodeType.orderedList:\n      case TextNodeType.orderedListRoman:\n      case TextNodeType.orderedListRomanLower:\n      case TextNodeType.letteredList:\n      case TextNodeType.letteredListLower:\n      case TextNodeType.taskList:\n        this.currentIndent--;\n        break;\n\n      default:\n      // Ignore unknown type\n    }\n  }\n\n  protected handleEnterContentValueNode(_node: NodeInfo, route: NodeInfo[]): void | false {\n    if (route.length === FIRST_PARAGRAPH_CONTENT_DEPTH) {\n      this.thisNodeIsPreText = true;\n      this.inPreText = false;\n      this.previousRootParagraphContextType = TextNodeType.hardBreak;\n    }\n  }\n\n  protected handleBetweenContentValueNode(\n    _node: NodeInfo,\n    left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    if (route.length === FIRST_PARAGRAPH_CONTENT_DEPTH) {\n      const leftNode = left.value as TextNode;\n      this.updatePreTextState();\n\n      this.thisNodeIsPreText = true;\n      this.previousRootParagraphContextType = leftNode.type;\n      this.rootParagraphNodeContentIndex++;\n    }\n  }\n\n  protected handleExitContentValueNode(_node: NodeInfo, route: NodeInfo[]): void | false {\n    if (route.length === FIRST_PARAGRAPH_CONTENT_DEPTH) {\n      this.updatePreTextState();\n\n      this.thisNodeIsPreText = false;\n      if (this.generateOptions.plainTextDividerAllowed && this.inPreText) {\n        this.havePreText = true;\n        this.preTextIndex = this.preTextIndexTemp;\n      }\n      this.inPreText = false;\n    }\n  }\n\n  private updatePreTextState(): void {\n    if (\n      !this.inPreText &&\n      this.thisNodeIsPreText &&\n      this.previousRootParagraphContextType === TextNodeType.hardBreak\n    ) {\n      // Enter pre-text if this node could be pre-text, and the previous node was a hard break\n      this.inPreText = true;\n      this.preTextIndexTemp = this.rootParagraphNodeContentIndex;\n    } else if (this.inPreText && !this.thisNodeIsPreText) {\n      this.inPreText = false;\n      this.preTextIndexTemp = -1;\n    }\n  }\n\n  protected handleEnterNodePreTextCheck(node: TextNode, route: NodeInfo[]) {\n    const firstParagraphContent = route.length === 4;\n\n    // If this is the first paragraph content node, check for pre-text, otherwise cannot be pre-text\n    if (firstParagraphContent) {\n      // If in pre-text, and this node is a hard break, stay in pre-text\n      if (this.inPreText && node.type === TextNodeType.hardBreak) return;\n\n      // If this node is text, then we might be in pre-text\n      if (node.type === TextNodeType.text) return;\n    }\n\n    // Any other node and we are not in pre-text any longer\n    this.thisNodeIsPreText = false;\n  }\n\n  /**\n   * Check if a text node has a link mark, and if so, return the href\n   *\n   * @param node the node to check for a link mark\n   * @returns the href, or false if no link mark\n   */\n  protected getLinkHref(node: TextNode): string | false {\n    if (node.type === TextNodeType.text && node.marks) {\n      const href = node.marks.reduce((acc, mark) => {\n        if (mark.type === TextMarkType.link) {\n          const linkMark = mark as LinkMark;\n          const href = linkMark.attrs?.href;\n          if (href) return href;\n        }\n        return acc;\n      }, '');\n\n      if (href) return href;\n    }\n\n    return false;\n  }\n\n  /**\n   * Get the current indentation string\n   * @returns\n   */\n  protected getIndentationString(): string {\n    // Return the cached indent if indent hasn't changed\n    if (this.currentIndent === this.prevIndent) return this.indentationStringCache;\n\n    let s = '';\n    for (let i = 1; i < this.currentIndent; i++) s += '\\t';\n    // for (let i = 1; i < this.currentIndent; i++) s += '_';\n\n    this.indentationStringCache = s;\n    this.prevIndent = this.currentIndent;\n\n    return s;\n  }\n\n  //\n  // WRITE FUNCTIONS\n  //\n\n  protected writeBodyBit(node: TextNode, route: NodeInfo[]) {\n    const placeholder = `[!${this.placeholderIndex}]`;\n    this.placeholders[placeholder] = node as unknown as BodyBitJson;\n\n    if (this.options.bodyBitCallback) {\n      const bodyBit = this.options.bodyBitCallback(\n        node as unknown as BodyBitJson,\n        this.placeholderIndex,\n        route,\n      );\n      this.write(bodyBit);\n    } else {\n      // Write placeholder to the text\n      this.write(placeholder);\n    }\n\n    this.placeholderIndex++;\n  }\n\n  protected writeText(node: TextNode): void {\n    if (node.text == null) return;\n\n    // Handle normal text\n    const codeBreakscaping = this.inCodeBlock;\n\n    // Get the text\n    let s: string = node.text;\n\n    // If the node has a single link mark, and the mark is the same (without protocol) as the text, write the link\n    // instead of the text. This is a special case.\n    const linkText = this.getLinkText(node);\n    if (linkText) s = linkText;\n\n    // Breakscape the text\n    if (linkText) {\n      // Only breakscape ] in links (done in getLinkText)\n      s = linkText;\n    } else {\n      if (!codeBreakscaping) {\n        s = this.breakscape(s, {\n          format: this.textFormat,\n          location: this.textLocation,\n        });\n      } else {\n        s = this.breakscape(s, {\n          format: this.textFormat,\n          location: this.textLocation,\n        });\n      }\n    }\n\n    // Apply any required indentation\n    if (this.currentIndent > 1) {\n      const indentationString = this.getIndentationString();\n      s = s.replace(INDENTATION_REGEX, `$1${indentationString}`);\n    }\n\n    // If have pre-text, and this is the correct index, write the plain text divider\n    if (this.havePreText && this.rootParagraphNodeContentIndex === this.preTextIndex) {\n      // Write the plain text divider\n      this.writePlainTextDivider();\n      this.writeNL();\n    }\n    if (this.havePreText && this.rootParagraphNodeContentIndex >= this.preTextIndex) {\n      // Write the text as pre-text\n      const s = this.breakscape(node.text, {\n        format: TextFormat.plainText,\n        location: this.textLocation, // Must be body for pre-text\n      });\n      this.write(s);\n    } else {\n      // Write the text\n      this.write(s);\n    }\n\n    // Handle pre-text check\n    if (this.currentIndent > 1 || codeBreakscaping) {\n      this.thisNodeIsPreText = false; // Not pre-text if indented or in code block\n    }\n    if (!this.inPreText && node.text === s) {\n      this.thisNodeIsPreText = false; // No-breakscaping, so don't enter pre-text\n    }\n  }\n\n  /**\n   * Check if a node is a link node and if so and the node has only the link mark, and the link without the\n   * protocol is the same as the text, return true. Otherwise return false.\n   *\n   * @param node\n   * @returns true if a simple link, otherwise false\n   */\n  protected isSimpleLink(node: TextNode): boolean {\n    if (node.text == null) return false;\n    if (node.marks?.length !== 1) return false;\n\n    const href = this.getLinkHref(node);\n    if (href) {\n      // Get the text part of the link\n      const hrefText = href.replace(LINK_REGEX, '$1');\n      return hrefText === node.text;\n    }\n    return false;\n  }\n\n  /**\n   * Get the link text if the node is a link, otherwise return false\n   *\n   * @param node\n   * @returns\n   */\n  protected getLinkText(node: TextNode): string | false {\n    if (node.text == null) return false;\n\n    const href = this.getLinkHref(node);\n    if (href) {\n      let res: string;\n      // Get the text part of the link\n      const hrefText = href.replace(LINK_REGEX, '$1');\n      if (hrefText === node.text) {\n        // Return the link as the text\n        res = href;\n      } else {\n        res = node.text;\n      }\n      res = (res ?? '').replace(LINK_BREAKSCAPE_REGEX, '^]'); // Link breakscaping\n      return res;\n    }\n    return false;\n  }\n\n  /**\n   * If the existing written text ends with a half-mark, and the new text starts with the same half-mark, insert a\n   * breakscape ^ between them to break the sequence.\n   *\n   * Only applies to bitmark version > 2\n   *\n   * @param s\n   */\n  protected getInterTextBreakscape(s: string): string {\n    if (this.bitmarkVersion === BitmarkVersion.v2) return '';\n    if (this.textFormat === TextFormat.plainText) return '';\n\n    const lastChar = this.writerText.slice(-1);\n    const firstChar = s.slice(0, 1);\n\n    // If the last char is a half-mark, and the first char is the same half-mark, insert a breakscape\n    if (lastChar === firstChar && ALL_HALF_MARKS.indexOf(lastChar) !== -1) {\n      return '^';\n    }\n\n    // If in the body and the first char is a bit tag start, and the last char is the second part of the tag,\n    // insert a breakscape\n    if (this.textLocation === TextLocation.body) {\n      if (lastChar === '[' && ALL_TAG_OPENING_ENDS.indexOf(firstChar) !== -1) {\n        return '^';\n      }\n    }\n\n    // Normal case, no breakscape\n    return '';\n  }\n\n  // protected getHrefTextFromHref\n\n  protected validateGenerateOptions(ast: TextNode[]): void {\n    // Validate plain text divider allowed\n    if (this.generateOptions.plainTextDividerAllowed) {\n      // Check there is only one node in the AST, and that it is a paragraph\n      if (ast.length !== 1) {\n        this.generateOptions.plainTextDividerAllowed = false;\n      } else if (ast.length === 1 && ast[0].type !== TextNodeType.paragraph) {\n        this.generateOptions.plainTextDividerAllowed = false;\n      }\n    }\n  }\n\n  /**\n   * Write the marks for the node.\n   *\n   * All marks need to be considered at once, because if there are multiple marks, they need to be written in\n   * a combined manner.\n   *\n   * e.g. if there are bold and italic marks, they need to be written as\n   *\n   * ==the text==|bold|italic|\n   * rather than\n   * **__the text__**\n   * or\n   * **__the text**__\n   *\n   * @param node the text node\n   * @param start true if starting (before) the text, false if ending (after) the text\n   */\n  protected writeMarks(node: TextNode, stage: StageType): void | false {\n    if (node.marks) {\n      // If this is a mark within inline text, or a heading, only inline marks are allowed\n      const forceSingleMark =\n        this.generateOptions.forceInline || !!(this.inInline || this.inHeading);\n\n      // If node has marks, it cannot be a pre-text node\n      this.thisNodeIsPreText = false;\n\n      // Empty marks occur when the inline mark has no attributes - write an inline mark with no attributes\n      const emptyMarks = node.marks.length === 0;\n      if (emptyMarks) {\n        // Write the mark start / end around the text\n        this.writeMarkTextWrapper(INLINE_MARK);\n        return;\n      }\n\n      // Single marks are only valid if there is only one mark for this text\n      // They are only used in inline / heading marks since bitmark-- was dropped.\n      const singleMark = node.marks.length === 1 && forceSingleMark;\n\n      // Get the correct mark start / end\n      const markStartEnd = node.marks.reduce(\n        (acc, mark) => {\n          if (acc) return acc;\n          if (STANDARD_MARK_TYPES.indexOf(mark.type) !== -1) {\n            if (singleMark) return STANDARD_MARKS[mark.type];\n            return INLINE_MARK;\n          } else if (INLINE_MARK_TYPES.indexOf(mark.type) !== -1) {\n            return INLINE_MARK;\n          } else {\n            // Do nothing (NOTE: link is handled in writeText)\n          }\n          return acc;\n        },\n        undefined as string | undefined,\n      );\n\n      // Check the special case of a simple link mark\n      const isSimpleLinkMark = this.isSimpleLink(node);\n\n      const haveMark = markStartEnd != null && !isSimpleLinkMark;\n\n      if (haveMark) {\n        // Write the mark start / end around the text (==)\n        if (stage == Stage.enter || stage == Stage.between) {\n          this.writeMarkTextWrapper(markStartEnd);\n        }\n\n        // Write the inline/comment mark if not entering (|<mark content>)\n        if (stage == Stage.between) {\n          for (const mark of node.marks) {\n            if (STANDARD_MARK_TYPES.indexOf(mark.type) !== -1) {\n              if (!singleMark) {\n                this.writeInlineMarkStartEnd();\n                this.writeInlineMark(mark);\n              }\n            } else if (TextMarkType.comment === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeCommentMark(mark as CommentMark);\n            } else if (TextMarkType.link === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeLinkMark(mark as LinkMark);\n            } else if (TextMarkType.ref === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeRefMark(mark as RefMark);\n            } else if (TextMarkType.xref === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeXRefMark(mark as XRefMark);\n            } else if (TextMarkType.extref === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeExtRefMark(mark as ExtRefMark);\n            } else if (TextMarkType.footnote === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeFootnoteMark(mark as FootnoteMark);\n            } else if (TextMarkType.footnoteStar === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeFootnoteStarMark(mark as FootnoteMark);\n            } else if (TextMarkType.symbol === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeSymbolMark(mark as SymbolMark);\n            } else if (INLINE_MARK_TYPES.indexOf(mark.type) !== -1) {\n              this.writeInlineMarkStartEnd();\n              this.writeInlineMark(mark);\n            } else {\n              // Do nothing\n            }\n          }\n        }\n\n        // Write the inline/comment mark end when exiting (|)\n        if (stage == Stage.exit) {\n          let inlineMarkWritten = false;\n          for (const mark of node.marks) {\n            if (STANDARD_MARK_TYPES.indexOf(mark.type) !== -1) {\n              if (!singleMark) {\n                inlineMarkWritten = true;\n              }\n            } else if (\n              TextMarkType.comment === mark.type ||\n              TextMarkType.link === mark.type ||\n              TextMarkType.ref === mark.type ||\n              TextMarkType.xref === mark.type ||\n              TextMarkType.footnote === mark.type ||\n              TextMarkType.footnoteStar === mark.type ||\n              INLINE_MARK_TYPES.indexOf(mark.type) !== -1\n            ) {\n              inlineMarkWritten = true;\n            } else {\n              // Do nothing (NOTE: link is handled in writeText)\n            }\n          }\n          // Write the mark end\n          if (inlineMarkWritten) this.writeInlineMarkStartEnd();\n        }\n      }\n    }\n  }\n\n  protected writeParagraph(node: TextNode): void {\n    // Write paragraph marker for bitmark++\n    if (this.textFormat === TextFormat.bitmarkText) {\n      // Do not write a paragraph marker when in a bullet list\n      if (this.inBulletList) return;\n\n      // Do not write a paragraph marker for the first node if it is a paragraph - it is implicit\n      // (unless it is empty, or an empty string)\n      // This is a nasty look-ahead but otherwise the entire paragraph block would need to be written before\n      // determining if it is the first node and if it is empty\n      const nodeContentLength = node.content?.length ?? 0;\n      if (this.nodeIndex === 0) {\n        if (nodeContentLength === 1) {\n          const isTextNode = node.content?.[0].type === TextNodeType.text;\n          const text = node.content?.[0].text ?? '';\n          if (!isTextNode || text !== '') return;\n        }\n        if (nodeContentLength > 1) return;\n      }\n\n      this.write('|');\n      this.writeNL();\n      if (this.exitedCodeBlock) {\n        // Write an extra newline after a code block\n        this.writeNL();\n      }\n    }\n  }\n\n  protected writeHardBreak(_node: TextNode): void {\n    this.writeNL();\n\n    // Apply any required indentation (when in list)\n    if (this.currentIndent > 1) {\n      const indentationString = this.getIndentationString();\n      this.write(indentationString);\n    }\n  }\n\n  protected writeHeading(node: HeadingTextNode): void {\n    let s = '';\n    const level = node.attrs?.level ?? 1;\n    for (let i = 0; i < +level; i++) s += HEADING_TAG;\n\n    s += ' ';\n\n    // Write the heading tag\n    this.write(s);\n  }\n\n  protected writeSection(node: SectionTextNode): void {\n    let s = '';\n    if (node.section) {\n      s = `|${node.section}: `;\n    } else {\n      s = '|';\n    }\n\n    // Write the section tag\n    this.write(s);\n  }\n\n  protected writeBullet(node: TextNode, route: NodeInfo[]) {\n    // if (node.attrs == null || !node.attrs.start) return;\n    // const attrs = node.attrs;\n\n    // const s = `|code:${attrs.language}\\n`;\n\n    // Add indentation\n    let bullet = this.getIndentationString();\n    const listParent = this.getParentNode(route, 2);\n    const listParentNode: ListTextNode | undefined = listParent?.value;\n    const listType = listParentNode?.type;\n    const start = listParentNode?.attrs?.start ?? 1;\n\n    // Add bullet\n    if (listType === TextNodeType.bulletList) {\n      bullet += '• ';\n    } else if (listType === TextNodeType.noBulletList) {\n      bullet += '•_ ';\n    } else if (listType === TextNodeType.orderedList) {\n      bullet += `•${start} `;\n    } else if (listType === TextNodeType.orderedListRoman) {\n      bullet += `•${start}I `;\n    } else if (listType === TextNodeType.orderedListRomanLower) {\n      bullet += `•${start}i `;\n    } else if (listType === TextNodeType.letteredList) {\n      bullet += '•A ';\n    } else if (listType === TextNodeType.letteredListLower) {\n      bullet += '•a ';\n    } else if (listType === TextNodeType.taskList) {\n      const taskList = node as TaskItemTextNode;\n      const checked = taskList.attrs?.checked ?? false;\n      bullet += checked ? '•+ ' : '•- ';\n    }\n    if (bullet) this.write(bullet);\n  }\n\n  protected writeImage(node: ImageTextNode | ImageInlineTextNode): void {\n    if (node.attrs == null || !node.attrs.src) return;\n    const attrs = node.attrs;\n\n    const inlineImage = node.type === TextNodeType.imageInline;\n\n    const mediaAttrs = this.getMediaAttrs(inlineImage ? 'imageInline' : 'image', attrs, {\n      ignoreAttributes: inlineImage ? new Set(['alt', 'zoomDisabled', 'title']) : undefined,\n    });\n\n    let s = '';\n    if (inlineImage) {\n      s = `==${attrs.alt ?? ''}==`;\n    }\n    s += mediaAttrs ? `|${mediaAttrs}|` : '';\n\n    // Write the text\n    this.write(s);\n  }\n\n  protected writeCodeBlock(node: CodeBlockTextNode): void {\n    if (node.attrs == null || !node.attrs.language) return;\n    const attrs = node.attrs;\n\n    const s = `|code:${attrs.language}\\n`;\n\n    // Write the text\n    this.write(s);\n  }\n\n  protected writeLatex(node: LatexTextNode): void {\n    if (node.attrs == null || !node.attrs.formula) return;\n    const attrs = node.attrs;\n\n    const formula = this.breakscape(attrs.formula, {\n      format: this.textFormat,\n      location: this.textLocation,\n    });\n\n    const s = `==${formula}==|latex|`;\n\n    // Write the text\n    this.write(s);\n  }\n\n  protected writeMarkTextWrapper(s: string) {\n    if (s) this.write(s);\n  }\n\n  protected writeInlineMark(mark: TextMark) {\n    let s = `${mark.type}`;\n    if (mark.attrs) {\n      for (const [k, v] of Object.entries(mark.attrs)) {\n        if (\n          (k === 'language' && v !== 'plain text') ||\n          k === 'color' ||\n          k === 'propertyRef' ||\n          k === 'name' ||\n          k === 'duration'\n        ) {\n          s = `${s}:${v}`;\n        }\n      }\n    }\n    this.write(s);\n  }\n\n  protected writeCommentMark(mark: CommentMark) {\n    const comment = mark.comment || '';\n\n    const s = `#${comment}`;\n    this.write(s);\n  }\n\n  protected writeLinkMark(mark: LinkMark) {\n    const href = mark.attrs?.href || '';\n\n    // Apply link breakscaping\n    const linkText = (href ?? '').replace(LINK_BREAKSCAPE_REGEX, '^]');\n\n    const s = `link:${linkText}`;\n    this.write(s);\n  }\n\n  protected writeRefMark(mark: RefMark) {\n    const ref = mark.attrs?.reference ?? '';\n\n    const s = `►${ref}`;\n    this.write(s);\n  }\n\n  protected writeXRefMark(mark: XRefMark) {\n    const xref = mark.attrs?.xref ?? '';\n    const ref = mark.attrs?.reference ?? '';\n\n    let s = `xref:${xref}`;\n    if (ref) s += `|►${ref}`;\n    this.write(s);\n  }\n\n  protected writeExtRefMark(mark: ExtRefMark) {\n    const extref = mark.attrs?.extref ?? '';\n    const refs = mark.attrs?.references ?? [];\n    const provider = mark.attrs?.provider ?? '';\n\n    let s = `extref:${extref}`;\n    for (const ref of refs) {\n      s += `|►${ref ?? ''}`;\n    }\n    s += `|provider:${provider}`;\n\n    this.write(s);\n  }\n\n  protected writeFootnoteMark(mark: FootnoteMark) {\n    const s = `footnote:`;\n    this.write(s);\n\n    // Write the footnote content\n    const text =\n      this.internalTextGenerator?.generateSync(\n        mark.attrs?.content as TextNode[],\n        this.textFormat,\n        this.textLocation,\n        {\n          ...this.generateOptions,\n          forceInline: true,\n        },\n      ) ?? '';\n\n    this.write(text);\n  }\n\n  protected writeFootnoteStarMark(mark: FootnoteMark) {\n    const s = `footnote*:`;\n    this.write(s);\n\n    // Write the footnote star content\n    const text =\n      this.internalTextGenerator?.generateSync(\n        mark.attrs?.content as TextNode[],\n        this.textFormat,\n        this.textLocation,\n        {\n          ...this.generateOptions,\n          forceInline: true,\n        },\n      ) ?? '';\n\n    this.write(text);\n  }\n\n  protected writeSymbolMark(mark: SymbolMark) {\n    if (mark.attrs == null) return;\n    const attrs = mark.attrs;\n\n    const mediaAttrs = this.getMediaAttrs('symbol', attrs);\n    const s = mediaAttrs ?? '';\n\n    // Write the text\n    this.write(s);\n  }\n\n  protected writeInlineMarkStartEnd() {\n    this.write('|');\n  }\n\n  protected writePlainTextDivider(): void {\n    this.write('==== text ====');\n  }\n\n  protected writeString(s?: string): void {\n    if (s != null) this.write(`${s}`);\n  }\n\n  protected writeNL(): void {\n    if (this.options.debugGenerationInline) {\n      this.write('\\\\n');\n      return;\n    }\n    this.write('\\n');\n  }\n\n  protected writeInlineDebug(\n    key: string,\n    state: { open?: boolean; close?: boolean; single?: boolean },\n  ) {\n    let tag = key;\n    if (state.open) {\n      tag = `<${key}>`;\n    } else if (state.close) {\n      tag = `</${key}>`;\n    } else if (state.single) {\n      tag = `<${key} />`;\n    }\n\n    this.writeString(tag);\n  }\n\n  protected getMediaAttrs(\n    mediaType: string,\n    attrs: MediaAttributes,\n    options?: MediaAttributeOptions,\n  ): string | undefined {\n    if (!mediaType) return undefined;\n\n    const opts = Object.assign({}, options);\n    const ignoreAttributes = opts.ignoreAttributes ?? new Set();\n\n    let s = `${mediaType}:${attrs?.src ?? ''}`;\n\n    // Loop and write the attributes (except src, as written above)\n    const entries = Object.entries(attrs).filter(([k, _v]) => k !== 'src');\n\n    for (let i = 0; i < entries.length; i++) {\n      const [k, v] = entries[i];\n\n      // Ignore certain attributes\n      if (ignoreAttributes.has(k)) continue;\n\n      switch (k) {\n        case 'textAlign':\n          if (v !== 'left') s += `|captionAlign:${v}`;\n          break;\n        case 'alignment':\n          if (v !== 'center') if (v) s += `|alignment:${v}`;\n          break;\n        case 'title':\n          if (v) s += `|caption:${v}`;\n          break;\n        case 'class':\n          if (v !== 'center') if (v) s += `|align:${v}`;\n          break;\n        case 'comment':\n          if (v) s += `|#${v}`;\n          break;\n        case '':\n          // This case handles reverse of strange behaviour in the text parser when a key is empty\n          if (StringUtils.isString(v)) s += `|:${v}`;\n          else s += `|`;\n          break;\n        case 'zoomDisabled':\n          if (!v) s += '|zoomDisabled:false';\n          break;\n        case 'alt':\n        case 'width':\n        case 'height':\n        default:\n          if (k && v) s += `|${k}:${v}`;\n          break;\n      }\n    }\n\n    return s;\n  }\n\n  //\n  // Helper functions\n  //\n\n  protected breakscape(s: string, options: BreakscapeOptions): string {\n    if (this.generateOptions.noBreakscaping) return s;\n    return Breakscape.breakscape(s, options);\n  }\n\n  protected getBitType(route: NodeInfo[]): BitTypeType | undefined {\n    for (const node of route) {\n      if (node.key === NodeType.bitsValue) {\n        const n = node.value as Bit;\n        return n?.bitType;\n      }\n    }\n\n    return undefined;\n  }\n\n  //\n  // Writer interface\n  //\n\n  /**\n   * Writes a string value to the output.\n   * @param value - The string value to be written.\n   */\n  write(value: string): this {\n    // Handle case where the already written text, combined with this text, would create an unwanted control\n    // sequence, e.g. old* **new**. In this case, a ^ is inserted to break the sequence.\n    value = this.getInterTextBreakscape(value) + value;\n\n    if (this.options.writeCallback) {\n      this.options.writeCallback(value);\n    }\n    this.writerText += value;\n\n    // for debugging console.log(this.writerText);\n\n    return this;\n  }\n\n  /**\n   * Writes a new line to the output. The line is indented automatically. The line is ended with the endOfLineString.\n   * @param value - The line to write. When omitted, only the endOfLineString is written.\n   */\n  writeLine(value?: string): this {\n    this.write(`${value}\\n`);\n    return this;\n  }\n\n  /**\n   * Writes a collection of lines to the output. Each line is indented automatically and ended with the endOfLineString.\n   * @param values - The lines to write.\n   * @param delimiter - An optional delimiter to be written at the end of each line, except for the last one.\n   */\n  writeLines(values: string[], delimiter?: string): this {\n    for (const value of values) {\n      this.write(`${value}${delimiter ?? ''}\\n`);\n    }\n    return this;\n  }\n\n  /**\n   * Writes a single whitespace character to the output.\n   */\n  writeWhiteSpace(): this {\n    this.write(' ');\n    return this;\n  }\n}\n\nexport { TextGenerator };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BitmarkVersion = {\n  v2: 2,\n  v3: 3,\n} as const;\n\nexport type BitmarkVersionType = EnumType<typeof BitmarkVersion>;\n\nconst DEFAULT_BITMARK_VERSION = BitmarkVersion.v3;\n\nexport { BitmarkVersion, DEFAULT_BITMARK_VERSION };\n","import { Ast, type AstWalkCallbacks, type NodeInfo } from '../ast/Ast.ts';\nimport { type Generator } from './Generator.ts';\n\n/**\n * Generator that walks bitmark AST.\n *\n * The implementation should implement functions with the correct naming, and these will be called when\n * walking the AST:\n *\n * enter_<nodeKey>() - called when entering a branch node\n * between_<nodeKey>() - called when between child nodes\n * exit_<nodeKey>() - called when exiting a branch node\n * leaf_<nodeKey>() - called when entering a leaf node\n */\nabstract class AstWalkerGenerator<AstType, R, Context = undefined>\n  implements Generator<AstType, R>, AstWalkCallbacks<Context>\n{\n  protected ast = new Ast();\n\n  // Debugging\n  protected debugGenerationInline = false;\n  protected printed = false;\n\n  public abstract generate(ast: AstType, param1?: unknown, param2?: unknown): Promise<R>;\n\n  public abstract generateSync(ast: AstType, param1?: unknown, param2?: unknown): R;\n\n  enter(node: NodeInfo, route: NodeInfo[], context: Context): boolean | void {\n    let res: boolean | void = void 0;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const gen = this as any;\n    const funcName = `enter_${node.key}`;\n\n    if (!this.printed) {\n      this.printed = true;\n    }\n\n    if (this.debugGenerationInline) this.writeInlineDebug(node.key, { open: true });\n\n    if (typeof gen[funcName] === 'function') {\n      res = gen[funcName](node, route, context);\n    }\n\n    return res;\n  }\n\n  between(\n    node: NodeInfo,\n    left: NodeInfo,\n    right: NodeInfo,\n    route: NodeInfo[],\n    context: Context,\n  ): boolean | void {\n    let res: boolean | void = void 0;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const gen = this as any;\n    const funcName = `between_${node.key}`;\n\n    if (this.debugGenerationInline) this.writeInlineDebug(node.key, { single: true });\n\n    if (typeof gen[funcName] === 'function') {\n      res = gen[funcName](node, left, right, route, context);\n    }\n\n    return res;\n  }\n\n  exit(node: NodeInfo, route: NodeInfo[], context: Context): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const gen = this as any;\n    const funcName = `exit_${node.key}`;\n\n    if (this.debugGenerationInline) this.writeInlineDebug(node.key, { close: true });\n\n    if (typeof gen[funcName] === 'function') {\n      gen[funcName](node, route, context);\n    }\n  }\n\n  leaf(node: NodeInfo, route: NodeInfo[], context: Context): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const gen = this as any;\n    const funcName = `leaf_${node.key}`;\n\n    if (this.debugGenerationInline) this.writeInlineDebug(node.key, { open: true });\n\n    if (typeof gen[funcName] === 'function') {\n      gen[funcName](node, route, context);\n    }\n\n    if (this.debugGenerationInline) this.writeInlineDebug(node.key, { close: true });\n  }\n\n  //\n  // HELPER FUNCTIONS\n  //\n\n  protected getParentNode(route: NodeInfo[], nodesBack = 1): NodeInfo | undefined {\n    // if (route.length > nodesBack + 1) {\n    //   return route[route.length - nodesBack - 1];\n    // }\n    if (route.length > nodesBack) {\n      return route[route.length - nodesBack - 1];\n    }\n\n    return undefined;\n  }\n  //\n  // WRITER FUNCTIONS\n  //\n\n  protected abstract writeInlineDebug(\n    key: string,\n    state: { open?: boolean; close?: boolean; single?: boolean },\n  ): void;\n}\n\nexport { AstWalkerGenerator };\n","// @generated by Peggy 5.1.0.\n//\n// https://peggyjs.org/\n\nimport { Breakscape } from \"../../../breakscaping/Breakscape.ts\";\n\n\n\n\nconst VERSION = \"8.37.3\"\n\n//Parser peggy.js\n\n// parser options (parameter when running parser):\n// allowedStartRules: [\"bitmarkPlusPlus\", \"bitmarkPlus\", \"bitmarkMinusMinus\", \"bitmarkPlusString\", \"bitmarkMinusMinusString\"]\n\n// The start rules ending in \"String\" are for internal use only.\n// The public rules return a full StyledText object. This means things got consitent to handle. However, this means, there is always at least one block (a paragraph in case of bitmark+ and bitmark--) present.\n\n// Todos\n\n// - JSON for color\n\n// - LaTeX embed\n// The formula == \\\\left( x | y \\\\right) ==|latex| is inline.\n\n/*\n\nEmpty StyledString\n\n[{ \"type\": \"text\", \"text\": \"\" }] // NOK - TipTap Error\n[{ \"type\": \"text\"}] // NOK - TipTap Error\n[] - OK\n\nEmpty StyledText\n\n[{ \"type\": \"paragraph\", \"content\": [] }] // OK\n[{ \"type\": \"paragraph\" }] // OK\n[] // OK - preferred\n\n*/\n\n/*\n\n# Hallo\n\nHier kommt...\n\nAlex\n\n|\n\n## Vorhang auf!\n\n• Eins\n• Zwei\n\t•1 Num 1 ==inline code==|code:javascript|\n\t•1 Num 2\n\tSecond Line\n• Three\n\t•A Sub Three\n\t•A More Sub Three\n\n\n•+ Milk\n•+ Cheese\n•- Wine\n\n\n|image:https://apple.com|width:300|height: 400|\n\ntext ==alt text of the inline image==|image:https://img.io/img.svg|width:400|height:200|#comment| more text\n\n|code: javascript\n\nlet a = 3\nlet b = 4\n\nlet c = a + b\n\n|^code: js\n\n\n|\n\nDas war's ==1==|footnote:So long and **thanks for all the fish**|\n\n */\n\n\n\n\n\n// global initializer\n// global utility functions\n\n\nfunction s(_string) {\n  return _string ?? \"\"\n}\n\nfunction legacyContextAwarewUnbreakscape(_str) {\n\tlet u_ = _str || \"\"\n\n\tfunction replacer(match, p1, offset, string, groups) {\n  \t\treturn match.replace(\"^\", \"\");\n\t}\n\n  let re_ = new RegExp( /=\\^(\\^*)(?==)|\\*\\^(\\^*)(?=\\*)|_\\^(\\^*)(?=_)|`\\^(\\^*)(?=`)|!\\^(\\^*)(?=!)|\\[\\^(\\^*)|•\\^(\\^*)|#\\^(\\^*)|\\|\\^(\\^*)|\\|\\^(\\^*)/, \"g\") // RegExp( /([\\[*_`!])\\^(?!\\^)/, \"g\")\n\n  u_ = u_.replace(re_, replacer)\n\n  return u_\n}\n\nfunction unbreakscape(str) {\n  if (typeof str !== 'string') return null;\n  // return str.replace(/\\^+/g, run => run.slice(1));\n\n  return Breakscape.unbreakscape(str);\n}\n\nfunction removeTempParsingParent(obj) {\n    if (obj && typeof obj === 'object') {\n        delete obj._tempParsingParent; // Remove temp property if exists\n        delete obj._tempListStart; // Remove temp property if exists\n\n        Object.keys(obj).forEach(key => {\n            // Recursively call the function for all sub-objects\n            removeTempParsingParent(obj[key]);\n        });\n    }\n}\n\n// function cleanEmptyTextNodes(node) {\n//   debugger;\n//   if (Array.isArray(node)) {\n//     return node.map(cleanEmptyTextNodes);\n//   }\n//   if (node !== null && typeof node === 'object') {\n//     const hasType    = Object.prototype.hasOwnProperty.call(node, 'type');\n//     const hasContent = Object.prototype.hasOwnProperty.call(node, 'content');\n//     const result = {};\n\n//     for (const [key, value] of Object.entries(node)) {\n//       if (key === 'content' && hasType && hasContent && Array.isArray(value)) {\n//         // filter out items where item.text === \"\"\n//         const filtered = value.filter(item =>\n//           !(item && typeof item === 'object' && 'text' in item && item.text === '')\n//         );\n//         result[key] = filtered.map(cleanEmptyTextNodes);\n\n//       } else if (Array.isArray(value)) {\n//         result[key] = value.map(cleanEmptyTextNodes);\n\n//       } else {\n//         result[key] = cleanEmptyTextNodes(value);\n//       }\n//     }\n\n//     return result;\n//   }\n//   return node;\n// }\n\n/**\n * RAS 2025-05-22\n * Fixes / features\n * - Handles arrays or objects as input (including root array) - main reason for change\n * - Modifies in-place rather than copying array.\n * - Removed some unnecessary checks - will work fine without them\n */\nfunction cleanEmptyTextNodes(root) {\n  const isEmptyTextNode = (n) => n && n.type === \"text\" && !n.text;\n\n  // Recursively walk 'content' arrays\n  function cleanContentArray(arr) {\n    for (let i = arr.length - 1; i >= 0; i--) {\n      const item = arr[i];\n\n      if (isEmptyTextNode(item)) {\n        // drop the empty text node\n        arr.splice(i, 1);\n      } else if (item && Array.isArray(item.content)) {\n        // recurse into `content` array\n        cleanContentArray(item.content);\n      }\n      // Any other shape is ignored.\n    }\n  }\n\n  if (Array.isArray(root)) {\n    cleanContentArray(root);\n  } else if (root && Array.isArray(root.content)) {\n    cleanContentArray(root.content);\n  }\n\n  return root;\n}\n\nfunction bitmarkPlusPlus(_str) {\n\n  // if (parser) {\n  // \treturn parser.parse(_str, { startRule: \"bitmarkPlusPlus\" })\n  // } else {\n  //   // embedded in Get More Brain\n  //   return parse(_str, { startRule: \"bitmarkPlusPlus\" })\n  // }\n  if (typeof parser !== 'undefined') {\n  \treturn parser.parse(_str, { startRule: \"bitmarkPlusPlus\" })\n  }\n  return peg$parse(_str, { startRule: \"bitmarkPlusPlus\" })\n}\n\nfunction bitmarkPlusString(_str) {\n\n  // if (parser) {\n  // \treturn parser.parse(_str, { startRule: \"bitmarkPlusString\" })\n  // } else {\n  //   // embedded in Get More Brain\n  //   return parse(_str, { startRule: \"bitmarkPlusString\" })\n  // }\n  if (typeof parser !== 'undefined') {\n    return parser.parse(_str, { startRule: \"bitmarkPlusString\" })\n  }\n  return peg$parse(_str, { startRule: \"bitmarkPlusString\" })\n}\n\nfunction bitmarkMinusMinusString(_str) {\n\n  // if (parser) {\n  // \treturn parser.parse(_str, { startRule: \"bitmarkMinusMinusString\" })\n  // } else {\n  //   // embedded in Get More Brain\n  //   return parse(_str, { startRule: \"bitmarkMinusMinusString\" })\n  // }\n  if (typeof parser !== 'undefined') {\n  \treturn parser.parse(_str, { startRule: \"bitmarkMinusMinusString\" })\n  }\n  return peg$parse(_str, { startRule: \"bitmarkMinusMinusString\" })\n}\n\n\nclass peg$SyntaxError extends SyntaxError {\n  constructor(message, expected, found, location) {\n    super(message);\n    this.expected = expected;\n    this.found = found;\n    this.location = location;\n    this.name = \"SyntaxError\";\n  }\n\n  format(sources) {\n    let str = \"Error: \" + this.message;\n    if (this.location) {\n      let src = null;\n      const st = sources.find(s => s.source === this.location.source);\n      if (st) {\n        src = st.text.split(/\\r\\n|\\n|\\r/g);\n      }\n      const s = this.location.start;\n      const offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n        ? this.location.source.offset(s)\n        : s;\n      const loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n      if (src) {\n        const e = this.location.end;\n        const filler = \"\".padEnd(offset_s.line.toString().length, \" \");\n        const line = src[s.line - 1];\n        const last = s.line === e.line ? e.column : line.length + 1;\n        const hatLen = (last - s.column) || 1;\n        str += \"\\n --> \" + loc + \"\\n\"\n            + filler + \" |\\n\"\n            + offset_s.line + \" | \" + line + \"\\n\"\n            + filler + \" | \" + \"\".padEnd(s.column - 1, \" \")\n            + \"\".padEnd(hatLen, \"^\");\n      } else {\n        str += \"\\n at \" + loc;\n      }\n    }\n    return str;\n  }\n\n  static buildMessage(expected, found) {\n    function hex(ch) {\n      return ch.codePointAt(0).toString(16).toUpperCase();\n    }\n\n    const nonPrintable = Object.prototype.hasOwnProperty.call(RegExp.prototype, \"unicode\")\n      ? new RegExp(\"[\\\\p{C}\\\\p{Mn}\\\\p{Mc}]\", \"gu\")\n      : null;\n    function unicodeEscape(s) {\n      if (nonPrintable) {\n        return s.replace(nonPrintable,  ch => \"\\\\u{\" + hex(ch) + \"}\");\n      }\n      return s;\n    }\n\n    function literalEscape(s) {\n      return unicodeEscape(s\n        .replace(/\\\\/g, \"\\\\\\\\\")\n        .replace(/\"/g,  \"\\\\\\\"\")\n        .replace(/\\0/g, \"\\\\0\")\n        .replace(/\\t/g, \"\\\\t\")\n        .replace(/\\n/g, \"\\\\n\")\n        .replace(/\\r/g, \"\\\\r\")\n        .replace(/[\\x00-\\x0F]/g,          ch => \"\\\\x0\" + hex(ch))\n        .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, ch => \"\\\\x\"  + hex(ch)));\n    }\n\n    function classEscape(s) {\n      return unicodeEscape(s\n        .replace(/\\\\/g, \"\\\\\\\\\")\n        .replace(/\\]/g, \"\\\\]\")\n        .replace(/\\^/g, \"\\\\^\")\n        .replace(/-/g,  \"\\\\-\")\n        .replace(/\\0/g, \"\\\\0\")\n        .replace(/\\t/g, \"\\\\t\")\n        .replace(/\\n/g, \"\\\\n\")\n        .replace(/\\r/g, \"\\\\r\")\n        .replace(/[\\x00-\\x0F]/g,          ch => \"\\\\x0\" + hex(ch))\n        .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, ch => \"\\\\x\"  + hex(ch)));\n    }\n\n    const DESCRIBE_EXPECTATION_FNS = {\n      literal(expectation) {\n        return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n      },\n\n      class(expectation) {\n        const escapedParts = expectation.parts.map(\n          part => (Array.isArray(part)\n            ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n            : classEscape(part))\n        );\n\n        return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\" + (expectation.unicode ? \"u\" : \"\");\n      },\n\n      any() {\n        return \"any character\";\n      },\n\n      end() {\n        return \"end of input\";\n      },\n\n      other(expectation) {\n        return expectation.description;\n      },\n    };\n\n    function describeExpectation(expectation) {\n      return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n    }\n\n    function describeExpected(expected) {\n      const descriptions = expected.map(describeExpectation);\n      descriptions.sort();\n\n      if (descriptions.length > 0) {\n        let j = 1;\n        for (let i = 1; i < descriptions.length; i++) {\n          if (descriptions[i - 1] !== descriptions[i]) {\n            descriptions[j] = descriptions[i];\n            j++;\n          }\n        }\n        descriptions.length = j;\n      }\n\n      switch (descriptions.length) {\n        case 1:\n          return descriptions[0];\n\n        case 2:\n          return descriptions[0] + \" or \" + descriptions[1];\n\n        default:\n          return descriptions.slice(0, -1).join(\", \")\n            + \", or \"\n            + descriptions[descriptions.length - 1];\n      }\n    }\n\n    function describeFound(found) {\n      return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n    }\n\n    return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n  }\n}\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  const peg$FAILED = {};\n  const peg$source = options.grammarSource;\n\n  const peg$startRuleFunctions = {\n    version: peg$parseversion,\n    bitmarkPlusPlus: peg$parsebitmarkPlusPlus,\n    bitmarkPlus: peg$parsebitmarkPlus,\n    bitmarkMinusMinus: peg$parsebitmarkMinusMinus,\n    bitmarkPlusString: peg$parsebitmarkPlusString,\n    bitmarkMinusMinusString: peg$parsebitmarkMinusMinusString,\n  };\n  let peg$startRuleFunction = peg$parseversion;\n\n  const peg$c0 = \"|\";\n  const peg$c1 = \"### \";\n  const peg$c2 = \"## \";\n  const peg$c3 = \"# \";\n  const peg$c4 = \"code\";\n  const peg$c5 = \":\";\n  const peg$c6 = \"bitmark++\";\n  const peg$c7 = \"bitmark--\";\n  const peg$c8 = \"JavaScript\";\n  const peg$c9 = \"\\u2022 \";\n  const peg$c10 = \"\\u2022_ \";\n  const peg$c11 = \"\\u2022\";\n  const peg$c12 = \" \";\n  const peg$c13 = \"I \";\n  const peg$c14 = \"i \";\n  const peg$c15 = \"\\u2022A \";\n  const peg$c16 = \"\\u2022a \";\n  const peg$c17 = \"\\u2022+ \";\n  const peg$c18 = \"\\u2022- \";\n  const peg$c19 = \"\\t\";\n  const peg$c20 = \"image\";\n  const peg$c21 = \"#\";\n  const peg$c22 = \"@\";\n  const peg$c23 = \"width\";\n  const peg$c24 = \"height\";\n  const peg$c25 = \"alignment\";\n  const peg$c26 = \"captionAlign\";\n  const peg$c27 = \"left\";\n  const peg$c28 = \"center\";\n  const peg$c29 = \"right\";\n  const peg$c30 = \"alt\";\n  const peg$c31 = \"caption\";\n  const peg$c32 = \"zoomDisabled\";\n  const peg$c33 = \"true\";\n  const peg$c34 = \"false\";\n  const peg$c35 = \"=\";\n  const peg$c36 = \"|latex|\";\n  const peg$c37 = \"|imageInline:\";\n  const peg$c38 = \"srcAlt\";\n  const peg$c39 = \"alignmentVertical\";\n  const peg$c40 = \"size\";\n  const peg$c41 = \"top\";\n  const peg$c42 = \"middle\";\n  const peg$c43 = \"bottom\";\n  const peg$c44 = \"baseline\";\n  const peg$c45 = \"sub\";\n  const peg$c46 = \"super\";\n  const peg$c47 = \"text-bottom\";\n  const peg$c48 = \"text-top\";\n  const peg$c49 = \"line-height\";\n  const peg$c50 = \"font-height\";\n  const peg$c51 = \"explicit\";\n  const peg$c52 = \"link:\";\n  const peg$c53 = \"extref:\";\n  const peg$c54 = \"provider:\";\n  const peg$c55 = \"xref:\";\n  const peg$c56 = \"\\u25BA\";\n  const peg$c57 = \"symbol:\";\n  const peg$c58 = \"footnote:\";\n  const peg$c59 = \"footnote*:\";\n  const peg$c60 = \"var:\";\n  const peg$c61 = \"code:\";\n  const peg$c62 = \"timer\";\n  const peg$c63 = \"timer:\";\n  const peg$c64 = \"duration:\";\n  const peg$c65 = \"P\";\n  const peg$c66 = \"color:\";\n  const peg$c67 = \"colorPicker:\";\n  const peg$c68 = \"|\\u25BA\";\n  const peg$c69 = \"bold\";\n  const peg$c70 = \"italic\";\n  const peg$c71 = \"light\";\n  const peg$c72 = \"highlightOrange\";\n  const peg$c73 = \"highlightYellow\";\n  const peg$c74 = \"highlightGreen\";\n  const peg$c75 = \"highlightBlue\";\n  const peg$c76 = \"highlightPurple\";\n  const peg$c77 = \"highlightPink\";\n  const peg$c78 = \"highlightBrown\";\n  const peg$c79 = \"highlightBlack\";\n  const peg$c80 = \"highlightWhite\";\n  const peg$c81 = \"highlightGray\";\n  const peg$c82 = \"highlight\";\n  const peg$c83 = \"strike\";\n  const peg$c84 = \"subscript\";\n  const peg$c85 = \"superscript\";\n  const peg$c86 = \"ins\";\n  const peg$c87 = \"del\";\n  const peg$c88 = \"underline\";\n  const peg$c89 = \"doubleUnderline\";\n  const peg$c90 = \"circle\";\n  const peg$c91 = \"languageEmRed\";\n  const peg$c92 = \"languageEmOrange\";\n  const peg$c93 = \"languageEmYellow\";\n  const peg$c94 = \"languageEmGreen\";\n  const peg$c95 = \"languageEmBlue\";\n  const peg$c96 = \"languageEmPurple\";\n  const peg$c97 = \"languageEmPink\";\n  const peg$c98 = \"languageEmBrown\";\n  const peg$c99 = \"languageEmBlack\";\n  const peg$c100 = \"languageEmWhite\";\n  const peg$c101 = \"languageEmGray\";\n  const peg$c102 = \"languageEm\";\n  const peg$c103 = \"userUnderline\";\n  const peg$c104 = \"userDoubleUnderline\";\n  const peg$c105 = \"userStrike\";\n  const peg$c106 = \"userCircle\";\n  const peg$c107 = \"userHighlight\";\n  const peg$c108 = \"notranslate\";\n  const peg$c109 = \"aqua\";\n  const peg$c110 = \"black\";\n  const peg$c111 = \"blue\";\n  const peg$c112 = \"brown\";\n  const peg$c113 = \"fuchsia\";\n  const peg$c114 = \"lightgrey\";\n  const peg$c115 = \"gray\";\n  const peg$c116 = \"darkgray\";\n  const peg$c117 = \"green\";\n  const peg$c118 = \"lime\";\n  const peg$c119 = \"magenta\";\n  const peg$c120 = \"maroon\";\n  const peg$c121 = \"navy\";\n  const peg$c122 = \"olive\";\n  const peg$c123 = \"orange\";\n  const peg$c124 = \"pink\";\n  const peg$c125 = \"purple\";\n  const peg$c126 = \"red\";\n  const peg$c127 = \"silver\";\n  const peg$c128 = \"teal\";\n  const peg$c129 = \"violet\";\n  const peg$c130 = \"white\";\n  const peg$c131 = \"yellow\";\n  const peg$c132 = \"*\";\n  const peg$c133 = \"_\";\n  const peg$c134 = \"`\";\n  const peg$c135 = \"!\";\n  const peg$c136 = \"[!\";\n  const peg$c137 = \"]\";\n  const peg$c138 = \"\\n\";\n  const peg$c139 = \"\\r\\n\";\n  const peg$c140 = \"http\";\n  const peg$c141 = \"s\";\n  const peg$c142 = \"://\";\n  const peg$c143 = \"mailto:\";\n\n  const peg$r0 = /^[ \\t]/;\n  const peg$r1 = /^[0-9]/;\n  const peg$r2 = /^[\\r\\u2028-\\u2029]/;\n  const peg$r3 = /^[^\\n\\r\\u2028\\u2029]/;\n  const peg$r4 = /^[!#-;=?-[\\]-_a-{}-~]/;\n\n  const peg$e0 = peg$anyExpectation();\n  const peg$e1 = peg$otherExpectation(\"StyledText\");\n  const peg$e2 = peg$literalExpectation(\"|\", false);\n  const peg$e3 = peg$literalExpectation(\"### \", false);\n  const peg$e4 = peg$literalExpectation(\"## \", false);\n  const peg$e5 = peg$literalExpectation(\"# \", false);\n  const peg$e6 = peg$literalExpectation(\"code\", false);\n  const peg$e7 = peg$classExpectation([\" \", \"\\t\"], false, false, false);\n  const peg$e8 = peg$literalExpectation(\":\", false);\n  const peg$e9 = peg$literalExpectation(\"bitmark++\", false);\n  const peg$e10 = peg$literalExpectation(\"bitmark--\", false);\n  const peg$e11 = peg$literalExpectation(\"JavaScript\", false);\n  const peg$e12 = peg$literalExpectation(\"\\u2022 \", false);\n  const peg$e13 = peg$literalExpectation(\"\\u2022_ \", false);\n  const peg$e14 = peg$literalExpectation(\"\\u2022\", false);\n  const peg$e15 = peg$classExpectation([[\"0\", \"9\"]], false, false, false);\n  const peg$e16 = peg$literalExpectation(\" \", false);\n  const peg$e17 = peg$literalExpectation(\"I \", false);\n  const peg$e18 = peg$literalExpectation(\"i \", false);\n  const peg$e19 = peg$literalExpectation(\"\\u2022A \", false);\n  const peg$e20 = peg$literalExpectation(\"\\u2022a \", false);\n  const peg$e21 = peg$literalExpectation(\"\\u2022+ \", false);\n  const peg$e22 = peg$literalExpectation(\"\\u2022- \", false);\n  const peg$e23 = peg$literalExpectation(\"\\t\", false);\n  const peg$e24 = peg$literalExpectation(\"image\", false);\n  const peg$e25 = peg$literalExpectation(\"#\", false);\n  const peg$e26 = peg$literalExpectation(\"@\", false);\n  const peg$e27 = peg$literalExpectation(\"width\", false);\n  const peg$e28 = peg$literalExpectation(\"height\", false);\n  const peg$e29 = peg$literalExpectation(\"alignment\", false);\n  const peg$e30 = peg$literalExpectation(\"captionAlign\", false);\n  const peg$e31 = peg$literalExpectation(\"left\", false);\n  const peg$e32 = peg$literalExpectation(\"center\", false);\n  const peg$e33 = peg$literalExpectation(\"right\", false);\n  const peg$e34 = peg$literalExpectation(\"alt\", false);\n  const peg$e35 = peg$literalExpectation(\"caption\", false);\n  const peg$e36 = peg$literalExpectation(\"zoomDisabled\", false);\n  const peg$e37 = peg$literalExpectation(\"true\", false);\n  const peg$e38 = peg$literalExpectation(\"false\", false);\n  const peg$e39 = peg$literalExpectation(\"=\", false);\n  const peg$e40 = peg$literalExpectation(\"|latex|\", false);\n  const peg$e41 = peg$literalExpectation(\"|imageInline:\", false);\n  const peg$e42 = peg$literalExpectation(\"srcAlt\", false);\n  const peg$e43 = peg$literalExpectation(\"alignmentVertical\", false);\n  const peg$e44 = peg$literalExpectation(\"size\", false);\n  const peg$e45 = peg$literalExpectation(\"top\", false);\n  const peg$e46 = peg$literalExpectation(\"middle\", false);\n  const peg$e47 = peg$literalExpectation(\"bottom\", false);\n  const peg$e48 = peg$literalExpectation(\"baseline\", false);\n  const peg$e49 = peg$literalExpectation(\"sub\", false);\n  const peg$e50 = peg$literalExpectation(\"super\", false);\n  const peg$e51 = peg$literalExpectation(\"text-bottom\", false);\n  const peg$e52 = peg$literalExpectation(\"text-top\", false);\n  const peg$e53 = peg$literalExpectation(\"line-height\", false);\n  const peg$e54 = peg$literalExpectation(\"font-height\", false);\n  const peg$e55 = peg$literalExpectation(\"explicit\", false);\n  const peg$e56 = peg$literalExpectation(\"link:\", false);\n  const peg$e57 = peg$literalExpectation(\"extref:\", false);\n  const peg$e58 = peg$literalExpectation(\"provider:\", false);\n  const peg$e59 = peg$literalExpectation(\"xref:\", false);\n  const peg$e60 = peg$literalExpectation(\"\\u25BA\", false);\n  const peg$e61 = peg$literalExpectation(\"symbol:\", false);\n  const peg$e62 = peg$literalExpectation(\"footnote:\", false);\n  const peg$e63 = peg$literalExpectation(\"footnote*:\", false);\n  const peg$e64 = peg$literalExpectation(\"var:\", false);\n  const peg$e65 = peg$literalExpectation(\"code:\", false);\n  const peg$e66 = peg$literalExpectation(\"timer\", false);\n  const peg$e67 = peg$literalExpectation(\"timer:\", false);\n  const peg$e68 = peg$literalExpectation(\"duration:\", false);\n  const peg$e69 = peg$literalExpectation(\"P\", false);\n  const peg$e70 = peg$literalExpectation(\"color:\", false);\n  const peg$e71 = peg$literalExpectation(\"colorPicker:\", false);\n  const peg$e72 = peg$literalExpectation(\"|\\u25BA\", false);\n  const peg$e73 = peg$literalExpectation(\"bold\", false);\n  const peg$e74 = peg$literalExpectation(\"italic\", false);\n  const peg$e75 = peg$literalExpectation(\"light\", false);\n  const peg$e76 = peg$literalExpectation(\"highlightOrange\", false);\n  const peg$e77 = peg$literalExpectation(\"highlightYellow\", false);\n  const peg$e78 = peg$literalExpectation(\"highlightGreen\", false);\n  const peg$e79 = peg$literalExpectation(\"highlightBlue\", false);\n  const peg$e80 = peg$literalExpectation(\"highlightPurple\", false);\n  const peg$e81 = peg$literalExpectation(\"highlightPink\", false);\n  const peg$e82 = peg$literalExpectation(\"highlightBrown\", false);\n  const peg$e83 = peg$literalExpectation(\"highlightBlack\", false);\n  const peg$e84 = peg$literalExpectation(\"highlightWhite\", false);\n  const peg$e85 = peg$literalExpectation(\"highlightGray\", false);\n  const peg$e86 = peg$literalExpectation(\"highlight\", false);\n  const peg$e87 = peg$literalExpectation(\"strike\", false);\n  const peg$e88 = peg$literalExpectation(\"subscript\", false);\n  const peg$e89 = peg$literalExpectation(\"superscript\", false);\n  const peg$e90 = peg$literalExpectation(\"ins\", false);\n  const peg$e91 = peg$literalExpectation(\"del\", false);\n  const peg$e92 = peg$literalExpectation(\"underline\", false);\n  const peg$e93 = peg$literalExpectation(\"doubleUnderline\", false);\n  const peg$e94 = peg$literalExpectation(\"circle\", false);\n  const peg$e95 = peg$literalExpectation(\"languageEmRed\", false);\n  const peg$e96 = peg$literalExpectation(\"languageEmOrange\", false);\n  const peg$e97 = peg$literalExpectation(\"languageEmYellow\", false);\n  const peg$e98 = peg$literalExpectation(\"languageEmGreen\", false);\n  const peg$e99 = peg$literalExpectation(\"languageEmBlue\", false);\n  const peg$e100 = peg$literalExpectation(\"languageEmPurple\", false);\n  const peg$e101 = peg$literalExpectation(\"languageEmPink\", false);\n  const peg$e102 = peg$literalExpectation(\"languageEmBrown\", false);\n  const peg$e103 = peg$literalExpectation(\"languageEmBlack\", false);\n  const peg$e104 = peg$literalExpectation(\"languageEmWhite\", false);\n  const peg$e105 = peg$literalExpectation(\"languageEmGray\", false);\n  const peg$e106 = peg$literalExpectation(\"languageEm\", false);\n  const peg$e107 = peg$literalExpectation(\"userUnderline\", false);\n  const peg$e108 = peg$literalExpectation(\"userDoubleUnderline\", false);\n  const peg$e109 = peg$literalExpectation(\"userStrike\", false);\n  const peg$e110 = peg$literalExpectation(\"userCircle\", false);\n  const peg$e111 = peg$literalExpectation(\"userHighlight\", false);\n  const peg$e112 = peg$literalExpectation(\"notranslate\", false);\n  const peg$e113 = peg$literalExpectation(\"aqua\", false);\n  const peg$e114 = peg$literalExpectation(\"black\", false);\n  const peg$e115 = peg$literalExpectation(\"blue\", false);\n  const peg$e116 = peg$literalExpectation(\"brown\", false);\n  const peg$e117 = peg$literalExpectation(\"fuchsia\", false);\n  const peg$e118 = peg$literalExpectation(\"lightgrey\", false);\n  const peg$e119 = peg$literalExpectation(\"gray\", false);\n  const peg$e120 = peg$literalExpectation(\"darkgray\", false);\n  const peg$e121 = peg$literalExpectation(\"green\", false);\n  const peg$e122 = peg$literalExpectation(\"lime\", false);\n  const peg$e123 = peg$literalExpectation(\"magenta\", false);\n  const peg$e124 = peg$literalExpectation(\"maroon\", false);\n  const peg$e125 = peg$literalExpectation(\"navy\", false);\n  const peg$e126 = peg$literalExpectation(\"olive\", false);\n  const peg$e127 = peg$literalExpectation(\"orange\", false);\n  const peg$e128 = peg$literalExpectation(\"pink\", false);\n  const peg$e129 = peg$literalExpectation(\"purple\", false);\n  const peg$e130 = peg$literalExpectation(\"red\", false);\n  const peg$e131 = peg$literalExpectation(\"silver\", false);\n  const peg$e132 = peg$literalExpectation(\"teal\", false);\n  const peg$e133 = peg$literalExpectation(\"violet\", false);\n  const peg$e134 = peg$literalExpectation(\"white\", false);\n  const peg$e135 = peg$literalExpectation(\"yellow\", false);\n  const peg$e136 = peg$literalExpectation(\"*\", false);\n  const peg$e137 = peg$literalExpectation(\"_\", false);\n  const peg$e138 = peg$literalExpectation(\"`\", false);\n  const peg$e139 = peg$literalExpectation(\"!\", false);\n  const peg$e140 = peg$literalExpectation(\"[!\", false);\n  const peg$e141 = peg$literalExpectation(\"]\", false);\n  const peg$e142 = peg$otherExpectation(\"Line Terminator\");\n  const peg$e143 = peg$literalExpectation(\"\\n\", false);\n  const peg$e144 = peg$literalExpectation(\"\\r\\n\", false);\n  const peg$e145 = peg$classExpectation([\"\\r\", [\"\\u2028\", \"\\u2029\"]], false, false, false);\n  const peg$e146 = peg$classExpectation([\"\\n\", \"\\r\", \"\\u2028\", \"\\u2029\"], true, false, false);\n  const peg$e147 = peg$literalExpectation(\"http\", false);\n  const peg$e148 = peg$literalExpectation(\"s\", false);\n  const peg$e149 = peg$literalExpectation(\"://\", false);\n  const peg$e150 = peg$literalExpectation(\"mailto:\", false);\n  const peg$e151 = peg$classExpectation([\"!\", [\"#\", \";\"], \"=\", [\"?\", \"[\"], [\"]\", \"_\"], [\"a\", \"{\"], [\"}\", \"~\"]], false, false, false);\n\n  function peg$f0() {    return VERSION  }\n  function peg$f1(b) {    const cleaned_ = cleanEmptyTextNodes({ ...b }); return cleaned_  }\n  function peg$f2(b) {    let lb_ = { ...b }; removeTempParsingParent(lb_); const cleaned_ = cleanEmptyTextNodes(lb_); return cleaned_  }\n  function peg$f3(b) {    return { ...b }  }\n  function peg$f4(b) {    return { ...b }  }\n  function peg$f5(b) {    const cleaned_ = cleanEmptyTextNodes({ ...b }); return cleaned_  }\n  function peg$f6() {    return []  }\n  function peg$f7(h, t) {    return { type: \"heading\", content: bitmarkPlusString(t), attrs: { level: h.length - 1 } }  }\n  function peg$f8(t) {    return t  }\n  function peg$f9(h, b) {    return { ...h, content: b }  }\n  function peg$f10() {    return { type: \"codeBlock\", language: \"\" }  }\n  function peg$f11(l) {    return { type: \"codeBlock\", attrs: { language: l.trim().toLowerCase() } }  }\n  function peg$f12(c) {    return [{ type: \"text\", text: unbreakscape(c.trim())}]  }\n  function peg$f13(t) {    return t  }\n  function peg$f14(c, bl) {    return { ...c, content: bl, attrs: {} }  }\n  function peg$f15(c, bl) {    return { ...c, content: bl, attrs: {} }  }\n  function peg$f16(c, bl) {    let start = bl[0]._tempListStart; return { ...c, attrs: { start }, content: bl }  }\n  function peg$f17(c, bl) {    let start = bl[0]._tempListStart; return { ...c, attrs: { start }, content: bl }  }\n  function peg$f18(c, bl) {    let start = bl[0]._tempListStart; return { ...c, attrs: { start }, content: bl }  }\n  function peg$f19(c, bl) {    return { ...c, content: bl, attrs: {} }  }\n  function peg$f20(c, bl) {    return { ...c, content: bl, attrs: {} }  }\n  function peg$f21(c, bl) {    return { ...c, content: bl, attrs: {} }  }\n  function peg$f22() {    return { type: \"bulletList\" }  }\n  function peg$f23() {    return { type: \"noBulletList\" }  }\n  function peg$f24() {    return { type: \"orderedList\" }  }\n  function peg$f25() {    return { type: \"orderedListRoman\" }  }\n  function peg$f26() {    return { type: \"orderedListRomanLower\" }  }\n  function peg$f27() {    return { type: \"letteredList\" }  }\n  function peg$f28() {    return { type: \"letteredListLower\" }  }\n  function peg$f29() {    return { type: \"taskList\" }  }\n  function peg$f30(lt, listItem, lines, c) {    return c  }\n  function peg$f31(lt, listItem, lines, children) {\n\n    let _tempParsingParent = 'bulletList'\n\n    const matchOrdered = lt.match(/•([0-9]+)([Ii]?) /)\n\n    let start = 1\n\n    if (matchOrdered) {\n      _tempParsingParent = 'orderedList'\n      if (matchOrdered.length > 1) {\n          start = Number(matchOrdered[1])\n      }\n\n      if (matchOrdered.length > 2) {\n          let roman = matchOrdered[2]\n\t\t\tif ('I' == roman) {\n\t\t\t\t_tempParsingParent = 'orderedListRoman'\n\t\t\t}\n\t\t\tif ('i' == roman) {\n\t\t\t\t_tempParsingParent = 'orderedListRomanLower'\n\t\t\t}\n      }\n    }\n\n    if ('•_ ' == lt) {\n      _tempParsingParent = 'noBulletList'\n    }\n    if ('•A ' == lt) {\n      _tempParsingParent = 'letteredList'\n    }\n\t  if ('•a ' == lt) {\n      _tempParsingParent = 'letteredListLower'\n    }\n    if ('•+ ' == lt || '•- ' == lt ) {\n      _tempParsingParent = 'taskList'\n    }\n\n\t  let li = (listItem + lines.join(\"\")).trim()\n\n    let item = {\n    \ttype: \"paragraph\",\n\t\t    attrs: {},\n\t\t    content: bitmarkPlusString(li)\n    }\n\n\t  let content = [item]\n\n    if (children && children[0] && children[0]._tempParsingParent) {\n\n      let sublist = {\n        type: children[0]._tempParsingParent,\n        attrs: { start },\n        content: children\n      }\n\n      if (sublist.type.startsWith(\"orderedList\") || sublist.type.startsWith(\"letteredList\")) {\n\t      \tif (children[0]._tempListStart) {\n          \tconst start = children[0]._tempListStart\n\t\t\t\tif (start > 1) sublist.attrs.start = start\n          }\n      }\n\n      content.push(sublist)\n    }\n\n    let t = \"listItem\"\n    let attrs = null\n\n     if (\"taskList\" == _tempParsingParent) {\n      t = \"taskItem\"\n      let checked = false\n      if ('•+ ' == lt) {\n        checked = true\n      }\n      attrs = { checked }\n    }\n\n    const _tempListStart = start\n\n    if (attrs) {\n          return { type: t, attrs, content, _tempParsingParent, _tempListStart }\n    } else {\n          return { type: t, content, _tempParsingParent, _tempListStart }\n    }\n  }\n  function peg$f32(ll) {    return ll  }\n  function peg$f33(i) {    return i.join(\"\") === indent  }\n  function peg$f34(i) {    return i.length > indent.length  }\n  function peg$f35(i) {    indentStack.push(indent); indent = i.join(\"\")  }\n  function peg$f36() {    indent = indentStack.pop(); return true  }\n  function peg$f37(body) {    return { type: \"paragraph\", content: bitmarkPlusString(body.trim()), attrs: { } }  }\n  function peg$f38(body) {    return { type: \"paragraph\", content: bitmarkPlusString(body.trim()), attrs: { } }  }\n  function peg$f39(body) {    return { type: \"paragraph\", content: bitmarkPlusString(body.trim()), attrs: { } }  }\n  function peg$f40(t) {    return t  }\n  function peg$f41(t, u, ch) {\n\n    const chain = Object.assign({}, ...ch)\n\n    let imageAlignment_ = chain.alignment || \"center\"; delete chain.alignment\n    let textAlign_ = chain.captionAlign || \"left\"; delete chain.captionAlign\n    let alt_ = chain.alt || null; delete chain.alt\n    let title_ = chain.caption || null; delete chain.caption\n    let class_ = chain.align || \"center\"; delete chain.align\n    let zoomDisabled_ = chain.zoomDisabled === undefined ? true\n    \t: typeof chain.zoomDisabled === 'boolean' ? chain.zoomDisabled\n    \t: String(chain.zoomDisabled).toLowerCase() === 'true'; delete chain.zoomDisabled\n\n    let image = {\n      type: t,\n      attrs: {\n        alignment: imageAlignment_,\n        textAlign: textAlign_,\n        src: u,\n        alt: unbreakscape(alt_),\n        title: unbreakscape(title_),\n        class: class_,\n        zoomDisabled: zoomDisabled_,\n        ...chain\n      }\n    }\n\n    return image\n  }\n  function peg$f42(ch) {    return ch  }\n  function peg$f43(str) {return { comment: str.trim() }  }\n  function peg$f44(p, v) {    return { [p]: parseInt(v) }  }\n  function peg$f45(p, v) {    return { [p]: v.trim() }  }\n  function peg$f46(p, v) {    return { [p]: v }  }\n  function peg$f47(p, v) {    return { [p]: v }  }\n  function peg$f48(p) {    return { [p]: true }  }\n  function peg$f49() {    return  }\n  function peg$f50(p) {    return { error: 'Found unknown property or invalid value: '+ p }  }\n  function peg$f51(bs) {    return [ { type: 'paragraph', content: bs, attrs: { } } ]  }\n  function peg$f52(first, more) {    const cleaned_ = cleanEmptyTextNodes(first ? [first, ...more.flat()] : more.flat()); return cleaned_  }\n  function peg$f53() {    return { \"type\": \"hardBreak\" }  }\n  function peg$f54(t) {    return { text: unbreakscape(t), type: \"text\" }  }\n  function peg$f55(t) {    return { index: +t, type: \"bit\" }  }\n  function peg$f56(t) {    return { attrs: { formula: unbreakscape(t)}, type: \"latex\" }  }\n  function peg$f57(alt, u, ch) {    return { attrs: { alt, src: (u.pr + u.t).trim(), ...Object.assign({}, ...ch), zoomDisabled: true }, type: \"imageInline\" }  }\n  function peg$f58(t, marks) {    if (!marks) marks = []; return { marks, text: unbreakscape(t), type: \"text\" }  }\n  function peg$f59(t) {    return { marks: [{type: \"bold\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f60(t) {    return { marks: [{type: \"italic\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f61(t) {    return { marks: [{type: \"light\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f62(t) {    return { marks: [{type: \"highlight\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f63(u) {    return { marks: [{ type: \"link\", attrs: { href: (u.pr + u.t).trim(), target: '_blank' } }], text: u.t, type: \"text\" }  }\n  function peg$f64(ch) {    return ch  }\n  function peg$f65(ch) {    return ch  }\n  function peg$f66(str) {return { comment: str }  }\n  function peg$f67(p, v) {return { [p]: v }  }\n  function peg$f68(p, v) {    return { [p]: parseInt(v) }  }\n  function peg$f69(p, v) {    return { type: \"error\", msg: p + ' must be a positive integer.', found: v }  }\n  function peg$f70(p, v) {    return { [p]: v }  }\n  function peg$f71(p, v) {    return { [p]: v }  }\n  function peg$f72(str) {return { type: 'link', attrs: { href: str.trim(), target: '_blank' } }  }\n  function peg$f73(str, rc, p) {return { type: 'extref', attrs: { extref: str.trim(), references: rc, provider: p.trim() } }  }\n  function peg$f74(str, str2) {return { type: 'xref', attrs: { xref: str.trim(), reference: str2.trim() } }  }\n  function peg$f75(str) {return { type: 'xref', attrs: { xref: str.trim(), reference: '' } }  }\n  function peg$f76(str) {return { type: 'ref', attrs: { reference: str.trim() } }  }\n  function peg$f77(str, ch) {const chain = Object.assign({}, ...ch); return { type: 'symbol', attrs: { src: str.trim(), ...chain } }  }\n  function peg$f78(str) {return { type: 'footnote', attrs: { content: bitmarkPlusString(str.trim()) } }  }\n  function peg$f79(str) {return { type: 'footnote*', attrs: { content: bitmarkPlusString(str.trim()) } }  }\n  function peg$f80(str) {return { type: 'var', attrs: { name: str.trim() } }  }\n  function peg$f81() {return { type: 'code', attrs: { language: \"plain text\" } }  }\n  function peg$f82(lang) {return { type: 'code', attrs: { language: lang.trim().toLowerCase() } }  }\n  function peg$f83() {return { type: 'timer', attrs: { name: \"\" } }  }\n  function peg$f84(str) {return { type: 'timer', attrs: { name: str.trim() } }  }\n  function peg$f85(str) {return { type: 'duration', attrs: { duration: str } }  }\n  function peg$f86(color) {return { type: 'color', attrs: { color } }  }\n  function peg$f87(str) {return { type: 'colorPicker', attrs: { propertyRef: str.trim() } }  }\n  function peg$f88(style) {return { type: style }  }\n  function peg$f89(str) {return { type: \"comment\", comment: str }  }\n  function peg$f90(r) {    return r.trim()  }\n  function peg$f91(bs) {    return [ { type: 'paragraph', content: bs, attrs: { } } ]  }\n  function peg$f92(first, more) {    const cleaned_ = cleanEmptyTextNodes(first ? [first, ...more.flat()] : more.flat()); return cleaned_  }\n  function peg$f93() {    return { \"type\": \"hardBreak\" }  }\n  function peg$f94(t) {    return { text: unbreakscape(t), type: \"text\" }  }\n  function peg$f95(t) {    return { index: +t, type: \"bit\" }  }\n  function peg$f96(t) {    return { marks: [{type: \"bold\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f97(t) {    return { marks: [{type: \"italic\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f98(t) {    return { marks: [{type: \"light\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f99(t) {    return { marks: [{type: \"highlight\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f100(pr, t) {    return { pr, t}  }\n  let peg$currPos = options.peg$currPos | 0;\n  let peg$savedPos = peg$currPos;\n  const peg$posDetailsCache = [{ line: 1, column: 1 }];\n  let peg$maxFailPos = peg$currPos;\n  let peg$maxFailExpected = options.peg$maxFailExpected || [];\n  let peg$silentFails = options.peg$silentFails | 0;\n\n  let peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos,\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$getUnicode(pos = peg$currPos) {\n    const cp = input.codePointAt(pos);\n    if (cp === undefined) {\n      return \"\";\n    }\n    return String.fromCodePoint(cp);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text, ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase, unicode) {\n    return { type: \"class\", parts, inverted, ignoreCase, unicode };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description };\n  }\n\n  function peg$computePosDetails(pos) {\n    let details = peg$posDetailsCache[pos];\n    let p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column,\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    const startPosDetails = peg$computePosDetails(startPos);\n    const endPosDetails = peg$computePosDetails(endPos);\n\n    const res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column,\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column,\n      },\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseversion() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    if (input.length > peg$currPos) {\n      s2 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      if (input.length > peg$currPos) {\n        s2 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e0); }\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f0();\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parsebitmarkPlusPlus() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = [];\n    s1 = peg$parseBlock();\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = peg$parseBlock();\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseNoContent();\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlock() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseTitleBlock();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f1(s1);\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseListBlock();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f2(s1);\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseImageBlock();\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f3(s1);\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parseCodeBlock();\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$f4(s1);\n          }\n          s0 = s1;\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parseParagraph();\n            if (s1 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$f5(s1);\n            }\n            s0 = s1;\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlockStart() {\n    let s0;\n\n    s0 = peg$parseTitleTags();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseListTags();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseImageBlock();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseCodeHeader();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseExplicitParagraphHeader();\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlockTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 124) {\n      s0 = peg$c0;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoContent() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = '';\n    peg$savedPos = s0;\n    s1 = peg$f6();\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseTitleTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c1) {\n      s0 = peg$c1;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c2) {\n        s0 = peg$c2;\n        peg$currPos += 3;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c3) {\n          s0 = peg$c3;\n          peg$currPos += 2;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleBlock() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parseTitleTags();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$parsechar();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parsechar();\n      }\n      s2 = input.substring(s2, peg$currPos);\n      s3 = peg$parseEOL();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseNL();\n        if (s4 === peg$FAILED) {\n          s4 = null;\n        }\n        peg$savedPos = s0;\n        s0 = peg$f7(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeType() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c4) {\n      s0 = peg$c4;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBlockTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseCodeType();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f8(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeBlock() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseCodeHeader();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseCodeBody();\n      peg$savedPos = s0;\n      s0 = peg$f9(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeHeader() {\n    let s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseCodeTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r0.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n      }\n      s5 = peg$parseEOL();\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f10();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseCodeTag();\n      if (s1 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s2 = peg$c5;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parseCodeLanguage();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            s6 = [];\n            s7 = input.charAt(peg$currPos);\n            if (peg$r0.test(s7)) {\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = input.charAt(peg$currPos);\n              if (peg$r0.test(s7)) {\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e7); }\n              }\n            }\n            s7 = peg$parseEOL();\n            if (s7 !== peg$FAILED) {\n              s6 = [s6, s7];\n              s5 = s6;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              s4 = input.substring(s4, peg$currPos);\n            } else {\n              s4 = s5;\n            }\n            if (s4 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f11(s3);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeLanguage() {\n    let s0, s1, s2;\n\n    if (input.substr(peg$currPos, 9) === peg$c6) {\n      s0 = peg$c6;\n      peg$currPos += 9;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 9) === peg$c7) {\n        s0 = peg$c7;\n        peg$currPos += 9;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 10) === peg$c8) {\n          s0 = peg$c8;\n          peg$currPos += 10;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = [];\n          s2 = peg$parsechar();\n          if (s2 !== peg$FAILED) {\n            while (s2 !== peg$FAILED) {\n              s1.push(s2);\n              s2 = peg$parsechar();\n            }\n          } else {\n            s1 = peg$FAILED;\n          }\n          if (s1 !== peg$FAILED) {\n            s0 = input.substring(s0, peg$currPos);\n          } else {\n            s0 = s1;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = '';\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeBody() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = peg$parseCodeLine();\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = peg$parseCodeLine();\n    }\n    s1 = input.substring(s1, peg$currPos);\n    peg$savedPos = s0;\n    s1 = peg$f12(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCodeLine() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseBlockStart();\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = peg$parsechar();\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parsechar();\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseEOL();\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f13(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseNL();\n    }\n\n    return s0;\n  }\n\n  function peg$parseBulletListTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c9) {\n      s0 = peg$c9;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoBulletListTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c10) {\n      s0 = peg$c10;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseOrderedListTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 8226) {\n      s2 = peg$c11;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r1.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 32) {\n          s4 = peg$c12;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n        if (s4 !== peg$FAILED) {\n          s2 = [s2, s3, s4];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseOrderedListRomanTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 8226) {\n      s2 = peg$c11;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r1.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c13) {\n          s4 = peg$c13;\n          peg$currPos += 2;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n        if (s4 !== peg$FAILED) {\n          s2 = [s2, s3, s4];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseOrderedListRomanLowerTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 8226) {\n      s2 = peg$c11;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r1.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c14) {\n          s4 = peg$c14;\n          peg$currPos += 2;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n        if (s4 !== peg$FAILED) {\n          s2 = [s2, s3, s4];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLetteredListTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c15) {\n      s0 = peg$c15;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLetteredListLowerTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c16) {\n      s0 = peg$c16;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTaskListTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c17) {\n      s0 = peg$c17;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c18) {\n        s0 = peg$c18;\n        peg$currPos += 3;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e22); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseListTags() {\n    let s0;\n\n    s0 = peg$parseBulletListTag();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseNoBulletListTag();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseOrderedListTag();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseOrderedListRomanTag();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseOrderedListRomanLowerTag();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseLetteredListTag();\n              if (s0 === peg$FAILED) {\n                s0 = peg$parseLetteredListLowerTag();\n                if (s0 === peg$FAILED) {\n                  s0 = peg$parseTaskListTag();\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseListBlock() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBulletListContainer();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$parseBulletListLine();\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parseBulletListLine();\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseNL();\n        if (s3 === peg$FAILED) {\n          s3 = null;\n        }\n        peg$savedPos = s0;\n        s0 = peg$f14(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseNoBulletListContainer();\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parseBulletListLine();\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = peg$parseBulletListLine();\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parseNL();\n          if (s3 === peg$FAILED) {\n            s3 = null;\n          }\n          peg$savedPos = s0;\n          s0 = peg$f15(s1, s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseOrderedListContainer();\n        if (s1 !== peg$FAILED) {\n          s2 = [];\n          s3 = peg$parseBulletListLine();\n          if (s3 !== peg$FAILED) {\n            while (s3 !== peg$FAILED) {\n              s2.push(s3);\n              s3 = peg$parseBulletListLine();\n            }\n          } else {\n            s2 = peg$FAILED;\n          }\n          if (s2 !== peg$FAILED) {\n            s3 = peg$parseNL();\n            if (s3 === peg$FAILED) {\n              s3 = null;\n            }\n            peg$savedPos = s0;\n            s0 = peg$f16(s1, s2);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parseOrderedListRomanContainer();\n          if (s1 !== peg$FAILED) {\n            s2 = [];\n            s3 = peg$parseBulletListLine();\n            if (s3 !== peg$FAILED) {\n              while (s3 !== peg$FAILED) {\n                s2.push(s3);\n                s3 = peg$parseBulletListLine();\n              }\n            } else {\n              s2 = peg$FAILED;\n            }\n            if (s2 !== peg$FAILED) {\n              s3 = peg$parseNL();\n              if (s3 === peg$FAILED) {\n                s3 = null;\n              }\n              peg$savedPos = s0;\n              s0 = peg$f17(s1, s2);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parseOrderedListRomanLowerContainer();\n            if (s1 !== peg$FAILED) {\n              s2 = [];\n              s3 = peg$parseBulletListLine();\n              if (s3 !== peg$FAILED) {\n                while (s3 !== peg$FAILED) {\n                  s2.push(s3);\n                  s3 = peg$parseBulletListLine();\n                }\n              } else {\n                s2 = peg$FAILED;\n              }\n              if (s2 !== peg$FAILED) {\n                s3 = peg$parseNL();\n                if (s3 === peg$FAILED) {\n                  s3 = null;\n                }\n                peg$savedPos = s0;\n                s0 = peg$f18(s1, s2);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              s1 = peg$parseLetteredListContainer();\n              if (s1 !== peg$FAILED) {\n                s2 = [];\n                s3 = peg$parseBulletListLine();\n                if (s3 !== peg$FAILED) {\n                  while (s3 !== peg$FAILED) {\n                    s2.push(s3);\n                    s3 = peg$parseBulletListLine();\n                  }\n                } else {\n                  s2 = peg$FAILED;\n                }\n                if (s2 !== peg$FAILED) {\n                  s3 = peg$parseNL();\n                  if (s3 === peg$FAILED) {\n                    s3 = null;\n                  }\n                  peg$savedPos = s0;\n                  s0 = peg$f19(s1, s2);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                s1 = peg$parseLetteredListLowerContainer();\n                if (s1 !== peg$FAILED) {\n                  s2 = [];\n                  s3 = peg$parseBulletListLine();\n                  if (s3 !== peg$FAILED) {\n                    while (s3 !== peg$FAILED) {\n                      s2.push(s3);\n                      s3 = peg$parseBulletListLine();\n                    }\n                  } else {\n                    s2 = peg$FAILED;\n                  }\n                  if (s2 !== peg$FAILED) {\n                    s3 = peg$parseNL();\n                    if (s3 === peg$FAILED) {\n                      s3 = null;\n                    }\n                    peg$savedPos = s0;\n                    s0 = peg$f20(s1, s2);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  s1 = peg$parseTaskListContainer();\n                  if (s1 !== peg$FAILED) {\n                    s2 = [];\n                    s3 = peg$parseBulletListLine();\n                    if (s3 !== peg$FAILED) {\n                      while (s3 !== peg$FAILED) {\n                        s2.push(s3);\n                        s3 = peg$parseBulletListLine();\n                      }\n                    } else {\n                      s2 = peg$FAILED;\n                    }\n                    if (s2 !== peg$FAILED) {\n                      s3 = peg$parseNL();\n                      if (s3 === peg$FAILED) {\n                        s3 = null;\n                      }\n                      peg$savedPos = s0;\n                      s0 = peg$f21(s1, s2);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBulletListContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseBulletListTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f22();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseNoBulletListContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseNoBulletListTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f23();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseOrderedListContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseOrderedListTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f24();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseOrderedListRomanContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseOrderedListRomanTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f25();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseOrderedListRomanLowerContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseOrderedListRomanLowerTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f26();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseLetteredListContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseLetteredListTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f27();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseLetteredListLowerContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseLetteredListLowerTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f28();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseTaskListContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseTaskListTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f29();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBulletListLine() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parseSAMEDENT();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseListTags();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = peg$currPos;\n        s7 = peg$currPos;\n        peg$silentFails++;\n        s8 = peg$parseNL();\n        peg$silentFails--;\n        if (s8 === peg$FAILED) {\n          s7 = undefined;\n        } else {\n          peg$currPos = s7;\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          if (input.length > peg$currPos) {\n            s8 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$currPos;\n          s7 = peg$currPos;\n          peg$silentFails++;\n          s8 = peg$parseNL();\n          peg$silentFails--;\n          if (s8 === peg$FAILED) {\n            s7 = undefined;\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          if (s7 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s8 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        }\n        s6 = peg$parseNL();\n        if (s6 === peg$FAILED) {\n          s6 = null;\n        }\n        s5 = [s5, s6];\n        s4 = s5;\n        s3 = input.substring(s3, peg$currPos);\n        s4 = [];\n        s5 = peg$parseListLine();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parseListLine();\n        }\n        s5 = peg$currPos;\n        s6 = peg$parseINDENT();\n        if (s6 !== peg$FAILED) {\n          s7 = [];\n          s8 = peg$parseBulletListLine();\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = peg$parseBulletListLine();\n          }\n          s8 = peg$parseDEDENT();\n          if (s8 !== peg$FAILED) {\n            peg$savedPos = s5;\n            s5 = peg$f30(s2, s3, s4, s7);\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        peg$savedPos = s0;\n        s0 = peg$f31(s2, s3, s4, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseListLine() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseBlankLine();\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseSAMEDENT();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        peg$silentFails++;\n        s4 = peg$parseListTags();\n        peg$silentFails--;\n        if (s4 === peg$FAILED) {\n          s3 = undefined;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = peg$currPos;\n          s8 = peg$currPos;\n          peg$silentFails++;\n          s9 = peg$parseNL();\n          peg$silentFails--;\n          if (s9 === peg$FAILED) {\n            s8 = undefined;\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n          if (s8 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s9 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s9 !== peg$FAILED) {\n              s8 = [s8, s9];\n              s7 = s8;\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = peg$currPos;\n              s8 = peg$currPos;\n              peg$silentFails++;\n              s9 = peg$parseNL();\n              peg$silentFails--;\n              if (s9 === peg$FAILED) {\n                s8 = undefined;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 !== peg$FAILED) {\n                if (input.length > peg$currPos) {\n                  s9 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s9 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                }\n                if (s9 !== peg$FAILED) {\n                  s8 = [s8, s9];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parseEOL();\n            if (s7 !== peg$FAILED) {\n              s6 = [s6, s7];\n              s5 = s6;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s4 = input.substring(s4, peg$currPos);\n          } else {\n            s4 = s5;\n          }\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f32(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = input.charAt(peg$currPos);\n      if (peg$r0.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n    }\n    s2 = peg$parseNL();\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSAMEDENT() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    if (input.charCodeAt(peg$currPos) === 9) {\n      s2 = peg$c19;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      if (input.charCodeAt(peg$currPos) === 9) {\n        s2 = peg$c19;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e23); }\n      }\n    }\n    peg$savedPos = peg$currPos;\n    s2 = peg$f33(s1);\n    if (s2) {\n      s2 = undefined;\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseINDENT() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    peg$silentFails++;\n    s1 = peg$currPos;\n    s2 = [];\n    if (input.charCodeAt(peg$currPos) === 9) {\n      s3 = peg$c19;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        if (input.charCodeAt(peg$currPos) === 9) {\n          s3 = peg$c19;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e23); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      peg$savedPos = peg$currPos;\n      s3 = peg$f34(s2);\n      if (s3) {\n        s3 = undefined;\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s1;\n        s1 = peg$f35(s2);\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s1 !== peg$FAILED) {\n      peg$currPos = s0;\n      s0 = undefined;\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseDEDENT() {\n    let s0;\n\n    peg$savedPos = peg$currPos;\n    s0 = peg$f36();\n    if (s0) {\n      s0 = undefined;\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseParagraph() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseBlockStart();\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseParagraphBody();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f37(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseExplicitParagraphHeader();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseParagraphBody();\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f38(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseExplicitParagraphHeader();\n        if (s1 !== peg$FAILED) {\n          s2 = '';\n          peg$savedPos = s0;\n          s0 = peg$f39(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseParagraphBody() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseParagraphLine();\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parseParagraphLine();\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseParagraphLine() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseBlockStart();\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = peg$parsechar();\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parsechar();\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseEOL();\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseNL();\n    }\n\n    return s0;\n  }\n\n  function peg$parseExplicitParagraphHeader() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBlockTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r0.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n      }\n      s5 = peg$parseEOL();\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseNL();\n        if (s3 === peg$FAILED) {\n          s3 = null;\n        }\n        s1 = [s1, s2, s3];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseImageType() {\n    let s0;\n\n    if (input.substr(peg$currPos, 5) === peg$c20) {\n      s0 = peg$c20;\n      peg$currPos += 5;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseImageTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBlockTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseImageType();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f40(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseImageBlock() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parseImageTag();\n    if (s1 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s2 = peg$c5;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 32) {\n          s3 = peg$c12;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n        if (s3 === peg$FAILED) {\n          s3 = null;\n        }\n        s4 = peg$parseUrlHttp();\n        if (s4 !== peg$FAILED) {\n          s5 = [];\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s6 = peg$c12;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e16); }\n          }\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s6 = peg$c12;\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n          }\n          s6 = peg$parseBlockTag();\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parseMediaChain();\n            s8 = peg$currPos;\n            s9 = peg$currPos;\n            s10 = [];\n            s11 = input.charAt(peg$currPos);\n            if (peg$r0.test(s11)) {\n              peg$currPos++;\n            } else {\n              s11 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            while (s11 !== peg$FAILED) {\n              s10.push(s11);\n              s11 = input.charAt(peg$currPos);\n              if (peg$r0.test(s11)) {\n                peg$currPos++;\n              } else {\n                s11 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e7); }\n              }\n            }\n            s11 = peg$parseEOL();\n            if (s11 !== peg$FAILED) {\n              s10 = [s10, s11];\n              s9 = s10;\n            } else {\n              peg$currPos = s9;\n              s9 = peg$FAILED;\n            }\n            if (s9 !== peg$FAILED) {\n              s8 = input.substring(s8, peg$currPos);\n            } else {\n              s8 = s9;\n            }\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parseNL();\n              if (s9 === peg$FAILED) {\n                s9 = null;\n              }\n              peg$savedPos = s0;\n              s0 = peg$f41(s1, s4, s7);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaChain() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseMediaChainItem();\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseMediaChainItem();\n    }\n    peg$savedPos = s0;\n    s1 = peg$f42(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseMediaChainItem() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 35) {\n      s1 = peg$c21;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseBlockTag();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsechar();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      s3 = peg$parseBlockTag();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f43(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 64) {\n        s1 = peg$c22;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      if (s1 === peg$FAILED) {\n        s1 = null;\n      }\n      s2 = peg$parseMediaSizeTags();\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s3 = peg$c5;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = [];\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s5 = peg$c12;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e16); }\n          }\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s5 = peg$c12;\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n          }\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = peg$currPos;\n          s8 = peg$currPos;\n          peg$silentFails++;\n          s9 = peg$parseBlockTag();\n          peg$silentFails--;\n          if (s9 === peg$FAILED) {\n            s8 = undefined;\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n          if (s8 !== peg$FAILED) {\n            s9 = input.charAt(peg$currPos);\n            if (peg$r1.test(s9)) {\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e15); }\n            }\n            if (s9 !== peg$FAILED) {\n              s8 = [s8, s9];\n              s7 = s8;\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = peg$currPos;\n              s8 = peg$currPos;\n              peg$silentFails++;\n              s9 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s9 === peg$FAILED) {\n                s8 = undefined;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = input.charAt(peg$currPos);\n                if (peg$r1.test(s9)) {\n                  peg$currPos++;\n                } else {\n                  s9 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e15); }\n                }\n                if (s9 !== peg$FAILED) {\n                  s8 = [s8, s9];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = input.substring(s5, peg$currPos);\n          } else {\n            s5 = s6;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = [];\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s7 = peg$c12;\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              if (input.charCodeAt(peg$currPos) === 32) {\n                s7 = peg$c12;\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n            }\n            s7 = peg$parseBlockTag();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f44(s2, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 64) {\n          s1 = peg$c22;\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n        }\n        if (s1 === peg$FAILED) {\n          s1 = null;\n        }\n        s2 = peg$parseMediaTextTags();\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s3 = peg$c5;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e8); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = [];\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s5 = peg$c12;\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n            while (s5 !== peg$FAILED) {\n              s4.push(s5);\n              if (input.charCodeAt(peg$currPos) === 32) {\n                s5 = peg$c12;\n                peg$currPos++;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n            }\n            s5 = peg$currPos;\n            s6 = [];\n            s7 = peg$currPos;\n            s8 = peg$currPos;\n            peg$silentFails++;\n            s9 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s9 === peg$FAILED) {\n              s8 = undefined;\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parsechar();\n              if (s9 !== peg$FAILED) {\n                s8 = [s8, s9];\n                s7 = s8;\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = peg$currPos;\n              s8 = peg$currPos;\n              peg$silentFails++;\n              s9 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s9 === peg$FAILED) {\n                s8 = undefined;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parsechar();\n                if (s9 !== peg$FAILED) {\n                  s8 = [s8, s9];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            }\n            s5 = input.substring(s5, peg$currPos);\n            s6 = peg$parseBlockTag();\n            if (s6 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f45(s2, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.charCodeAt(peg$currPos) === 64) {\n            s1 = peg$c22;\n            peg$currPos++;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e26); }\n          }\n          if (s1 === peg$FAILED) {\n            s1 = null;\n          }\n          s2 = peg$parseMediaAlignmentTags();\n          if (s2 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 58) {\n              s3 = peg$c5;\n              peg$currPos++;\n            } else {\n              s3 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n            if (s3 !== peg$FAILED) {\n              s4 = [];\n              if (input.charCodeAt(peg$currPos) === 32) {\n                s5 = peg$c12;\n                peg$currPos++;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n              while (s5 !== peg$FAILED) {\n                s4.push(s5);\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s5 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n              }\n              s5 = peg$parseMediaAlignment();\n              if (s5 !== peg$FAILED) {\n                s6 = [];\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s7 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s7 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n                while (s7 !== peg$FAILED) {\n                  s6.push(s7);\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s7 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s7 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                }\n                s7 = peg$parseBlockTag();\n                if (s7 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f46(s2, s5);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.charCodeAt(peg$currPos) === 64) {\n              s1 = peg$c22;\n              peg$currPos++;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e26); }\n            }\n            if (s1 === peg$FAILED) {\n              s1 = null;\n            }\n            s2 = peg$parseMediaBooleanTags();\n            if (s2 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s3 = peg$c5;\n                peg$currPos++;\n              } else {\n                s3 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s3 !== peg$FAILED) {\n                s4 = [];\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s5 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n                while (s5 !== peg$FAILED) {\n                  s4.push(s5);\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s5 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s5 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                }\n                s5 = peg$parseBoolean();\n                if (s5 !== peg$FAILED) {\n                  s6 = [];\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s7 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s7 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                  while (s7 !== peg$FAILED) {\n                    s6.push(s7);\n                    if (input.charCodeAt(peg$currPos) === 32) {\n                      s7 = peg$c12;\n                      peg$currPos++;\n                    } else {\n                      s7 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                    }\n                  }\n                  s7 = peg$parseBlockTag();\n                  if (s7 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f47(s2, s5);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.charCodeAt(peg$currPos) === 64) {\n                s1 = peg$c22;\n                peg$currPos++;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e26); }\n              }\n              if (s1 === peg$FAILED) {\n                s1 = null;\n              }\n              s2 = peg$parseMediaBooleanTags();\n              if (s2 !== peg$FAILED) {\n                s3 = [];\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s4 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s4 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n                while (s4 !== peg$FAILED) {\n                  s3.push(s4);\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s4 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s4 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                }\n                s4 = peg$parseBlockTag();\n                if (s4 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f48(s2);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                if (input.charCodeAt(peg$currPos) === 64) {\n                  s1 = peg$c22;\n                  peg$currPos++;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e26); }\n                }\n                if (s1 === peg$FAILED) {\n                  s1 = null;\n                }\n                s2 = peg$parseBlockTag();\n                if (s2 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f49();\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  if (input.charCodeAt(peg$currPos) === 64) {\n                    s1 = peg$c22;\n                    peg$currPos++;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e26); }\n                  }\n                  if (s1 === peg$FAILED) {\n                    s1 = null;\n                  }\n                  s2 = peg$currPos;\n                  s3 = [];\n                  s4 = peg$currPos;\n                  s5 = peg$currPos;\n                  peg$silentFails++;\n                  s6 = peg$parseBlockTag();\n                  peg$silentFails--;\n                  if (s6 === peg$FAILED) {\n                    s5 = undefined;\n                  } else {\n                    peg$currPos = s5;\n                    s5 = peg$FAILED;\n                  }\n                  if (s5 !== peg$FAILED) {\n                    s6 = peg$parsechar();\n                    if (s6 !== peg$FAILED) {\n                      s5 = [s5, s6];\n                      s4 = s5;\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                  while (s4 !== peg$FAILED) {\n                    s3.push(s4);\n                    s4 = peg$currPos;\n                    s5 = peg$currPos;\n                    peg$silentFails++;\n                    s6 = peg$parseBlockTag();\n                    peg$silentFails--;\n                    if (s6 === peg$FAILED) {\n                      s5 = undefined;\n                    } else {\n                      peg$currPos = s5;\n                      s5 = peg$FAILED;\n                    }\n                    if (s5 !== peg$FAILED) {\n                      s6 = peg$parsechar();\n                      if (s6 !== peg$FAILED) {\n                        s5 = [s5, s6];\n                        s4 = s5;\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  }\n                  s2 = input.substring(s2, peg$currPos);\n                  s3 = peg$parseBlockTag();\n                  if (s3 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f50(s2);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaSizeTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 5) === peg$c23) {\n      s0 = peg$c23;\n      peg$currPos += 5;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e27); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c24) {\n        s0 = peg$c24;\n        peg$currPos += 6;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e28); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaAlignmentTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 9) === peg$c25) {\n      s0 = peg$c25;\n      peg$currPos += 9;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 12) === peg$c26) {\n        s0 = peg$c26;\n        peg$currPos += 12;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e30); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaAlignment() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c27) {\n      s0 = peg$c27;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c28) {\n        s0 = peg$c28;\n        peg$currPos += 6;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e32); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 5) === peg$c29) {\n          s0 = peg$c29;\n          peg$currPos += 5;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e33); }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaTextTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c30) {\n      s0 = peg$c30;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 7) === peg$c31) {\n        s0 = peg$c31;\n        peg$currPos += 7;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e35); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaBooleanTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 12) === peg$c32) {\n      s0 = peg$c32;\n      peg$currPos += 12;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e36); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBoolean() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c33) {\n      s0 = peg$c33;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e37); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 5) === peg$c34) {\n        s0 = peg$c34;\n        peg$currPos += 5;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e38); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parsebitmarkPlus() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = peg$currPos;\n    s1 = peg$parseInlineTags();\n    peg$savedPos = s0;\n    s1 = peg$f51(s1);\n    s0 = s1;\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parsebitmarkPlusString() {\n    let s0;\n\n    peg$silentFails++;\n    s0 = peg$parseInlineTags();\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parseInlineTags() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parseInlinePlainText();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = [];\n    s3 = peg$parseInlineStyledText();\n    if (s3 === peg$FAILED) {\n      s3 = peg$parseInlinePlainText();\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = peg$parseInlineStyledText();\n      if (s3 === peg$FAILED) {\n        s3 = peg$parseInlinePlainText();\n      }\n    }\n    peg$savedPos = s0;\n    s0 = peg$f52(s1, s2);\n\n    return s0;\n  }\n\n  function peg$parseInlinePlainText() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNL();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f53();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parseInlineTagTags();\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseInlineStyledText();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s4 = [s4, s5, s6];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = peg$parseInlineTagTags();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseInlineStyledText();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s4 = [s4, s5];\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parseInlineTagTags();\n          if (s4 === peg$FAILED) {\n            s4 = null;\n          }\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseInlineStyledText();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parsechar();\n            if (s6 !== peg$FAILED) {\n              s4 = [s4, s5, s6];\n              s3 = s4;\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n          if (s3 === peg$FAILED) {\n            s3 = peg$currPos;\n            s4 = peg$parseInlineTagTags();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseInlineStyledText();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                s4 = [s4, s5];\n                s3 = s4;\n              } else {\n                peg$currPos = s3;\n                s3 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = input.substring(s1, peg$currPos);\n      } else {\n        s1 = s2;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f54(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineHalfTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 61) {\n      s0 = peg$c35;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseInlineHalfTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseInlineHalfTag();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineStyledText() {\n    let s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBodyBitOpenTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r1.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseBodyBitCloseTag();\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f55(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseInlineTag();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseInlineTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          if (input.length > peg$currPos) {\n            s6 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseInlineTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        s2 = input.substring(s2, peg$currPos);\n        s3 = peg$parseInlineTag();\n        if (s3 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 7) === peg$c36) {\n            s4 = peg$c36;\n            peg$currPos += 7;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e40); }\n          }\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f56(s2);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseInlineTag();\n        if (s1 !== peg$FAILED) {\n          s2 = peg$currPos;\n          s3 = [];\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseInlineTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseInlineTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              if (input.length > peg$currPos) {\n                s6 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e0); }\n              }\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          }\n          s2 = input.substring(s2, peg$currPos);\n          s3 = peg$parseInlineTag();\n          if (s3 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 13) === peg$c37) {\n              s4 = peg$c37;\n              peg$currPos += 13;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e41); }\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parseUrl();\n              if (s5 !== peg$FAILED) {\n                if (input.charCodeAt(peg$currPos) === 124) {\n                  s6 = peg$c0;\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e2); }\n                }\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parseInlineMediaChain();\n                  peg$savedPos = s0;\n                  s0 = peg$f57(s2, s5, s7);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parseInlineTag();\n          if (s1 !== peg$FAILED) {\n            s2 = peg$currPos;\n            s3 = [];\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseInlineTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              if (input.length > peg$currPos) {\n                s6 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e0); }\n              }\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseInlineTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                if (input.length > peg$currPos) {\n                  s6 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                }\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            }\n            s2 = input.substring(s2, peg$currPos);\n            s3 = peg$parseInlineTag();\n            if (s3 !== peg$FAILED) {\n              s4 = peg$parseAttrChain();\n              if (s4 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f58(s2, s4);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parseBoldTag();\n            if (s1 !== peg$FAILED) {\n              s2 = peg$currPos;\n              s3 = [];\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseBoldTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                if (input.length > peg$currPos) {\n                  s6 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                }\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n              while (s4 !== peg$FAILED) {\n                s3.push(s4);\n                s4 = peg$currPos;\n                s5 = peg$currPos;\n                peg$silentFails++;\n                s6 = peg$parseBoldTag();\n                peg$silentFails--;\n                if (s6 === peg$FAILED) {\n                  s5 = undefined;\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n                if (s5 !== peg$FAILED) {\n                  if (input.length > peg$currPos) {\n                    s6 = input.charAt(peg$currPos);\n                    peg$currPos++;\n                  } else {\n                    s6 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                  }\n                  if (s6 !== peg$FAILED) {\n                    s5 = [s5, s6];\n                    s4 = s5;\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              }\n              s2 = input.substring(s2, peg$currPos);\n              s3 = peg$parseBoldTag();\n              if (s3 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f59(s2);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              s1 = peg$parseItalicTag();\n              if (s1 !== peg$FAILED) {\n                s2 = peg$currPos;\n                s3 = [];\n                s4 = peg$currPos;\n                s5 = peg$currPos;\n                peg$silentFails++;\n                s6 = peg$parseItalicTag();\n                peg$silentFails--;\n                if (s6 === peg$FAILED) {\n                  s5 = undefined;\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n                if (s5 !== peg$FAILED) {\n                  if (input.length > peg$currPos) {\n                    s6 = input.charAt(peg$currPos);\n                    peg$currPos++;\n                  } else {\n                    s6 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                  }\n                  if (s6 !== peg$FAILED) {\n                    s5 = [s5, s6];\n                    s4 = s5;\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n                while (s4 !== peg$FAILED) {\n                  s3.push(s4);\n                  s4 = peg$currPos;\n                  s5 = peg$currPos;\n                  peg$silentFails++;\n                  s6 = peg$parseItalicTag();\n                  peg$silentFails--;\n                  if (s6 === peg$FAILED) {\n                    s5 = undefined;\n                  } else {\n                    peg$currPos = s5;\n                    s5 = peg$FAILED;\n                  }\n                  if (s5 !== peg$FAILED) {\n                    if (input.length > peg$currPos) {\n                      s6 = input.charAt(peg$currPos);\n                      peg$currPos++;\n                    } else {\n                      s6 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                    }\n                    if (s6 !== peg$FAILED) {\n                      s5 = [s5, s6];\n                      s4 = s5;\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                }\n                s2 = input.substring(s2, peg$currPos);\n                s3 = peg$parseItalicTag();\n                if (s3 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f60(s2);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                s1 = peg$parseLightTag();\n                if (s1 !== peg$FAILED) {\n                  s2 = peg$currPos;\n                  s3 = [];\n                  s4 = peg$currPos;\n                  s5 = peg$currPos;\n                  peg$silentFails++;\n                  s6 = peg$parseLightTag();\n                  peg$silentFails--;\n                  if (s6 === peg$FAILED) {\n                    s5 = undefined;\n                  } else {\n                    peg$currPos = s5;\n                    s5 = peg$FAILED;\n                  }\n                  if (s5 !== peg$FAILED) {\n                    if (input.length > peg$currPos) {\n                      s6 = input.charAt(peg$currPos);\n                      peg$currPos++;\n                    } else {\n                      s6 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                    }\n                    if (s6 !== peg$FAILED) {\n                      s5 = [s5, s6];\n                      s4 = s5;\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                  while (s4 !== peg$FAILED) {\n                    s3.push(s4);\n                    s4 = peg$currPos;\n                    s5 = peg$currPos;\n                    peg$silentFails++;\n                    s6 = peg$parseLightTag();\n                    peg$silentFails--;\n                    if (s6 === peg$FAILED) {\n                      s5 = undefined;\n                    } else {\n                      peg$currPos = s5;\n                      s5 = peg$FAILED;\n                    }\n                    if (s5 !== peg$FAILED) {\n                      if (input.length > peg$currPos) {\n                        s6 = input.charAt(peg$currPos);\n                        peg$currPos++;\n                      } else {\n                        s6 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                      }\n                      if (s6 !== peg$FAILED) {\n                        s5 = [s5, s6];\n                        s4 = s5;\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  }\n                  s2 = input.substring(s2, peg$currPos);\n                  s3 = peg$parseLightTag();\n                  if (s3 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f61(s2);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  s1 = peg$parseHighlightTag();\n                  if (s1 !== peg$FAILED) {\n                    s2 = peg$currPos;\n                    s3 = [];\n                    s4 = peg$currPos;\n                    s5 = peg$currPos;\n                    peg$silentFails++;\n                    s6 = peg$parseHighlightTag();\n                    peg$silentFails--;\n                    if (s6 === peg$FAILED) {\n                      s5 = undefined;\n                    } else {\n                      peg$currPos = s5;\n                      s5 = peg$FAILED;\n                    }\n                    if (s5 !== peg$FAILED) {\n                      if (input.length > peg$currPos) {\n                        s6 = input.charAt(peg$currPos);\n                        peg$currPos++;\n                      } else {\n                        s6 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                      }\n                      if (s6 !== peg$FAILED) {\n                        s5 = [s5, s6];\n                        s4 = s5;\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                    while (s4 !== peg$FAILED) {\n                      s3.push(s4);\n                      s4 = peg$currPos;\n                      s5 = peg$currPos;\n                      peg$silentFails++;\n                      s6 = peg$parseHighlightTag();\n                      peg$silentFails--;\n                      if (s6 === peg$FAILED) {\n                        s5 = undefined;\n                      } else {\n                        peg$currPos = s5;\n                        s5 = peg$FAILED;\n                      }\n                      if (s5 !== peg$FAILED) {\n                        if (input.length > peg$currPos) {\n                          s6 = input.charAt(peg$currPos);\n                          peg$currPos++;\n                        } else {\n                          s6 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                        }\n                        if (s6 !== peg$FAILED) {\n                          s5 = [s5, s6];\n                          s4 = s5;\n                        } else {\n                          peg$currPos = s4;\n                          s4 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    }\n                    s2 = input.substring(s2, peg$currPos);\n                    s3 = peg$parseHighlightTag();\n                    if (s3 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s0 = peg$f62(s2);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$currPos;\n                    s1 = peg$parseUrl();\n                    if (s1 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$f63(s1);\n                    }\n                    s0 = s1;\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineTagTags() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseInlineTag();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseInlineHalfTag();\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$parseInlineHalfTag();\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = [s2, s3];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = peg$parseLightTag();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$parseLightHalfTag();\n        if (s4 !== peg$FAILED) {\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$parseLightHalfTag();\n          }\n        } else {\n          s3 = peg$FAILED;\n        }\n        if (s3 !== peg$FAILED) {\n          s2 = [s2, s3];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        s0 = input.substring(s0, peg$currPos);\n      } else {\n        s0 = s1;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$currPos;\n        s2 = peg$parseHighlightTag();\n        if (s2 !== peg$FAILED) {\n          s3 = [];\n          s4 = peg$parseHighlightHalfTag();\n          if (s4 !== peg$FAILED) {\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = peg$parseHighlightHalfTag();\n            }\n          } else {\n            s3 = peg$FAILED;\n          }\n          if (s3 !== peg$FAILED) {\n            s2 = [s2, s3];\n            s1 = s2;\n          } else {\n            peg$currPos = s1;\n            s1 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n        if (s1 !== peg$FAILED) {\n          s0 = input.substring(s0, peg$currPos);\n        } else {\n          s0 = s1;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrChain() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 124) {\n      s1 = peg$c0;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$parseAttrChainItem();\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parseAttrChainItem();\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f64(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineMediaChain() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseInlineMediaChainItem();\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseInlineMediaChainItem();\n    }\n    peg$savedPos = s0;\n    s1 = peg$f65(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseInlineMediaChainItem() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 35) {\n      s1 = peg$c21;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseBlockTag();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsechar();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      s3 = peg$parseBlockTag();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f66(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 64) {\n        s1 = peg$c22;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      if (s1 === peg$FAILED) {\n        s1 = null;\n      }\n      if (input.substr(peg$currPos, 6) === peg$c38) {\n        s2 = peg$c38;\n        peg$currPos += 6;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e42); }\n      }\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s3 = peg$c5;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = [];\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s5 = peg$c12;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e16); }\n          }\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s5 = peg$c12;\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n          }\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = peg$currPos;\n          s8 = peg$currPos;\n          peg$silentFails++;\n          s9 = peg$parseBlockTag();\n          peg$silentFails--;\n          if (s9 === peg$FAILED) {\n            s8 = undefined;\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parsechar();\n            if (s9 !== peg$FAILED) {\n              s8 = [s8, s9];\n              s7 = s8;\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = peg$currPos;\n            s8 = peg$currPos;\n            peg$silentFails++;\n            s9 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s9 === peg$FAILED) {\n              s8 = undefined;\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parsechar();\n              if (s9 !== peg$FAILED) {\n                s8 = [s8, s9];\n                s7 = s8;\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          }\n          s5 = input.substring(s5, peg$currPos);\n          s6 = peg$parseBlockTag();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f67(s2, s5);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 64) {\n          s1 = peg$c22;\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n        }\n        if (s1 === peg$FAILED) {\n          s1 = null;\n        }\n        s2 = peg$parseMediaSizeTags();\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s3 = peg$c5;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e8); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = [];\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s5 = peg$c12;\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n            while (s5 !== peg$FAILED) {\n              s4.push(s5);\n              if (input.charCodeAt(peg$currPos) === 32) {\n                s5 = peg$c12;\n                peg$currPos++;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n            }\n            s5 = peg$currPos;\n            s6 = [];\n            s7 = peg$currPos;\n            s8 = peg$currPos;\n            peg$silentFails++;\n            s9 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s9 === peg$FAILED) {\n              s8 = undefined;\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n            if (s8 !== peg$FAILED) {\n              s9 = input.charAt(peg$currPos);\n              if (peg$r1.test(s9)) {\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e15); }\n              }\n              if (s9 !== peg$FAILED) {\n                s8 = [s8, s9];\n                s7 = s8;\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n            if (s7 !== peg$FAILED) {\n              while (s7 !== peg$FAILED) {\n                s6.push(s7);\n                s7 = peg$currPos;\n                s8 = peg$currPos;\n                peg$silentFails++;\n                s9 = peg$parseBlockTag();\n                peg$silentFails--;\n                if (s9 === peg$FAILED) {\n                  s8 = undefined;\n                } else {\n                  peg$currPos = s8;\n                  s8 = peg$FAILED;\n                }\n                if (s8 !== peg$FAILED) {\n                  s9 = input.charAt(peg$currPos);\n                  if (peg$r1.test(s9)) {\n                    peg$currPos++;\n                  } else {\n                    s9 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e15); }\n                  }\n                  if (s9 !== peg$FAILED) {\n                    s8 = [s8, s9];\n                    s7 = s8;\n                  } else {\n                    peg$currPos = s7;\n                    s7 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              }\n            } else {\n              s6 = peg$FAILED;\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = input.substring(s5, peg$currPos);\n            } else {\n              s5 = s6;\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parseBlockTag();\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f68(s2, s5);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.charCodeAt(peg$currPos) === 64) {\n            s1 = peg$c22;\n            peg$currPos++;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e26); }\n          }\n          if (s1 === peg$FAILED) {\n            s1 = null;\n          }\n          s2 = peg$parseMediaSizeTags();\n          if (s2 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 58) {\n              s3 = peg$c5;\n              peg$currPos++;\n            } else {\n              s3 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n            if (s3 !== peg$FAILED) {\n              s4 = [];\n              if (input.charCodeAt(peg$currPos) === 32) {\n                s5 = peg$c12;\n                peg$currPos++;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n              while (s5 !== peg$FAILED) {\n                s4.push(s5);\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s5 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n              }\n              s5 = peg$currPos;\n              s6 = [];\n              s7 = peg$currPos;\n              s8 = peg$currPos;\n              peg$silentFails++;\n              s9 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s9 === peg$FAILED) {\n                s8 = undefined;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parsechar();\n                if (s9 !== peg$FAILED) {\n                  s8 = [s8, s9];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n              while (s7 !== peg$FAILED) {\n                s6.push(s7);\n                s7 = peg$currPos;\n                s8 = peg$currPos;\n                peg$silentFails++;\n                s9 = peg$parseBlockTag();\n                peg$silentFails--;\n                if (s9 === peg$FAILED) {\n                  s8 = undefined;\n                } else {\n                  peg$currPos = s8;\n                  s8 = peg$FAILED;\n                }\n                if (s8 !== peg$FAILED) {\n                  s9 = peg$parsechar();\n                  if (s9 !== peg$FAILED) {\n                    s8 = [s8, s9];\n                    s7 = s8;\n                  } else {\n                    peg$currPos = s7;\n                    s7 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              }\n              s5 = input.substring(s5, peg$currPos);\n              s6 = peg$parseBlockTag();\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f69(s2, s5);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.charCodeAt(peg$currPos) === 64) {\n              s1 = peg$c22;\n              peg$currPos++;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e26); }\n            }\n            if (s1 === peg$FAILED) {\n              s1 = null;\n            }\n            if (input.substr(peg$currPos, 17) === peg$c39) {\n              s2 = peg$c39;\n              peg$currPos += 17;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e43); }\n            }\n            if (s2 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s3 = peg$c5;\n                peg$currPos++;\n              } else {\n                s3 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s3 !== peg$FAILED) {\n                s4 = [];\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s5 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n                while (s5 !== peg$FAILED) {\n                  s4.push(s5);\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s5 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s5 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                }\n                s5 = peg$parseInlineMediaAlignment();\n                if (s5 !== peg$FAILED) {\n                  s6 = peg$parseBlockTag();\n                  if (s6 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f70(s2, s5);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.charCodeAt(peg$currPos) === 64) {\n                s1 = peg$c22;\n                peg$currPos++;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e26); }\n              }\n              if (s1 === peg$FAILED) {\n                s1 = null;\n              }\n              if (input.substr(peg$currPos, 4) === peg$c40) {\n                s2 = peg$c40;\n                peg$currPos += 4;\n              } else {\n                s2 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e44); }\n              }\n              if (s2 !== peg$FAILED) {\n                if (input.charCodeAt(peg$currPos) === 58) {\n                  s3 = peg$c5;\n                  peg$currPos++;\n                } else {\n                  s3 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e8); }\n                }\n                if (s3 !== peg$FAILED) {\n                  s4 = [];\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s5 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s5 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                  while (s5 !== peg$FAILED) {\n                    s4.push(s5);\n                    if (input.charCodeAt(peg$currPos) === 32) {\n                      s5 = peg$c12;\n                      peg$currPos++;\n                    } else {\n                      s5 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                    }\n                  }\n                  s5 = peg$parseInlineMediaSize();\n                  if (s5 !== peg$FAILED) {\n                    s6 = peg$parseBlockTag();\n                    if (s6 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s0 = peg$f71(s2, s5);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineMediaAlignment() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c41) {\n      s0 = peg$c41;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e45); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c42) {\n        s0 = peg$c42;\n        peg$currPos += 6;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e46); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 6) === peg$c43) {\n          s0 = peg$c43;\n          peg$currPos += 6;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e47); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 8) === peg$c44) {\n            s0 = peg$c44;\n            peg$currPos += 8;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e48); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 3) === peg$c45) {\n              s0 = peg$c45;\n              peg$currPos += 3;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e49); }\n            }\n            if (s0 === peg$FAILED) {\n              if (input.substr(peg$currPos, 5) === peg$c46) {\n                s0 = peg$c46;\n                peg$currPos += 5;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e50); }\n              }\n              if (s0 === peg$FAILED) {\n                if (input.substr(peg$currPos, 11) === peg$c47) {\n                  s0 = peg$c47;\n                  peg$currPos += 11;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e51); }\n                }\n                if (s0 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 8) === peg$c48) {\n                    s0 = peg$c48;\n                    peg$currPos += 8;\n                  } else {\n                    s0 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e52); }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineMediaSize() {\n    let s0;\n\n    if (input.substr(peg$currPos, 11) === peg$c49) {\n      s0 = peg$c49;\n      peg$currPos += 11;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e53); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 11) === peg$c50) {\n        s0 = peg$c50;\n        peg$currPos += 11;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e54); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 5) === peg$c46) {\n          s0 = peg$c46;\n          peg$currPos += 5;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e50); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 3) === peg$c45) {\n            s0 = peg$c45;\n            peg$currPos += 3;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e49); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 8) === peg$c51) {\n              s0 = peg$c51;\n              peg$currPos += 8;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e55); }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrChainItem() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c52) {\n      s1 = peg$c52;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e56); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseBlockTag();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsechar();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      s3 = peg$parseBlockTag();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f72(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 7) === peg$c53) {\n        s1 = peg$c53;\n        peg$currPos += 7;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e57); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsechar();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseBlockTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parsechar();\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        s2 = input.substring(s2, peg$currPos);\n        s3 = peg$parseRefsChain();\n        s4 = peg$parseBlockTag();\n        if (s4 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 9) === peg$c54) {\n            s5 = peg$c54;\n            peg$currPos += 9;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e58); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = peg$currPos;\n            s9 = peg$currPos;\n            peg$silentFails++;\n            s10 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s10 === peg$FAILED) {\n              s9 = undefined;\n            } else {\n              peg$currPos = s9;\n              s9 = peg$FAILED;\n            }\n            if (s9 !== peg$FAILED) {\n              s10 = peg$parsechar();\n              if (s10 !== peg$FAILED) {\n                s9 = [s9, s10];\n                s8 = s9;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = peg$currPos;\n              s9 = peg$currPos;\n              peg$silentFails++;\n              s10 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s10 === peg$FAILED) {\n                s9 = undefined;\n              } else {\n                peg$currPos = s9;\n                s9 = peg$FAILED;\n              }\n              if (s9 !== peg$FAILED) {\n                s10 = peg$parsechar();\n                if (s10 !== peg$FAILED) {\n                  s9 = [s9, s10];\n                  s8 = s9;\n                } else {\n                  peg$currPos = s8;\n                  s8 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseBlockTag();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f73(s2, s3, s6);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 5) === peg$c55) {\n          s1 = peg$c55;\n          peg$currPos += 5;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e59); }\n        }\n        if (s1 !== peg$FAILED) {\n          s2 = peg$currPos;\n          s3 = [];\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseBlockTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parsechar();\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parsechar();\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          }\n          s2 = input.substring(s2, peg$currPos);\n          s3 = peg$parseBlockTag();\n          if (s3 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 9658) {\n              s4 = peg$c56;\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e60); }\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$currPos;\n              s6 = [];\n              s7 = peg$currPos;\n              s8 = peg$currPos;\n              peg$silentFails++;\n              s9 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s9 === peg$FAILED) {\n                s8 = undefined;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parsechar();\n                if (s9 !== peg$FAILED) {\n                  s8 = [s8, s9];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n              while (s7 !== peg$FAILED) {\n                s6.push(s7);\n                s7 = peg$currPos;\n                s8 = peg$currPos;\n                peg$silentFails++;\n                s9 = peg$parseBlockTag();\n                peg$silentFails--;\n                if (s9 === peg$FAILED) {\n                  s8 = undefined;\n                } else {\n                  peg$currPos = s8;\n                  s8 = peg$FAILED;\n                }\n                if (s8 !== peg$FAILED) {\n                  s9 = peg$parsechar();\n                  if (s9 !== peg$FAILED) {\n                    s8 = [s8, s9];\n                    s7 = s8;\n                  } else {\n                    peg$currPos = s7;\n                    s7 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              }\n              s5 = input.substring(s5, peg$currPos);\n              s6 = peg$parseBlockTag();\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f74(s2, s5);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 5) === peg$c55) {\n            s1 = peg$c55;\n            peg$currPos += 5;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e59); }\n          }\n          if (s1 !== peg$FAILED) {\n            s2 = peg$currPos;\n            s3 = [];\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parsechar();\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsechar();\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            }\n            s2 = input.substring(s2, peg$currPos);\n            s3 = peg$parseBlockTag();\n            if (s3 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f75(s2);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.charCodeAt(peg$currPos) === 9658) {\n              s1 = peg$c56;\n              peg$currPos++;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e60); }\n            }\n            if (s1 !== peg$FAILED) {\n              s2 = peg$currPos;\n              s3 = [];\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsechar();\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n              while (s4 !== peg$FAILED) {\n                s3.push(s4);\n                s4 = peg$currPos;\n                s5 = peg$currPos;\n                peg$silentFails++;\n                s6 = peg$parseBlockTag();\n                peg$silentFails--;\n                if (s6 === peg$FAILED) {\n                  s5 = undefined;\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n                if (s5 !== peg$FAILED) {\n                  s6 = peg$parsechar();\n                  if (s6 !== peg$FAILED) {\n                    s5 = [s5, s6];\n                    s4 = s5;\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              }\n              s2 = input.substring(s2, peg$currPos);\n              s3 = peg$parseBlockTag();\n              if (s3 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f76(s2);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.substr(peg$currPos, 7) === peg$c57) {\n                s1 = peg$c57;\n                peg$currPos += 7;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e61); }\n              }\n              if (s1 !== peg$FAILED) {\n                s2 = peg$currPos;\n                s3 = [];\n                s4 = peg$currPos;\n                s5 = peg$currPos;\n                peg$silentFails++;\n                s6 = peg$parseBlockTag();\n                peg$silentFails--;\n                if (s6 === peg$FAILED) {\n                  s5 = undefined;\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n                if (s5 !== peg$FAILED) {\n                  s6 = peg$parsechar();\n                  if (s6 !== peg$FAILED) {\n                    s5 = [s5, s6];\n                    s4 = s5;\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n                while (s4 !== peg$FAILED) {\n                  s3.push(s4);\n                  s4 = peg$currPos;\n                  s5 = peg$currPos;\n                  peg$silentFails++;\n                  s6 = peg$parseBlockTag();\n                  peg$silentFails--;\n                  if (s6 === peg$FAILED) {\n                    s5 = undefined;\n                  } else {\n                    peg$currPos = s5;\n                    s5 = peg$FAILED;\n                  }\n                  if (s5 !== peg$FAILED) {\n                    s6 = peg$parsechar();\n                    if (s6 !== peg$FAILED) {\n                      s5 = [s5, s6];\n                      s4 = s5;\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                }\n                s2 = input.substring(s2, peg$currPos);\n                s3 = peg$parseBlockTag();\n                if (s3 !== peg$FAILED) {\n                  s4 = peg$parseMediaChain();\n                  peg$savedPos = s0;\n                  s0 = peg$f77(s2, s4);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                if (input.substr(peg$currPos, 9) === peg$c58) {\n                  s1 = peg$c58;\n                  peg$currPos += 9;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e62); }\n                }\n                if (s1 !== peg$FAILED) {\n                  s2 = peg$currPos;\n                  s3 = [];\n                  s4 = peg$currPos;\n                  s5 = peg$currPos;\n                  peg$silentFails++;\n                  s6 = peg$parseBlockTag();\n                  peg$silentFails--;\n                  if (s6 === peg$FAILED) {\n                    s5 = undefined;\n                  } else {\n                    peg$currPos = s5;\n                    s5 = peg$FAILED;\n                  }\n                  if (s5 !== peg$FAILED) {\n                    s6 = peg$parsechar();\n                    if (s6 !== peg$FAILED) {\n                      s5 = [s5, s6];\n                      s4 = s5;\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                  while (s4 !== peg$FAILED) {\n                    s3.push(s4);\n                    s4 = peg$currPos;\n                    s5 = peg$currPos;\n                    peg$silentFails++;\n                    s6 = peg$parseBlockTag();\n                    peg$silentFails--;\n                    if (s6 === peg$FAILED) {\n                      s5 = undefined;\n                    } else {\n                      peg$currPos = s5;\n                      s5 = peg$FAILED;\n                    }\n                    if (s5 !== peg$FAILED) {\n                      s6 = peg$parsechar();\n                      if (s6 !== peg$FAILED) {\n                        s5 = [s5, s6];\n                        s4 = s5;\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  }\n                  s2 = input.substring(s2, peg$currPos);\n                  s3 = peg$parseBlockTag();\n                  if (s3 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f78(s2);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  if (input.substr(peg$currPos, 10) === peg$c59) {\n                    s1 = peg$c59;\n                    peg$currPos += 10;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e63); }\n                  }\n                  if (s1 !== peg$FAILED) {\n                    s2 = peg$currPos;\n                    s3 = [];\n                    s4 = peg$currPos;\n                    s5 = peg$currPos;\n                    peg$silentFails++;\n                    s6 = peg$parseBlockTag();\n                    peg$silentFails--;\n                    if (s6 === peg$FAILED) {\n                      s5 = undefined;\n                    } else {\n                      peg$currPos = s5;\n                      s5 = peg$FAILED;\n                    }\n                    if (s5 !== peg$FAILED) {\n                      s6 = peg$parsechar();\n                      if (s6 !== peg$FAILED) {\n                        s5 = [s5, s6];\n                        s4 = s5;\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                    while (s4 !== peg$FAILED) {\n                      s3.push(s4);\n                      s4 = peg$currPos;\n                      s5 = peg$currPos;\n                      peg$silentFails++;\n                      s6 = peg$parseBlockTag();\n                      peg$silentFails--;\n                      if (s6 === peg$FAILED) {\n                        s5 = undefined;\n                      } else {\n                        peg$currPos = s5;\n                        s5 = peg$FAILED;\n                      }\n                      if (s5 !== peg$FAILED) {\n                        s6 = peg$parsechar();\n                        if (s6 !== peg$FAILED) {\n                          s5 = [s5, s6];\n                          s4 = s5;\n                        } else {\n                          peg$currPos = s4;\n                          s4 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    }\n                    s2 = input.substring(s2, peg$currPos);\n                    s3 = peg$parseBlockTag();\n                    if (s3 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s0 = peg$f79(s2);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$currPos;\n                    if (input.substr(peg$currPos, 4) === peg$c60) {\n                      s1 = peg$c60;\n                      peg$currPos += 4;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e64); }\n                    }\n                    if (s1 !== peg$FAILED) {\n                      s2 = peg$currPos;\n                      s3 = [];\n                      s4 = peg$currPos;\n                      s5 = peg$currPos;\n                      peg$silentFails++;\n                      s6 = peg$parseBlockTag();\n                      peg$silentFails--;\n                      if (s6 === peg$FAILED) {\n                        s5 = undefined;\n                      } else {\n                        peg$currPos = s5;\n                        s5 = peg$FAILED;\n                      }\n                      if (s5 !== peg$FAILED) {\n                        s6 = peg$parsechar();\n                        if (s6 !== peg$FAILED) {\n                          s5 = [s5, s6];\n                          s4 = s5;\n                        } else {\n                          peg$currPos = s4;\n                          s4 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                      while (s4 !== peg$FAILED) {\n                        s3.push(s4);\n                        s4 = peg$currPos;\n                        s5 = peg$currPos;\n                        peg$silentFails++;\n                        s6 = peg$parseBlockTag();\n                        peg$silentFails--;\n                        if (s6 === peg$FAILED) {\n                          s5 = undefined;\n                        } else {\n                          peg$currPos = s5;\n                          s5 = peg$FAILED;\n                        }\n                        if (s5 !== peg$FAILED) {\n                          s6 = peg$parsechar();\n                          if (s6 !== peg$FAILED) {\n                            s5 = [s5, s6];\n                            s4 = s5;\n                          } else {\n                            peg$currPos = s4;\n                            s4 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s4;\n                          s4 = peg$FAILED;\n                        }\n                      }\n                      s2 = input.substring(s2, peg$currPos);\n                      s3 = peg$parseBlockTag();\n                      if (s3 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s0 = peg$f80(s2);\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                    if (s0 === peg$FAILED) {\n                      s0 = peg$currPos;\n                      if (input.substr(peg$currPos, 4) === peg$c4) {\n                        s1 = peg$c4;\n                        peg$currPos += 4;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n                      }\n                      if (s1 !== peg$FAILED) {\n                        s2 = peg$parseBlockTag();\n                        if (s2 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s0 = peg$f81();\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                      if (s0 === peg$FAILED) {\n                        s0 = peg$currPos;\n                        if (input.substr(peg$currPos, 5) === peg$c61) {\n                          s1 = peg$c61;\n                          peg$currPos += 5;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e65); }\n                        }\n                        if (s1 !== peg$FAILED) {\n                          s2 = peg$currPos;\n                          s3 = [];\n                          s4 = peg$currPos;\n                          s5 = peg$currPos;\n                          peg$silentFails++;\n                          s6 = peg$parseBlockTag();\n                          peg$silentFails--;\n                          if (s6 === peg$FAILED) {\n                            s5 = undefined;\n                          } else {\n                            peg$currPos = s5;\n                            s5 = peg$FAILED;\n                          }\n                          if (s5 !== peg$FAILED) {\n                            s6 = peg$parsechar();\n                            if (s6 !== peg$FAILED) {\n                              s5 = [s5, s6];\n                              s4 = s5;\n                            } else {\n                              peg$currPos = s4;\n                              s4 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s4;\n                            s4 = peg$FAILED;\n                          }\n                          while (s4 !== peg$FAILED) {\n                            s3.push(s4);\n                            s4 = peg$currPos;\n                            s5 = peg$currPos;\n                            peg$silentFails++;\n                            s6 = peg$parseBlockTag();\n                            peg$silentFails--;\n                            if (s6 === peg$FAILED) {\n                              s5 = undefined;\n                            } else {\n                              peg$currPos = s5;\n                              s5 = peg$FAILED;\n                            }\n                            if (s5 !== peg$FAILED) {\n                              s6 = peg$parsechar();\n                              if (s6 !== peg$FAILED) {\n                                s5 = [s5, s6];\n                                s4 = s5;\n                              } else {\n                                peg$currPos = s4;\n                                s4 = peg$FAILED;\n                              }\n                            } else {\n                              peg$currPos = s4;\n                              s4 = peg$FAILED;\n                            }\n                          }\n                          s2 = input.substring(s2, peg$currPos);\n                          s3 = peg$parseBlockTag();\n                          if (s3 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s0 = peg$f82(s2);\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                        if (s0 === peg$FAILED) {\n                          s0 = peg$currPos;\n                          if (input.substr(peg$currPos, 5) === peg$c62) {\n                            s1 = peg$c62;\n                            peg$currPos += 5;\n                          } else {\n                            s1 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e66); }\n                          }\n                          if (s1 !== peg$FAILED) {\n                            s2 = peg$parseBlockTag();\n                            if (s2 !== peg$FAILED) {\n                              peg$savedPos = s0;\n                              s0 = peg$f83();\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                          if (s0 === peg$FAILED) {\n                            s0 = peg$currPos;\n                            if (input.substr(peg$currPos, 6) === peg$c63) {\n                              s1 = peg$c63;\n                              peg$currPos += 6;\n                            } else {\n                              s1 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e67); }\n                            }\n                            if (s1 !== peg$FAILED) {\n                              s2 = peg$currPos;\n                              s3 = [];\n                              s4 = peg$currPos;\n                              s5 = peg$currPos;\n                              peg$silentFails++;\n                              s6 = peg$parseBlockTag();\n                              peg$silentFails--;\n                              if (s6 === peg$FAILED) {\n                                s5 = undefined;\n                              } else {\n                                peg$currPos = s5;\n                                s5 = peg$FAILED;\n                              }\n                              if (s5 !== peg$FAILED) {\n                                s6 = peg$parsechar();\n                                if (s6 !== peg$FAILED) {\n                                  s5 = [s5, s6];\n                                  s4 = s5;\n                                } else {\n                                  peg$currPos = s4;\n                                  s4 = peg$FAILED;\n                                }\n                              } else {\n                                peg$currPos = s4;\n                                s4 = peg$FAILED;\n                              }\n                              while (s4 !== peg$FAILED) {\n                                s3.push(s4);\n                                s4 = peg$currPos;\n                                s5 = peg$currPos;\n                                peg$silentFails++;\n                                s6 = peg$parseBlockTag();\n                                peg$silentFails--;\n                                if (s6 === peg$FAILED) {\n                                  s5 = undefined;\n                                } else {\n                                  peg$currPos = s5;\n                                  s5 = peg$FAILED;\n                                }\n                                if (s5 !== peg$FAILED) {\n                                  s6 = peg$parsechar();\n                                  if (s6 !== peg$FAILED) {\n                                    s5 = [s5, s6];\n                                    s4 = s5;\n                                  } else {\n                                    peg$currPos = s4;\n                                    s4 = peg$FAILED;\n                                  }\n                                } else {\n                                  peg$currPos = s4;\n                                  s4 = peg$FAILED;\n                                }\n                              }\n                              s2 = input.substring(s2, peg$currPos);\n                              s3 = peg$parseBlockTag();\n                              if (s3 !== peg$FAILED) {\n                                peg$savedPos = s0;\n                                s0 = peg$f84(s2);\n                              } else {\n                                peg$currPos = s0;\n                                s0 = peg$FAILED;\n                              }\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                            if (s0 === peg$FAILED) {\n                              s0 = peg$currPos;\n                              if (input.substr(peg$currPos, 9) === peg$c64) {\n                                s1 = peg$c64;\n                                peg$currPos += 9;\n                              } else {\n                                s1 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e68); }\n                              }\n                              if (s1 !== peg$FAILED) {\n                                s2 = peg$currPos;\n                                s3 = peg$currPos;\n                                if (input.charCodeAt(peg$currPos) === 80) {\n                                  s4 = peg$c65;\n                                  peg$currPos++;\n                                } else {\n                                  s4 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e69); }\n                                }\n                                if (s4 !== peg$FAILED) {\n                                  s5 = peg$currPos;\n                                  s6 = [];\n                                  s7 = peg$currPos;\n                                  s8 = peg$currPos;\n                                  peg$silentFails++;\n                                  s9 = peg$parseBlockTag();\n                                  peg$silentFails--;\n                                  if (s9 === peg$FAILED) {\n                                    s8 = undefined;\n                                  } else {\n                                    peg$currPos = s8;\n                                    s8 = peg$FAILED;\n                                  }\n                                  if (s8 !== peg$FAILED) {\n                                    s9 = peg$parsechar();\n                                    if (s9 !== peg$FAILED) {\n                                      s8 = [s8, s9];\n                                      s7 = s8;\n                                    } else {\n                                      peg$currPos = s7;\n                                      s7 = peg$FAILED;\n                                    }\n                                  } else {\n                                    peg$currPos = s7;\n                                    s7 = peg$FAILED;\n                                  }\n                                  while (s7 !== peg$FAILED) {\n                                    s6.push(s7);\n                                    s7 = peg$currPos;\n                                    s8 = peg$currPos;\n                                    peg$silentFails++;\n                                    s9 = peg$parseBlockTag();\n                                    peg$silentFails--;\n                                    if (s9 === peg$FAILED) {\n                                      s8 = undefined;\n                                    } else {\n                                      peg$currPos = s8;\n                                      s8 = peg$FAILED;\n                                    }\n                                    if (s8 !== peg$FAILED) {\n                                      s9 = peg$parsechar();\n                                      if (s9 !== peg$FAILED) {\n                                        s8 = [s8, s9];\n                                        s7 = s8;\n                                      } else {\n                                        peg$currPos = s7;\n                                        s7 = peg$FAILED;\n                                      }\n                                    } else {\n                                      peg$currPos = s7;\n                                      s7 = peg$FAILED;\n                                    }\n                                  }\n                                  s5 = input.substring(s5, peg$currPos);\n                                  s4 = [s4, s5];\n                                  s3 = s4;\n                                } else {\n                                  peg$currPos = s3;\n                                  s3 = peg$FAILED;\n                                }\n                                if (s3 !== peg$FAILED) {\n                                  s2 = input.substring(s2, peg$currPos);\n                                } else {\n                                  s2 = s3;\n                                }\n                                if (s2 !== peg$FAILED) {\n                                  s3 = peg$parseBlockTag();\n                                  if (s3 !== peg$FAILED) {\n                                    peg$savedPos = s0;\n                                    s0 = peg$f85(s2);\n                                  } else {\n                                    peg$currPos = s0;\n                                    s0 = peg$FAILED;\n                                  }\n                                } else {\n                                  peg$currPos = s0;\n                                  s0 = peg$FAILED;\n                                }\n                              } else {\n                                peg$currPos = s0;\n                                s0 = peg$FAILED;\n                              }\n                              if (s0 === peg$FAILED) {\n                                s0 = peg$currPos;\n                                if (input.substr(peg$currPos, 6) === peg$c66) {\n                                  s1 = peg$c66;\n                                  peg$currPos += 6;\n                                } else {\n                                  s1 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e70); }\n                                }\n                                if (s1 !== peg$FAILED) {\n                                  s2 = peg$parseColor();\n                                  if (s2 !== peg$FAILED) {\n                                    s3 = peg$parseBlockTag();\n                                    if (s3 !== peg$FAILED) {\n                                      peg$savedPos = s0;\n                                      s0 = peg$f86(s2);\n                                    } else {\n                                      peg$currPos = s0;\n                                      s0 = peg$FAILED;\n                                    }\n                                  } else {\n                                    peg$currPos = s0;\n                                    s0 = peg$FAILED;\n                                  }\n                                } else {\n                                  peg$currPos = s0;\n                                  s0 = peg$FAILED;\n                                }\n                                if (s0 === peg$FAILED) {\n                                  s0 = peg$currPos;\n                                  if (input.substr(peg$currPos, 12) === peg$c67) {\n                                    s1 = peg$c67;\n                                    peg$currPos += 12;\n                                  } else {\n                                    s1 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e71); }\n                                  }\n                                  if (s1 !== peg$FAILED) {\n                                    s2 = peg$currPos;\n                                    s3 = [];\n                                    s4 = peg$currPos;\n                                    s5 = peg$currPos;\n                                    peg$silentFails++;\n                                    s6 = peg$parseBlockTag();\n                                    peg$silentFails--;\n                                    if (s6 === peg$FAILED) {\n                                      s5 = undefined;\n                                    } else {\n                                      peg$currPos = s5;\n                                      s5 = peg$FAILED;\n                                    }\n                                    if (s5 !== peg$FAILED) {\n                                      s6 = peg$parsechar();\n                                      if (s6 !== peg$FAILED) {\n                                        s5 = [s5, s6];\n                                        s4 = s5;\n                                      } else {\n                                        peg$currPos = s4;\n                                        s4 = peg$FAILED;\n                                      }\n                                    } else {\n                                      peg$currPos = s4;\n                                      s4 = peg$FAILED;\n                                    }\n                                    while (s4 !== peg$FAILED) {\n                                      s3.push(s4);\n                                      s4 = peg$currPos;\n                                      s5 = peg$currPos;\n                                      peg$silentFails++;\n                                      s6 = peg$parseBlockTag();\n                                      peg$silentFails--;\n                                      if (s6 === peg$FAILED) {\n                                        s5 = undefined;\n                                      } else {\n                                        peg$currPos = s5;\n                                        s5 = peg$FAILED;\n                                      }\n                                      if (s5 !== peg$FAILED) {\n                                        s6 = peg$parsechar();\n                                        if (s6 !== peg$FAILED) {\n                                          s5 = [s5, s6];\n                                          s4 = s5;\n                                        } else {\n                                          peg$currPos = s4;\n                                          s4 = peg$FAILED;\n                                        }\n                                      } else {\n                                        peg$currPos = s4;\n                                        s4 = peg$FAILED;\n                                      }\n                                    }\n                                    s2 = input.substring(s2, peg$currPos);\n                                    s3 = peg$parseBlockTag();\n                                    if (s3 !== peg$FAILED) {\n                                      peg$savedPos = s0;\n                                      s0 = peg$f87(s2);\n                                    } else {\n                                      peg$currPos = s0;\n                                      s0 = peg$FAILED;\n                                    }\n                                  } else {\n                                    peg$currPos = s0;\n                                    s0 = peg$FAILED;\n                                  }\n                                  if (s0 === peg$FAILED) {\n                                    s0 = peg$currPos;\n                                    s1 = peg$parseAlternativeStyleTags();\n                                    if (s1 !== peg$FAILED) {\n                                      s2 = peg$parseBlockTag();\n                                      if (s2 !== peg$FAILED) {\n                                        peg$savedPos = s0;\n                                        s0 = peg$f88(s1);\n                                      } else {\n                                        peg$currPos = s0;\n                                        s0 = peg$FAILED;\n                                      }\n                                    } else {\n                                      peg$currPos = s0;\n                                      s0 = peg$FAILED;\n                                    }\n                                    if (s0 === peg$FAILED) {\n                                      s0 = peg$currPos;\n                                      if (input.charCodeAt(peg$currPos) === 35) {\n                                        s1 = peg$c21;\n                                        peg$currPos++;\n                                      } else {\n                                        s1 = peg$FAILED;\n                                        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n                                      }\n                                      if (s1 !== peg$FAILED) {\n                                        s2 = peg$currPos;\n                                        s3 = [];\n                                        s4 = peg$currPos;\n                                        s5 = peg$currPos;\n                                        peg$silentFails++;\n                                        s6 = peg$parseBlockTag();\n                                        peg$silentFails--;\n                                        if (s6 === peg$FAILED) {\n                                          s5 = undefined;\n                                        } else {\n                                          peg$currPos = s5;\n                                          s5 = peg$FAILED;\n                                        }\n                                        if (s5 !== peg$FAILED) {\n                                          s6 = peg$parsechar();\n                                          if (s6 !== peg$FAILED) {\n                                            s5 = [s5, s6];\n                                            s4 = s5;\n                                          } else {\n                                            peg$currPos = s4;\n                                            s4 = peg$FAILED;\n                                          }\n                                        } else {\n                                          peg$currPos = s4;\n                                          s4 = peg$FAILED;\n                                        }\n                                        while (s4 !== peg$FAILED) {\n                                          s3.push(s4);\n                                          s4 = peg$currPos;\n                                          s5 = peg$currPos;\n                                          peg$silentFails++;\n                                          s6 = peg$parseBlockTag();\n                                          peg$silentFails--;\n                                          if (s6 === peg$FAILED) {\n                                            s5 = undefined;\n                                          } else {\n                                            peg$currPos = s5;\n                                            s5 = peg$FAILED;\n                                          }\n                                          if (s5 !== peg$FAILED) {\n                                            s6 = peg$parsechar();\n                                            if (s6 !== peg$FAILED) {\n                                              s5 = [s5, s6];\n                                              s4 = s5;\n                                            } else {\n                                              peg$currPos = s4;\n                                              s4 = peg$FAILED;\n                                            }\n                                          } else {\n                                            peg$currPos = s4;\n                                            s4 = peg$FAILED;\n                                          }\n                                        }\n                                        s2 = input.substring(s2, peg$currPos);\n                                        s3 = peg$parseBlockTag();\n                                        if (s3 !== peg$FAILED) {\n                                          peg$savedPos = s0;\n                                          s0 = peg$f89(s2);\n                                        } else {\n                                          peg$currPos = s0;\n                                          s0 = peg$FAILED;\n                                        }\n                                      } else {\n                                        peg$currPos = s0;\n                                        s0 = peg$FAILED;\n                                      }\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseRefsChain() {\n    let s0, s1;\n\n    s0 = [];\n    s1 = peg$parseRef();\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = peg$parseRef();\n    }\n\n    return s0;\n  }\n\n  function peg$parseRef() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c68) {\n      s1 = peg$c68;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e72); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseBlockTag();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsechar();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      peg$savedPos = s0;\n      s0 = peg$f90(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAlternativeStyleTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c69) {\n      s0 = peg$c69;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e73); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c70) {\n        s0 = peg$c70;\n        peg$currPos += 6;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e74); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 5) === peg$c71) {\n          s0 = peg$c71;\n          peg$currPos += 5;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e75); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 15) === peg$c72) {\n            s0 = peg$c72;\n            peg$currPos += 15;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e76); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 15) === peg$c73) {\n              s0 = peg$c73;\n              peg$currPos += 15;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e77); }\n            }\n            if (s0 === peg$FAILED) {\n              if (input.substr(peg$currPos, 14) === peg$c74) {\n                s0 = peg$c74;\n                peg$currPos += 14;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e78); }\n              }\n              if (s0 === peg$FAILED) {\n                if (input.substr(peg$currPos, 13) === peg$c75) {\n                  s0 = peg$c75;\n                  peg$currPos += 13;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e79); }\n                }\n                if (s0 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 15) === peg$c76) {\n                    s0 = peg$c76;\n                    peg$currPos += 15;\n                  } else {\n                    s0 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e80); }\n                  }\n                  if (s0 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 13) === peg$c77) {\n                      s0 = peg$c77;\n                      peg$currPos += 13;\n                    } else {\n                      s0 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e81); }\n                    }\n                    if (s0 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 14) === peg$c78) {\n                        s0 = peg$c78;\n                        peg$currPos += 14;\n                      } else {\n                        s0 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e82); }\n                      }\n                      if (s0 === peg$FAILED) {\n                        if (input.substr(peg$currPos, 14) === peg$c79) {\n                          s0 = peg$c79;\n                          peg$currPos += 14;\n                        } else {\n                          s0 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e83); }\n                        }\n                        if (s0 === peg$FAILED) {\n                          if (input.substr(peg$currPos, 14) === peg$c80) {\n                            s0 = peg$c80;\n                            peg$currPos += 14;\n                          } else {\n                            s0 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e84); }\n                          }\n                          if (s0 === peg$FAILED) {\n                            if (input.substr(peg$currPos, 13) === peg$c81) {\n                              s0 = peg$c81;\n                              peg$currPos += 13;\n                            } else {\n                              s0 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e85); }\n                            }\n                            if (s0 === peg$FAILED) {\n                              if (input.substr(peg$currPos, 9) === peg$c82) {\n                                s0 = peg$c82;\n                                peg$currPos += 9;\n                              } else {\n                                s0 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e86); }\n                              }\n                              if (s0 === peg$FAILED) {\n                                if (input.substr(peg$currPos, 6) === peg$c83) {\n                                  s0 = peg$c83;\n                                  peg$currPos += 6;\n                                } else {\n                                  s0 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e87); }\n                                }\n                                if (s0 === peg$FAILED) {\n                                  if (input.substr(peg$currPos, 9) === peg$c84) {\n                                    s0 = peg$c84;\n                                    peg$currPos += 9;\n                                  } else {\n                                    s0 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e88); }\n                                  }\n                                  if (s0 === peg$FAILED) {\n                                    if (input.substr(peg$currPos, 11) === peg$c85) {\n                                      s0 = peg$c85;\n                                      peg$currPos += 11;\n                                    } else {\n                                      s0 = peg$FAILED;\n                                      if (peg$silentFails === 0) { peg$fail(peg$e89); }\n                                    }\n                                    if (s0 === peg$FAILED) {\n                                      if (input.substr(peg$currPos, 3) === peg$c86) {\n                                        s0 = peg$c86;\n                                        peg$currPos += 3;\n                                      } else {\n                                        s0 = peg$FAILED;\n                                        if (peg$silentFails === 0) { peg$fail(peg$e90); }\n                                      }\n                                      if (s0 === peg$FAILED) {\n                                        if (input.substr(peg$currPos, 3) === peg$c87) {\n                                          s0 = peg$c87;\n                                          peg$currPos += 3;\n                                        } else {\n                                          s0 = peg$FAILED;\n                                          if (peg$silentFails === 0) { peg$fail(peg$e91); }\n                                        }\n                                        if (s0 === peg$FAILED) {\n                                          if (input.substr(peg$currPos, 9) === peg$c88) {\n                                            s0 = peg$c88;\n                                            peg$currPos += 9;\n                                          } else {\n                                            s0 = peg$FAILED;\n                                            if (peg$silentFails === 0) { peg$fail(peg$e92); }\n                                          }\n                                          if (s0 === peg$FAILED) {\n                                            if (input.substr(peg$currPos, 15) === peg$c89) {\n                                              s0 = peg$c89;\n                                              peg$currPos += 15;\n                                            } else {\n                                              s0 = peg$FAILED;\n                                              if (peg$silentFails === 0) { peg$fail(peg$e93); }\n                                            }\n                                            if (s0 === peg$FAILED) {\n                                              if (input.substr(peg$currPos, 6) === peg$c90) {\n                                                s0 = peg$c90;\n                                                peg$currPos += 6;\n                                              } else {\n                                                s0 = peg$FAILED;\n                                                if (peg$silentFails === 0) { peg$fail(peg$e94); }\n                                              }\n                                              if (s0 === peg$FAILED) {\n                                                if (input.substr(peg$currPos, 13) === peg$c91) {\n                                                  s0 = peg$c91;\n                                                  peg$currPos += 13;\n                                                } else {\n                                                  s0 = peg$FAILED;\n                                                  if (peg$silentFails === 0) { peg$fail(peg$e95); }\n                                                }\n                                                if (s0 === peg$FAILED) {\n                                                  if (input.substr(peg$currPos, 16) === peg$c92) {\n                                                    s0 = peg$c92;\n                                                    peg$currPos += 16;\n                                                  } else {\n                                                    s0 = peg$FAILED;\n                                                    if (peg$silentFails === 0) { peg$fail(peg$e96); }\n                                                  }\n                                                  if (s0 === peg$FAILED) {\n                                                    if (input.substr(peg$currPos, 16) === peg$c93) {\n                                                      s0 = peg$c93;\n                                                      peg$currPos += 16;\n                                                    } else {\n                                                      s0 = peg$FAILED;\n                                                      if (peg$silentFails === 0) { peg$fail(peg$e97); }\n                                                    }\n                                                    if (s0 === peg$FAILED) {\n                                                      if (input.substr(peg$currPos, 15) === peg$c94) {\n                                                        s0 = peg$c94;\n                                                        peg$currPos += 15;\n                                                      } else {\n                                                        s0 = peg$FAILED;\n                                                        if (peg$silentFails === 0) { peg$fail(peg$e98); }\n                                                      }\n                                                      if (s0 === peg$FAILED) {\n                                                        if (input.substr(peg$currPos, 14) === peg$c95) {\n                                                          s0 = peg$c95;\n                                                          peg$currPos += 14;\n                                                        } else {\n                                                          s0 = peg$FAILED;\n                                                          if (peg$silentFails === 0) { peg$fail(peg$e99); }\n                                                        }\n                                                        if (s0 === peg$FAILED) {\n                                                          if (input.substr(peg$currPos, 16) === peg$c96) {\n                                                            s0 = peg$c96;\n                                                            peg$currPos += 16;\n                                                          } else {\n                                                            s0 = peg$FAILED;\n                                                            if (peg$silentFails === 0) { peg$fail(peg$e100); }\n                                                          }\n                                                          if (s0 === peg$FAILED) {\n                                                            if (input.substr(peg$currPos, 14) === peg$c97) {\n                                                              s0 = peg$c97;\n                                                              peg$currPos += 14;\n                                                            } else {\n                                                              s0 = peg$FAILED;\n                                                              if (peg$silentFails === 0) { peg$fail(peg$e101); }\n                                                            }\n                                                            if (s0 === peg$FAILED) {\n                                                              if (input.substr(peg$currPos, 15) === peg$c98) {\n                                                                s0 = peg$c98;\n                                                                peg$currPos += 15;\n                                                              } else {\n                                                                s0 = peg$FAILED;\n                                                                if (peg$silentFails === 0) { peg$fail(peg$e102); }\n                                                              }\n                                                              if (s0 === peg$FAILED) {\n                                                                if (input.substr(peg$currPos, 15) === peg$c99) {\n                                                                  s0 = peg$c99;\n                                                                  peg$currPos += 15;\n                                                                } else {\n                                                                  s0 = peg$FAILED;\n                                                                  if (peg$silentFails === 0) { peg$fail(peg$e103); }\n                                                                }\n                                                                if (s0 === peg$FAILED) {\n                                                                  if (input.substr(peg$currPos, 15) === peg$c100) {\n                                                                    s0 = peg$c100;\n                                                                    peg$currPos += 15;\n                                                                  } else {\n                                                                    s0 = peg$FAILED;\n                                                                    if (peg$silentFails === 0) { peg$fail(peg$e104); }\n                                                                  }\n                                                                  if (s0 === peg$FAILED) {\n                                                                    if (input.substr(peg$currPos, 14) === peg$c101) {\n                                                                      s0 = peg$c101;\n                                                                      peg$currPos += 14;\n                                                                    } else {\n                                                                      s0 = peg$FAILED;\n                                                                      if (peg$silentFails === 0) { peg$fail(peg$e105); }\n                                                                    }\n                                                                    if (s0 === peg$FAILED) {\n                                                                      if (input.substr(peg$currPos, 10) === peg$c102) {\n                                                                        s0 = peg$c102;\n                                                                        peg$currPos += 10;\n                                                                      } else {\n                                                                        s0 = peg$FAILED;\n                                                                        if (peg$silentFails === 0) { peg$fail(peg$e106); }\n                                                                      }\n                                                                      if (s0 === peg$FAILED) {\n                                                                        if (input.substr(peg$currPos, 13) === peg$c103) {\n                                                                          s0 = peg$c103;\n                                                                          peg$currPos += 13;\n                                                                        } else {\n                                                                          s0 = peg$FAILED;\n                                                                          if (peg$silentFails === 0) { peg$fail(peg$e107); }\n                                                                        }\n                                                                        if (s0 === peg$FAILED) {\n                                                                          if (input.substr(peg$currPos, 19) === peg$c104) {\n                                                                            s0 = peg$c104;\n                                                                            peg$currPos += 19;\n                                                                          } else {\n                                                                            s0 = peg$FAILED;\n                                                                            if (peg$silentFails === 0) { peg$fail(peg$e108); }\n                                                                          }\n                                                                          if (s0 === peg$FAILED) {\n                                                                            if (input.substr(peg$currPos, 10) === peg$c105) {\n                                                                              s0 = peg$c105;\n                                                                              peg$currPos += 10;\n                                                                            } else {\n                                                                              s0 = peg$FAILED;\n                                                                              if (peg$silentFails === 0) { peg$fail(peg$e109); }\n                                                                            }\n                                                                            if (s0 === peg$FAILED) {\n                                                                              if (input.substr(peg$currPos, 10) === peg$c106) {\n                                                                                s0 = peg$c106;\n                                                                                peg$currPos += 10;\n                                                                              } else {\n                                                                                s0 = peg$FAILED;\n                                                                                if (peg$silentFails === 0) { peg$fail(peg$e110); }\n                                                                              }\n                                                                              if (s0 === peg$FAILED) {\n                                                                                if (input.substr(peg$currPos, 13) === peg$c107) {\n                                                                                  s0 = peg$c107;\n                                                                                  peg$currPos += 13;\n                                                                                } else {\n                                                                                  s0 = peg$FAILED;\n                                                                                  if (peg$silentFails === 0) { peg$fail(peg$e111); }\n                                                                                }\n                                                                                if (s0 === peg$FAILED) {\n                                                                                  if (input.substr(peg$currPos, 11) === peg$c108) {\n                                                                                    s0 = peg$c108;\n                                                                                    peg$currPos += 11;\n                                                                                  } else {\n                                                                                    s0 = peg$FAILED;\n                                                                                    if (peg$silentFails === 0) { peg$fail(peg$e112); }\n                                                                                  }\n                                                                                }\n                                                                              }\n                                                                            }\n                                                                          }\n                                                                        }\n                                                                      }\n                                                                    }\n                                                                  }\n                                                                }\n                                                              }\n                                                            }\n                                                          }\n                                                        }\n                                                      }\n                                                    }\n                                                  }\n                                                }\n                                              }\n                                            }\n                                          }\n                                        }\n                                      }\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseColor() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c109) {\n      s0 = peg$c109;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e113); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 5) === peg$c110) {\n        s0 = peg$c110;\n        peg$currPos += 5;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e114); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 4) === peg$c111) {\n          s0 = peg$c111;\n          peg$currPos += 4;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e115); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 5) === peg$c112) {\n            s0 = peg$c112;\n            peg$currPos += 5;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e116); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 7) === peg$c113) {\n              s0 = peg$c113;\n              peg$currPos += 7;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e117); }\n            }\n            if (s0 === peg$FAILED) {\n              if (input.substr(peg$currPos, 9) === peg$c114) {\n                s0 = peg$c114;\n                peg$currPos += 9;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e118); }\n              }\n              if (s0 === peg$FAILED) {\n                if (input.substr(peg$currPos, 4) === peg$c115) {\n                  s0 = peg$c115;\n                  peg$currPos += 4;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e119); }\n                }\n                if (s0 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 8) === peg$c116) {\n                    s0 = peg$c116;\n                    peg$currPos += 8;\n                  } else {\n                    s0 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e120); }\n                  }\n                  if (s0 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 5) === peg$c117) {\n                      s0 = peg$c117;\n                      peg$currPos += 5;\n                    } else {\n                      s0 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e121); }\n                    }\n                    if (s0 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 4) === peg$c118) {\n                        s0 = peg$c118;\n                        peg$currPos += 4;\n                      } else {\n                        s0 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e122); }\n                      }\n                      if (s0 === peg$FAILED) {\n                        if (input.substr(peg$currPos, 7) === peg$c119) {\n                          s0 = peg$c119;\n                          peg$currPos += 7;\n                        } else {\n                          s0 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e123); }\n                        }\n                        if (s0 === peg$FAILED) {\n                          if (input.substr(peg$currPos, 6) === peg$c120) {\n                            s0 = peg$c120;\n                            peg$currPos += 6;\n                          } else {\n                            s0 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e124); }\n                          }\n                          if (s0 === peg$FAILED) {\n                            if (input.substr(peg$currPos, 4) === peg$c121) {\n                              s0 = peg$c121;\n                              peg$currPos += 4;\n                            } else {\n                              s0 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e125); }\n                            }\n                            if (s0 === peg$FAILED) {\n                              if (input.substr(peg$currPos, 5) === peg$c122) {\n                                s0 = peg$c122;\n                                peg$currPos += 5;\n                              } else {\n                                s0 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e126); }\n                              }\n                              if (s0 === peg$FAILED) {\n                                if (input.substr(peg$currPos, 6) === peg$c123) {\n                                  s0 = peg$c123;\n                                  peg$currPos += 6;\n                                } else {\n                                  s0 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e127); }\n                                }\n                                if (s0 === peg$FAILED) {\n                                  if (input.substr(peg$currPos, 4) === peg$c124) {\n                                    s0 = peg$c124;\n                                    peg$currPos += 4;\n                                  } else {\n                                    s0 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e128); }\n                                  }\n                                  if (s0 === peg$FAILED) {\n                                    if (input.substr(peg$currPos, 6) === peg$c125) {\n                                      s0 = peg$c125;\n                                      peg$currPos += 6;\n                                    } else {\n                                      s0 = peg$FAILED;\n                                      if (peg$silentFails === 0) { peg$fail(peg$e129); }\n                                    }\n                                    if (s0 === peg$FAILED) {\n                                      if (input.substr(peg$currPos, 3) === peg$c126) {\n                                        s0 = peg$c126;\n                                        peg$currPos += 3;\n                                      } else {\n                                        s0 = peg$FAILED;\n                                        if (peg$silentFails === 0) { peg$fail(peg$e130); }\n                                      }\n                                      if (s0 === peg$FAILED) {\n                                        if (input.substr(peg$currPos, 6) === peg$c127) {\n                                          s0 = peg$c127;\n                                          peg$currPos += 6;\n                                        } else {\n                                          s0 = peg$FAILED;\n                                          if (peg$silentFails === 0) { peg$fail(peg$e131); }\n                                        }\n                                        if (s0 === peg$FAILED) {\n                                          if (input.substr(peg$currPos, 4) === peg$c128) {\n                                            s0 = peg$c128;\n                                            peg$currPos += 4;\n                                          } else {\n                                            s0 = peg$FAILED;\n                                            if (peg$silentFails === 0) { peg$fail(peg$e132); }\n                                          }\n                                          if (s0 === peg$FAILED) {\n                                            if (input.substr(peg$currPos, 6) === peg$c129) {\n                                              s0 = peg$c129;\n                                              peg$currPos += 6;\n                                            } else {\n                                              s0 = peg$FAILED;\n                                              if (peg$silentFails === 0) { peg$fail(peg$e133); }\n                                            }\n                                            if (s0 === peg$FAILED) {\n                                              if (input.substr(peg$currPos, 5) === peg$c130) {\n                                                s0 = peg$c130;\n                                                peg$currPos += 5;\n                                              } else {\n                                                s0 = peg$FAILED;\n                                                if (peg$silentFails === 0) { peg$fail(peg$e134); }\n                                              }\n                                              if (s0 === peg$FAILED) {\n                                                if (input.substr(peg$currPos, 6) === peg$c131) {\n                                                  s0 = peg$c131;\n                                                  peg$currPos += 6;\n                                                } else {\n                                                  s0 = peg$FAILED;\n                                                  if (peg$silentFails === 0) { peg$fail(peg$e135); }\n                                                }\n                                              }\n                                            }\n                                          }\n                                        }\n                                      }\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parsebitmarkMinusMinus() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = peg$currPos;\n    s1 = peg$parsebitmarkMinusMinusString();\n    peg$savedPos = s0;\n    s1 = peg$f91(s1);\n    s0 = s1;\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parsebitmarkMinusMinusString() {\n    let s0, s1, s2, s3;\n\n    peg$silentFails++;\n    s0 = peg$currPos;\n    s1 = peg$parsePlainText();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = [];\n    s3 = peg$parseStyledText();\n    if (s3 === peg$FAILED) {\n      s3 = peg$parsePlainText();\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = peg$parseStyledText();\n      if (s3 === peg$FAILED) {\n        s3 = peg$parsePlainText();\n      }\n    }\n    peg$savedPos = s0;\n    s0 = peg$f92(s1, s2);\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parsePlainText() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNL();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f93();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parseTagTags();\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseStyledText();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s4 = [s4, s5, s6];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = peg$parseTagTags();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseStyledText();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s4 = [s4, s5];\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parseTagTags();\n          if (s4 === peg$FAILED) {\n            s4 = null;\n          }\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseStyledText();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parsechar();\n            if (s6 !== peg$FAILED) {\n              s4 = [s4, s5, s6];\n              s3 = s4;\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n          if (s3 === peg$FAILED) {\n            s3 = peg$currPos;\n            s4 = peg$parseTagTags();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseStyledText();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                s4 = [s4, s5];\n                s3 = s4;\n              } else {\n                peg$currPos = s3;\n                s3 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = input.substring(s1, peg$currPos);\n      } else {\n        s1 = s2;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f94(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBoldHalfTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 42) {\n      s0 = peg$c132;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e136); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseItalicHalfTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 95) {\n      s0 = peg$c133;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e137); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLightHalfTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 96) {\n      s0 = peg$c134;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e138); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseHighlightHalfTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 33) {\n      s0 = peg$c135;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e139); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBoldTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBoldHalfTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseBoldHalfTag();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseItalicTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseItalicHalfTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseItalicHalfTag();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLightTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseLightHalfTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseLightHalfTag();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseHighlightTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseHighlightHalfTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseHighlightHalfTag();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBodyBitOpenTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c136) {\n      s0 = peg$c136;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e140); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBodyBitCloseTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 93) {\n      s0 = peg$c137;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e141); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseStyledText() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBodyBitOpenTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r1.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseBodyBitCloseTag();\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f95(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseBoldTag();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBoldTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          if (input.length > peg$currPos) {\n            s6 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseBoldTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        s2 = input.substring(s2, peg$currPos);\n        s3 = peg$parseBoldTag();\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f96(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseItalicTag();\n        if (s1 !== peg$FAILED) {\n          s2 = peg$currPos;\n          s3 = [];\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseItalicTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseItalicTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              if (input.length > peg$currPos) {\n                s6 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e0); }\n              }\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          }\n          s2 = input.substring(s2, peg$currPos);\n          s3 = peg$parseItalicTag();\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f97(s2);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parseLightTag();\n          if (s1 !== peg$FAILED) {\n            s2 = peg$currPos;\n            s3 = [];\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseLightTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              if (input.length > peg$currPos) {\n                s6 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e0); }\n              }\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseLightTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                if (input.length > peg$currPos) {\n                  s6 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                }\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            }\n            s2 = input.substring(s2, peg$currPos);\n            s3 = peg$parseLightTag();\n            if (s3 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f98(s2);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parseHighlightTag();\n            if (s1 !== peg$FAILED) {\n              s2 = peg$currPos;\n              s3 = [];\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseHighlightTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                if (input.length > peg$currPos) {\n                  s6 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                }\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n              while (s4 !== peg$FAILED) {\n                s3.push(s4);\n                s4 = peg$currPos;\n                s5 = peg$currPos;\n                peg$silentFails++;\n                s6 = peg$parseHighlightTag();\n                peg$silentFails--;\n                if (s6 === peg$FAILED) {\n                  s5 = undefined;\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n                if (s5 !== peg$FAILED) {\n                  if (input.length > peg$currPos) {\n                    s6 = input.charAt(peg$currPos);\n                    peg$currPos++;\n                  } else {\n                    s6 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                  }\n                  if (s6 !== peg$FAILED) {\n                    s5 = [s5, s6];\n                    s4 = s5;\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              }\n              s2 = input.substring(s2, peg$currPos);\n              s3 = peg$parseHighlightTag();\n              if (s3 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f99(s2);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTagTags() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseLightTag();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseLightHalfTag();\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$parseLightHalfTag();\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = [s2, s3];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = peg$parseHighlightTag();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$parseHighlightHalfTag();\n        if (s4 !== peg$FAILED) {\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$parseHighlightHalfTag();\n          }\n        } else {\n          s3 = peg$FAILED;\n        }\n        if (s3 !== peg$FAILED) {\n          s2 = [s2, s3];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        s0 = input.substring(s0, peg$currPos);\n      } else {\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    let s0, s1;\n\n    peg$silentFails++;\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s0 = peg$c138;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e143); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 2) === peg$c139) {\n        s0 = peg$c139;\n        peg$currPos += 2;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e144); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = input.charAt(peg$currPos);\n        if (peg$r2.test(s0)) {\n          peg$currPos++;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e145); }\n        }\n      }\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e142); }\n    }\n\n    return s0;\n  }\n\n  function peg$parsechar() {\n    let s0;\n\n    s0 = input.charAt(peg$currPos);\n    if (peg$r3.test(s0)) {\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e146); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseEOL() {\n    let s0, s1;\n\n    s0 = peg$parseNL();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e0); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseUrlHttp() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c140) {\n      s2 = peg$c140;\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e147); }\n    }\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 115) {\n        s3 = peg$c141;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e148); }\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      if (input.substr(peg$currPos, 3) === peg$c142) {\n        s4 = peg$c142;\n        peg$currPos += 3;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e149); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$currPos;\n        s7 = peg$currPos;\n        peg$silentFails++;\n        s8 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s8 === peg$FAILED) {\n          s7 = undefined;\n        } else {\n          peg$currPos = s7;\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseUrlChars();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$currPos;\n          s7 = peg$currPos;\n          peg$silentFails++;\n          s8 = peg$parseBlockTag();\n          peg$silentFails--;\n          if (s8 === peg$FAILED) {\n            s7 = undefined;\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseUrlChars();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        }\n        s2 = [s2, s3, s4, s5];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseUrl() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c140) {\n      s3 = peg$c140;\n      peg$currPos += 4;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e147); }\n    }\n    if (s3 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 115) {\n        s4 = peg$c141;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e148); }\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      if (input.substr(peg$currPos, 3) === peg$c142) {\n        s5 = peg$c142;\n        peg$currPos += 3;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e149); }\n      }\n      if (s5 !== peg$FAILED) {\n        s3 = [s3, s4, s5];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 === peg$FAILED) {\n      if (input.substr(peg$currPos, 7) === peg$c143) {\n        s2 = peg$c143;\n        peg$currPos += 7;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e150); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseBlockTag();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parseUrlChars();\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parseUrlChars();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      peg$savedPos = s0;\n      s0 = peg$f100(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseUrlChars() {\n    let s0;\n\n    s0 = input.charAt(peg$currPos);\n    if (peg$r4.test(s0)) {\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e151); }\n    }\n\n    return s0;\n  }\n\n\n    var indentStack = [], indent = \"\"\n\n    input = input.trimStart()\n\n  peg$result = peg$startRuleFunction();\n\n  const peg$success = (peg$result !== peg$FAILED && peg$currPos === input.length);\n  function peg$throw() {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? peg$getUnicode(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos,\n      peg$success,\n      peg$throw: peg$success ? undefined : peg$throw,\n    });\n  }\n  if (peg$success) {\n    return peg$result;\n  } else {\n    peg$throw();\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"version\",\n  \"bitmarkPlusPlus\",\n  \"bitmarkPlus\",\n  \"bitmarkMinusMinus\",\n  \"bitmarkPlusString\",\n  \"bitmarkMinusMinusString\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n","import { parse as _parse } from '../../../generated/parser/text/text-peggy-parser.js';\nimport { type TextAst } from '../../../model/ast/TextNodes.ts';\n\ninterface ParseOptions {\n  startRule?: string;\n}\n\ntype Parse = (str: string, options?: ParseOptions) => TextAst | string;\n\nconst parse: Parse = _parse;\n\nexport { parse };\n","import { type JsonText, type TextAst } from '../../model/ast/TextNodes.ts';\nimport { type TextFormatType } from '../../model/enum/TextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../../model/enum/TextLocation.ts';\nimport { TextNodeType } from '../../model/enum/TextNodeType.ts';\nimport { type BodyBitJson } from '../../model/json/BodyBitJson.ts';\nimport { StringUtils } from '../../utils/StringUtils.ts';\nimport { parse as bitmarkTextParse } from './peg/TextPegParser.ts';\n\nexport interface BitmarkTextParserOptions {\n  format: TextFormatType;\n  location: TextLocationType;\n}\n\nclass TextParser {\n  /**\n   * Get the version of the text parser\n   */\n  version(): string {\n    return bitmarkTextParse('', {\n      startRule: 'version',\n    }) as string;\n  }\n\n  /**\n   * Preprocess bitmark text AST into a standard format (TextAst object) from bitmark text AST either as a string\n   * or a plain JS object\n   *\n   * @param ast - bitmark text AST as a string or a plain JS object\n   * @returns bitmark text AST in a standard format (BitmarkAst object)\n   */\n  preprocessAst(ast: string | unknown): TextAst | undefined {\n    if (StringUtils.isString(ast)) {\n      const str = ast as string;\n      try {\n        ast = JSON.parse(str);\n      } catch (_e) {\n        // Failed to parse JSON, return empty array\n        return undefined;\n      }\n    }\n\n    if (this.isAst(ast)) {\n      return ast as TextAst;\n    }\n    return undefined;\n  }\n\n  /**\n   * Check if a plain JS object is valid text AST\n   *\n   * @param ast - a plain JS object that might be text AST\n   * @returns true if text AST, otherwise false\n   */\n  isAst(ast: unknown): boolean {\n    if (Array.isArray(ast)) {\n      if (ast.length === 0) return true;\n\n      if (Object.prototype.hasOwnProperty.call(ast[0], 'type')) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Convert Bitmark text to text AST.\n   *\n   * The Bitmark text should be a string.\n   * If parsed bitmark text AST is passed to this function, it will be returned as is.\n   *\n   * @param text - bitmark text\n   * @returns bitmark text AST as plain JS object\n   */\n  toAst(text: string | TextAst | undefined, options: BitmarkTextParserOptions): TextAst {\n    // If input is not a string, return it as is\n    if (Array.isArray(text)) return text;\n    let str = (text as string) ?? '';\n\n    // If the str is empty, return an empty array (as otherwise the parser will\n    // return an empty paragraph which is unnecessary)\n    if (!str) return [];\n\n    // Ensure options is an object\n    const opts = Object.assign({}, options);\n\n    // Set the start rule.\n    // The start rule is bitmark++ for the body, and bitmark+ for the tags\n    // Otherwise, the start rule is bitmarkMinusMinus\n    let startRule = 'bitmarkPlusPlus';\n    if (opts.location === TextLocation.tag) {\n      startRule = 'bitmarkPlus';\n    }\n\n    // Always trim the string before parsing (parser handles leading/trailing whitespace inconsistently)\n    str = str.trim();\n\n    return bitmarkTextParse(str, {\n      startRule,\n    }) as TextAst;\n  }\n\n  /**\n   * Extract all the body bits from the text AST\n   *\n   * @param text\n   * @returns\n   */\n  public extractBodyBits(text: JsonText): BodyBitJson[] {\n    if (!Array.isArray(text)) return [];\n\n    const bodyBits: BodyBitJson[] = [];\n    const textAst = text as TextAst;\n    for (const node of textAst) {\n      switch (node.type) {\n        case TextNodeType.gap:\n        case TextNodeType.select:\n        case TextNodeType.highlight:\n        case TextNodeType.mark:\n          bodyBits.push(node as BodyBitJson);\n          break;\n        default: {\n          // Recurse into children\n          const bits = this.extractBodyBits(node.content as TextAst);\n          for (const bit of bits) {\n            bodyBits.push(bit);\n          }\n        }\n      }\n    }\n\n    return bodyBits;\n  }\n\n  /**\n   * Walk all the body bits from the text AST\n   *\n   * @param text\n   * @returns\n   */\n  public walkBodyBits(\n    text: JsonText,\n    callback: (parent: TextAst, index: number, bodyBit: BodyBitJson) => void,\n  ): void {\n    if (!Array.isArray(text)) return;\n\n    const textAst = text as TextAst;\n    for (let i = 0; i < textAst.length; i++) {\n      const node = textAst[i];\n      switch (node.type) {\n        case TextNodeType.gap:\n        case TextNodeType.select:\n        case TextNodeType.highlight:\n        case TextNodeType.mark:\n          callback(textAst, i, node as BodyBitJson);\n          break;\n        default: {\n          // Recurse into children\n          this.walkBodyBits(node.content as TextAst, callback);\n        }\n      }\n    }\n  }\n}\n\nexport { TextParser };\n","class BooleanUtils {\n  /**\n   * Check if an object is a boolean.\n   *\n   * @param val input value\n   * @returns the input value if it is an array, otherwise a new array containing the input value\n   */\n  isBoolean(val: unknown | undefined): boolean {\n    if (val === true) return true;\n    if (val === false) return true;\n    return false;\n  }\n\n  /**\n   * Check if an object is a boolean, or a boolean string.\n   *\n   * @param val input value\n   * @returns the input value if it is an array, otherwise a new array containing the input value\n   */\n  isBooleanString(val: unknown | undefined): boolean {\n    if (this.isBoolean(val)) return true;\n    if (val === 'true') return true;\n    if (val === 'false') return true;\n    return false;\n  }\n\n  /**\n   * Convert a value to a boolean.\n   *\n   * By default, the return will be false unless the value is truthy (true, \"true\").\n   * Setting defaultVal to true will return true unless the value is falsy (false, \"false\").\n   *\n   * @param val input value\n   * @param defaultVal default value to return if val does not match a boolean or 'true' / 'false'\n   * @returns val, converted to a boolean\n   */\n  toBoolean(val: unknown | undefined, defaultVal?: boolean): boolean {\n    if (defaultVal) {\n      if (val === false) return false;\n      if (val === 'false') return false;\n      return true;\n    } else {\n      if (val === true) return true;\n      if (val === 'true') return true;\n      return false;\n    }\n  }\n}\n\nconst instance = new BooleanUtils();\n\nexport { instance as BooleanUtils };\n","class NumberUtils {\n  /**\n   * Convert a value to a number, unless it is already a number.\n   *\n   * The value returned if conversion cannot be performed defaults to undefined but can be configured\n   * via defaultVal.\n   *\n   * @param val input value\n   * @param defaultVal value to return if conversion cannot be performed\n   * @returns the input value if it is an array, otherwise a new array containing the input value\n   */\n  asNumber<T extends number | undefined>(val: unknown | undefined, defaultVal?: T): number | T {\n    if (val == null) return (defaultVal ?? undefined) as T;\n    const number = +val;\n    if (Number.isNaN(number) || !isFinite(number)) return (defaultVal ?? undefined) as T;\n\n    return number;\n  }\n\n  /**\n   * Return true if the input value IS or CAN BE converted to a number.\n   *\n   * e.g.\n   * 123 -> true\n   * 123.45 -> true\n   * '123' -> true\n   * '123.45' -> true\n   * '-123.45' -> true\n   * '+123.45' -> true\n   * '0xAc1' -> true\n   * '0xAc1' -> true\n   * '0b101' -> true\n   * '0o701' -> true\n   * '1e4' -> true\n   * '1e-4' -> true\n   * '++1e-4' -> false\n   * '7^2' -> false\n   * '0xFFG' -> false\n   * '0b121' -> false\n   * '0o781' -> false\n   * '1x10e4' -> false\n   * '123abc' -> false\n   * 'abc' -> false\n   * null -> false\n   *\n   * @param val input value\n   *\n   * @returns true if the input value can be converted to a number.\n   */\n  isNumeric(val: unknown): boolean {\n    if (val == null) return false;\n\n    const number = +val;\n    return !Number.isNaN(number) && isFinite(number);\n  }\n}\n\nconst instance = new NumberUtils();\n\nexport { instance as NumberUtils };\n","import { Breakscape } from '../breakscaping/Breakscape.ts';\nimport { Config } from '../config/Config.ts';\nimport { TextGenerator } from '../generator/text/TextGenerator.ts';\nimport { type Property } from '../model/ast/Nodes.ts';\nimport { type JsonText, type TextAst } from '../model/ast/TextNodes.ts';\nimport { BitConfig } from '../model/config/BitConfig.ts';\nimport type { ConfigKeyType } from '../model/config/enum/ConfigKey.ts';\nimport type { PropertyTagConfig } from '../model/config/PropertyTagConfig.ts';\nimport { type BitTypeType } from '../model/enum/BitType.ts';\nimport { TagFormat } from '../model/enum/TagFormat.ts';\nimport { type TextFormatType } from '../model/enum/TextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../model/enum/TextLocation.ts';\nimport { type ExampleJson } from '../model/json/BitJson.ts';\nimport { TextParser } from '../parser/text/TextParser.ts';\nimport { BooleanUtils } from '../utils/BooleanUtils.ts';\nimport { NumberUtils } from '../utils/NumberUtils.ts';\nimport { StringUtils } from '../utils/StringUtils.ts';\n\nexport interface WithExampleJson {\n  isExample: boolean;\n  example: ExampleJson;\n  __defaultExample?: ExampleJson;\n}\n\nexport interface BuildContext {\n  bitConfig: BitConfig;\n  bitType: BitTypeType;\n  textFormat: TextFormatType;\n}\n\nexport interface ToAstPropertyOptions {\n  cardSet?: {\n    sideNo: number; // Side number of the card set\n    variantNo: number; // Variant number of the card set\n  };\n}\n\nclass BaseBuilder {\n  protected textParser: TextParser;\n  protected textGenerator: TextGenerator;\n\n  constructor() {\n    this.textParser = new TextParser();\n    this.textGenerator = new TextGenerator();\n  }\n\n  /**\n   * Convert example to an Example.\n   * - If example is set, then the isExample will be true and example with be example as a BreakscapedText.\n   * - Else if __isDefaultExample is true, then __isDefaultExample / isExample will both be true.\n   * - Else __isDefaultExample / isExample will both be false.\n   *\n   * @param __isDefaultExample - true if the example is the default value\n   * @param example - the example to convert (BreakscapedText, boolean) or undefined if none / default\n   * @returns example/__isDefaultExample resolved to an Example object\n   */\n  protected toExample(\n    __isDefaultExample: boolean | undefined,\n    example: TextAst | string | boolean | undefined | null,\n    defaultExample?: TextAst | string | boolean | undefined | null,\n  ): WithExampleJson {\n    // Example\n    if (example != undefined) {\n      let exampleValue: JsonText | boolean | null;\n\n      // If the default example is a boolean, then the example should be a boolean\n      if (BooleanUtils.isBoolean(defaultExample)) {\n        exampleValue = BooleanUtils.toBoolean(example);\n      } else {\n        exampleValue = example;\n      }\n\n      return {\n        isExample: true,\n        example: exampleValue,\n        __defaultExample: defaultExample ?? null,\n      };\n    }\n\n    // Default example\n    if (__isDefaultExample) {\n      return {\n        isExample: true,\n        example: defaultExample ?? null,\n        __defaultExample: defaultExample ?? null,\n      };\n    }\n\n    // Not an example\n    return {\n      isExample: false,\n      example: null,\n      __defaultExample: defaultExample ?? null,\n    };\n  }\n\n  /**\n   * Convert a raw bitmark property to an AST property.\n   *\n   * @param key\n   * @param value\n   * @param options\n   * @returns\n   */\n  protected toAstProperty(\n    bitType: BitTypeType,\n    key: ConfigKeyType,\n    value: unknown | unknown[] | undefined,\n    options: ToAstPropertyOptions | undefined,\n  ): Property | undefined {\n    if (value == null) return undefined;\n\n    const bitConfig = Config.getBitConfig(bitType);\n    let tagsConfig = bitConfig.tags;\n    if (options?.cardSet) {\n      const { sideNo, variantNo } = options.cardSet;\n      const cardTagsConfig = Config.getTagsConfigForCardSet(bitType, sideNo, variantNo);\n      tagsConfig = cardTagsConfig ?? tagsConfig;\n    }\n\n    const propertyConfig = Config.getTagConfigForTag(tagsConfig, key) as\n      | PropertyTagConfig\n      | undefined;\n\n    // Convert to array or single value if needed\n    if (propertyConfig?.array && !Array.isArray(value)) {\n      value = [value];\n    } else if (!propertyConfig?.array && Array.isArray(value)) {\n      value = value[value.length - 1];\n    }\n\n    // Convert property as needed\n    const processValue = (v: unknown): Property | undefined => {\n      if (v == null) return undefined;\n      const format = propertyConfig?.format ?? TagFormat.plainText;\n      switch (format) {\n        case TagFormat.plainText:\n          // Convert number to string\n          if (NumberUtils.asNumber(v) != null) v = `${v}`;\n\n          return StringUtils.isString(v) ? StringUtils.trimmedString(v) : undefined;\n\n        case TagFormat.number:\n          return NumberUtils.asNumber(v);\n\n        case TagFormat.boolean:\n          return BooleanUtils.toBoolean(v, true);\n\n        case TagFormat.invertedBoolean:\n          return !BooleanUtils.toBoolean(v, true);\n      }\n      return v as Property;\n    };\n    if (Array.isArray(value)) {\n      const valueArray = value as unknown[];\n      for (let i = 0, len = valueArray.length; i < len; i++) {\n        valueArray[i] = processValue(valueArray[i]);\n      }\n    } else {\n      value = processValue(value);\n    }\n\n    return value as Property;\n  }\n\n  protected getEmptyTextAst(context: BuildContext): TextAst {\n    return this.handleJsonText(context, TextLocation.tag, ' ');\n  }\n\n  /**\n   * Convert the JsonText from the JSON to the AST format:\n   * Input:\n   *  - Bitmark v2: breakscaped string\n   *  - Bitmark v3: bitmark text JSON (TextAst)\n   * Output:\n   *  - bitmark text JSON (TextAst) with __tag property to indicate item is text\n   *\n   * In the case of Bitmark v2 type texts, there is nothing to do but cast the type.\n   *\n   * @param context BuildContext\n   * @param textFormat format of TextAst\n   * @param textLocation location of the text (body, tag, etc.)\n   * @param text JsonText or JsonText[] to convert\n   * @returns Breakscaped string or breakscaped string[]\n   */\n  protected handleJsonText<\n    T extends JsonText | JsonText[] | undefined,\n    R = T extends JsonText[] ? TextAst[] : TextAst,\n  >(context: BuildContext, textLocation: TextLocationType, text: T): R {\n    let res: R;\n\n    const { textFormat } = context;\n\n    if (text == null) {\n      res = [] as R;\n    } else {\n      if (this.textParser.isAst(text)) {\n        // Use the text generator to convert the TextAst to breakscaped string\n        // this.ast.printTree(text, NodeType.textAst);\n\n        res = text as R;\n      } else if (Array.isArray(text)) {\n        const strArray: TextAst[] = [];\n        for (let i = 0, len = text.length; i < len; i++) {\n          const t = text[i];\n\n          if (this.textParser.isAst(t)) {\n            // Use the text generator to convert the TextAst to breakscaped string\n            // this.ast.printTree(text, NodeType.textAst);\n            strArray[i] = t as TextAst;\n          } else if (StringUtils.isString(t)) {\n            strArray[i] = this.textParser.toAst(\n              Breakscape.breakscape(t as string, {\n                format: textFormat,\n                location: textLocation,\n              }),\n              {\n                format: textFormat,\n                location: textLocation,\n              },\n            );\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            (strArray[i] as any).__tag = 'text';\n          } else {\n            // Invalid data\n            strArray[i] = [];\n          }\n        }\n        // Return the array of TextAst texts\n        return strArray as R;\n      } else if (StringUtils.isString(text)) {\n        // v2 text(?)\n        res = this.textParser.toAst(\n          Breakscape.breakscape(text as string, {\n            format: textFormat,\n            location: textLocation,\n            v2: true,\n          }),\n          {\n            format: textFormat,\n            location: textLocation,\n          },\n        ) as R;\n      } else {\n        // Invalid data\n        res = [] as R;\n      }\n    }\n\n    // Add the __tag property to indicate this is a text item\n    // This is somewhat ugly, but otherwise we would need an AST structure that is not so similar to the JSON\n    // resulting in a lot more conversion code\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (res as any).__tag = 'text';\n\n    return res;\n  }\n\n  // /**\n  //  * Remove any property with a key starting with an underscore.\n  //  *\n  //  * @param json\n  //  */\n  // protected removeTemporaryProperties(json: Record<string, unknown> | unknown[]): void {\n  //   const obj = json as Record<string, unknown>;\n  //   for (const key in obj) {\n  //     if (key.startsWith('_')) {\n  //       delete obj[key];\n  //     } else if (typeof obj[key] === 'object') {\n  //       this.removeTemporaryProperties(obj[key] as Record<string, unknown>);\n  //     }\n  //   }\n  // }\n}\n\nexport { BaseBuilder };\n","import { type WithExampleJson } from '../ast/BaseBuilder.ts';\nimport { type TextAst } from '../model/ast/TextNodes.ts';\nimport { type TextFormatType } from '../model/enum/TextFormat.ts';\nimport { TextLocation } from '../model/enum/TextLocation.ts';\nimport { type ExampleJson } from '../model/json/BitJson.ts';\nimport { TextParser } from '../parser/text/TextParser.ts';\nimport { BooleanUtils } from './BooleanUtils.ts';\n\nconst textParser = new TextParser();\n\nclass BitUtils {\n  /**\n   * Helper function to fill in the example / isExample of a node based on the values of __isDefaultExample and example.\n   * This function if for 'string' examples.\n   *\n   * @param nodes\n   * @param __isDefaultExample\n   * @param example\n   * @param firstOnly\n   * @returns\n   */\n  fillStringExample(\n    textFormat: TextFormatType,\n    nodes: WithExampleJson | WithExampleJson[],\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n    firstOnly: boolean,\n  ) {\n    if (!nodes) return;\n    if (!Array.isArray(nodes)) nodes = [nodes];\n\n    for (const node of nodes) {\n      if (!node.isExample) {\n        if (__isDefaultExample) {\n          node.example = node.__defaultExample as ExampleJson;\n          node.isExample = true;\n        } else {\n          // node.__isDefaultExample = false;\n          node.example = (\n            example\n              ? textParser.toAst(example as TextAst, {\n                  format: textFormat,\n                  location: TextLocation.tag,\n                })\n              : undefined\n          ) as ExampleJson;\n        }\n        if (firstOnly) break;\n      }\n    }\n  }\n\n  /**\n   * Helper function to fill in the example / isExample of a node based on the values of __isDefaultExample and example.\n   * This function if for 'boolean' examples.\n   *\n   * @param nodes\n   * @param __isDefaultExample\n   * @param example\n   * @param firstCorrectOnly\n   * @returns\n   */\n  fillBooleanExample(\n    nodes: WithExampleJson | WithExampleJson[],\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n    firstCorrectOnly: boolean,\n  ) {\n    if (!nodes) return;\n    if (!Array.isArray(nodes)) nodes = [nodes];\n\n    for (const node of nodes) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      if (!node.isExample && (!firstCorrectOnly || (node as any).isCorrect)) {\n        if (__isDefaultExample) {\n          node.example = node.__defaultExample as ExampleJson;\n          node.isExample = true;\n        } else {\n          // node.__isDefaultExample = false;\n          node.example = BooleanUtils.toBoolean(example);\n        }\n        if (firstCorrectOnly) break;\n      }\n    }\n  }\n}\n\nconst instance = new BitUtils();\n\nexport { instance as BitUtils };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../breakscaping/Breakscape.ts';\nimport { Config } from '../config/Config.ts';\nimport { type TextAst } from '../model/ast/TextNodes.ts';\nimport { BitType } from '../model/enum/BitType.ts';\nimport {\n  ResourceType,\n  resourceTypeToConfigKey,\n  type ResourceTypeType,\n} from '../model/enum/ResourceType.ts';\nimport { TextLocation } from '../model/enum/TextLocation.ts';\nimport {\n  type AppLinkResourceWrapperJson,\n  type ArticleResourceWrapperJson,\n  type AudioEmbedResourceWrapperJson,\n  type AudioLinkResourceWrapperJson,\n  type AudioResourceWrapperJson,\n  type DocumentDownloadResourceWrapperJson,\n  type DocumentEmbedResourceWrapperJson,\n  type DocumentLinkResourceWrapperJson,\n  type DocumentResourceWrapperJson,\n  type ImageLinkResourceWrapperJson,\n  type ImageResourceJson,\n  type ImageResourceWrapperJson,\n  type ImageResponsiveResourceJson,\n  type ResourceDataJson,\n  type ResourceJson,\n  type StillImageFilmEmbedResourceWrapperJson,\n  type StillImageFilmLinkResourceWrapperJson,\n  type StillImageFilmResourceJson,\n  type VideoEmbedResourceWrapperJson,\n  type VideoLinkResourceWrapperJson,\n  type VideoResourceWrapperJson,\n  type WebsiteLinkResourceWrapperJson,\n} from '../model/json/ResourceJson.ts';\nimport { ObjectUtils } from '../utils/ObjectUtils.ts';\nimport { StringUtils } from '../utils/StringUtils.ts';\nimport { UrlUtils } from '../utils/UrlUtils.ts';\nimport { BaseBuilder, type BuildContext } from './BaseBuilder.ts';\nimport { NodeValidator } from './rules/NodeValidator.ts';\n\n/**\n * Builder to build bitmark Resource AST nodes programmatically\n */\nclass ResourceBuilder extends BaseBuilder {\n  /**\n   * Build and validate resource JSON object(s) from external resource JSON object(s)\n   *\n   * Note: a single input resource object can be converted to multiple resource objects\n   * (e.g. stillImageFilm -> image + audio)\n   *\n   * @param bitType\n   * @param resource\n   * @returns\n   */\n  public resourceFromResourceJson(\n    context: BuildContext,\n    resource?: Partial<ResourceJson> | Partial<ResourceJson>[],\n  ): ResourceJson | ResourceJson[] | undefined {\n    if (!resource) return undefined;\n\n    const nodes: ResourceJson[] | undefined = [];\n\n    // Convert single resource to array\n    if (!Array.isArray(resource)) resource = [resource];\n\n    for (const thisResource of resource) {\n      // Validate we have a valid resource type\n      let type = Enum(ResourceType).fromValue(thisResource.type);\n      if (!type) return undefined;\n\n      // Get the resource key\n      const resourceKey = Enum(ResourceType).keyFromValue(type);\n      if (!resourceKey) return undefined;\n\n      // Override original type with type alias if present\n      const __typeAlias = Enum(ResourceType).fromValue(thisResource.__typeAlias);\n      type = __typeAlias ?? type;\n\n      let data: ResourceDataJson | undefined;\n\n      // TODO: This code should use the config to handle the combo resources. For now the logic is hardcoded\n\n      // Handle special cases for multiple resource bits (imageResponsive, stillImageFilm)\n      if (type === ResourceType.imageResponsive) {\n        const r = thisResource as unknown as ImageResponsiveResourceJson;\n        const imagePortraitNode = this.resourceFromResourceDataJson(\n          context,\n          ResourceType.imagePortrait,\n          r.imagePortrait,\n        );\n        const imageLandscapeNode = this.resourceFromResourceDataJson(\n          context,\n          ResourceType.imageLandscape,\n          r.imageLandscape,\n        );\n        if (imagePortraitNode) nodes.push(imagePortraitNode);\n        if (imageLandscapeNode) nodes.push(imageLandscapeNode);\n      } else if (type === ResourceType.stillImageFilm) {\n        const r = thisResource as unknown as StillImageFilmResourceJson;\n        const imageNode = this.resourceFromResourceDataJson(context, ResourceType.image, r.image);\n        const audioNode = this.resourceFromResourceDataJson(context, ResourceType.audio, r.audio);\n        if (imageNode) nodes.push(imageNode);\n        if (audioNode) nodes.push(audioNode);\n      } else {\n        // Standard single resource case\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        data = (thisResource as any)[resourceKey];\n\n        if (!data) return undefined;\n\n        const node = this.resourceFromResourceDataJson(context, type, data);\n        if (node) nodes.push(node);\n      }\n    }\n\n    if (nodes.length === 0) return undefined;\n    if (nodes.length === 1) return nodes[0];\n    return nodes;\n  }\n\n  public resourceFromResourceDataJson(\n    context: BuildContext,\n    type: ResourceTypeType,\n    data: Partial<ResourceDataJson> | undefined,\n  ): ResourceJson | undefined {\n    if (!data) return undefined;\n    type = Enum(ResourceType).fromValue(type) as ResourceTypeType;\n    if (!type) return undefined;\n\n    const dataAsString: string | undefined = StringUtils.isString(data)\n      ? (data as unknown as string)\n      : undefined;\n\n    // url / src / href / app\n    const url = data.url || data.src || data.body || dataAsString;\n\n    // Sub resources\n    const posterImage = data.posterImage\n      ? (\n          this.resourceFromResourceDataJson(\n            context,\n            ResourceType.image,\n            data.posterImage,\n          ) as ImageResourceWrapperJson\n        )?.image\n      : undefined;\n    const thumbnails = data.thumbnails\n      ? data.thumbnails.map((t) => {\n          return (\n            this.resourceFromResourceDataJson(\n              context,\n              ResourceType.image,\n              t,\n            ) as ImageResourceWrapperJson\n          )?.image;\n        })\n      : undefined;\n\n    // Resource\n    const node = this.resource(context, {\n      type,\n\n      // Generic (except Article / Document)\n      value: url,\n\n      // Alternative source\n      srcAlt: data.srcAlt,\n\n      // ImageLikeResource / AudioLikeResource / VideoLikeResource / Article / Document\n      format: data.format,\n\n      // ImageLikeResource\n      src1x: data.src1x,\n      src2x: data.src2x,\n      src3x: data.src3x,\n      src4x: data.src4x,\n      caption: this.handleJsonText(context, TextLocation.tag, data.caption),\n\n      // ImageLikeResource / VideoLikeResource\n      width: data.width ?? undefined,\n      height: data.height ?? undefined,\n      alt: data.alt,\n      zoomDisabled: data.zoomDisabled,\n\n      // VideoLikeResource\n      duration: data.duration,\n      mute: data.mute,\n      autoplay: data.autoplay,\n      allowSubtitles: data.allowSubtitles,\n      showSubtitles: data.showSubtitles,\n      posterImage,\n      thumbnails,\n\n      // WebsiteLinkResource\n      siteName: undefined, //data.siteName,\n\n      // Generic Resource\n      license: data.license,\n      copyright: data.copyright,\n      showInIndex: data.showInIndex,\n      search: data.search,\n      selected: data.selected,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build resource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  /* private */ resource(\n    context: BuildContext,\n    data: {\n      type: ResourceTypeType;\n\n      // Generic part (value of bit tag)\n      value?: string; // url / src / href / app / body\n\n      // Alternative source\n      srcAlt?: string[];\n\n      // ImageLikeResource / AudioLikeResource / VideoLikeResource / Article / Document\n      format?: string;\n\n      // ImageLikeResource\n      src1x?: string;\n      src2x?: string;\n      src3x?: string;\n      src4x?: string;\n\n      // ImageLikeResource / VideoLikeResource\n      width?: string;\n      height?: string;\n      alt?: string;\n      zoomDisabled?: boolean;\n\n      // VideoLikeResource\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n\n      // WebsiteLinkResource\n      siteName?: string;\n\n      // Generic Resource\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n    //\n  ): ResourceJson | undefined {\n    let node: ResourceJson | undefined;\n\n    const { type, value: valueIn, format: formatIn, ...rest } = data;\n    const finalData = {\n      type,\n      value: valueIn ?? Breakscape.EMPTY_STRING,\n      format: formatIn ?? Breakscape.EMPTY_STRING,\n      ...rest,\n    };\n\n    // Special case for video like tags - build thumbnails from the srcXx properties\n    switch (type) {\n      case ResourceType.video:\n      case ResourceType.videoEmbed:\n      case ResourceType.videoLink:\n      case ResourceType.stillImageFilmEmbed:\n      case ResourceType.stillImageFilmLink: {\n        const thumbnailKeys = ['src1x', 'src2x', 'src3x', 'src4x'];\n        const thumbnails: ImageResourceJson[] = [];\n        for (const k of thumbnailKeys) {\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          const dataAsAny = data as any;\n          const value = dataAsAny[k];\n          if (value) {\n            const image: ImageResourceWrapperJson = this.resource(context, {\n              type: ResourceType.image,\n              value,\n            }) as ImageResourceWrapperJson;\n            if (image) thumbnails.push(image.image as ImageResourceJson);\n          }\n        }\n        // Merge with existing thumbnails\n        finalData.thumbnails = [...(finalData.thumbnails || []), ...thumbnails];\n      }\n    }\n\n    switch (type) {\n      case ResourceType.image:\n      case ResourceType.imagePortrait:\n      case ResourceType.imageLandscape:\n      case ResourceType.backgroundWallpaper:\n      case ResourceType.imagePlaceholder:\n      case ResourceType.icon:\n      case ResourceType.platformIcon:\n      case ResourceType.platformLogo:\n      case ResourceType.platformBackgroundImage:\n      case ResourceType.previewImage:\n      case ResourceType.coverImage:\n      case ResourceType.backgroundImage:\n        node = this.imageResource(context, finalData, type);\n        break;\n\n      // case ResourceType.imageResponsive: {\n      //   node = this.imageResponsiveResource({\n      //     imagePortrait: this.imageResource(\n      //       finalData.imagePortrait ?? {\n      //         format: '',\n      //         value: '',\n      //       },\n      //     ),\n      //     imageLandscape: this.imageResource(\n      //       finalData.imageLandscape ?? {\n      //         format: '',\n      //         value: '',\n      //       },\n      //     ),\n      //   });\n      //   break;\n      // }\n\n      case ResourceType.imageLink:\n        node = this.imageLinkResource(context, finalData);\n        break;\n\n      case ResourceType.audio:\n        node = this.audioResource(context, finalData);\n        break;\n\n      case ResourceType.audioEmbed:\n        node = this.audioEmbedResource(context, finalData);\n        break;\n\n      case ResourceType.audioLink:\n        node = this.audioLinkResource(context, finalData);\n        break;\n\n      case ResourceType.video:\n      case ResourceType.previewVideo:\n        node = this.videoResource(context, finalData);\n        break;\n\n      case ResourceType.videoEmbed:\n        node = this.videoEmbedResource(context, finalData);\n        break;\n\n      case ResourceType.videoLink:\n        node = this.videoLinkResource(context, finalData);\n        break;\n\n      // case ResourceType.stillImageFilm: {\n      //   node = this.stillImageFilmResource({\n      //     image: this.imageResource(context,\n      //       finalData.image ?? {\n      //         format: '',\n      //         value: '',\n      //       },\n      //     ),\n      //     audio: this.audioResource(context,\n      //       finalData.audio ?? {\n      //         format: '',\n      //         value: '',\n      //       },\n      //     ),\n      //   });\n      //   break;\n      // }\n\n      case ResourceType.stillImageFilmEmbed:\n        node = this.stillImageFilmEmbedResource(context, finalData);\n        break;\n\n      case ResourceType.stillImageFilmLink:\n        node = this.stillImageFilmLinkResource(context, finalData);\n        break;\n\n      case ResourceType.article:\n        node = this.articleResource(context, finalData);\n        break;\n\n      case ResourceType.document:\n        node = this.documentResource(context, finalData);\n        break;\n\n      case ResourceType.documentEmbed:\n        node = this.documentEmbedResource(context, finalData);\n        break;\n\n      case ResourceType.documentLink:\n        node = this.documentLinkResource(context, finalData);\n        break;\n\n      case ResourceType.documentDownload:\n        node = this.documentDownloadResource(context, finalData);\n        break;\n\n      case ResourceType.appLink:\n        node = this.appLinkResource(context, finalData);\n        break;\n\n      case ResourceType.websiteLink:\n        node = this.websiteLinkResource(context, finalData);\n        break;\n\n      default:\n    }\n\n    return node;\n  }\n\n  /**\n   * Build imageResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  imageResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; //src\n      srcAlt?: string[];\n      src1x?: string;\n      src2x?: string;\n      src3x?: string;\n      src4x?: string;\n      width?: string | null;\n      height?: string | null;\n      alt?: string;\n      zoomDisabled?: boolean;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n    __typeAlias?: ResourceTypeType,\n  ): ImageResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      src1x,\n      src2x,\n      src3x,\n      src4x,\n      width,\n      height,\n      alt,\n      zoomDisabled,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n    const { bitType } = context;\n    let zoomDisabledDefault = false;\n\n    if (\n      Config.isOfBitType(bitType, [\n        BitType.imageSeparator,\n        BitType.pageBanner,\n        BitType.imagesLogoGrave,\n        BitType.prototypeImages,\n        BitType.extractorImage,\n      ])\n    ) {\n      zoomDisabledDefault = true;\n    }\n\n    // NOTE: Node order is important and is defined here\n    const node: ImageResourceWrapperJson = {\n      type: ResourceType.image,\n      __typeAlias: __typeAlias ?? ResourceType.image,\n      __configKey: resourceTypeToConfigKey(__typeAlias ?? ResourceType.image),\n      image: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        src: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        src1x: (src1x ?? undefined) as string,\n        src2x: (src2x ?? undefined) as string,\n        src3x: (src3x ?? undefined) as string,\n        src4x: (src4x ?? undefined) as string,\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        alt: alt ?? '',\n        zoomDisabled: zoomDisabled ?? zoomDisabledDefault,\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.image, {\n      ignoreFalse: ['zoomDisabled', 'showInIndex', 'selected'],\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['src', 'alt', 'license', 'copyright'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build imageLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  imageLinkResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      src1x?: string;\n      src2x?: string;\n      src3x?: string;\n      src4x?: string;\n      width?: string;\n      height?: string;\n      alt?: string;\n      zoomDisabled?: boolean;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): ImageLinkResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      src1x,\n      src2x,\n      src3x,\n      src4x,\n      width,\n      height,\n      alt,\n      zoomDisabled,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: ImageLinkResourceWrapperJson = {\n      type: ResourceType.imageLink,\n      __typeAlias: ResourceType.imageLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.imageLink),\n      imageLink: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        src1x: (src1x ?? undefined) as string,\n        src2x: (src2x ?? undefined) as string,\n        src3x: (src3x ?? undefined) as string,\n        src4x: (src4x ?? undefined) as string,\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        alt: alt ?? '',\n        zoomDisabled: zoomDisabled ?? false, // TODO: Default depends on the bit(!)\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.imageLink, {\n      ignoreFalse: ['zoomDisabled', 'showInIndex', 'selected'],\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build audioResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  audioResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; // src\n      srcAlt?: string[];\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): AudioResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      duration,\n      mute,\n      autoplay,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: AudioResourceWrapperJson = {\n      type: ResourceType.audio,\n      __typeAlias: ResourceType.audio,\n      __configKey: resourceTypeToConfigKey(ResourceType.audio),\n      audio: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        src: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.audio, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['src', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build audioEmbedResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  audioEmbedResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; // src\n      srcAlt?: string[];\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): AudioEmbedResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      duration,\n      mute,\n      autoplay,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: AudioEmbedResourceWrapperJson = {\n      type: ResourceType.audioEmbed,\n      __typeAlias: ResourceType.audioEmbed,\n      __configKey: resourceTypeToConfigKey(ResourceType.audioEmbed),\n      audioEmbed: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        src: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.audioEmbed, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['src', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build audioLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  audioLinkResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): AudioLinkResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      duration,\n      mute,\n      autoplay,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: AudioLinkResourceWrapperJson = {\n      type: ResourceType.audioLink,\n      __typeAlias: ResourceType.audioLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.audioLink),\n      audioLink: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.audioLink, {\n      // ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url' /*'alt', 'license', 'copyright'*/],\n      ignoreFalse: ['selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build videoResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  videoResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; // src\n      srcAlt?: string[];\n      width?: string;\n      height?: string;\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      alt?: string;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): VideoResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      width,\n      height,\n      duration,\n      mute,\n      autoplay,\n      allowSubtitles,\n      showSubtitles,\n      alt,\n      posterImage,\n      thumbnails,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: VideoResourceWrapperJson = {\n      type: ResourceType.video,\n      __typeAlias: ResourceType.video,\n      __configKey: resourceTypeToConfigKey(ResourceType.video),\n      video: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        src: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        allowSubtitles: (allowSubtitles ?? undefined) as boolean,\n        showSubtitles: (showSubtitles ?? undefined) as boolean,\n        alt: alt ?? '',\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n        // Have sub-chains so must be at end of chain\n        posterImage: (posterImage ?? undefined) as ImageResourceJson,\n        thumbnails: (thumbnails ?? undefined) as ImageResourceJson[],\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.video, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['src', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build videoEmbedResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  videoEmbedResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; // src\n      srcAlt?: string[];\n      width?: string;\n      height?: string;\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      alt?: string;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): VideoEmbedResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      width,\n      height,\n      duration,\n      mute,\n      autoplay,\n      allowSubtitles,\n      showSubtitles,\n      alt,\n      posterImage,\n      thumbnails,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: VideoEmbedResourceWrapperJson = {\n      type: ResourceType.videoEmbed,\n      __typeAlias: ResourceType.videoEmbed,\n      __configKey: resourceTypeToConfigKey(ResourceType.videoEmbed),\n      videoEmbed: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        allowSubtitles: (allowSubtitles ?? undefined) as boolean,\n        showSubtitles: (showSubtitles ?? undefined) as boolean,\n        alt: alt ?? '',\n        posterImage: (posterImage ?? undefined) as ImageResourceJson,\n        thumbnails: (thumbnails ?? undefined) as ImageResourceJson[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.videoEmbed, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['url', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build videoLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  videoLinkResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      width?: string;\n      height?: string;\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      alt?: string;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): VideoLinkResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      width,\n      height,\n      duration,\n      mute,\n      autoplay,\n      allowSubtitles,\n      showSubtitles,\n      alt,\n      posterImage,\n      thumbnails,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: VideoLinkResourceWrapperJson = {\n      type: ResourceType.videoLink,\n      __typeAlias: ResourceType.videoLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.videoLink),\n      videoLink: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        allowSubtitles: (allowSubtitles ?? undefined) as boolean,\n        showSubtitles: (showSubtitles ?? undefined) as boolean,\n        alt: alt ?? '',\n        posterImage: (posterImage ?? undefined) as ImageResourceJson,\n        thumbnails: (thumbnails ?? undefined) as ImageResourceJson[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.videoLink, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['url', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  // /**\n  //  * Build stillImageFilmResource node\n  //  *\n  //  * @param data - data for the node\n  //  * @returns\n  //  */\n  // stillImageFilmResource(context: BuildContext, data: { image?: ImageResource; audio?: AudioResource }): StillImageFilmResource {\n  //   const { image, audio } = data;\n\n  //   // NOTE: Node order is important and is defined here\n  //   const node: StillImageFilmResource = {\n  //     type: ResourceType.stillImageFilm,\n  //     __typeAlias: ResourceType.stillImageFilm,\n  //     image: image ?? this.imageResource({ format: '', value: '' }),\n  //     audio: audio ?? this.audioResource({ format: '', value: '' }),\n  //   };\n\n  //   // Remove Unset Optionals\n  //   ObjectUtils.removeUnwantedProperties(node);\n\n  //   // Validate and correct invalid bits as much as possible\n  //   return NodeValidator.validateResource(node) ;\n  // }\n\n  /**\n   * Build stillImageFilmEmbedResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  stillImageFilmEmbedResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; // src\n      srcAlt?: string[];\n      width?: string;\n      height?: string;\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      alt?: string;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): StillImageFilmEmbedResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      width,\n      height,\n      duration,\n      mute,\n      autoplay,\n      allowSubtitles,\n      showSubtitles,\n      alt,\n      posterImage,\n      thumbnails,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: StillImageFilmEmbedResourceWrapperJson = {\n      type: ResourceType.stillImageFilmEmbed,\n      __typeAlias: ResourceType.stillImageFilmEmbed,\n      __configKey: resourceTypeToConfigKey(ResourceType.stillImageFilmEmbed),\n      stillImageFilmEmbed: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        allowSubtitles: (allowSubtitles ?? undefined) as boolean,\n        showSubtitles: (showSubtitles ?? undefined) as boolean,\n        alt: alt ?? '',\n        posterImage: (posterImage ?? undefined) as ImageResourceJson,\n        thumbnails: (thumbnails ?? undefined) as ImageResourceJson[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.stillImageFilmEmbed, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['url', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build stillImageFilmLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  stillImageFilmLinkResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      width?: string;\n      height?: string;\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      alt?: string;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): StillImageFilmLinkResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      width,\n      height,\n      duration,\n      mute,\n      autoplay,\n      allowSubtitles,\n      showSubtitles,\n      alt,\n      posterImage,\n      thumbnails,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: StillImageFilmLinkResourceWrapperJson = {\n      type: ResourceType.stillImageFilmLink,\n      __typeAlias: ResourceType.stillImageFilmLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.stillImageFilmLink),\n      stillImageFilmLink: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        allowSubtitles: (allowSubtitles ?? undefined) as boolean,\n        showSubtitles: (showSubtitles ?? undefined) as boolean,\n        alt: alt ?? '',\n        posterImage: (posterImage ?? undefined) as ImageResourceJson,\n        thumbnails: (thumbnails ?? undefined) as ImageResourceJson[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.stillImageFilmLink, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['url', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build articleResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  articleResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      srcAlt?: string[];\n      value: string;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): ArticleResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: ArticleResourceWrapperJson = {\n      type: ResourceType.article,\n      __typeAlias: ResourceType.article,\n      __configKey: resourceTypeToConfigKey(ResourceType.article),\n      article: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        body: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.article, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['body', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build documentResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  documentResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): DocumentResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: DocumentResourceWrapperJson = {\n      type: ResourceType.document,\n      __typeAlias: ResourceType.document,\n      __configKey: resourceTypeToConfigKey(ResourceType.document),\n      document: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.document, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build documentEmbedResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  documentEmbedResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): DocumentEmbedResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: DocumentEmbedResourceWrapperJson = {\n      type: ResourceType.documentEmbed,\n      __typeAlias: ResourceType.documentEmbed,\n      __configKey: resourceTypeToConfigKey(ResourceType.documentEmbed),\n      documentEmbed: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.documentEmbed, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build documentLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  documentLinkResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): DocumentLinkResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: DocumentLinkResourceWrapperJson = {\n      type: ResourceType.documentLink,\n      __typeAlias: ResourceType.documentLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.documentLink),\n      documentLink: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.documentLink, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build documentDownloadResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  documentDownloadResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): DocumentDownloadResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: DocumentDownloadResourceWrapperJson = {\n      type: ResourceType.documentDownload,\n      __typeAlias: ResourceType.documentDownload,\n      __configKey: resourceTypeToConfigKey(ResourceType.documentDownload),\n      documentDownload: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.documentDownload, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build appLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  appLinkResource(\n    context: BuildContext,\n    data: {\n      value: string;\n      srcAlt?: string[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): AppLinkResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: AppLinkResourceWrapperJson = {\n      type: ResourceType.appLink,\n      __typeAlias: ResourceType.appLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.appLink),\n      appLink: {\n        // format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        // provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        provider: undefined as unknown as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.appLink, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build websiteLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  websiteLinkResource(\n    context: BuildContext,\n    data: {\n      value: string;\n      srcAlt?: string[];\n      siteName?: string;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): WebsiteLinkResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      /*siteName,*/ license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: WebsiteLinkResourceWrapperJson = {\n      type: ResourceType.websiteLink,\n      __typeAlias: ResourceType.websiteLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.websiteLink),\n      websiteLink: {\n        // provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        provider: undefined as unknown as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        // siteName,\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.websiteLink, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  //\n  //\n  //\n\n  //\n  // Private\n  //\n}\n\nexport { ResourceBuilder };\n","class UrlUtils {\n  fileExtensionFromUrl(url: string | undefined): string | undefined {\n    let format: string | undefined;\n\n    if (url) {\n      try {\n        const parsedUrl = new URL(url);\n        const pathParts = parsedUrl.pathname.split('.');\n        if (pathParts.length > 1) {\n          format = pathParts[pathParts.length - 1];\n        }\n      } catch (_e) {\n        // will return undefined\n      }\n    }\n\n    return format;\n  }\n\n  domainFromUrl(url: string | undefined): string | undefined {\n    let domain: string | undefined;\n\n    if (url) {\n      try {\n        const parsedUrl = new URL(url);\n        domain = parsedUrl.hostname;\n      } catch (_e) {\n        // will return undefined\n      }\n    }\n\n    return domain;\n  }\n}\n\nconst instance = new UrlUtils();\n\nexport { instance as UrlUtils };\n","import { type Bit, type CardBit } from '../../model/ast/Nodes.ts';\nimport { ResourceType } from '../../model/enum/ResourceType.ts';\nimport {\n  type AppLinkResourceWrapperJson,\n  type ArticleResourceWrapperJson,\n  type AudioEmbedResourceWrapperJson,\n  type AudioLinkResourceWrapperJson,\n  type AudioResourceWrapperJson,\n  type DocumentDownloadResourceWrapperJson,\n  type DocumentEmbedResourceWrapperJson,\n  type DocumentLinkResourceWrapperJson,\n  type DocumentResourceWrapperJson,\n  type ImageLinkResourceWrapperJson,\n  type ImageResourceWrapperJson,\n  type ResourceJson,\n  type StillImageFilmEmbedResourceWrapperJson,\n  type StillImageFilmLinkResourceWrapperJson,\n  type StillImageFilmResourceWrapperJson,\n  type VideoEmbedResourceWrapperJson,\n  type VideoLinkResourceWrapperJson,\n  type VideoResourceWrapperJson,\n  type WebsiteLinkResourceWrapperJson,\n} from '../../model/json/ResourceJson.ts';\nimport { StringUtils } from '../../utils/StringUtils.ts';\n\n/**\n * Validates a node as the builder level (i.e. when creating AST).\n *\n * This is not really implemented yet.\n * Validation happens in the bitmark parsing, but not when creating the AST.\n * This means that the JSON => bitmark conversion is not well validated yet.\n */\nclass NodeValidator {\n  validateBit(bit: Bit | undefined): Bit | undefined {\n    if (!bit) return bit;\n\n    // TODO\n    const ret: Bit | undefined = bit;\n    // switch (bit.bitType.root) {\n    //   case BitType.interview:\n    //     ret = this.validateInterviewBit(bit);\n    //     break;\n    // }\n\n    return ret;\n  }\n\n  validateCardBit(bit: CardBit | undefined): CardBit | undefined {\n    if (!bit) return bit;\n\n    const ret: CardBit | undefined = bit;\n    // TODO\n\n    return ret;\n  }\n\n  validateResource<T extends ResourceJson>(resource: T | undefined): T | undefined {\n    if (!resource) return undefined;\n\n    const ret: T | undefined = resource;\n    let valid = true;\n\n    switch (resource.type) {\n      case ResourceType.image: {\n        // case ResourceTag.imagePortrait:\n        // case ResourceTag.imageLandscape:\n        const imageResource = (resource as ImageResourceWrapperJson).image;\n        if (!StringUtils.isString(imageResource.src)) imageResource.src = '';\n        break;\n      }\n      case ResourceType.imageLink: {\n        const imageLink = (resource as ImageLinkResourceWrapperJson).imageLink;\n        if (!StringUtils.isString(imageLink.url)) imageLink.url = '';\n        break;\n      }\n      case ResourceType.audio: {\n        const audio = (resource as AudioResourceWrapperJson).audio;\n        if (!StringUtils.isString(audio.src)) audio.src = '';\n        break;\n      }\n      case ResourceType.audioEmbed: {\n        const audioEmbed = (resource as AudioEmbedResourceWrapperJson).audioEmbed;\n        if (!StringUtils.isString(audioEmbed.src)) audioEmbed.src = '';\n        break;\n      }\n      case ResourceType.audioLink: {\n        const audioLink = (resource as AudioLinkResourceWrapperJson).audioLink;\n        if (!StringUtils.isString(audioLink.url)) audioLink.url = '';\n        break;\n      }\n      case ResourceType.video: {\n        const video = (resource as VideoResourceWrapperJson).video;\n        if (!StringUtils.isString(video.src)) video.src = '';\n        break;\n      }\n      case ResourceType.videoEmbed: {\n        const videoEmbed = (resource as VideoEmbedResourceWrapperJson).videoEmbed;\n        if (!StringUtils.isString(videoEmbed.url)) videoEmbed.url = '';\n        break;\n      }\n      case ResourceType.videoLink: {\n        const videoLink = (resource as VideoLinkResourceWrapperJson).videoLink;\n        if (!StringUtils.isString(videoLink.url)) videoLink.url = '';\n        break;\n      }\n      case ResourceType.stillImageFilm: {\n        const stillImageFilm = resource as StillImageFilmResourceWrapperJson;\n        if (!StringUtils.isString(stillImageFilm.image.src)) stillImageFilm.image.src = '';\n        if (!StringUtils.isString(stillImageFilm.audio.src)) stillImageFilm.audio.src = '';\n        break;\n      }\n      case ResourceType.stillImageFilmEmbed: {\n        const stillImageFilmEmbed = (resource as StillImageFilmEmbedResourceWrapperJson)\n          .stillImageFilmEmbed;\n        if (!StringUtils.isString(stillImageFilmEmbed.url)) stillImageFilmEmbed.url = '';\n        break;\n      }\n      case ResourceType.stillImageFilmLink: {\n        const stillImageFilmLink = (resource as StillImageFilmLinkResourceWrapperJson)\n          .stillImageFilmLink;\n        if (!StringUtils.isString(stillImageFilmLink.url)) stillImageFilmLink.url = '';\n        break;\n      }\n      case ResourceType.article: {\n        const article = (resource as ArticleResourceWrapperJson).article;\n        if (!StringUtils.isString(article.body)) article.body = '';\n        break;\n      }\n      case ResourceType.document: {\n        const document = (resource as DocumentResourceWrapperJson).document;\n        if (!StringUtils.isString(document.url)) document.url = '';\n        break;\n      }\n      case ResourceType.documentEmbed: {\n        const documentEmbed = (resource as DocumentEmbedResourceWrapperJson).documentEmbed;\n        if (!StringUtils.isString(documentEmbed.url)) documentEmbed.url = '';\n        break;\n      }\n      case ResourceType.documentLink: {\n        const documentLink = (resource as DocumentLinkResourceWrapperJson).documentLink;\n        if (!StringUtils.isString(documentLink.url)) documentLink.url = '';\n        break;\n      }\n      case ResourceType.documentDownload: {\n        const documentDownload = (resource as DocumentDownloadResourceWrapperJson).documentDownload;\n        if (!StringUtils.isString(documentDownload.url)) documentDownload.url = '';\n        break;\n      }\n      case ResourceType.appLink: {\n        const appLink = (resource as AppLinkResourceWrapperJson).appLink;\n        if (!StringUtils.isString(appLink.url)) appLink.url = '';\n        break;\n      }\n      case ResourceType.websiteLink: {\n        const websiteLink = (resource as WebsiteLinkResourceWrapperJson).websiteLink;\n        if (!StringUtils.isString(websiteLink.url)) websiteLink.url = '';\n        break;\n      }\n\n      default:\n        valid = false;\n    }\n\n    // Note: even if resource is invalid, we still return it as it is used to set the resource attachment type\n    // in the bit declaration, and if it is removed completely this cannot be done.\n    if (!valid) {\n      if (resource.type) {\n        resource.__invalid = true;\n      }\n    }\n\n    return ret;\n  }\n\n  isRequired(val: unknown, name: string) {\n    if (val) return;\n    throw new Error(`${name} is required but is not set`);\n  }\n\n  isOneOfRequired(vals: unknown[], names: string[]) {\n    if (Array.isArray(vals)) {\n      for (const v of vals) {\n        if (v) return;\n      }\n    }\n\n    throw new Error(`One of '${names.join(', ')}' is required but none is set`);\n  }\n\n  isString(val: unknown, name: string) {\n    if (StringUtils.isString(val)) return;\n    throw new Error(`${name} is required to be a string`);\n  }\n\n  isNonEmptyString(val: unknown, name: string) {\n    if (StringUtils.isString(val) && val !== '') return;\n    throw new Error(`${name} is required to be a non-empty string`);\n  }\n\n  isStringOrBoolean(val: unknown, name: string) {\n    if (StringUtils.isString(val)) return;\n    if (val === true || val === false) return;\n    throw new Error(`${name} is required to be a string or a boolean`);\n  }\n\n  isNonEmptyStringOrBoolean(val: unknown, name: string) {\n    if (StringUtils.isString(val) && val !== '') return;\n    if (val === true || val === false) return;\n    throw new Error(`${name} is required to be a non-empty string or a boolean`);\n  }\n\n  isArray(val: unknown, name: string) {\n    if (Array.isArray(val)) return;\n    throw new Error(`${name} is required to be a array`);\n  }\n\n  isNonEmptyArray(val: unknown, name: string) {\n    if (Array.isArray(val) && val.length > 0) return;\n    throw new Error(`${name} is required to be a non-empty array`);\n  }\n\n  isNumber(val: unknown, name: string) {\n    if (Number.isFinite(val)) return;\n    throw new Error(`${name} is required to be a number`);\n  }\n\n  isBoolean(val: unknown, name: string) {\n    if (val === true || val === false) return;\n    throw new Error(`${name} is required to be a boolean`);\n  }\n\n  isStringOrNumberOrBooleanOrNullOrUndefined(val: unknown, name: string) {\n    if (StringUtils.isString(val)) return;\n    if (Number.isFinite(val)) return;\n    if (val === true || val === false) return;\n    if (val == null) return;\n    throw new Error(\n      `${name} is required to be a string or a number or a boolean or null or undefined`,\n    );\n  }\n\n  //\n  // private\n  //\n\n  // private validateInterviewBit(bit: Bit): Bit | undefined {\n  //   // Ensure bit has a questions array as the\n  //   // ===\n  //   // ===\n  //   // must be included in the markup\n  //   if (!bit.cardNode) {\n  //     bit.cardNode = {};\n  //   }\n\n  //   if (!bit.cardNode.questions) {\n  //     bit.cardNode.questions = [];\n  //   }\n\n  //   return bit;\n  // }\n}\n\nconst nodeValidator = new NodeValidator();\n\nexport { nodeValidator as NodeValidator };\n","import { type Writer } from './Writer.ts';\n\n/**\n * Writer to write to a string.\n */\nclass StringWriter implements Writer {\n  private _buffer: string[] | undefined;\n  private _string: string = '';\n  public endOfLineString = '\\n';\n  private lastWrite = '';\n\n  public get isSync() {\n    return true;\n  }\n\n  /**\n   * Get the string which has been written.\n   *\n   * This cannot be called until after close() has resolved its Promise.\n   *\n   * @returns\n   */\n  public getString(): string {\n    return this._string;\n  }\n\n  public async open(): Promise<void> {\n    this.openSync();\n    return Promise.resolve();\n  }\n\n  public async close(): Promise<void> {\n    try {\n      this.closeSync();\n    } catch (e) {\n      return Promise.reject(e);\n    }\n    return Promise.resolve();\n  }\n\n  public openSync(): void {\n    this._buffer = [];\n    this._string = '';\n  }\n\n  public closeSync(): void {\n    if (!this._buffer) {\n      throw new Error('open() or openSync() never called');\n    }\n    this._string = this._buffer.join('');\n    this._buffer = [];\n  }\n\n  public writeLine(value?: string): this {\n    if (!this._buffer) return this;\n\n    let line: string;\n\n    if (value != null) {\n      line = value + this.endOfLineString;\n    } else {\n      line = this.endOfLineString;\n    }\n\n    this._buffer.push(line);\n    this.lastWrite = line;\n\n    return this;\n  }\n\n  public writeLines(values: string[], delimiter?: string): this {\n    if (!this._buffer) return this;\n    if (!values) return this;\n    let str = '';\n\n    for (let i = 0, len = values.length; i < len; i++) {\n      const value = values[i];\n      this._buffer.push(value);\n      str += value;\n      if (delimiter && i < len - 1) {\n        this._buffer.push(delimiter);\n        str += delimiter;\n      }\n      this._buffer.push(this.endOfLineString);\n      str += this.endOfLineString;\n    }\n\n    this.lastWrite = str;\n\n    return this;\n  }\n\n  public write(value: string): this {\n    if (!this._buffer) return this;\n    if (value == null) return this;\n    if (value) this.lastWrite = value;\n    this._buffer.push(value);\n    return this;\n  }\n\n  public writeWhiteSpace(): this {\n    this.write(' ');\n    return this;\n  }\n\n  public getLastWrite(): string {\n    return this.lastWrite;\n  }\n}\n\nexport { StringWriter };\n","import { Enum, type EnumType } from '@ncoderz/superenum';\n\nimport { Ast } from './ast/Ast.ts';\nimport { Config } from './config/Config.ts';\nimport { type BitmarkOptions } from './generator/bitmark/BitmarkGenerator.ts';\nimport { BitmarkStringGenerator } from './generator/bitmark/BitmarkStringGenerator.ts';\nimport { type JsonOptions } from './generator/json/JsonGenerator.ts';\nimport { JsonObjectGenerator } from './generator/json/JsonObjectGenerator.ts';\n// import { TextFormat, TextFormatType } from './model/enum/TextFormat.ts';\nimport { TextGenerator } from './generator/text/TextGenerator.ts';\nimport { InfoBuilder, type SupportedBit } from './info/InfoBuilder.ts';\nimport { type BitmarkAst } from './model/ast/Nodes.ts';\nimport { BitmarkParserType, type BitmarkParserTypeType } from './model/enum/BitmarkParserType.ts';\nimport { BitmarkVersion, type BitmarkVersionType } from './model/enum/BitmarkVersion.ts';\nimport { InfoFormat, type InfoFormatType } from './model/info/enum/InfoFormat.ts';\nimport { InfoType, type InfoTypeType } from './model/info/enum/InfoType.ts';\nimport { BitmarkParser } from './parser/bitmark/BitmarkParser.ts';\nimport { JsonParser } from './parser/json/JsonParser.ts';\nimport { TextParser } from './parser/text/TextParser.ts';\nimport { env } from './utils/env/Env.ts';\n\n/*\n * NOTE:\n *\n * We want to be able to strip out the NodeJS specific functions from the final bundle.\n * Any code between the comments STRIP:START and STRIP:END will be removed.\n *\n * However, the prettifier will move comments that it does not believe are associated with code.\n *\n * Therefore we have to use some dummy code to prevent it from removing the STRIP stripping comments.\n */\nconst STRIP = 0;\n\n\nSTRIP; // eslint-disable-line @typescript-eslint/no-unused-expressions\n\n/**\n * Info options for the parser\n */\nexport interface InfoOptions {\n  /**\n   * Specify the type of information to return, overriding the default (list)\n   * - list: list of supported bits\n   * - deprecated: list of deprecated bits\n   * - all: list of supported bits and deprecated bits\n   * - bit: configuration for a specific bit, or all bits\n   */\n  type?: InfoTypeType;\n\n  /**\n   * Specify the bit type to return, overriding the default (all)\n   */\n  bit?: string;\n\n  /**\n   * Specify the output format, overriding the default (text)\n   */\n  outputFormat?: InfoFormatType;\n\n  /**\n   * Prettify the JSON.\n   *\n   * If not set or false, JSON will not be prettified.\n   * If true, JSON will be prettified with an indent of 2.\n   * If a positive integer, JSON will be prettified with an indent of this number.\n   *\n   * If prettify is set, a string will be returned if possible.\n   */\n  prettify?: boolean | number;\n}\n\n/**\n * Config generation options for the parser\n */\nexport interface GenerateConfigOptions {\n  //\n}\n\n/**\n * Conversion options for bitmark / JSON conversion\n */\nexport interface ConvertOptions {\n  /**\n   * The version of bitmark to output.\n   * If not specified, the version will be 3.\n   *\n   * Specifying the version will set defaults for other options.\n   * - Bitmark v2:\n   *   - bitmarkOptions.cardSetVersion: 1\n   *   - jsonOptions.textAsPlainText: true\n   * - Bitmark v3:\n   *   - bitmarkOptions.cardSetVersion: 2\n   *   - jsonOptions.textAsPlainText: false\n   *\n   */\n  bitmarkVersion?: BitmarkVersionType;\n\n  /**\n   * Specify the bitmark parser to use, overriding the default\n   */\n  bitmarkParserType?: BitmarkParserTypeType;\n\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n  /**\n   * Specify the output format, overriding the default\n   */\n  outputFormat?: OutputType;\n  /**\n   * Specify a file to write the output to\n   */\n  outputFile?: string;\n  /**\n   * Options for the output file\n   */\n  fileOptions?: FileOptions;\n  /**\n   * Options for bitmark generation\n   */\n  bitmarkOptions?: BitmarkOptions;\n  /**\n   * Options for JSON generation\n   */\n  jsonOptions?: JsonOptions;\n}\n\n/**\n * Prettify options for bitmark / JSON prettify / validate\n */\nexport interface UpgradeOptions {\n  /**\n   * The version of bitmark to output.\n   * If not specified, the version will be 3.\n   *\n   * Specifying the version will set defaults for other options.\n   * - Bitmark v2:\n   *   - bitmarkOptions.cardSetVersion: 1\n   *   - jsonOptions.textAsPlainText: true\n   * - Bitmark v3:\n   *   - bitmarkOptions.cardSetVersion: 2\n   *   - jsonOptions.textAsPlainText: false\n   *\n   */\n  bitmarkVersion?: BitmarkVersionType;\n\n  /**\n   * Specify the bitmark parser to use, overriding the default\n   */\n  bitmarkParserType?: BitmarkParserTypeType;\n\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n\n  /**\n   * Specify a file to write the output to\n   */\n  outputFile?: string;\n\n  /**\n   * Options for the output file\n   */\n  fileOptions?: FileOptions;\n\n  /**\n   * Options for bitmark generation\n   */\n  bitmarkOptions?: BitmarkOptions;\n\n  /**\n   * Options for JSON generation\n   */\n  jsonOptions?: JsonOptions;\n}\n\n/**\n * Conversion options for bitmark text / JSON conversion\n */\nexport interface ConvertTextOptions {\n  /**\n   * Specify the text format (default: bitmark++)\n   */\n  textFormat?: BodyTextFormatType;\n\n  /**\n   * Specify the text location (default: body)\n   */\n  textLocation?: TextLocationType;\n\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n\n  /**\n   * Specify a file to write the output to\n   */\n  outputFile?: string;\n\n  /**\n   * Options for the output file\n   */\n  fileOptions?: FileOptions;\n\n  /**\n   * Options for JSON generation\n   */\n  jsonOptions?: TextJsonOptions;\n}\n\n/**\n * Create AST options\n */\nexport interface CreateAstOptions {\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n}\n\nexport interface ExtractPlainTextOptions {\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail for certain inputs as the input formats can overlap\n   */\n  inputFormat?: InputFormatType;\n}\n\n/**\n * Breakscape options\n */\nexport interface BreakscapeOptions {\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n\n  /**\n   * Specify a file to write the output to\n   */\n  outputFile?: string;\n\n  /**\n   * Options for the output file\n   */\n  fileOptions?: FileOptions;\n\n  /**\n   * Specify the text format (default:  bitmark++)\n   */\n  textFormat?: BodyTextFormatType;\n\n  /**\n   * Specify the text location (default: body)\n   */\n  textLocation?: TextLocationType;\n}\n\n/**\n * Unbreakscape options\n */\nexport interface UnbreakscapeOptions {\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n\n  /**\n   * Specify a file to write the output to\n   */\n  outputFile?: string;\n\n  /**\n   * Options for the output file\n   */\n  fileOptions?: FileOptions;\n\n  /**\n   * Specify the text format (default: bitmark++)\n   */\n  textFormat?: BodyTextFormatType;\n\n  /**\n   * Specify the text location (default: body)\n   */\n  textLocation?: TextLocationType;\n}\n\n/**\n * Input type enumeration\n */\nconst Input = {\n  /**\n   * Input is as a string\n   */\n  string: 'string',\n\n  /**\n   * Input is as a file path\n   */\n  file: 'file',\n} as const;\n\nexport type InputType = EnumType<typeof Input>;\n\n/**\n * Output type enumeration\n */\nconst Output = {\n  /**\n   * Output bitmark string\n   */\n  bitmark: 'bitmark',\n\n  /**\n   * Output JSON as a plain JS object, or a file\n   */\n  json: 'json',\n\n  /**\n   * Output AST as a plain JS object, or a file\n   */\n  ast: 'ast',\n\n  /**\n   * Output plain text as a string, or a file\n   */\n  text: 'text',\n} as const;\n\nexport type OutputType = EnumType<typeof Output>;\n\n/**\n * Input format enumeration\n */\nconst InputFormat = {\n  /**\n   * Input is bitmark\n   */\n  bitmark: 'bitmark',\n\n  /**\n   * Input is bitmarkText\n   */\n  bitmarkText: 'bitmarkText',\n\n  /**\n   * Input is plain text\n   */\n  plainText: 'plainText',\n} as const;\n\nexport type InputFormatType = EnumType<typeof InputFormat>;\n\n/**\n * Options for bitmark text JSON generation\n */\nexport interface TextJsonOptions {\n  /**\n   * Prettify the JSON.\n   *\n   * If not set or false, JSON will not be prettified.\n   * If true, JSON will be prettified with an indent of 2.\n   * If a positive integer, JSON will be prettified with an indent of this number.\n   *\n   * If prettify is set, a string will be returned if possible.\n   */\n  prettify?: boolean | number;\n\n  /**\n   * Stringify the JSON.\n   *\n   * If not set or false, JSON will be returned as a plain JS object.\n   * It true, JSON will be stringified.\n   *\n   * If prettify is set, it will override this setting.\n   */\n  stringify?: boolean;\n\n  /**\n   * [development only]\n   * Generate debug information in the output.\n   */\n  debugGenerationInline?: boolean;\n}\n\n/**\n * Bitmark tool for manipulating bitmark in all its formats.\n *\n */\nclass BitmarkParserGenerator {\n  protected ast = new Ast();\n  protected jsonParser = new JsonParser();\n  protected bitmarkParser = new BitmarkParser();\n  protected textParser = new TextParser();\n  protected textGenerator = new TextGenerator();\n\n  /**\n   * Get the version of the bitmark-parser-generator library\n   */\n  public version(): string {\n    return env.appVersion.full;\n  }\n\n  /**\n   * Get information about the bitmark-parser-generator library\n   */\n  public info(options?: InfoOptions): unknown {\n    const opts: InfoOptions = Object.assign({}, options);\n    const builder = new InfoBuilder();\n    let res: unknown;\n    const outputString = !opts.outputFormat || opts.outputFormat === InfoFormat.text;\n    const outputJson = opts.outputFormat === InfoFormat.json;\n    const all = opts.type === InfoType.all;\n    const deprecated = opts.type === InfoType.deprecated;\n    const includeNonDeprecated = all || !deprecated;\n    const includeDeprecated = all || deprecated;\n\n    if (opts.type === InfoType.bit) {\n      const bitConfigs = builder.getSupportedBitConfigs().filter((b) => {\n        if (!opts.bit) return true;\n        const bitType = Config.getBitType(opts.bit);\n        return bitType === b.bitType;\n      });\n      if (outputString) {\n        res = bitConfigs\n          .map((b) =>\n            b.toString({\n              includeChains: true,\n              includeConfigs: true,\n            }),\n          )\n          .join('\\n\\n--------------\\n\\n');\n      } else {\n        res = bitConfigs;\n      }\n    } else {\n      // List / List Deprecated\n      const supportedBits = builder\n        .getSupportedBits({\n          includeNonDeprecated,\n          includeDeprecated,\n        })\n        .filter((b) => {\n          if (!opts.bit) return true;\n          const bitType = Config.getBitType(opts.bit);\n          if (b.name === bitType) return true;\n        });\n      if (outputString) {\n        res = this.supportedBitsAsString(supportedBits);\n      } else {\n        res = supportedBits;\n      }\n    }\n\n    if (outputJson) {\n      const prettifySpace = opts.prettify === true ? 2 : opts.prettify || undefined;\n      res = JSON.stringify(res, null, prettifySpace);\n    }\n\n    return res;\n  }\n\n  /**\n   * Generate the new configuration for the bitmark parser.\n   */\n  public generateConfig(options?: GenerateConfigOptions): void {\n    const opts: GenerateConfigOptions = Object.assign({}, options);\n    const builder = new ConfigBuilder();\n    // let res: unknown;\n    // const outputString = !opts.outputFormat || opts.outputFormat === InfoFormat.text;\n    // const outputJson = opts.outputFormat === InfoFormat.json;\n    // const all = opts.type === InfoType.all;\n    // const deprecated = opts.type === InfoType.deprecated;\n    // const includeNonDeprecated = all || !deprecated;\n    // const includeDeprecated = all || deprecated;\n\n    builder.build(opts);\n  }\n\n  /**\n   * Convert bitmark from bitmark to JSON, or JSON to bitmark.\n   *\n   * Input type is detected automatically and may be:\n   * - string: bitmark, JSON, or AST\n   * - object: JSON or AST\n   * - file: bitmark, JSON, or AST\n   *\n   * Output type is selected automatically based on input type detection:\n   * - input(JSON/AST) ==> output(bitmark)\n   * - input(bitmark)  ==> output(JSON)\n   *\n   * Output type can be overridden to one of the following:\n   * - bitmark: output bitmark string\n   * - json: output JSON as a plain JS object, or a file\n   * - ast: output AST as a plain JS object, or a file\n   * - text: output plain text as a string, or a file\n   *\n   * By default, the result is returned as a string for bitmark, or a plain JS object for JSON/AST.\n   *\n   * The options can be used to write the output to a file and to set conversion options or override defaults.\n   *\n   * If both the input and output formats are the same, the input will be validated and rewritten.\n   * This feature be used to upgrade bitmark or JSON to the latest version.\n   *\n   * @param input - bitmark or JSON or AST as a string, JSON or AST as plain JS object, or path to a file containing\n   * bitmark, JSON, or AST.\n   * @param options - the conversion options\n   * @returns A string if converting to bitmark, a plain JS object if converting to JSON, or\n   * void if writing to a file\n   * @throws Error if any error occurs\n   */\n  public convert(input: string | unknown, options?: ConvertOptions): string | unknown | void {\n    let res: string | unknown | void;\n    const opts: ConvertOptions = Object.assign({}, options);\n    // const fileOptions = Object.assign({}, opts.fileOptions);\n    // const bitmarkOptions = Object.assign({}, opts.bitmarkOptions);\n    const jsonOptions = Object.assign({}, opts.jsonOptions);\n\n    const outputFormat = opts.outputFormat;\n    const outputBitmark = outputFormat === Output.bitmark;\n    const outputJson = outputFormat === Output.json;\n    const outputAst = outputFormat === Output.ast;\n    const outputText = outputFormat === Output.text;\n    const bitmarkParserType = BitmarkParserType.peggy; // Option is no longer used as only Peggy parser supported\n\n    let inStr: string = input as string;\n    const inputIsString = typeof input === 'string';\n\n    // Check if we are trying to write to a file in the browser\n    if (env.isBrowser && opts.outputFile) {\n      throw new Error('Cannot write to file in browser environment');\n    }\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          });\n        }\n      }\n    }\n\n    // Preprocess as AST to see if AST\n    let ast = this.ast.preprocessAst(inStr);\n    const isAst = !!ast;\n\n    if (!isAst) {\n      // Not AST, so process as JSON to see if we have JSON\n      ast = this.jsonParser.toAst(inStr);\n    }\n    const isJson = !!ast?.bits;\n    const isBitmark = inputIsString && !isJson && !isAst; // Assume bitmark since not AST or JSON\n\n    // Helper conversion functions\n    const bitmarkToBitmark = (bitmarkStr: string) => {\n      // Validate and prettify\n      bitmarkToAst(bitmarkStr);\n      astToBitmark(res as BitmarkAst);\n    };\n\n    const bitmarkToAst = (bitmarkStr: string) => {\n      res = this.bitmarkParser.toAst(bitmarkStr, {\n        parserType: bitmarkParserType,\n      });\n    };\n\n    const bitmarkToJson = (bitmarkStr: string) => {\n      if (bitmarkParserType === BitmarkParserType.peggy) {\n        // Convert the bitmark to JSON using the peggy parser (aways true, only peggy parser supported)\n\n        // Generate AST from the Bitmark markup\n        ast = this.bitmarkParser.toAst(bitmarkStr, {\n          parserType: bitmarkParserType,\n        });\n\n        // Convert the AST to JSON\n        if (opts.outputFile) {\n          // Write JSON file\n          const generator = new JsonFileGenerator(opts.outputFile, opts);\n          generator.generateSync(ast);\n        } else {\n          // Generate JSON object\n          const generator = new JsonObjectGenerator(opts);\n          const json = generator.generateSync(ast);\n\n          // Return JSON as object or string depending on prettify/stringify option\n          res = this.jsonStringifyPrettify(json, jsonOptions);\n        }\n      }\n    };\n\n    const bitmarkToText = (bitmarkStr: string) => {\n      // Generate AST from the Bitmark markup\n      ast = this.bitmarkParser.toAst(bitmarkStr, {\n        parserType: bitmarkParserType,\n      });\n\n      // Generate JSON object\n      const jsonGenerator = new JsonObjectGenerator(opts);\n      const json = jsonGenerator.generateSync(ast);\n\n      const textGenerator = new PlainTextGenerator();\n\n      const str = textGenerator.generate(json);\n\n      if (opts.outputFile) {\n        // Write res to file\n        fs.writeFileSync(opts.outputFile, str as string, {\n          encoding: 'utf8',\n        });\n      } else {\n        res = str;\n      }\n    };\n\n    const astToBitmark = (astJson: BitmarkAst) => {\n      // Convert the AST to bitmark\n      if (opts.outputFile) {\n        // Write markup file\n        const generator = new BitmarkFileGenerator(opts.outputFile, opts);\n        generator.generateSync(astJson);\n      } else {\n        // Generate markup string\n        const generator = new BitmarkStringGenerator(opts);\n        res = generator.generateSync(astJson);\n      }\n    };\n\n    const astToAst = (astJson: BitmarkAst) => {\n      // Return JSON as object or string depending on prettify/stringify option\n      res = this.jsonStringifyPrettify(astJson, jsonOptions);\n    };\n\n    const astToJson = (astJson: BitmarkAst) => {\n      // Convert the AST to JSON\n      if (opts.outputFile) {\n        // Write JSON file\n        const generator = new JsonFileGenerator(opts.outputFile, opts);\n        generator.generateSync(astJson);\n      } else {\n        // Generate JSON object\n        const generator = new JsonObjectGenerator(opts);\n        const json = generator.generateSync(astJson);\n\n        // Return JSON as object or string depending on prettify/stringify option\n        res = this.jsonStringifyPrettify(json, jsonOptions);\n      }\n    };\n\n    const astToText = (astJson: BitmarkAst) => {\n      // Generate JSON object\n      const jsonGenerator = new JsonObjectGenerator(opts);\n      const json = jsonGenerator.generateSync(astJson);\n\n      const textGenerator = new PlainTextGenerator();\n\n      const str = textGenerator.generate(json);\n\n      if (opts.outputFile) {\n        // Write res to file\n        fs.writeFileSync(opts.outputFile, str as string, {\n          encoding: 'utf8',\n        });\n      } else {\n        res = str;\n      }\n    };\n\n    const jsonToBitmark = (astJson: BitmarkAst) => {\n      // We already have the ast from detecting the input type, so use the AST we already have\n\n      // Convert the JSON to bitmark\n      if (opts.outputFile) {\n        // Write markup file\n        const generator = new BitmarkFileGenerator(opts.outputFile, opts);\n        generator.generateSync(astJson);\n      } else {\n        // Generate markup string\n        const generator = new BitmarkStringGenerator(opts);\n        res = generator.generateSync(astJson);\n      }\n    };\n\n    const jsonToAst = (astJson: BitmarkAst) => {\n      // We already have the ast from detecting the input type, so just return the AST we already have\n\n      // Return JSON as object or string depending on prettify/stringify option\n      res = this.jsonStringifyPrettify(astJson, jsonOptions);\n    };\n\n    const jsonToText = (astJson: BitmarkAst) => {\n      // Generate JSON object\n      const jsonGenerator = new JsonObjectGenerator(opts);\n      const json = jsonGenerator.generateSync(astJson);\n\n      const textGenerator = new PlainTextGenerator();\n\n      const str = textGenerator.generate(json);\n\n      if (opts.outputFile) {\n        // Write res to file\n        fs.writeFileSync(opts.outputFile, str as string, {\n          encoding: 'utf8',\n        });\n      } else {\n        res = str;\n      }\n    };\n\n    const jsonToJson = (astJson: BitmarkAst) => {\n      // Validate and prettify\n      astToJson(astJson);\n    };\n\n    // Convert\n    if (isBitmark) {\n      // Input was Bitmark\n      if (outputBitmark) {\n        // Bitmark ==> Bitmark\n        bitmarkToBitmark(inStr);\n      } else if (outputAst) {\n        // Bitmark ==> AST\n        bitmarkToAst(inStr);\n      } else if (outputText) {\n        // Bitmark ==> Plain text\n        bitmarkToText(inStr);\n      } else {\n        // Bitmark ==> JSON\n        bitmarkToJson(inStr);\n      }\n    } else if (isAst) {\n      // Input was AST\n      ast = ast as BitmarkAst;\n      if (outputAst) {\n        // AST ==> AST\n        astToAst(ast);\n      } else if (outputJson) {\n        // AST ==> JSON\n        astToJson(ast);\n      } else if (outputText) {\n        // AST ==> Plain text\n        astToText(ast);\n      } else {\n        // AST ==> Bitmark\n        astToBitmark(ast);\n      }\n    } else if (isJson) {\n      // Input was JSON\n      ast = ast as BitmarkAst;\n      if (outputJson) {\n        // JSON ==> JSON\n        jsonToJson(ast);\n      } else if (outputAst) {\n        // JSON ==> AST\n        jsonToAst(ast);\n      } else if (outputText) {\n        // JSON ==> Plain text\n        jsonToText(ast);\n      } else {\n        // JSON ==> Bitmark\n        jsonToBitmark(ast);\n      }\n    } else {\n      // Input was not recognised, return an empty string\n      res = '';\n    }\n\n    return res;\n  }\n\n  /**\n   * Upgrade bitmark or JSON, upgrading to the latest supported syntax, removing unrecognised data in the process.\n   *\n   * THIS FEATURE SHOULD BE USED WITH CAUTION. IT WILL POTENTIALLY DELETE DATA.\n   *\n   * Input type is detected automatically and may be:\n   * - string: bitmark, JSON\n   * - object: JSON\n   * - file: bitmark, JSON\n   *\n   * Output type is the same as the detected input type\n   *\n   * By default, the result is returned as a string for bitmark, or a plain JS object for JSON.\n   *\n   * The options can be used to write the output to a file and to set conversion options or override defaults.\n   *\n   * If both the input and output formats are the same, the input will be validated and rewritten.\n   *\n   * @param input - bitmark or JSON or AST as a string, JSON or AST as plain JS object, or path to a file containing\n   * bitmark, JSON, or AST.\n   * @param options - the conversion options\n   * @returns Promise that resolves to string if upgrading to bitmark, a plain JS object if converting to JSON, or\n   * void if writing to a file\n   * @throws Error if any error occurs\n   */\n  public upgrade(input: string | unknown, options?: UpgradeOptions): string | unknown | void {\n    let res: string | unknown | void;\n    const opts: UpgradeOptions = Object.assign({}, options);\n    // const fileOptions = Object.assign({}, opts.fileOptions);\n    // const bitmarkOptions = Object.assign({}, opts.bitmarkOptions);\n    const jsonOptions = Object.assign({}, opts.jsonOptions);\n\n    const bitmarkParserType = opts.bitmarkParserType;\n\n    let inStr: string = input as string;\n    const inputIsString = typeof input === 'string';\n\n    // Check if we are trying to write to a file in the browser\n    if (env.isBrowser && opts.outputFile) {\n      throw new Error('Cannot write to file in browser environment');\n    }\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          });\n        }\n      }\n    }\n\n    // Process as JSON to see if we have JSON\n    let ast = this.jsonParser.toAst(inStr);\n\n    const isJson = !!ast?.bits;\n    const isBitmark = inputIsString && !isJson; // Assume bitmark since not JSON\n\n    // Helper conversion functions\n    const bitmarkToBitmark = (bitmarkStr: string) => {\n      // Validate and upgrade\n      const astJson = this.bitmarkParser.toAst(bitmarkStr, {\n        parserType: bitmarkParserType,\n      });\n\n      // Convert the AST to bitmark\n      if (opts.outputFile) {\n        // Write markup file\n        const generator = new BitmarkFileGenerator(opts.outputFile, opts);\n        generator.generateSync(astJson);\n      } else {\n        // Generate markup string\n        const generator = new BitmarkStringGenerator(opts);\n        res = generator.generateSync(astJson);\n      }\n    };\n\n    const jsonToJson = (astJson: BitmarkAst) => {\n      // Validate and upgrade\n\n      // Convert the AST to JSON\n      if (opts.outputFile) {\n        // Write JSON file\n        const generator = new JsonFileGenerator(opts.outputFile, opts);\n        generator.generateSync(astJson);\n      } else {\n        // Generate JSON object\n        const generator = new JsonObjectGenerator(opts);\n        const json = generator.generateSync(astJson);\n\n        // Return JSON as object or string depending on prettify/stringify option\n        res = this.jsonStringifyPrettify(json, jsonOptions);\n      }\n    };\n\n    // Validate and Upgrade\n    if (isBitmark) {\n      // Bitmark ==> Bitmark\n      bitmarkToBitmark(inStr);\n    } else if (isJson) {\n      // JSON ==> JSON\n      ast = ast as BitmarkAst;\n      jsonToJson(ast);\n    } else {\n      // Input was not recognised\n      return;\n    }\n\n    return res;\n  }\n\n  /**\n   * Create a bitmark AST (Abstract Syntax Tree) from bitmark or JSON or AST\n   *\n   * Input type is detected automatically and may be string, object (JSON or AST), or file\n   *\n   * @param input the JSON or bitmark to convert to a bitmark AST\n   * @param options - the create AST options\n   * @returns bitmark AST\n   * @throws Error if any error occurs\n   */\n  public createAst(input: unknown, options?: CreateAstOptions): BitmarkAst {\n    let res: BitmarkAst;\n    let inStr: string = input as string;\n    const inputIsString = typeof input === 'string';\n    const opts: CreateAstOptions = Object.assign({}, options);\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          });\n        }\n      }\n    }\n\n    // Preprocess as AST to see if AST\n    let ast = this.ast.preprocessAst(inStr);\n    const isAst = !!ast;\n\n    if (!isAst) {\n      // Not AST, so process as JSON to see if we have JSON\n      ast = this.jsonParser.toAst(inStr);\n    }\n    const isJson = !!ast?.bits;\n    const isBitmark = inputIsString && !isJson && !isAst; // Assume bitmark since not AST or JSON\n\n    if (isBitmark) {\n      // Bitmark ==> AST\n      res = this.bitmarkParser.toAst(inStr);\n    } else if (isJson) {\n      // JSON / AST ==> AST\n      res = ast as BitmarkAst;\n    } else {\n      // Input was not recognised, return an empty AST\n      res = {};\n    }\n\n    return res;\n  }\n\n  /**\n   * Convert bitmark text to JSON, or JSON to bitmark text.\n   *\n   * Input type is detected automatically and may be:\n   * - string: bitmark text or JSON\n   * - object: JSON\n   * - file: bitmark text or JSON\n   *\n   * Output type is selected automatically based on input type detection:\n   * - input(JSON) ==> output(bitmark text)\n   * - input(bitmark text)  ==> output(JSON)\n   *\n   * By default, the result is returned as a string for bitmark text, or a plain JS object for JSON.\n   *\n   * The options can be used to write the output to a file and to set conversion options or override defaults.\n   *\n   * @param input - bitmark text or JSON as a string, JSON as plain JS object, or path to a file containing\n   * bitmark text or JSON.\n   * @param options - the conversion options\n   * @returns Promise that resolves to string if converting to bitmark text, a plain JS object if converting to JSON, or\n   * void if writing to a file\n   * @throws Error if any error occurs\n   */\n  public convertText(\n    input: string | unknown,\n    options?: ConvertTextOptions,\n  ): string | unknown | void {\n    let res: string | unknown | void;\n    let preRes: string | unknown | void;\n    const opts: ConvertTextOptions = Object.assign({}, options);\n    const fileOptions = Object.assign({}, opts.fileOptions);\n    const jsonOptions = Object.assign({}, opts.jsonOptions);\n    const textFormat: TextFormatType =\n      Enum(TextFormat).fromValue(opts.textFormat) ?? TextFormat.bitmarkText;\n    const textLocation = opts.textLocation ?? TextLocation.body;\n\n    let inStr: string = input as string;\n    const inputIsString = typeof input === 'string';\n\n    // Check if we are trying to write to a file in the browser\n    if (env.isBrowser && opts.outputFile) {\n      throw new Error('Cannot write to file in browser environment');\n    }\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          });\n        }\n      }\n    }\n\n    // Preprocess as text AST to see if text AST\n    const ast = this.textParser.preprocessAst(inStr);\n    const isAst = !!ast;\n\n    if (!isAst) {\n      preRes = this.textParser.toAst(inStr, {\n        format: textFormat,\n        location: TextLocation.body,\n      });\n    } else {\n      preRes = this.textGenerator.generateSync(ast, textFormat, textLocation);\n    }\n\n    if (opts.outputFile) {\n      const output = opts.outputFile.toString();\n      let strRes: string = preRes as string;\n      if (!isAst) {\n        strRes = this.jsonStringifyPrettify(preRes, jsonOptions, true) as string;\n      }\n\n      // Write JSON to file\n      const flag = fileOptions.append ? 'a' : 'w';\n      fs.ensureDirSync(path.dirname(output));\n      fs.writeFileSync(output, strRes, {\n        flag,\n      });\n    } else {\n      if (!isAst) {\n        res = this.jsonStringifyPrettify(preRes, jsonOptions) as string;\n      } else {\n        res = preRes;\n      }\n    }\n\n    return res;\n  }\n\n  public extractPlainText(input: string | unknown, options?: ExtractPlainTextOptions): string {\n    const dataIn: unknown = input;\n    const inputFormat = options?.inputFormat;\n    const isString = typeof input === 'string';\n\n    let data: unknown;\n\n    // Parse the input automatically, trying to detect if it's JSON, bitmark, or bitmark text, in that order\n    const parseAutomatically = (): unknown => {\n      let dataOut: unknown = dataIn;\n      if (typeof dataIn === 'string') {\n        try {\n          dataOut = JSON.parse(dataIn);\n        } catch (_e) {\n          // Not valid JSON – treat as bitmark, then bitmark text\n          let isBitmark = false;\n          const bitmarkData = this.convert(dataIn, {\n            outputFormat: Output.json,\n          }) as BitWrapperJson[];\n          if (bitmarkData.length > 0) {\n            const isError = bitmarkData[0].bit.type === BitType._error;\n            if (!isError) {\n              isBitmark = true;\n              dataOut = bitmarkData;\n            }\n          }\n          if (!isBitmark) {\n            // Not bitmark, so treat as bitmark text\n            dataOut = this.convertText(dataIn, {\n              textFormat: TextFormat.bitmarkText,\n            });\n          }\n        }\n      }\n      return dataOut;\n    };\n\n    // Parse the input based on the specified input format, or automatically if not specified\n    if (inputFormat === InputFormat.bitmark) {\n      data = this.convert(dataIn, {\n        outputFormat: Output.json,\n      }) as BitWrapperJson[];\n    } else if (inputFormat === InputFormat.bitmarkText) {\n      data = this.convertText(dataIn, {\n        textFormat: TextFormat.bitmarkText,\n      });\n    } else if (inputFormat === InputFormat.plainText) {\n      if (isString) data = String(input);\n    } else {\n      data = parseAutomatically();\n    }\n\n    // Convert the data to plain text\n    const generator = new PlainTextGenerator();\n    const res = generator.generate(data);\n\n    return res;\n  }\n\n  /**\n   * Breakscape bitmark text.\n   *\n   * Input type is detected automatically and may be:\n   * - string: text\n   * - file: path to a file containing text\n   *\n   * By default, the result is returned as a string.\n   * By default, the text is breakscaped as if it was bitmark text in the body.\n   * Use the options to change this behaviour.\n   *\n   * The options can be used to write the output to a file.\n   *\n   * @param input - text, or path to a file containing text.\n   * @param options - the conversion options\n   * @returns breakscaped string, or void if writing to a file\n   * @throws Error if any error occurs\n   */\n  public breakscapeText(input: string, options?: BreakscapeOptions): string | void {\n    if (!input) return input;\n\n    const opts: BreakscapeOptions = Object.assign({}, options);\n    const fileOptions = Object.assign({}, opts.fileOptions);\n    const textFormat: TextFormatType =\n      Enum(TextFormat).fromValue(opts.textFormat) ?? TextFormat.bitmarkText;\n    const textLocation = opts.textLocation ?? TextLocation.body;\n\n    let inStr: string = input as string;\n    const inputIsString = typeof input === 'string';\n\n    // Check if we are trying to write to a file in the browser\n    if (env.isBrowser && opts.outputFile) {\n      throw new Error('Cannot write to file in browser environment');\n    }\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          });\n        }\n      }\n    }\n\n    // Do the breakscape\n    const res = Breakscape.breakscape(inStr, {\n      format: textFormat,\n      location: textLocation,\n    });\n\n    if (opts.outputFile) {\n      const output = opts.outputFile.toString();\n\n      // Write JSON to file\n      const flag = fileOptions.append ? 'a' : 'w';\n      fs.ensureDirSync(path.dirname(output));\n      fs.writeFileSync(output, res, {\n        flag,\n      });\n    } else {\n      return res;\n    }\n  }\n\n  /**\n   * Unescape (unbreakscape) bitmark text\n   *\n   * Input type is detected automatically and may be:\n   * - string: text\n   * - file: path to a file containing text\n   *\n   * By default, the result is returned as a string.\n   * By default, the text is unbreakscaped as if it was bitmark text in the body.\n   * Use the options to change this behaviour.\n   *\n   * The options can be used to write the output to a file.\n   *\n   * @param input - text, or path to a file containing text.\n   * @param options - the conversion options\n   * @returns unbreakscaped string, or void if writing to a file\n   * @throws Error if any error occurs\n   */\n  public unbreakscapeText(input: string, options?: UnbreakscapeOptions): string | void {\n    if (!input) return input;\n\n    const opts: UnbreakscapeOptions = Object.assign({}, options);\n    const fileOptions = Object.assign({}, opts.fileOptions);\n    const textFormat: TextFormatType =\n      Enum(TextFormat).fromValue(opts.textFormat) ?? TextFormat.bitmarkText;\n    const textLocation = opts.textLocation ?? TextLocation.body;\n\n    let inStr: BreakscapedString = input as BreakscapedString;\n    const inputIsString = typeof input === 'string';\n\n    // Check if we are trying to write to a file in the browser\n    if (env.isBrowser && opts.outputFile) {\n      throw new Error('Cannot write to file in browser environment');\n    }\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          }) as BreakscapedString;\n        }\n      }\n    }\n\n    // Do the unbreakscape\n    const res = Breakscape.unbreakscape(inStr, {\n      format: textFormat,\n      location: textLocation,\n    });\n\n    if (opts.outputFile) {\n      const output = opts.outputFile.toString();\n\n      // Write JSON to file\n      const flag = fileOptions.append ? 'a' : 'w';\n      fs.ensureDirSync(path.dirname(output));\n      fs.writeFileSync(output, res, {\n        flag,\n      });\n    } else {\n      return res;\n    }\n\n    return;\n  }\n\n  public textAstToPlainText(textAst: TextAst, _options?: ExtractPlainTextOptions): string {\n    const textGenerator = new TextGenerator(BitmarkVersion.v3, {\n      //\n    });\n\n    const res = textGenerator.generateSync(textAst, TextFormat.bitmarkText, TextLocation.body, {\n      noBreakscaping: true,\n      noMarkup: true,\n    });\n\n    return res;\n  }\n\n  /**\n   * Stringify / prettify a plain JS object to a JSON string, depending on the JSON options\n   *\n   * @param json\n   * @param options\n   * @param forceStringify\n   * @returns\n   */\n  private jsonStringifyPrettify = (\n    json: unknown,\n    options: JsonOptions,\n    forceStringify?: boolean,\n  ): unknown => {\n    const prettifySpace = options.prettify === true ? 2 : options.prettify || undefined;\n    const stringify = forceStringify || options.stringify === true || prettifySpace !== undefined;\n\n    if (stringify) {\n      return JSON.stringify(json, null, prettifySpace);\n    }\n    return json;\n  };\n\n  /**\n   * Get the supported bits as a formatted strings\n   *\n   * @param supportedBits\n   * @returns\n   */\n  private supportedBitsAsString(supportedBits: SupportedBit[]): string {\n    let res = '';\n\n    for (const rootBit of supportedBits) {\n      res += `${rootBit.name} (since: ${rootBit.since}`;\n      if (rootBit.deprecated) res += `, deprecated: ${rootBit.deprecated}`;\n      res += ')\\n';\n    }\n\n    return res;\n  }\n}\n\nexport { BitmarkParserGenerator, Input, InputFormat, Output };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Ast, type NodeInfo } from '../../ast/Ast.ts';\nimport { StringWriter } from '../../ast/writer/StringWriter.ts';\nimport { type Writer } from '../../ast/writer/Writer.ts';\nimport { Breakscape } from '../../breakscaping/Breakscape.ts';\nimport { Config } from '../../config/Config.ts';\nimport { type BreakscapedString } from '../../model/ast/BreakscapedString.ts';\nimport {\n  type Bit,\n  type BitmarkAst,\n  type Body,\n  type BodyPart,\n  type Footer,\n} from '../../model/ast/Nodes.ts';\nimport { NodeType } from '../../model/ast/NodeType.ts';\nimport { type JsonText, type TextAst } from '../../model/ast/TextNodes.ts';\nimport {\n  ConfigKey,\n  configKeyToPropertyType,\n  configKeyToResourceType,\n} from '../../model/config/enum/ConfigKey.ts';\nimport type { PropertyTagConfig } from '../../model/config/PropertyTagConfig.ts';\nimport {\n  BitmarkVersion,\n  type BitmarkVersionType,\n  DEFAULT_BITMARK_VERSION,\n} from '../../model/enum/BitmarkVersion.ts';\nimport { BitType, type BitTypeType } from '../../model/enum/BitType.ts';\nimport { BodyBitType } from '../../model/enum/BodyBitType.ts';\nimport { CardSetVersion, type CardSetVersionType } from '../../model/enum/CardSetVersion.ts';\nimport { PropertyKey } from '../../model/enum/PropertyKey.ts';\nimport { ResourceType, type ResourceTypeType } from '../../model/enum/ResourceType.ts';\nimport { TagFormat, type TagFormatType } from '../../model/enum/TagFormat.ts';\nimport { TextFormat, type TextFormatType } from '../../model/enum/TextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../../model/enum/TextLocation.ts';\nimport {\n  type BookJson,\n  type ChoiceJson,\n  type FeedbackChoiceJson,\n  type GroupTagJson,\n  type ImageSourceJson,\n  type IngredientJson,\n  type MarkConfigJson,\n  type PersonJson,\n  type PronunciationTableCellJson,\n  type RatingLevelStartEndJson,\n  type ResponseJson,\n  type ServingsJson,\n  type StatementJson,\n  type TableCellJson,\n  type TableExtendedJson,\n  type TableJson,\n  type TableRowJson,\n  type TableSectionJson,\n  type TechnicalTermJson,\n} from '../../model/json/BitJson.ts';\nimport {\n  type BodyBitJson,\n  type GapJson,\n  type HighlightTextJson,\n  type MarkJson,\n  type SelectOptionJson,\n} from '../../model/json/BodyBitJson.ts';\nimport {\n  type AudioResourceWrapperJson,\n  type ImageResourceJson,\n  type ImageResourceWrapperJson,\n  type ResourceDataJson,\n  type ResourceJson,\n} from '../../model/json/ResourceJson.ts';\nimport { normalizeTableFormat } from '../../parser/json/TableUtils.ts';\nimport { BooleanUtils } from '../../utils/BooleanUtils.ts';\nimport { ObjectUtils } from '../../utils/ObjectUtils.ts';\nimport { StringUtils } from '../../utils/StringUtils.ts';\nimport { AstWalkerGenerator } from '../AstWalkerGenerator.ts';\nimport { type GenerateOptions, TextGenerator } from '../text/TextGenerator.ts';\n\ntype TableSectionKey = 'header' | 'body' | 'footer';\n\nconst DEFAULT_OPTIONS: BitmarkOptions = {\n  debugGenerationInline: false,\n};\n\nconst DEFAULT_SPACES_AROUND_VALUES = 1;\nconst MAX_SPACES_AROUND_VALUES = 10;\n\n/**\n * Bitmark generation options\n */\nexport interface BitmarkOptions {\n  /**\n   * If true, always include bitmark text format even if it is the default for the bit\n   * If false, only include bitmark text format if it is not the default for the bit\n   */\n\n  explicitTextFormat?: boolean;\n\n  /**\n   * Prettify the JSON in the bitmark body.\n   *\n   * If not set or false, JSON will not be prettified.\n   * If true, JSON will be prettified with an indent of 2.\n   * If a positive integer, JSON will be prettified with an indent of this number.\n   */\n  prettifyJson?: boolean | number;\n\n  /**\n   * Card set version to generate:\n   * 1: === / == / --\n   * 2: ++==== / ==== / -- / ~~ / ====++\n   */\n  cardSetVersion?: CardSetVersionType;\n\n  /**\n   * The number of spaces to insert around values in the bitmark.\n   * If set to true, will use the default of 1 space.\n   * If set to false, will not insert any spaces.\n   * If set to a number, will insert that many spaces, up to a limit of 10.\n   *\n   * default: true\n   */\n  spacesAroundValues?: number | boolean;\n\n  /**\n   * [development only]\n   * Generate debug information in the output.\n   */\n  debugGenerationInline?: boolean;\n}\n\n/**\n * Bitmark generator options\n */\nexport interface BitmarkGeneratorOptions {\n  /**\n   * bitmarkVersion - The version of bitmark to output.\n   * If not specified, the version will default to 3.\n   *\n   * Specifying the version will set defaults for other options.\n   * - Bitmark v2:\n   *   - cardSetVersion: 1\n   * - Bitmark v3:\n   *   - cardSetVersion: 2\n   */\n  bitmarkVersion?: BitmarkVersionType;\n\n  /**\n   * The options for JSON generation.\n   */\n  bitmarkOptions?: BitmarkOptions;\n}\n\n/**\n * Generate bitmark markup from a bitmark AST\n *\n * NOTE: Newlines - a newline is written BEFORE each content that requries a newline\n *\n */\nclass BitmarkGenerator extends AstWalkerGenerator<BitmarkAst, void> {\n  protected ast = new Ast();\n  protected textGenerator: TextGenerator;\n  private bitmarkVersion: BitmarkVersionType;\n  private options: BitmarkOptions;\n  private mainWriter: Writer; // Used for writing the bitmark\n  private partWriter: StringWriter; // Used for writing parts which need to be assembled before writing to the main writer\n  private writer: Writer; // The current writer being used\n  private prettifySpace: number | undefined;\n  private spacesAroundValues: number;\n  private spacesAroundValuesStr: string;\n\n  // State\n  private bitType: BitTypeType = BitType._error;\n  private textFormat: TextFormatType = TextFormat.bitmarkText;\n  private isBodyBitmarkText = false;\n  private isCardAllowed = false;\n  private firstBit = true;\n  private hasCardSet = false;\n  private hasFooter = false;\n  private inTag = true;\n  private skipTableTraversal = false;\n\n  /**\n   * Generate bitmark markup from a bitmark AST\n   *\n   * @param writer - destination for the output\n   * @param bitmarkVersion - The version of bitmark to output.\n   * If not specified, the version will default to 3.\n   *\n   * Specifying the version will set defaults for other options.\n   * - Bitmark v2:\n   *   - cardSetVersion: 1\n   * - Bitmark v3:\n   *   - cardSetVersion: 2\n   *\n   * @param options - bitmark generation options\n   */\n  constructor(writer: Writer, options?: BitmarkGeneratorOptions) {\n    super();\n\n    // // Keep TS happy\n    // this.inTag;\n\n    // Bind callbacks\n    this.enter = this.enter.bind(this);\n    this.between = this.between.bind(this);\n    this.exit = this.exit.bind(this);\n    this.leaf = this.leaf.bind(this);\n    this.write = this.write.bind(this);\n    this.bodyBitCallback = this.bodyBitCallback.bind(this);\n\n    // Set options\n    this.bitmarkVersion =\n      Enum(BitmarkVersion).fromValue(options?.bitmarkVersion) ?? DEFAULT_BITMARK_VERSION;\n    this.options = {\n      ...DEFAULT_OPTIONS,\n      ...options?.bitmarkOptions,\n    };\n\n    this.debugGenerationInline = this.options.debugGenerationInline ?? false;\n\n    // Set defaults according to bitmark version\n    if (this.bitmarkVersion === BitmarkVersion.v2) {\n      if (this.options.cardSetVersion === undefined) {\n        this.options.cardSetVersion = CardSetVersion.v1;\n      }\n    } else {\n      if (this.options.cardSetVersion === undefined) {\n        this.options.cardSetVersion = CardSetVersion.v2;\n      }\n    }\n\n    // Calculate the prettify space\n    this.prettifySpace =\n      this.options.prettifyJson === true ? 2 : this.options.prettifyJson || undefined;\n\n    // Calculate the spaces around values\n    this.spacesAroundValues = this.calcSpacesAroundValues();\n    this.spacesAroundValuesStr = ' '.repeat(this.spacesAroundValues);\n\n    // Create the text generator\n    this.textGenerator = new TextGenerator(this.bitmarkVersion, {\n      writeCallback: this.write,\n      bodyBitCallback: this.bodyBitCallback,\n      debugGenerationInline: this.debugGenerationInline,\n    });\n\n    this.mainWriter = writer;\n    this.partWriter = new StringWriter();\n    this.writer = this.mainWriter;\n\n    this.generateResourceHandlers();\n    this.generatePropertyHandlers();\n  }\n\n  /**\n   * Generate bitmark markup from bitmark AST\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<void> {\n    // Reset the state\n    this.resetState();\n\n    // Open the writer\n    await this.writer.open();\n\n    // Walk the bitmark AST\n    this.walkAndWrite(ast);\n\n    // Ensure a blank line at end of file\n    this.writeLine();\n\n    // Close the writer\n    await this.writer.close();\n  }\n\n  /**\n   * Generate text from a bitmark text AST synchronously\n   *\n   * @param ast bitmark text AST\n   */\n  public generateSync(ast: BitmarkAst): void {\n    // Reset the state\n    this.resetState();\n\n    // Open the writer\n    this.writer.openSync();\n\n    // Walk the bitmark AST\n    this.walkAndWrite(ast);\n\n    // Close the writer\n    this.writer.closeSync();\n  }\n\n  private resetState(): void {\n    this.bitType = BitType._error;\n    this.textFormat = TextFormat.bitmarkText;\n    this.isBodyBitmarkText = false;\n    this.isCardAllowed = false;\n    this.firstBit = true;\n    this.hasCardSet = false;\n    this.hasFooter = false;\n    this.inTag = true;\n    this.printed = false;\n  }\n\n  private walkAndWrite(ast: BitmarkAst): void {\n    // Walk the bitmark AST\n    this.ast.walk(ast, NodeType.bitmarkAst, this, undefined);\n\n    // Ensure a blank line at end of file\n    this.writeLine();\n  }\n\n  //\n  // NODE HANDLERS\n  //\n\n  //\n  // Non-Terminal nodes (branches)\n  //\n\n  // bitmark\n\n  // bitmarkAst -> bits -> bitsValue\n\n  protected enter_bitsValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const bit = node.value as Bit;\n\n    const bitConfig = Config.getBitConfig(bit.bitType);\n    const bitResourcesConfig = Config.getBitResourcesConfig(bit.bitType, bit.resourceType);\n\n    // Set state variables\n    this.bitType = bit.bitType;\n    this.textFormat = bit.textFormat ?? bitConfig.textFormatDefault;\n    this.isBodyBitmarkText = this.textFormat === TextFormat.bitmarkText;\n    this.isCardAllowed = this.calculateIsCardAllowed();\n\n    this.hasCardSet = this.haveValidCardSet(bit);\n    this.hasFooter = this.haveValidFooter(bit);\n\n    // Separate the bits with 3 newlines\n    if (!this.firstBit) {\n      this.writeNL();\n      this.writeNL();\n      this.writeNL();\n    }\n\n    // Write the bit tag opening\n    this.writeOPD(bit.bitLevel);\n\n    if (bit.isCommented) this.writeString('|');\n    this.writeTagKey(bit.bitType);\n\n    if (bit.textFormat) {\n      const write = this.isWriteTextFormat(bit.textFormat, bitConfig.textFormatDefault);\n\n      if (write) {\n        this.writeColon();\n        this.writeTagKey(bit.textFormat);\n      }\n    }\n\n    // Use the bitConfig to see if we need to write the resourceType attachment\n    let resourceType: ResourceTypeType | undefined;\n    if (bitConfig.resourceAttachmentAllowed && bit.resources && bit.resources.length > 0) {\n      const comboMap = bitResourcesConfig.comboResourceConfigKeysMap;\n\n      if (bitResourcesConfig.comboResourceConfigKeysMap.size > 0) {\n        // The resource is a combo resource\n        // Extract the resource types from the combo resource\n        // NOTE: There should only ever be one combo resource per bit, but the code can handle multiple\n        // except for overwriting resourceJson\n        for (const comboTagType of comboMap.keys()) {\n          resourceType = configKeyToResourceType(comboTagType);\n        }\n      } else {\n        // Get the resourceType from the first resource and write it as the attachment resourceType\n        resourceType = bit.resources[0].type;\n      }\n    }\n\n    if (resourceType) {\n      this.writeAmpersand();\n      this.writeTagKey(resourceType);\n    }\n\n    this.writeCL();\n    // this.writeNL();\n\n    // Continue traversal\n    return true;\n  }\n\n  protected exit_bitsValue(_node: NodeInfo, _route: NodeInfo[]): void {\n    this.firstBit = false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> internalComment\n\n  protected enter_internalComment(node: NodeInfo, route: NodeInfo[]): boolean {\n    const internalComment = node.value as BreakscapedString[];\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    for (let i = 0; i < internalComment.length; i++) {\n      const comment = internalComment[i];\n\n      this.writeNL();\n      this.writeProperty('internalComment', comment, route, {\n        format: TagFormat.plainText,\n        array: true,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> groupTag\n\n  protected enter_groupTag(node: NodeInfo, route: NodeInfo[]): boolean {\n    const groupTag = node.value as GroupTagJson[];\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    for (const gt of groupTag) {\n      const { name, tags } = gt;\n\n      // this.writeNL();\n      this.writeProperty('groupTag', name, route, {\n        format: TagFormat.plainText,\n        writeEmpty: true,\n      });\n      if (tags && tags.length > 0) {\n        for (const t of tags) {\n          this.writeProperty('tag', t, route, {\n            format: TagFormat.plainText,\n            writeEmpty: true,\n            forceChain: true,\n          });\n        }\n      }\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> labelTrue / labelFalse\n\n  protected leaf_labelTrue(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value as string | undefined;\n\n    // Ignore example that is not at the bit level as it are handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const bit = parent?.value as Bit;\n    if (bit) {\n      const haveTrue = value != '';\n      const haveFalse = bit.labelFalse && bit.labelFalse != '';\n      if (haveTrue || haveFalse) {\n        this.writeNL();\n      }\n      if (haveTrue)\n        this.writeProperty('labelTrue', value, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      if (haveFalse)\n        this.writeProperty('labelFalse', bit.labelFalse, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected leaf_labelFalse(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Handled above in enter_labelTrue(), but this function needed to block automatic property handling\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> imageSource\n\n  protected enter_imageSource(node: NodeInfo, route: NodeInfo[]): boolean {\n    const imageSource = node.value as ImageSourceJson;\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const { url, mockupId, size, format, trim } = imageSource;\n\n    // this.writeNL();\n    this.writeProperty('imageSource', url, route, {\n      format: TagFormat.plainText,\n    });\n    if (url) {\n      if (mockupId)\n        this.writeProperty('mockupId', mockupId, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      if (size)\n        this.writeProperty('size', size, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      if (format)\n        this.writeProperty('format', format, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      if (BooleanUtils.isBoolean(trim))\n        this.writeProperty('trim', trim, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> technicalTerm\n\n  protected enter_technicalTerm(node: NodeInfo, route: NodeInfo[]): boolean {\n    const nodeValue = node.value as TechnicalTermJson;\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const { technicalTerm, lang } = nodeValue;\n\n    // this.writeNL();\n    this.writeProperty('technicalTerm', technicalTerm, route, {\n      format: TagFormat.plainText,\n    });\n    if (lang != null) {\n      this.writeProperty('lang', lang, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> servings\n\n  protected enter_servings(node: NodeInfo, route: NodeInfo[]): boolean {\n    const nodeValue = node.value as ServingsJson;\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const { servings, unit, unitAbbr, decimalPlaces, disableCalculation, hint } = nodeValue;\n\n    // this.writeNL();\n    this.writeProperty('servings', servings, route, {\n      format: TagFormat.plainText,\n    });\n    if (unit != null) {\n      this.writeProperty('unit', unit, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (unitAbbr != null) {\n      this.writeProperty('unitAbbr', unitAbbr, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (decimalPlaces != null) {\n      this.writeProperty('decimalPlaces', decimalPlaces, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (disableCalculation != null) {\n      this.writeProperty('disableCalculation', disableCalculation, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (hint != null) {\n      this.writeOPQ();\n      this.writeTextOrValue(hint, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> person\n\n  protected enter_person(node: NodeInfo, route: NodeInfo[]): boolean {\n    const person = node.value as PersonJson;\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const { name, title, avatarImage } = person;\n\n    // this.writeNL();\n    this.writeProperty('person', name, route, {\n      format: TagFormat.plainText,\n    });\n    if (title) {\n      this.writeProperty('title', title, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (avatarImage) {\n      this.writeResource(ResourceType.image, avatarImage.image.src);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions -> definitionsValue -> term -> text\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions -> definitionsValue -> definition -> text\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions -> definitionsValue -> alternativeDefinitions\n  // -> alternativeDefinitionsValue -> text\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> question -> text\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> answer -> text\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> alternativeAnswers ->\n  // -> alternativeAnswersValue -> text\n\n  protected enter_text(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (\n      !parent ||\n      (parent.key !== NodeType.term &&\n        parent.key !== NodeType.definition &&\n        parent.key !== NodeType.alternativeDefinitionsValue &&\n        parent.key !== NodeType.question &&\n        parent.key !== NodeType.answer &&\n        parent.key !== NodeType.alternativeAnswersValue)\n    ) {\n      return true;\n    }\n\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected leaf_text(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (\n      !parent ||\n      (parent.key !== NodeType.term &&\n        parent.key !== NodeType.definition &&\n        parent.key !== NodeType.alternativeDefinitionsValue &&\n        parent.key !== NodeType.question &&\n        parent.key !== NodeType.answer &&\n        parent.key !== NodeType.alternativeAnswersValue &&\n        parent.key !== NodeType.reason)\n    ) {\n      return true;\n    }\n\n    if (StringUtils.isString(node.value)) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> * -> term -> icon\n  // bitmarkAst -> bits -> bitsValue -> * -> definition -> icon\n  // bitmarkAst -> bits -> bitsValue -> * -> alternativeDefinitionsValue -> icon\n  protected enter_icon(node: NodeInfo, route: NodeInfo[]): boolean {\n    const resource = node.value as ImageResourceWrapperJson;\n\n    const parent = this.getParentNode(route);\n    if (!parent) return true;\n\n    if (\n      parent.key !== NodeType.term &&\n      parent.key !== NodeType.definition &&\n      parent.key !== NodeType.alternativeDefinitionsValue &&\n      parent.key !== NodeType.question &&\n      parent.key !== NodeType.answer &&\n      parent.key !== NodeType.alternativeAnswersValue\n    ) {\n      // Continue traversal of this branch\n      return true;\n    }\n\n    // This is a resource, so handle it with the common code\n    // this.writeNL();\n    this.writeResource(ResourceType.icon, resource.image.src);\n    // this.writePropertyStyleResource(ResourceType.icon, resource as ResourceJson);\n\n    // Continue traversal of this branch (for the chained properties)\n    return true;\n  }\n\n  protected leaf_iconValue(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Handle as a standard icon property\n    this.writeNL();\n    this.writeProperty('icon', node.value, route, {\n      format: TagFormat.plainText,\n    });\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> ratingLevelStart\n  protected enter_ratingLevelStart(node: NodeInfo, route: NodeInfo[]): boolean {\n    this.enterRatingLevelStartEndCommon(node, route);\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> ratingLevelEnd\n  protected enter_ratingLevelEnd(node: NodeInfo, route: NodeInfo[]): boolean {\n    this.enterRatingLevelStartEndCommon(node, route);\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // Common code for ratingLevelStart and ratingLevelEnd\n  protected enterRatingLevelStartEndCommon(node: NodeInfo, route: NodeInfo[]): boolean {\n    const n = node.value as RatingLevelStartEndJson;\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const { level, label } = n;\n    const levelKey = node.key === NodeType.ratingLevelStart ? 'ratingLevelStart' : 'ratingLevelEnd';\n\n    // this.writeNL();\n    this.writeProperty(levelKey, level, route, {\n      format: TagFormat.plainText,\n    });\n    if (label) {\n      this.writeProperty('label', label, route, {\n        format: TagFormat.bitmarkText,\n        forceChain: true,\n      });\n    }\n\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> markConfig\n\n  protected enter_markConfig(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Handler so markConfig is not processed by the default property handler\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> markConfig -> markConfigValue\n\n  protected enter_markConfigValue(node: NodeInfo, route: NodeInfo[]): boolean {\n    const markConfig = node.value as MarkConfigJson;\n\n    // Ignore values that are not at the correct level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.markConfig) return true;\n\n    const { mark, color, emphasis } = markConfig;\n\n    if (mark) {\n      this.writeNL();\n      this.writeProperty('mark', mark, route, {\n        format: TagFormat.plainText,\n      });\n      if (color) {\n        this.writeProperty('color', color, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      }\n      if (emphasis) {\n        this.writeProperty('emphasis', emphasis, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      }\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> partialAnswer\n\n  protected enter_partialAnswer(node: NodeInfo, route: NodeInfo[]): boolean {\n    if (node.value) {\n      // this.writeNL();\n      this.writeProperty('partialAnswer', node.value, route, {\n        format: TagFormat.plainText,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> questions -> questionsValue -> partialAnswer\n\n  protected leaf_partialAnswer(node: NodeInfo, route: NodeInfo[]): boolean {\n    if (node.value) {\n      // this.writeNL();\n      this.writeProperty('partialAnswer', node.value, route, {\n        format: TagFormat.plainText,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> sampleSolution\n  // bitmarkAst -> bits -> bitsValue -> questions -> questionsValue -> sampleSolution\n\n  protected enter_sampleSolution(node: NodeInfo, route: NodeInfo[]): boolean {\n    if (node.value) {\n      // this.writeNL();\n      this.writeProperty('sampleSolution', node.value, route, {\n        format: TagFormat.plainText,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected leaf_sampleSolution(node: NodeInfo, route: NodeInfo[]): boolean {\n    if (node.value) {\n      // this.writeNL();\n      this.writeProperty('sampleSolution', node.value, route, {\n        format: TagFormat.plainText,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> reasonableNumOfChars\n  // bitmarkAst -> bits -> bitsValue -> questions -> questionsValue -> reasonableNumOfChars\n\n  protected leaf_reasonableNumOfChars(node: NodeInfo, route: NodeInfo[]): void {\n    // this.writeNL();\n    this.writeProperty('reasonableNumOfChars', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> questions -> questionsValue -> additionalSolutions -> additionalSolutionsValue\n\n  protected leaf_additionalSolutionsValue(node: NodeInfo, route: NodeInfo[]): void {\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route, 2);\n    if (parent?.key !== NodeType.questionsValue) return;\n\n    this.writeNL();\n    this.writeProperty('additionalSolutions', node.value, route, {\n      format: TagFormat.plainText,\n      array: true,\n      writeEmpty: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> item\n\n  protected enter_item(node: NodeInfo, route: NodeInfo[]): boolean {\n    const item = node.value as TextAst;\n    const parent = this.getParentNode(route);\n    if (this.isEmptyText(item)) return false; // Ignore empty\n    if (!this.isEmptyText(parent?.value?.lead)) return true; // Will be handled by lead\n    if (!this.isEmptyText(parent?.value?.pageNumber)) return true; // Will be handled by pageNumber\n    if (!this.isEmptyText(parent?.value?.marginNumber)) return true; // Will be handled by marginNumber\n\n    this.writeNL_IfNotChain(route);\n    this.writeOPC();\n    this.writeTextOrValue(item, TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> lead\n\n  protected enter_lead(node: NodeInfo, route: NodeInfo[]): boolean {\n    const lead = node.value as TextAst;\n    const parent = this.getParentNode(route);\n    if (this.isEmptyText(lead)) return false; // Ignore empty\n    if (!this.isEmptyText(parent?.value?.pageNumber)) return true; // Will be handled by pageNumber\n    if (!this.isEmptyText(parent?.value?.marginNumber)) return true; // Will be handled by marginNumber\n\n    this.writeNL_IfNotChain(route);\n    this.writeOPC();\n    this.writeTextOrValue(parent?.value?.item ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(lead, TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> pageNumber\n\n  protected enter_pageNumber(node: NodeInfo, route: NodeInfo[]): boolean {\n    const pageNumber = node.value as TextAst;\n    const parent = this.getParentNode(route);\n    if (this.isEmptyText(pageNumber)) return false; // Ignore empty\n    if (!this.isEmptyText(parent?.value?.marginNumber)) return true; // Will be handled by marginNumber\n\n    this.writeNL_IfNotChain(route);\n    this.writeOPC();\n    this.writeTextOrValue(parent?.value?.item ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(parent?.value?.lead ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(pageNumber ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> marginNumber\n\n  protected enter_marginNumber(node: NodeInfo, route: NodeInfo[]): boolean {\n    const marginNumber = node.value as TextAst;\n    const parent = this.getParentNode(route);\n    if (this.isEmptyText(marginNumber)) return false; // Ignore empty\n\n    this.writeNL_IfNotChain(route);\n    this.writeOPC();\n    this.writeTextOrValue(parent?.value?.item ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(parent?.value?.lead ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(\n      parent?.value?.pageNumber ?? '',\n      TextFormat.bitmarkText,\n      TextLocation.tag,\n    );\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(marginNumber, TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body\n\n  protected enter_body(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue && parent?.key !== NodeType.cardBitsValue) return true;\n\n    this.inTag = false;\n\n    // Always write a NL before the body content if there is any (see Handle body)\n    const body = node.value as Body;\n\n    // Handle body\n    if (this.textFormat === TextFormat.json) {\n      const json = body.body ?? null;\n      if (Array.isArray(json) || ObjectUtils.isObject(json)) {\n        const text = JSON.stringify(json, null, this.prettifySpace);\n        if (text) {\n          this.writePlainTextDivider();\n          this.writeNL();\n          this.writeTextOrValue(text, TextFormat.plainText, TextLocation.body);\n        }\n      }\n    } else if (this.isBodyBitmarkText) {\n      // handle bitmark text\n      const plainTextDividerAllowed = !(this.hasCardSet || this.hasFooter);\n      this.writeNL();\n      // The text generator will write to the writer\n      const b = (Array.isArray(body.body) ? body.body : []) as TextAst;\n      this.writeTextOrValue(b, this.textFormat, TextLocation.body, {\n        plainTextDividerAllowed,\n      });\n    } else {\n      // handle plain text\n      this.writePlainTextDivider();\n      this.writeNL();\n      const s = (StringUtils.isString(body.body) ? body.body : '') as string;\n      this.writeTextOrValue(`${s}`, TextFormat.plainText, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected exit_body(_node: NodeInfo, _route: NodeInfo[]): void {\n    this.inTag = true;\n  }\n\n  protected bodyBitCallback(bodyBit: BodyBitJson, _index: number, _route: NodeInfo[]): string {\n    // console.log('bodyBitCallback', bodyBit, index, route);\n\n    // Walk the body bit AST\n    const nodeType = Enum(NodeType).fromValue(bodyBit.type) ?? NodeType.bodyBit;\n    this.ast.walk(bodyBit, nodeType, this, undefined);\n\n    return ''; // Return empty string as we are writing to the writer\n  }\n\n  // bodyBit -> gap\n\n  protected enter_gap(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const gap = node.value as GapJson;\n\n    if (gap.solutions && gap.solutions.length === 0) {\n      // If there are no solutions, we need to write the special cloze gap [_] to indicate this\n      this.writeOPU();\n      this.writeCL();\n    } else {\n      for (const solution of gap.solutions) {\n        this.writeOPU();\n        this.writeTextOrValue(solution, TextFormat.plainText, TextLocation.tag);\n        this.writeCL();\n      }\n    }\n\n    // Continue traversal\n    return true;\n  }\n\n  // bodyBit -> mark\n\n  protected enter_mark(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const mark = node.value as MarkJson;\n\n    this.writeOPE();\n    this.writeTextOrValue(mark.solution, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bodyBit -> select\n\n  protected enter_select(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Continue traversal\n    return true;\n  }\n\n  // bodyBit -> highlight\n\n  protected enter_highlight(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> footer\n\n  protected enter_footer(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const footer = node.value as Footer;\n\n    // Handle footer\n    if (this.textFormat === TextFormat.json) {\n      // Json footer?!\n      // Not valid, ignore\n    } else if (footer.footer && footer.footer.length > 0) {\n      if (this.isBodyBitmarkText) {\n        // handle bitmark text\n        this.writeNL();\n        this.writeTextOrValue('==== footer ====', TextFormat.plainText, TextLocation.body);\n        this.writeNL();\n        // The text generator will write to the writer\n        this.writeTextOrValue(footer.footer, this.textFormat, TextLocation.body, {\n          plainTextDividerAllowed: true, // Always allowed for the footer.\n        });\n      } else {\n        // Plain text footer?!\n        // Not valid, ignore (plain text cannot have a card set / footer marker, so cannot have a footer!\n      }\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyParts -> bodyPartsValue -> data -> solutions\n\n  protected enter_solutions(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const solutions = node.value as string[];\n    if (solutions && solutions.length === 0) {\n      // If there are no solutions, we need to write the special cloze gap [_] to indicate this\n      this.writeOPU();\n      this.writeCL();\n    }\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyParts -> bodyPartsValue -> data -> solution\n\n  protected leaf_solution(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return;\n\n    const solution = node.value as string;\n\n    // Ignore values that are not at the correct level as they might be handled elsewhere\n    const bodyPartsValue: BodyPart | undefined = this.getParentNode(route, 2)?.value;\n    if (bodyPartsValue?.type !== BodyBitType.mark) return;\n\n    if (solution) {\n      this.writeOPE();\n      this.writeTextOrValue(solution, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyBit -> mark -> mark\n\n  protected leaf_mark(node: NodeInfo, route: NodeInfo[]): void {\n    const root = route[0];\n    if (root?.key !== NodeType.mark) return;\n\n    const mark = node.value as string;\n\n    if (mark) {\n      this.writeProperty('mark', mark, route, {\n        format: TagFormat.plainText,\n      });\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyParts -> bodyPartsValue -> data -> options -> optionsValue\n\n  protected enter_optionsValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const selectOption = node.value as SelectOptionJson;\n    if (selectOption.isCorrect) {\n      this.writeOPP();\n    } else {\n      this.writeOPM();\n    }\n    this.writeTextOrValue(selectOption.text, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyParts -> bodyPartsValue -> data -> texts -> textsValue\n\n  protected enter_textsValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const highlightText = node.value as HighlightTextJson;\n    if (highlightText.isCorrect) {\n      this.writeOPP();\n    } else {\n      this.writeOPM();\n    }\n    this.writeTextOrValue(highlightText.text, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode\n\n  protected enter_cardNode(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return true;\n\n    this.writeCardSetStart();\n\n    // Continue traversal\n    return true;\n  }\n\n  protected between_cardNode(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  protected exit_cardNode(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetEnd();\n    if (this.options.cardSetVersion === CardSetVersion.v1) {\n      // this.writeNL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> elements\n\n  protected enter_elements(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_elements(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetSideDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards\n\n  protected between_flashcards(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue\n\n  protected between_flashcardsValue(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    if (right.key === NodeType.answer) {\n      this.writeCardSetSideDivider();\n    } else if (right.key === NodeType.alternativeAnswers && right.value?.length !== 0) {\n      this.writeCardSetVariantDivider();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> alternativeAnswers\n\n  protected between_alternativeAnswers(_node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeCardSetVariantDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions -> definitionsValue -> alternativeDefintions\n\n  protected between_alternativeDefinitions(_node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeCardSetVariantDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> statements\n\n  protected enter_statements(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_statements(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    const isTrueFalse1 = this.isOfBitType(BitType.trueFalse1);\n\n    if (!isTrueFalse1) {\n      this.writeCardSetCardDivider();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> statements -> statementsValue\n\n  protected enter_statementsValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const statement = node.value as StatementJson;\n\n    this.writeNL();\n    if (statement.isCorrect) {\n      this.writeOPP();\n    } else {\n      this.writeOPM();\n    }\n    this.writeTextOrValue(statement.statement, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> choices -> choicesValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes -> quizzesValue -> choices -> choicesValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> feedbacks -> feedbacksValue -> choices -> choicesValue\n\n  protected enter_choicesValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const choice = node.value as ChoiceJson & FeedbackChoiceJson;\n\n    this.writeNL();\n    if (choice.isCorrect || choice.requireReason) {\n      this.writeOPP();\n    } else {\n      this.writeOPM();\n    }\n    this.writeTextOrValue(choice.choice, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> responses -> responsesValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes -> quizzesValue -> responses -> responsesValue\n\n  protected enter_responsesValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const response = node.value as ResponseJson;\n\n    this.writeNL();\n    if (response.isCorrect) {\n      this.writeOPP();\n    } else {\n      this.writeOPM();\n    }\n    this.writeTextOrValue(response.response, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> feedbacks\n\n  protected between_feedbacks(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> feedbacks -> feedbacksValue -> reason\n\n  protected enter_reason(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    this.writeCardSetSideDivider();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes\n\n  protected enter_quizzes(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_quizzes(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> heading\n\n  protected enter_heading(_node: NodeInfo, _route: NodeInfo[]): boolean | void {\n    //\n  }\n\n  protected between_heading(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetSideDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> heading -> forValues\n\n  protected enter_forValues(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_forValues(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetSideDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pairs\n\n  protected enter_pairs(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_pairs(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pairs -> pairsValue -> keyAudio\n\n  protected enter_keyAudio(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as AudioResourceWrapperJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writeResource(ResourceType.audio, resource.audio.src);\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pairs -> pairsValue -> keyImage\n\n  protected enter_keyImage(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ImageResourceWrapperJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writeResource(ResourceType.image, resource.image.src);\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> matrix\n\n  protected enter_matrix(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_matrix(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pairs -> pairsValue -> values\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> matrix -> matrixValue -> cells -> cellsValue -> values\n\n  protected enter_values(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetSideDivider();\n  }\n\n  protected between_values(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetVariantDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pronunciationTable\n\n  protected between_pronunciationTable(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode) return;\n\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table\n\n  protected enter_table(node: NodeInfo, route: NodeInfo[]): boolean | void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode) return true;\n\n    const table = node.value as TableJson | TableExtendedJson | undefined;\n    if (!table) return true;\n\n    if (this.writeAdvancedTable(table)) {\n      return false;\n    }\n\n    return true;\n  }\n\n  protected between_table(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode) return;\n\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  private writeAdvancedTable(table: TableJson | TableExtendedJson): boolean {\n    const normalized = normalizeTableFormat(BitType.tableExtended, table) as TableExtendedJson;\n\n    const sections: Array<{\n      key: TableSectionKey;\n      qualifier?: string;\n      section?: TableSectionJson;\n    }> = [\n      { key: 'header', qualifier: 'table-header', section: normalized.header },\n      { key: 'body', qualifier: undefined, section: normalized.body },\n      { key: 'footer', qualifier: 'table-footer', section: normalized.footer },\n    ];\n\n    let rowCount = 0;\n\n    for (const { key, qualifier, section } of sections) {\n      const rows = section?.rows ?? [];\n\n      if (rows.length === 0) {\n        continue;\n      }\n\n      for (const row of rows) {\n        this.writeCardSetCardDivider(qualifier);\n        this.writeTableRow(row, key);\n        rowCount++;\n      }\n    }\n\n    return rowCount > 0;\n  }\n\n  private writeTableRow(row: TableRowJson, section: TableSectionKey): void {\n    const cells = row?.cells ?? [];\n    if (cells.length === 0) return;\n\n    for (let index = 0; index < cells.length; index++) {\n      if (index > 0) {\n        this.writeCardSetSideDivider();\n      }\n      this.writeNL();\n      this.writeTableCell(cells[index], section);\n    }\n  }\n\n  private writeTableCell(cell: TableCellJson, section: TableSectionKey): void {\n    const defaultCellType = section === 'body' ? 'td' : 'th';\n    const cellType = cell.title ? 'th' : 'td';\n\n    if (cellType !== defaultCellType) {\n      this.writeTableCellProperty('tableCellType', cellType);\n      this.writeNL();\n    }\n\n    if (cell.rowspan && cell.rowspan > 1) {\n      this.writeTableCellProperty('tableRowSpan', cell.rowspan);\n      this.writeNL();\n    }\n\n    if (cell.colspan && cell.colspan > 1) {\n      this.writeTableCellProperty('tableColSpan', cell.colspan);\n      this.writeNL();\n    }\n\n    if (cell.scope) {\n      this.writeTableCellProperty('tableScope', cell.scope);\n      this.writeNL();\n    }\n\n    if (cell.colwidth && cell.colwidth > 0) {\n      this.writeTableCellProperty('tableColWidth', cell.colwidth);\n      this.writeNL();\n    }\n\n    const content = cell.content ?? Breakscape.EMPTY_STRING;\n    this.writeTextOrValue(content, this.textFormat, TextLocation.body);\n  }\n\n  private writeTableCellProperty(name: string, value: string | number): void {\n    this.writeOPA();\n    this.writeTagKey(name);\n    this.writeColon();\n    this.writeTextOrValue(`${value}`, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> data\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pronunciationTable -> data\n\n  protected between_data(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.table && parent?.key !== NodeType.pronunciationTable) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> columns\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList -> columns\n\n  protected between_columns(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    const parentKey = parent?.key;\n    if (parentKey !== NodeType.table && parentKey !== NodeType.captionDefinitionList) return;\n\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetSideDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> columns -> columnsValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList -> columns -> columnsValue\n\n  protected leaf_columnsValue(node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeNL();\n    this.writeOPHASH();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  protected enter_columnsValue(node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeNL();\n    this.writeOPHASH();\n    this.writeTextOrValue(node.value, TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> data -> dataValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pronunciationTable -> data -> dataValue\n\n  protected between_dataValue(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route, 2);\n    if (parent?.key !== NodeType.table && parent?.key !== NodeType.pronunciationTable) return;\n\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetSideDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> data -> dataValue -> dataValueValue\n\n  protected leaf_dataValueValue(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route, 3);\n    if (parent?.key !== NodeType.table) return;\n\n    this.writeNL();\n    this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> data -> dataValue -> dataValueValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pronunciationTable -> data -> dataValue -> dataValueValue\n\n  protected enter_dataValueValue(node: NodeInfo, route: NodeInfo[]): void | boolean {\n    const parent = this.getParentNode(route, 3);\n    if (parent?.key !== NodeType.table && parent?.key !== NodeType.pronunciationTable) return;\n\n    if (node.value) {\n      if (parent?.key === NodeType.pronunciationTable) {\n        // Pronunciation Table\n        const cell = node.value as PronunciationTableCellJson;\n        if (cell.title) {\n          this.writeNL();\n          this.writeOP();\n          this.writeHash();\n          this.writeTextOrValue(cell.title, TextFormat.bitmarkText, TextLocation.tag);\n          this.writeCL();\n        }\n        if (cell.audio) {\n          this.writeNL();\n          this.writeResource(ResourceType.audio, cell.audio.audio.src);\n        }\n        if (cell.body) {\n          this.writeNL();\n          this.writeTextOrValue(cell.body, this.textFormat, TextLocation.body);\n        }\n\n        // Stop traversal of this branch\n        return false;\n      } else {\n        // Table\n        this.writeNL();\n        this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n      }\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList\n\n  protected between_captionDefinitionList(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList -> definitions -> definitionsValue -> term\n\n  protected leaf_term(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.definitionsValue) return true;\n\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList -> definitions -> definitionsValue -> definition\n\n  protected leaf_definition(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.definitionsValue) return true;\n\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList -> definitions\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions\n\n  protected between_definitions(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode && parent?.key !== NodeType.captionDefinitionList) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions -> definitionsValue\n\n  protected between_definitionsValue(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.definitions) return;\n\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    if (right.key === NodeType.definition) {\n      this.writeCardSetSideDivider();\n    } else if (right.key === NodeType.alternativeDefinitions && right.value?.length > 0) {\n      this.writeCardSetVariantDivider();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> questions\n\n  protected enter_questions(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_questions(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> ingredients\n\n  protected enter_ingredients(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_ingredients(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> ingredients -> ingredientsValue\n\n  protected enter_ingredientsValue(node: NodeInfo, route: NodeInfo[]): boolean {\n    const ingredient = node.value as IngredientJson;\n\n    if (ingredient.title != null) {\n      this.writeNL();\n      this.writeOPHASH();\n      this.writeTextOrValue(ingredient.title, TextFormat.bitmarkText, TextLocation.tag);\n      this.writeCL();\n      // this.writeNL();\n    }\n\n    if (ingredient.ingredient != null) {\n      this.writeNL();\n\n      // [+] / [-]\n      if (ingredient.checked) {\n        this.writeOPP();\n      } else {\n        this.writeOPM();\n      }\n      this.writeCL();\n\n      // [!43]\n      if (ingredient.quantity != null) {\n        this.writeOPB();\n        this.writeTextOrValue(`${ingredient.quantity}`, TextFormat.plainText, TextLocation.tag);\n        this.writeCL();\n      }\n\n      // [@unit:kilograms]\n      if (ingredient.unit != null)\n        this.writeProperty('unit', ingredient.unit, route, {\n          format: TagFormat.plainText,\n        });\n\n      // [@unitAbbr:kg]\n      if (ingredient.unitAbbr != null)\n        this.writeProperty('unitAbbr', ingredient.unitAbbr, route, {\n          format: TagFormat.plainText,\n        });\n\n      // [@decimalPlaces:1]\n      if (ingredient.decimalPlaces != null)\n        this.writeProperty('decimalPlaces', ingredient.decimalPlaces, route, {\n          format: TagFormat.plainText,\n        });\n\n      // [@disableCalculation]\n      if (ingredient.disableCalculation)\n        this.writeProperty('disableCalculation', true, route, {\n          format: TagFormat.plainText,\n        });\n\n      // item\n\n      this.writeNL();\n      this.writeTextOrValue(ingredient.ingredient, this.textFormat, TextLocation.body);\n    }\n\n    // Continue traversal of this branch (item, lead, etc)\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses\n\n  protected enter_botResponses(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_botResponses(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> cardBits\n\n  protected enter_cardBits(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_cardBits(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses -> botResponsesValue -> item\n\n  protected leaf_item(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.botResponsesValue) return;\n\n    this.writeNL();\n    this.writeOPC();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses -> botResponsesValue -> response\n\n  protected leaf_response(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.botResponsesValue) return;\n\n    this.writeNL();\n    this.writeOPB();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses -> botResponsesValue -> reaction\n\n  protected leaf_reaction(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.botResponsesValue) return;\n\n    this.writeNL();\n    this.writeProperty('reaction', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses -> botResponsesValue -> feedback\n\n  protected leaf_feedback(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.botResponsesValue) return;\n\n    const feedback = node.value as string;\n    if (feedback) {\n      this.writeNL();\n      this.writeTextOrValue(feedback, this.textFormat, TextLocation.body);\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> backgroundWallpaper\n  protected enter_backgroundWallpaper(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource(node.key, resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> imagePlaceholder\n  protected enter_imagePlaceholder(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource(node.key, resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> previewImageValue\n  protected enter_previewImageValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource('previewImage', resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> previewVideoValue\n  protected enter_previewVideoValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource('previewVideo', resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformIcon\n  protected enter_platformIcon(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource(node.key, resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformLogo\n  protected enter_platformLogo(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource(node.key, resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformBackgroundImage\n  protected enter_platformBackgroundImage(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource(node.key, resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> coverImage (when it's a resource object or property array)\n  protected enter_coverImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value;\n\n    // Check if this is a resource (object with 'type' field and not an array) or a property array\n    if (value && typeof value === 'object' && !Array.isArray(value) && 'type' in value) {\n      // This is a resource\n      const resource = value as ResourceJson;\n\n      // This is a resource, so handle it with the common code\n      this.writeNL();\n      this.writePropertyStyleResource(node.key, resource);\n\n      // Continue traversal\n      return true;\n    }\n\n    // If it's an array (property), handle it like a property\n    if (Array.isArray(value)) {\n      // This is a property array - use the standard property handling\n      if (value == null) return true;\n\n      // Ignore any property that is not at the bit level\n      const parent = this.getParentNode(route);\n      if (parent?.key !== NodeType.bitsValue) return true;\n\n      const bitType = this.getBitType(route);\n      if (!bitType) return true;\n\n      const config = Config.getBitConfig(bitType);\n      const propertyConfig = Config.getTagConfigForTag(\n        config.tags,\n        ConfigKey.property_coverImage,\n      ) as PropertyTagConfig | undefined;\n      if (!propertyConfig) return true;\n\n      // Write the property\n      this.writeNL_IfNotChain(route); // Only if NOT in chain\n      this.writeProperty(propertyConfig.tag, value, route, {\n        format: propertyConfig.format ?? TagFormat.plainText,\n        array: propertyConfig.array ?? false,\n        writeEmpty: true,\n        ignoreFalse: propertyConfig.defaultValue === 'false',\n        ignoreTrue: propertyConfig.defaultValue === 'true',\n      });\n    }\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> coverImage (when it's a property string)\n  // This is called when coverImage is a simple string value\n  protected leaf_coverImage(node: NodeInfo, route: NodeInfo[]): void {\n    // This is a property - use the standard property handling\n    const value = node.value;\n    if (value == null) return;\n\n    // Ignore any property that is not at the bit level as that will be handled by a different handler\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return;\n\n    const bitType = this.getBitType(route);\n    if (!bitType) return;\n\n    const config = Config.getBitConfig(bitType);\n    const propertyConfig = Config.getTagConfigForTag(config.tags, ConfigKey.property_coverImage) as\n      | PropertyTagConfig\n      | undefined;\n    if (!propertyConfig) return;\n\n    // Write the property\n    this.writeNL_IfNotChain(route); // Only if NOT in chain\n    this.writeProperty(propertyConfig.tag, node.value, route, {\n      format: propertyConfig.format ?? TagFormat.plainText,\n      array: propertyConfig.array ?? false,\n      writeEmpty: true,\n      ignoreFalse: propertyConfig.defaultValue === 'false',\n      ignoreTrue: propertyConfig.defaultValue === 'true',\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> backgroundImage (when it's a resource object or property array)\n  protected enter_backgroundImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value;\n\n    // Check if this is a resource (object with 'type' field and not an array) or a property array\n    if (value && typeof value === 'object' && !Array.isArray(value) && 'type' in value) {\n      // This is a resource\n      const resource = value as ResourceJson;\n\n      // This is a resource, so handle it with the common code\n      this.writeNL();\n      this.writePropertyStyleResource(node.key, resource);\n\n      // Continue traversal\n      return true;\n    }\n\n    // If it's an array (property), handle it like a property\n    if (Array.isArray(value)) {\n      // This is a property array - use the standard property handling\n      if (value == null) return true;\n\n      // Ignore any property that is not at the bit level\n      const parent = this.getParentNode(route);\n      if (parent?.key !== NodeType.bitsValue) return true;\n\n      const bitType = this.getBitType(route);\n      if (!bitType) return true;\n\n      const config = Config.getBitConfig(bitType);\n      const propertyConfig = Config.getTagConfigForTag(\n        config.tags,\n        ConfigKey.property_backgroundImage,\n      ) as PropertyTagConfig | undefined;\n      if (!propertyConfig) return true;\n\n      // Write the property\n      this.writeNL_IfNotChain(route); // Only if NOT in chain\n      this.writeProperty(propertyConfig.tag, value, route, {\n        format: propertyConfig.format ?? TagFormat.plainText,\n        array: propertyConfig.array ?? false,\n        writeEmpty: true,\n        ignoreFalse: propertyConfig.defaultValue === 'false',\n        ignoreTrue: propertyConfig.defaultValue === 'true',\n      });\n    }\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> backgroundImage (when it's a property string)\n  // This is called when backgroundImage is a simple string value\n  protected leaf_backgroundImage(node: NodeInfo, route: NodeInfo[]): void {\n    // This is a property - use the standard property handling\n    const value = node.value;\n    if (value == null) return;\n\n    // Ignore any property that is not at the bit level as that will be handled by a different handler\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return;\n\n    const bitType = this.getBitType(route);\n    if (!bitType) return;\n\n    const config = Config.getBitConfig(bitType);\n    const propertyConfig = Config.getTagConfigForTag(\n      config.tags,\n      ConfigKey.property_backgroundImage,\n    ) as PropertyTagConfig | undefined;\n    if (!propertyConfig) return;\n\n    // Write the property\n    this.writeNL_IfNotChain(route); // Only if NOT in chain\n    this.writeProperty(propertyConfig.tag, node.value, route, {\n      format: propertyConfig.format ?? TagFormat.plainText,\n      array: propertyConfig.array ?? false,\n      writeEmpty: true,\n      ignoreFalse: propertyConfig.defaultValue === 'false',\n      ignoreTrue: propertyConfig.defaultValue === 'true',\n    });\n  }\n\n  protected exit_imagePlaceholder(_node: NodeInfo, _route: NodeInfo[]): void {\n    // this.writeNL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> posterImage\n  // bitmarkAst -> bits -> bitsValue -> resource -> * -> posterImage\n\n  protected enter_posterImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (parent?.key === NodeType.bitsValue) {\n      // Bit poster image\n      const posterImage = node.value as string;\n      if (posterImage) {\n        this.writeProperty('posterImage', posterImage, route, {\n          format: TagFormat.plainText,\n        });\n      }\n    } else {\n      // Resource poster image\n      const posterImage = node.value as ImageResourceJson;\n      if (posterImage && posterImage.src) {\n        this.writeProperty('posterImage', posterImage.src, route, {\n          format: TagFormat.plainText,\n        });\n      }\n    }\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> resource -> thumbnails\n  // [src1x,src2x,src3x,src4x,width,height,alt,zoomDisabled,caption]\n\n  protected enter_thumbnails(node: NodeInfo, route: NodeInfo[]): boolean {\n    const thumbnails = node.value as ImageResourceJson[];\n\n    if (Array.isArray(thumbnails)) {\n      const thumbnailKeys = ['src1x', 'src2x', 'src3x', 'src4x'];\n\n      for (let i = 0; i < thumbnails.length; i++) {\n        // Can only handle 4 thumbnails\n        if (i === thumbnailKeys.length) break;\n        const thumbnail = thumbnails[i];\n        const key = thumbnailKeys[i];\n        this.writeProperty(key, thumbnail.src, route, {\n          format: TagFormat.plainText,\n        });\n      }\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> bitType\n\n  // bitmarkAst -> bits -> bitsValue -> textFormat\n\n  //  bitmarkAst -> bits -> level\n\n  protected leaf_level(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ensure this is at the bit level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    // Ensure this is a chapter bit\n    if (!Config.isOfBitType(this.bitType, [BitType.chapter])) return true;\n\n    const level = node.value as number;\n    const bit = parent?.value as Bit;\n\n    if (level > 0 && bit.title == null) {\n      // If the level is set, but there is no title, this is a [.chapter] bit with an empty title.\n      // We need to write an empty title tag at the correct level.\n      this.writeNL();\n      this.writeOP();\n      for (let i = 0; i < +level; i++) this.writeHash();\n      this.writeCL();\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> titleString\n\n  protected leaf_titleString(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ignore title that are not at the bit level as they are handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    if (node.value) {\n      this.writeNL();\n      // this.bitJson.title = node.value;\n      this.writeProperty('title', node.value, route, {\n        format: TagFormat.plainText,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  //  bitmarkAst -> bits -> title\n\n  protected enter_title(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ensure this is at the bit level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const value = node.value as TextAst;\n    const title = value;\n    const bit = parent?.value as Bit;\n    const level = bit.level || 1;\n\n    if (level && title) {\n      this.writeNL();\n      this.writeOP();\n      for (let i = 0; i < +level; i++) this.writeHash();\n      this.writeTextOrValue(title, TextFormat.bitmarkText, TextLocation.tag);\n      this.writeCL();\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  //  bitmarkAst -> bits -> subtitle\n\n  protected enter_subtitle(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ensure this is at the bit level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const value = node.value as TextAst;\n    const subtitle = value;\n    const level = 2;\n    if (level && subtitle) {\n      this.writeNL();\n      this.writeOP();\n      for (let i = 0; i < level; i++) this.writeHash();\n      this.writeTextOrValue(subtitle, TextFormat.bitmarkText, TextLocation.tag);\n      this.writeCL();\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> book (array)\n  // bitmarkAst -> bits -> bitsValue -> book (array) -> bookValue\n\n  protected enter_book(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Block standard property handling\n  }\n\n  protected enter_bookValue(node: NodeInfo, route: NodeInfo[]): boolean {\n    const book = node.value as BookJson;\n    // const parent = this.getParentNode(route);\n    // const bit = parent?.value as Bit;\n\n    if (book) {\n      this.writeNL();\n      this.writeProperty('book', book.book, route, {\n        format: TagFormat.plainText,\n        writeEmpty: true,\n      });\n      if (book.reference) {\n        this.writeOPRANGLE();\n        this.writeTextOrValue(book.reference, TextFormat.plainText, TextLocation.tag);\n        this.writeCL();\n\n        if (book.referenceEnd) {\n          this.writeOPRANGLE();\n          this.writeTextOrValue(book.referenceEnd, TextFormat.plainText, TextLocation.tag);\n          this.writeCL();\n        }\n      }\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> book (single)\n\n  protected leaf_book(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    const bit = parent?.value as Bit;\n\n    if (bit && node.value) {\n      this.writeNL();\n      this.writeProperty('book', node.value, route, {\n        format: TagFormat.plainText,\n        writeEmpty: true,\n      });\n      if (bit.reference) {\n        this.writeOPRANGLE();\n        this.writeTextOrValue(bit.reference, TextFormat.plainText, TextLocation.tag);\n        this.writeCL();\n\n        if (bit.referenceEnd) {\n          this.writeOPRANGLE();\n          this.writeTextOrValue(bit.referenceEnd, TextFormat.plainText, TextLocation.tag);\n          this.writeCL();\n        }\n      }\n    }\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> anchor\n\n  protected leaf_anchor(node: NodeInfo, _route: NodeInfo[]): void {\n    if (node.value) {\n      this.writeNL();\n      this.writeOPDANGLE();\n      this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> reference\n\n  protected leaf_reference(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    const bit = parent?.value as Bit;\n\n    if (bit && node.value) {\n      // Only write reference if it is not chained to 'book'\n      if (!bit.book) {\n        this.writeNL();\n        this.writeOPRANGLE();\n        this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n        this.writeCL();\n      }\n    }\n  }\n\n  //  * -> itemLead --> item\n\n  //  * -> itemLead --> lead\n\n  //  * -> hint\n\n  protected enter_hint(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value as TextAst;\n    const text = value;\n    if (!this.isEmptyText(text)) {\n      this.writeNL_IfNotChain(route);\n      this.writeOPQ();\n      this.writeTextOrValue(text, TextFormat.bitmarkText, TextLocation.tag);\n      this.writeCL();\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> instruction\n\n  protected enter_instruction(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value as TextAst;\n    const text = value;\n    if (!this.isEmptyText(text)) {\n      this.writeNL_IfNotChain(route);\n      this.writeOPB();\n      this.writeTextOrValue(text, TextFormat.bitmarkText, TextLocation.tag);\n      this.writeCL();\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> lang\n\n  protected leaf_lang(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('lang', node.value, route, {\n      format: TagFormat.boolean,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> refAuthor\n\n  protected enter_refAuthor(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('refAuthor', node.value, route, {\n      format: TagFormat.plainText,\n      array: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> refBookTitle\n\n  protected leaf_refBookTitle(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('refBookTitle', node.value, route, {\n      format: TagFormat.plainText,\n      array: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> refPublisher\n\n  protected enter_refPublisher(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('refPublisher', node.value, route, {\n      format: TagFormat.plainText,\n      array: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> refPublicationYear\n\n  protected leaf_refPublicationYear(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('refPublicationYear', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> citationStyle\n\n  protected leaf_citationStyle(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('citationStyle', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> isExample / example\n\n  protected leaf_isExample(node: NodeInfo, route: NodeInfo[]): void {\n    const isExample = node.value as boolean | undefined;\n    if (!isExample) return;\n\n    const parent = this.getParentNode(route);\n    const example = parent?.value.example ?? null;\n    // const __isDefaultExample = parent?.value.__isDefaultExample ?? false;\n\n    if (example != null && example !== '') {\n      // Write a newline if not in a chain\n      this.writeNL_IfNotChain(route);\n\n      this.writeOPA();\n      this.writeString('example');\n      this.writeColon();\n\n      if (example === true) {\n        this.writeString(' true ');\n      } else if (example === false) {\n        this.writeString(' false ');\n      } else if (Array.isArray(example)) {\n        // TextAst\n        this.writeTextOrValue(example, TextFormat.bitmarkText, TextLocation.tag);\n      } else {\n        // String\n        this.writeTextOrValue(example, TextFormat.plainText, TextLocation.tag);\n      }\n      this.writeCL();\n    } else {\n      // Don't write example if it is null.\n      // this.writeOPA();\n      // this.writeString('example');\n      // this.writeCL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> elements -> elementsValue\n\n  protected enter_elementsValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyValue -> gap -> solutions -> solution\n  // ? -> solutions -> solution\n\n  protected leaf_solutionsValue(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route, 2);\n    if (parent?.key !== NodeType.bitsValue) return;\n\n    if (node.value != null) {\n      this.writeOPU();\n      this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue-> body -> bodyValue -> select -> options -> prefix\n  // bitmarkAst -> bits -> bitsValue-> body -> bodyValue -> highlight -> options -> prefix\n\n  protected leaf_prefix(node: NodeInfo, _route: NodeInfo[]): void {\n    if (node.value) {\n      this.writeOPPRE();\n      this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue-> body -> bodyValue -> select -> options -> postfix\n  // bitmarkAst -> bits -> bitsValue-> body -> bodyValue -> highlight -> options -> postfix\n\n  protected leaf_postfix(node: NodeInfo, _route: NodeInfo[]): void {\n    if (node.value) {\n      this.writeOPPOST();\n      this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> isCaseSensitive\n\n  protected leaf_isCaseSensitive(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('isCaseSensitive', node.value, route, {\n      format: TagFormat.boolean,\n      writeEmpty: true,\n      ignoreFalse: false,\n      ignoreTrue: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> isCorrect\n\n  // bitmarkAst -> bits -> bitsValue -> heading -> forKeys\n\n  protected leaf_forKeys(node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeNL();\n    this.writeOPHASH();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> heading -> forValues\n\n  protected leaf_forValues(node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeNL();\n    this.writeOPHASH();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> heading -> forValuesValue\n\n  protected leaf_forValuesValue(node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeNL();\n    this.writeOPHASH();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> pairs -> pairsValue -> key\n  // bitmarkAst -> bits -> bitsValue -> matrix -> matrixValue -> key\n\n  protected leaf_key(node: NodeInfo, _route: NodeInfo[]): void {\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> pairs -> pairsValue -> values -> valuesValue\n  // bitmarkAst -> bits -> bitsValue -> matrix -> matrixValue -> cells -> cellsValue -> values -> valuesValue\n\n  protected leaf_valuesValue(node: NodeInfo, _route: NodeInfo[]): void {\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> questions -> questionsValue -> question\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> questions -> questionsValue -> question\n\n  protected enter_question(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ignore responses that are not at the questionsValue level as they are handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.questionsValue) return true;\n\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> question\n\n  protected leaf_question(node: NodeInfo, route: NodeInfo[]): void {\n    // Ignore responses that are not at the questionsValue level as they are handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.flashcardsValue) return;\n\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> statements -> text\n\n  // bitmarkAst -> bits -> bitsValue -> resource -> ...\n  // bitmarkAst -> bits -> bitsValue -> resource -> posterImage -> ...\n  // bitmarkAst -> bits -> bitsValue -> resource -> thumbnails -> thumbnailsValue -> ...\n  // [srcAlt,src1x,src2x,src3x,src4x,width,height,alt,zoomDisabled,caption]\n\n  protected leaf_srcAltValue(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('srcAlt', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_src1x(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('src1x', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_src2x(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('src2x', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_src3x(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('src3x', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_src4x(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('src4x', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_width(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('width', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_height(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('height', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_alt(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('alt', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_zoomDisabled(node: NodeInfo, route: NodeInfo[]): void {\n    // if (this.isInlineImageTag(route)) return; // inline images render their own chain\n\n    if (\n      Config.isOfBitType(this.bitType, [\n        BitType.imageSeparator,\n        BitType.pageBanner,\n        BitType.imagesLogoGrave,\n        BitType.prototypeImages,\n        BitType.extractorImage,\n      ])\n    ) {\n      this.writeProperty('zoomDisabled', node.value, route, {\n        format: TagFormat.boolean,\n        writeEmpty: true,\n        ignoreFalse: false,\n        ignoreTrue: true,\n      });\n    } else {\n      this.writeProperty('zoomDisabled', node.value, route, {\n        format: TagFormat.boolean,\n        writeEmpty: true,\n        ignoreFalse: true,\n        ignoreTrue: false,\n      });\n    }\n  }\n\n  protected leaf_license(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('license', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_copyright(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('copyright', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_provider(_node: NodeInfo, _route: NodeInfo[]): void {\n    // provider is included in the url (it is the domain) and should not be written as a property\n    // this.writeProperty('provider', node.value);\n  }\n\n  protected leaf_showInIndex(node: NodeInfo, route: NodeInfo[]): void {\n    if (node.value == null) return;\n\n    this.writeNL_IfNotChain(route);\n    this.writeProperty('showInIndex', node.value, route, {\n      format: TagFormat.boolean,\n      ignoreFalse: true,\n    });\n  }\n\n  protected enter_caption(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value as string;\n\n    this.writeNL_IfNotChain(route);\n    this.writeProperty('caption', value, route, {\n      format: TagFormat.bitmarkText,\n    });\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected leaf_search(node: NodeInfo, route: NodeInfo[]): void {\n    const value = node.value as string;\n\n    if (!value) return;\n\n    this.writeNL_IfNotChain(route);\n    this.writeProperty('search', value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_selected(node: NodeInfo, route: NodeInfo[]): void {\n    if (node.value == null) return;\n\n    this.writeNL_IfNotChain(route);\n    this.writeProperty('selected', node.value, route, {\n      format: TagFormat.boolean,\n      ignoreFalse: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> resource -> ...\n  // bitmarkAst -> bits -> bitsValue -> resource -> posterImage -> ...\n  // bitmarkAst -> bits -> bitsValue -> resource -> thumbnails -> thumbnailsValue -> ...\n  // [duration,mute,autoplay,allowSubtitles,showSubtitles]\n\n  protected leaf_duration(node: NodeInfo, route: NodeInfo[]): void {\n    // If duration is at the bit level write a NL before the property, otherwise it is part of a chain\n    const parent = this.getParentNode(route);\n    if (parent?.key === NodeType.bitsValue) {\n      this.writeNL();\n    }\n\n    this.writeProperty('duration', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_mute(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('mute', node.value, route, {\n      format: TagFormat.boolean,\n    });\n  }\n\n  protected leaf_autoplay(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('autoplay', node.value, route, {\n      format: TagFormat.boolean,\n    });\n  }\n\n  protected leaf_allowSubtitles(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('allowSubtitles', node.value, route, {\n      format: TagFormat.boolean,\n    });\n  }\n\n  protected leaf_showSubtitles(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('showSubtitles', node.value, route, {\n      format: TagFormat.boolean,\n    });\n  }\n\n  //\n  // Resources\n  //\n\n  //\n  // Generated Node Handlers\n  //\n\n  /**\n   * Generate the handlers for resources, as they are mostly the same, but not quite\n   */\n\n  protected generateResourceHandlers() {\n    for (const tag of Enum(ResourceType).keys()) {\n      // skip unknown\n      if (tag === Enum(ResourceType).keyFromValue(ResourceType.unknown)) continue;\n\n      const enterFuncName = `enter_${tag}`;\n\n      // Skip if the function already exists, allows for custom handlers\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      if (typeof (this as any)[enterFuncName] === 'function') {\n        continue;\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (this as any)[enterFuncName] = (node: NodeInfo, route: NodeInfo[]): boolean => {\n        const resource = node.value as ResourceDataJson | undefined;\n        if (resource == null) return false;\n\n        // Ignore any property that is not at the bit level as that will be handled by a different handler\n        const parent = this.getParentNode(route);\n        if (parent?.key !== NodeType.resourcesValue) return true;\n\n        // Get the resource alias\n        const alias = Enum(ResourceType).fromValue(parent?.value.__typeAlias);\n        const type = alias ?? Enum(ResourceType).fromValue(parent?.value.type);\n        if (!type) return false;\n\n        // url / src / href / app\n        const url = resource.url || resource.src || resource.body || '';\n\n        // Write the resource\n        this.writeNL();\n        this.writeResource(type, url);\n\n        // Continue traversal\n        return true;\n      };\n\n      // Bind this\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (this as any)[enterFuncName] = (this as any)[enterFuncName].bind(this);\n    }\n\n    // for (const tag of ResourceTag.keys()) {\n    //   // skip unknown\n    //   if (tag === ResourceTag.keyFromValue(ResourceTag.unknown)) continue;\n\n    //   const enterFuncName = `enter_${tag}`;\n\n    //   // Skip if the function already exists, allows for custom handlers\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   if (typeof (this as any)[enterFuncName] === 'function') {\n    //     continue;\n    //   }\n\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[enterFuncName] = (node: NodeInfo, route: NodeInfo[]): boolean => {\n    //     const resource = node.value as ResourceDataJson | undefined;\n    //     if (resource == null) return false;\n\n    //     // Ignore any property that is not at the bit level as that will be handled by a different handler\n    //     const parent = this.getParentNode(route);\n    //     if (parent?.key !== NodeType.resourcesValue) return true;\n\n    //     // Get the resource alias\n    //     const alias = ResourceTag.fromValue(parent.value.__typeAlias);\n    //     const type = alias ?? ResourceTag.fromValue(parent.value.type);\n    //     if (!type) return false;\n\n    //     // url / src / href / app\n    //     const url = resource.url || resource.src || resource.body || '';\n\n    //     // Write the resource\n    //     this.writeNL();\n    //     this.writeResource(type, url);\n\n    //     // Continue traversal\n    //     return true;\n    //   };\n\n    //   // Bind this\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[enterFuncName] = (this as any)[enterFuncName].bind(this);\n    // }\n  }\n\n  /**\n   * Generate the handlers for properties, as they are mostly the same, but not quite\n   */\n\n  protected generatePropertyHandlers() {\n    for (const propertyConfigKey of Enum(PropertyKey).values()) {\n      const propertyTag = configKeyToPropertyType(propertyConfigKey);\n\n      const funcNames = [`enter_${propertyTag}`, `leaf_${propertyTag}`];\n      for (const funcName of funcNames) {\n        // Skip if the function already exists, allows for custom handlers\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        if (typeof (this as any)[funcName] === 'function') {\n          continue;\n        }\n\n        // Skip 'example' property as it is non-standard and handled elsewhere\n        if (propertyTag === 'example') continue;\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (this as any)[funcName] = (node: NodeInfo, route: NodeInfo[]) => {\n          const value = node.value as unknown[] | undefined;\n          if (value == null) return;\n\n          // Ignore any property that is not at the bit level as that will be handled by a different handler\n          const parent = this.getParentNode(route);\n          if (parent?.key !== NodeType.bitsValue) return;\n\n          const bitType = this.getBitType(route);\n          if (!bitType) return;\n\n          const config = Config.getBitConfig(bitType);\n          const propertyConfig = Config.getTagConfigForTag(config.tags, propertyConfigKey) as\n            | PropertyTagConfig\n            | undefined;\n          if (!propertyConfig) return;\n\n          // Write the property\n          // this.writeNL_IfNotChain(route); // Only if NOT in chain\n          this.writeProperty(propertyConfig.tag, node.value, route, {\n            format: propertyConfig.format ?? TagFormat.plainText,\n            array: propertyConfig.array ?? false,\n            writeEmpty: true,\n            ignoreFalse: propertyConfig.defaultValue === 'false',\n            ignoreTrue: propertyConfig.defaultValue === 'true',\n          });\n        };\n\n        // Bind this\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (this as any)[funcName] = (this as any)[funcName].bind(this);\n      }\n    }\n\n    // const propertiesConfig = Config.getRawPropertiesConfig();\n\n    // for (const propertyConfig of Object.values(propertiesConfig)) {\n    //   const astKey = propertyConfig.astKey ?? propertyConfig.tag;\n\n    //   const enterFuncName = `enter_${astKey}`;\n\n    //   // Skip if the function already exists, allows for custom handlers\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   if (typeof (this as any)[enterFuncName] === 'function') {\n    //     continue;\n    //   }\n\n    //   // Skip 'example' property as it is non-standard and handled elsewhere\n    //   if (astKey === 'example') continue;\n\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[enterFuncName] = (node: NodeInfo, route: NodeInfo[]) => {\n    //     const value = node.value as unknown[] | undefined;\n    //     if (value == null) return;\n\n    //     // Ignore any property that is not at the bit level as that will be handled by a different handler\n    //     const parent = this.getParentNode(route);\n    //     if (parent?.key !== NodeType.bitsValue) return;\n\n    //     // Write the property\n    //     this.writeNL_IfNotChain(route); // Only if NOT in chain\n    //     this.writeProperty(propertyConfig.tag, node.value, {\n    //       format: propertyConfig.format ?? TagFormat.plainText,\n    //       single: propertyConfig.single ?? false,\n    //       writeEmpty: true,\n    //       ignoreFalse: propertyConfig.defaultValue === 'false',\n    //       ignoreTrue: propertyConfig.defaultValue === 'true',\n    //     });\n    //   };\n\n    //   // Bind this\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[enterFuncName] = (this as any)[enterFuncName].bind(this);\n    // }\n  }\n\n  // END NODE HANDLERS\n\n  //\n  // UTILITY FUNCTIONS\n  //\n\n  /**\n   * Get the bit type from any node\n   *\n   * @param route the route to the current node\n   * @returns the bit type\n   */\n  protected getBitType(route: NodeInfo[]): BitTypeType | undefined {\n    for (const node of route) {\n      if (node.key === NodeType.bitsValue) {\n        const n = node.value as Bit;\n        return n?.bitType;\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Check if in a chain.\n   *\n   * Return false if at the root of the bit or a card bit, otherwise true.\n   * This is useful to determine if a newline should be written before certain properties.\n   *\n   * @param route\n   * @returns\n   */\n  protected isChain(route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    // Root of bit\n    if (parent?.key === NodeType.bitsValue) return false;\n\n    // Root of card bits\n    if (parent?.key === NodeType.cardBitsValue) return false;\n    if (parent?.key === NodeType.feedbacksValue) return false;\n    if (parent?.key === NodeType.quizzesValue) return false;\n    if (parent?.key === NodeType.pairsValue) return false;\n    if (parent?.key === NodeType.matrixValue) return false;\n    if (parent?.key === NodeType.definitionsValue) return false;\n    if (parent?.key === NodeType.questionsValue) return false;\n\n    // Root of sub-card bits\n    if (parent?.key === NodeType.reason) return false;\n\n    return true;\n  }\n\n  protected haveValidCardSet(bit: Bit): boolean {\n    const bitConfig = Config.getBitConfig(bit.bitType);\n    if (!bitConfig) return false;\n\n    // There is no easy way to determine if a card set is valid, so we will just check if the bit has a card set\n    // and if so, assume it is valid.\n\n    // This information is used for automatically generating the '==== text ====' divider, so this will not be\n    // generated for any bit that has a card set unless this function is improved, however, a bit that has a\n    // card set in the configuration does not make any sense without a card set, so this is a reasonable behaviour.\n\n    return !!bitConfig.cardSet;\n  }\n\n  protected haveValidFooter(bit: Bit): boolean {\n    const footer = bit.footer;\n    if (!footer) return false;\n    const textFormat = bit.textFormat;\n\n    // Handle footer\n    if (textFormat === TextFormat.json) {\n      // Json footer?!\n      // Not valid, ignore\n      return false;\n    } else if (footer.footer && footer.footer.length > 0) {\n      if (this.isBodyBitmarkText) {\n        // handle bitmark text\n        return true;\n      } else {\n        // Plain text footer?!\n        // Not valid, ignore (plain text cannot have a card set / footer marker, so cannot have a footer!\n        return false;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Calculate the number of spaces around values from the options.\n   *\n   * This function should only be called from the constructor.\n   * Otherwise use this.spacesAroundValues.\n   *\n   * @returns\n   */\n  protected calcSpacesAroundValues(): number {\n    const val = this.options.spacesAroundValues;\n    let spaces = DEFAULT_SPACES_AROUND_VALUES;\n    if (val != null) {\n      if (val === true) {\n        spaces = DEFAULT_SPACES_AROUND_VALUES;\n      } else if (val === false) {\n        spaces = 0;\n      } else {\n        spaces = val;\n      }\n    }\n    spaces = Math.min(Math.max(spaces, 0), MAX_SPACES_AROUND_VALUES);\n\n    return spaces;\n  }\n\n  // END UTILITY FUNCTIONS\n\n  //\n  // WRITE FUNCTIONS\n  //\n\n  /**\n   * Helper function to write a tag key, breakscaping appropriately.\n   * Use only to write a tag key.\n   *\n   * @param s\n   */\n  protected writeTagKey<T extends string>(s?: T): void {\n    if (s != null) {\n      this.write(\n        Breakscape.breakscape(`${s}`, {\n          format: TextFormat.plainText,\n          location: TextLocation.tag,\n        }),\n      );\n    }\n  }\n\n  /**\n   * Write text or value, handling:\n   *  - the format and location (i.e. conversion to text and breakscaping).\n   *  - the spaces around values (if tag value).\n   *\n   * @param text\n   * @param format\n   * @param location\n   * @param options\n   */\n  protected writeTextOrValue(\n    text: JsonText,\n    format: TextFormatType,\n    location: TextLocationType,\n    options?: GenerateOptions,\n  ) {\n    const isTagValue = location === TextLocation.tag;\n    const s = typeof text === 'string' ? text : undefined;\n    const ast = Array.isArray(text) ? (text as TextAst) : undefined;\n    const spaces = isTagValue ? this.spacesAroundValuesStr : '';\n\n    // For plain strings use TextFormat.text, otherwise keep the requested format for breakscaping.\n    const breakscapeFormat = format === TextFormat.bitmarkText ? format : TextFormat.plainText;\n\n    /** Wrap a piece of text in the required padding (only for tag values). */\n    const wrap = (content: string) => (isTagValue ? `${spaces}${content}${spaces}` : content);\n\n    /**\n     * Capture everything written by `action` into `partWriter`,\n     * then restore the original writer and return the trimmed text.\n     */\n    const writeToPartWriter = (action: () => void): string => {\n      const originalWriter = this.writer;\n\n      this.writer = this.partWriter;\n      this.partWriter.openSync();\n\n      action();\n\n      this.partWriter.closeSync();\n      const result = this.partWriter.getString().trim();\n\n      this.writer = originalWriter;\n      return result;\n    };\n\n    /* String */\n    if (s != null) {\n      const writeString = () =>\n        this.write(\n          Breakscape.breakscape(s, {\n            format: breakscapeFormat,\n            location,\n          }),\n        );\n\n      if (isTagValue) {\n        const written = writeToPartWriter(writeString);\n        if (written) this.write(wrap(written));\n      } else {\n        writeString(); // already writes directly to main writer\n      }\n      return; // nothing more to do for string input\n    }\n\n    /* AST */\n    if (ast != null) {\n      const generateAst = () => this.textGenerator.generateSync(ast, format, location, options);\n\n      if (isTagValue) {\n        const written = writeToPartWriter(generateAst);\n        if (written) this.write(wrap(written));\n      } else {\n        generateAst();\n      }\n    }\n  }\n\n  protected writeString(s?: string): void {\n    if (s != null) this.write(`${s}`);\n  }\n\n  protected writeOPBUL(): void {\n    this.write('[•');\n  }\n\n  protected writeOPESC(): void {\n    this.write('[^');\n  }\n\n  protected writeOPRANGLE(): void {\n    this.write('[►');\n  }\n\n  protected writeOPDANGLE(): void {\n    this.write('[▼');\n  }\n\n  protected writeOPD(level: number): void {\n    this.write(`[${'.'.repeat(level)}`);\n  }\n\n  protected writeOPU(): void {\n    this.write('[_');\n  }\n\n  protected writeOPE(): void {\n    this.write('[=');\n  }\n\n  protected writeOPB(): void {\n    this.write('[!');\n  }\n\n  protected writeOPQ(): void {\n    this.write('[?');\n  }\n\n  protected writeOPA(): void {\n    this.write('[@');\n  }\n\n  protected writeOPP(): void {\n    this.write('[+');\n  }\n\n  protected writeOPM(): void {\n    this.write('[-');\n  }\n\n  protected writeOPS(): void {\n    this.write('[\\\\');\n  }\n\n  protected writeOPR(): void {\n    this.write('[*');\n  }\n\n  protected writeOPC(): void {\n    this.write('[%');\n  }\n\n  protected writeOPAMP(): void {\n    this.write('[&');\n  }\n\n  protected writeOPDOLLAR(): void {\n    this.write('[$');\n  }\n\n  protected writeOPHASH(): void {\n    this.write('[#');\n  }\n\n  protected writeOPPRE(): void {\n    this.write(\"['\");\n  }\n\n  protected writeOPPOST(): void {\n    this.write('['); // TODO - not sure what symbol is for postfix\n  }\n\n  protected writeOP(): void {\n    this.write('[');\n  }\n\n  protected writeCL(): void {\n    // HACK to fix breakscaping when string ends with a ^ (must add a space) if\n    // options.spacesAroundValues is 0\n    if (this.spacesAroundValues === 0) {\n      if (this.writer.getLastWrite().endsWith('^')) {\n        this.write(' ]');\n      } else {\n        this.write(']');\n      }\n    } else {\n      this.write(']');\n    }\n  }\n\n  protected writeAmpersand(): void {\n    this.write('&');\n  }\n\n  protected writeColon(): void {\n    this.write(':');\n  }\n\n  // protected writeDoubleColon(): void {\n  //   this.write('::');\n  // }\n\n  protected writeHash(): void {\n    this.write('#');\n  }\n\n  protected writeSpacesAroundValues(): void {\n    this.write(this.spacesAroundValuesStr);\n  }\n\n  protected writePlainTextDivider(): void {\n    this.writeNL();\n    this.write('==== text ====');\n  }\n\n  protected writeCardSetStart(): void {\n    this.writeNL();\n    if (this.options.cardSetVersion === CardSetVersion.v1) {\n      this.write('===');\n    } else {\n      this.write('====');\n    }\n  }\n\n  protected writeCardSetEnd(): void {\n    this.writeNL();\n    if (this.options.cardSetVersion === CardSetVersion.v1) {\n      this.write('===');\n    } else {\n      // this.write('==== footer ===='); // Written by the footer\n    }\n  }\n\n  protected writeCardSetCardDivider(qualifier?: string): void {\n    this.writeNL();\n    const divider = this.getCardDividerMarker();\n    this.write(divider);\n    if (qualifier) {\n      this.appendCardDividerQualifier(qualifier);\n    }\n  }\n\n  protected writeCardSetSideDivider(): void {\n    this.writeNL();\n    if (this.options.cardSetVersion === CardSetVersion.v1) {\n      this.write('==');\n    } else {\n      this.write('--');\n    }\n  }\n\n  protected writeCardSetVariantDivider(): void {\n    this.writeNL();\n    if (this.options.cardSetVersion === CardSetVersion.v1) {\n      this.write('--');\n    } else {\n      this.write('++');\n    }\n  }\n\n  private getCardDividerMarker(): string {\n    return this.options.cardSetVersion === CardSetVersion.v1 ? '===' : '====';\n  }\n\n  private appendCardDividerQualifier(qualifier: string): void {\n    const marker = this.getCardDividerMarker();\n    const normalizedQualifier = Breakscape.breakscape(qualifier, {\n      format: TextFormat.plainText,\n      location: TextLocation.tag,\n    });\n    this.write(' ');\n    this.write(normalizedQualifier);\n    this.write(' ');\n    this.write(marker);\n  }\n\n  protected writeNL_IfNotChain(route: NodeInfo[]): void {\n    if (!this.isChain(route)) {\n      this.writeNL();\n    }\n  }\n\n  protected writeNL(): void {\n    if (this.options.debugGenerationInline) {\n      this.write('\\\\n');\n      return;\n    }\n    this.write('\\n');\n  }\n\n  protected writePropertyStyleResource(\n    key: string,\n    resource: ResourceJson,\n    deprecated_writeAsProperty = false,\n  ): boolean | void {\n    if (key && resource) {\n      const resourceTag = Enum(ResourceType).keyFromValue(resource.type) ?? '';\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const resourceData = (resource as any)[resourceTag];\n      const src = resourceData\n        ? resourceData.src || resourceData.url || resourceData.body || ''\n        : '';\n\n      if (deprecated_writeAsProperty) {\n        this.writeOPA();\n      } else {\n        this.writeOPAMP();\n      }\n      this.writeTagKey(key);\n      this.writeColon();\n      this.writeTextOrValue(src, TextFormat.plainText, TextLocation.tag);\n\n      if (resource.type === ResourceType.article) {\n        // this.writeNL();\n      }\n      this.writeCL();\n    }\n  }\n\n  protected writeResource(type: ResourceTypeType, value: string): void {\n    // const resourceAsArticle = resource as ArticleResource;\n\n    if (type) {\n      // Standard case\n      this.writeOPAMP();\n      this.writeTagKey(type);\n      this.writeColon();\n      this.writeTextOrValue(value, TextFormat.plainText, TextLocation.tag);\n\n      if (type === ResourceType.article) {\n        // this.writeNL();\n      }\n      this.writeCL();\n    }\n  }\n\n  protected writeProperty(\n    name: string,\n    values: unknown | unknown[] | undefined,\n    route: NodeInfo[],\n    options: {\n      format: TagFormatType;\n      array?: boolean;\n      ignoreFalse?: boolean;\n      ignoreTrue?: boolean;\n      writeEmpty?: boolean;\n      forceChain?: boolean;\n    },\n  ): void {\n    let valuesArray: unknown[];\n\n    if (values !== undefined) {\n      const isBitmarkText = options.format === TagFormat.bitmarkText;\n\n      if (isBitmarkText) {\n        // Write bitmark text\n        if (!options.writeEmpty && isBitmarkText && this.isEmptyText(values as TextAst)) return;\n        this.writeOPA();\n        this.writeTagKey(name);\n        this.writeColon();\n        this.writeTextOrValue(values as TextAst, TextFormat.bitmarkText, TextLocation.tag);\n        this.writeCL();\n      } else {\n        // Write any other property type\n        if (!Array.isArray(values)) {\n          valuesArray = [values];\n        } else {\n          valuesArray = values;\n        }\n\n        if (valuesArray.length > 0) {\n          if (!options.array) valuesArray = valuesArray.slice(valuesArray.length - 1);\n\n          let propertyIndex = 0;\n          for (const val of valuesArray) {\n            if (val !== undefined) {\n              if (options.ignoreFalse && val === false) continue;\n              if (options.ignoreTrue && val === true) continue;\n              if (!options.writeEmpty && val === '') continue;\n              // if (propertyIndex > 0) this.writeNL_IfNotChain(route);\n              if (!options.forceChain && propertyIndex === 0) this.writeNL_IfNotChain(route);\n              this.writeOPA();\n              this.writeTagKey(name);\n              this.writeColon();\n              this.writeTextOrValue(`${val}`, TextFormat.plainText, TextLocation.tag);\n              this.writeCL();\n              propertyIndex++;\n            }\n          }\n        }\n      } // isBitmarkText\n    }\n  }\n\n  protected writeInlineDebug(\n    key: string,\n    state: { open?: boolean; close?: boolean; single?: boolean },\n  ) {\n    let tag = key;\n    if (state.open) {\n      tag = `<${key}>`;\n    } else if (state.close) {\n      tag = `</${key}>`;\n    } else if (state.single) {\n      tag = `<${key} />`;\n    }\n\n    this.writeString(tag);\n  }\n\n  //\n  // Helper functions\n  //\n\n  protected isEmptyText(text: TextAst | undefined): boolean {\n    if (!text) return true;\n    if (Array.isArray(text)) return text.length === 0;\n    return true; // true as not valid TextAst?\n  }\n\n  protected isWriteTextFormat(bitsValue: string, textFormatDefault: TextFormatType): boolean {\n    const isDefault = Enum(TextFormat).fromValue(bitsValue) === textFormatDefault;\n    const writeFormat = !isDefault || this.options.explicitTextFormat;\n    return !!writeFormat;\n  }\n\n  protected calculateIsCardAllowed(): boolean {\n    return this.isBodyBitmarkText && !this.isOfBitType1() && !this.isTableBitType();\n  }\n\n  protected isTableBitType(): boolean {\n    return this.isOfBitType([BitType.table]);\n  }\n\n  protected isOfBitType1(): boolean {\n    return this.isOfBitType([\n      BitType.trueFalse1,\n      BitType.multipleChoice1,\n      BitType.multipleResponse1,\n    ]);\n  }\n\n  protected isOfBitType(baseBitType: BitTypeType | BitTypeType[]): boolean {\n    return Config.isOfBitType(this.bitType, baseBitType);\n  }\n\n  //\n  // Writer interface\n  //\n\n  /**\n   * Writes a string value to the output.\n   * @param value - The string value to be written.\n   */\n  write(value: string): this {\n    this.writer.write(value);\n    return this;\n  }\n\n  /**\n   * Writes a new line to the output. The line is indented automatically. The line is ended with the endOfLineString.\n   * @param value - The line to write. When omitted, only the endOfLineString is written.\n   */\n  writeLine(value?: string): this {\n    this.writer.writeLine(value);\n    return this;\n  }\n\n  /**\n   * Writes a collection of lines to the output. Each line is indented automatically and ended with the endOfLineString.\n   * @param values - The lines to write.\n   * @param delimiter - An optional delimiter to be written at the end of each line, except for the last one.\n   */\n  writeLines(values: string[], delimiter?: string): this {\n    this.writer.writeLines(values, delimiter);\n    return this;\n  }\n\n  /**\n   * Writes a single whitespace character to the output.\n   */\n  writeWhiteSpace(): this {\n    this.writer.writeWhiteSpace();\n    return this;\n  }\n}\n\nexport { BitmarkGenerator };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst CardSetVersion = {\n  v1: 1,\n  v2: 2,\n} as const;\n\nexport type CardSetVersionType = EnumType<typeof CardSetVersion>;\n\nexport { CardSetVersion };\n","import { StringWriter } from '../../ast/writer/StringWriter.ts';\nimport { type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type Generator } from '../Generator.ts';\nimport { BitmarkGenerator, type BitmarkGeneratorOptions } from './BitmarkGenerator.ts';\n\n/**\n * Generate bitmark markup from a bitmark AST as a string\n */\nclass BitmarkStringGenerator implements Generator<BitmarkAst, string> {\n  private generator: BitmarkGenerator;\n  private writer: StringWriter;\n\n  /**\n   * Generate bitmark markup from a bitmark AST as a string\n   *\n   * @param bitmarkVersion - bitmark version, use null to use latest version\n   * @param options - bitmark generation options\n   */\n  constructor(options?: BitmarkGeneratorOptions) {\n    this.writer = new StringWriter();\n    this.generator = new BitmarkGenerator(this.writer, options);\n  }\n\n  /**\n   * Generate bitmark markup from bitmark AST as a string\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<string> {\n    await this.generator.generate(ast);\n    return this.writer.getString();\n  }\n\n  /**\n   * Generate bitmark markup from bitmark AST as a string synchronously\n   *\n   * @param ast bitmark AST\n   */\n  public generateSync(ast: BitmarkAst): string {\n    this.generator.generateSync(ast);\n    return this.writer.getString();\n  }\n}\n\nexport { BitmarkStringGenerator };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Ast, type NodeInfo } from '../../ast/Ast.ts';\nimport { type Writer } from '../../ast/writer/Writer.ts';\nimport { Breakscape } from '../../breakscaping/Breakscape.ts';\nimport { Config } from '../../config/Config.ts';\nimport { type BreakscapedString } from '../../model/ast/BreakscapedString.ts';\nimport { type Bit, type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type Example, type ExtraProperties } from '../../model/ast/Nodes.ts';\nimport { type Body, type CardBit } from '../../model/ast/Nodes.ts';\nimport { NodeType, type NodeTypeType } from '../../model/ast/NodeType.ts';\nimport {\n  type JsonText,\n  type TextAst,\n  type TextNode,\n  type TextNodeAttibutes,\n} from '../../model/ast/TextNodes.ts';\nimport {\n  configKeyToPropertyType,\n  configKeyToResourceType,\n} from '../../model/config/enum/ConfigKey.ts';\nimport {\n  BitmarkVersion,\n  type BitmarkVersionType,\n  DEFAULT_BITMARK_VERSION,\n} from '../../model/enum/BitmarkVersion.ts';\nimport { BitType, type BitTypeType } from '../../model/enum/BitType.ts';\nimport { BodyBitType, type BodyBitTypeType } from '../../model/enum/BodyBitType.ts';\nimport { ExampleType } from '../../model/enum/ExampleType.ts';\nimport { PropertyKey } from '../../model/enum/PropertyKey.ts';\nimport { ResourceType, type ResourceTypeType } from '../../model/enum/ResourceType.ts';\nimport { TextFormat, type TextFormatType } from '../../model/enum/TextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../../model/enum/TextLocation.ts';\nimport { TextNodeType } from '../../model/enum/TextNodeType.ts';\nimport {\n  type BitJson,\n  type BookReferenceJson,\n  type ExampleJson,\n  type HeadingJson,\n  type ListItemJson,\n  type MarkConfigJson,\n  type StatementJson,\n  type TableExtendedJson,\n  type TableJson,\n} from '../../model/json/BitJson.ts';\nimport { type BitWrapperJson } from '../../model/json/BitWrapperJson.ts';\nimport { type BodyBitJson } from '../../model/json/BodyBitJson.ts';\nimport {\n  type ImageResourceWrapperJson,\n  type ResourceJson,\n  type ResourceWrapperJson,\n} from '../../model/json/ResourceJson.ts';\nimport { type ParserInfo } from '../../model/parser/ParserInfo.ts';\nimport { TextParser } from '../../parser/text/TextParser.ts';\nimport { BooleanUtils } from '../../utils/BooleanUtils.ts';\nimport { NumberUtils } from '../../utils/NumberUtils.ts';\nimport { AstWalkerGenerator } from '../AstWalkerGenerator.ts';\nimport { TextGenerator } from '../text/TextGenerator.ts';\n\nconst MOVE_BODY_RECURSION_LIMIT = 5000;\n\nconst DEFAULT_OPTIONS: JsonOptions = {\n  // debugGenerationInline: true,\n};\n\n/**\n * JSON output options\n */\nexport interface JsonOptions {\n  /**\n   * Enable parser warnings.\n   *\n   * If not set or false, parser warnings will not be included in the output.\n   * If true, any parser warnings will be included in the output.\n   */\n  enableWarnings?: boolean | number;\n\n  /**\n   * Prettify the JSON.\n   *\n   * If not set or false, JSON will not be prettified.\n   * If true, JSON will be prettified with an indent of 2.\n   * If a positive integer, JSON will be prettified with an indent of this number.\n   *\n   * If prettify is set, a string will be returned if possible.\n   */\n  prettify?: boolean | number;\n\n  /**\n   * Stringify the JSON.\n   *\n   * If not set or false, JSON will be returned as a plain JS object.\n   * It true, JSON will be stringified.\n   *\n   * If prettify is set, it will override this setting.\n   */\n  stringify?: boolean;\n\n  /**\n   * Output text as plain text rather than parsed bitmark text\n   *\n   * If not set, the default for the bitmark version will be used.\n   * If false, text will be output as parsed bitmark text.\n   * It true, text will be output as plain text strings.\n   */\n  textAsPlainText?: boolean;\n\n  /**\n   * Exclude unknown properties in the output.\n   *\n   * If not set or false, unknown properties will be included in the JSON output.\n   * It true, unknown properties will NOT be included in the JSON output.\n   *\n   */\n  excludeUnknownProperties?: boolean;\n\n  /**\n   * [development only]\n   * Generate debug information in the output.\n   */\n  debugGenerationInline?: boolean;\n}\n\n/**\n * JSON generator options\n */\nexport interface JsonGeneratorOptions {\n  /**\n   * bitmarkVersion - The version of bitmark to output.\n   * If not specified, the version will default to 3.\n   *\n   * Specifying the version will set defaults for other options.\n   * - Bitmark v2:\n   *   - textAsPlainText: true\n   * - Bitmark v3:\n   *   - textAsPlainText: false\n   */\n  bitmarkVersion?: BitmarkVersionType;\n\n  /**\n   * The options for JSON generation.\n   */\n  jsonOptions?: JsonOptions;\n}\n\ninterface ExampleNode {\n  isExample: boolean;\n  example?: Example | undefined;\n  __isDefaultExample: boolean;\n}\n\ninterface ExampleJsonWrapper {\n  isExample: boolean;\n  example: ExampleJson;\n}\n\n/**\n * Generate bitmark JSON from a bitmark AST\n *\n *\n */\nclass JsonGenerator extends AstWalkerGenerator<BitmarkAst, void> {\n  protected ast = new Ast();\n  protected textGenerator: TextGenerator;\n  private bitmarkVersion: BitmarkVersionType;\n  private textParserVersion: string;\n  private textParser = new TextParser();\n\n  // TODO - move to context\n  private options: JsonOptions;\n  private jsonPrettifySpace: number | undefined;\n  private writer: Writer;\n\n  // State\n  private json: Partial<BitWrapperJson>[] = [];\n  private bitWrapperJson: Partial<BitWrapperJson> = {};\n  private bitJson: Partial<BitJson> = {};\n  private textDefault: JsonText = Breakscape.EMPTY_STRING;\n  private bodyDefault: JsonText = Breakscape.EMPTY_STRING;\n  private bodyJson: JsonText = this.bodyDefault;\n  private listItem: ListItemJson | undefined;\n  private placeholderIndex = 0;\n\n  /**\n   * Generate bitmark JSON from a bitmark AST\n   *\n   * @param writer - destination for the output\n   * @param options - JSON generation options\n   */\n  constructor(writer: Writer, options?: JsonGeneratorOptions) {\n    super();\n\n    // Bind callbacks\n    this.enter = this.enter.bind(this);\n    this.between = this.between.bind(this);\n    this.exit = this.exit.bind(this);\n    this.leaf = this.leaf.bind(this);\n    this.bodyBitCallback = this.bodyBitCallback.bind(this);\n\n    this.bitmarkVersion =\n      Enum(BitmarkVersion).fromValue(options?.bitmarkVersion) ?? DEFAULT_BITMARK_VERSION;\n    this.textParserVersion = this.textParser.version();\n    this.options = {\n      ...DEFAULT_OPTIONS,\n      ...options?.jsonOptions,\n    };\n\n    this.debugGenerationInline = this.options.debugGenerationInline ?? false;\n    this.jsonPrettifySpace =\n      this.options.prettify === true ? 2 : this.options.prettify || undefined;\n\n    // Set defaults according to bitmark version\n    if (this.bitmarkVersion === BitmarkVersion.v2) {\n      if (this.options.textAsPlainText === undefined) {\n        this.options.textAsPlainText = true;\n      }\n    } else {\n      if (this.options.textAsPlainText === undefined) {\n        this.options.textAsPlainText = false;\n      }\n    }\n\n    // Create the text generator for generating v2 texts\n    this.textGenerator = new TextGenerator(BitmarkVersion.v2, {\n      // writeCallback: this.write,\n      bodyBitCallback: this.bodyBitCallback,\n      debugGenerationInline: this.debugGenerationInline,\n    });\n\n    this.writer = writer;\n\n    this.generatePropertyHandlers();\n  }\n\n  /**\n   * Generate bitmark markup from bitmark AST\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<void> {\n    // Reset the state\n    this.resetState();\n\n    // Open the writer\n    await this.writer.open();\n\n    // Walk the bitmark AST\n    this.walkAndWrite(ast);\n\n    // Write the JSON object to file\n    this.write(JSON.stringify(this.json, null, this.jsonPrettifySpace));\n\n    // Close the writer\n    await this.writer.close();\n  }\n\n  /**\n   * Generate text from a bitmark text AST synchronously\n   *\n   * @param ast bitmark text AST\n   */\n  public generateSync(ast: BitmarkAst): void {\n    // Reset the state\n    this.resetState();\n\n    // Open the writer\n    this.writer.openSync();\n\n    // Walk the bitmark AST\n    this.walkAndWrite(ast);\n\n    // Write the JSON object to file\n    this.write(JSON.stringify(this.json, null, this.jsonPrettifySpace));\n\n    // Close the writer\n    this.writer.closeSync();\n  }\n\n  private resetState(): void {\n    this.json = [];\n    this.bitWrapperJson = {};\n    this.bitJson = {};\n    this.textDefault = this.options.textAsPlainText ? Breakscape.EMPTY_STRING : [];\n    this.bodyDefault = this.options.textAsPlainText ? Breakscape.EMPTY_STRING : [];\n    this.bodyJson = this.bodyDefault;\n    this.listItem = undefined;\n    this.placeholderIndex = 0;\n\n    this.printed = false;\n  }\n\n  private walkAndWrite(ast: BitmarkAst): void {\n    // Walk the bitmark AST\n    this.ast.walk(ast, NodeType.bitmarkAst, this, undefined);\n  }\n\n  //\n  // NODE HANDLERS\n  //\n\n  //\n  // Non-Terminal nodes (branches)\n  //\n\n  // bitmark\n\n  protected enter_bitmarkAst(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Reset the JSON\n    this.json = [];\n  }\n\n  protected exit_bitmarkAst(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Convert all bitmark text to plain text if required\n    if (this.options.textAsPlainText) {\n      // Convert all bitmark text to plain text\n      this.convertAllBitmarkTextsToStringsForPlainText(this.json);\n    }\n\n    // Walk the entire json object and remove all' '_xxx' properties\n    // (which are used to store temporary data during the generation process)\n    this.removeTemporaryProperties(this.json);\n  }\n\n  // bitmarkAst -> bits\n\n  // bitmarkAst -> bits -> bitsValue\n\n  protected enter_bitsValue(node: NodeInfo, _route: NodeInfo[]): void {\n    const bit = node.value as Bit;\n\n    // Reset\n    this.bitWrapperJson = {\n      //\n    };\n    this.json.push(this.bitWrapperJson);\n\n    this.bitJson = this.createBitJson(bit);\n    this.bitWrapperJson.bit = this.bitJson as BitJson;\n\n    // Handle example at the root level - this is bit dependent; configuration is in the bit metadata\n    // There is same logic here to select the correct default value of the example is the default is\n    // required, and this is bit depenedent.\n    // This is ugly, but it is even uglier if the defaults at set in the AST.\n\n    const bitConfig = Config.getBitConfig(bit.bitType);\n    const textFormat = this.getTextFormat(_route);\n    const hasRootExample = !!bitConfig.rootExampleType;\n    const isBoolean = bitConfig.rootExampleType === ExampleType.boolean;\n\n    if (hasRootExample) {\n      // Calculate the value of the default example\n      let defaultExample: string | boolean;\n      if (isBoolean) {\n        // Boolean example\n        defaultExample = true;\n        if (Config.isOfBitType(bit.bitType, BitType.trueFalse1)) {\n          if (bit.cardNode?.statement?.isCorrect !== undefined) {\n            defaultExample = bit.cardNode.statement.isCorrect;\n          }\n        }\n      } else {\n        // String example\n        // Don't use sampleSolution as the default example for conversation bits\n        // See: https://github.com/getMoreBrain/cosmic/issues/7293\n        // defaultExample = (ArrayUtils.asSingle(bit.sampleSolution) as string) ?? '';\n        defaultExample = 'true';\n      }\n\n      const exampleRes = this.toExample(bit as ExampleNode, {\n        defaultExample,\n        isBoolean,\n        textFormat,\n      });\n      this.bitJson.isExample = exampleRes.isExample;\n      this.bitJson.example = exampleRes.example;\n    } else if (bit.isExample) {\n      this.bitJson.isExample = true;\n    }\n\n    // Reset the placeholder index\n    this.placeholderIndex = 0;\n  }\n\n  protected exit_bitsValue(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Move isExample / example to end of bit JSON from beginning\n    const isExample = this.bitJson.isExample;\n    const example = this.bitJson.example;\n    delete this.bitJson.isExample;\n    delete this.bitJson.example;\n    this.bitJson.isExample = isExample;\n    this.bitJson.example = example;\n\n    // Clean up the bit JSON, removing any unwanted values\n    this.cleanBitJson(this.bitJson);\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> imageSource\n\n  protected enter_imageSource(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> person\n\n  protected enter_person(node: NodeInfo, route: NodeInfo[]): boolean {\n    const bitType = this.getBitType(route);\n\n    let keyOverride = 'person';\n    if (Config.isOfBitType(bitType, BitType.conversationLeft1)) {\n      // Use the legacy partner property in the JSON for conversation bits, so change to person is backwards compatible\n      keyOverride = 'partner';\n    }\n\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false, keyOverride });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> ratingLevelStart\n\n  protected enter_ratingLevelStart(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> ratingLevelEnd\n\n  protected enter_ratingLevelEnd(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> productId\n\n  protected enter_productId(node: NodeInfo, route: NodeInfo[]): boolean {\n    const productIds = node.value as string[];\n\n    // Ignore item that is not at the correct level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const bitType = this.getBitType(route);\n\n    if (bitType === BitType.module) {\n      this.addProperty(this.bitJson, 'productId', productIds, { array: true });\n    } else if (productIds.length > 0) {\n      this.addProperty(this.bitJson, 'productId', productIds[productIds.length - 1], {\n        array: false,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> markConfig\n\n  protected enter_markConfig(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Handler so markConfig is not processed by the default property handler\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> markConfig -> markConfigValue\n\n  protected enter_markConfigValue(node: NodeInfo, route: NodeInfo[]): boolean {\n    const markJson = node.value as MarkConfigJson;\n\n    // Ignore item that is not at the correct level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.markConfig) return true;\n\n    if (!this.bitJson.marks) this.bitJson.marks = [];\n    this.bitJson.marks.push(markJson);\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> item\n\n  protected enter_item(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> lead\n\n  protected enter_lead(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> pageNumber\n\n  protected enter_pageNumber(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> marginNumber\n\n  protected enter_marginNumber(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> hint\n\n  protected enter_hint(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> instruction\n\n  protected enter_instruction(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> titleString\n\n  protected leaf_titleString(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ignore title that are not at the bit level as they are handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    // this.bitJson.title = node.value;\n    return this.standardHandler(node, route, [NodeType.bitsValue], {\n      array: false,\n      keyOverride: 'title',\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> title\n\n  protected enter_title(node: NodeInfo, route: NodeInfo[]): boolean {\n    // // Ignore title that are not at the bit or card node level as they are handled elsewhere\n    // const parent = this.getParentNode(route);\n    // if (parent?.key !== NodeType.bitsValue && parent?.key !== NodeType.cardNode) return;\n\n    // this.bitJson.title = node.value;\n    return this.standardHandler(node, route, [NodeType.bitsValue, NodeType.cardNode], {\n      array: true,\n    });\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> subtitle\n\n  protected enter_subtitle(node: NodeInfo, route: NodeInfo[]): boolean {\n    // this.bitJson.subtitle = node.value;\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> caption\n\n  protected enter_caption(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> width\n\n  protected enter_width(node: NodeInfo, route: NodeInfo[]): boolean {\n    let value = node.value as string | number;\n    const bitType = this.getBitType(route);\n\n    const parent = this.getParentNode(route);\n    if (parent?.key === NodeType.bitsValue && Config.isOfBitType(bitType, BitType.extractorBlock)) {\n      value = NumberUtils.asNumber(value, 0) ?? 0;\n    }\n\n    // Add the property\n    return this.standardHandler(node, route, undefined, { array: false, valueOverride: value });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> height\n\n  protected enter_height(node: NodeInfo, route: NodeInfo[]): boolean {\n    let value = node.value as string | number;\n    const bitType = this.getBitType(route);\n\n    const parent = this.getParentNode(route);\n    if (parent?.key === NodeType.bitsValue && Config.isOfBitType(bitType, BitType.extractorBlock)) {\n      value = NumberUtils.asNumber(value, 0) ?? 0;\n    }\n\n    // Add the property\n    return this.standardHandler(node, route, undefined, { array: false, valueOverride: value });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> extraProperties\n\n  protected enter_extraProperties(node: NodeInfo, _route: NodeInfo[]): void {\n    const extraProperties = node.value as ExtraProperties | undefined;\n\n    if (!this.options.excludeUnknownProperties && extraProperties) {\n      for (const [key, values] of Object.entries(extraProperties)) {\n        let k = key;\n        if (Object.prototype.hasOwnProperty.call(this.bitJson, key)) {\n          k = `_${key}`;\n        }\n        this.addProperty(this.bitJson, k, values, { array: true });\n      }\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> cardBits -> cardBitsValue\n\n  protected enter_cardBitsValue(node: NodeInfo, route: NodeInfo[]): void {\n    const cardBit = node.value as CardBit;\n\n    // How cardBits are handled depends on the bit type\n    const bitType = this.getBitType(route);\n    if (!bitType) return;\n\n    let listItems: ListItemJson[] | undefined;\n\n    if (bitType === BitType.bookReferenceList) {\n      if (!this.bitJson.bookReferences) this.bitJson.bookReferences = [];\n      const bookReference: Partial<BookReferenceJson> = {};\n\n      this.addProperty(bookReference, 'lang', cardBit.lang, { array: false });\n      this.addProperty(bookReference, 'refAuthor', cardBit.refAuthor ?? [], { array: true });\n      this.addProperty(bookReference, 'refBookTitle', cardBit.refBookTitle ?? [], { array: false });\n      this.addProperty(bookReference, 'refPublisher', cardBit.refPublisher ?? [], { array: true });\n      this.addProperty(bookReference, 'refPublicationYear', cardBit.refPublicationYear ?? [], {\n        array: false,\n      });\n      this.addProperty(bookReference, 'citationStyle', cardBit.citationStyle ?? [], {\n        array: false,\n      });\n\n      this.bitJson.bookReferences.push(bookReference as BookReferenceJson);\n    } else {\n      // Create the listItems / sections if not already created\n      if (bitType === BitType.pageFooter) {\n        if (!this.bitJson.sections) this.bitJson.sections = [];\n        listItems = this.bitJson.sections;\n      } else {\n        if (!this.bitJson.listItems) this.bitJson.listItems = [];\n        listItems = this.bitJson.listItems;\n      }\n\n      // Create this list item\n      this.listItem = {\n        item: (cardBit.item ?? []) as JsonText,\n        lead: (cardBit.lead ?? []) as JsonText,\n        hint: (cardBit.hint ?? []) as JsonText,\n        instruction: (cardBit.instruction ?? []) as JsonText,\n        // ...this.toItemLeadHintInstruction(node.value),\n        body: this.bodyDefault,\n      };\n\n      // Delete unwanted properties\n      // const nv = node.value;\n      // const li: Partial<ListItemJson> = this.listItem;\n\n      listItems.push(this.listItem);\n    }\n  }\n\n  protected exit_cardBitsValue(_node: NodeInfo, _route: NodeInfo[]): void {\n    this.listItem = undefined;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body\n\n  protected enter_body(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value as Body;\n\n    const parent = this.getParentNode(route);\n    if (!parent) return false;\n\n    const textFormat = this.getTextFormat(route);\n    const isBitmarkText = textFormat === TextFormat.bitmarkText;\n\n    this.bodyJson = value.body as JsonText;\n\n    // Set the correct body property\n    if (parent.key === NodeType.bitsValue) {\n      // Body is at the bit level\n      this.bitJson.body = this.bodyJson;\n\n      const bodyIsBitmarkText = isBitmarkText && this.isBitmarkText(this.bodyJson);\n\n      // Convert the body to plain text if required\n      if (this.options.textAsPlainText && bodyIsBitmarkText) {\n        const textBody = this.textGenerator.generateSync(\n          this.bodyJson as TextAst,\n          textFormat,\n          TextLocation.body,\n          {\n            noBreakscaping: true,\n          },\n        );\n        this.bitJson.body = (textBody ?? '').trim();\n      } else if (bodyIsBitmarkText) {\n        // If the body is bitmark text, convert the body bits to move their attributes to the attrs property\n        this.bitJson.body = this.moveBodyBitPropertiesToAttrs(this.bodyJson as TextAst);\n      }\n    } else if (parent.key === NodeType.cardBitsValue) {\n      // Body is at the list item (card bit) level\n      if (this.listItem) this.listItem.body = this.bodyJson;\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected bodyBitCallback(bodyBit: BodyBitJson, _index: number, _route: NodeInfo[]): string {\n    // console.log('bodyBitCallback', bodyBit, index, route);\n\n    const placeholder = `{${this.placeholderIndex}}`;\n    this.placeholderIndex++;\n    this.bitJson.placeholders = this.bitJson.placeholders ?? {};\n    this.bitJson.placeholders[placeholder] = bodyBit;\n\n    return placeholder;\n  }\n\n  /**\n   * Move all properties of body bits to the attrs property.\n   * This function is called recursively to process all body bits in the body tree.\n   *\n   * NOTE: Internally, the body bit is stored as it appears in bitmark v2, but in v3 all the properties\n   * should be in the `attrs` property. The properies are only moved to 'attrs' for the JSON output\n   *\n   * The original body bit is not modified.\n   * The function returns a new body bit with the properties moved.\n   *\n   * @param nodes the body to process, or the subtree to process\n   * @param recursion leave as default, used for recursion only\n   * @returns\n   */\n  protected moveBodyBitPropertiesToAttrs(nodes: TextAst, recursion: number = 0): TextAst {\n    if (recursion === 0) {\n      nodes = structuredClone(nodes);\n    } else if (recursion > MOVE_BODY_RECURSION_LIMIT) {\n      throw new Error('Recursion limit exceeded');\n    }\n    for (const node of nodes) {\n      if (\n        node.type !== BodyBitType.text &&\n        Enum(BodyBitType)\n          .values()\n          .includes(node.type as BodyBitTypeType)\n      ) {\n        const bodyBit = node as unknown as BodyBitJson;\n        bodyBit.attrs = {} as Record<string, unknown>;\n\n        // Move all properties except type to the attrs property\n        for (const [key, value] of Object.entries(bodyBit)) {\n          if (key === 'type' || key === 'attrs') continue;\n          bodyBit.attrs[key] = value;\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          delete (bodyBit as any)[key];\n        }\n      } else if (Array.isArray(node.content)) {\n        recursion++;\n        this.moveBodyBitPropertiesToAttrs(node.content as TextAst, recursion);\n      }\n    }\n\n    return nodes;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> footer\n\n  protected enter_footer(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, undefined, {\n      array: true,\n      valueOverride: node.value.footer,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> elements\n\n  protected enter_elements(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, undefined, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards\n\n  protected enter_flashcards(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, {\n      array: true,\n      keyOverride: 'cards',\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions\n\n  protected enter_definitions(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> statement\n\n  protected enter_statement(node: NodeInfo, route: NodeInfo[]): void {\n    const statement = node.value as StatementJson;\n\n    // Ignore statement that is not at the cardNode level as it is handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode) return;\n\n    if (statement) {\n      this.bitJson.statement = statement.statement ?? [];\n      this.bitJson.isCorrect = statement.isCorrect ?? false;\n      this.bitJson.example = statement.example;\n      this.bitJson.isExample = statement.isExample;\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> statements -> statementsValue\n\n  protected enter_statements(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> choices\n  // X bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes -> quizzesValue -> choices\n  // X bitmarkAst -> bits -> bitsValue -> cardNode -> feedbacks -> feedbacksValue -> choices\n\n  protected enter_choices(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> responses\n  // X bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes -> quizzesValue -> responses\n\n  protected enter_responses(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> feedbacks\n\n  protected enter_feedbacks(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes\n\n  protected enter_quizzes(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> heading\n\n  protected enter_heading(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, undefined, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pairs\n\n  protected enter_pairs(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> matrix\n\n  protected enter_matrix(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pronunciationTable\n\n  protected enter_pronunciationTable(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table\n\n  protected enter_table(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> questions\n\n  protected enter_questions(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses\n\n  protected enter_botResponses(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, {\n      array: true,\n      keyOverride: 'responses',\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> ingredients -> ingredientsValue\n  protected enter_ingredients(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList\n\n  protected enter_captionDefinitionList(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> backgroundWallpaper\n\n  protected enter_backgroundWallpaper(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> imagePlaceholder\n\n  protected enter_imagePlaceholder(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> previewImage\n\n  protected enter_previewImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> previewVideo\n\n  protected enter_previewVideo(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformIcon\n\n  protected enter_platformIcon(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformLogo\n\n  protected enter_platformLogo(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformBackgroundImage\n\n  protected enter_platformBackgroundImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> coverImage\n\n  protected enter_coverImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, {\n      array: Array.isArray(node.value),\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> backgroundImage\n\n  protected enter_backgroundImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, {\n      array: Array.isArray(node.value),\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> resources\n\n  protected enter_resources(node: NodeInfo, route: NodeInfo[]): boolean {\n    const resources = node.value as ResourceJson[];\n    const bitType = this.getBitType(route);\n    const resourceType = this.getResourceType(route);\n\n    if (!resources || !bitType) return true;\n\n    let resourceJson: ResourceJson | undefined;\n\n    const bitConfig = Config.getBitConfig(bitType);\n    const bitResourcesConfig = Config.getBitResourcesConfig(bitType, resourceType);\n    const comboMap = bitResourcesConfig.comboResourceConfigKeysMap;\n\n    if (comboMap.size > 0) {\n      // The resource is a combo resource\n      // Extract the resource types from the combo resource\n      // NOTE: There should only ever be one combo resource per bit, but the code can handle multiple\n      // except for overwriting resourceJson\n      for (const [comboConfigKey, resourceConfigKeys] of comboMap.entries()) {\n        // Convert the config key to a ResourceType\n        const comboTagType = configKeyToResourceType(comboConfigKey);\n\n        // Create the combo resource wrapper\n        const wrapper: ResourceWrapperJson = {\n          type: comboTagType,\n          __typeAlias: comboTagType,\n          __configKey: comboConfigKey,\n        };\n\n        // For each of the resources in this combo resource, find the actual resource and add it to the JSON\n        for (const ck of resourceConfigKeys) {\n          const r = resources.find((r) => r.__configKey === ck);\n          // Extract everything except the type from the resource\n          if (r) {\n            const tagConfig = Config.getTagConfigForTag(bitConfig.tags, r.__configKey);\n            if (tagConfig) {\n              const key = tagConfig.jsonKey ?? tagConfig.tag;\n              const configKey = tagConfig.configKey ?? r.__configKey;\n              const json = r.__configKey === configKey ? r : undefined;\n              if (json) {\n                for (const [k, v] of Object.entries(json)) {\n                  if (k !== 'type') {\n                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                    (wrapper as any)[key] = v;\n                  }\n                }\n              }\n            }\n          }\n        }\n        resourceJson = wrapper as ResourceJson;\n      }\n    } else if (\n      Config.isOfBitType(bitType, [\n        BitType.imagesLogoGrave,\n        BitType.prototypeImages,\n        BitType.extractorImage,\n      ])\n    ) {\n      // The resource is a logo-grave  / prototpye-images resource\n      const images: ImageResourceWrapperJson[] = [];\n      for (const r of resources) {\n        if (r.type === ResourceType.image) {\n          images.push(r);\n        }\n      }\n      if (bitType === BitType.imagesLogoGrave) {\n        this.bitJson.logos = images;\n      } else {\n        this.bitJson.images = images;\n      }\n    } else {\n      // This is a standard resource. If there is more than one resource, use the first one.\n      // There should not be more than one because of validation\n      if (resources.length >= 1) {\n        resourceJson = resources[0]; // this.parseResourceToJson(bitType, resources[0]);\n      }\n    }\n\n    this.bitJson.resource = resourceJson;\n\n    return false;\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> level\n\n  protected leaf_level(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> book (array)\n\n  protected enter_book(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> book (single)\n\n  protected leaf_book(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> anchor\n\n  protected leaf_anchor(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> reference\n\n  protected leaf_reference(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> referenceEnd\n\n  protected leaf_referenceEnd(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> markup\n\n  protected leaf_markup(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const bitmark = node.value as string | undefined;\n    if (bitmark) this.bitWrapperJson.bitmark = bitmark;\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> * -> internalComment\n\n  protected enter_internalComment(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Stop traversal of this branch, handled in enter_parser()\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> parser\n\n  protected enter_parser(node: NodeInfo, route: NodeInfo[]): void {\n    const parser = node.value as ParserInfo | undefined;\n    const bitType = this.getBitType(route);\n    const parent = this.getParentNode(route);\n\n    if (parser && bitType) {\n      const { version, warnings, errors, ...parserRest } = parser;\n      const bitmarkVersion = `${this.bitmarkVersion}`;\n      const textParserVersion = this.textParserVersion;\n\n      // Extract internal comments from the AST and add to the parser\n      const internalComments = this.getInternalComments(route);\n\n      if (parent?.key === NodeType.bitsValue) {\n        // Bit level parser information\n        this.bitWrapperJson.parser = {\n          version,\n          bitmarkVersion,\n          textParserVersion,\n          internalComments,\n          ...parserRest,\n          warnings,\n          errors,\n        };\n\n        if (!this.options.enableWarnings) {\n          // Remove warnings if not enabled\n          delete this.bitWrapperJson.parser.warnings;\n        }\n      } else {\n        // Top level parser information (not specific to a bit)\n        // TODO - not sure where this error can be written\n        // this.bitWrapperJson.parser = {\n        //   errors,\n        // };\n      }\n    }\n  }\n\n  // bitmarkAst -> errors\n\n  // protected enter_errors(node: NodeInfo, _route: NodeInfo[],\n  // context: Context): void {\n  //   const errors = node.value as ParserError[] | undefined;\n  //   if (errors && errors.length > 0) {\n  //     // Complete bit is invalid\n  //     // TODO - not sure where this error can be written\n  //     // this.bitWrapperJson.parser = {\n  //     //   errors,\n  //     // };\n  //   }\n  // }\n\n  //\n  // Generated Node Handlers\n  //\n\n  /**\n   * Generate the handlers for properties, as they are mostly the same, but not quite\n   */\n  protected generatePropertyHandlers() {\n    // TODO\n    // const propertiesConfig = Config.getRawPropertiesConfig();\n    // for (const propertyConfig of Object.values(propertiesConfig)) {\n    //   const astKey = propertyConfig.astKey ?? propertyConfig.tag;\n    //   const funcName = `enter_${astKey}`;\n    //   // Skip if the function already exists, allows for custom handlers\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   if (typeof (this as any)[funcName] === 'function') {\n    //     continue;\n    //   }\n    //   // Skip 'example' property as it is non-standard and handled elsewhere\n    //   if (astKey === 'example') continue;\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[funcName] = (node: NodeInfo, route: NodeInfo[]) => {\n    //     const value = node.value as unknown[] | undefined;\n    //     if (value == null) return;\n    //     // if (key === 'progress') debugger;\n    //     // Ignore any property that is not at the bit level as that will be handled by a different handler\n    //     const parent = this.getParentNode(route);\n    //     if (parent?.key !== NodeType.bitsValue) return;\n    //     // Convert key as needed\n    //     const jsonKey = propertyConfig.jsonKey ?? propertyConfig.tag;\n    //     // Add the property\n    //     this.addProperty(this.bitJson, jsonKey, value, { array: !propertyConfig.single });\n    //   };\n    //   // Bind this\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[funcName] = (this as any)[funcName].bind(this);\n    // }\n\n    for (const propertyConfigKey of Enum(PropertyKey).values()) {\n      const propertyTag = configKeyToPropertyType(propertyConfigKey);\n\n      const funcNames = [`enter_${propertyTag}`, `leaf_${propertyTag}`];\n      for (const funcName of funcNames) {\n        // Skip if the function already exists, allows for custom handlers\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        if (typeof (this as any)[funcName] === 'function') {\n          continue;\n        }\n        // Skip 'example' property as it is non-standard and handled elsewhere\n        if (propertyTag === 'example') continue;\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (this as any)[funcName] = (node: NodeInfo, route: NodeInfo[]) => {\n          const value = node.value as unknown[] | undefined;\n          if (value == null) return;\n          // if (key === 'progress') debugger;\n          // Ignore any property that is not at the bit level as that will be handled by a different handler\n          const parent = this.getParentNode(route);\n          if (parent?.key !== NodeType.bitsValue) return;\n          // // Convert key as needed\n          // const jsonKey = propertyConfig.jsonKey ?? propertyConfig.tag;\n          // // Add the property\n          // this.addProperty(this.bitJson, jsonKey, value, { array: !propertyConfig.single });\n\n          // Add the property\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          (this.bitJson as any)[propertyTag] = value;\n        };\n        // Bind this\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (this as any)[funcName] = (this as any)[funcName].bind(this);\n      }\n    }\n  }\n\n  // // END NODE HANDLERS\n\n  //\n  // HELPER FUNCTIONS\n  //\n\n  /**\n   * Default handler for properties.\n   *\n   * @param node the node\n   * @param route  the route to the node\n   * @param parentNodeTypes the parent node types for which to handle the node\n   * @returns\n   */\n  protected standardHandler(\n    node: NodeInfo,\n    route: NodeInfo[],\n    parentNodeTypes: NodeTypeType | NodeTypeType[] | undefined,\n    options: {\n      array: boolean;\n      allowNull?: boolean;\n      keyOverride?: string;\n      valueOverride?: unknown;\n    },\n  ): boolean {\n    // Ignore items not at the nodeType level\n    if (parentNodeTypes) {\n      const nodeTypeArray = Array.isArray(parentNodeTypes) ? parentNodeTypes : [parentNodeTypes];\n      const parent = this.getParentNode(route);\n      if (!parent?.key || !nodeTypeArray.includes(parent?.key)) return true;\n    }\n\n    // Add the property\n    this.addProperty(\n      this.bitJson,\n      options.keyOverride ?? node.key,\n      options.valueOverride ?? node.value,\n      options,\n    );\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected addProperty(\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    target: any,\n    name: string,\n    values: unknown | unknown[] | undefined,\n    options: {\n      array: boolean;\n      allowNull?: boolean;\n    },\n  ): void {\n    if (values !== undefined) {\n      let finalValue: unknown | unknown[] | undefined;\n      if (!Array.isArray(values)) values = [values];\n      const valuesArr = values as unknown[];\n\n      // if (valuesArr.length > 0) {\n      if (!options.array && valuesArr.length >= 1) {\n        finalValue = valuesArr[valuesArr.length - 1];\n      } else {\n        finalValue = valuesArr;\n      }\n      // }\n\n      if (options.allowNull || finalValue != null) {\n        target[name] = finalValue;\n      }\n    }\n  }\n\n  protected toExample(\n    node: ExampleNode,\n    options: {\n      defaultExample: string | boolean | null;\n      isBoolean: boolean;\n      textFormat: TextFormatType;\n    },\n  ): ExampleJsonWrapper {\n    const { isExample, example, __isDefaultExample } = node;\n    const { defaultExample, isBoolean } = options;\n\n    if (!isExample) {\n      return {\n        isExample: false,\n        example: null,\n      };\n    }\n\n    let exampleValue;\n    if (__isDefaultExample) {\n      exampleValue = isBoolean\n        ? BooleanUtils.toBoolean(defaultExample)\n        : this.convertBreakscapedStringToJsonText(\n            defaultExample as BreakscapedString,\n            options.textFormat,\n            TextLocation.tag,\n          );\n    } else {\n      exampleValue = isBoolean\n        ? BooleanUtils.toBoolean(example)\n        : this.convertBreakscapedStringToJsonText(\n            example as BreakscapedString,\n            options.textFormat,\n            TextLocation.tag,\n          );\n    }\n\n    return {\n      isExample: true,\n      example: exampleValue,\n    };\n  }\n\n  /**\n   * Get the bit type from any node\n   *\n   * @param route the route to the current node\n   * @returns the bit type\n   */\n  protected getBitType(route: NodeInfo[]): BitTypeType | undefined {\n    for (const node of route) {\n      if (node.key === NodeType.bitsValue) {\n        const n = node.value as Bit;\n        return n?.bitType;\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Get the text format from any node\n   *\n   * @param route the route to the current node\n   * @returns the text format\n   */\n  protected getTextFormat(route: NodeInfo[]): TextFormatType {\n    const bitType = this.getBitType(route);\n\n    if (bitType) {\n      const bitConfig = Config.getBitConfig(bitType);\n      for (const node of route) {\n        if (node.key === NodeType.bitsValue) {\n          const n = node.value as Bit;\n          return Enum(TextFormat).fromValue(n?.textFormat) ?? bitConfig.textFormatDefault;\n        }\n      }\n    }\n\n    return TextFormat.bitmarkText;\n  }\n\n  /**\n   * Get the bit resourceType atttachment from any node\n   *\n   * @param route the route to the current node\n   * @returns the bit type\n   */\n  protected getResourceType(route: NodeInfo[]): ResourceTypeType | undefined {\n    for (const node of route) {\n      if (node.key === NodeType.bitsValue) {\n        const n = node.value as Bit;\n        return n?.resourceType;\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Get the internal comments from any node\n   *\n   * @param route the route to the current node\n   * @returns the text format\n   */\n  protected getInternalComments(route: NodeInfo[]): BreakscapedString[] | undefined {\n    const bitType = this.getBitType(route);\n\n    if (bitType) {\n      for (const node of route) {\n        if (node.key === NodeType.bitsValue) {\n          const n = node.value as Bit;\n          return n.internalComment as BreakscapedString[];\n        }\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Convert the text from the AST to the JSON format:\n   * Input:\n   *  - breakscaped string\n   * Output:\n   *  - text: plain text\n   *  - json: bitmark text JSON\n   *  - Bitmark v2: breakscaped string\n   *  - Bitmark v3: bitmark text JSON (TextAst)\n   *\n   * In the case of Bitmark v2 type texts, there is nothing to do but cast the type.\n   *\n   * @param text\n   * @returns\n   */\n  protected convertBreakscapedStringToJsonText(\n    text: BreakscapedString | undefined,\n    format: TextFormatType,\n    textLocation: TextLocationType,\n  ): JsonText {\n    if (!text) return '';\n\n    const isBitmarkText = format === TextFormat.bitmarkText;\n\n    if (!isBitmarkText) {\n      // Not bitmark text, so plain text, so  unbreakscape only the start of bit tags\n      return text || '';\n    }\n\n    const asPlainText = this.options.textAsPlainText;\n    if (asPlainText) {\n      return text || '';\n    }\n\n    // Use the text parser to parse the text\n    const textAst = this.textParser.toAst(text, {\n      format,\n      location: textLocation,\n    });\n\n    return textAst;\n  }\n\n  /**\n   * Concatenates a plain JSON text with a JsonText that may be plain (v2) or BitmarkText (v3)\n   * Returns the combined text.\n   *\n   * @param text the text to concatenate\n   * @param textPlain the plain text to concatenate\n   */\n  protected concatenatePlainTextWithJsonTexts(\n    text: JsonText,\n    extraBreaks: number,\n    textPlain: string,\n  ): JsonText {\n    if (Array.isArray(text)) {\n      textPlain = textPlain.trim();\n      if (textPlain) {\n        const splitText = textPlain.split('\\n');\n        const content: TextNode[] = [];\n\n        for (let i = 0; i < extraBreaks; i++) {\n          content.push({\n            type: TextNodeType.hardBreak,\n          });\n        }\n\n        for (let i = 0; i < splitText.length; i++) {\n          const t = splitText[i];\n          if (t) {\n            content.push({\n              text: t,\n              type: TextNodeType.text,\n            });\n          }\n          // Add a hard break after each paragraph, except the last one\n          if (i < splitText.length - 1) {\n            content.push({\n              type: TextNodeType.hardBreak,\n            });\n          }\n        }\n\n        // Add the content to the final paragraph, or create a new one if there none\n        const lastNode = text[text.length - 1];\n        if (lastNode && lastNode.type === TextNodeType.paragraph) {\n          lastNode.content = [...(lastNode.content ?? []), ...content];\n        } else {\n          text.push({\n            type: TextNodeType.paragraph,\n            content,\n            attrs: {} as TextNodeAttibutes,\n          });\n        }\n      }\n      return text;\n    }\n\n    return `${text ?? ''}${'\\n'.repeat(extraBreaks)}${textPlain ?? ''}`;\n  }\n\n  /**\n   * Check if an object is bitmark text\n   * The check looks for a special tag on the array (__tag: 'text')\n   *\n   * @param obj object that might be bitmark text\n   * @returns\n   */\n  protected isBitmarkText(obj: unknown): boolean {\n    if (obj == null) return false;\n    if (!Array.isArray(obj)) return false;\n\n    // Check for the hidden text tag\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    if ((obj as any).__tag === 'text') return true;\n\n    return false;\n  }\n\n  //\n  // WRITE FUNCTIONS\n  //\n\n  protected writeInlineDebug(\n    key: string,\n    state: { open?: boolean; close?: boolean; single?: boolean },\n  ) {\n    let tag = key;\n    if (state.open) {\n      tag = `<${key}>`;\n    } else if (state.close) {\n      tag = `</${key}>`;\n    } else if (state.single) {\n      tag = `<${key} />`;\n    }\n\n    this.writeString(tag);\n  }\n\n  protected writeString(s?: string): void {\n    if (s != null) this.write(`${s}`);\n  }\n\n  /**\n   * Create a new bit json object.\n   * - This function defines the order of the properties in the json.\n   *\n   * @param bit\n   * @returns\n   */\n  protected createBitJson(bit: Bit): Partial<BitJson> {\n    const format: string = bit.textFormat as string;\n\n    const bitJson: Partial<BitJson> = {\n      type: bit.isCommented ? BitType._comment : bit.bitType,\n      originalType: bit.isCommented ? bit.bitType : undefined,\n      format,\n      bitLevel: bit.bitLevel,\n    };\n\n    return bitJson;\n  }\n\n  /**\n   * Remove wanted properties from bit json object.\n   * - This function defines the defaults for properties in the json.\n   *\n   * TODO: All these defaults should come from the config and be set in the Builder.\n   *\n   * @param bit\n   * @returns\n   */\n  protected cleanBitJson(bitJson: Partial<BitJson>): Partial<BitJson> {\n    const bitType = Config.getBitType(bitJson.type);\n    // const bitConfig = Config.getBitConfig(bitType);\n    // const textFormat = bitJson.format;\n    // const plainText = this.options.textAsPlainText;\n\n    // Clear 'originalType' if not set\n    if (bitJson.originalType == null) bitJson.originalType = undefined;\n\n    // Clear 'item' which may be an empty string if 'lead' was set but item not\n    // Only necessary because '.article' does not include a default value for 'item'\n    // which is totally inconsistent, but maybe is wanted.\n    if (!bitJson.item) bitJson.item = undefined;\n\n    // Add default properties to the bit.\n    // NOTE: Not all bits have the same default properties.\n    //       The properties used are a bit random sometimes?\n    //       It would be better if this functionality was generated from the bit config\n    if (Config.isOfBitType(bitType, [BitType._error, BitType._comment])) {\n      // Special case for _error and _comment bits\n      delete bitJson.format;\n      delete bitJson.item;\n      delete bitJson.lead;\n      delete bitJson.pageNumber;\n      delete bitJson.marginNumber;\n      delete bitJson.hint;\n      delete bitJson.instruction;\n      //\n    } else {\n      let isTopLevelExample = false;\n      let isTopLevelExampleValue = false;\n\n      // Most bits have these defaults, but there are special cases (not sure if that is by error or design)\n      if (Config.isOfBitType(bitType, [BitType.page])) {\n        // Bits without item, lead, etc\n        if (bitJson.item == null || bitJson.item?.length === 0) delete bitJson.item;\n        if (bitJson.lead == null || bitJson.lead?.length === 0) delete bitJson.lead;\n        if (bitJson.pageNumber == null || bitJson.pageNumber?.length === 0)\n          delete bitJson.pageNumber;\n        if (bitJson.marginNumber == null || bitJson.marginNumber?.length === 0)\n          delete bitJson.marginNumber;\n        if (bitJson.hint == null || bitJson.hint?.length === 0) delete bitJson.hint;\n        if (bitJson.instruction == null || bitJson.instruction?.length === 0)\n          delete bitJson.instruction;\n      } else {\n        // Majority of bits\n        if (bitJson.item == null) bitJson.item = this.textDefault;\n        if (bitJson.lead == null) bitJson.lead = this.textDefault;\n        if (bitJson.hint == null) bitJson.hint = this.textDefault;\n        if (bitJson.instruction == null) bitJson.instruction = this.textDefault;\n        if (bitJson.pageNumber == null) bitJson.pageNumber = this.textDefault;\n        if (bitJson.marginNumber == null) bitJson.marginNumber = this.textDefault;\n      }\n      if (bitJson.body == null) bitJson.body = this.bodyDefault;\n\n      if (Config.isOfBitType(bitType, [BitType.article])) {\n        //\n      }\n\n      if (Config.isOfBitType(bitType, [BitType.example])) {\n        // With 'example' value at the bit level.\n        isTopLevelExample = true;\n        isTopLevelExampleValue = true;\n      }\n\n      if (\n        Config.isOfBitType(bitType, [\n          BitType.multipleChoice1,\n          BitType.multipleResponse1,\n          BitType.multipleChoiceText,\n          BitType.highlightText,\n          BitType.gapText,\n          BitType.gapTextInstructionGrouped,\n          BitType.clozeAndMultipleChoiceText,\n          BitType.sequence,\n          BitType.mark,\n          BitType.flashcard,\n          BitType.definitionList,\n        ])\n      ) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n      }\n\n      if (Config.isOfBitType(bitType, [BitType.sequence])) {\n        // With 'example' value at the bit level.\n        isTopLevelExample = true;\n        isTopLevelExampleValue = true;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.cloze)) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n\n        if (Config.isOfBitType(bitType, BitType.clozeSolutionGrouped)) {\n          // Solution grouped\n          if (bitJson.quizCountItems == null) bitJson.quizCountItems = true;\n          if (bitJson.quizStrikethroughSolutions == null) bitJson.quizStrikethroughSolutions = true;\n        } else if (Config.isOfBitType(bitType, BitType.clozeInstructionGrouped)) {\n          // Instruction grouped\n          if (bitJson.quizCountItems == null) bitJson.quizCountItems = true;\n          if (bitJson.quizStrikethroughSolutions == null)\n            bitJson.quizStrikethroughSolutions = false;\n        }\n      }\n\n      if (Config.isOfBitType(bitType, [BitType.multipleChoice, BitType.multipleResponse])) {\n        // Default with a card (and hence a footer possibility)\n        isTopLevelExample = true;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n        if (bitJson.footer == null) bitJson.footer = this.textDefault;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.essay)) {\n        // With 'example' value at the bit level.\n        isTopLevelExample = true;\n        isTopLevelExampleValue = true;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n        if (bitJson.partialAnswer == null) bitJson.partialAnswer = '';\n        // if (bitJson.sampleSolution == null) bitJson.sampleSolution = '';\n      }\n\n      if (Config.isOfBitType(bitType, BitType.trueFalse1)) {\n        // With 'example' value at the bit level.\n        isTopLevelExample = true;\n        isTopLevelExampleValue = true;\n        if (bitJson.isCorrect == null) bitJson.isCorrect = false;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.trueFalse)) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n        if (bitJson.labelFalse == null) bitJson.labelFalse = '';\n        if (bitJson.labelTrue == null) bitJson.labelTrue = '';\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.chapter)) {\n        //\n        if (bitJson.toc == null) bitJson.toc = true; // Always set on chapter bits?\n        if (bitJson.progress == null) bitJson.progress = true; // Always set on chapter bits\n        if (bitJson.level == null) bitJson.level = 1; // Set level 1 if none set (makes no sense, but in ANTLR parser)\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n        //\n      }\n\n      if (Config.isOfBitType(bitType, BitType.interview)) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n        if (bitJson.footer == null) bitJson.footer = this.textDefault;\n        if (bitJson.questions == null) bitJson.questions = [];\n      }\n\n      if (Config.isOfBitType(bitType, BitType.sequence)) {\n        if (bitJson.elements == null) bitJson.elements = [];\n      }\n\n      if (bitType === BitType.matchMatrix) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.match)) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n        if (bitJson.heading == null) bitJson.heading = {} as HeadingJson;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.learningPathBook)) {\n        //\n        if (bitJson.isTracked == null) bitJson.isTracked = true;\n        if (bitJson.isInfoOnly == null) bitJson.isInfoOnly = false;\n        //\n      }\n\n      const tableImageHasTable =\n        Config.isOfBitType(bitType, BitType.tableImage) && !this.tableIsEmpty(bitJson.table);\n      if (\n        (Config.isOfBitType(bitType, BitType.table) &&\n          !Config.isOfBitType(bitType, BitType.tableImage)) ||\n        tableImageHasTable\n      ) {\n        //\n        // if (bitJson.content2Buy == null) bitJson.content2Buy = '';\n        if (bitJson.tableFixedHeader == null) bitJson.tableFixedHeader = false;\n        if (bitJson.tableHeaderWhitespaceNoWrap == null) {\n          bitJson.tableHeaderWhitespaceNoWrap = false;\n        }\n        if (bitJson.tableSearch == null) bitJson.tableSearch = false;\n        if (bitJson.tableSort == null) bitJson.tableSort = false;\n        if (bitJson.tablePagination == null) bitJson.tablePagination = false;\n        if (bitJson.tablePaginationLimit == null) bitJson.tablePaginationLimit = 0;\n        if (bitJson.tableHeight == null) bitJson.tableHeight = 0;\n        if (bitJson.tableWhitespaceNoWrap == null) bitJson.tableWhitespaceNoWrap = false;\n        if (bitJson.tableAutoWidth == null) bitJson.tableAutoWidth = true;\n        if (bitJson.tableResizableColumns == null) bitJson.tableResizableColumns = false;\n        if (bitJson.tableColumnMinWidth == null) bitJson.tableColumnMinWidth = 0;\n        //\n      }\n      if (Config.isOfBitType(bitType, BitType.tableImage) && !tableImageHasTable) {\n        delete bitJson.table;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.bookReference)) {\n        //\n        if (bitJson.refAuthor == null) bitJson.refAuthor = [];\n        if (bitJson.refBookTitle == null) bitJson.refBookTitle = '';\n        if (bitJson.refPublisher == null) bitJson.refPublisher = [];\n        if (bitJson.refPublicationYear == null) bitJson.refPublicationYear = '';\n        //\n      }\n\n      // Page bits\n      if (\n        Config.isOfBitType(bitType, [\n          BitType.pageBanner,\n          BitType.pageBuyButton,\n          BitType.pageBuyButtonAlt,\n          BitType.pageBuyButtonPromotion,\n          BitType.pageFooter,\n          BitType.pageOpenBook,\n          BitType.pagePerson,\n          BitType.printBook,\n          BitType.pageProduct,\n          BitType.pageProductList,\n          BitType.pageProductVideo,\n          BitType.pageProductVideoList,\n          BitType.pageSectionFolder,\n          BitType.pageSubscribe,\n          BitType.pageSubpage,\n        ])\n      ) {\n        //\n        if (bitJson.slug == null) bitJson.slug = '';\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n\n        if (Config.isOfBitType(bitType, BitType.pageBuyButton)) {\n          if (bitJson.content2Buy == null) bitJson.content2Buy = '';\n        }\n      }\n\n      // Special case for 'toc-resource' bits\n      if (Config.isOfBitType(bitType, BitType.tocResource)) {\n        if (bitJson.tocResource == null) bitJson.tocResource = [];\n      }\n\n      // Special case for 'toc-content' bits\n      if (Config.isOfBitType(bitType, BitType.tocContent)) {\n        if (bitJson.tocContent == null) bitJson.tocContent = [];\n      }\n\n      // Special case for 'print-this-chapter' bits\n      if (Config.isOfBitType(bitType, BitType.printThisChapter)) {\n        if (bitJson.printParentChapterLevel == null) bitJson.printParentChapterLevel = -1;\n      }\n\n      // Special case for 'book' bits\n      if (Config.isOfBitType(bitType, BitType.book)) {\n        if (bitJson.maxTocChapterLevel == null) bitJson.maxTocChapterLevel = -1;\n        if (bitJson.allowPrint == null) bitJson.allowPrint = 'useSpaceConfiguration';\n        if (bitJson.hasPrintRestriction == null) bitJson.hasPrintRestriction = true;\n        if (bitJson.enforceUpdateOverUserInput == null) bitJson.enforceUpdateOverUserInput = false;\n        if (bitJson.hasMarkAsDone == null) bitJson.hasMarkAsDone = false;\n        if (bitJson.processHandIn == null) bitJson.processHandIn = false;\n        if (bitJson.isPublic == null) bitJson.isPublic = false;\n        if (bitJson.chatWithBook == null) bitJson.chatWithBook = false;\n        if (bitJson.chatWithBookBrainKey == null) bitJson.chatWithBookBrainKey = '';\n      }\n\n      // Special case for 'ai' bits\n      if (\n        bitType === BitType.articleAi ||\n        bitType === BitType.noteAi ||\n        bitType === BitType.summaryAi\n      ) {\n        if (bitJson.aiGenerated == null) bitJson.aiGenerated = true;\n      }\n\n      // Special case for '-responsive...' bits\n      if (Config.isOfBitType(bitType, [BitType.articleResponsive, BitType.pageArticleResponsive])) {\n        if (bitJson.imageFirst == null) bitJson.imageFirst = true;\n      }\n\n      // Special case for 'review-...' bits\n      if (Config.isOfBitType(bitType, BitType.reviewNote)) {\n        if (bitJson.resolved == null) bitJson.resolved = false;\n        if (bitJson.resolvedDate == null) bitJson.resolvedDate = '';\n        if (bitJson.resolvedBy == null) bitJson.resolvedBy = '';\n      }\n\n      // Special case for 'images-logos-grave' / 'prototype-images' / etc bits\n      if (\n        Config.isOfBitType(bitType, [\n          BitType.imagesLogoGrave,\n          BitType.prototypeImages,\n          BitType.extractorImage,\n        ])\n      ) {\n        if (bitType === BitType.imagesLogoGrave) {\n          if (bitJson.logos == null) {\n            bitJson.logos = [];\n          }\n        } else {\n          if (bitJson.images == null) bitJson.images = [];\n        }\n      }\n\n      // Special case for 'stepImageScreenshotWithPointer' / surveyMatrix / etc bits\n      if (\n        Config.isOfBitType(bitType, [BitType.stepImageScreenshotWithPointer, BitType.surveyMatrix])\n      ) {\n        if (bitJson.pointerTop == null) bitJson.pointerTop = '';\n        if (bitJson.pointerLeft == null) bitJson.pointerLeft = '';\n        if (Config.isOfBitType(bitType, [BitType.surveyMatrix])) {\n          if (bitJson.buttonCaption == null) bitJson.buttonCaption = '';\n        }\n      }\n\n      if (Config.isOfBitType(bitType, [BitType.listItem])) {\n        if (bitJson.listItemIndent == null) bitJson.listItemIndent = 0;\n      }\n\n      // Special case for 'survey-rating-*' bits\n      if (Config.isOfBitType(bitType, BitType.surveyRating)) {\n        //\n        if (bitJson.ratingLevelStart == null) {\n          bitJson.ratingLevelStart = {\n            level: 0,\n          };\n        }\n        if (bitJson.ratingLevelEnd == null) {\n          bitJson.ratingLevelEnd = {\n            level: 0,\n          };\n        }\n      }\n\n      // Special case for 'vendor-stripe-pricing-table' bits\n      if (Config.isOfBitType(bitType, BitType.vendorStripePricingTable)) {\n        if (bitJson.stripePricingTableId == null) bitJson.stripePricingTableId = '';\n        if (bitJson.stripePublishableKey == null) bitJson.stripePublishableKey = '';\n      }\n\n      // Special case for 'call-to-action' bits\n      if (Config.isOfBitType(bitType, BitType.callToAction)) {\n        if (bitJson.buttonCaption == null) bitJson.buttonCaption = '';\n        if (bitJson.callToActionUrl == null) bitJson.callToActionUrl = '';\n      }\n\n      // Special case for 'hand-in-file' / 'hand-in-system-media' bits\n      if (Config.isOfBitType(bitType, [BitType.handInFile, BitType.handInSystemMedia])) {\n        if (bitJson.handInAcceptFileType == null) bitJson.handInAcceptFileType = [];\n      }\n\n      // Special case for 'hand-in-submit' bits\n      if (Config.isOfBitType(bitType, BitType.handInSubmit)) {\n        if (bitJson.handInRequirement == null) bitJson.handInRequirement = [];\n        if (bitJson.handInInstruction == null) bitJson.handInInstruction = '';\n        if (bitJson.buttonCaption == null) bitJson.buttonCaption = '';\n      }\n\n      // Special case for 'module' bits\n      if (Config.isOfBitType(bitType, BitType.module)) {\n        if (bitJson.hasBookNavigation == null) bitJson.hasBookNavigation = true;\n      }\n\n      // Special case for 'container' bits\n      if (Config.isOfBitType(bitType, BitType.container)) {\n        if (bitJson.allowedBit == null) bitJson.allowedBit = [];\n      }\n\n      // Special case for 'platform-path' bits\n      if (Config.isOfBitType(bitType, BitType.platformPath)) {\n        if (bitJson.path == null) bitJson.path = '';\n      }\n\n      // Special case for 'platform-brand-target' bits\n      if (Config.isOfBitType(bitType, BitType.platformBrandTarget)) {\n        if (bitJson.platformBrandTarget == null) bitJson.platformBrandTarget = 'none';\n      }\n\n      // Special case for 'platform-header' bits\n      if (Config.isOfBitType(bitType, BitType.platformHeader)) {\n        if (bitJson.platformLogoMaxHeight == null) bitJson.platformLogoMaxHeight = 40;\n      }\n\n      // Remove top level example if it is not required\n      if (isTopLevelExample) {\n        if (bitJson.isExample == null) bitJson.isExample = false;\n      } else {\n        // Remove example\n        delete bitJson.isExample;\n        delete bitJson.example;\n      }\n      if (isTopLevelExampleValue) {\n        if (bitJson.example == null) bitJson.example = null;\n      } else {\n        // Remove example value\n        delete bitJson.example;\n      }\n    }\n\n    return bitJson;\n  }\n\n  protected tableIsEmpty(table: TableJson | TableExtendedJson | undefined): boolean {\n    if (!table) return true;\n    if (Object.keys(table).length === 0) return true;\n    const tableStandard = table as TableJson;\n    if (tableStandard.columns?.length === 0 && tableStandard.data?.length) {\n      return true;\n    }\n\n    const tableExtended = table as TableExtendedJson;\n    if (\n      tableExtended.header?.rows.length === 0 &&\n      tableExtended.body?.rows.length === 0 &&\n      tableExtended.footer?.rows.length === 0\n    ) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Convert any bitmark texts to strings.\n   */\n  protected convertAllBitmarkTextsToStringsForPlainText(\n    json: Record<string, unknown> | unknown[],\n  ): void {\n    if (!this.options.textAsPlainText) return;\n\n    const obj = json as Record<string, unknown>;\n    for (const key in obj) {\n      const val = obj[key];\n      if (this.isBitmarkText(val)) {\n        const s = this.textGenerator.generateSync(\n          val as TextAst,\n          TextFormat.bitmarkText,\n          TextLocation.tag,\n          {\n            noBreakscaping: true,\n          },\n        );\n        obj[key] = (s ?? '').trim();\n      } else if (typeof obj[key] === 'object') {\n        this.convertAllBitmarkTextsToStringsForPlainText(obj[key] as Record<string, unknown>);\n      }\n    }\n  }\n\n  /**\n   * Remove any property with a key starting with an double underscore.\n   *\n   * @param json\n   */\n  protected removeTemporaryProperties(json: Record<string, unknown> | unknown[]): void {\n    const obj = json as Record<string, unknown>;\n    for (const key in obj) {\n      if (key.startsWith('__')) {\n        delete obj[key];\n      } else if (typeof obj[key] === 'object') {\n        this.removeTemporaryProperties(obj[key] as Record<string, unknown>);\n      }\n    }\n  }\n\n  //\n  // Writer interface\n  //\n\n  /**\n   * Writes a string value to the output.\n   * @param value - The string value to be written.\n   */\n  write(value: string): this {\n    this.writer.write(value);\n    return this;\n  }\n\n  /**\n   * Writes a new line to the output. The line is indented automatically. The line is ended with the endOfLineString.\n   * @param value - The line to write. When omitted, only the endOfLineString is written.\n   */\n  writeLine(value?: string): this {\n    this.writer.writeLine(value);\n    return this;\n  }\n\n  /**\n   * Writes a collection of lines to the output. Each line is indented automatically and ended with the endOfLineString.\n   * @param values - The lines to write.\n   * @param delimiter - An optional delimiter to be written at the end of each line, except for the last one.\n   */\n  writeLines(values: string[], delimiter?: string): this {\n    this.writer.writeLines(values, delimiter);\n    return this;\n  }\n\n  /**\n   * Writes a single whitespace character to the output.\n   */\n  writeWhiteSpace(): this {\n    this.writer.writeWhiteSpace();\n    return this;\n  }\n}\n\nexport { JsonGenerator };\n","import { StringWriter } from '../../ast/writer/StringWriter.ts';\nimport { type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type BitWrapperJson } from '../../model/json/BitWrapperJson.ts';\nimport { type Generator } from '../Generator.ts';\nimport { JsonGenerator, type JsonGeneratorOptions } from './JsonGenerator.ts';\n\n/**\n * Generate bitmark JSON from a bitmark AST as a plain JS object\n *\n */\nclass JsonObjectGenerator implements Generator<BitmarkAst, BitWrapperJson[]> {\n  private generator: JsonGenerator;\n  private writer: StringWriter;\n\n  /**\n   * Generate bitmark JSON from a bitmark AST as a string\n   *\n   * @param options - JSON generation options\n   */\n  constructor(options?: JsonGeneratorOptions) {\n    this.writer = new StringWriter();\n    this.generator = new JsonGenerator(this.writer, options);\n  }\n\n  /**\n   * Generate bitmark JSON from bitmark AST as a plain JS object\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<BitWrapperJson[]> {\n    await this.generator.generate(ast);\n    return JSON.parse(this.writer.getString());\n  }\n\n  /**\n   * Generate bitmark JSON from bitmark AST as a plain JS object synchronously\n   *\n   * @param ast bitmark AST\n   */\n  public generateSync(ast: BitmarkAst): BitWrapperJson[] {\n    this.generator.generateSync(ast);\n    return JSON.parse(this.writer.getString());\n  }\n}\n\nexport { JsonObjectGenerator };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Config } from '../config/Config.ts';\nimport { BitConfig } from '../model/config/BitConfig.ts';\nimport { BitType, type BitTypeType } from '../model/enum/BitType.ts';\n\nexport interface SupportedBitsOptions {\n  includeNonDeprecated?: boolean; // Default: true\n  includeDeprecated?: boolean; // Default: false\n}\n\nexport interface SupportedBit {\n  name: BitTypeType;\n  since: string;\n  deprecated?: string;\n  inheritedBitTypes?: BitTypeType[];\n}\n\nclass InfoBuilder {\n  public getSupportedBits(options?: SupportedBitsOptions): SupportedBit[] {\n    const includeNonDeprecated = options?.includeNonDeprecated ?? true;\n    const includeDeprecated = options?.includeDeprecated ?? false;\n    const supportedBits: SupportedBit[] = [];\n\n    for (const bt of Enum(BitType).values()) {\n      if (bt === BitType._error || bt === BitType._comment) continue;\n\n      const bitType = Config.getBitType(bt);\n      const bitConfig = Config.getBitConfig(bitType);\n\n      const inheritedBitTypes =\n        bitConfig.inheritedBitTypes.length > 0 ? bitConfig.inheritedBitTypes : undefined;\n\n      const include =\n        (includeNonDeprecated && !bitConfig.deprecated) ||\n        (includeDeprecated && bitConfig.deprecated);\n      if (include) {\n        supportedBits.push({\n          name: bt,\n          since: bitConfig.since,\n          deprecated: bitConfig.deprecated,\n          inheritedBitTypes,\n        });\n      }\n    }\n\n    return supportedBits;\n  }\n\n  public getSupportedBitConfigs(): BitConfig[] {\n    const res: BitConfig[] = [];\n\n    for (const bt of Enum(BitType).values()) {\n      if (bt === BitType._error || bt === BitType._comment) continue;\n\n      const bitType = Config.getBitType(bt);\n      const config: BitConfig = Config.getBitConfig(bitType);\n      res.push(config);\n    }\n\n    return res;\n  }\n}\n\nexport { InfoBuilder };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BitmarkParserType = {\n  peggy: 'peggy',\n} as const;\n\nexport type BitmarkParserTypeType = EnumType<typeof BitmarkParserType>;\n\nexport { BitmarkParserType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst InfoFormat = {\n  text: 'text',\n  json: 'json',\n  pojo: 'pojo',\n} as const;\n\nexport type InfoFormatType = EnumType<typeof InfoFormat>;\n\nexport { InfoFormat };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst InfoType = {\n  list: 'list', // List non-deprecated bits\n  deprecated: 'deprecated', // List deprecated bits\n  all: 'all', // List all bits\n  bit: 'bit', // Get information for a bit\n} as const;\n\nexport type InfoTypeType = EnumType<typeof InfoType>;\n\nexport { InfoType };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Builder } from '../../ast/Builder.ts';\nimport { Config } from '../../config/Config.ts';\nimport {\n  type Bit,\n  type BitmarkAst,\n  type Body,\n  type CardBit,\n  type Footer,\n} from '../../model/ast/Nodes.ts';\nimport { type JsonText } from '../../model/ast/TextNodes.ts';\nimport { BitType, type BitTypeType } from '../../model/enum/BitType.ts';\nimport { DeprecatedTextFormat } from '../../model/enum/DeprecatedTextFormat.ts';\nimport { ResourceType, type ResourceTypeType } from '../../model/enum/ResourceType.ts';\nimport { TextFormat, type TextFormatType } from '../../model/enum/TextFormat.ts';\nimport {\n  type BitJson,\n  type BotResponseJson,\n  type ExampleJson,\n  type ListItemJson,\n  type ResponseJson,\n  type StatementJson,\n} from '../../model/json/BitJson.ts';\nimport { type BitWrapperJson } from '../../model/json/BitWrapperJson.ts';\nimport { type BodyBitsJson } from '../../model/json/BodyBitJson.ts';\nimport { type ImageResourceWrapperJson, type ResourceJson } from '../../model/json/ResourceJson.ts';\nimport { StringUtils } from '../../utils/StringUtils.ts';\n\ninterface TitleAndTitleString {\n  titleString?: string;\n  title?: JsonText;\n}\n\ninterface ReferenceAndReferenceProperty {\n  reference?: string;\n  referenceProperty?: string | string[];\n}\n\ninterface Example {\n  example: ExampleJson;\n}\n\nconst builder = new Builder();\n\n/**\n * A parser for parsing bitmark JSON to bitmark AST\n */\nclass JsonParser {\n  /**\n   * Convert JSON to AST.\n   *\n   * The JSON can be a bit or a bitwrapper and can be a string or a plain JS object\n   *\n   * @param json - bitmark JSON as a string or a plain JS object\n   * @returns bitmark AST\n   */\n  toAst(json: unknown): BitmarkAst {\n    const bitWrappers = this.preprocessJson(json);\n    const bitsNodes: Bit[] | undefined = [];\n\n    for (const bitWrapper of bitWrappers) {\n      const { bit, parser } = bitWrapper;\n\n      // Transform to AST\n      const bitsNode = this.bitToAst(bit, parser?.internalComments);\n      if (bitsNode) {\n        bitsNodes.push(bitsNode);\n      }\n    }\n\n    const bits = bitsNodes.length > 0 ? { bits: bitsNodes } : {};\n\n    const ast = builder.buildBitmark(bits);\n\n    return ast;\n  }\n\n  /**\n   * Preprocess bitmark JSON into a standard format (BitWrapperJson[] object) from either a bit or a bitwrapper\n   * as a string or a plain JS object\n   *\n   * @param json - bitmark JSON as a string or a plain JS object\n   * @returns bitmark JSON in a standard format (BitWrapperJson[] object)\n   */\n  preprocessJson(json: string | unknown): BitWrapperJson[] {\n    const bitWrappers: BitWrapperJson[] = [];\n\n    if (StringUtils.isString(json)) {\n      const str = json as string;\n      try {\n        json = JSON.parse(str);\n      } catch (_e) {\n        // Failed to parse JSON, return empty array\n        return [];\n      }\n    }\n\n    // Helper function to push an item that is either a BitWrapper or a Bit to the BitWrapper array as a BitWrapper\n    const pushItemAsBitWrapper = (item: unknown): void => {\n      if (this.isBitWrapper(item)) {\n        const w = item as BitWrapperJson;\n        bitWrappers.push(w);\n      } else if (this.isBit(item)) {\n        const b = item as BitJson;\n        bitWrappers.push(this.bitToBitWrapper(b));\n      }\n    };\n\n    // See if we have an array of bits, or a single bit, or any other known format, and convert that into\n    // an array of bits\n    if (Array.isArray(json)) {\n      for (const item of json) {\n        pushItemAsBitWrapper(item);\n      }\n    } else {\n      pushItemAsBitWrapper(json);\n    }\n\n    return bitWrappers;\n  }\n\n  /**\n   * Check if a plain JS object is valid BitWrapper JSON\n   *\n   * @param bitWrapper - a plain JS object that might be BitWrapper JSON\n   * @returns true if BitWrapper JSON, otherwise false\n   */\n  isBitWrapper(bitWrapper: unknown): boolean {\n    if (Object.prototype.hasOwnProperty.call(bitWrapper, 'bit')) {\n      const w = bitWrapper as BitWrapperJson;\n      return this.isBit(w.bit);\n    }\n    return false;\n  }\n\n  /**\n   * Check if a plain JS object is valid Bit JSON\n   *\n   * @param bitWrapper - a plain JS object that might be Bit JSON\n   * @returns true if Bit JSON, otherwise false\n   */\n  isBit(bit: unknown): boolean {\n    if (Object.prototype.hasOwnProperty.call(bit, 'type')) {\n      const b = bit as BitJson;\n      return Config.getBitType(b.type) !== BitType._error;\n    }\n    return false;\n  }\n\n  /**\n   * Convert a Bit to BitWrapper\n   *\n   * @param bit a valid Bit\n   * @returns the Bit wrapper in a BitWrapper\n   */\n  bitToBitWrapper(bit: BitJson): BitWrapperJson {\n    return {\n      bit,\n    };\n  }\n\n  private bitToAst(bit: BitJson, internalComments: string[] | undefined): Bit | undefined {\n    const { statement, reference: referenceBit, ...bitRest } = bit;\n\n    const isCommented = bit.type === BitType._comment && bit.originalType !== undefined;\n\n    // Bit type\n    const bitType = Config.getBitType(isCommented ? bit.originalType : bit.type);\n\n    // Get the bit config for the bit type\n    const bitConfig = Config.getBitConfig(bitType);\n\n    // Text Format\n    const deprecatedTextFormat = Enum(DeprecatedTextFormat).fromValue(bit.format);\n    let _textFormat = Enum(TextFormat).fromValue(bit.format) ?? bitConfig.textFormatDefault;\n    if (deprecatedTextFormat === DeprecatedTextFormat.bitmarkMinusMinus) {\n      _textFormat = TextFormat.bitmarkText;\n    }\n\n    // Build bit\n    const bitNode = builder.buildBit({\n      ...bitRest,\n      bitType,\n      bitLevel: Math.max(Math.min(bit.bitLevel ?? 1, Config.bitLevelMax), Config.bitLevelMin),\n      textFormat: bit.format as TextFormatType,\n      resourceType: this.getResourceType(bit.resource),\n      isCommented,\n      internalComment: internalComments,\n      ...this.processTitle(bitType, bit.title),\n      ...this.processReference(referenceBit), // reference and referenceProperty\n      ...this.parseExample(bit.example),\n      person: bit.partner ?? bit.person,\n      markConfig: bit.marks,\n      resources: this.processResources(bitType, bit.resource, bit.images, bit.logos),\n      body: this.processBody(bit.body as JsonText, bit.placeholders),\n      flashcards: bit.cards,\n      statements: this.processStatements(statement, bit.isCorrect, bit.statements, bit.example),\n      responses: this.processResponses(bitType, bit.responses as ResponseJson[]),\n      botResponses: this.processBotResponse(bitType, bit.responses as BotResponseJson[]),\n      cardBits: this.processListItems(\n        bit.listItems ?? bit.sections ?? bit.bookReferences,\n        bit.placeholders,\n      ),\n      footer: this.processFooter(bit.footer),\n    });\n\n    return bitNode;\n  }\n\n  private processStatements(\n    statement?: JsonText,\n    isCorrect?: boolean,\n    statements?: Partial<StatementJson>[],\n    example?: ExampleJson,\n  ): Partial<StatementJson>[] | undefined {\n    const nodes: Partial<StatementJson>[] = [];\n\n    // Add statement defined in the bit\n    if (statement) {\n      const node: Partial<StatementJson> = {\n        statement: statement ?? '',\n        isCorrect: isCorrect ?? false,\n        ...this.parseExample(example),\n      };\n\n      if (node) nodes.push(node);\n    }\n\n    // add standard statements\n    if (Array.isArray(statements)) for (const item of statements) nodes.push(item);\n\n    if (nodes.length === 0) return undefined;\n\n    return nodes;\n  }\n\n  private processResponses(\n    bitType: BitTypeType,\n    responses?: ResponseJson[],\n  ): ResponseJson[] | undefined {\n    // Return early if bot response as the responses should be interpreted as bot responses\n    if (Config.isOfBitType(bitType, BitType.botActionResponse)) return undefined;\n    if (!Array.isArray(responses)) return undefined;\n\n    return responses;\n  }\n\n  private processBotResponse(\n    bitType: BitTypeType,\n    responses?: BotResponseJson[],\n  ): BotResponseJson[] | undefined {\n    // Return early if NOT bot response as the responses should be interpreted as standard responses\n    if (!Config.isOfBitType(bitType, BitType.botActionResponse)) return undefined;\n    if (!Array.isArray(responses)) return undefined;\n    return responses;\n  }\n\n  private processListItems(\n    listItems: ListItemJson[],\n    placeholders: BodyBitsJson,\n  ): CardBit[] | undefined {\n    const nodes: CardBit[] = [];\n\n    if (Array.isArray(listItems)) {\n      for (const li of listItems) {\n        const node: CardBit = {\n          ...li,\n        } as CardBit;\n        if (node.body) {\n          node.body = {\n            body: node.body,\n            placeholders,\n          };\n        }\n        if (node) nodes.push(node);\n      }\n    }\n\n    if (nodes.length === 0) return undefined;\n\n    return nodes;\n  }\n\n  private getResourceType(resource?: ResourceJson): ResourceTypeType | undefined {\n    if (resource) {\n      const resourceKey = Enum(ResourceType).fromValue(resource.type);\n      return resourceKey;\n    }\n\n    return undefined;\n  }\n\n  private processResources(\n    bitType: BitTypeType,\n    resource: ResourceJson | undefined,\n    images: ImageResourceWrapperJson[] | undefined,\n    logos: ImageResourceWrapperJson[] | undefined,\n  ): ResourceJson[] | undefined {\n    const nodes: ResourceJson[] | undefined = [];\n\n    if (resource) nodes.push(resource);\n\n    if (Config.isOfBitType(bitType, [BitType.prototypeImages, BitType.extractorImage])) {\n      // Add the logo images\n      if (Array.isArray(images)) {\n        for (const image of images) {\n          if (image) nodes.push(image);\n        }\n      }\n    }\n\n    if (Config.isOfBitType(bitType, [BitType.imagesLogoGrave])) {\n      // Add the logo images\n      if (Array.isArray(logos)) {\n        for (const image of logos) {\n          if (image) nodes.push(image);\n        }\n      }\n    }\n\n    return nodes;\n  }\n\n  private processBody(body: JsonText, placeholders: BodyBitsJson): Body | undefined {\n    return {\n      body,\n      placeholders,\n    };\n  }\n\n  private processFooter(footerText: JsonText): Footer | undefined {\n    if (!footerText) return undefined;\n    return {\n      footer: footerText,\n    };\n  }\n\n  private processTitle(bitType: BitTypeType, title: JsonText): TitleAndTitleString {\n    if (Config.isOfBitType(bitType, BitType.author))\n      return {\n        titleString: title as string,\n        title: undefined,\n      };\n\n    return {\n      titleString: undefined,\n      title,\n    };\n  }\n\n  private processReference(reference: string | string[]): ReferenceAndReferenceProperty {\n    if (Array.isArray(reference) && reference.length > 0) {\n      return {\n        reference: undefined,\n        referenceProperty: reference,\n      };\n    }\n\n    return {\n      reference: reference as string,\n      referenceProperty: undefined,\n    };\n  }\n\n  private parseExample(example: ExampleJson | undefined): Example | undefined {\n    if (example == null) return undefined;\n    if (example === true) return { example: true };\n    if (example === false) return { example: false };\n    const exampleText =\n      StringUtils.isString(example) || Array.isArray(example) ? example : undefined;\n    if (exampleText) {\n      return { example: exampleText };\n    }\n    return { example: !!example };\n  }\n}\n\nexport { JsonParser };\n","/**\n * BitmarPegParserTypes.ts\n * RA Sewell\n *\n * (c) 2023 Get More Brain AG\n * All rights reserved.\n *\n */\n\nimport { type EnumType } from '@ncoderz/superenum';\n\nimport { type BreakscapedString } from '../../../model/ast/BreakscapedString.ts';\nimport {\n  type Body,\n  type CardBit,\n  type ExtraProperties,\n  type Footer,\n} from '../../../model/ast/Nodes.ts';\nimport { type JsonText, type TextAst } from '../../../model/ast/TextNodes.ts';\nimport { BitConfig } from '../../../model/config/BitConfig.ts';\nimport { type TagsConfig } from '../../../model/config/TagsConfig.ts';\nimport { type BitTypeType } from '../../../model/enum/BitType.ts';\nimport type { ResourceTypeType } from '../../../model/enum/ResourceType.ts';\nimport { Tag } from '../../../model/enum/Tag.ts';\nimport { type TextFormatType } from '../../../model/enum/TextFormat.ts';\nimport {\n  type BookJson,\n  type BotResponseJson,\n  type ChoiceJson,\n  type DefinitionListItemJson,\n  type ExampleJson,\n  type FeedbackChoiceJson,\n  type FeedbackJson,\n  type FlashcardJson,\n  type GroupTagJson,\n  type HeadingJson,\n  type ImageSourceJson,\n  type IngredientJson,\n  type MarkConfigJson,\n  type MatrixJson,\n  type PairJson,\n  type PersonJson,\n  type PronunciationTableJson,\n  type QuestionJson,\n  type QuizJson,\n  type RatingLevelStartEndJson,\n  type ResponseJson,\n  type ServingsJson,\n  type StatementJson,\n  type TableExtendedJson,\n  type TableJson,\n  type TechnicalTermJson,\n} from '../../../model/json/BitJson.ts';\nimport { type ImageResourceJson, type ResourceJson } from '../../../model/json/ResourceJson.ts';\nimport { type ParserData } from '../../../model/parser/ParserData.ts';\nimport { type ParserError } from '../../../model/parser/ParserError.ts';\nimport { type ParserInfo } from '../../../model/parser/ParserInfo.ts';\nimport { PeggyGrammarLocation } from './PeggyGrammarLocation.ts';\n\nconst CARD_DIVIDER_V2 = '====';\nconst CARD_SIDE_DIVIDER_V2 = '--';\nconst CARD_VARIANT_DIVIDER_V2 = '++';\n\nconst CARD_DIVIDER_V1 = '===';\nconst CARD_SIDE_DIVIDER_V1 = '==';\nconst CARD_VARIANT_DIVIDER_V1 = '--';\n\nexport interface ParseOptions {\n  startRule?: string;\n  grammarSource?: PeggyGrammarLocation | unknown;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  tracer?: any;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  [key: string]: any;\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ParseFunction = (input: string, options?: ParseOptions) => any;\n\nexport interface ParserHelperOptions {\n  parse: ParseFunction;\n  parserText: () => ParserError['text'];\n  parserLocation: () => ParserError['location'];\n}\n\nexport interface SubParserResult<T> {\n  value?: T;\n  errors?: ParserError[];\n}\n\nexport interface RawTextAndResourceType {\n  textFormat?: string;\n  resourceType?: string;\n}\n\nexport interface BitHeader {\n  bitType: BitTypeType;\n  textFormat: TextFormatType;\n  resourceType?: ResourceTypeType;\n  bitLevel: number;\n  isCommented?: boolean;\n}\n\nexport interface TrueFalseValue {\n  text: string;\n  textAst: TextAst;\n  isCorrect: boolean;\n  example?: ExampleJson;\n  __isDefaultExample: boolean;\n}\n\nexport interface CardData {\n  cardIndex: number;\n  cardSideIndex: number;\n  cardVariantIndex: number;\n  value: string;\n  cardQualifier?: string;\n  cardSideQualifier?: string;\n  cardVariantQualifier?: string;\n}\n\nexport interface BitContentProcessorResult {\n  cardSet?: ParsedCardSet;\n  cardBody?: Body;\n  cardBodyStr?: string;\n  body?: Body;\n  footer?: Footer;\n  tableCellType?: string;\n  tableRowSpan?: number;\n  tableColSpan?: number;\n  tableScope?: string;\n  tableColWidth?: number;\n  groupTag?: Partial<GroupTagJson>[];\n  tag?: string[];\n  imageSource?: Partial<ImageSourceJson>;\n  technicalTerm?: Partial<TechnicalTermJson>;\n  servings?: Partial<ServingsJson>;\n  ratingLevelStart?: Partial<RatingLevelStartEndJson>;\n  ratingLevelEnd?: Partial<RatingLevelStartEndJson>;\n  label?: TextAst;\n  person?: Partial<PersonJson>;\n  propertyTitle?: BreakscapedString;\n  trueFalse?: TrueFalseValue[];\n  lang?: BreakscapedString;\n  example?: ExampleJson;\n  isCorrect?: boolean;\n  markConfig?: Partial<MarkConfigJson>[];\n  solutions?: string[];\n  __solutionsAst?: TextAst[];\n  statement?: Partial<StatementJson>;\n  statements?: Partial<StatementJson>[];\n  feedbackChoices?: Partial<FeedbackChoiceJson>[];\n  choices?: Partial<ChoiceJson>[];\n  responses?: Partial<ResponseJson>[];\n  solution?: BreakscapedString;\n  mark?: BreakscapedString[];\n  title?: { titleAst: TextAst; titleString: string }[];\n  // title?: TextAst[];\n  // subtitle?: BreakscapedString;\n  propertyStyleResources?: { [key: string]: ResourceJson | ResourceJson[] };\n  resources?: ResourceJson[];\n  itemLead?: TextAst[];\n  __itemLeadString?: (string | undefined)[];\n  item?: JsonText;\n  __itemString?: string;\n  lead?: TextAst;\n  __leadString?: string;\n  pageNumber?: TextAst;\n  __pageNumberString?: string;\n  marginNumber?: TextAst;\n  __marginNumberString?: string;\n  instruction?: TextAst;\n  __instructionString?: string;\n  hint?: TextAst;\n  __hintString?: string;\n  anchor?: string;\n  book?: string | BookJson[];\n  reference?: string;\n  referenceEnd?: string;\n  sampleSolution?: string;\n  __sampleSolutionAst?: TextAst;\n  additionalSolutions?: string[];\n  isCaseSensitive?: boolean;\n  reaction?: BreakscapedString;\n  license?: string;\n  copyright?: string;\n  showInIndex?: boolean;\n  caption?: TextAst;\n  src1x?: string;\n  src2x?: string;\n  src3x?: string;\n  src4x?: string;\n  width?: string;\n  height?: string;\n  alt?: string;\n  // duration?: BreakscapedString | BreakscapedString[]; // number? - there is a collision between duration at bit level, and duration in resource.\n  mute?: boolean;\n  autoplay?: boolean;\n  allowSubtitles?: boolean;\n  showSubtitles?: boolean;\n  posterImage?: /*ImageResourceJson |*/ string;\n  siteName?: string;\n  imageSourceUrl?: string;\n  image?: Partial<ImageResourceJson>;\n  mockupId?: BreakscapedString;\n  size?: number;\n  format?: BreakscapedString;\n  unit?: BreakscapedString;\n  unitAbbr?: BreakscapedString;\n  decimalPlaces?: number;\n  disableCalculation?: boolean;\n\n  extraProperties?: ExtraProperties;\n  internalComments?: BreakscapedString[];\n\n  __isDefaultExample?: boolean;\n}\n\nexport interface BitSpecificTitles {\n  title?: TextAst;\n  titleString?: string;\n  subtitle?: TextAst;\n  subtitleString?: string;\n  level?: number;\n}\n\nexport interface StatementsOrChoicesOrResponses {\n  statements?: Partial<StatementJson>[];\n  choices?: Partial<ChoiceJson>[];\n  responses?: Partial<ResponseJson>[];\n}\n\nexport interface BitSpecificCards {\n  sampleSolution?: string; // ??\n  elements?: JsonText[];\n  flashcards?: Partial<FlashcardJson>[];\n  definitions?: Partial<DefinitionListItemJson>[];\n  statements?: Partial<StatementJson>[];\n  responses?: Partial<ResponseJson>[];\n  feedbacks?: Partial<FeedbackJson>[];\n  quizzes?: Partial<QuizJson>[];\n  heading?: Partial<HeadingJson>;\n  pairs?: Partial<PairJson>[];\n  matrix?: Partial<MatrixJson>[];\n  choices?: Partial<ChoiceJson>[];\n  questions?: Partial<QuestionJson>[];\n  pronunciationTable?: Partial<PronunciationTableJson>;\n  table?: Partial<TableJson | TableExtendedJson>;\n  botResponses?: Partial<BotResponseJson>[];\n  ingredients?: Partial<IngredientJson>[];\n  // DEPRECATED - TO BE REMOVED IN THE FUTURE\n  // captionDefinitionList?: Partial<CaptionDefinitionListJson>;\n  cardBits?: Partial<CardBit>[];\n  internalComments?: string[]; // ??\n}\n\nexport type BitContent = TypeValue | TypeKeyValue;\n\nexport interface TypeValue<T = unknown> extends ParserData {\n  type: string;\n  value?: T;\n  chain?: BitContent[];\n}\n\nexport interface TypeKeyValue<T = unknown> extends ParserData {\n  type: string;\n  key: string;\n  value?: T;\n  chain?: BitContent[];\n}\n\nconst TypeKey = {\n  // Bit header\n  TextFormat: 'TextFormat',\n  ResourceType: 'ResourceType',\n\n  // Tags (NOTE: ALL TAGS MUST USE THEIR CORRECT BITMARK REPRESENTATION HERE so they work with the rest of the code)\n  Title: Tag.tag_title,\n  Anchor: Tag.tag_anchor,\n  Reference: Tag.tag_reference,\n  ItemLead: Tag.tag_item,\n  Instruction: Tag.tag_instruction,\n  Hint: Tag.tag_hint,\n  True: Tag.tag_true,\n  False: Tag.tag_false,\n  Gap: Tag.tag_gap,\n  Mark: Tag.tag_mark,\n  SampleSolution: Tag.tag_sampleSolution,\n\n  // Generic Tags (converted to specific tags by the BitTagValidator)\n  Property: 'Property',\n  Resource: 'Resource',\n  TagChain: 'TagChain',\n\n  // Text\n  BodyChar: 'BodyChar',\n  BodyText: 'BodyText',\n  BodyTextPlain: 'BodyTextPlain',\n\n  // Card Set\n  CardSet: 'CardSet',\n  Card: 'Card',\n  CardChar: 'CardChar',\n  CardText: 'CardText',\n\n  // Chains\n  GapChain: 'GapChain',\n  TrueFalseChain: 'TrueFalseChain',\n\n  // Dividers\n  PlainTextDivider: 'PlainTextDivider',\n  FooterDivider: 'FooterDivider',\n} as const;\n\nexport type TypeKeyType = EnumType<typeof TypeKey>;\n\nconst ContentDepth = {\n  Bit: 'Bit',\n  Card: 'Card',\n  Chain: 'Chain',\n} as const;\n\nexport type ContentDepthType = EnumType<typeof ContentDepth>;\n\n// Card Set\n\nexport interface UnparsedCardSet {\n  cards: UnparsedCard[];\n}\n\nexport interface UnparsedCard {\n  sides: UnparsedCardSide[];\n  qualifier?: string;\n}\n\nexport interface UnparsedCardSide {\n  variants: UnparsedCardContent[];\n  qualifier?: string;\n}\n\ninterface UnparsedCardContent extends ParserData {\n  value: string;\n  qualifier?: string;\n}\n\nexport interface ParsedCardSet {\n  cards: ParsedCard[];\n}\n\nexport interface ParsedCard {\n  sides: ParsedCardSide[];\n  qualifier?: string;\n}\n\nexport interface ParsedCardSide {\n  variants: ParsedCardContent[];\n  qualifier?: string;\n}\n\ninterface ParsedCardContent extends ParserData {\n  content: BitContent[];\n  qualifier?: string;\n}\n\nexport interface ProcessedCardSet {\n  cards: ProcessedCard[];\n  internalComments: BreakscapedString[];\n}\n\nexport interface ProcessedCard {\n  no: number;\n  sides: ProcessedCardSide[];\n  qualifier?: string;\n}\n\nexport interface ProcessedCardSide {\n  no: number;\n  variants: ProcessedCardVariant[];\n  qualifier?: string;\n}\n\nexport interface ProcessedCardVariant extends ParserData {\n  no: number;\n  data: BitContentProcessorResult;\n  qualifier?: string;\n}\n\n// Context\n\nexport interface BitmarkPegParserContext {\n  bitConfig: BitConfig;\n  bitType: BitTypeType;\n  textFormat: TextFormatType;\n  resourceType?: ResourceTypeType;\n\n  DEBUG_BIT_RAW: boolean;\n  DEBUG_BIT_CONTENT_RAW: boolean;\n  DEBUG_BIT_CONTENT: boolean;\n  DEBUG_BIT_TAGS: boolean;\n  DEBUG_BODY: boolean;\n  DEBUG_FOOTER: boolean;\n  DEBUG_CHAIN_CONTENT: boolean;\n  DEBUG_CHAIN_TAGS: boolean;\n  DEBUG_CARD_SET_CONTENT: boolean;\n  DEBUG_CARD_SET: boolean;\n  DEBUG_CARD_TAGS: boolean;\n\n  parser: ParserInfo;\n\n  parse: ParseFunction;\n  bitContentProcessor(\n    contentDepth: ContentDepthType,\n    tagsConfig: TagsConfig | undefined,\n    data: BitContent[] | undefined,\n  ): BitContentProcessorResult;\n  splitBitContent(bitContent: BitContent[], types: TypeKeyType[]): BitContent[][];\n  addWarning(message: string, parserData?: ParserData, parserDataOriginal?: ParserData): void;\n  addError(message: string, parserData?: ParserData, parserDataOriginal?: ParserData): void;\n  debugPrint(header: string, data: unknown): void;\n\n  // Parser global parse state\n  state: object;\n}\n\nexport {\n  ContentDepth as BitContentLevel,\n  CARD_DIVIDER_V1,\n  CARD_DIVIDER_V2,\n  CARD_SIDE_DIVIDER_V1,\n  CARD_SIDE_DIVIDER_V2,\n  CARD_VARIANT_DIVIDER_V1,\n  CARD_VARIANT_DIVIDER_V2,\n  TypeKey,\n};\n","import { type ParserLocation } from '../../../model/parser/ParserLocation.ts';\nimport { type ParserLocationRange } from '../../../model/parser/ParserLocationRange.ts';\n\n/**\n * Sourced from: https://github.com/peggyjs/peggy/blob/cdf878e4ee59ab9d3e5199abb87ef34a8d7ce642/lib/grammar-location.js\n *\n * Included here to avoid having to import peggy as a dependency, as adding peggy as a dependency significantly\n * increases the size of the browser bundle (by 40kB or nearly double).\n *\n * When used as a grammarSource, allows grammars embedded in larger files to\n * specify their offset.  The start location is the first character in the\n * grammar.  The first line is often moved to the right by some number of\n * columns, but subsequent lines all start at the first column.\n */\nclass PeggyGrammarLocation {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  public source: any;\n  public start: ParserLocation;\n\n  /**\n   * Create an instance.\n   *\n   * @param {any} source The original grammarSource.  Should be a string or\n   *   have a toString() method.\n   * @param {import(\"./peg\").Location} start The starting offset for the\n   *   grammar in the larger file.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  constructor(source: any, start: ParserLocation) {\n    this.source = source;\n    this.start = start;\n  }\n\n  /**\n   * Coerce to a string.\n   *\n   * @returns {string} The source, stringified.\n   */\n  toString(): string {\n    return String(this.source);\n  }\n\n  /**\n   * Return a new Location offset from the given location by the start of the\n   * grammar.\n   *\n   * loc The location as if the start of the\n   *   grammar was the start of the file.\n   *  The offset location.\n   */\n  offset(loc: ParserLocation): ParserLocation {\n    return {\n      line: loc.line + this.start.line - 1,\n      column: loc.line === 1 ? loc.column + this.start.column - 1 : loc.column,\n      offset: loc.offset + this.start.offset,\n    };\n  }\n\n  /**\n   * If the range has a grammarSource that is a GrammarLocation, offset the\n   * start of that range by the GrammarLocation.\n   *\n   * @param range The range to extract from.\n   * @returns The offset start if possible, or the\n   *   original start.\n   */\n  static offsetStart(range: ParserLocationRange): ParserLocation {\n    if (range.source && typeof range.source.offset === 'function') {\n      return range.source.offset(range.start);\n    }\n    return range.start;\n  }\n\n  /**\n   * If the range has a grammarSource that is a GrammarLocation, offset the\n   * end of that range by the GrammarLocation.\n   *\n   * @param range The range to extract from.\n   * @returns The offset end if possible, or the\n   *   original end.\n   */\n  static offsetEnd(range: ParserLocationRange): ParserLocation {\n    if (range.source && typeof range.source.offset === 'function') {\n      return range.source.offset(range.end);\n    }\n    return range.end;\n  }\n}\n\nexport { PeggyGrammarLocation };\n","/**\n * BitmarkPegParserProcessor.ts\n * RA Sewell\n *\n * (c) 2023-25 Get More Brain AG\n * All rights reserved.\n *\n *\n * Debugging and Development\n * -------------------------\n *\n * - To build the parser, run 'yarn build-grammar-bit'\n * - Modify the bitmark in '_simple.bitmark' to test the parser (this will be parsed after building the parser)\n * - To undersand the operation and to help debug and develop, use the DEBUG_XXX flags in the code below\n *   and in BitmarkPegParserProcessor.ts\n *\n */\n\nimport '../../../config/Config.ts';\n\nimport { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../model/ast/BreakscapedString.ts';\nimport { type Bit } from '../../../model/ast/Nodes.ts';\nimport { CardSetVersion } from '../../../model/enum/CardSetVersion.ts';\nimport { Tag } from '../../../model/enum/Tag.ts';\nimport { TextFormat } from '../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../model/enum/TextLocation.ts';\nimport { type ParserError } from '../../../model/parser/ParserError.ts';\nimport { type ParserLocation } from '../../../model/parser/ParserLocation.ts';\nimport { StringUtils } from '../../../utils/StringUtils.ts';\nimport {\n  type ParsedCard,\n  type ParsedCardSet,\n  type ParsedCardSide,\n  type ParseFunction,\n  type SubParserResult,\n  type UnparsedCardSet,\n} from './BitmarkPegParserTypes.ts';\nimport {\n  type BitContent,\n  CARD_DIVIDER_V1,\n  CARD_DIVIDER_V2,\n  CARD_SIDE_DIVIDER_V1,\n  CARD_SIDE_DIVIDER_V2,\n  CARD_VARIANT_DIVIDER_V1,\n  CARD_VARIANT_DIVIDER_V2,\n  type CardData,\n  type ParserHelperOptions,\n  TypeKey,\n  type TypeKeyType,\n  type TypeValue,\n} from './BitmarkPegParserTypes.ts';\nimport { PeggyGrammarLocation } from './PeggyGrammarLocation.ts';\n\nconst ENABLE_DEBUG = true;\nconst DEBUG_DATA = true;\nconst DEBUG_DATA_INCLUDE_PARSER = false;\nconst DEBUG_TRACE_RAW_BIT = true;\nconst DEBUG_TRACE_TEXT_FORMAT = false;\nconst DEBUG_TRACE_RESOURCE_TYPE = false;\nconst DEBUG_TRACE_BIT_CONTENT = false;\nconst DEBUG_TRACE_BIT_TAG = false;\nconst DEBUG_TRACE_TAGS = false;\nconst DEBUG_TRACE_PROPERTY_TAGS = false;\nconst DEBUG_TRACE_RESOURCE_TAGS = false;\nconst DEBUG_TRACE_TAGS_CHAIN = false;\nconst DEBUG_TRACE_CARD_SET = false;\nconst DEBUG_TRACE_CARD_SET_START = false;\nconst DEBUG_TRACE_CARD_SET_END = false;\nconst DEBUG_TRACE_CARD_LINE_OR_DIVIDER = false;\nconst DEBUG_TRACE_CARD_CONTENT = false;\nconst DEBUG_TRACE_CARD_TAGS = false;\nconst DEBUG_TRACE_CARD_PARSED = true; // Print the parsed card (will create a lot of output if card value is large)\nconst DEBUG = ENABLE_DEBUG && process.env.BPG_ENV === 'development';\n\nclass BitmarkPegParserHelper {\n  private cardIndex = 0;\n  private cardSideIndex = 0;\n  private cardVariantIndex = 0;\n  private currentCardQualifier: string | undefined;\n  private currentSideQualifier: string | undefined;\n  private currentVariantQualifier: string | undefined;\n\n  private parse: ParseFunction;\n  private parserText: () => ParserError['text'];\n  private parserLocation: () => ParserError['location'];\n\n  constructor(options: ParserHelperOptions) {\n    this.parse = options.parse;\n    this.parserText = options.parserText;\n    this.parserLocation = options.parserLocation;\n  }\n\n  //\n  // PARSING\n  //\n\n  handleRawBit(rawBit: string): SubParserResult<Bit> | undefined {\n    const rawBitTrimmed = rawBit.trim();\n\n    if (DEBUG_TRACE_RAW_BIT) this.debugPrint('RAW BIT', rawBitTrimmed);\n\n    // Ignore empty bits (only happens if entire file is empty / whitespace only\n    if (!rawBitTrimmed) return undefined;\n\n    // Get current parser location\n    const location = this.parserLocation()?.start ?? {\n      line: 1,\n      column: 1,\n      offset: 0,\n    };\n\n    // Parse the raw bit\n    const bitParserResult = this.parse(rawBit, {\n      startRule: 'bit',\n      grammarSource: new PeggyGrammarLocation('bit', location),\n    }) as SubParserResult<Bit>;\n\n    // Add markup to the bit result\n    if (bitParserResult.value) bitParserResult.value.markup = rawBitTrimmed;\n\n    return bitParserResult;\n  }\n\n  handleTextFormat(value: unknown): BitContent {\n    if (DEBUG_TRACE_TEXT_FORMAT) this.debugPrint(TypeKey.TextFormat, value);\n    return {\n      type: TypeKey.TextFormat,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleResourceType(value: unknown): BitContent {\n    if (DEBUG_TRACE_RESOURCE_TYPE) this.debugPrint(TypeKey.ResourceType, value);\n    return {\n      type: TypeKey.ResourceType,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleBitContent(value: unknown): BitContent[] {\n    if (DEBUG_TRACE_BIT_CONTENT) this.debugPrint('BitContent', value);\n\n    let content = this.reduceToArrayOfTypes(value);\n\n    // Merge the BodyChar to BodyText\n    content = this.mergeCharToText(content);\n\n    return content;\n  }\n\n  //\n  // Bit tags parsing\n  //\n\n  handleBitTag(value: BitContent): BitContent {\n    if (DEBUG_TRACE_BIT_TAG) this.debugPrint('BitTag', value);\n    return value;\n  }\n\n  handleTag(type: TypeKeyType, value: unknown): BitContent {\n    if (DEBUG_TRACE_TAGS) this.debugPrint(type, { value });\n\n    // if (type === TypeKey.Comment) {\n    //   debugger;\n    // }\n\n    return {\n      type,\n      key: Enum(Tag).fromValue(type),\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handlePropertyTag(key: BreakscapedString, value: unknown): BitContent {\n    if (DEBUG_TRACE_PROPERTY_TAGS) this.debugPrint(TypeKey.Property, { key, value });\n\n    return {\n      type: TypeKey.Property,\n      key: `@${Breakscape.unbreakscape(key, {\n        format: TextFormat.plainText,\n        location: TextLocation.tag,\n      })}`,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleResourceTag(key: BreakscapedString, value: unknown): BitContent {\n    if (DEBUG_TRACE_RESOURCE_TAGS) this.debugPrint(TypeKey.Resource, { key, value });\n\n    const uKey = Breakscape.unbreakscape(key, {\n      format: TextFormat.plainText,\n      location: TextLocation.tag,\n    });\n    const camelKey = StringUtils.kebabToCamel(uKey);\n\n    return {\n      type: TypeKey.Resource,\n      key: `&${camelKey}`,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleTagChain(value: unknown): BitContent[] {\n    if (DEBUG_TRACE_TAGS_CHAIN) this.debugPrint('TagsChain', value);\n    const content = this.reduceToArrayOfTypes(value);\n    let newContent: BitContent[] = content;\n\n    if (content.length > 1) {\n      const head = content[0];\n      head.chain = content.slice(1);\n      newContent = [head];\n    }\n\n    return newContent;\n  }\n\n  //\n  // Divider parsing\n  //\n\n  // Plain text divider\n  handlePlainTextDivider(value: unknown): BitContent {\n    value = this.reduceToString(value);\n\n    return {\n      type: TypeKey.PlainTextDivider,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  // Footer divider\n  handleFooterDivider(value: unknown): BitContent {\n    value = this.reduceToString(value);\n\n    return {\n      type: TypeKey.FooterDivider,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  //\n  // Card parsing\n  //\n\n  handleCardSet(value: unknown): BitContent {\n    if (DEBUG_TRACE_CARD_SET) this.debugPrint(TypeKey.CardSet, value);\n\n    // Build card set\n    const cards = value as BitContent[];\n    const unparsedCardSet: UnparsedCardSet = {\n      cards: [],\n    };\n    const cardSet: ParsedCardSet = {\n      cards: [],\n    };\n\n    if (cards) {\n      // Get current parser location\n      const parser = {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      };\n\n      for (const content of cards) {\n        if (!content) continue;\n        const { type, value: cardData, parser } = content as TypeValue;\n        if (!type || type !== TypeKey.Card) continue;\n        const {\n          cardIndex,\n          cardSideIndex,\n          cardVariantIndex: cardContentIndex,\n          value,\n          cardQualifier,\n          cardSideQualifier,\n          cardVariantQualifier,\n        } = cardData as CardData;\n\n        // Get or create card\n        let card = unparsedCardSet.cards[cardIndex];\n        if (!card) {\n          card = {\n            sides: [],\n            qualifier: cardQualifier,\n          };\n          unparsedCardSet.cards[cardIndex] = card;\n        } else if (cardQualifier && !card.qualifier) {\n          card.qualifier = cardQualifier;\n        }\n\n        // Get or create side\n        let side = card.sides[cardSideIndex];\n        if (!side) {\n          side = {\n            variants: [],\n            qualifier: cardSideQualifier,\n          };\n          card.sides[cardSideIndex] = side;\n        } else if (cardSideQualifier && !side.qualifier) {\n          side.qualifier = cardSideQualifier;\n        }\n\n        // Set variant value\n        const variant = side.variants[cardContentIndex];\n        if (!variant) {\n          side.variants[cardContentIndex] = {\n            value,\n            parser,\n            qualifier: cardVariantQualifier,\n          };\n        } else {\n          side.variants[cardContentIndex].value += value;\n          if (cardVariantQualifier && !variant.qualifier) {\n            variant.qualifier = cardVariantQualifier;\n          }\n        }\n      }\n\n      // Remove any completely empty cards\n      unparsedCardSet.cards = unparsedCardSet.cards.filter((card) => {\n        return card.sides.some((side) => {\n          return side.variants.some((variant) => {\n            const trimmed = StringUtils.trimmedString(variant.value);\n            return trimmed.length !== 0;\n          });\n        });\n      });\n\n      // Parse the card data\n      for (const unparsedCard of unparsedCardSet.cards) {\n        const card = {\n          sides: [],\n          qualifier: unparsedCard.qualifier,\n        } as ParsedCard;\n        cardSet.cards.push(card);\n        for (const unparsedSide of unparsedCard.sides) {\n          const side = {\n            variants: [],\n            qualifier: unparsedSide.qualifier,\n          } as ParsedCardSide;\n          card.sides.push(side);\n          for (const unparsedContent of unparsedSide.variants) {\n            // Get current parser location\n            // It must be modified by the length of the divider to be correct as the text in 'unparsedContent.value'\n            // have the divider removed.\n            let location: ParserLocation = {\n              line: 1,\n              column: 1,\n              offset: 0,\n            };\n            if (unparsedContent.parser.location) {\n              location = unparsedContent.parser.location.start;\n              const text = unparsedContent.parser.text;\n              const offsetCorrection = text ? text.length : 0;\n              const lineCorrection = 1;\n              location.offset += offsetCorrection;\n              location.line += lineCorrection;\n            }\n\n            // Run the parser on the card content\n            let content = this.parse(unparsedContent.value, {\n              startRule: 'cardContent',\n              grammarSource: new PeggyGrammarLocation('card-content', location),\n            }) as BitContent[];\n\n            content = this.reduceToArrayOfTypes(content);\n\n            if (DEBUG_TRACE_CARD_PARSED) this.debugPrint('parsedCardContent', content);\n\n            side.variants.push({\n              parser,\n              content,\n              qualifier: unparsedContent.qualifier,\n            });\n          }\n        }\n      }\n    }\n\n    return {\n      type: TypeKey.CardSet,\n      value: cardSet,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleCardSetStart() {\n    if (DEBUG_TRACE_CARD_SET_START) this.debugPrint('CardSetStart');\n\n    this.cardIndex = -1; // Incremented by first card divider to 0 for first card\n    this.cardSideIndex = 0;\n    this.cardVariantIndex = 0;\n    this.currentCardQualifier = undefined;\n    this.currentSideQualifier = undefined;\n    this.currentVariantQualifier = undefined;\n  }\n\n  handleCardSetEnd() {\n    if (DEBUG_TRACE_CARD_SET_END) this.debugPrint('CardSetEnd');\n    // console.log('CardSetEnd');\n    this.cardIndex = 0;\n    this.cardSideIndex = 0;\n    this.cardVariantIndex = 0;\n    this.currentCardQualifier = undefined;\n    this.currentSideQualifier = undefined;\n    this.currentVariantQualifier = undefined;\n  }\n\n  handleCards(value: unknown): unknown {\n    // console.log('Cards');\n    return value;\n  }\n\n  handleCardLineOrDivider(value: unknown, version: number) {\n    if (DEBUG_TRACE_CARD_LINE_OR_DIVIDER) this.debugPrint('CardLineOrDivider', value);\n\n    let isCardDivider = false;\n    let isSideDivider = false;\n    let isVariantDivider = false;\n    let qualifier: string | undefined;\n\n    if (Array.isArray(value) && value.length === 2) {\n      const [divider, maybeQualifier] = value as [unknown, unknown];\n      if (typeof divider === 'string') {\n        value = divider;\n        if (\n          typeof maybeQualifier === 'string' &&\n          maybeQualifier.trim() === maybeQualifier &&\n          maybeQualifier.length > 0\n        ) {\n          qualifier = maybeQualifier;\n        }\n      } else {\n        value = divider;\n      }\n    } else if (Array.isArray(value) && value.length === 1) {\n      const [divider] = value as [unknown];\n      value = divider;\n    }\n\n    if (version === CardSetVersion.v1) {\n      isCardDivider = value === CARD_DIVIDER_V1;\n      isSideDivider = value === CARD_SIDE_DIVIDER_V1;\n      isVariantDivider = value === CARD_VARIANT_DIVIDER_V1;\n    } else {\n      isCardDivider = value === CARD_DIVIDER_V2;\n      isSideDivider = value === CARD_SIDE_DIVIDER_V2;\n      isVariantDivider = value === CARD_VARIANT_DIVIDER_V2;\n    }\n\n    if (isCardDivider) {\n      this.cardIndex++;\n      this.cardSideIndex = 0;\n      this.cardVariantIndex = 0;\n      this.currentCardQualifier = qualifier;\n      this.currentSideQualifier = undefined;\n      this.currentVariantQualifier = undefined;\n    } else if (isSideDivider) {\n      this.cardSideIndex++;\n      this.cardVariantIndex = 0;\n      this.currentSideQualifier = qualifier;\n      this.currentVariantQualifier = undefined;\n      // console.log(`Card ${this.cardIndex} Side: ${value}`);\n    } else if (isVariantDivider) {\n      this.cardVariantIndex++;\n      this.currentVariantQualifier = qualifier;\n      // console.log(`Card ${this.cardIndex}, Side ${this.cardSideIndex}, Variant: ${this.cardVariantIndex}`);\n    }\n\n    if (this.isType(value, TypeKey.Card)) return value;\n\n    return {\n      type: TypeKey.Card,\n      value: {\n        cardIndex: this.cardIndex,\n        cardSideIndex: this.cardSideIndex,\n        cardVariantIndex: this.cardVariantIndex,\n        value: '',\n        cardQualifier: this.currentCardQualifier,\n        cardSideQualifier: this.currentSideQualifier,\n        cardVariantQualifier: this.currentVariantQualifier,\n      } as CardData,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleCardLine(value: unknown) {\n    if (DEBUG_TRACE_CARD_LINE_OR_DIVIDER) {\n      this.debugPrint(\n        'CardLine',\n        `(Card ${this.cardIndex}, Side ${this.cardSideIndex}, Variant: ${this.cardVariantIndex}): ${value}`,\n      );\n    }\n\n    return {\n      type: TypeKey.Card,\n      value: {\n        cardIndex: this.cardIndex,\n        cardSideIndex: this.cardSideIndex,\n        cardVariantIndex: this.cardVariantIndex,\n        value,\n        cardQualifier: this.currentCardQualifier,\n        cardSideQualifier: this.currentSideQualifier,\n        cardVariantQualifier: this.currentVariantQualifier,\n      } as CardData,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleCardContent(value: BitContent[]): BitContent[] {\n    if (DEBUG_TRACE_CARD_CONTENT) this.debugPrint('CardContent', value);\n\n    // Merge the BodyChar to BodyText\n    const content = this.mergeCharToText(value);\n\n    return content;\n  }\n\n  handleCardTags(value: unknown): unknown {\n    if (DEBUG_TRACE_CARD_TAGS) this.debugPrint('CardTags', value);\n\n    return value;\n  }\n\n  //\n  // Util functions\n  //\n\n  /**\n   * Merge types:\n   *  - BodyChar => BodyText\n   *  - CardChar => CardText\n   *\n   * Any adjacent BodyChar or CardChar are merged into a single BodyText or CardText\n   *\n   * @param bitContent\n   */\n  private mergeCharToText(bitContent: BitContent[]) {\n    const bc: BitContent[] = [];\n    let bodyText: TypeValue | undefined;\n    let cardText: TypeValue | undefined;\n\n    for (const c of bitContent) {\n      switch (c.type) {\n        case TypeKey.BodyChar: {\n          if (bodyText) {\n            const val = `${bodyText.value ?? ''}${c.value ?? ''}`;\n            bodyText.value = val;\n          } else {\n            bodyText = {\n              type: TypeKey.BodyText,\n              value: c.value ?? '',\n              parser: {\n                text: this.parserText(),\n                location: this.parserLocation(),\n              },\n            };\n          }\n          break;\n        }\n\n        case TypeKey.CardChar: {\n          if (cardText) {\n            const val = `${cardText.value ?? ''}${c.value ?? ''}`;\n            cardText.value = val;\n          } else {\n            cardText = {\n              type: TypeKey.CardText,\n              value: c.value ?? '',\n              parser: {\n                text: this.parserText(),\n                location: this.parserLocation(),\n              },\n            };\n          }\n          break;\n        }\n\n        default: {\n          if (bodyText) {\n            bc.push(bodyText);\n            bodyText = undefined;\n          }\n          if (cardText) {\n            bc.push(cardText);\n            cardText = undefined;\n          }\n          bc.push(c);\n        }\n      }\n    }\n\n    // Add the last bodyText or cardText\n    if (bodyText) bc.push(bodyText);\n    if (cardText) bc.push(cardText);\n\n    return bc;\n  }\n\n  /**\n   * Returns true if a value is a TypeKeyValue or TypeKey type with a type in the given types\n   *\n   * @param value The value to check\n   * @param validType The type or types to check, or undefined to check for any type\n   * @returns True if the value is a TypeKeyValue or TypeKey type with a type in the given types, otherwise False.\n   */\n  private isType(value: unknown, validType?: TypeKeyType | TypeKeyType[]): boolean {\n    if (!value) return false;\n    const { type } = value as TypeValue;\n\n    if (!validType) {\n      return !!Enum(TypeKey).fromValue(type as TypeKeyType);\n    }\n    if (Array.isArray(validType)) {\n      return validType.indexOf(type as TypeKeyType) >= 0;\n    }\n\n    return validType === type;\n  }\n\n  /**\n   * Reduce the data to type objects.\n   *\n   * The input data can have any structure. It will be reduced to an array of BitContent objects.\n   *\n   * @param data the data to reduce\n   * @param validTypes types include in the reduced data\n   * @param recurseIntoTypes set to true to reduce types which have array values\n   * @returns an array of BitContent objects reduced from the input data\n   */\n  private reduceToArrayOfTypes(\n    data: unknown,\n    validTypes?: TypeKeyType[],\n    recurseIntoTypes?: boolean,\n  ): BitContent[] {\n    if (!Array.isArray(data)) return [];\n\n    const res = data.reduce((acc, content, _index) => {\n      if (content == null) return acc;\n      const { type, value } = content as TypeValue;\n\n      if (Array.isArray(content)) {\n        // Not a TypeKeyValue - recurse\n        const subValues = this.reduceToArrayOfTypes(content, validTypes);\n        acc.push(...subValues);\n      } else {\n        if (!this.isType(content, validTypes)) return acc;\n\n        if (recurseIntoTypes && Array.isArray(value)) {\n          // Not a TypeKeyValue - recurse\n          const subValues = this.reduceToArrayOfTypes(value, validTypes);\n          acc.push(...subValues);\n        } else if (type) {\n          acc.push(content);\n        }\n      }\n\n      return acc;\n    }, [] as BitContent[]);\n\n    return res;\n  }\n\n  /**\n   * Reduce the data to a string.\n   *\n   * The input data can have any nested array structure. It will be reduced to a single string.\n   *\n   * @param data the data to reduce\n   * @returns a string concatenated from all the string values in the input data\n   */\n  private reduceToString(data: unknown): string {\n    if (!Array.isArray(data)) return '';\n\n    const res = data.reduce((acc, content, _index) => {\n      if (content == null) return acc;\n\n      if (Array.isArray(content)) {\n        // An array - recurse\n        const subValue = this.reduceToString(content);\n        acc += subValue;\n      } else {\n        acc += content;\n      }\n\n      return acc;\n    }, [] as BitContent[]);\n\n    return res;\n  }\n\n  /**\n   * Print out data for debugging\n   *\n   * @param header\n   * @param data\n   */\n  private debugPrint(header: string, data?: unknown): void {\n    \n  }\n}\n\nexport { BitmarkPegParserHelper };\n","/**\n * BitmarkPegParserProcessor.ts\n * RA Sewell\n *\n * (c) 2023 Get More Brain AG\n * All rights reserved.\n *\n * About the parser:\n * -----------------\n *\n * 1. The peggy.js PEG parser is used to parse bitmark markup into a simple AST.\n * 2. The AST can then be walked to generate any output format required.\n *    - The default output format is JSON.\n *    - The output could also be bitmark, therefore providing a way to prettify / standardise bitmark markup.\n * 3. The parser should not generate a fatal error under any circumstances, because all text is valid bitmark markup.\n *    - The only fatal error for a bit is if the bit header tag (e.g. [.cloze:bitmark++]) cannot be parsed. In this\n *      case the bit will be ignored and an error will be added at the AST top level. Parsing will continue.\n *    - If the parser encounters suspect bitmark it will generate 'warnings' which it will attach to the AST bit level\n * 4. The parser should be as fast as possible, without being overly complicated.\n *\n * Theory of operation:\n * --------------------\n *\n * The parser splits the parse into multiple parses. This makes the parser much easier to write and understand than\n * attempting to parse the entire markup in one pass.\n *\n * It also improves the performance in some cases, because although it means multiple passes over the same data, the\n * comparisions made at each pass are fewer and simpler.\n *\n * The parser has the following parse entry points:\n * - bitmark (external code should use this entry point)\n * - bit\n * - cardContent\n *\n * bitmark:\n *\n * This is the top level entry point for parsing a bitmark. It splits a set of bitmark bits into individual bits, and\n * passes each individual bit to the 'bit' entry point for parsing.\n *\n * bit:\n *\n * This is the top level single-bit parser. It parses the bit header, the top level tags, the body, the inline tags,\n * the card set, and the footer. The content of the card set is not parsed.\n *\n * cardContent:\n *\n * This entry point takes in the text content of each card leaf parsed out by the 'bit' parser and parses the\n * inline bits (true/false, sampleSolution, item, lead, etc tags) to produce the card set specific output for the\n * specific bit type being parsed.\n *\n * Each rule of the parser outputs one or more objects containing a 'type', 'value' and optional 'key' property.\n * The 'type' describes to this helper code what the parsed 'value' represents. If the value is not a single value,\n * but a key/value pair then 'key' will also be set.\n *\n *\n * Debugging and Development\n * -------------------------\n *\n * - To build the parser, run 'yarn build-grammar-bit'\n * - Modify the bitmark in '_simple.bitmark' to test the parser (this will be parsed after building the parser)\n * - To undersand the operation and to help debug and develop, use the DEBUG_XXX flags in the code below.\n *   and in BitmarkPegParserHelper.ts\n */\n\nimport { Enum } from '@ncoderz/superenum';\n\nimport { Builder } from '../../../ast/Builder.ts';\nimport { Breakscape } from '../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../model/ast/BreakscapedString.ts';\nimport { type Bit, type BitmarkAst, type BodyPart } from '../../../model/ast/Nodes.ts';\nimport { type TagsConfig } from '../../../model/config/TagsConfig.ts';\nimport { BitType } from '../../../model/enum/BitType.ts';\nimport { BodyTextFormat } from '../../../model/enum/BodyTextFormat.ts';\nimport { DeprecatedTextFormat } from '../../../model/enum/DeprecatedTextFormat.ts';\nimport { ResourceType } from '../../../model/enum/ResourceType.ts';\nimport { TextFormat } from '../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../model/enum/TextLocation.ts';\nimport { type ParserData } from '../../../model/parser/ParserData.ts';\nimport { type ParserError } from '../../../model/parser/ParserError.ts';\nimport { type ParserInfo } from '../../../model/parser/ParserInfo.ts';\nimport { StringUtils } from '../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitHeader,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type ParsedCardSet,\n  type ParseFunction,\n  type ParserHelperOptions,\n  type RawTextAndResourceType,\n  type SubParserResult,\n  TypeKey,\n  type TypeKeyType,\n  type TypeKeyValue,\n  type TypeValue,\n} from './BitmarkPegParserTypes.ts';\nimport { BitmarkPegParserValidator } from './BitmarkPegParserValidator.ts';\nimport { BodyContentProcessor } from './contentProcessors/BodyContentProcessor.ts';\nimport { buildCards } from './contentProcessors/CardContentProcessor.ts';\nimport { defaultTagContentProcessor } from './contentProcessors/DefaultTagContentProcessor.ts';\nimport { FooterContentProcessor } from './contentProcessors/FooterContentProcessor.ts';\nimport { gapChainContentProcessor } from './contentProcessors/GapChainContentProcessor.ts';\nimport { itemLeadChainContentProcessor } from './contentProcessors/ItemLeadChainContentProcessor.ts';\nimport { markChainContentProcessor } from './contentProcessors/MarkChainContentProcessor.ts';\nimport { propertyContentProcessor } from './contentProcessors/PropertyContentProcessor.ts';\nimport { referenceTagContentProcessor } from './contentProcessors/ReferenceTagContentProcessor.ts';\nimport {\n  buildResources,\n  resourceContentProcessor,\n} from './contentProcessors/ResourceContentProcessor.ts';\nimport {\n  buildTitles,\n  titleTagContentProcessor,\n} from './contentProcessors/TitleTagContentProcessor.ts';\nimport { trueFalseChainContentProcessor } from './contentProcessors/TrueFalseChainContentProcessor.ts';\n\n// Debugging flags for helping develop and debug the parser\nconst ENABLE_DEBUG = true;\nconst DEBUG_DATA = true; // Include data in the debug output\nconst DEBUG_DATA_INCLUDE_PARSER = false; // Include the parser data in the debug output - very very verbose!\nconst DEBUG_BIT_RAW = true; // Print the raw bitmark\nconst DEBUG_BIT_CONTENT_RAW = false; // Print the top level parsed bit content (without chars merged to strings - will create a lot of output)\nconst DEBUG_BIT_CONTENT = true; // Print the top level parsed bit content (with BodyChar / CardChar merged)\nconst DEBUG_BIT_TAGS = true; // Print the tags extracted from the bit parsed content\nconst DEBUG_BODY = true; // Print the final parsed body\nconst DEBUG_FOOTER = true; // Print the final parsed footer\nconst DEBUG_CHAIN_CONTENT = true; // Print the parsed chain content\nconst DEBUG_CHAIN_TAGS = true; // Print the tags extracted from the parsed chain content\nconst DEBUG_CARD_SET_CONTENT = true; // Print the parsed card set content\nconst DEBUG_CARD_SET = true; // Print the card set built from the parsed card set content\nconst DEBUG_CARD_TAGS = true; // Print the tags extracted from the card content\n\n// DO NOT EDIT THIS LINE. Ensures no debug in production in case ENABLE_DEBUG is accidentally left on\nconst DEBUG = ENABLE_DEBUG && process.env.BPG_ENV === 'development';\n\nconst builder = new Builder();\n\nclass BitmarkPegParserProcessor {\n  private context: BitmarkPegParserContext;\n  private nonFatalWarnings: ParserError[] = [];\n  private nonFatalErrors: ParserError[] = [];\n  private parser: ParserInfo = {};\n\n  private parse: ParseFunction;\n  private parserText: () => ParserError['text'];\n  private parserLocation: () => ParserError['location'];\n\n  constructor(options: ParserHelperOptions) {\n    this.parse = options.parse;\n    this.parserText = options.parserText;\n    this.parserLocation = options.parserLocation;\n\n    // The context is used to pass the parser data and functions to the content builders\n    this.context = {\n      bitConfig: Config.getBitConfig(BitType._error),\n      bitType: BitType._error,\n      textFormat: TextFormat.bitmarkText,\n\n      DEBUG_BIT_RAW,\n      DEBUG_BIT_CONTENT_RAW,\n      DEBUG_BIT_CONTENT,\n      DEBUG_BIT_TAGS,\n      DEBUG_BODY,\n      DEBUG_FOOTER,\n      DEBUG_CHAIN_CONTENT,\n      DEBUG_CHAIN_TAGS,\n      DEBUG_CARD_SET_CONTENT,\n      DEBUG_CARD_SET,\n      DEBUG_CARD_TAGS,\n\n      parser: this.parser,\n\n      parse: this.parse,\n      bitContentProcessor: this.bitContentProcessor.bind(this),\n      splitBitContent: this.splitBitContent.bind(this),\n      addWarning: this.addWarning.bind(this),\n      addError: this.addError.bind(this),\n      debugPrint: this.debugPrint.bind(this),\n\n      state: {\n        //\n      },\n    };\n  }\n\n  // Build bits\n  buildBits(rawBits: SubParserResult<Bit>[]): BitmarkAst {\n    const bits: Bit[] = [];\n    let errors: ParserError[] = [];\n\n    for (const rawBit of rawBits) {\n      // Ignore empty bits (only happens if entire file is empty / whitespace only\n      if (!rawBit) continue;\n\n      const bit = rawBit.value;\n      if (bit) {\n        // Add the bit to the list of bits\n        bits.push(bit);\n      } else {\n        // TODO - convert error location to master parser location\n\n        // If bit is undefined, then there was an error parsing the bit\n        errors = errors.concat(rawBit.errors ?? []);\n      }\n    }\n\n    const res = builder.buildBitmark({\n      bits,\n      errors: errors.length > 0 ? errors : undefined,\n    });\n\n    return res;\n  }\n\n  // Build bit\n  buildBit(bitHeader: BitHeader, bitContent: BitContent[]): SubParserResult<Bit> {\n    const { bitType, textFormat, resourceType, bitLevel, isCommented } = bitHeader;\n\n    // Bit type was invalid, so ignore the bit, returning instead the parsing errors\n    if (!bitType || Config.isOfBitType(bitType, BitType._error)) return this.invalidBit();\n\n    const bitConfig = Config.getBitConfig(bitType);\n\n    // Set the bit type, text format, etc in the context\n    this.context.bitConfig = bitConfig;\n    this.context.bitType = bitType;\n    this.context.textFormat = textFormat;\n    this.context.resourceType = resourceType;\n\n    if (DEBUG_BIT_CONTENT_RAW) this.debugPrint('BIT CONTENT RAW', bitContent);\n\n    const isTrueFalseV1 = Config.isOfBitType(bitType, BitType.trueFalse1);\n    const isMultipleChoiceV1 = Config.isOfBitType(bitType, BitType.multipleChoice1);\n    const isMultipleResponseV1 = Config.isOfBitType(bitType, BitType.multipleResponse1);\n\n    if (DEBUG_BIT_CONTENT) this.debugPrint('BIT CONTENT', bitContent);\n\n    // Rest the parser state\n    this.resetParserState();\n\n    // Squash inline body bits for bits / text formats that do not support inline body bits\n    bitContent = this.squashUnwantedInlineBodyBits(bitContent);\n\n    // Validate the bit tags\n    bitContent = BitmarkPegParserValidator.validateBitTags(this.context, bitContent);\n\n    // Parse the bit content into a an object with the appropriate keys\n\n    const {\n      body,\n      footer,\n      cardSet,\n      title,\n      statement,\n      statements,\n      choices,\n      responses,\n      propertyStyleResources,\n      resources,\n      posterImage,\n      internalComments,\n      ...tags\n    } = this.bitContentProcessor(BitContentLevel.Bit, bitConfig.tags, bitContent);\n\n    if (DEBUG_BIT_TAGS) this.debugPrint('BIT TAGS', tags);\n    if (DEBUG_BODY) this.debugPrint('BIT BODY', body);\n    if (DEBUG_FOOTER) this.debugPrint('BIT FOOTER', footer);\n\n    // Build the titles for the specific bit type\n    const titles = buildTitles(this.context, bitType, title);\n\n    // Build the card data for the specific bit type\n    const bitSpecificCards = buildCards(\n      this.context,\n      bitType,\n      textFormat,\n      cardSet,\n      statement,\n      statements,\n      choices,\n      responses,\n    );\n\n    // Build the resources\n    const filteredResources = buildResources(this.context, resourceType, resources);\n\n    // Build the final internal comments\n    const internalComment = [\n      ...(internalComments ?? []),\n      ...(bitSpecificCards.internalComments ?? []),\n    ];\n\n    // Build the warnings and errors for the parser object\n    const warnings = this.buildBitLevelWarnings();\n    const errors = this.buildBitLevelErrors();\n    if (warnings) this.parser.warnings = warnings;\n    if (errors) this.parser.errors = errors;\n\n    // Build the final bit\n    const bit = builder.buildBit({\n      bitType,\n      bitLevel,\n      isCommented,\n      textFormat,\n      resourceType,\n      ...titles,\n      posterImage: posterImage as string,\n      statement: isTrueFalseV1 ? statement : undefined,\n      choices: isMultipleChoiceV1 ? choices : undefined,\n      responses: isMultipleResponseV1 ? responses : undefined,\n      ...tags,\n      ...propertyStyleResources,\n      resources: filteredResources,\n      ...bitSpecificCards,\n      body,\n      footer,\n      internalComment,\n      parser: this.parser,\n    });\n\n    return { value: bit };\n  }\n\n  // Build bit for data that cannot be parsed\n  invalidBit(bitData?: unknown): SubParserResult<Bit> {\n    // Create the error is bitData is defined (else it was created when parsing the header)\n    if (bitData) this.addError(`Invalid bit`);\n\n    // Build the errors\n    this.parser.errors = this.buildBitLevelErrors();\n\n    // Build the error bit\n    const bit = builder.buildBit({\n      bitType: Config.getBitType(BitType._error),\n      bitLevel: 1,\n      parser: this.parser,\n    });\n\n    return { value: bit };\n  }\n\n  // Build bit header\n  buildBitHeader(\n    bitTypeBreakscaped: BreakscapedString,\n    bitLevel: number,\n    textFormatAndResourceType: RawTextAndResourceType,\n  ): BitHeader {\n    // Unbreakscape the bit type\n    const bitType = Breakscape.unbreakscape(bitTypeBreakscaped, {\n      format: TextFormat.plainText,\n      location: TextLocation.tag,\n    });\n\n    // Get / check bit type\n    const validBitType = Config.getBitType(bitType);\n    const commented = Config.isBitTypeCommented(bitType);\n\n    if (Config.isOfBitType(validBitType, BitType._error)) {\n      this.addError(`Invalid bit type: '${bitType}'`);\n    }\n\n    const bitConfig = Config.getBitConfig(validBitType);\n\n    // Bit level\n    if (bitLevel > Config.bitLevelMax) {\n      this.addWarning(\n        `Bit level of ${bitLevel} too high, setting to max value of ${Config.bitLevelMax}`,\n      );\n      bitLevel = Config.bitLevelMax;\n    } else if (bitLevel < Config.bitLevelMin) {\n      this.addWarning(\n        `Bit level of ${bitLevel} too low, setting to min value of ${Config.bitLevelMin}`,\n      );\n      bitLevel = Config.bitLevelMin;\n    }\n\n    // Text format\n    let textFormat = Enum(TextFormat).fromValue(textFormatAndResourceType.textFormat);\n    const isInvalidTextFormat = textFormatAndResourceType.textFormat && !textFormat;\n    if (isInvalidTextFormat) {\n      this.addWarning(\n        `Invalid text format '${textFormatAndResourceType.textFormat}', defaulting to '${BodyTextFormat.bitmarkPlusPlus}'`,\n      );\n    }\n\n    // Deprecated warning for bitmark--\n    const deprecatedTextFormat = Enum(DeprecatedTextFormat).fromValue(\n      textFormatAndResourceType.textFormat,\n    );\n    if (deprecatedTextFormat) {\n      textFormat = TextFormat.bitmarkText;\n      this.addWarning(\n        `${deprecatedTextFormat} text format is deprecated. Bit will be parsed as '${BodyTextFormat.bitmarkPlusPlus}'`,\n      );\n    }\n\n    textFormat = textFormat ?? bitConfig.textFormatDefault;\n\n    // Resource type\n    const resourceType = Enum(ResourceType).fromValue(textFormatAndResourceType.resourceType);\n    if (textFormatAndResourceType.resourceType && !resourceType) {\n      this.addWarning(\n        `Invalid resource type '${textFormatAndResourceType.resourceType}', it will be ignored`,\n      );\n    }\n\n    return {\n      bitType: validBitType,\n      bitLevel,\n      textFormat: textFormat ?? bitConfig.textFormatDefault,\n      resourceType,\n      isCommented: commented,\n    };\n  }\n\n  // Build text and resource type\n  buildTextAndResourceType(\n    value1: TypeValue | undefined,\n    value2: TypeValue | undefined,\n  ): RawTextAndResourceType {\n    const res: RawTextAndResourceType = {};\n\n    const processValue = (value: TypeValue | undefined) => {\n      if (value) {\n        const val = Breakscape.unbreakscape(StringUtils.string(value.value) as BreakscapedString, {\n          format: TextFormat.plainText,\n          location: TextLocation.tag,\n        });\n        if (value.type === TypeKey.TextFormat) {\n          // Set text format\n          res.textFormat = val;\n        } else {\n          // Set resource type\n          res.resourceType = val;\n        }\n      }\n    };\n    processValue(value1);\n    processValue(value2);\n\n    return res;\n  }\n\n  /**\n   * Reset the parser state\n   *\n   */\n  private resetParserState() {\n    this.context.state = {};\n  }\n\n  /**\n   * Process Type/Key/Value data, squashing inline body bits back into text for bits / body text formats that\n   * do not support them, and for after the plain text tag '$$$$'.\n   *\n   * @param data the bit content (Type/Key/Value data)\n   * @returns\n   */\n  private squashUnwantedInlineBodyBits(data: BitContent[]): BitContent[] {\n    const result: BitContent[] = [];\n    if (!data) return result;\n\n    const { textFormat } = this.context;\n\n    const isBitmarkText = textFormat === TextFormat.bitmarkText;\n\n    // Format: text / latex\n    // Body bits are only supported up to the first BodyText tag.\n    // Squash the subsequent body bits back into text.\n\n    const convertTagToTextRecursive = (tag: BitContent, str = ''): string => {\n      const { chain, parser } = tag as TypeKeyValue;\n      str += parser.text;\n      if (chain) {\n        for (const t of chain) {\n          str = convertTagToTextRecursive(t, str);\n        }\n      }\n      return str;\n    };\n\n    // New code: Only tags before the $$$$ tag (or first text if not bitmark--/++) are interpreted as tags\n    // all other tags are squashed back to text\n    let inPlainText = false;\n    for (const content of data) {\n      const { type, value } = content as TypeKeyValue;\n      const valueStr = (value ?? '') as string;\n      let atPlainTextDivider = false;\n\n      if (!inPlainText) {\n        if (type === TypeKey.BodyText && !isBitmarkText && valueStr && valueStr.trim()) {\n          inPlainText = true;\n        }\n        if (type === TypeKey.PlainTextDivider) {\n          inPlainText = true;\n          atPlainTextDivider = true;\n        }\n      }\n\n      if (!atPlainTextDivider) {\n        if (inPlainText) {\n          if (type === TypeKey.BodyText) {\n            result.push({ type: TypeKey.BodyTextPlain, value } as TypeValue);\n          } else {\n            const s = convertTagToTextRecursive(content);\n            result.push({ type: TypeKey.BodyTextPlain, value: s } as TypeValue);\n          }\n        } else {\n          result.push(content);\n        }\n      } else {\n        result.push({ type: TypeKey.BodyText, value: '\\n' } as TypeValue);\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Process Type/Key/Value data, building the bit parts as AST nodes.\n   *\n   * @param bitType bit type\n   * @param textFormat bit text format type\n   * @param contentDepth bit level (in chain, in card etc)\n   * @param tagsConfig tags configuration at this parser level (pass undef)\n   * @param data the bit content (Type/Key/Value data)\n   * @returns\n   */\n  private bitContentProcessor(\n    contentDepth: ContentDepthType,\n    tagsConfig: TagsConfig | undefined,\n    data: BitContent[] | undefined,\n  ): BitContentProcessorResult {\n    const result: BitContentProcessorResult = {};\n    if (!data) return result;\n\n    const { bitType, textFormat } = this.context;\n\n    result.title = [];\n    result.solutions = [];\n    result.__solutionsAst = [];\n    result.statements = [];\n    result.choices = [];\n    result.responses = [];\n    result.propertyStyleResources = {};\n    result.resources = [];\n    result.trueFalse = [];\n    result.markConfig = [];\n    result.extraProperties = {};\n    result.internalComments = [];\n\n    let seenReference = false;\n    let inFooter = false;\n    const bodyParts: BodyPart[] = [];\n    let bodyTextPart: BreakscapedString = Breakscape.EMPTY_STRING;\n    let footer: BreakscapedString = Breakscape.EMPTY_STRING;\n    let bodyPlainText: BreakscapedString = Breakscape.EMPTY_STRING;\n    let footerPlainText: BreakscapedString = Breakscape.EMPTY_STRING;\n    // let cardBody: BreakscapedString = Breakscape.EMPTY_STRING;\n\n    const inBit = contentDepth === BitContentLevel.Bit;\n    const inCard = contentDepth === BitContentLevel.Card;\n    const inChain = contentDepth === BitContentLevel.Chain;\n\n    // Helper for building the body text\n    const addBodyText = () => {\n      if (bodyTextPart) {\n        // Validate the body part\n        bodyTextPart = BitmarkPegParserValidator.checkBodyPart(\n          this.context,\n          contentDepth,\n          bodyTextPart,\n        );\n\n        const bodyText = BodyContentProcessor.buildBodyText(bodyTextPart, false);\n        bodyParts.push(bodyText);\n      }\n      bodyTextPart = Breakscape.EMPTY_STRING;\n    };\n\n    // Reduce the Type/Key/Value data to a single object that can be used to build the bit\n    // let _index = 0;\n    for (const content of data) {\n      const { type, value } = content as TypeKeyValue;\n\n      switch (type) {\n        case TypeKey.ItemLead: {\n          itemLeadChainContentProcessor(this.context, contentDepth, tagsConfig, content, result);\n          break;\n        }\n\n        case TypeKey.Instruction:\n        case TypeKey.Hint:\n        case TypeKey.Anchor:\n        case TypeKey.SampleSolution:\n          defaultTagContentProcessor(this.context, contentDepth, tagsConfig, content, result);\n          break;\n\n        case TypeKey.Reference:\n          referenceTagContentProcessor(\n            this.context,\n            contentDepth,\n            tagsConfig,\n            content,\n            result,\n            seenReference,\n          );\n          seenReference = true;\n          break;\n\n        case TypeKey.Title:\n          titleTagContentProcessor(this.context, contentDepth, tagsConfig, content, result);\n          break;\n\n        case TypeKey.Property:\n          propertyContentProcessor(this.context, contentDepth, tagsConfig, content, result);\n          break;\n\n        case TypeKey.Gap: {\n          if (!inChain) addBodyText(); // Body bit, so add the body text\n          gapChainContentProcessor(\n            this.context,\n            contentDepth,\n            tagsConfig,\n            content,\n            result,\n            bodyParts,\n          );\n          break;\n        }\n\n        case TypeKey.Mark: {\n          if (!inChain) addBodyText(); // Body bit, so add the body text\n          markChainContentProcessor(\n            this.context,\n            contentDepth,\n            tagsConfig,\n            content,\n            result,\n            bodyParts,\n          );\n          break;\n        }\n\n        case TypeKey.True:\n        case TypeKey.False: {\n          if (!inChain) addBodyText(); // Body bit, so add the body text\n          trueFalseChainContentProcessor(\n            this.context,\n            contentDepth,\n            tagsConfig,\n            content,\n            result,\n            bodyParts,\n          );\n          break;\n        }\n\n        case TypeKey.Resource:\n          resourceContentProcessor(this.context, contentDepth, tagsConfig, content, result);\n          break;\n\n        case TypeKey.CardSet: {\n          result.cardSet = value as ParsedCardSet;\n          inFooter = true; // After the card set, body lines should be written to the footer rather than the body\n          break;\n        }\n\n        case TypeKey.BodyText:\n        case TypeKey.CardText: {\n          if (inFooter) {\n            footer = Breakscape.concatenate(footer, value as BreakscapedString);\n          } else {\n            bodyTextPart = Breakscape.concatenate(bodyTextPart, value as BreakscapedString);\n          }\n          break;\n        }\n\n        case TypeKey.BodyTextPlain: {\n          if (inFooter) {\n            footerPlainText = Breakscape.concatenate(footerPlainText, value as BreakscapedString);\n          } else {\n            bodyPlainText = Breakscape.concatenate(bodyPlainText, value as BreakscapedString);\n          }\n          break;\n        }\n\n        case TypeKey.FooterDivider: {\n          if (inFooter) {\n            // If already in footer, handle the content as if it is footer (body) text\n            footer = Breakscape.concatenate(footer, value as BreakscapedString);\n          }\n          inFooter = true; // After the footer divider, body lines should be written to the footer rather than the body\n          break;\n        }\n\n        default:\n        // Unknown tag\n      }\n\n      // _index++;\n    }\n\n    // Add the last body text part, and trim the body text parts\n    addBodyText();\n\n    // Add the plain texts if they exist\n    const bodyPlainTextNode = bodyPlainText\n      ? BodyContentProcessor.buildBodyText(bodyPlainText, true)\n      : undefined;\n    if (bodyPlainTextNode) bodyParts.push(bodyPlainTextNode);\n\n    // Spread the chained item / lead / etc\n    // Set the lead item from the chain\n    if (result.itemLead) {\n      const l = result.itemLead.length;\n      if (l > 0) result.item = result.itemLead[0];\n      if (l > 1) result.lead = result.itemLead[1];\n      if (l > 2) result.pageNumber = result.itemLead[2];\n      if (l > 3) result.marginNumber = result.itemLead[l - 1];\n    }\n    if (result.__itemLeadString) {\n      const l = result.__itemLeadString.length;\n      if (l > 0) result.__itemString = result.__itemLeadString[0];\n      if (l > 1) result.__leadString = result.__itemLeadString[1];\n      if (l > 2) result.__pageNumberString = result.__itemLeadString[2];\n      if (l > 3) result.__marginNumberString = result.__itemLeadString[l - 1];\n    }\n\n    // Validate and build the body (trimmed)\n    if (inBit) {\n      result.body = BodyContentProcessor.process(\n        this.context,\n        contentDepth,\n        bitType,\n        textFormat,\n        tagsConfig,\n        result,\n        bodyParts,\n        false,\n      );\n      //  bodyParts.length > 0 ? builder.body({ bodyParts: this.trimBodyParts(bodyParts) }) : undefined;\n      // result.body = BitmarkPegParserValidator.checkBody(this.context, contentDepth, bitType, textFormat, result.body);\n    } else if (inCard) {\n      result.cardBody = BodyContentProcessor.process(\n        this.context,\n        contentDepth,\n        bitType,\n        textFormat,\n        tagsConfig,\n        result,\n        bodyParts,\n        true,\n      );\n      // result.cardBody = bodyParts.length > 0 ? builder.body({ bodyParts: this.trimBodyParts(bodyParts) }) : undefined;\n      // Card body is validated in CardContentProcessor:processCardSet()\n    }\n\n    // Validate and build the footer (trimmed)\n    // footer = footer.trim() as BreakscapedString;\n    // footerPlainText = footerPlainText.trim() as BreakscapedString;\n    // if (footer || footerPlainText) {\n    //   if (footer) {\n    //     footer = BitmarkPegParserValidator.checkFooter(this.context, contentDepth, bitType, footer);\n    //   }\n    //   const footerTexts: FooterText[] = [];\n    //   const footerNode = footer ? builder.footerText({ text: footer }, false) : undefined;\n    //   const footerPlainTextNode = footerPlainText ? builder.footerText({ text: footerPlainText }, true) : undefined;\n    //   if (footerNode) footerTexts.push(footerNode);\n    //   if (footerPlainTextNode) footerTexts.push(footerPlainTextNode);\n    //   if (footer) {\n    //     result.footer =\n    //       footerTexts.length > 0 ? builder.footer({ footerParts: this.trimFooterTexts(footerTexts) }) : undefined;\n    //   }\n    // }\n    result.footer = FooterContentProcessor.process(\n      this.context,\n      contentDepth,\n      tagsConfig,\n      result,\n      footer,\n      footerPlainText,\n    );\n\n    // // Add card body (validated elsewhere)\n    // cardBody = cardBody.trim() as BreakscapedString;\n    // if (cardBody) {\n    //   result.cardBody = cardBody;\n    // }\n\n    // Remove the extra properties if there are none\n    if (Object.keys(result.extraProperties).length === 0) delete result.extraProperties;\n\n    // Remove the unwanted empty arrays.\n    if (result.title.length === 0) delete result.title;\n    if (result.solutions.length === 0) delete result.solutions;\n    if (result.statements.length === 0) delete result.statements;\n    if (result.choices.length === 0) delete result.choices;\n    if (result.responses.length === 0) delete result.responses;\n    if (result.trueFalse.length === 0) delete result.trueFalse;\n    if (result.markConfig.length === 0) delete result.markConfig;\n    if (Object.keys(result.propertyStyleResources).length === 0)\n      delete result.propertyStyleResources;\n    if (result.resources.length === 0) delete result.resources;\n    if (result.internalComments.length === 0) delete result.internalComments;\n\n    return result;\n  }\n\n  private buildBitLevelWarnings(): ParserError[] | undefined {\n    let warnings: ParserError[] | undefined;\n    if (this.nonFatalWarnings.length > 0) {\n      warnings = this.nonFatalWarnings;\n      this.nonFatalWarnings = [];\n    }\n    return warnings;\n  }\n\n  private buildBitLevelErrors(): ParserError[] | undefined {\n    let errors: ParserError[] | undefined;\n    if (this.nonFatalErrors.length > 0) {\n      errors = this.nonFatalErrors;\n      this.nonFatalErrors = [];\n    }\n    return errors;\n  }\n\n  /**\n   * Split bit content into parts based on the given type keys\n   *\n   * @param bitContent bit content to split\n   * @param types to split on\n   */\n  private splitBitContent(bitContent: BitContent[], types: TypeKeyType[]): BitContent[][] {\n    const parts: BitContent[][] = [];\n    let part: BitContent[] = [];\n\n    for (const c of bitContent) {\n      if (types.includes(c.type as TypeKeyType)) {\n        if (part.length > 0) parts.push(part);\n        part = [];\n      }\n      part.push(c);\n    }\n\n    if (part.length > 0) parts.push(part);\n\n    return parts;\n  }\n\n  //\n  // Util functions\n  //\n\n  /**\n   * Add an warning to the list of non-fatal warnings\n   * @param message The error message\n   * @param parserData Parser data - if not set, the current parser data will be used\n   * @param parserDataOriginal Parser data of the original instance of a duplicate error\n   */\n  private addWarning(message: string, parserData?: ParserData, parserDataOriginal?: ParserData) {\n    const warning: ParserError = {\n      message,\n      text: parserData?.parser.text ?? this.parserText(),\n      location: parserData?.parser.location ?? this.parserLocation(),\n      original: parserDataOriginal?.parser ?? undefined,\n    };\n    if (!warning.original) delete warning.original;\n\n    this.nonFatalWarnings.push(warning);\n  }\n\n  /**\n   * Add an error to the list of non-fatal errors\n   * @param message The error message\n   * @param parserData Parser data - if not set, the current parser data will be used\n   * @param parserDataOriginal Parser data of the original instance of a duplicate error\n   */\n  private addError(message: string, parserData?: ParserData, parserDataOriginal?: ParserData) {\n    const error: ParserError = {\n      message,\n      text: parserData?.parser.text ?? this.parserText(),\n      location: parserData?.parser.location ?? this.parserLocation(),\n      original: parserDataOriginal?.parser ?? undefined,\n    };\n    if (!error.original) delete error.original;\n\n    this.nonFatalErrors.push(error);\n  }\n\n  /**\n   * Print out data for debugging\n   *\n   * @param header\n   * @param data\n   */\n  private debugPrint(header: string, data: unknown): void {\n    \n  }\n}\n\nexport { BitmarkPegParserProcessor };\n","/**\n * BitmarkPegParserValidator.ts\n * RA Sewell\n *\n * (c) 2023 Get More Brain AG\n * All rights reserved.\n *\n */\n\nimport { Enum } from '@ncoderz/superenum';\n\nimport { Config } from '../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../model/ast/BreakscapedString.ts';\nimport { type Body, type BodyPart } from '../../../model/ast/Nodes.ts';\nimport { type JsonText } from '../../../model/ast/TextNodes.ts';\nimport { CardSetConfig } from '../../../model/config/CardSetConfig.ts';\nimport { ConfigKey, type ConfigKeyType } from '../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../model/config/TagsConfig.ts';\nimport {\n  BitTagConfigKeyType,\n  type BitTagConfigKeyTypeType,\n} from '../../../model/enum/BitTagConfigKeyType.ts';\nimport { type BitTypeType } from '../../../model/enum/BitType.ts';\nimport { Count, type CountType } from '../../../model/enum/Count.ts';\nimport { type TagType } from '../../../model/enum/Tag.ts';\nimport { type TextFormatType } from '../../../model/enum/TextFormat.ts';\nimport { type ParserData } from '../../../model/parser/ParserData.ts';\nimport { type TagValidationData } from '../../../model/parser/TagValidationData.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type ParsedCardSet,\n  TypeKey,\n  type TypeKeyType,\n  type TypeKeyValue,\n} from './BitmarkPegParserTypes.ts';\n\nconst COMMON_MISTAKE_STRINGS = [\n  // Card divider errors\n  '----',\n  '\\n==\\n',\n  '\\n---\\n',\n  // Remark errors\n  // Comment errors\n];\n\nconst COMMON_STARTS_WITH_MISTAKE_STRINGS = [\n  // Card divider errors\n  '==\\n',\n  '--\\n',\n];\n\nconst COMMON_ENDS_WITH_MISTAKE_STRINGS = [\n  // Card divider errors\n  '\\n==',\n  '\\n--',\n];\n\ninterface WarningInfo {\n  invalid?: boolean; // Tag / data is not valid for this bit\n  tooMany?: number; // The tag / data has been included too many times (should be at most this many times)\n  tooFew?: number; // The tag / data has not been included enough times (should be at least this many times)\n  extraProperty?: boolean; // The property is not recognised, but will be included as an extra property\n  excessResource?: boolean; // The resource is not allowed, but will be included as an excess resource\n  unexpectedCardSet?: boolean; // The card set was not expected for this bit\n  unexpectedCardSideVariant?: boolean; // The card side variant is not recognised for the card set\n  warning?: string;\n  content?: BitContent;\n  previousContent?: ParserData | undefined;\n}\n\ninterface ValidateReturn {\n  content?: BitContent | undefined;\n  warning?: WarningInfo;\n}\n\ninterface ValidateSingleTagReturn {\n  validated: BitContent | undefined;\n  warning?: WarningInfo;\n}\n\ninterface ValidateChainRecursiveReturn {\n  validated: BitContent[];\n  remaining?: BitContent; // Tag split off from the chain\n}\n\nclass BitmarkPegParserValidator {\n  /**\n   * Validate the bit tags and tag chains.\n   *\n   * Any unknown tag chains will be 'unchained' and processed as individual tags.\n   *\n   * @param context\n   * @param bitType\n   * @param resourceType the resource type specified in the bit header\n   * @param data the unvalidated bit content from the parser\n   *\n   * @returns the validated and potentially unchained bit content\n   */\n  validateBitTags(context: BitmarkPegParserContext, data: BitContent[]): BitContent[] {\n    // if (context.DEBUG_BIT_TAG_VALIDATION) context.debugPrint('bit tag validation', data);\n    if (!data) return [];\n\n    const { bitConfig, bitType, resourceType } = context;\n\n    // Get the bit config to check how to parse the bit\n\n    const { tags: bitTags, cardSet: cardSetConfig } = bitConfig;\n\n    // Insert the resource tags from the resources config (which can depends on the resource type attachment in the bit header).\n    const resourcesConfig = Config.getBitResourcesConfig(bitType, resourceType);\n    const tags = { ...bitTags, ...resourcesConfig.tags };\n\n    // Validate and convert the tag chains\n    const res: BitContent[] = this.validateTagChainsRecursive(\n      context,\n      BitContentLevel.Bit,\n      bitType,\n      data,\n      tags,\n      cardSetConfig,\n    ).validated;\n\n    // TODO: Check the minimum counts\n    // const minCount = tagData.minCount == null ? 0 : tagData.minCount;\n\n    return res;\n  }\n\n  /**\n   * Check the body of the bit.\n   *\n   * This function also converts the body to JSON if the text format is JSON.\n   *\n   * @param context\n   * @param bitType\n   * @param _contentDepth\n   * @param body\n   * @returns\n   */\n  checkBody(\n    context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    bitType: BitTypeType,\n    _textFormat: TextFormatType,\n    bodyParts: BodyPart[] | undefined,\n  ): BodyPart[] | undefined {\n    if (!bodyParts) return bodyParts;\n\n    const { bitConfig } = context;\n\n    // Get the bit config to check how to parse the bit\n\n    const { bodyAllowed } = bitConfig;\n\n    const hasBody = bodyParts.length > 0;\n\n    if (hasBody && !bodyAllowed) {\n      context.addWarning(`Bit '${bitType}' should not have a body.`);\n    }\n\n    return bodyParts;\n  }\n\n  /**\n   * Check the body part of the bit.\n   *\n   * @param context\n   * @param _contentDepth\n   * @param bitType\n   * @param body\n   * @returns\n   */\n  checkBodyPart(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    bodyPart: BreakscapedString,\n  ): BreakscapedString {\n    if (!bodyPart) return bodyPart;\n\n    this.checkBodyForCommonPotentialMistakes(context, contentDepth, bodyPart);\n\n    return bodyPart;\n  }\n\n  /**\n   * Check the footer of the bit.\n   *\n   * @param context\n   * @param _contentDepth\n   * @param bitType\n   * @param body\n   * @returns\n   */\n  checkFooter(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    footer: BreakscapedString,\n  ): BreakscapedString {\n    if (!footer) return footer;\n\n    const { bitConfig, bitType } = context;\n\n    // Get the bit config to check how to parse the bit\n    const { footerAllowed } = bitConfig;\n\n    this.checkBodyForCommonPotentialMistakes(context, contentDepth, footer);\n\n    if (!footerAllowed) {\n      context.addWarning(`Bit '${bitType}' should not have a footer.`);\n    }\n\n    return footer;\n  }\n\n  /**\n   * Check the footer of the bit.\n   *\n   * @param context\n   * @param _contentDepth\n   * @param bitType\n   * @param cardBody\n   * @returns\n   */\n  checkCardBody(\n    context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    bitType: BitTypeType,\n    cardBody: Body | undefined,\n    cardNo: number,\n    sideNo: number,\n    variantNo: number,\n  ): Body | undefined {\n    if (!cardBody || !cardBody.body) return cardBody;\n\n    const { bitConfig } = context;\n\n    // Get the bit config to check how to parse the bit\n    if (!bitConfig.cardSet) return cardBody; // Won't happen. Just to make TS happy\n\n    const variantConfig = Config.getCardSetVariantConfig(bitType, sideNo, variantNo);\n    if (!variantConfig) return cardBody; // Won't happen. Just to make TS happy\n\n    const { bodyAllowed } = variantConfig;\n\n    const hasBody = (cardBody.bodyString as JsonText).length > 0;\n\n    // this.checkBodyForCommonPotentialMistakes(context, contentDepth, bitType, cardBody);\n\n    if (hasBody && !bodyAllowed) {\n      context.addWarning(\n        `Bit '${bitType}' should not have a card body at card:${cardNo + 1}, side:${sideNo + 1}, variant:${\n          variantNo + 1\n        }.`,\n      );\n    }\n\n    return cardBody;\n  }\n\n  //\n  // Private\n  //\n\n  /**\n   * Validate tag chains as they are encountered, expanding any tag chains that are not valid,\n   * so they can be processed as individual tags.\n   *\n   * @param context\n   * @param contentDepth\n   * @param bitType\n   * @param data\n   * @param tags\n   * @param cardSetConfig\n   */\n  private validateTagChainsRecursive(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    bitType: BitTypeType,\n    data: BitContent[],\n    tags: TagsConfig,\n    cardSetConfig?: CardSetConfig,\n    chainHeadType?: TypeKeyType,\n  ): ValidateChainRecursiveReturn {\n    if (!data) {\n      return {\n        validated: [],\n      };\n    }\n\n    let remaining: BitContent | undefined;\n    const dataOrNull: (BitContent | null)[] = [...data];\n\n    // Get valid type keys from the tags\n    const validTypeKeys = this.convertTagsToTypeKeyMap(context, contentDepth, bitType, tags);\n\n    // Helper function for add extra valid type keys\n    const addExtraValidTypeKeys = (key: TypeKeyType, maxCount: CountType, minCount: number) => {\n      validTypeKeys.set(key, {\n        maxCount,\n        minCount,\n        _type: key as BitTagConfigKeyTypeType,\n        _tag: key as TagType,\n        _seenCount: 0,\n      });\n    };\n\n    if (contentDepth === BitContentLevel.Bit) {\n      // Add the extra valid tags dependent on bit configuration\n      if (cardSetConfig) addExtraValidTypeKeys(TypeKey.CardSet, 1, 0);\n\n      // These tags are always allowed here, and validated later\n      addExtraValidTypeKeys(TypeKey.TextFormat, 1, 0);\n      addExtraValidTypeKeys(TypeKey.BodyText, Count.infinity, 0);\n      addExtraValidTypeKeys(TypeKey.BodyTextPlain, Count.infinity, 0);\n      addExtraValidTypeKeys(TypeKey.PlainTextDivider, Count.infinity, 0);\n      addExtraValidTypeKeys(TypeKey.FooterDivider, Count.infinity, 0); // No warning for multiple footers, just ignore\n    } else if (contentDepth === BitContentLevel.Card) {\n      // These tags are always allowed here, and validated later\n      addExtraValidTypeKeys(TypeKey.CardText, Count.infinity, 0);\n    }\n\n    // const end = data.length;\n    for (let i = 0; i < dataOrNull.length; i++) {\n      const content = dataOrNull[i];\n      if (!content) continue;\n\n      const { type, key } = content as TypeKeyValue;\n      let typeKey = Enum(TypeKey).fromValue(type);\n      if (!typeKey) continue; // Should not happen\n\n      // Build the final valid type key which is the key for property / resources\n      let validTypeKey: TypeKeyType | string | undefined = typeKey;\n      if (typeKey === TypeKey.Property || typeKey === TypeKey.Resource) {\n        validTypeKey = key;\n      }\n\n      // Get the tag data for this tag type and key. If not found, the tag is not valid\n      let tagData = validTypeKeys.get(validTypeKey);\n\n      // Support [@ fallback to [&:\n      // See: https://github.com/getMoreBrain/cosmic/issues/7859\n      // In the case of a property tag that is not found, convert it to a resource tag and retry\n      // Only for specific tags. This is to support legacy tags for a short period and will be removed in the future\n      // (support @ instead of & for resources)\n      if (!tagData && typeKey === TypeKey.Property) {\n        const resourceKey = key.replace(/^@/, '&') as ConfigKeyType;\n        if (\n          resourceKey === ConfigKey.resource_backgroundWallpaper ||\n          resourceKey === ConfigKey.resource_imagePlaceholder ||\n          resourceKey === ConfigKey.resource_platformIcon ||\n          resourceKey === ConfigKey.resource_platformLogo ||\n          resourceKey === ConfigKey.resource_platformBackgroundImage ||\n          resourceKey === ConfigKey.resource_coverImage\n        ) {\n          tagData = validTypeKeys.get(resourceKey);\n          if (tagData) {\n            typeKey = TypeKey.Resource;\n            content.type = TypeKey.Resource;\n\n            const warningMsg = `Falling back to '[${resourceKey}]' from '[${key}]'. Replace '[${key}]' with '[&${key}]' to avoid this warning.`;\n            context.addWarning(warningMsg);\n          }\n        }\n      }\n\n      // Validate the single tag\n      const { validated: validatedTagContent, warning } = this.validateSingleTag(\n        context,\n        contentDepth,\n        bitType,\n        content,\n        typeKey,\n        tagData,\n        cardSetConfig,\n      );\n\n      // HACK to handle 'chain-within-chain' for [@person] tags (at least to stop the parser splitting the chain)\n      if (typeKey === TypeKey.Resource) chainHeadType = TypeKey.Resource;\n\n      // Tag is not valid in this position. Either remove it or reprocess by breaking the current chain\n      let addWarning = true;\n      if (!validatedTagContent) {\n        if (contentDepth === BitContentLevel.Chain && chainHeadType !== TypeKey.Resource) {\n          // If in a chain and the tag is invalid within the chain then break the chain and re-process the tag as a\n          // single tag with the rest of the chain as a chain [excluding resource chains].\n          remaining = content;\n          const restOfChain = dataOrNull.slice(i + 1);\n          if (restOfChain.length > 0) {\n            remaining.chain = restOfChain as BitContent[];\n          }\n\n          // Remove the data from the current chain\n          dataOrNull.splice(i);\n\n          // Ignore the generated warning from validateSingleTag as the tag will be reprocessed and will then\n          // be valid or will generated a warning there\n          addWarning = false;\n        } else {\n          // The tag is not valid, and either this is not a chain or not a resource chain.\n\n          // Remove the tag from the data\n          dataOrNull.splice(i, 1, null);\n        }\n      }\n\n      // Add the warning generated by validateSingleTag\n      if (warning && addWarning) {\n        context.addWarning(warning.warning ?? '', warning.content, warning.previousContent);\n      }\n\n      // If the content does not have a chain, but the validation data does have a chain, and there are still more\n      // items in this chain, then the remaining items should be considered a sub-chain and processed as such.\n      // Split the remaining items off from the current chain and process them as a separate chain.\n      if (\n        contentDepth === BitContentLevel.Chain &&\n        tagData &&\n        tagData.chain &&\n        validatedTagContent &&\n        !validatedTagContent.chain\n      ) {\n        const restOfChain = dataOrNull.slice(i + 1);\n        if (restOfChain.length > 0) {\n          validatedTagContent.chain = restOfChain as BitContent[];\n        }\n        dataOrNull.splice(i + 1);\n      }\n\n      // If the content has a chain, but the validation data does not have a chain, then the chain is invalid\n      // The chain is split off from the single tag for further processing.\n      // This allows non-chained tags to be compressed into a chain without breaking the behaviour, and makes the\n      // parser more forgiving.\n      if (\n        validatedTagContent &&\n        Array.isArray(validatedTagContent.chain) &&\n        validatedTagContent.chain.length > 0\n      ) {\n        if (tagData && tagData.chain) {\n          const { validated: validatedTagChainContent, remaining: remainingTagChainContent } =\n            this.validateTagChainsRecursive(\n              context,\n              BitContentLevel.Chain,\n              bitType,\n              validatedTagContent.chain,\n              tagData.chain,\n              undefined,\n              validatedTagContent.type as TypeKeyType,\n            );\n          if (validatedTagChainContent && validatedTagChainContent.length > 0) {\n            validatedTagContent.chain = validatedTagChainContent;\n          } else {\n            // Tag chain is invalid, remove it\n            validatedTagContent.chain = undefined;\n          }\n\n          // If there is remaining tag chain content to process, insert it into the data\n          if (remainingTagChainContent) {\n            dataOrNull.splice(i + 1, 0, remainingTagChainContent);\n          }\n        } else {\n          // Tag does not have a chain in the bit config. Split the chain and process as a separate chain.\n          // This allows for 'bugs' such as [%item][%lead][!instruction] - instruction still works.\n          if (validatedTagContent.type !== TypeKey.Resource) {\n            // Build the 'split-off' bit content\n            const remainingTagChainContent: BitContent = validatedTagContent.chain[0];\n            if (validatedTagContent.chain.length > 1) {\n              remainingTagChainContent.chain = validatedTagContent.chain.slice(1);\n            }\n            dataOrNull.splice(i + 1, 0, remainingTagChainContent);\n            // Clear the original chain\n            validatedTagContent.chain = undefined;\n          }\n        }\n      }\n    }\n\n    // Raise warnings for the minimum counts\n    for (const data of validTypeKeys.values()) {\n      const { minCount, _seenCount } = data;\n      if (minCount != null && _seenCount < minCount) {\n        const warningMsg = `${this.getTagSignature(data)} is required at least ${minCount} time(s)`;\n        context.addWarning(warningMsg);\n      }\n    }\n\n    // Filter all the null's from the validated tags\n    const res = dataOrNull.filter((content) => content != null) as BitContent[];\n\n    return {\n      validated: res,\n      remaining,\n    };\n  }\n\n  /**\n   * Validate a single bit tag\n   *\n   * @param context\n   * @param contentDepth\n   * @param bitType\n   * @param content\n   * @param typeKey\n   * @param tagValidationData\n   * @param cardSetConfig\n   *\n   * @returns validated tag, or undefined if the tag is invalid\n   */\n  private validateSingleTag(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    bitType: BitTypeType,\n    content: BitContent,\n    typeKey: TypeKeyType,\n    tagValidationData: TagValidationData | undefined,\n    cardSetConfig: CardSetConfig | undefined,\n  ): ValidateSingleTagReturn {\n    // if (context.DEBUG_BIT_TAG_VALIDATION) context.debugPrint('bit tag validation', data);\n\n    const { type, key } = content as TypeKeyValue;\n\n    const keyStr = tagValidationData\n      ? this.getTagSignature(tagValidationData)\n      : this.getUnknownTagSignature(type, key);\n    const ignoredStr = ' It will be ignored';\n    let warningStr = '';\n    let validatedContent: BitContent | undefined;\n    let warning: WarningInfo | undefined;\n\n    // // Get seen data from the seen cache\n    // let seen = seenTypeKeys.get(typeKeyPlusKey);\n    // if (seen == undefined) {\n    //   seen = {\n    //     count: 0,\n    //   };\n    //   seenTypeKeys.set(typeKeyPlusKey, seen);\n    // }\n\n    // let previousContent = seen.previous;\n    // seen.count++;\n\n    if (tagValidationData) {\n      // Increment the seen count for this tag\n      tagValidationData._seenCount++;\n\n      // This type key is valid. Now check if it's been seen before and if so, how many times\n      switch (typeKey) {\n        case TypeKey.Property: {\n          const { content: c, warning: w } = this.validatePropertyTag(\n            context,\n            contentDepth,\n            bitType,\n            tagValidationData,\n            content as TypeKeyValue,\n          );\n          validatedContent = c;\n          warning = w;\n          break;\n        }\n\n        case TypeKey.Resource: {\n          const { content: c, warning: w } = this.validateResourceTag(\n            context,\n            contentDepth,\n            bitType,\n            tagValidationData,\n            content as TypeKeyValue,\n          );\n          validatedContent = c;\n          warning = w;\n          break;\n        }\n\n        case TypeKey.CardSet: {\n          const { content: c, warning: w } = this.validateCardSet(\n            context,\n            bitType,\n            tagValidationData,\n            content as TypeKeyValue,\n            cardSetConfig,\n          );\n          validatedContent = c;\n          warning = w;\n          break;\n        }\n\n        default: {\n          const { content: c, warning: w } = this.validateStandardTag(\n            context,\n            contentDepth,\n            bitType,\n            tagValidationData,\n            content as TypeKeyValue,\n          );\n          validatedContent = c;\n          warning = w;\n        }\n      }\n    } else {\n      // type is not valid as no tag data exists for it\n      switch (typeKey) {\n        case TypeKey.Property: {\n          // The property is not valid for this bit type, but since we allow extra properties, we will return it as\n          // ok but with a warning\n          warning = { extraProperty: true };\n          if (contentDepth !== BitContentLevel.Chain) {\n            validatedContent = content; // Add tag anyway - we don't remove extra properties (unless in chain)\n          }\n          break;\n        }\n\n        case TypeKey.Resource: {\n          warning = { excessResource: true };\n          validatedContent = content; // Add tag anyway, will be added as an excess resource\n          break;\n        }\n\n        default:\n          warning = { invalid: true };\n      }\n    }\n\n    // Add a warning if there is one\n    if (warning) {\n      const previousContent = tagValidationData?._previous;\n\n      // TODO - warning and ignore\n      if (warning.invalid || warning.excessResource) {\n        warningStr = `${keyStr} is not valid here (incorrectly chained?).${ignoredStr}`;\n      } else if (warning.tooMany != null) {\n        warningStr = `${keyStr} is included more than the required ${warning.tooMany} time(s).`;\n        if (warning.tooMany === 0 && typeKey === TypeKey.Resource) {\n          warningStr += ` Did you forget the '${key}' in the bit header?`;\n        }\n        if (warning.tooMany > 0) warningStr += ' The earlier ones will be ignored';\n        // } else if (warning.tooFew != null) {\n        //   warningStr = `'${type}'${keyStr} is not included enough times(s). It should be included ${warning.tooFew} time(s)`;\n      } else if (warning.extraProperty) {\n        warningStr = `${keyStr} is an unknown property. It can be excluded from the output using the 'excludeUnknownProperties' flag`;\n      } else if (warning.unexpectedCardSet) {\n        warningStr = `${keyStr} is not expected here.${ignoredStr}`;\n      } else if (warning.unexpectedCardSideVariant) {\n        warningStr = `${keyStr} has a card / side / variant that is not expected here.${ignoredStr}`;\n      }\n\n      warning.warning = warningStr;\n      warning.content = validatedContent;\n      warning.previousContent = previousContent;\n    }\n\n    // Update the seen data\n    if (tagValidationData) {\n      tagValidationData._previous = content;\n    }\n\n    return {\n      validated: validatedContent,\n      warning,\n    };\n  }\n\n  /**\n   * Validates a standard bit tag\n   *\n   * @param context\n   * @param bitLevel\n   * @param bitType\n   * @param tagValidationData\n   * @param content\n   * @param seen\n   *\n   * @returns validated tag (plus warning message if one is generated) or undefined if the tag is invalid\n   */\n  private validateStandardTag(\n    _context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    _bitType: BitTypeType,\n    tagValidationData: TagValidationData,\n    content: TypeKeyValue,\n  ): ValidateReturn {\n    // Check if the property is valid for this bit type\n\n    const validCount = tagValidationData.maxCount == null ? 1 : tagValidationData.maxCount;\n\n    // If validCount is infinity, an infinite number of this type is allowed\n    if (validCount !== Count.infinity) {\n      if (tagValidationData._seenCount > validCount) {\n        return {\n          warning: { tooMany: validCount },\n          content: content, // Return content anyway when too many, as last wins\n        };\n      }\n    }\n\n    // If we get here, the property is valid and can be added\n    return {\n      content: content,\n    };\n  }\n\n  /**\n   * Validates a single property tag\n   *\n   * @param context\n   * @param bitLevel\n   * @param bitType\n   * @param tagValidationData\n   * @param content\n   * @param seen\n   *\n   * @returns validated tag (plus warning message if one is generated) or undefined if the tag is invalid\n   */\n  private validatePropertyTag(\n    _context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    _bitType: BitTypeType,\n    tagValidationData: TagValidationData,\n    content: TypeKeyValue,\n  ): ValidateReturn {\n    // Check if the property is valid for this bit type\n\n    const validCount = tagValidationData.maxCount == null ? 1 : tagValidationData.maxCount;\n\n    // If validCount is infinity, an infinite number of this type is allowed\n    if (validCount !== Count.infinity) {\n      if (tagValidationData._seenCount > validCount) {\n        return {\n          warning: { tooMany: validCount },\n          content: content, // Return content anyway when too many, as last wins\n        };\n      }\n    }\n\n    // If we get here, the property is valid and can be added\n    return {\n      content: content,\n    };\n  }\n\n  /**\n   * Validates a single resource tag\n   *\n   * @param context\n   * @param bitLevel\n   * @param bitType\n   * @param tagValidationData\n   * @param content\n   * @param seen\n   *\n   * @returns validated tag (plus warning message if one is generated) or undefined if the tag is invalid\n   */\n  private validateResourceTag(\n    _context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    _bitType: BitTypeType,\n    tagValidationData: TagValidationData,\n    content: TypeKeyValue,\n  ): ValidateReturn {\n    // Check if the resource is valid for this bit type\n\n    const validCount = tagValidationData.maxCount == null ? 1 : tagValidationData.maxCount;\n\n    // If validCount is infinity, an infinite number of this type is allowed\n    if (validCount !== Count.infinity) {\n      if (tagValidationData._seenCount > validCount) {\n        return {\n          warning: { tooMany: validCount },\n          content: content, // Return content anyway when too many, as last wins\n        };\n      }\n    }\n\n    // If we get here, the property is valid and can be added\n    return {\n      content: content,\n    };\n  }\n\n  /**\n   * Validates a card set\n   *\n   * @param context\n   * @param bitLevel\n   * @param bitType\n   * @param _tagValidationData\n   * @param content\n   * @param cardSetConfig\n   * @param depth recursion depth\n   *\n   * @returns validated tag (plus warning message if one is generated) or undefined if the tag is invalid\n   */\n  private validateCardSet(\n    context: BitmarkPegParserContext,\n    bitType: BitTypeType,\n    _tagValidationData: TagValidationData,\n    content: TypeKeyValue,\n    cardSetConfig: CardSetConfig | undefined,\n  ): ValidateReturn {\n    // if (context.DEBUG_BIT_TAG_VALIDATION) context.debugPrint('bit tag validation', data);\n\n    if (!cardSetConfig || !cardSetConfig.variants || cardSetConfig.variants.length === 0) {\n      // Card set exists with no card set config for the bit\n      return {\n        warning: { unexpectedCardSet: true },\n      };\n    }\n\n    const { value } = content;\n    const cardSet = value as ParsedCardSet;\n    let warning: WarningInfo | undefined;\n\n    // For each of the variants in the card set, validate its contents\n    let sideIndex = 0;\n    let variantIndex = 0;\n    for (const card of cardSet.cards) {\n      sideIndex = 0;\n      for (const side of card.sides) {\n        variantIndex = 0;\n        for (const variant of side.variants) {\n          const variantContent = variant.content;\n          let validatedContent: BitContent[] | undefined;\n          const variantConfig = Config.getCardSetVariantConfig(bitType, sideIndex, variantIndex);\n\n          if (variantConfig) {\n            // Validate the variant against the config\n            const res = this.validateTagChainsRecursive(\n              context,\n              BitContentLevel.Card,\n              bitType,\n              variantContent,\n              variantConfig.tags,\n            );\n            validatedContent = res.validated;\n          } else {\n            // TODO - warning!\n            warning = {\n              unexpectedCardSideVariant: true,\n            };\n          }\n\n          // TODO - add the validated content to the card set, or remove the invalid variant\n          if (validatedContent && validatedContent.length > 0) {\n            side.variants[variantIndex] = {\n              parser: variant.parser,\n              content: validatedContent,\n            };\n          } else {\n            // Variant is invalid, remove it\n            side.variants[variantIndex] = {\n              parser: variant.parser,\n              content: [],\n            };\n          }\n\n          variantIndex++;\n        }\n        sideIndex++;\n      }\n    }\n\n    return {\n      content: content,\n      warning,\n    };\n  }\n\n  /**\n   * Check the body of the bit for patterns which indicate common potential bitmark language mistakes.\n   *\n   * @param context\n   * @param _contentDepth\n   * @param bitType\n   * @param body\n   * @returns\n   */\n  private checkBodyForCommonPotentialMistakes(\n    context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    body: string,\n  ): void {\n    if (!body) return;\n\n    const { bitType } = context;\n\n    for (const mistake of COMMON_MISTAKE_STRINGS) {\n      if (body.includes(mistake)) {\n        context.addWarning(`Bit '${bitType}' might contain a mistake: ${mistake}`);\n      }\n    }\n\n    for (const mistake of COMMON_STARTS_WITH_MISTAKE_STRINGS) {\n      if (body.startsWith(mistake)) {\n        context.addWarning(`Bit '${bitType}' might contain a mistake: ${mistake}`);\n      }\n    }\n\n    for (const mistake of COMMON_ENDS_WITH_MISTAKE_STRINGS) {\n      if (body.endsWith(mistake)) {\n        context.addWarning(`Bit '${bitType}' might contain a mistake: ${mistake}`);\n      }\n    }\n  }\n\n  /**\n   * Convert the tag data configuration to TypeKeys\n   *\n   * @param context\n   * @param _contentDepth\n   * @param bitType\n   * @param tags\n   * @param depth recursion depth\n   * @returns\n   */\n  private convertTagsToTypeKeyMap(\n    _context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    _bitType: BitTypeType,\n    tags: TagsConfig,\n  ): Map<TypeKeyType | string, TagValidationData> {\n    // Using a map here as we might add the 'count' of tags valid at a later stage\n    const res = new Map<TypeKeyType | string, TagValidationData>();\n\n    // Add the tags\n    for (const v of Object.values(tags)) {\n      // Save the key in the TagData\n      const tagValidationData: TagValidationData = {\n        minCount: v.minCount,\n        maxCount: v.maxCount,\n        isTag: v.type === BitTagConfigKeyType.tag,\n        isProperty: v.type === BitTagConfigKeyType.property,\n        isResource: v.type === BitTagConfigKeyType.resource,\n        chain: v.chain,\n\n        // Private\n        _configKey: v.configKey,\n        _type: v.type,\n        _tag: v.tag,\n        _seenCount: 0,\n        _previous: undefined,\n      };\n\n      if (tagValidationData.isProperty) {\n        res.set(v.configKey, tagValidationData);\n      } else if (tagValidationData.isResource) {\n        res.set(v.configKey, tagValidationData);\n      } else {\n        // Take advantage of the same naming convention (dangerous - should be improved)\n        const typeKey = Enum(TypeKey).fromValue(v.tag);\n        if (typeKey) {\n          res.set(typeKey, tagValidationData);\n        }\n      }\n    }\n\n    return res;\n  }\n\n  private getTagSignature(tagValidationData: TagValidationData): string {\n    switch (tagValidationData._type) {\n      case BitTagConfigKeyType.tag:\n      case BitTagConfigKeyType.property:\n      case BitTagConfigKeyType.resource:\n        return `[${tagValidationData._configKey}]`;\n      default:\n        return `'${tagValidationData._type}' tag '${tagValidationData._tag}'`;\n    }\n  }\n\n  private getUnknownTagSignature(type: string, tag: string): string {\n    switch (type) {\n      case TypeKey.Property:\n      case TypeKey.Resource:\n        return `[${tag}]`;\n      default:\n        return tag ? `'${type}' tag '${tag}'` : `'${type}' tag`;\n    }\n  }\n}\n\nconst instance = new BitmarkPegParserValidator();\n\nexport { instance as BitmarkPegParserValidator };\n","import {\n  type JsonText,\n  type TextNode,\n  type TextNodeAttibutes,\n} from '../../../../model/ast/TextNodes.ts';\nimport { TextNodeType } from '../../../../model/enum/TextNodeType.ts';\n\nclass ContentProcessorUtils {\n  /**\n   * Concatenates a plain JSON text with a JsonText that may be plain (v2) or BitmarkText (v3)\n   * Returns the combined text.\n   *\n   * @param text the text to concatenate\n   * @param extraBreaks extra breaks to add between concatenated texts\n   * @param textPlain the plain text to concatenate\n   */\n  public concatenatePlainTextWithAstTexts(\n    text: JsonText,\n    extraBreaks: number,\n    textPlain: string,\n  ): JsonText {\n    if (Array.isArray(text)) {\n      textPlain = textPlain && textPlain.trim();\n      if (textPlain) {\n        const splitText = textPlain.split('\\n');\n        const content: TextNode[] = [];\n\n        for (let i = 0; i < extraBreaks; i++) {\n          content.push({\n            type: TextNodeType.hardBreak,\n          });\n        }\n\n        for (let i = 0; i < splitText.length; i++) {\n          const t = splitText[i];\n          if (t) {\n            content.push({\n              text: t,\n              type: TextNodeType.text,\n            });\n          }\n          // Add a hard break after each paragraph, except the last one\n          if (i < splitText.length - 1) {\n            content.push({\n              type: TextNodeType.hardBreak,\n            });\n          }\n        }\n\n        // Add the content to the final paragraph, or create a new one if there none\n        const lastNode = text[text.length - 1];\n        if (lastNode && lastNode.type === TextNodeType.paragraph) {\n          lastNode.content = [...(lastNode.content ?? []), ...content];\n        } else {\n          text.push({\n            type: TextNodeType.paragraph,\n            content,\n            attrs: {} as TextNodeAttibutes,\n          });\n        }\n      }\n      return text;\n    }\n\n    return `${text ?? ''}${'\\n'.repeat(extraBreaks)}${textPlain ?? ''}`;\n  }\n}\n\nconst instance = new ContentProcessorUtils();\nexport { instance as ContentProcessorUtils };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type Body, type BodyPart } from '../../../../model/ast/Nodes.ts';\nimport { type JsonText, type TextAst } from '../../../../model/ast/TextNodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { type BitTypeType } from '../../../../model/enum/BitType.ts';\nimport { BodyBitType } from '../../../../model/enum/BodyBitType.ts';\nimport { TextFormat, type TextFormatType } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport {\n  type BodyBitJson,\n  type GapJson,\n  type HighlightJson,\n  type MarkJson,\n  type SelectJson,\n} from '../../../../model/json/BodyBitJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\nimport { BitmarkPegParserValidator } from '../BitmarkPegParserValidator.ts';\nimport { ContentProcessorUtils } from './ContentProcessorUtils.ts';\n\nexport interface BodyText extends BodyPart {\n  type: 'text';\n  data: {\n    bodyText: BreakscapedString;\n    isPlain: boolean;\n  };\n}\n\nconst textParser = new TextParser();\n\nclass BodyContentProcessor {\n  public process(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    bitType: BitTypeType,\n    textFormat: TextFormatType,\n    _tagsConfig: TagsConfig | undefined,\n    _target: BitContentProcessorResult,\n    bodyParts: BodyPart[],\n    isCardBody: boolean,\n  ): Partial<Body> | undefined {\n    const bodyBits: BodyBitJson[] = [];\n    let finalBody: JsonText | unknown | undefined;\n    let finalBodyString: string | undefined;\n    //\n    const trimmedBodyParts = bodyParts.length > 0 ? this.trimBodyParts(bodyParts) : undefined;\n    const validatedBodyParts = isCardBody\n      ? trimmedBodyParts\n      : BitmarkPegParserValidator.checkBody(\n          context,\n          contentDepth,\n          bitType,\n          textFormat,\n          trimmedBodyParts,\n        );\n\n    // If the text format is JSON, check the body is valid JSON\n    // In this case, the body will already have been 'squashed' so will not contain any parsed inline body tags\n    if (textFormat === TextFormat.json && validatedBodyParts) {\n      finalBody = validatedBodyParts.reduce((acc, val) => {\n        if (val.type === BodyBitType.text && val.data) {\n          const bodyTextVal = val as BodyText;\n          return (acc + (bodyTextVal.data.bodyText ?? '')) as string;\n        }\n        return acc;\n      }, '');\n      try {\n        finalBody = JSON.parse(finalBody as string);\n      } catch (_e) {\n        finalBody = null;\n        context.addError(`Body JSON is invalid.`);\n      }\n    } else {\n      // Standard body\n\n      let bodyTextStr: BreakscapedString = '' as BreakscapedString;\n      let plainBodyTextStr: BreakscapedString = '' as BreakscapedString;\n      let bodyStr: BreakscapedString = '' as BreakscapedString;\n      let placeholderIndex = 0;\n\n      // Function for creating the placeholder keys\n      const createPlaceholderKey = (i: number): BreakscapedString => `[!${i}]` as BreakscapedString;\n\n      // Loop the text bodyParts creating full body text with the correct placeholders\n      //\n      // fullBodyTextStr:\n      // - is created and passed into the text parser to create the body text AST\n      // - has placeholders inserted into 'fullBodyTextStr' in the format [!0] to allow the text parser to identify\n      //   where the body bits should be inserted.\n      //\n      if (validatedBodyParts) {\n        for (let i = 0; i < validatedBodyParts.length; i++) {\n          const bodyPart = validatedBodyParts[i];\n\n          const isText = bodyPart.type === BodyBitType.text;\n\n          if (isText) {\n            const asText = bodyPart as BodyText;\n            const bodyTextPart = asText.data.bodyText;\n\n            // Append the text part to the full text body\n            if (asText.data.isPlain) {\n              plainBodyTextStr = Breakscape.concatenate(plainBodyTextStr, bodyTextPart);\n            } else {\n              bodyTextStr = Breakscape.concatenate(bodyTextStr, bodyTextPart);\n            }\n            bodyStr = Breakscape.concatenate(bodyStr, bodyTextPart);\n          } else {\n            const placeholderKey = createPlaceholderKey(placeholderIndex);\n\n            // Append the placeholder to the full text body\n            bodyTextStr = Breakscape.concatenate(bodyTextStr, placeholderKey);\n\n            // Add the body bit to the body bits\n            bodyBits.push(bodyPart as BodyBitJson);\n\n            placeholderIndex++;\n          }\n        }\n      }\n\n      // Create the body text AST\n      const isBitmarkText = textFormat === TextFormat.bitmarkText;\n\n      const parsedBodyText: JsonText = isBitmarkText\n        ? textParser.toAst(bodyTextStr, {\n            //\n            format: textFormat,\n            location: TextLocation.body,\n          })\n        : Breakscape.unbreakscape(bodyTextStr, {\n            format: TextFormat.plainText,\n            location: TextLocation.body,\n          });\n\n      const parserPlainText: JsonText = Breakscape.unbreakscape(plainBodyTextStr, {\n        format: TextFormat.plainText,\n        location: TextLocation.body,\n      });\n\n      // Newlines will have been lost from the end of bodyTextStr, and start of plainBodyTextStr\n      // Count then and add them back when merging\n      const newlines =\n        StringUtils.countOccurrencesAtEnd(bodyTextStr, '\\n') +\n        StringUtils.countOccurrencesAtStart(plainBodyTextStr, '\\n');\n\n      finalBody = ContentProcessorUtils.concatenatePlainTextWithAstTexts(\n        parsedBodyText,\n        newlines,\n        parserPlainText,\n      );\n      finalBodyString = Breakscape.unbreakscape(bodyStr, {\n        format: textFormat,\n        location: TextLocation.body,\n      }).trim() as BreakscapedString;\n      const finalBodyIsAst = Array.isArray(finalBody);\n      const bodyAst = finalBodyIsAst ? (finalBody as TextAst) : undefined;\n\n      // Loop the body parts again to create the body bits:\n      // - The body bits are inserted into body AST, replacing the placeholders created by the text parser\n      if (bodyAst && validatedBodyParts) {\n        placeholderIndex = 0;\n        for (let i = 0; i < validatedBodyParts.length; i++) {\n          const bodyPart = validatedBodyParts[i];\n\n          // Skip text body parts as they are handled above\n          const isText = bodyPart.type === BodyBitType.text;\n          if (isText) continue;\n\n          const bodyBit = bodyPart as BodyBitJson;\n          let bodyBitJson: BodyBitJson | undefined;\n\n          switch (bodyPart.type) {\n            case BodyBitType.gap: {\n              // const gap = bodyBit as Gap;\n              // bodyBitJson = this.createGapJson(gap);\n              bodyBitJson = bodyBit as GapJson;\n              break;\n            }\n\n            case BodyBitType.mark: {\n              // const mark = bodyBit as Mark;\n              // bodyBitJson = this.createMarkJson(mark);\n              bodyBitJson = bodyBit as MarkJson;\n              break;\n            }\n\n            case BodyBitType.select: {\n              // const select = bodyBit as SelectJson;\n              // bodyBitJson = this.createSelectJson(select);\n              bodyBitJson = bodyBit as SelectJson;\n              break;\n            }\n\n            case BodyBitType.highlight: {\n              // const highlight = bodyBit as Highlight;\n              // bodyBitJson = this.createHighlightJson(highlight);\n              bodyBitJson = bodyBit as HighlightJson;\n              break;\n            }\n          }\n\n          // Add the gap to the placeholders\n          if (bodyBitJson) {\n            // Insert the body bit into the body AST\n            this.replacePlaceholderWithBodyBit(bodyAst, bodyBitJson, placeholderIndex);\n          }\n\n          placeholderIndex++;\n        }\n      }\n    } // Standard body\n\n    // Return the body in the target\n    return {\n      body: finalBody,\n      bodyBits: bodyBits.length > 0 ? bodyBits : undefined,\n      bodyString: finalBodyString,\n    };\n  }\n\n  public buildBodyText(bodyTextPart: BreakscapedString, isPlain: boolean): BodyText {\n    const bodyText: BodyText = {\n      type: BodyBitType.text,\n      data: {\n        bodyText: bodyTextPart,\n        isPlain,\n      },\n    };\n    return bodyText;\n  }\n\n  /**\n   * Walk the body AST to find the placeholder and replace it with the body bit.\n   *\n   * @param bodyAst the body AST\n   * @param bodyBitJson the body bit json to insert at the placeholder position\n   * @param index the index of the placeholder to replace\n   */\n  protected replacePlaceholderWithBodyBit(\n    bodyAst: TextAst,\n    bodyBitJson: BodyBitJson,\n    index: number,\n  ) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const walkRecursive = (node: any, parent: any, parentKey: any): boolean => {\n      if (Array.isArray(node)) {\n        // Walk the array of nodes\n        for (let i = 0; i < node.length; i++) {\n          const child = node[i];\n          const done = walkRecursive(child, node, i);\n          if (done) return true;\n        }\n      } else {\n        if (node.type === 'bit' && node.index === index) {\n          // Found the placeholder, replace it with the body bit\n          parent[parentKey] = bodyBitJson;\n          return true;\n        }\n        if (node.content) {\n          // Walk the child content\n          const done = walkRecursive(node.content, node, 'content');\n          if (done) return true;\n        }\n      }\n      return false;\n    };\n\n    walkRecursive(bodyAst, null, null);\n  }\n\n  /**\n   * Trim the body parts, removing any whitespace only parts at start and end of body\n   *\n   * @param parts the body parts to trim\n   * @returns the trimmed body parts\n   */\n  private trimBodyParts(parts: BodyPart[]): BodyPart[] {\n    // Trim start\n    let foundText = false;\n    let trimmedParts: BodyPart[] = parts.reduce((acc, part) => {\n      const text = part as BodyText;\n      if (!foundText && text.type === BodyBitType.text) {\n        const t = text.data.bodyText.trimStart() as BreakscapedString;\n        if (t) {\n          foundText = true;\n          text.data.bodyText = t;\n          acc.push(text);\n        }\n      } else {\n        // Not body text, so add it\n        foundText = true;\n        acc.push(part);\n      }\n      return acc;\n    }, [] as BodyPart[]);\n\n    // Trim end\n    foundText = false;\n    trimmedParts = trimmedParts.reduceRight((acc, part) => {\n      const text = part as BodyText;\n      if (!foundText && text.type === BodyBitType.text) {\n        const t = text.data.bodyText.trimEnd() as BreakscapedString;\n        if (t) {\n          foundText = true;\n          text.data.bodyText = t;\n          acc.unshift(text);\n        }\n      } else {\n        // Not body text, so add it\n        foundText = true;\n        acc.unshift(part);\n      }\n      return acc;\n    }, [] as BodyPart[]);\n\n    return trimmedParts;\n  }\n}\n\nconst instance = new BodyContentProcessor();\nexport { instance as BodyContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type CardBit, type ExtraProperties } from '../../../../model/ast/Nodes.ts';\nimport { type JsonText, type TextAst } from '../../../../model/ast/TextNodes.ts';\nimport { CardSetConfigKey } from '../../../../model/config/enum/CardSetConfigKey.ts';\nimport { BitType, type BitTypeType } from '../../../../model/enum/BitType.ts';\nimport { BodyBitType } from '../../../../model/enum/BodyBitType.ts';\nimport { ResourceType } from '../../../../model/enum/ResourceType.ts';\nimport { type TextFormatType } from '../../../../model/enum/TextFormat.ts';\nimport {\n  type BotResponseJson,\n  type ChoiceJson,\n  type DefinitionListItemJson,\n  type ExampleJson,\n  type FeedbackChoiceJson,\n  type FeedbackJson,\n  type FeedbackReasonJson,\n  type FlashcardJson,\n  type HeadingJson,\n  type IngredientJson,\n  type MatrixCellJson,\n  type MatrixJson,\n  type PairJson,\n  type PronunciationTableCellJson,\n  type PronunciationTableJson,\n  type QuestionJson,\n  type QuizJson,\n  type ResponseJson,\n  type StatementJson,\n  type TableCellJson,\n  type TableExtendedJson,\n  type TableRowJson,\n  type TextAndIconJson,\n} from '../../../../model/json/BitJson.ts';\nimport { type SelectJson } from '../../../../model/json/BodyBitJson.ts';\nimport {\n  type AudioResourceWrapperJson,\n  type ImageResourceWrapperJson,\n} from '../../../../model/json/ResourceJson.ts';\nimport { NumberUtils } from '../../../../utils/NumberUtils.ts';\nimport {\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type BitSpecificCards,\n  type ParsedCardSet,\n  type ProcessedCard,\n  type ProcessedCardSet,\n  type ProcessedCardSide,\n  type ProcessedCardVariant,\n} from '../BitmarkPegParserTypes.ts';\nimport { BitmarkPegParserValidator } from '../BitmarkPegParserValidator.ts';\n\ninterface HeadingData {\n  heading: HeadingJson;\n  isDefaultExampleCardSet: boolean;\n  exampleCardSet: ExampleJson | undefined;\n}\n\nfunction buildCards(\n  context: BitmarkPegParserContext,\n  bitType: BitTypeType,\n  textFormat: TextFormatType,\n  parsedCardSet: ParsedCardSet | undefined,\n  statementV1: Partial<StatementJson> | undefined,\n  statementsV1: Partial<StatementJson>[] | undefined,\n  choicesV1: Partial<ChoiceJson>[] | undefined,\n  responsesV1: Partial<ResponseJson>[] | undefined,\n): BitSpecificCards {\n  const { bitConfig } = context;\n\n  if (context.DEBUG_CARD_SET) context.debugPrint('card set', parsedCardSet);\n\n  let result: BitSpecificCards = {};\n\n  // Process the card contents\n  const processedCardSet = processCardSet(context, parsedCardSet);\n\n  // Parse the card contents according to the card set type\n\n  // Get the bit metadata to check how to parse the card set\n  const cardSetType = bitConfig.cardSet?.configKey;\n\n  switch (cardSetType) {\n    case CardSetConfigKey.flashcard:\n    case CardSetConfigKey.definitionList:\n      result = parseFlashcardOrDefinitionList(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.elements:\n      result = parseElements(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.statements:\n      result = parseStatements(context, bitType, processedCardSet, statementV1, statementsV1);\n      break;\n\n    case CardSetConfigKey.feedback:\n      result = parseFeedback(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.quiz:\n      result = parseQuiz(context, bitType, processedCardSet, choicesV1, responsesV1);\n      break;\n\n    case CardSetConfigKey.questions:\n      result = parseQuestions(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.matchPairs:\n      // ==> heading / pairs\n      result = parseMatchPairs(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.matchMatrix:\n      // ==> heading / matrix\n      result = parseMatchMatrix(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.pronunciationTable:\n      result = parsePronunciationTable(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.table:\n    case CardSetConfigKey.tableExtended:\n      // ==> heading / table\n      result = parseTable(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.botActionResponses:\n      result = parseBotActionResponses(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.ingredients:\n      result = parseIngredients(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.clozeList:\n    case CardSetConfigKey.exampleBitList:\n    case CardSetConfigKey.bookReferenceList:\n      result = parseCardBits(context, bitType, textFormat, processedCardSet);\n      break;\n\n    // DEPRECATED - REMOVE IN THE FUTURE\n    // case CardSetConfigKey._captionDefinitionsList:\n    //   // ==> captionDefinitionsList\n    //   result = parseCaptionDefinitionsList(context, bitType, processedCardSet);\n    //   break;\n\n    default:\n    // Return default empty object\n  }\n\n  // Add the internal comments\n  result.internalComments =\n    processedCardSet.internalComments.length > 0 ? processedCardSet.internalComments : undefined;\n\n  return result;\n}\n\nfunction processCardSet(\n  context: BitmarkPegParserContext,\n  parsedCardSet: ParsedCardSet | undefined,\n): ProcessedCardSet {\n  const processedCardSet: ProcessedCardSet = {\n    cards: [],\n    internalComments: [],\n  };\n\n  // Early return if no card set\n  if (!parsedCardSet) return processedCardSet;\n\n  const { bitType } = context;\n\n  // Process the card contents\n  let cardNo = 0;\n  let sideNo = 0;\n  let variantNo = 0;\n  for (const card of parsedCardSet.cards) {\n    const processedCard: ProcessedCard = {\n      no: cardNo++,\n      sides: [],\n      qualifier: card.qualifier,\n    };\n    processedCardSet.cards.push(processedCard);\n    for (const side of card.sides) {\n      const processedSide: ProcessedCardSide = {\n        no: sideNo++,\n        variants: [],\n        qualifier: side.qualifier,\n      };\n      processedCard.sides.push(processedSide);\n      for (const variant of side.variants) {\n        const { parser, content } = variant;\n        const processedVariant: ProcessedCardVariant = {\n          parser,\n          no: variantNo++,\n          qualifier: variant.qualifier,\n        } as ProcessedCardVariant;\n        processedSide.variants.push(processedVariant);\n\n        const tagsConfig = Config.getTagsConfigForCardSet(bitType, sideNo, variantNo);\n\n        const tags = context.bitContentProcessor(BitContentLevel.Card, tagsConfig, content);\n\n        if (context.DEBUG_CARD_TAGS) context.debugPrint('card tags', tags);\n\n        // Validate the cardBody\n        tags.cardBody = BitmarkPegParserValidator.checkCardBody(\n          context,\n          BitContentLevel.Card,\n          bitType,\n          tags.cardBody,\n          processedCard.no,\n          processedSide.no,\n          processedVariant.no,\n        );\n        // Reduce the card body parts to a breakscaped string\n        tags.cardBodyStr = tags.cardBody?.bodyString;\n\n        processedVariant.data = tags;\n\n        // Add any internal comments\n        if (tags.internalComments) processedCardSet.internalComments.push(...tags.internalComments);\n      }\n      variantNo = 0;\n    }\n    sideNo = 0;\n  }\n\n  return processedCardSet;\n}\n\nfunction parseFlashcardOrDefinitionList(\n  context: BitmarkPegParserContext,\n  bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const flashcards: Partial<FlashcardJson>[] = [];\n  const definitions: Partial<DefinitionListItemJson>[] = [];\n  let questionStr = '';\n  let question: Partial<TextAndIconJson> | undefined;\n  let answer: Partial<TextAndIconJson> | undefined;\n  let alternativeAnswers: Partial<TextAndIconJson>[] = [];\n  let variantIndex = 0;\n  let extraTags: BitContentProcessorResult = {};\n  let questionVariant: ProcessedCardVariant | undefined;\n  const onlyOneCardAllowed = bitType === BitType.flashcard1;\n\n  // Extract the heading card if it exists\n  const headingData = extractHeadingCard(cardSet);\n\n  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n    const card = cardSet.cards[cardIdx];\n\n    // Skip the headings card if it exists\n    if (headingData && cardIdx === 0) continue;\n\n    // Reset the question and answers\n    question = undefined;\n    answer = undefined;\n    alternativeAnswers = [];\n    variantIndex = 0;\n    extraTags = {};\n\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const { cardBody, resources, ...tags } = content.data;\n        extraTags = {\n          ...extraTags,\n          ...tags,\n        };\n        const icon =\n          resources && resources.length > 0\n            ? (resources[0] as ImageResourceWrapperJson)\n            : undefined;\n        const text = cardBody?.body as TextAst;\n        const str = cardBody?.bodyString ?? '';\n\n        if (variantIndex === 0) {\n          questionVariant = content;\n          questionStr = str;\n          question = {\n            text,\n            icon,\n          };\n        } else if (variantIndex === 1) {\n          answer = {\n            text,\n            icon,\n          };\n        } else {\n          alternativeAnswers.push({\n            text,\n            icon: icon,\n          });\n        }\n        variantIndex++;\n      }\n    }\n\n    // Add the flashcard\n    if (cardIdx === 0 || !onlyOneCardAllowed) {\n      if (Config.isOfBitType(bitType, [BitType.flashcard])) {\n        // .flashcard\n        // if (question) {\n        const fc: Partial<FlashcardJson> = {\n          question: question as TextAndIconJson,\n          answer: answer as TextAndIconJson,\n          alternativeAnswers: alternativeAnswers as TextAndIconJson[],\n          ...extraTags,\n        };\n        if (fc) flashcards.push(fc);\n        // } else {\n        //   context.addWarning('Ignoring card with empty question', questionVariant);\n        // }\n      } else {\n        // .definition-list, etc\n        const dl: Partial<DefinitionListItemJson> = {\n          term: question as TextAndIconJson,\n          definition: answer as TextAndIconJson,\n          alternativeDefinitions: alternativeAnswers as TextAndIconJson[],\n          ...extraTags,\n        };\n        if (dl) definitions.push(dl);\n      }\n    } else {\n      // Only one card allowed, add a warning and ignore the card\n      context.addWarning(\n        `Bit '${bitType}' should only contain one card. Ignore subsequent card: '${questionStr}'`,\n        questionVariant,\n      );\n      break;\n    }\n  }\n\n  return {\n    heading: headingData?.heading,\n    flashcards: flashcards.length > 0 ? flashcards : undefined,\n    definitions: definitions.length > 0 ? definitions : undefined,\n  };\n}\n\nfunction parseElements(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const elements: JsonText[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const tags = content.data;\n\n        // if (tags.cardBody) {\n        const element =\n          (tags.cardBody?.body as JsonText) ?? tags.cardBodyStr ?? Breakscape.EMPTY_STRING;\n        elements.push(element);\n        // } else {\n        //   context.addWarning('Ignoring card with empty element', content);\n        // }\n      }\n    }\n  }\n\n  return {\n    elements: elements.length > 0 ? elements : undefined,\n  };\n}\n\nfunction parseStatements(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n  statementV1: Partial<StatementJson> | undefined,\n  statementsV1: Partial<StatementJson>[] | undefined,\n): BitSpecificCards {\n  const statements: Partial<StatementJson>[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const { statements: chainedStatements, statement: _ignore, ...tags } = content.data;\n\n        // Re-build the statement, adding any tags that were not in the True/False chain\n        // These tags are actually not in the correct place, but we can still interpret them and fix the data.\n        // As .true-false only has one statement per card, we can just add the extra tags to the statement.\n        if (Array.isArray(chainedStatements)) {\n          for (const s of chainedStatements) {\n            // if (s.text) {\n            const statement: Partial<StatementJson> = {\n              statement: s.statement ?? [],\n              isCorrect: s.isCorrect,\n              item: s.item,\n              lead: s.lead,\n              hint: s.hint,\n              instruction: s.instruction,\n              example: s.example,\n              ...tags,\n            };\n            if (statement) statements.push(statement);\n            // } else {\n            //   context.addWarning('Ignoring card with empty statement', content);\n            // }\n          }\n        }\n      }\n    }\n  }\n\n  // Add the V1 statement to the end of the statements array to improve backwards compatibility\n  if (statementV1) {\n    statements.push(statementV1);\n  }\n\n  // Add the V1 statements to the end of the statements array to improve backwards compatibility\n  if (Array.isArray(statementsV1) && statementsV1.length > 0) {\n    statements.push(...statementsV1);\n  }\n\n  return {\n    statements: statements.length > 0 ? statements : undefined,\n  };\n}\n\nfunction parseFeedback(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  let feedback: Partial<FeedbackJson> | undefined;\n  const feedbacks: Partial<FeedbackJson>[] = [];\n\n  // Extract the heading card if it exists\n  const headingData = extractHeadingCard(cardSet);\n\n  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n    const card = cardSet.cards[cardIdx];\n\n    // Skip the headings card if it exists\n    if (headingData && cardIdx === 0) continue;\n\n    feedback = undefined;\n\n    for (let sideIdx = 0; sideIdx < card.sides.length; sideIdx++) {\n      const side = card.sides[sideIdx];\n\n      for (const content of side.variants) {\n        const tags = content.data;\n\n        const { cardBody, cardBodyStr, choices: choiceTags, ...restTags } = tags;\n\n        if (sideIdx === 0) {\n          // First side (feedback choices)\n\n          const choices: Partial<FeedbackChoiceJson>[] = [];\n\n          if (choiceTags && choiceTags.length > 0) {\n            for (const tf of choiceTags) {\n              const { __isDefaultExample, example, ...tfTags } = tf;\n\n              const choice: Partial<FeedbackChoiceJson> = {\n                choice: tfTags.choice,\n                requireReason: tfTags.isCorrect,\n                item: tfTags.item,\n                lead: tfTags.lead,\n                instruction: tfTags.instruction,\n                __isDefaultExample,\n                example,\n              };\n              choices.push(choice);\n            }\n          }\n\n          // if (tags.choices || tags.responses) {\n          feedback = {\n            ...tags,\n            choices: choices as FeedbackChoiceJson[],\n          };\n          if (feedback) feedbacks.push(feedback);\n        } else if (sideIdx === 1) {\n          // Second side (feedback reason)\n          const reason: Partial<FeedbackReasonJson> = {\n            text: cardBodyStr ?? '',\n            __textAst: cardBody?.body as TextAst,\n            ...restTags,\n          };\n          if (feedback) {\n            feedback.reason = reason as FeedbackReasonJson;\n          }\n        }\n      }\n    }\n  }\n\n  return {\n    heading: headingData?.heading,\n    feedbacks: feedbacks.length > 0 ? feedbacks : undefined,\n  };\n}\n\nfunction parseQuiz(\n  _context: BitmarkPegParserContext,\n  bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n  choicesV1: Partial<ChoiceJson>[] | undefined,\n  responsesV1: Partial<ResponseJson>[] | undefined,\n): BitSpecificCards {\n  const quizzes: Partial<QuizJson>[] = [];\n  const insertChoices = Config.isOfBitType(bitType, BitType.multipleChoice);\n  const insertResponses = Config.isOfBitType(bitType, BitType.multipleResponse);\n  if (!insertChoices && !insertResponses) return {};\n\n  let isDefaultExampleCard = false;\n  let exampleCard: ExampleJson | undefined;\n\n  for (const card of cardSet.cards) {\n    isDefaultExampleCard = false;\n    exampleCard = undefined;\n\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const { __isDefaultExample, example, ...tags } = content.data;\n\n        // Example\n        isDefaultExampleCard = __isDefaultExample === true ? true : isDefaultExampleCard;\n        exampleCard = example ? example : exampleCard;\n\n        // Insert choices / responses\n        if (tags.trueFalse && tags.trueFalse.length > 0) {\n          const responsesOrChoices: (Partial<ChoiceJson> | Partial<ResponseJson>)[] = [];\n\n          for (const tf of tags.trueFalse) {\n            const { __isDefaultExample: isDefaultExampleTf, example: exampleTf, ...tfTags } = tf;\n            const __isDefaultExample = isDefaultExampleTf || isDefaultExampleCard;\n            const example = exampleTf || exampleCard;\n\n            const response: Partial<ChoiceJson> & Partial<ResponseJson> = {\n              isCorrect: tfTags.isCorrect,\n              __isDefaultExample,\n              example,\n            };\n            if (insertResponses) response.response = tfTags.text;\n            else response.choice = tfTags.text;\n            if (response) responsesOrChoices.push(response);\n          }\n\n          if (insertResponses) tags.responses = responsesOrChoices as Partial<ResponseJson>[];\n          else tags.choices = responsesOrChoices as Partial<ChoiceJson>[];\n        }\n\n        // if (tags.choices || tags.responses) {\n        const quiz: Partial<QuizJson> = {\n          ...tags,\n          choices: tags.choices as ChoiceJson[],\n          responses: tags.responses as ResponseJson[],\n          __isDefaultExample: isDefaultExampleCard,\n          __defaultExample: exampleCard,\n        };\n        if (quiz) quizzes.push(quiz);\n        // } else {\n        //   context.addWarning('Ignoring card with empty quiz', content);\n        // }\n      }\n    }\n  }\n\n  // Add a quiz for the V1 choices / responses\n  if (insertChoices && Array.isArray(choicesV1) && choicesV1.length > 0) {\n    const quiz: Partial<QuizJson> = {\n      choices: choicesV1 as ChoiceJson[],\n    };\n    if (quiz) quizzes.push(quiz);\n  }\n  if (insertResponses && Array.isArray(responsesV1) && responsesV1.length > 0) {\n    const quiz: Partial<QuizJson> = {\n      responses: responsesV1 as ResponseJson[],\n    };\n    if (quiz) quizzes.push(quiz);\n  }\n\n  return {\n    quizzes: quizzes.length > 0 ? quizzes : undefined,\n  };\n}\n\nfunction parseQuestions(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const questions: Partial<QuestionJson>[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const tags = content.data;\n\n        // if (tags.cardBody) {\n        const q: Partial<QuestionJson> = {\n          question:\n            (tags.cardBody?.body as JsonText) ?? tags.cardBodyStr ?? Breakscape.EMPTY_STRING,\n          ...tags,\n        };\n        if (q) questions.push(q);\n        // }\n        // else {\n        //   context.addWarning('Ignoring card with empty body text', content);\n        // }\n      }\n    }\n  }\n\n  return {\n    questions: questions.length > 0 ? questions : undefined,\n  };\n}\n\nfunction parseMatchPairs(\n  _context: BitmarkPegParserContext,\n  bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const pairs: Partial<PairJson>[] = [];\n  let pairKey: string | undefined = undefined;\n  let pairValues: string[] = [];\n  let _pairValuesAst: TextAst[] = [];\n  let keyAudio: AudioResourceWrapperJson | undefined = undefined;\n  let keyImage: ImageResourceWrapperJson | undefined = undefined;\n  let extraTags: BitContentProcessorResult = {};\n  let isDefaultExampleCard = false;\n  let exampleCard: ExampleJson | undefined;\n  // let variant: ProcessedCardVariant | undefined;\n\n  // Extract the heading card if it exists\n  const headingValuesIsArray = Config.isOfBitType(bitType, BitType.matchMatrix);\n  const headingData = extractHeadingCard(cardSet, headingValuesIsArray);\n\n  const isDefaultExampleCardSet = headingData?.isDefaultExampleCardSet ?? false;\n  let exampleCardSet = headingData?.exampleCardSet;\n\n  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n    const card = cardSet.cards[cardIdx];\n\n    // Skip the headings card if it exists\n    if (headingData && cardIdx === 0) continue;\n\n    pairKey = undefined;\n    pairValues = [];\n    _pairValuesAst = [];\n    keyAudio = undefined;\n    keyImage = undefined;\n    extraTags = {};\n    isDefaultExampleCard = false;\n    exampleCard = undefined;\n\n    for (let sideIdx = 0; sideIdx < card.sides.length; sideIdx++) {\n      const side = card.sides[sideIdx];\n\n      for (const content of side.variants) {\n        // variant = content;\n        const { cardBody, cardBodyStr, resources, __isDefaultExample, example, ...tags } =\n          content.data;\n\n        // Example\n        isDefaultExampleCard = __isDefaultExample === true ? true : isDefaultExampleCard;\n        exampleCard = example ? (example as TextAst) : exampleCard;\n\n        if (sideIdx === 0) {\n          // First side\n          if (Array.isArray(resources) && resources.length > 0) {\n            // TODO - should search the correct resource type based on the bit type\n            const resource = resources[0];\n            // console.log('WARNING: Match card has resource on first side', tags.resource);\n            if (resource.type === ResourceType.audio) {\n              keyAudio = resource as AudioResourceWrapperJson;\n            } else if (resource.type === ResourceType.image) {\n              keyImage = resource as ImageResourceWrapperJson;\n            }\n          } else {\n            // If not a heading or resource, it is a pair\n            pairKey = cardBodyStr;\n          }\n        } else {\n          // Subsequent sides (pair)\n          const value = cardBodyStr ?? '';\n          const valueAst = cardBody?.body as TextAst;\n          pairValues.push(value);\n          _pairValuesAst.push(valueAst);\n          if ((isDefaultExampleCardSet || isDefaultExampleCard) && !exampleCard)\n            exampleCard = valueAst;\n\n          // Fix: https://github.com/getMoreBrain/cosmic/issues/5454\n          delete tags.item;\n          delete tags.lead;\n        }\n\n        // Extra tags\n        extraTags = {\n          ...extraTags,\n          ...tags,\n        };\n      }\n    }\n\n    // if (pairKey || keyAudio || keyImage) {\n    // Calculate final example and __isDefaultExample\n    if (isDefaultExampleCard) exampleCardSet = undefined;\n    const __isDefaultExample = isDefaultExampleCard || isDefaultExampleCardSet;\n    const example = exampleCard || exampleCardSet;\n\n    const pair: Partial<PairJson> = {\n      key: pairKey ?? '',\n      keyAudio,\n      keyImage,\n      values: pairValues,\n      __valuesAst: _pairValuesAst,\n      ...extraTags,\n      __isDefaultExample,\n      example,\n    };\n    if (pair) pairs.push(pair);\n    // } else {\n    //   context.addWarning('Ignoring card with empty body text', variant);\n    // }\n  }\n\n  return {\n    heading: headingData?.heading,\n    pairs: pairs.length > 0 ? pairs : undefined,\n  };\n}\n\nfunction parseMatchMatrix(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  let matrixKey: string | undefined = undefined;\n  let matrixKeyTags: BitContentProcessorResult | undefined = undefined;\n  const matrix: Partial<MatrixJson>[] = [];\n  let matrixCells: Partial<MatrixCellJson>[] = [];\n  let matrixCellValues: string[] = [];\n  let _matrixCellValuesAst: TextAst[] = [];\n  let matrixCellTags: BitContentProcessorResult = {};\n  let isDefaultExampleCard = false;\n  let exampleCard: ExampleJson | undefined;\n  let isDefaultExampleSide = false;\n  let exampleSide: ExampleJson | undefined;\n  let isCaseSensitiveMatrix: boolean | undefined;\n  let isCaseSensitiveCell: boolean | undefined;\n\n  // let keyAudio: AudioResource | undefined = undefined;\n  // let keyImage: ImageResource | undefined = undefined;\n  // let variant: ProcessedCardVariant | undefined;\n\n  // Extract the heading card if it exists\n  const headingData = extractHeadingCard(cardSet, true);\n\n  const isDefaultExampleCardSet = headingData?.isDefaultExampleCardSet ?? false;\n  let exampleCardSet = headingData?.exampleCardSet;\n\n  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n    const card = cardSet.cards[cardIdx];\n\n    // Skip the headings card if it exists\n    if (headingData && cardIdx === 0) continue;\n\n    matrixKey = undefined;\n    matrixKeyTags = undefined;\n    // keyAudio = undefined;\n    // keyImage = undefined;\n    matrixCells = [];\n    matrixCellValues = [];\n    _matrixCellValuesAst = [];\n    isDefaultExampleCard = false;\n    exampleCard = undefined;\n    isCaseSensitiveMatrix = undefined;\n\n    for (let sideIdx = 0; sideIdx < card.sides.length; sideIdx++) {\n      const side = card.sides[sideIdx];\n\n      matrixCellValues = [];\n      _matrixCellValuesAst = [];\n      matrixCellTags = {};\n      isDefaultExampleSide = false;\n      exampleSide = undefined;\n      isCaseSensitiveCell = undefined;\n\n      for (const content of side.variants) {\n        // variant = content;\n        const tags = content.data;\n\n        const { cardBody, cardBodyStr, __isDefaultExample, example, isCaseSensitive, ...restTags } =\n          tags;\n\n        // Example\n        isDefaultExampleSide = __isDefaultExample === true ? true : isDefaultExampleSide;\n        exampleSide = example ? example : exampleSide;\n\n        // Merge the tags into the matrix cell tags\n        Object.assign(matrixCellTags, restTags);\n\n        if (sideIdx === 0) {\n          // First side (matrix)\n          matrixKey = cardBodyStr;\n          matrixKeyTags = restTags;\n          isDefaultExampleCard = __isDefaultExample === true ? true : isDefaultExampleCard;\n          exampleCard = example ? example : exampleCard;\n          isCaseSensitiveMatrix = isCaseSensitive != null ? isCaseSensitive : isCaseSensitiveMatrix;\n        } else {\n          // Subsequent sides (matrix cell value)\n          const value = cardBodyStr ?? Breakscape.EMPTY_STRING;\n          const valueAst = cardBody?.body as TextAst;\n          matrixCellValues.push(value);\n          _matrixCellValuesAst.push(valueAst);\n          if ((isDefaultExampleCardSet || isDefaultExampleSide) && !exampleSide)\n            exampleSide = valueAst;\n          isCaseSensitiveCell = isCaseSensitive != null ? isCaseSensitive : isCaseSensitiveMatrix;\n        }\n      }\n\n      // Finished looping variants, create matrix cell\n      if (sideIdx > 0) {\n        // Calculate final example and __isDefaultExample\n        if (isDefaultExampleSide) exampleCard = exampleCardSet = undefined;\n        if (isDefaultExampleCard) exampleCardSet = undefined;\n        const __isDefaultExample =\n          isDefaultExampleSide || isDefaultExampleCard || isDefaultExampleCardSet;\n        const example = exampleSide || exampleCard || exampleCardSet;\n\n        const matrixCell: Partial<MatrixCellJson> = {\n          values: matrixCellValues,\n          __valuesAst: _matrixCellValuesAst,\n          ...matrixCellTags,\n          __isDefaultExample: __isDefaultExample,\n          example,\n          isCaseSensitive: isCaseSensitiveCell,\n        };\n        if (matrixCell) matrixCells.push(matrixCell);\n      }\n    }\n\n    // if (matrixKey) {\n    const m: Partial<MatrixJson> = {\n      key: matrixKey ?? Breakscape.EMPTY_STRING,\n      // item: matrixItem ?? Breakscape.EMPTY_STRING,\n      // keyAudio,\n      // keyImage,\n      cells: matrixCells as MatrixCellJson[],\n      ...matrixKeyTags,\n    };\n    if (m) matrix.push(m);\n    // } else {\n    //   context.addWarning('Ignoring card with empty body text', variant);\n    // }\n  }\n\n  return {\n    heading: headingData?.heading,\n    matrix: matrix.length > 0 ? matrix : undefined,\n  };\n}\n\nfunction parsePronunciationTable(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const rows: PronunciationTableCellJson[][] = [];\n  let rowValues: PronunciationTableCellJson[] = [];\n\n  for (const card of cardSet.cards) {\n    rowValues = [];\n\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        // variant = content;\n        const tags = content.data;\n\n        const { title, cardBody, resources } = tags;\n\n        const heading = title && title[1].titleAst;\n        const audio: AudioResourceWrapperJson = (\n          resources && resources.length > 0\n            ? resources.find((r) => r.type === ResourceType.audio)\n            : undefined\n        ) as AudioResourceWrapperJson;\n\n        const value: PronunciationTableCellJson = {\n          title: heading ?? [],\n          body: (cardBody?.body ?? []) as JsonText,\n          audio,\n        };\n        rowValues.push(value);\n      }\n    }\n\n    rows.push(rowValues);\n  }\n\n  const table: Partial<PronunciationTableJson> = {\n    data: rows,\n  };\n\n  return { pronunciationTable: table };\n}\n\nfunction parseTable(\n  context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  type TableSectionKey = 'header' | 'body' | 'footer';\n\n  const sectionRows: Record<TableSectionKey, TableRowJson[]> = {\n    header: [],\n    body: [],\n    footer: [],\n  };\n\n  const getNormalizedQualifier = (\n    rawQualifier: string | undefined,\n  ): TableSectionKey | undefined => {\n    if (!rawQualifier) return undefined;\n    const normalized = rawQualifier.trim().toLowerCase();\n    if (normalized === 'table-header') return 'header';\n    if (normalized === 'table-body') return 'body';\n    if (normalized === 'table-footer') return 'footer';\n\n    context.addWarning(`Unknown table section qualifier '${rawQualifier}', defaulting to body.`);\n    return undefined;\n  };\n\n  const isLegacyHeadingRow = (card: ProcessedCard, cardIndex: number): boolean => {\n    if (cardIndex !== 0) return false;\n    return card.sides.some((side) =>\n      side.variants.some((variant) => {\n        const titles = variant.data.title;\n        return Array.isArray(titles) && titles[1]?.titleAst;\n      }),\n    );\n  };\n\n  const readExtraProperty = (extra: ExtraProperties | undefined, key: string): unknown => {\n    if (!extra) return undefined;\n    const value = extra[key];\n    return Array.isArray(value) ? value[0] : value;\n  };\n\n  const cleanupExtraProperties = (tags: BitContentProcessorResult, keys: string[]) => {\n    const extra = tags.extraProperties;\n    if (!extra) return;\n\n    for (const key of keys) {\n      if (Object.prototype.hasOwnProperty.call(extra, key)) delete extra[key];\n    }\n\n    if (Object.keys(extra).length === 0) {\n      delete tags.extraProperties;\n    }\n  };\n\n  const normalizeCellType = (raw: unknown, section: TableSectionKey): 'th' | 'td' => {\n    if (typeof raw === 'string') {\n      const normalized = raw.trim().toLowerCase();\n      if (normalized === 'th' || normalized === 'td') {\n        return normalized;\n      }\n      context.addWarning(\n        `Invalid table cell type '${raw}', using default for section '${section}'.`,\n      );\n    }\n\n    return section === 'body' ? 'td' : 'th';\n  };\n\n  const normalizeSpan = (raw: unknown, kind: 'rowspan' | 'colspan'): number => {\n    if (raw == null) return 1;\n\n    const numeric = NumberUtils.asNumber(raw);\n    if (numeric == null || !Number.isInteger(numeric) || numeric < 1) {\n      context.addWarning(`Invalid table ${kind} '${raw}', defaulting to 1.`);\n      return 1;\n    }\n\n    return numeric;\n  };\n\n  const normalizeScope = (raw: unknown): TableCellJson['scope'] | undefined => {\n    if (raw == null) return undefined;\n\n    if (typeof raw !== 'string') {\n      context.addWarning(`Invalid table scope '${raw}', ignoring.`);\n      return undefined;\n    }\n\n    const normalized = raw.trim().toLowerCase();\n    switch (normalized) {\n      case 'row':\n      case 'col':\n      case 'rowgroup':\n      case 'colgroup':\n        return normalized;\n      default:\n        context.addWarning(`Invalid table scope '${raw}', ignoring.`);\n        return undefined;\n    }\n  };\n\n  const buildCell = (variant: ProcessedCardVariant, section: TableSectionKey): TableCellJson => {\n    const tags = variant.data;\n\n    const heading = tags.title && tags.title[1]?.titleAst;\n    const bodyContent =\n      (tags.cardBody?.body as JsonText | undefined) ?? tags.cardBodyStr ?? Breakscape.EMPTY_STRING;\n    const content: JsonText = heading ?? bodyContent;\n\n    const cellTypeRaw =\n      tags.tableCellType ?? readExtraProperty(tags.extraProperties, 'tableCellType');\n    const rowSpanRaw = tags.tableRowSpan ?? readExtraProperty(tags.extraProperties, 'tableRowSpan');\n    const colSpanRaw = tags.tableColSpan ?? readExtraProperty(tags.extraProperties, 'tableColSpan');\n    const scopeRaw = tags.tableScope ?? readExtraProperty(tags.extraProperties, 'tableScope');\n    const colWidthRaw =\n      tags.tableColWidth ?? readExtraProperty(tags.extraProperties, 'tableColWidth');\n\n    cleanupExtraProperties(tags, [\n      'tableCellType',\n      'tableRowSpan',\n      'tableColSpan',\n      'tableScope',\n      'tableColWidth',\n    ]);\n\n    const cellType = normalizeCellType(cellTypeRaw, section);\n    const rowspan = normalizeSpan(rowSpanRaw, 'rowspan');\n    const colspan = normalizeSpan(colSpanRaw, 'colspan');\n    const scope = normalizeScope(scopeRaw);\n    const colwidth = NumberUtils.asNumber(colWidthRaw) ?? 0;\n\n    const cell: TableCellJson = {\n      content,\n    };\n\n    if (cellType === 'th') cell.title = true;\n    if (rowspan > 1) cell.rowspan = rowspan;\n    if (colspan > 1) cell.colspan = colspan;\n    if (scope) cell.scope = scope;\n    if (colwidth > 0) cell.colwidth = colwidth;\n\n    return cell;\n  };\n\n  const resolveSectionQualifier = (card: ProcessedCard): TableSectionKey | undefined => {\n    const cardQualifier = getNormalizedQualifier(card.qualifier);\n    if (cardQualifier) return cardQualifier;\n\n    for (const side of card.sides) {\n      const sideQualifier = getNormalizedQualifier(side.qualifier);\n      if (sideQualifier) return sideQualifier;\n\n      for (const variant of side.variants) {\n        const variantQualifier = getNormalizedQualifier(variant.qualifier);\n        if (variantQualifier) return variantQualifier;\n      }\n    }\n\n    return undefined;\n  };\n\n  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n    const card = cardSet.cards[cardIdx];\n\n    const qualifier = resolveSectionQualifier(card);\n    const section: TableSectionKey = qualifier\n      ? qualifier\n      : isLegacyHeadingRow(card, cardIdx)\n        ? 'header'\n        : 'body';\n\n    const cells: TableCellJson[] = [];\n    for (const side of card.sides) {\n      for (const variant of side.variants) {\n        cells.push(buildCell(variant, section));\n      }\n    }\n\n    sectionRows[section].push({\n      cells,\n    });\n  }\n\n  const table: Partial<TableExtendedJson> = {};\n\n  const hasHeadRows = sectionRows.header.length > 0;\n  const hasBodyRows = sectionRows.body.length > 0;\n  const hasFootRows = sectionRows.footer.length > 0;\n\n  if (hasHeadRows) {\n    table.header = {\n      rows: sectionRows.header,\n    };\n  }\n\n  if (hasBodyRows) {\n    table.body = {\n      rows: sectionRows.body,\n    };\n  }\n\n  if (hasFootRows) {\n    table.footer = {\n      rows: sectionRows.footer,\n    };\n  }\n\n  if (!hasHeadRows && !hasBodyRows && !hasFootRows) {\n    table.header = { rows: [] };\n    table.body = { rows: [] };\n    table.footer = { rows: [] };\n  }\n\n  return { table };\n}\n\nfunction parseBotActionResponses(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const botResponses: Partial<BotResponseJson>[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const {\n          __instructionString,\n          __itemString,\n          reaction,\n          cardBodyStr: feedback,\n          ...tags\n        } = content.data;\n\n        const botResponse: Partial<BotResponseJson> = {\n          response: __instructionString ?? Breakscape.EMPTY_STRING,\n          reaction: reaction ?? Breakscape.EMPTY_STRING,\n          feedback: feedback ?? Breakscape.EMPTY_STRING,\n          ...tags,\n          item: __itemString ?? Breakscape.EMPTY_STRING,\n        };\n        if (botResponse) botResponses.push(botResponse);\n      }\n    }\n  }\n\n  return {\n    botResponses: botResponses.length > 0 ? botResponses : undefined,\n  };\n}\n\nfunction parseIngredients(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const ingredients: Partial<IngredientJson>[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const {\n          title: titleArray,\n          __instructionString,\n          unit,\n          unitAbbr,\n          decimalPlaces,\n          disableCalculation,\n          cardBodyStr,\n          cardBody,\n          ...tags\n        } = content.data;\n\n        // Extract 'title' from title array (if present)\n        // Extract 'quantity' from either then unchained instruction, or from the select (otherwise use 0)\n        // Extract checked from the select options (if present, otherwise checked is false))\n        const title =\n          Array.isArray(titleArray) && titleArray.length > 0\n            ? titleArray[titleArray.length - 1].titleString\n            : undefined;\n        let checked = false;\n        let quantity: number | undefined = NumberUtils.asNumber(__instructionString);\n        if (cardBody && cardBody.bodyBits) {\n          const select: SelectJson | undefined = cardBody.bodyBits.find(\n            (c) => c.type === BodyBitType.select,\n          ) as SelectJson | undefined;\n          if (select) {\n            quantity = select.__instructionString\n              ? NumberUtils.asNumber(select.__instructionString)\n              : quantity;\n            if (select.options && select.options.length > 0) {\n              checked = select.options[0].isCorrect;\n            }\n          }\n        }\n\n        const ingredient: Partial<IngredientJson> = {\n          title,\n          checked,\n          // TS compiler very weird. It doesn't recognize that cardBodyStr is a string|undefined, even if cast!\n          // Casting to 'any' to avoid the error\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          ingredient: cardBodyStr as any,\n          quantity,\n          unit: unit ?? Breakscape.EMPTY_STRING,\n          unitAbbr: unitAbbr ?? Breakscape.EMPTY_STRING,\n          decimalPlaces: decimalPlaces ?? 1,\n          disableCalculation: disableCalculation,\n          ...tags,\n        };\n        if (ingredient) ingredients.push(ingredient);\n      }\n    }\n  }\n\n  return {\n    ingredients: ingredients.length > 0 ? ingredients : undefined,\n  };\n}\n\n// DEPRECATED - REMOVE IN THE FUTURE\n// function parseCaptionDefinitionsList(\n//   _context: BitmarkPegParserContext,\n//   _bitType: BitTypeType,\n//   cardSet: ProcessedCardSet,\n// ): BitSpecificCards {\n//   let isHeading = false;\n//   const columns: string[] = [];\n//   const rows: string[][] = [];\n//   let rowValues: string[] = [];\n\n//   for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n//     const card = cardSet.cards[cardIdx];\n\n//     isHeading = false;\n//     rowValues = [];\n\n//     for (const side of card.sides) {\n//       for (const content of side.variants) {\n//         // variant = content;\n//         const tags = content.data;\n\n//         const { title, cardBodyStr } = tags;\n\n//         // Get the 'heading' which is the [#title] at level 1\n//         const heading = title && title[1].titleString;\n//         if (cardIdx === 0 && heading != null) isHeading = true;\n\n//         if (isHeading) {\n//           columns.push(heading ?? '');\n//         } else {\n//           // If not a heading, it is a row cell value\n//           const value = cardBodyStr ?? '';\n//           rowValues.push(value);\n//         }\n//       }\n//     }\n\n//     if (!isHeading) {\n//       rows.push(rowValues);\n//     }\n//   }\n\n//   const captionDefinitionList: Partial<CaptionDefinitionListJson> | undefined =\n//     columns.length > 0\n//       ? {\n//           heading: columns,\n//           definitions: rows\n//             .map((row) => {\n//               const col: Partial<CaptionDefinitionJson> = {\n//                 term: row[0],\n//                 definition: row[1],\n//               };\n//               return col as CaptionDefinitionJson;\n//             })\n//             .filter((d) => d != null),\n//         }\n//       : undefined;\n\n//   return { captionDefinitionList };\n// }\n\nfunction parseCardBits(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  _textFormat: TextFormatType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const cardBits: Partial<CardBit>[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const { cardBody: body, ...rest } = content.data;\n\n        const cardBit: Partial<CardBit> = {\n          body,\n          ...rest,\n        } as CardBit;\n        if (cardBit) cardBits.push(cardBit);\n      }\n    }\n  }\n\n  return {\n    cardBits: cardBits.length > 0 ? cardBits : undefined,\n  };\n}\n\nfunction extractHeadingCard(\n  cardSet: ProcessedCardSet,\n  valuesIsArray = false,\n): HeadingData | undefined {\n  let isHeading = false;\n  let heading: Partial<HeadingJson> | undefined;\n  let forKeys: string | undefined = undefined;\n  const forValues: string[] = [];\n  let isDefaultExampleCardSet = false;\n  let exampleCardSet: ExampleJson | undefined;\n\n  if (cardSet.cards.length === 0) return undefined;\n  const card = cardSet.cards[0];\n\n  for (let sideIdx = 0; sideIdx < card.sides.length; sideIdx++) {\n    const side = card.sides[sideIdx];\n\n    if (side.variants.length === 0) continue;\n\n    const content = side.variants[0];\n    const tags = content.data;\n\n    const { title, __isDefaultExample, example } = tags;\n\n    // Get the 'heading' which is the [#title] at level 1\n    const heading = title && title[1].titleString;\n    if (heading != null) isHeading = true;\n\n    if (sideIdx === 0) {\n      // 1st side\n\n      if (isHeading) {\n        forKeys = heading;\n        isDefaultExampleCardSet = __isDefaultExample === true ? true : isDefaultExampleCardSet;\n        exampleCardSet = example ? (example as TextAst) : exampleCardSet;\n      }\n    } /*if (sideIdx === 1)*/ else {\n      // 2nd side\n      if (isHeading) {\n        forValues.push(heading ?? '');\n        isDefaultExampleCardSet = __isDefaultExample === true ? true : isDefaultExampleCardSet;\n        exampleCardSet = example ? (example as TextAst) : exampleCardSet;\n      }\n    }\n  }\n\n  if (isHeading) {\n    let forValuesFinal: string | string[] = forValues;\n    if (valuesIsArray) {\n      // forValues is an array of values\n      forValuesFinal = forValues;\n    } else {\n      // Standard match, forValues is a single value\n      if (forValues.length >= 1) {\n        forValuesFinal = forValues[forValues.length - 1];\n      } else {\n        forValuesFinal = '';\n      }\n    }\n\n    heading = {\n      forKeys: forKeys ?? '',\n      forValues: forValuesFinal,\n    };\n  }\n\n  return heading\n    ? {\n        heading: heading as HeadingJson,\n        isDefaultExampleCardSet,\n        exampleCardSet,\n      }\n    : undefined;\n}\n\nexport { buildCards };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  TypeKey,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction defaultTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  _tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { type, value } = content as TypeValue;\n  const { textFormat } = context;\n  const textParser = new TextParser();\n\n  const trimmedStringValue = StringUtils.trimmedString(value) as BreakscapedString;\n\n  switch (type) {\n    case TypeKey.Instruction: {\n      target.instruction = textParser.toAst(trimmedStringValue, {\n        format: textFormat,\n        location: TextLocation.tag,\n      });\n      target.__instructionString = Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      });\n      break;\n    }\n\n    case TypeKey.Hint: {\n      target.hint = textParser.toAst(trimmedStringValue, {\n        format: textFormat,\n        location: TextLocation.tag,\n      });\n      target.__hintString = Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      });\n      break;\n    }\n\n    case TypeKey.Anchor: {\n      target.anchor = Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      });\n      break;\n    }\n\n    case TypeKey.Reference: {\n      target.reference = Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      });\n      break;\n    }\n\n    // 16.08.2023 Deprecated, but currently still supported\n    case TypeKey.SampleSolution: {\n      target.sampleSolution = Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      });\n      target.__sampleSolutionAst = textParser.toAst(trimmedStringValue, {\n        format: textFormat,\n        location: TextLocation.tag,\n      });\n      context.addWarning('[$...] tag is deprecated, use [@sampleSolution:...] instead', content);\n      break;\n    }\n\n    default:\n    // Unknown tag\n  }\n}\nexport { defaultTagContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type Footer } from '../../../../model/ast/Nodes.ts';\nimport { type JsonText } from '../../../../model/ast/TextNodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\nimport { BitmarkPegParserValidator } from '../BitmarkPegParserValidator.ts';\nimport { ContentProcessorUtils } from './ContentProcessorUtils.ts';\n\nexport interface FooterText {\n  footerText: BreakscapedString;\n  isPlain: boolean;\n}\n\nconst textParser = new TextParser();\n\nclass FooterContentProcessor {\n  public process(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    _tagsConfig: TagsConfig | undefined,\n    _target: BitContentProcessorResult,\n    footer: BreakscapedString,\n    footerPlainText: BreakscapedString,\n  ): Footer | undefined {\n    const { textFormat } = context;\n    let finalFooterText: JsonText | undefined;\n\n    footer = footer.trimStart() as BreakscapedString;\n    footerPlainText = footerPlainText.trimEnd() as BreakscapedString;\n\n    // Create the body text AST\n    const haveFooter = !!footer.trim();\n    const haveFooterPlainText = !!footerPlainText.trim();\n\n    // Newlines will be lost from the end of footer, and start of footerPlainText\n    // Count then and add them back when merging\n    let newLines = 0;\n    if (haveFooter && haveFooterPlainText) {\n      newLines =\n        StringUtils.countOccurrencesAtEnd(footer, '\\n') +\n        StringUtils.countOccurrencesAtStart(footerPlainText, '\\n');\n    }\n\n    if (footer || footerPlainText) {\n      const isBitmarkText = textFormat === TextFormat.bitmarkText;\n\n      if (footer) {\n        footer = BitmarkPegParserValidator.checkFooter(context, contentDepth, footer);\n      }\n\n      const parsedFooterText: JsonText = isBitmarkText\n        ? textParser.toAst(footer, {\n            //\n            format: textFormat,\n            location: TextLocation.body,\n          })\n        : Breakscape.unbreakscape(footer, {\n            format: TextFormat.plainText,\n            location: TextLocation.body,\n          });\n\n      const parsedFooterPlainText = Breakscape.unbreakscape(footerPlainText, {\n        format: TextFormat.plainText,\n        location: TextLocation.body,\n      });\n\n      finalFooterText = ContentProcessorUtils.concatenatePlainTextWithAstTexts(\n        parsedFooterText,\n        newLines,\n        parsedFooterPlainText,\n      );\n    }\n\n    // Return the footer in the target\n    return finalFooterText ? { footer: finalFooterText } : undefined;\n  }\n}\n\nconst instance = new FooterContentProcessor();\nexport { instance as FooterContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Config } from '../../../../config/Config.ts';\nimport { type BodyPart } from '../../../../model/ast/Nodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { BodyBitType } from '../../../../model/enum/BodyBitType.ts';\nimport { Tag } from '../../../../model/enum/Tag.ts';\nimport { type GapJson } from '../../../../model/json/BodyBitJson.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\nimport { clozeTagContentProcessor } from './ClozeTagContentProcessor.ts';\n\nfunction gapChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n  bodyParts: BodyPart[],\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    clozeTagContentProcessor(context, contentDepth, tagsConfig, content, target);\n  } else {\n    const gap: Partial<GapJson> | undefined = buildGap(context, contentDepth, tagsConfig, content);\n    if (gap) bodyParts.push(gap as BodyPart);\n  }\n}\n\nfunction buildGap(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n): Partial<GapJson> | undefined {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('gap content', content);\n\n  const gapConfig = Config.getTagConfigForTag(tagsConfig, Enum(Tag).fromValue(content.type));\n\n  const chainContent = [content, ...(content.chain ?? [])];\n\n  const chainTags = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    gapConfig?.chain,\n    chainContent,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('gap TAGS', chainTags);\n\n  const gap: Partial<GapJson> = {\n    type: BodyBitType.gap,\n    ...chainTags,\n  };\n\n  return gap;\n}\n\nexport { gapChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nconst textParser = new TextParser();\n\nfunction clozeTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  _tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  const { value } = content as TypeValue;\n\n  const solutions = target.solutions;\n  const solutionsAst = target.__solutionsAst;\n\n  if (!solutions || !solutionsAst) return;\n\n  if (StringUtils.isString(value)) {\n    const trimmedStringValue = StringUtils.trimmedString(value) as BreakscapedString;\n\n    solutions.push(\n      Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      }),\n    );\n\n    const solutionAst = textParser.toAst(trimmedStringValue, {\n      format: textFormat,\n      location: TextLocation.tag,\n    });\n    solutionsAst.push(solutionAst);\n  }\n}\nexport { clozeTagContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Config } from '../../../../config/Config.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { Tag } from '../../../../model/enum/Tag.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\nimport { itemLeadTagContentProcessor } from './ItemLeadTagContentProcessor.ts';\n\n/**\n * Recursively flatten nested chain content into a flat array.\n * Handles both flat chains (old config) and nested sub-chains (new config).\n */\nfunction flattenChainContent(content: BitContent): BitContent[] {\n  const result: BitContent[] = [content];\n  if (content.chain) {\n    for (const child of content.chain) {\n      result.push(...flattenChainContent(child));\n    }\n  }\n  return result;\n}\n\nfunction itemLeadChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    itemLeadTagContentProcessor(context, contentDepth, tagsConfig, content, target);\n  } else {\n    buildItemLead(context, contentDepth, tagsConfig, content, target);\n  }\n}\n\nfunction buildItemLead(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('item lead content', content);\n\n  // Process the chain (lead)\n  const itemLeadConfig = Config.getTagConfigForTag(tagsConfig, Enum(Tag).fromValue(content.type));\n  const chainContent = flattenChainContent(content);\n\n  const chainTags = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    itemLeadConfig?.chain,\n    chainContent,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('item lead TAGS', chainTags);\n\n  // Set the lead item from the chain\n  target.itemLead = chainTags.itemLead;\n  target.__itemLeadString = chainTags.__itemLeadString;\n}\n\nexport { itemLeadChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction itemLeadTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  _tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  const { value } = content as TypeValue;\n  const textParser = new TextParser();\n\n  const trimmedStringValue = StringUtils.trimmedString(value) as BreakscapedString;\n\n  if (!target.itemLead) target.itemLead = [];\n  const text = textParser.toAst(trimmedStringValue, {\n    format: textFormat,\n    location: TextLocation.tag,\n  });\n  target.itemLead.push(text);\n\n  if (!target.__itemLeadString) target.__itemLeadString = [];\n  target.__itemLeadString.push(\n    Breakscape.unbreakscape(trimmedStringValue, {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    }),\n  );\n}\nexport { itemLeadTagContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Config } from '../../../../config/Config.ts';\nimport { type BodyPart } from '../../../../model/ast/Nodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { BodyBitType } from '../../../../model/enum/BodyBitType.ts';\nimport { Tag } from '../../../../model/enum/Tag.ts';\nimport { type MarkJson } from '../../../../model/json/BodyBitJson.ts';\nimport { ArrayUtils } from '../../../../utils/ArrayUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\nimport { markTagContentProcessor } from './MarkTagContentProcessor.ts';\n\nfunction markChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n  bodyParts: BodyPart[],\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    markTagContentProcessor(context, BitContentLevel.Chain, content, target);\n  } else {\n    const mark: Partial<MarkJson> | undefined = buildMark(\n      context,\n      contentDepth,\n      tagsConfig,\n      content,\n    );\n    if (mark) bodyParts.push(mark as BodyPart);\n  }\n}\n\nfunction buildMark(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n): Partial<MarkJson> | undefined {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('mark content', content);\n\n  const markConfig = Config.getTagConfigForTag(tagsConfig, Enum(Tag).fromValue(content.type));\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, [content]);\n  const chainTags = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    markConfig?.chain,\n    content.chain,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('mark TAGS', chainTags);\n\n  const { solution } = tags;\n  const { mark: markType, ...rest } = chainTags;\n\n  const mark: Partial<MarkJson> = {\n    type: BodyBitType.mark,\n    solution: solution ?? '',\n    mark: ArrayUtils.asSingle(markType) ?? '',\n    ...rest,\n  };\n\n  return mark;\n}\n\nexport { markChainContentProcessor };\n","import { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction markTagContentProcessor(\n  _context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { value } = content as TypeValue;\n\n  if (StringUtils.isString(value)) {\n    target.solution = StringUtils.trimmedString(value) as BreakscapedString;\n  }\n}\nexport { markTagContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { ConfigKey, configKeyToPropertyType } from '../../../../model/config/enum/ConfigKey.ts';\nimport { PropertyTagConfig } from '../../../../model/config/PropertyTagConfig.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { PropertyKey } from '../../../../model/enum/PropertyKey.ts';\nimport { TagFormat } from '../../../../model/enum/TagFormat.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { BooleanUtils } from '../../../../utils/BooleanUtils.ts';\nimport { NumberUtils } from '../../../../utils/NumberUtils.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n} from '../BitmarkPegParserTypes.ts';\nimport { bookChainContentProcessor } from './BookChainContentProcessor.ts';\nimport { exampleTagContentProcessor } from './ExampleTagContentProcessor.ts';\nimport { groupTagChainContentProcessor } from './GroupTagChainContentProcessor.ts';\nimport { imageSourceChainContentProcessor } from './ImageSourceChainContentProcessor.ts';\nimport { commentTagContentProcessor as internalCommentTagContentProcessor } from './InternalCommentTagContentProcessor.ts';\nimport { markConfigChainContentProcessor } from './MarkConfigChainContentProcessor.ts';\nimport { personChainContentProcessor } from './PersonChainContentProcessor.ts';\nimport { ratingLevelChainContentProcessor } from './RatingLevelChainContentProcessor.ts';\nimport { servingsChainContentProcessor } from './ServingsChainContentProcessor.ts';\nimport { technicalTermChainContentProcessor } from './TechnicalTermChainContentProcessor.ts';\n\nconst textParser = new TextParser();\n\nfunction propertyContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { value } = content as TypeKeyValue;\n  const { key: keyIn } = content as TypeKeyValue;\n  const isChain = contentDepth === BitContentLevel.Chain;\n\n  // Get the property config for the tag (if it exists)\n  const propertyConfig = Config.getTagConfigForTag(tagsConfig, Enum(PropertyKey).fromValue(keyIn));\n  const configKey = propertyConfig ? propertyConfig.configKey : undefined;\n  let property = configKeyToPropertyType(keyIn);\n\n  // Handle internal comments\n  if (configKey === ConfigKey.property_internalComment) {\n    internalCommentTagContentProcessor(context, contentDepth, content, target);\n    return;\n  }\n\n  // Check for chains\n  // Generally, the chain will only be present in the correct bit as the data was already validated. The bit type\n  // should also be checked here if the property may occur in another bit with a different meaning.\n  if (propertyConfig) {\n    if (configKey === ConfigKey.property_example) {\n      exampleTagContentProcessor(context, contentDepth, content, target);\n      return;\n    } else if (configKey === ConfigKey.property_groupTag) {\n      groupTagChainContentProcessor(context, contentDepth, propertyConfig.chain, content, target);\n      return;\n    } else if (\n      configKey === ConfigKey.property_ratingLevelStart ||\n      configKey === ConfigKey.property_ratingLevelEnd\n    ) {\n      ratingLevelChainContentProcessor(\n        context,\n        contentDepth,\n        propertyConfig.chain,\n        content,\n        target,\n      );\n      return;\n    } else if (configKey === ConfigKey.property_technicalTerm) {\n      technicalTermChainContentProcessor(\n        context,\n        contentDepth,\n        propertyConfig.chain,\n        content,\n        target,\n      );\n      return;\n    } else if (configKey === ConfigKey.property_servings) {\n      servingsChainContentProcessor(context, contentDepth, propertyConfig.chain, content, target);\n      return;\n    } else if (\n      configKey === ConfigKey.property_person ||\n      configKey === ConfigKey.property_partner\n    ) {\n      personChainContentProcessor(context, contentDepth, propertyConfig.chain, content, target);\n      return;\n    } else if (configKey === ConfigKey.property_imageSource) {\n      imageSourceChainContentProcessor(context, contentDepth, tagsConfig, content, target);\n      return;\n    } else if (configKey === ConfigKey.property_book) {\n      bookChainContentProcessor(context, contentDepth, propertyConfig.chain, content, target);\n      return;\n    } else if (configKey === ConfigKey.property_mark && !isChain) {\n      markConfigChainContentProcessor(context, contentDepth, tagsConfig, content, target);\n      return;\n    } else if (configKey === ConfigKey.property_title && isChain) {\n      // Hack the intermediate tag so as not to clash with [#title] tags which are not chained (yet)\n      property = 'propertyTitle';\n    }\n  }\n\n  // Helper for building the properties\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const addProperty = (obj: any, tag: string, v: unknown, c: PropertyTagConfig | undefined) => {\n    // if (key === 'progress') debugger;\n\n    // Convert property as needed\n    const processValue = (v: unknown) => {\n      if (v == null) return undefined;\n\n      if (c) {\n        switch (c.format) {\n          // case PropertyFormat.string:\n          //   return StringUtils.isString(v) ? StringUtils.string(v) : undefined;\n\n          case TagFormat.plainText:\n            return Breakscape.unbreakscape(\n              StringUtils.isString(v)\n                ? (StringUtils.trimmedString(v) as BreakscapedString)\n                : undefined,\n              {\n                format: TextFormat.plainText,\n                location: TextLocation.tag,\n              },\n            );\n\n          case TagFormat.number:\n            return NumberUtils.asNumber(\n              Breakscape.unbreakscape(v as BreakscapedString, {\n                format: TextFormat.plainText,\n                location: TextLocation.tag,\n              }),\n            );\n\n          case TagFormat.boolean:\n            return BooleanUtils.toBoolean(\n              Breakscape.unbreakscape(v as BreakscapedString, {\n                format: TextFormat.plainText,\n                location: TextLocation.tag,\n              }),\n              true,\n            );\n\n          case TagFormat.invertedBoolean:\n            return !BooleanUtils.toBoolean(\n              Breakscape.unbreakscape(v as BreakscapedString, {\n                format: TextFormat.plainText,\n                location: TextLocation.tag,\n              }),\n              true,\n            );\n\n          case TagFormat.bitmarkText:\n            v = StringUtils.isString(v) ? v : '';\n            return textParser.toAst(v as BreakscapedString, {\n              format: TextFormat.bitmarkText,\n              location: TextLocation.tag,\n            });\n        }\n      }\n      return Breakscape.unbreakscape(v as BreakscapedString, {\n        format: TextFormat.plainText,\n        location: TextLocation.tag,\n      });\n    };\n\n    // Convert property and key as needed\n    v = processValue(v);\n\n    if (c == null || c.array) {\n      if (Object.prototype.hasOwnProperty.call(obj, tag)) {\n        const originalValue = obj[tag];\n        obj[tag] = [...originalValue, v];\n      } else {\n        obj[tag] = [v];\n      }\n    } else {\n      obj[tag] = v;\n    }\n  };\n\n  if (propertyConfig) {\n    // Known property in correct position\n    addProperty(target, property, value, propertyConfig);\n  } else {\n    // Unknown (extra) property\n    addProperty(target.extraProperties, property, value, propertyConfig);\n  }\n\n  // HACKS: Need to allow properties for different bits and in chains to have different/multiple formats!\n  // This is not currently supported by the config system; it would need to be extended to support this.\n  // That is a big job, so instead there are just some hacks here for the few cases where it is currently needed :(\n  if (configKey === ConfigKey.property_sampleSolution) {\n    addProperty(\n      target,\n      '__sampleSolutionAst',\n      value,\n      new PropertyTagConfig({\n        configKey: ConfigKey.property_sampleSolution,\n        tag: 'sampleSolution',\n        maxCount: 1,\n        minCount: 1,\n        chain: undefined,\n        jsonKey: undefined,\n        format: TagFormat.bitmarkText,\n        values: undefined,\n        defaultValue: undefined,\n        deprecated: undefined,\n      }),\n    );\n  }\n}\n\nexport { propertyContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { ConfigKey } from '../../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { Count } from '../../../../model/enum/Count.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction bookChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    // Do nothing\n  } else {\n    buildBook(context, contentDepth, tagsConfig, content, target);\n  }\n}\n\nfunction buildBook(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { bitConfig } = context;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('book content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('book TAGS', tags);\n\n  const { reference, referenceEnd } = tags;\n\n  // Extract the book from the content tag\n  const book = Breakscape.unbreakscape(\n    StringUtils.trimmedString(content.value) as BreakscapedString,\n    {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    },\n  );\n\n  // Get the config for the bit\n  const bookConfig = bitConfig.tags[ConfigKey.property_book];\n  if (bookConfig && (bookConfig.maxCount === Count.infinity || bookConfig.maxCount > 1)) {\n    // Add the book to the list of books\n    if (!Array.isArray(target.book)) target.book = [];\n    target.book.push({\n      book,\n      reference: reference ?? '',\n      referenceEnd: (referenceEnd ?? undefined) as string,\n    });\n    return;\n  }\n\n  // Book should be added at the body level\n  target.book = book;\n  target.reference = reference;\n  target.referenceEnd = referenceEnd;\n}\n\nexport { bookChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { BitType } from '../../../../model/enum/BitType.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { BooleanUtils } from '../../../../utils/BooleanUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TrueFalseValue,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\n// const builder = new Builder();\nconst textParser = new TextParser();\n\nfunction exampleTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { bitType } = context;\n  const { value } = content as TypeValue;\n  const example = value as BreakscapedString | boolean;\n\n  // Each bit type handles example tags differently\n  if (\n    Config.isOfBitType(bitType, [\n      BitType.cloze,\n      BitType.clozeAndMultipleChoiceText,\n      BitType.multipleChoiceText,\n      BitType.highlightText,\n      BitType.trueFalse,\n      BitType.trueFalse1,\n      BitType.multipleResponse,\n      BitType.multipleResponse1,\n      BitType.multipleChoice,\n      BitType.multipleChoice1,\n    ])\n  ) {\n    //\n    handleGapOrSelectOrTrueFalseExample(context, content, example, target);\n    //\n  } else if (Config.isOfBitType(bitType, BitType.mark)) {\n    // Default only example handling\n    handleDefaultOnlyExample(context, content, example, target);\n    //\n  } else {\n    // Standard example handling\n    handleStandardStringExample(context, content, example, target);\n    //\n  }\n}\n\nfunction handleGapOrSelectOrTrueFalseExample(\n  context: BitmarkPegParserContext,\n  content: BitContent,\n  example: BreakscapedString | boolean,\n  target: BitContentProcessorResult,\n): void {\n  const { bitType, textFormat } = context;\n  let trueFalse: TrueFalseValue | undefined;\n\n  if (Array.isArray(target.trueFalse) && target.trueFalse.length > 0) {\n    trueFalse = target.trueFalse[target.trueFalse.length - 1] ?? undefined;\n  }\n\n  if (trueFalse) {\n    // Example is set on the true/false tag [+...] / [-...]\n    if (example === true) {\n      trueFalse.__isDefaultExample = true;\n      trueFalse.example = !!trueFalse.isCorrect;\n    } else {\n      if (BooleanUtils.isBooleanString(example)) {\n        trueFalse.example = BooleanUtils.toBoolean(example);\n      } else {\n        // Example is set to a value other than true / false which is not valid in the case of select\n        trueFalse.__isDefaultExample = true;\n        trueFalse.example = undefined;\n        context.addWarning(\n          `Only 'true' / 'false' / default are allowed here, using default`,\n          content,\n        );\n      }\n    }\n  } else if (Array.isArray(target.__solutionsAst) && target.__solutionsAst.length > 0) {\n    // Example is set on the gap solution tag [_...]\n    if (example === true) {\n      // Extract the solution nearest [@example] tag as the example value\n      target.example = target.__solutionsAst[target.__solutionsAst.length - 1] ?? undefined;\n    } else {\n      target.example = example\n        ? textParser.toAst(example, {\n            format: textFormat,\n            location: TextLocation.tag,\n          })\n        : undefined;\n    }\n  } else {\n    // Example is higher up the chain, so how it is handled depends on the bit type\n    if (\n      Config.isOfBitType(bitType, [\n        BitType.multipleChoiceText,\n        BitType.highlightText,\n        BitType.trueFalse,\n        BitType.trueFalse1,\n        BitType.multipleResponse,\n        BitType.multipleResponse1,\n      ])\n    ) {\n      // Treat as a standard boolean\n      handleStandardBooleanExample(context, content, example, target);\n      //\n    } else if (\n      Config.isOfBitType(bitType, [\n        BitType.clozeAndMultipleChoiceText,\n        BitType.multipleChoice,\n        BitType.multipleChoice1,\n      ])\n    ) {\n      // For these bits, a specific example value higher up the chain makes no sense\n      // Set example to default, and raise a warning if any value is set.\n      target.__isDefaultExample = true;\n      target.example = undefined;\n\n      if (example !== true) {\n        // Example is set to a value other than true / false which is not valid in the case of select\n        context.addWarning(\n          `At this level, only default [@example] is allowed, using default`,\n          content,\n        );\n      }\n      //\n    } else {\n      // Treat as a standard string\n      handleStandardStringExample(context, content, example, target);\n      //\n    }\n  }\n}\n\nfunction handleDefaultOnlyExample(\n  context: BitmarkPegParserContext,\n  content: BitContent,\n  example: string | boolean,\n  target: BitContentProcessorResult,\n): void {\n  // This bit can have only default examples - nothing else makes sense\n  target.__isDefaultExample = true;\n  target.example = undefined;\n\n  if (example !== true) {\n    // Example is set to a value other than true / false which is not valid in the case of select\n    context.addWarning(`Only default [@example] is allowed, using default`, content);\n  }\n}\n\nfunction handleStandardBooleanExample(\n  context: BitmarkPegParserContext,\n  content: BitContent,\n  example: BreakscapedString | boolean,\n  target: BitContentProcessorResult,\n): void {\n  if (example === true) {\n    target.__isDefaultExample = true;\n    target.example = undefined;\n  } else {\n    const exampleStr = example\n      ? Breakscape.unbreakscape(example, {\n          format: TextFormat.bitmarkText,\n          location: TextLocation.tag,\n        })\n      : undefined;\n    if (BooleanUtils.isBooleanString(exampleStr)) {\n      target.example = BooleanUtils.toBoolean(exampleStr);\n    } else {\n      // Example is set to a value other than true / false which is not valid in the case of select\n      target.__isDefaultExample = true;\n      target.example = undefined;\n      context.addWarning(\n        `Only 'true' / 'false' / default are allowed here, using default`,\n        content,\n      );\n    }\n  }\n}\n\nfunction handleStandardStringExample(\n  context: BitmarkPegParserContext,\n  _content: BitContent,\n  example: BreakscapedString | boolean,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  if (example === true || example === 'true') {\n    target.__isDefaultExample = true;\n    target.example = undefined;\n  } else {\n    target.example = example\n      ? textParser.toAst(example, { format: textFormat, location: TextLocation.tag })\n      : undefined;\n  }\n}\n\nexport { exampleTagContentProcessor };\n","import { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { type GroupTagJson } from '../../../../model/json/BitJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n} from '../BitmarkPegParserTypes.ts';\n\n// const textParser = new TextParser();\n\nfunction groupTagChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  // const { textFormat } = context;\n  const { value } = content as TypeKeyValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('groupTag content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('groupTag TAGS', tags);\n\n  const { tag } = tags;\n\n  // Extract the technicalTerm from the content tag\n  const name = StringUtils.trimmedString(value) ?? '';\n\n  const node: Partial<GroupTagJson> = {\n    name,\n    tags: tag ?? [],\n  };\n\n  if (!Array.isArray(target.groupTag)) target.groupTag = [];\n  target.groupTag.push(node);\n}\n\nexport { groupTagChainContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { ConfigKey } from '../../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { type ImageSourceJson } from '../../../../model/json/BitJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction imageSourceChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    imageSourceTagContentProcessor(context, contentDepth, tagsConfig, content, target);\n  } else {\n    buildImageSource(context, contentDepth, tagsConfig, content, target);\n  }\n}\n\nfunction imageSourceTagContentProcessor(\n  _context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  _tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { value } = content as TypeValue;\n\n  // Extract the url from the content tag\n  const url = Breakscape.unbreakscape(StringUtils.trimmedString(value) as BreakscapedString, {\n    format: TextFormat.bitmarkText,\n    location: TextLocation.tag,\n  });\n\n  target.imageSourceUrl = url;\n}\n\nfunction buildImageSource(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('imageSource content', content);\n\n  const { key: tag } = content as TypeKeyValue;\n  const imageSourceConfig = Config.getTagConfigForTag(tagsConfig, Enum(ConfigKey).fromValue(tag));\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, [content]);\n  const chainTags = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    imageSourceConfig?.chain,\n    content.chain,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('imageSource TAGS', chainTags);\n\n  const { imageSourceUrl: url } = tags;\n  const { mockupId, ...rest } = chainTags;\n\n  if (!url) {\n    context.addWarning('[@imageSource] is missing the image url', content);\n  }\n  if (!mockupId) {\n    context.addWarning('[@mockupId:xxx] is missing from [@imageSource]', content);\n  }\n\n  const imageSource: Partial<ImageSourceJson> = {\n    url: url ?? '',\n    mockupId: mockupId ?? '',\n    ...rest,\n  };\n\n  target.imageSource = imageSource;\n}\n\nexport { imageSourceChainContentProcessor };\n","import { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction commentTagContentProcessor(\n  _context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (!target.internalComments) return;\n\n  const { value } = content as TypeValue;\n\n  const internalComment: BreakscapedString | undefined = StringUtils.isString(value)\n    ? (StringUtils.trimmedString(value) as BreakscapedString)\n    : undefined;\n  if (!internalComment) return;\n\n  target.internalComments.push(internalComment);\n}\nexport { commentTagContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { ConfigKey } from '../../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { type MarkConfigJson } from '../../../../model/json/BitJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction markConfigChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { key: tag } = content as TypeKeyValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('mark content', content);\n\n  const markConfig = target.markConfig;\n\n  if (!markConfig) return;\n\n  const markTagConfig = Config.getTagConfigForTag(tagsConfig, Enum(ConfigKey).fromValue(tag));\n\n  const { mark: _ignoreMark, ...tags } = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    markTagConfig?.chain,\n    content.chain,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('mark TAGS', tags);\n\n  // Extract the name from the content tag\n  const mark: string = Breakscape.unbreakscape(\n    (StringUtils.trimmedString(content.value) ?? 'unknown') as BreakscapedString,\n    {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    },\n  );\n\n  const config: Partial<MarkConfigJson> = {\n    mark,\n    emphasis: 'underline' as string,\n    ...tags,\n  };\n\n  if (config) markConfig.push(config);\n}\n\nexport { markConfigChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { ResourceType } from '../../../../model/enum/ResourceType.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { type PersonJson } from '../../../../model/json/BitJson.ts';\nimport {\n  type ImageResourceWrapperJson,\n  type ResourceJson,\n} from '../../../../model/json/ResourceJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction personChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  // const { value } = content as TypeValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('person content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('person TAGS', tags);\n\n  const { propertyTitle, resources } = tags;\n\n  // Extract the name from the content tag\n  const name = Breakscape.unbreakscape(\n    StringUtils.trimmedString(content.value) as BreakscapedString,\n    {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    },\n  );\n\n  // Extract the title from the propertyTitle tag\n  const title = StringUtils.trimmedString(propertyTitle);\n\n  // Extract avatarImage from the resources\n  const avatarImage = extractAvatarImage(context, resources);\n\n  const person: Partial<PersonJson> = {\n    name,\n    title,\n    avatarImage,\n  };\n\n  target.person = person;\n}\n\nfunction extractAvatarImage(\n  context: BitmarkPegParserContext,\n  resources: ResourceJson[] | undefined,\n): ImageResourceWrapperJson | undefined {\n  // Extract avatarImage from the resources\n  // Return the actual resource, and add all other resources to excess resources\n  let avatarImage: ImageResourceWrapperJson | undefined;\n  const excessResources: ResourceJson[] = [];\n\n  if (resources) {\n    for (const r of resources.reverse()) {\n      if (!avatarImage && ResourceType.image === r.type) {\n        avatarImage = r;\n      } else {\n        excessResources.push(r);\n      }\n    }\n  }\n\n  if (excessResources.length > 0) {\n    // Add an warning to warn about the excess resources\n    context.addWarning(\n      `${excessResources.length} excess resource(s) present in the [@person] chain.`,\n    );\n  }\n\n  return avatarImage;\n}\n\nexport { personChainContentProcessor };\n","import { ConfigKey } from '../../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { type RatingLevelStartEndJson } from '../../../../model/json/BitJson.ts';\nimport { NumberUtils } from '../../../../utils/NumberUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n} from '../BitmarkPegParserTypes.ts';\n\nconst textParser = new TextParser();\n\nfunction ratingLevelChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  const { key, value } = content as TypeKeyValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('ratingLevel content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('ratingLevel TAGS', tags);\n\n  const { label } = tags;\n\n  // Extract the technicalTerm from the content tag\n  const level = NumberUtils.asNumber(value) ?? 0;\n\n  const node: Partial<RatingLevelStartEndJson> = {\n    level,\n    label: label\n      ? textParser.toAst(label, { format: textFormat, location: TextLocation.tag })\n      : undefined,\n  };\n\n  switch (key) {\n    case ConfigKey.property_ratingLevelStart:\n      target.ratingLevelStart = node;\n\n      break;\n    case ConfigKey.property_ratingLevelEnd:\n      target.ratingLevelEnd = node;\n\n      break;\n    default:\n    // Do nothing\n  }\n}\n\nexport { ratingLevelChainContentProcessor };\n","import { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { type ServingsJson } from '../../../../model/json/BitJson.ts';\nimport { NumberUtils } from '../../../../utils/NumberUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction servingsChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  // const { value } = content as TypeValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('servings content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('servings TAGS', tags);\n\n  const { unit, unitAbbr, decimalPlaces, disableCalculation, __hintString } = tags;\n\n  // Extract the servings from the content tag\n  const servings = NumberUtils.asNumber(content.value) ?? 1;\n\n  const node: Partial<ServingsJson> = {\n    servings,\n    unit,\n    unitAbbr,\n    decimalPlaces: decimalPlaces ?? 1,\n    disableCalculation,\n    hint: __hintString,\n  };\n\n  target.servings = node;\n}\n\nexport { servingsChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { type TechnicalTermJson } from '../../../../model/json/BitJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction technicalTermChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  // const { value } = content as TypeValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('technicalTerm content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('technicalTerm TAGS', tags);\n\n  const { lang } = tags;\n\n  // Extract the technicalTerm from the content tag\n  const technicalTerm = Breakscape.unbreakscape(\n    StringUtils.trimmedString(content.value) as BreakscapedString,\n    {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    },\n  );\n\n  const node: Partial<TechnicalTermJson> = {\n    technicalTerm,\n    lang,\n  };\n\n  target.technicalTerm = node;\n}\n\nexport { technicalTermChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction referenceTagContentProcessor(\n  _context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  _tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n  isReferenceEnd: boolean,\n): void {\n  const { value } = content as TypeValue;\n\n  const trimmedStringValue = StringUtils.trimmedString(value) as BreakscapedString;\n\n  if (isReferenceEnd) {\n    target.referenceEnd = Breakscape.unbreakscape(trimmedStringValue, {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    });\n  } else {\n    target.reference = Breakscape.unbreakscape(trimmedStringValue, {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    });\n  }\n}\nexport { referenceTagContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { ResourceBuilder } from '../../../../ast/ResourceBuilder.ts';\nimport { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { ConfigKey, type ConfigKeyType } from '../../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { Count } from '../../../../model/enum/Count.ts';\nimport { ResourceType } from '../../../../model/enum/ResourceType.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport {\n  type ImageResourceJson,\n  type ImageResourceWrapperJson,\n  type ResourceJson,\n} from '../../../../model/json/ResourceJson.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n} from '../BitmarkPegParserTypes.ts';\n\n// const builder = new Builder();\nconst resourceBuilder = new ResourceBuilder();\n\n/**\n * Get the valid resource from all the resources on the bit, and add the invalid ones to\n * excess resources\n *\n * @param resourceTypeAttachment the resource type specified in the bit header\n * @param resources the resources on the bit\n */\nfunction buildResources(\n  context: BitmarkPegParserContext,\n  resourceTypeAttachment: string | undefined,\n  resources: ResourceJson[] | undefined,\n): ResourceJson[] | undefined {\n  const { bitType } = context;\n  const filteredResources: ResourceJson[] = [];\n  const excessResources: ResourceJson[] = [];\n\n  const validatedResourceTypeAttachemnt = Enum(ResourceType).fromValue(resourceTypeAttachment);\n\n  // Get the bit configuration for the bit\n  const resourcesConfig = Config.getBitResourcesConfig(bitType, validatedResourceTypeAttachemnt);\n  const resourceAttachmentAllowed = resourcesConfig.resourceAttachmentAllowed;\n  const countsMin = resourcesConfig.getCountsMin(); // Returns a copy, so it can be modified\n  const countsMax = resourcesConfig.getCountsMax(); // Returns a copy, so it can be modified\n\n  // Find the excess resources and ensure we have the minimum resources\n  if (resources) {\n    for (const r of resources.reverse()) {\n      const configKey = r.__configKey;\n      let countMin = countsMin.get(configKey) ?? 0;\n      let countMax = countsMax.get(configKey) ?? 0;\n\n      // Decrement the minimum count and later ensure it is 0\n      countMin = Math.max(0, countMin - 1);\n\n      if (countMax === Count.infinity) {\n        filteredResources.unshift(r);\n      } else if (countMax > 0) {\n        // We still have a count left for this resource\n        filteredResources.unshift(r);\n        countMax--;\n      } else {\n        excessResources.unshift(r);\n      }\n\n      // Set the new counts\n      countsMin.set(configKey, countMin);\n      countsMax.set(configKey, countMax);\n\n      if (r.__invalid) {\n        context.addWarning(`Resource type [&${r.type}] is not valid`);\n      }\n    }\n  }\n\n  // Raise a warning if the resource type is specified in the bit header, but no extra resource attachment is allowed\n  if (!resourceAttachmentAllowed && resourceTypeAttachment) {\n    const warningMsg = `Resource type [&${resourceTypeAttachment}] is specified in the bit header, but no extra resource is allowed for this bit.`;\n    context.addWarning(warningMsg);\n  } else if (filteredResources.length === 0 && resourceTypeAttachment) {\n    context.addWarning(\n      `Resource type [&${resourceTypeAttachment}] is specified in the bit header, but no such resource is present`,\n    );\n  }\n\n  excessResources.forEach((r) => {\n    r.__excessResource = true;\n    filteredResources.push(r);\n  });\n\n  return filteredResources;\n}\n\nfunction resourceContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { type: _ignoreType, key, value, chain } = content as TypeKeyValue<BreakscapedString>;\n\n  const resources = target.resources;\n\n  if (!resources) return;\n\n  const configKey = Enum(ConfigKey).fromValue(key);\n  if (!configKey) return;\n  const resourceType =\n    Enum(ResourceType).fromKey(configKey.replace(/^&/, '')) ?? ResourceType.unknown;\n\n  // Parse the resource chain\n  const resourceConfig = Config.getTagConfigForTag(tagsConfig, configKey);\n\n  // const { posterImage, ...tags } = context.bitContentProcessor(\n  //   BitContentLevel.Chain,\n  //   bitType,\n  //   textFormat,\n  //   resourceConfig?.chain,\n  //   chain,\n  // );\n\n  // // If the chain contains a poster image, the chain is split at this point, and any tags after the poster image\n  // // apply to the poster image, not the original resource.\n  // const { originalChain, posterImageChain } = extractPosterImageChain(chain);\n  // const posterImageChainConfig = resourceConfig?.chain?.posterImage?.chain;\n\n  // // Process the poster image chain\n  // const { posterImage: unused, ...posterImageTags } = context.bitContentProcessor(\n  //   BitContentLevel.Chain,\n  //   bitType,\n  //   textFormat,\n  //   posterImageChainConfig,\n  //   posterImageChain,\n  // );\n  // unused;\n\n  // // Process the remaining chain\n  // const { posterImage, ...tags } = context.bitContentProcessor(\n  //   BitContentLevel.Chain,\n  //   bitType,\n  //   textFormat,\n  //   resourceConfig?.chain,\n  //   originalChain,\n  // );\n\n  // Process the chain\n  const { posterImage, ...tags } = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    resourceConfig?.chain,\n    chain,\n  );\n\n  // Handle the poster image\n  let posterImageResource: ImageResourceJson | undefined;\n  if (posterImage) {\n    // Process the poster image chain\n    const { subConfig: posterImageChainConfig, subChain: posterImageChain } = extractSubChain(\n      resourceConfig?.chain,\n      chain,\n      ConfigKey.property_posterImage,\n    );\n\n    const { posterImage: _unused, ...posterImageTags } = context.bitContentProcessor(\n      BitContentLevel.Chain,\n      posterImageChainConfig,\n      posterImageChain,\n    );\n\n    // Build the poster image resource\n    posterImageResource = (\n      resourceBuilder.resource(context, {\n        type: ResourceType.image,\n        value: posterImage,\n        ...posterImageTags,\n      }) as ImageResourceWrapperJson\n    ).image;\n  }\n\n  const resource = resourceBuilder.resource(context, {\n    type: resourceType,\n    value: Breakscape.unbreakscape(value, {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    }),\n    posterImage: posterImageResource,\n    ...tags,\n  });\n  if (resource) {\n    // Depending on the resource type, add it to the appropriate part of the target\n    if (\n      configKey === ConfigKey.resource_backgroundWallpaper ||\n      configKey === ConfigKey.resource_imagePlaceholder ||\n      configKey === ConfigKey.resource_platformIcon ||\n      configKey === ConfigKey.resource_platformLogo ||\n      configKey === ConfigKey.resource_platformBackgroundImage ||\n      configKey === ConfigKey.resource_previewImage ||\n      configKey === ConfigKey.resource_previewVideo ||\n      configKey === ConfigKey.resource_coverImage ||\n      configKey === ConfigKey.resource_backgroundImage\n    ) {\n      if (target.propertyStyleResources) {\n        if (target.propertyStyleResources[resourceType]) {\n          if (!Array.isArray(target.propertyStyleResources[resourceType])) {\n            target.propertyStyleResources[resourceType] = [\n              target.propertyStyleResources[resourceType] as ResourceJson,\n            ];\n          }\n          (target.propertyStyleResources[resourceType] as ResourceJson[]).push(resource);\n        } else {\n          target.propertyStyleResources[resourceType] = resource;\n        }\n      }\n    } else {\n      resources.push(resource);\n    }\n  }\n}\n\nfunction extractSubChain(\n  config: TagsConfig | undefined,\n  chain: BitContent[] | undefined,\n  configKey: ConfigKeyType,\n): { subConfig: TagsConfig | undefined; subChain: BitContent[] | undefined } {\n  let subConfig: TagsConfig | undefined;\n  if (config) {\n    subConfig = config[configKey]?.chain;\n  }\n\n  const subChain = chain?.reduce(\n    (acc, c) => {\n      if (acc) return acc;\n      const tkv = c as TypeKeyValue;\n      if (tkv.key === configKey) return tkv.chain;\n      return undefined;\n    },\n    undefined as BitContent[] | undefined,\n  );\n\n  return { subConfig, subChain };\n}\n\nexport { buildResources, resourceContentProcessor };\n","import { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TextAst } from '../../../../model/ast/TextNodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { BitType, type BitTypeType } from '../../../../model/enum/BitType.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type BitSpecificTitles,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nconst textParser = new TextParser();\n\nfunction titleTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  _tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  const { value } = content as TypeValue;\n\n  const title = target.title;\n\n  if (!title) return;\n\n  // Parse the title and its level\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const titleValue: { title: string; level: string[] } = value as any;\n  const titleText = StringUtils.trimmedString(titleValue.title) as BreakscapedString;\n  const level = titleValue.level.length;\n  title[level] = {\n    //\n    titleAst: textParser.toAst(titleText ?? '', {\n      format: textFormat,\n      location: TextLocation.tag,\n    }),\n    titleString: titleText ?? '',\n  };\n}\n\nfunction buildTitles(\n  _context: BitmarkPegParserContext,\n  bitType: BitTypeType,\n  title: { titleAst: TextAst; titleString: string }[] | undefined,\n): BitSpecificTitles {\n  title = title ?? [];\n\n  if (Config.isOfBitType(bitType, BitType.chapter)) {\n    let t: { titleAst: TextAst; titleString: string } | undefined;\n    if (title.length > 0) t = title[title.length - 1];\n\n    return {\n      title: t?.titleAst ?? [],\n      titleString: t?.titleString ?? '',\n      level: title.length > 0 ? title.length - 1 : undefined,\n    };\n  } else {\n    if (Array.isArray(title)) {\n      return {\n        title: title[1]?.titleAst ?? undefined,\n        titleString: title[1]?.titleString ?? undefined,\n        subtitle: title[2]?.titleAst ?? undefined,\n        subtitleString: title[2]?.titleString ?? undefined,\n      };\n    } else {\n      // Special case for title property (string, not bitmark text)\n      return {\n        title: undefined,\n        titleString: title ?? undefined,\n        subtitle: undefined,\n        subtitleString: undefined,\n      };\n    }\n  }\n}\n\nexport { buildTitles, titleTagContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  TypeKey,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nconst textParser = new TextParser();\n\nfunction trueFalseTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  const { type, value } = content as TypeValue;\n\n  const trueFalse = target.trueFalse;\n\n  if (!trueFalse) return;\n\n  const trimmedStringValue = Breakscape.unbreakscape(\n    StringUtils.trimmedString(value) as BreakscapedString,\n    {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    },\n  );\n\n  const textAst = textParser.toAst(trimmedStringValue ?? '', {\n    format: textFormat,\n    location: TextLocation.tag,\n  });\n\n  trueFalse.push({\n    text: trimmedStringValue,\n    textAst,\n    isCorrect: type === TypeKey.True,\n    __isDefaultExample: false,\n  });\n}\nexport { trueFalseTagContentProcessor };\n","import { Config } from '../../../../config/Config.ts';\nimport { type BodyPart } from '../../../../model/ast/Nodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { BitType } from '../../../../model/enum/BitType.ts';\nimport { BodyBitType } from '../../../../model/enum/BodyBitType.ts';\nimport {\n  type ChoiceJson,\n  type ResponseJson,\n  type StatementJson,\n} from '../../../../model/json/BitJson.ts';\nimport {\n  type HighlightJson,\n  type HighlightTextJson,\n  type SelectJson,\n  type SelectOptionJson,\n} from '../../../../model/json/BodyBitJson.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type StatementsOrChoicesOrResponses,\n  type TrueFalseValue,\n  TypeKey,\n} from '../BitmarkPegParserTypes.ts';\nimport { trueFalseTagContentProcessor } from './TrueFalseTagContentProcessor.ts';\n\nfunction trueFalseChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n  bodyParts: BodyPart[],\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    trueFalseTagContentProcessor(context, BitContentLevel.Chain, content, target);\n  } else {\n    buildTrueFalse(context, contentDepth, tagsConfig, content, target, bodyParts);\n  }\n}\n\nfunction buildTrueFalse(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n  bodyParts: BodyPart[],\n): void {\n  const { bitType } = context;\n  const chainContent = [content, ...(content.chain ?? [])];\n\n  const statements = target.statements;\n  const choices = target.choices;\n  const responses = target.responses;\n\n  if (!statements || !choices || !responses || !bodyParts) return;\n\n  if (Config.isOfBitType(bitType, BitType.trueFalse1)) {\n    // Treat as true/false for statement\n    target.statement = buildStatement(context, tagsConfig, chainContent);\n  } else if (\n    Config.isOfBitType(bitType, [\n      BitType.trueFalse,\n      BitType.multipleChoice,\n      BitType.multipleChoice1,\n      BitType.multipleResponse,\n      BitType.multipleResponse1,\n      BitType.feedback,\n    ])\n  ) {\n    // Treat as true/false for choices / responses\n    const tf = buildStatementsChoicesResponses(context, tagsConfig, chainContent);\n\n    if (tf.statements) statements.push(...tf.statements);\n    if (tf.choices) choices.push(...tf.choices);\n    if (tf.responses) responses.push(...tf.responses);\n  } else if (Config.isOfBitType(bitType, BitType.highlightText)) {\n    // Treat as highlight text\n    const highlight = buildHighlight(context, tagsConfig, chainContent);\n    if (highlight) bodyParts.push(highlight as BodyPart);\n  } else {\n    // Treat as select\n    const select = buildSelect(context, tagsConfig, chainContent);\n    if (select) bodyParts.push(select as BodyPart);\n  }\n}\n\n/**\n * Build statement for the bit:\n * .trueFalse-1\n *\n * @param bitType\n * @param trueFalseContent\n * @returns\n */\nfunction buildStatement(\n  context: BitmarkPegParserContext,\n  tagsConfig: TagsConfig | undefined,\n  trueFalseContent: BitContent[],\n): Partial<StatementJson> | undefined {\n  const { bitType } = context;\n  if (!Config.isOfBitType(bitType, BitType.trueFalse1)) return undefined;\n\n  if (context.DEBUG_CHAIN_CONTENT)\n    context.debugPrint('trueFalse V1 content (statement)', trueFalseContent);\n\n  const { trueFalse, ...tags } = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    tagsConfig,\n    trueFalseContent,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('trueFalse V1 tags (statement)', tags);\n\n  let statement: Partial<StatementJson> | undefined;\n\n  let firstTrueFalse: TrueFalseValue | undefined;\n  if (trueFalse && trueFalse.length > 0) {\n    firstTrueFalse = trueFalse[0];\n  }\n\n  if (firstTrueFalse) {\n    // Have to remove the statement JSON tag to keep typescript happy\n    const { statement: _ignore, ...tagsRest } = tags;\n    statement = { ...firstTrueFalse, statement: firstTrueFalse.text, ...tagsRest };\n  }\n\n  return statement;\n}\n\n/**\n * Build statements / choices / responses for the bits:\n * .multiple-choice, .multiple-choice-1, .mutliple-response, .mutliple-response-1, .trueFalse, etc\n *\n * @param bitType\n * @param trueFalseContent\n * @returns\n */\nfunction buildStatementsChoicesResponses(\n  context: BitmarkPegParserContext,\n  tagsConfig: TagsConfig | undefined,\n  trueFalseContent: BitContent[],\n): StatementsOrChoicesOrResponses {\n  const { bitType } = context;\n  // NOTE: We handle V1 tags in V2 multiple-choice / multiple-response for maxium backwards compatibility\n  const insertStatements = Config.isOfBitType(bitType, BitType.trueFalse);\n  const insertChoices = Config.isOfBitType(bitType, [\n    BitType.multipleChoice,\n    BitType.multipleChoice1,\n    BitType.feedback,\n  ]);\n  const insertResponses = Config.isOfBitType(bitType, [\n    BitType.multipleResponse,\n    BitType.multipleResponse1,\n  ]);\n  if (!insertStatements && !insertChoices && !insertResponses) return {};\n\n  const statements: Partial<StatementJson>[] = [];\n  const choices: Partial<ChoiceJson>[] = [];\n  const responses: Partial<ResponseJson>[] = [];\n\n  const trueFalseContents = context.splitBitContent(trueFalseContent, [\n    TypeKey.True,\n    TypeKey.False,\n  ]);\n\n  if (context.DEBUG_CHAIN_CONTENT) {\n    context.debugPrint('trueFalse V1 content (choices/responses)', trueFalseContents);\n  }\n\n  for (const contents of trueFalseContents) {\n    const { trueFalse, ...tags } = context.bitContentProcessor(\n      BitContentLevel.Chain,\n      tagsConfig,\n      contents,\n    );\n\n    if (context.DEBUG_CHAIN_TAGS) context.debugPrint('trueFalse V1 tags (choices/responses)', tags);\n\n    let firstTrueFalse: TrueFalseValue | undefined;\n    if (trueFalse && trueFalse.length > 0) {\n      firstTrueFalse = trueFalse[0];\n    }\n\n    if (firstTrueFalse) {\n      if (insertStatements) {\n        // Have to remove the statement JSON tag to keep typescript happy\n        const { statement: _ignore, ...tagsRest } = tags;\n\n        const statement: Partial<StatementJson> = {\n          ...firstTrueFalse,\n          statement: firstTrueFalse.textAst ?? [],\n          ...tagsRest,\n        };\n        if (statement) statements.push(statement);\n      } else if (insertChoices) {\n        const choice = { ...firstTrueFalse, choice: firstTrueFalse.text, ...tags };\n        if (choice) choices.push(choice);\n      } else if (insertResponses) {\n        const response = { ...firstTrueFalse, response: firstTrueFalse.text, ...tags };\n        if (response) responses.push(response);\n      }\n    }\n  }\n\n  const res: StatementsOrChoicesOrResponses = {};\n  if (insertStatements) {\n    res.statements = statements;\n  } else if (insertChoices) {\n    res.choices = choices;\n  } else if (insertResponses) {\n    res.responses = responses;\n  }\n\n  return res;\n}\n\nfunction buildHighlight(\n  context: BitmarkPegParserContext,\n  tagsConfig: TagsConfig | undefined,\n  highlightContent: BitContent[],\n): Partial<HighlightJson> | undefined {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('highlight content', highlightContent);\n\n  const { trueFalse, ...tags } = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    tagsConfig,\n    highlightContent,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('highlight TAGS', { trueFalse, ...tags });\n\n  const texts: Partial<HighlightTextJson>[] = [];\n  if (trueFalse) {\n    for (const tf of trueFalse) {\n      const ht: Partial<HighlightTextJson> = { ...tf, isHighlighted: false };\n      if (ht) texts.push(ht);\n    }\n  }\n\n  const highlight: Partial<HighlightJson> = {\n    type: BodyBitType.highlight,\n    texts: texts as HighlightTextJson[],\n    ...tags,\n  };\n\n  return highlight;\n}\n\nfunction buildSelect(\n  context: BitmarkPegParserContext,\n  tagsConfig: TagsConfig | undefined,\n  selectContent: BitContent[],\n): Partial<SelectJson> | undefined {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('select content', selectContent);\n\n  const { trueFalse, ...tags } = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    tagsConfig,\n    selectContent,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('select TAGS', { trueFalse, ...tags });\n\n  const options: Partial<SelectOptionJson>[] = [];\n  if (trueFalse) {\n    for (const tf of trueFalse) {\n      const so: Partial<SelectOptionJson> = tf;\n      if (so) options.push(so);\n    }\n  }\n\n  const select: Partial<SelectJson> = {\n    type: BodyBitType.select,\n    options: options as SelectOptionJson[],\n    ...tags,\n  };\n\n  return select;\n}\n\nexport { trueFalseChainContentProcessor };\n","// @generated by Peggy 5.1.0.\n//\n// https://peggyjs.org/\n\nimport { TypeKey } from \"../../../parser/bitmark/peg/BitmarkPegParserTypes.ts\";\nimport { BitmarkPegParserHelper } from \"../../../parser/bitmark/peg/BitmarkPegParserHelper.ts\";\nimport { BitmarkPegParserProcessor } from \"../../../parser/bitmark/peg/BitmarkPegParserProcessor.ts\";\nimport { Breakscape } from \"../../../breakscaping/Breakscape.ts\";\n\n\n // GLOBAL JS\n\n//\n// Global variables\n//\n\n// None\n\n\nclass peg$SyntaxError extends SyntaxError {\n  constructor(message, expected, found, location) {\n    super(message);\n    this.expected = expected;\n    this.found = found;\n    this.location = location;\n    this.name = \"SyntaxError\";\n  }\n\n  format(sources) {\n    let str = \"Error: \" + this.message;\n    if (this.location) {\n      let src = null;\n      const st = sources.find(s => s.source === this.location.source);\n      if (st) {\n        src = st.text.split(/\\r\\n|\\n|\\r/g);\n      }\n      const s = this.location.start;\n      const offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n        ? this.location.source.offset(s)\n        : s;\n      const loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n      if (src) {\n        const e = this.location.end;\n        const filler = \"\".padEnd(offset_s.line.toString().length, \" \");\n        const line = src[s.line - 1];\n        const last = s.line === e.line ? e.column : line.length + 1;\n        const hatLen = (last - s.column) || 1;\n        str += \"\\n --> \" + loc + \"\\n\"\n            + filler + \" |\\n\"\n            + offset_s.line + \" | \" + line + \"\\n\"\n            + filler + \" | \" + \"\".padEnd(s.column - 1, \" \")\n            + \"\".padEnd(hatLen, \"^\");\n      } else {\n        str += \"\\n at \" + loc;\n      }\n    }\n    return str;\n  }\n\n  static buildMessage(expected, found) {\n    function hex(ch) {\n      return ch.codePointAt(0).toString(16).toUpperCase();\n    }\n\n    const nonPrintable = Object.prototype.hasOwnProperty.call(RegExp.prototype, \"unicode\")\n      ? new RegExp(\"[\\\\p{C}\\\\p{Mn}\\\\p{Mc}]\", \"gu\")\n      : null;\n    function unicodeEscape(s) {\n      if (nonPrintable) {\n        return s.replace(nonPrintable,  ch => \"\\\\u{\" + hex(ch) + \"}\");\n      }\n      return s;\n    }\n\n    function literalEscape(s) {\n      return unicodeEscape(s\n        .replace(/\\\\/g, \"\\\\\\\\\")\n        .replace(/\"/g,  \"\\\\\\\"\")\n        .replace(/\\0/g, \"\\\\0\")\n        .replace(/\\t/g, \"\\\\t\")\n        .replace(/\\n/g, \"\\\\n\")\n        .replace(/\\r/g, \"\\\\r\")\n        .replace(/[\\x00-\\x0F]/g,          ch => \"\\\\x0\" + hex(ch))\n        .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, ch => \"\\\\x\"  + hex(ch)));\n    }\n\n    function classEscape(s) {\n      return unicodeEscape(s\n        .replace(/\\\\/g, \"\\\\\\\\\")\n        .replace(/\\]/g, \"\\\\]\")\n        .replace(/\\^/g, \"\\\\^\")\n        .replace(/-/g,  \"\\\\-\")\n        .replace(/\\0/g, \"\\\\0\")\n        .replace(/\\t/g, \"\\\\t\")\n        .replace(/\\n/g, \"\\\\n\")\n        .replace(/\\r/g, \"\\\\r\")\n        .replace(/[\\x00-\\x0F]/g,          ch => \"\\\\x0\" + hex(ch))\n        .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, ch => \"\\\\x\"  + hex(ch)));\n    }\n\n    const DESCRIBE_EXPECTATION_FNS = {\n      literal(expectation) {\n        return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n      },\n\n      class(expectation) {\n        const escapedParts = expectation.parts.map(\n          part => (Array.isArray(part)\n            ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n            : classEscape(part))\n        );\n\n        return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\" + (expectation.unicode ? \"u\" : \"\");\n      },\n\n      any() {\n        return \"any character\";\n      },\n\n      end() {\n        return \"end of input\";\n      },\n\n      other(expectation) {\n        return expectation.description;\n      },\n    };\n\n    function describeExpectation(expectation) {\n      return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n    }\n\n    function describeExpected(expected) {\n      const descriptions = expected.map(describeExpectation);\n      descriptions.sort();\n\n      if (descriptions.length > 0) {\n        let j = 1;\n        for (let i = 1; i < descriptions.length; i++) {\n          if (descriptions[i - 1] !== descriptions[i]) {\n            descriptions[j] = descriptions[i];\n            j++;\n          }\n        }\n        descriptions.length = j;\n      }\n\n      switch (descriptions.length) {\n        case 1:\n          return descriptions[0];\n\n        case 2:\n          return descriptions[0] + \" or \" + descriptions[1];\n\n        default:\n          return descriptions.slice(0, -1).join(\", \")\n            + \", or \"\n            + descriptions[descriptions.length - 1];\n      }\n    }\n\n    function describeFound(found) {\n      return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n    }\n\n    return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n  }\n}\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  const peg$FAILED = {};\n  const peg$source = options.grammarSource;\n\n  const peg$startRuleFunctions = {\n    bitmark: peg$parsebitmark,\n    bit: peg$parsebit,\n    cardContent: peg$parsecardContent,\n  };\n  let peg$startRuleFunction = peg$parsebitmark;\n\n  const peg$c0 = \"[.\";\n  const peg$c1 = \"]\";\n  const peg$c2 = \"[\";\n  const peg$c3 = \":\";\n  const peg$c4 = \"&\";\n  const peg$c5 = \"$$$$\";\n  const peg$c6 = \"====\";\n  const peg$c7 = \"text\";\n  const peg$c8 = \"~~~~\";\n  const peg$c9 = \"footer\";\n  const peg$c10 = \" \";\n  const peg$c11 = \"--\";\n  const peg$c12 = \"++\";\n  const peg$c13 = \"===\";\n  const peg$c14 = \"==\";\n  const peg$c15 = \"[@id\";\n  const peg$c16 = \"#\";\n  const peg$c17 = \"[\\u25BC\";\n  const peg$c18 = \"[\\u25BA\";\n  const peg$c19 = \"[@\";\n  const peg$c20 = \"[%\";\n  const peg$c21 = \"[!\";\n  const peg$c22 = \"[?\";\n  const peg$c23 = \"[+\";\n  const peg$c24 = \"[-\";\n  const peg$c25 = \"[$\";\n  const peg$c26 = \"[_\";\n  const peg$c27 = \"[=\";\n  const peg$c28 = \"[&\";\n  const peg$c29 = \"^]\";\n  const peg$c30 = \"id:\";\n  const peg$c31 = \".\";\n  const peg$c32 = \"\\n\";\n  const peg$c33 = \"\\r\\n\";\n\n  const peg$r0 = /^[^\\]]/;\n  const peg$r1 = /^[a-z]/;\n  const peg$r2 = /^[a-z0-9\\-]/;\n  const peg$r3 = /^[^:\\]]/;\n  const peg$r4 = /^[^&:\\]]/;\n  const peg$r5 = /^[^\\n\\r\\u2028\\u2029]/;\n  const peg$r6 = /^[ \\t]/;\n  const peg$r7 = /^[\\r\\u2028-\\u2029]/;\n  const peg$r8 = /^[ \\t\\n\\r\\u2028\\u2029]/;\n\n  const peg$e0 = peg$literalExpectation(\"[.\", false);\n  const peg$e1 = peg$classExpectation([\"]\"], true, false, false);\n  const peg$e2 = peg$literalExpectation(\"]\", false);\n  const peg$e3 = peg$literalExpectation(\"[\", false);\n  const peg$e4 = peg$literalExpectation(\":\", false);\n  const peg$e5 = peg$literalExpectation(\"&\", false);\n  const peg$e6 = peg$anyExpectation();\n  const peg$e7 = peg$literalExpectation(\"$$$$\", false);\n  const peg$e8 = peg$literalExpectation(\"====\", false);\n  const peg$e9 = peg$literalExpectation(\"text\", false);\n  const peg$e10 = peg$literalExpectation(\"~~~~\", false);\n  const peg$e11 = peg$literalExpectation(\"footer\", false);\n  const peg$e12 = peg$literalExpectation(\" \", false);\n  const peg$e13 = peg$literalExpectation(\"--\", false);\n  const peg$e14 = peg$literalExpectation(\"++\", false);\n  const peg$e15 = peg$literalExpectation(\"===\", false);\n  const peg$e16 = peg$literalExpectation(\"==\", false);\n  const peg$e17 = peg$classExpectation([[\"a\", \"z\"]], false, false, false);\n  const peg$e18 = peg$classExpectation([[\"a\", \"z\"], [\"0\", \"9\"], \"-\"], false, false, false);\n  const peg$e19 = peg$literalExpectation(\"[@id\", false);\n  const peg$e20 = peg$literalExpectation(\"#\", false);\n  const peg$e21 = peg$literalExpectation(\"[\\u25BC\", false);\n  const peg$e22 = peg$literalExpectation(\"[\\u25BA\", false);\n  const peg$e23 = peg$literalExpectation(\"[@\", false);\n  const peg$e24 = peg$literalExpectation(\"[%\", false);\n  const peg$e25 = peg$literalExpectation(\"[!\", false);\n  const peg$e26 = peg$literalExpectation(\"[?\", false);\n  const peg$e27 = peg$literalExpectation(\"[+\", false);\n  const peg$e28 = peg$literalExpectation(\"[-\", false);\n  const peg$e29 = peg$literalExpectation(\"[$\", false);\n  const peg$e30 = peg$literalExpectation(\"[_\", false);\n  const peg$e31 = peg$literalExpectation(\"[=\", false);\n  const peg$e32 = peg$literalExpectation(\"[&\", false);\n  const peg$e33 = peg$literalExpectation(\"^]\", false);\n  const peg$e34 = peg$literalExpectation(\"id:\", false);\n  const peg$e35 = peg$classExpectation([\":\", \"]\"], true, false, false);\n  const peg$e36 = peg$literalExpectation(\".\", false);\n  const peg$e37 = peg$classExpectation([\"&\", \":\", \"]\"], true, false, false);\n  const peg$e38 = peg$otherExpectation(\"Character\");\n  const peg$e39 = peg$classExpectation([\"\\n\", \"\\r\", \"\\u2028\", \"\\u2029\"], true, false, false);\n  const peg$e40 = peg$otherExpectation(\"Blank Line\");\n  const peg$e41 = peg$classExpectation([\" \", \"\\t\"], false, false, false);\n  const peg$e42 = peg$otherExpectation(\"Line Terminator\");\n  const peg$e43 = peg$literalExpectation(\"\\n\", false);\n  const peg$e44 = peg$literalExpectation(\"\\r\\n\", false);\n  const peg$e45 = peg$classExpectation([\"\\r\", [\"\\u2028\", \"\\u2029\"]], false, false, false);\n  const peg$e46 = peg$otherExpectation(\"Whitespace, then Line Terminator\");\n  const peg$e47 = peg$otherExpectation(\"whitespace\");\n  const peg$e48 = peg$classExpectation([\" \", \"\\t\", \"\\n\", \"\\r\", \"\\u2028\", \"\\u2029\"], false, false, false);\n\n  function peg$f0(firstBit, bits) {    return processor.buildBits([ firstBit, ...bits])  }\n  function peg$f1(bit) {    return helper.handleRawBit(bit);  }\n  function peg$f2(bit) {    return bit;  }\n  function peg$f3(bit) {    return helper.handleRawBit(bit);  }\n  function peg$f4(bitHeader) {    return bitHeader;  }\n  function peg$f5(bit) {    return bit  }\n  function peg$f6(bitHeader, bitContent) {    return processor.buildBit(bitHeader, bitContent)  }\n  function peg$f7(bit) {    return processor.invalidBit(bit)  }\n  function peg$f8(bitLevel, bitType, formatAndResource) {    return processor.buildBitHeader(bitType, bitLevel, formatAndResource)  }\n  function peg$f9(value1, value2) {    return processor.buildTextAndResourceType(value1, value2)  }\n  function peg$f10(value) {    return helper.handleTextFormat(value)  }\n  function peg$f11(value) {    return helper.handleResourceType(value)  }\n  function peg$f12(value) {    return helper.handleBitContent(value)  }\n  function peg$f13(value) {    return helper.handleTagChain(value)  }\n  function peg$f14(value) {    return value  }\n  function peg$f15(value) {    return helper.handleBitTag(value)  }\n  function peg$f16(value) {    return { type: TypeKey.BodyChar, value: value }  }\n  function peg$f17(value) {    return helper.handlePlainTextDivider(value);  }\n  function peg$f18(value) {    return helper.handleFooterDivider(value);  }\n  function peg$f19(value) {    return helper.handleCardSet(value[1].flat());  }\n  function peg$f20() {    helper.handleCardSetStart();  }\n  function peg$f21() {    helper.handleCardSetEnd();  }\n  function peg$f22(value) {    return helper.handleCards(value);  }\n  function peg$f23(value) {    return helper.handleCardLineOrDivider(value, 2);  }\n  function peg$f24(qualifier) {    return [\"====\", qualifier];  }\n  function peg$f25() {    return [\"====\"];  }\n  function peg$f26(qualifier) {    return [\"--\", qualifier];  }\n  function peg$f27() {    return [\"--\"];  }\n  function peg$f28(qualifier) {    return [\"++\", qualifier];  }\n  function peg$f29() {    return [\"++\"];  }\n  function peg$f30(value) {    return helper.handleCardLine(value);  }\n  function peg$f31(value) {    return helper.handleCardSet(value[1].flat());  }\n  function peg$f32() {    helper.handleCardSetStart();  }\n  function peg$f33() {    helper.handleCardSetEnd();  }\n  function peg$f34(value) {    return helper.handleCards(value);  }\n  function peg$f35(value) {    return helper.handleCardLineOrDivider(value, 1);  }\n  function peg$f36(value) {    return helper.handleCardLine(value);  }\n  function peg$f37(value) {    return value;  }\n  function peg$f38(value) {    return helper.handleCardContent(value);  }\n  function peg$f39(value) {    return { type: TypeKey.CardChar, value: value }  }\n  function peg$f40(value) {    return helper.handlePropertyTag(\"id\", value)  }\n  function peg$f41(level, title) {    return helper.handleTag(TypeKey.Title, { level, title })  }\n  function peg$f42(value) {    return helper.handleTag(TypeKey.Anchor, value)  }\n  function peg$f43(value) {    return helper.handleTag(TypeKey.Reference, value)  }\n  function peg$f44(key, value) {    return helper.handlePropertyTag(key, value)  }\n  function peg$f45(value) {    return helper.handleTag(TypeKey.ItemLead, value)  }\n  function peg$f46(value) {    return helper.handleTag(TypeKey.Instruction, value)  }\n  function peg$f47(value) {    return helper.handleTag(TypeKey.Hint, value)  }\n  function peg$f48(value) {    return helper.handleTag(TypeKey.True, value)  }\n  function peg$f49(value) {    return helper.handleTag(TypeKey.False, value)  }\n  function peg$f50(value) {    return helper.handleTag(TypeKey.SampleSolution, value)  }\n  function peg$f51(value) {    return helper.handleTag(TypeKey.Gap, value)  }\n  function peg$f52(value) {    return helper.handleTag(TypeKey.Mark, value)  }\n  function peg$f53(key, value) {    return helper.handleResourceTag(key, value);  }\n  function peg$f54(value) {    return value  }\n  function peg$f55(value) {    return value ? value.trim() : ''  }\n  function peg$f56(value) {    return value.length  }\n  function peg$f57(value) {    return value ? value.trim() : null  }\n  function peg$f58(value) {    return value ? value.trim() : ''  }\n  function peg$f59() {    return true  }\n  let peg$currPos = options.peg$currPos | 0;\n  let peg$savedPos = peg$currPos;\n  const peg$posDetailsCache = [{ line: 1, column: 1 }];\n  let peg$maxFailPos = peg$currPos;\n  let peg$maxFailExpected = options.peg$maxFailExpected || [];\n  let peg$silentFails = options.peg$silentFails | 0;\n\n  let peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos,\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$getUnicode(pos = peg$currPos) {\n    const cp = input.codePointAt(pos);\n    if (cp === undefined) {\n      return \"\";\n    }\n    return String.fromCodePoint(cp);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text, ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase, unicode) {\n    return { type: \"class\", parts, inverted, ignoreCase, unicode };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description };\n  }\n\n  function peg$computePosDetails(pos) {\n    let details = peg$posDetailsCache[pos];\n    let p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column,\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    const startPosDetails = peg$computePosDetails(startPos);\n    const endPosDetails = peg$computePosDetails(endPos);\n\n    const res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column,\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column,\n      },\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parsebitmark() {\n    let s0;\n\n    s0 = peg$parseBM_Bitmark();\n\n    return s0;\n  }\n\n  function peg$parseBM_Bitmark() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseWS();\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseWS();\n    }\n    s2 = peg$parseBM_FirstBit();\n    s3 = peg$parseBM_Bits();\n    peg$savedPos = s0;\n    s0 = peg$f0(s2, s3);\n\n    return s0;\n  }\n\n  function peg$parseBM_FirstBit() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = peg$parseBM_BodyLine();\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = peg$parseBM_BodyLine();\n    }\n    s1 = input.substring(s1, peg$currPos);\n    peg$savedPos = s0;\n    s1 = peg$f1(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBM_Bits() {\n    let s0, s1;\n\n    s0 = [];\n    s1 = peg$parseBM_NL_Bit();\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = peg$parseBM_NL_Bit();\n    }\n\n    return s0;\n  }\n\n  function peg$parseBM_NL_Bit() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseBlankLine();\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseBlankLine();\n    }\n    s2 = peg$parseNL();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$parseBM_Bit();\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f2(s3);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBM_Bit() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    s3 = peg$parseBM_BitHeader();\n    if (s3 !== peg$FAILED) {\n      s4 = [];\n      s5 = peg$parseBM_BodyLine();\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = peg$parseBM_BodyLine();\n      }\n      s3 = [s3, s4];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f3(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBM_BitHeader() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c0) {\n      s1 = peg$c0;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n      if (input.charCodeAt(peg$currPos) === 93) {\n        s3 = peg$c1;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f4(s1);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBM_BodyLine() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNL();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      peg$silentFails++;\n      s3 = peg$parseBitHeader();\n      peg$silentFails--;\n      if (s3 === peg$FAILED) {\n        s2 = undefined;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = [];\n      s1 = peg$parseChar();\n      if (s1 !== peg$FAILED) {\n        while (s1 !== peg$FAILED) {\n          s0.push(s1);\n          s1 = peg$parseChar();\n        }\n      } else {\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parsebit() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseBlankLine();\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseBlankLine();\n    }\n    s2 = peg$parseBit();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseBlankLine();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseBlankLine();\n      }\n      peg$savedPos = s0;\n      s0 = peg$f5(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBit() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBitHeader();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseBitContent();\n      peg$savedPos = s0;\n      s0 = peg$f6(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = peg$parseAnything();\n      s1 = input.substring(s1, peg$currPos);\n      peg$savedPos = s0;\n      s1 = peg$f7(s1);\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBitHeader() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s1 = peg$c2;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseBit_Level();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseBit_Value();\n        s4 = peg$parseTextFormatAndResourceType();\n        if (input.charCodeAt(peg$currPos) === 93) {\n          s5 = peg$c1;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f8(s2, s3, s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTextFormatAndResourceType() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseTextFormat();\n    if (s1 === peg$FAILED) {\n      s1 = peg$parseResourceType();\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parseTextFormat();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseResourceType();\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    peg$savedPos = s0;\n    s0 = peg$f9(s1, s2);\n\n    return s0;\n  }\n\n  function peg$parseTextFormat() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 58) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseBit_Value();\n      peg$savedPos = s0;\n      s0 = peg$f10(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseResourceType() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 38) {\n      s1 = peg$c4;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseBit_Value();\n      peg$savedPos = s0;\n      s0 = peg$f11(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBitContent() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseDivider();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseCardSet_V2();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseCardSet_V1();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseTagChain();\n          if (s2 === peg$FAILED) {\n            s2 = peg$parseBodyChar();\n          }\n        }\n      }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseDivider();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseCardSet_V2();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseCardSet_V1();\n          if (s2 === peg$FAILED) {\n            s2 = peg$parseTagChain();\n            if (s2 === peg$FAILED) {\n              s2 = peg$parseBodyChar();\n            }\n          }\n        }\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f12(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseTagChain() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseBitTag();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseChainedBitTag();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseChainedBitTag();\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f13(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseChainedBitTag() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBitTag();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f14(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBitTag() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIDTag();\n    if (s1 === peg$FAILED) {\n      s1 = peg$parsePropertyTag();\n      if (s1 === peg$FAILED) {\n        s1 = peg$parseTitleTag();\n        if (s1 === peg$FAILED) {\n          s1 = peg$parseAnchorTag();\n          if (s1 === peg$FAILED) {\n            s1 = peg$parseReferenceTag();\n            if (s1 === peg$FAILED) {\n              s1 = peg$parseItemLeadTag();\n              if (s1 === peg$FAILED) {\n                s1 = peg$parseInstructionTag();\n                if (s1 === peg$FAILED) {\n                  s1 = peg$parseHintTag();\n                  if (s1 === peg$FAILED) {\n                    s1 = peg$parseGapTag();\n                    if (s1 === peg$FAILED) {\n                      s1 = peg$parseMarkTag();\n                      if (s1 === peg$FAILED) {\n                        s1 = peg$parseSampleSolutionTag();\n                        if (s1 === peg$FAILED) {\n                          s1 = peg$parseTrueTag();\n                          if (s1 === peg$FAILED) {\n                            s1 = peg$parseFalseTag();\n                            if (s1 === peg$FAILED) {\n                              s1 = peg$parseResourceTag();\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f15(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBodyChar() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    if (input.length > peg$currPos) {\n      s1 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f16(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseDivider() {\n    let s0;\n\n    s0 = peg$parseFooterDivider();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parsePlainTextDivider();\n    }\n\n    return s0;\n  }\n\n  function peg$parsePlainTextDividerText() {\n    let s0, s1, s2, s3, s4, s5;\n\n    if (input.substr(peg$currPos, 4) === peg$c5) {\n      s0 = peg$c5;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 4) === peg$c6) {\n        s1 = peg$c6;\n        peg$currPos += 4;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parseWS();\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = peg$parseWS();\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 4) === peg$c7) {\n            s3 = peg$c7;\n            peg$currPos += 4;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = [];\n            s5 = peg$parseWS();\n            if (s5 !== peg$FAILED) {\n              while (s5 !== peg$FAILED) {\n                s4.push(s5);\n                s5 = peg$parseWS();\n              }\n            } else {\n              s4 = peg$FAILED;\n            }\n            if (s4 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 4) === peg$c6) {\n                s5 = peg$c6;\n                peg$currPos += 4;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s5 !== peg$FAILED) {\n                s1 = [s1, s2, s3, s4, s5];\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parsePlainTextDivider() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseNL();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parsePlainTextDividerText();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseWNL();\n        if (s4 !== peg$FAILED) {\n          s2 = [s2, s3, s4];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f17(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseFooterDividerText() {\n    let s0, s1, s2, s3, s4, s5;\n\n    if (input.substr(peg$currPos, 4) === peg$c8) {\n      s0 = peg$c8;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 4) === peg$c6) {\n        s1 = peg$c6;\n        peg$currPos += 4;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parseWS();\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = peg$parseWS();\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 6) === peg$c9) {\n            s3 = peg$c9;\n            peg$currPos += 6;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e11); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = [];\n            s5 = peg$parseWS();\n            if (s5 !== peg$FAILED) {\n              while (s5 !== peg$FAILED) {\n                s4.push(s5);\n                s5 = peg$parseWS();\n              }\n            } else {\n              s4 = peg$FAILED;\n            }\n            if (s4 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 4) === peg$c6) {\n                s5 = peg$c6;\n                peg$currPos += 4;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s5 !== peg$FAILED) {\n                s1 = [s1, s2, s3, s4, s5];\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseFooterDivider() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseNL();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseFooterDividerText();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseWNL();\n        if (s4 !== peg$FAILED) {\n          s2 = [s2, s3, s4];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f18(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardSet_V2() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseCardSetStart_V2();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseCards_V2();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseCards_V2();\n      }\n      s4 = peg$parseCardSetEnd_V2();\n      if (s4 !== peg$FAILED) {\n        s2 = [s2, s3, s4];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f19(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardSetStart_V2() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseWNL();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseNL();\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parseWNL();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseNL();\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      peg$silentFails++;\n      s3 = peg$parseCardDividerLookahead_V2();\n      peg$silentFails--;\n      if (s3 !== peg$FAILED) {\n        peg$currPos = s2;\n        s2 = undefined;\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f20();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardSetEnd_V2() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseFooterDividerText();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$currPos;\n    peg$silentFails++;\n    s4 = peg$parseWEOL();\n    peg$silentFails--;\n    if (s4 !== peg$FAILED) {\n      peg$currPos = s3;\n      s3 = undefined;\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f21();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCards_V2() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseCardLineOrDivider_V2();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f22(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardLineOrDivider_V2() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseCardDividerToken_V2();\n    if (s1 === peg$FAILED) {\n      s1 = peg$parseCardSideDividerToken_V2();\n      if (s1 === peg$FAILED) {\n        s1 = peg$parseCardVariantDividerToken_V2();\n        if (s1 === peg$FAILED) {\n          s1 = peg$parseCardLine_V2();\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f23(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardDividerToken_V2() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c6) {\n      s1 = peg$c6;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s1 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 32) {\n        s2 = peg$c10;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseQualifier();\n        if (s3 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s4 = peg$c10;\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s4 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 4) === peg$c6) {\n              s5 = peg$c6;\n              peg$currPos += 4;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parseWNL();\n              if (s6 === peg$FAILED) {\n                s6 = peg$parseWEOL();\n              }\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f24(s3);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 4) === peg$c6) {\n        s1 = peg$c6;\n        peg$currPos += 4;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseWNL();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseWEOL();\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f25();\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardSideDividerToken_V2() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c11) {\n      s1 = peg$c11;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s1 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 32) {\n        s2 = peg$c10;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseQualifier();\n        if (s3 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s4 = peg$c10;\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s4 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 2) === peg$c11) {\n              s5 = peg$c11;\n              peg$currPos += 2;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e13); }\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parseWNL();\n              if (s6 === peg$FAILED) {\n                s6 = peg$parseWEOL();\n              }\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f26(s3);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 2) === peg$c11) {\n        s1 = peg$c11;\n        peg$currPos += 2;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseWNL();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseWEOL();\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f27();\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardVariantDividerToken_V2() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c12) {\n      s1 = peg$c12;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s1 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 32) {\n        s2 = peg$c10;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseQualifier();\n        if (s3 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s4 = peg$c10;\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s4 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 2) === peg$c12) {\n              s5 = peg$c12;\n              peg$currPos += 2;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e14); }\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parseWNL();\n              if (s6 === peg$FAILED) {\n                s6 = peg$parseWEOL();\n              }\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f28(s3);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 2) === peg$c12) {\n        s1 = peg$c12;\n        peg$currPos += 2;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseWNL();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseWEOL();\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f29();\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardDividerLookahead_V2() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c6) {\n      s1 = peg$c6;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 32) {\n        s3 = peg$c10;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseQualifier();\n        if (s4 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s5 = peg$c10;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 4) === peg$c6) {\n              s6 = peg$c6;\n              peg$currPos += 4;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n            if (s6 !== peg$FAILED) {\n              s3 = [s3, s4, s5, s6];\n              s2 = s3;\n            } else {\n              peg$currPos = s2;\n              s2 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      s3 = peg$parseWNL();\n      if (s3 === peg$FAILED) {\n        s3 = peg$parseWEOL();\n      }\n      if (s3 !== peg$FAILED) {\n        s1 = [s1, s2, s3];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardLine_V2() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$currPos;\n    s3 = peg$parseFooterDividerText();\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseWEOL();\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = peg$parseLine();\n      s5 = peg$parseNL();\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = peg$parseChar();\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = peg$parseChar();\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseEOL();\n          if (s5 !== peg$FAILED) {\n            s4 = [s4, s5];\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f30(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardSet_V1() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseCardSetStart_V1();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseCards_V1();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseCards_V1();\n      }\n      s4 = peg$parseCardSetEnd_V1();\n      if (s4 !== peg$FAILED) {\n        s2 = [s2, s3, s4];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f31(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardSetStart_V1() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseWNL();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseNL();\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parseWNL();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseNL();\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      peg$silentFails++;\n      s3 = peg$currPos;\n      if (input.substr(peg$currPos, 3) === peg$c13) {\n        s4 = peg$c13;\n        peg$currPos += 3;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseWNL();\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s3 !== peg$FAILED) {\n        peg$currPos = s2;\n        s2 = undefined;\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f32();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardSetEnd_V1() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseFooterDividerText();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$currPos;\n    peg$silentFails++;\n    s4 = peg$parseWEOL();\n    peg$silentFails--;\n    if (s4 !== peg$FAILED) {\n      peg$currPos = s3;\n      s3 = undefined;\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f33();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCards_V1() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseCardLineOrDivider_V1();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f34(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardLineOrDivider_V1() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c13) {\n      s2 = peg$c13;\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseWNL();\n      if (s3 === peg$FAILED) {\n        s3 = peg$parseWEOL();\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = [s2, s3];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 === peg$FAILED) {\n      s1 = peg$currPos;\n      if (input.substr(peg$currPos, 2) === peg$c14) {\n        s2 = peg$c14;\n        peg$currPos += 2;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseWNL();\n        if (s3 === peg$FAILED) {\n          s3 = peg$parseWEOL();\n        }\n        if (s3 !== peg$FAILED) {\n          s2 = [s2, s3];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n      if (s1 === peg$FAILED) {\n        s1 = peg$currPos;\n        if (input.substr(peg$currPos, 2) === peg$c11) {\n          s2 = peg$c11;\n          peg$currPos += 2;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e13); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parseWNL();\n          if (s3 === peg$FAILED) {\n            s3 = peg$parseWEOL();\n          }\n          if (s3 !== peg$FAILED) {\n            s2 = [s2, s3];\n            s1 = s2;\n          } else {\n            peg$currPos = s1;\n            s1 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n        if (s1 === peg$FAILED) {\n          s1 = peg$parseCardLine_V1();\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f35(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardLine_V1() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$currPos;\n    s3 = peg$parseFooterDividerText();\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseWEOL();\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = peg$parseLine();\n      s5 = peg$parseNL();\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = peg$parseChar();\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = peg$parseChar();\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseEOL();\n          if (s5 !== peg$FAILED) {\n            s4 = [s4, s5];\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f36(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQualifier() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    if (input.substr(peg$currPos, 6) === peg$c9) {\n      s2 = peg$c9;\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s2 === peg$FAILED) {\n      if (input.substr(peg$currPos, 4) === peg$c7) {\n        s2 = peg$c7;\n        peg$currPos += 4;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n    }\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseQualifierName();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f37(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQualifierName() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r1.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parsecardContent() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseTagChain();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseCardChar();\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseTagChain();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseCardChar();\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f38(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardChar() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    if (input.length > peg$currPos) {\n      s1 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f39(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseIDTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c15) {\n      s1 = peg$c15;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseKeyValueTag_Value();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseTag_Close();\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f40(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s1 = peg$c2;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      if (input.charCodeAt(peg$currPos) === 35) {\n        s3 = peg$c16;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          if (input.charCodeAt(peg$currPos) === 35) {\n            s3 = peg$c16;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e20); }\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseTag_Value();\n        s4 = peg$parseTag_CloseOrEOF();\n        if (s4 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f41(s2, s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnchorTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c17) {\n      s1 = peg$c17;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f42(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseReferenceTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c18) {\n      s1 = peg$c18;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f43(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePropertyTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c19) {\n      s1 = peg$c19;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseKeyValueTag_Key();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseKeyValueTag_Value();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseTag_CloseOrEOF();\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f44(s2, s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseItemLeadTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c20) {\n      s1 = peg$c20;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f45(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInstructionTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c21) {\n      s1 = peg$c21;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f46(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseHintTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c22) {\n      s1 = peg$c22;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e26); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f47(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTrueTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c23) {\n      s1 = peg$c23;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e27); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f48(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFalseTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c24) {\n      s1 = peg$c24;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e28); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f49(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSampleSolutionTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c25) {\n      s1 = peg$c25;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f50(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseGapTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c26) {\n      s1 = peg$c26;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e30); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f51(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMarkTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c27) {\n      s1 = peg$c27;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f52(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseResourceTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c28) {\n      s1 = peg$c28;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e32); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseKeyValueTag_Key();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseKeyValueTag_Value();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseTag_CloseOrEOF();\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f53(s2, s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTag_Value() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    if (input.substr(peg$currPos, 2) === peg$c29) {\n      s3 = peg$c29;\n      peg$currPos += 2;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e33); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      if (input.substr(peg$currPos, 2) === peg$c29) {\n        s3 = peg$c29;\n        peg$currPos += 2;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e33); }\n      }\n      if (s3 === peg$FAILED) {\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n    }\n    s1 = input.substring(s1, peg$currPos);\n    peg$savedPos = s0;\n    s1 = peg$f54(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseKeyValueTag_Key() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    if (input.substr(peg$currPos, 3) === peg$c30) {\n      s2 = peg$c30;\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r3.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e35); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r3.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e35); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      peg$savedPos = s0;\n      s0 = peg$f55(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTag_Close() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 93) {\n      s0 = peg$c1;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTag_CloseOrEOF() {\n    let s0, s1, s2;\n\n    if (input.charCodeAt(peg$currPos) === 93) {\n      s0 = peg$c1;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = peg$parseWS();\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parseWS();\n      }\n      s2 = peg$parseEOF();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBit_Level() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    if (input.charCodeAt(peg$currPos) === 46) {\n      s2 = peg$c31;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e36); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        if (input.charCodeAt(peg$currPos) === 46) {\n          s2 = peg$c31;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e36); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f56(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBit_Value() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r4.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e37); }\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = input.charAt(peg$currPos);\n      if (peg$r4.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e37); }\n      }\n    }\n    s1 = input.substring(s1, peg$currPos);\n    peg$savedPos = s0;\n    s1 = peg$f57(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseKeyValueTag_Value() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 58) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      peg$savedPos = s0;\n      s0 = peg$f58(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = '';\n      peg$savedPos = s0;\n      s1 = peg$f59();\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnything() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = [];\n    if (input.length > peg$currPos) {\n      s1 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n    }\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parseChar() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = input.charAt(peg$currPos);\n    if (peg$r5.test(s0)) {\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e38); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLine() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = [];\n    s1 = peg$parseChar();\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = peg$parseChar();\n    }\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    let s0, s1, s2;\n\n    peg$silentFails++;\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r6.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e41); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = input.charAt(peg$currPos);\n      if (peg$r6.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e41); }\n      }\n    }\n    s2 = peg$parseNL();\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e40); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    let s0, s1;\n\n    peg$silentFails++;\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s0 = peg$c32;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e43); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 2) === peg$c33) {\n        s0 = peg$c33;\n        peg$currPos += 2;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e44); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = input.charAt(peg$currPos);\n        if (peg$r7.test(s0)) {\n          peg$currPos++;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e45); }\n        }\n      }\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e42); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWNL() {\n    let s0, s1, s2;\n\n    peg$silentFails++;\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r6.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e41); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = input.charAt(peg$currPos);\n      if (peg$r6.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e41); }\n      }\n    }\n    s2 = peg$parseNL();\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e46); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWS() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = input.charAt(peg$currPos);\n    if (peg$r8.test(s0)) {\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e48); }\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e47); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseEOL() {\n    let s0, s1;\n\n    s0 = peg$parseNL();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWEOL() {\n    let s0, s1;\n\n    s0 = peg$parseWNL();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseEOF() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    peg$silentFails++;\n    if (input.length > peg$currPos) {\n      s1 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    peg$silentFails--;\n    if (s1 === peg$FAILED) {\n      s0 = undefined;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n // PER PARSE JS\n\n//\n// Instance variables\n//\n\n// Create the helper instance (low-level helper functions)\nconst helper = new BitmarkPegParserHelper({\n  parse: peg$parse,\n  parserText: text,\n  parserLocation,\n\n});\n\n// Create the processor instance (semantic processor)\nconst processor = new BitmarkPegParserProcessor({\n  parse: peg$parse,\n  parserText: text,\n  parserLocation,\n});\n\n// Function to remove 'source' from Location object\nfunction parserLocation() {\n  const l = location();\n  if (!l) return l;\n  delete l.source;\n\n  return l;\n}\n\n// Override peg$computeLocation to force the offset flag when computing location\n// (unfortunately not possible in Peggy yet).\nfunction peg$computeLocation(startPos, endPos, offset) {\n  offset = true;\n  var startPosDetails = peg$computePosDetails(startPos);\n  var endPosDetails = peg$computePosDetails(endPos);\n\n  var res = {\n    source: peg$source,\n    start: {\n      offset: startPos,\n      line: startPosDetails.line,\n      column: startPosDetails.column\n    },\n    end: {\n      offset: endPos,\n      line: endPosDetails.line,\n      column: endPosDetails.column\n    }\n  };\n  if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n    res.start = peg$source.offset(res.start);\n    res.end = peg$source.offset(res.end);\n  }\n  return res;\n}\n\n\n  peg$result = peg$startRuleFunction();\n\n  const peg$success = (peg$result !== peg$FAILED && peg$currPos === input.length);\n  function peg$throw() {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? peg$getUnicode(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos,\n      peg$success,\n      peg$throw: peg$success ? undefined : peg$throw,\n    });\n  }\n  if (peg$success) {\n    return peg$result;\n  } else {\n    peg$throw();\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"bitmark\",\n  \"bit\",\n  \"cardContent\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n","import { parse as _parse } from '../../../generated/parser/bitmark/bitmark-peggy-parser.js';\nimport { type BitmarkAst } from '../../../model/ast/Nodes.ts';\n\ninterface ParseOptions {\n  startRule?: string;\n}\ntype Parse = (str: string, options?: ParseOptions) => BitmarkAst;\n\nconst parse: Parse = _parse;\n\nexport { parse };\n","import { type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type BitmarkParserTypeType } from '../../model/enum/BitmarkParserType.ts';\nimport { JsonParser } from '../json/JsonParser.ts';\nimport { parse as bitmarkParse } from './peg/BitmarkPegParser.ts';\n\nexport interface BitmarkParserOptions {\n  parserType?: BitmarkParserTypeType;\n}\n\nclass BitmarkParser {\n  protected jsonParser = new JsonParser();\n\n  /**\n   * Convert Bitmark markup to AST.\n   *\n   * The Bitmark markup should be a string.\n   *\n   * @param json - bitmark JSON as a string or a plain JS object\n   * @param _options - unused\n   * @returns bitmark AST\n   */\n  toAst(bitmark: string, _options?: BitmarkParserOptions): BitmarkAst {\n    // const opts = Object.assign({}, options);\n\n    return bitmarkParse(bitmark);\n  }\n}\n\nexport { BitmarkParser };\n","import { StringWriter } from '../../ast/writer/StringWriter.ts';\nimport { type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type Generator } from '../Generator.ts';\nimport { JsonGenerator, type JsonGeneratorOptions } from './JsonGenerator.ts';\n\n/**\n * Generate bitmark JSON from a bitmark AST as a string\n */\nclass JsonStringGenerator implements Generator<BitmarkAst, string> {\n  private generator: JsonGenerator;\n  private writer: StringWriter;\n\n  /**\n   * Generate bitmark JSON from a bitmark AST as a string\n   *\n   * @param options - JSON generation options\n   */\n  constructor(options?: JsonGeneratorOptions) {\n    this.writer = new StringWriter();\n    this.generator = new JsonGenerator(this.writer, options);\n  }\n\n  /**\n   * Generate bitmark JSON from bitmark AST as a string\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<string> {\n    await this.generator.generate(ast);\n    return this.writer.getString();\n  }\n\n  /**\n   * Generate bitmark JSON from bitmark AST as a string synchronously\n   *\n   * @param ast bitmark AST\n   */\n  public generateSync(ast: BitmarkAst): string {\n    this.generator.generateSync(ast);\n    return this.writer.getString();\n  }\n}\n\nexport { JsonStringGenerator };\n"],"mappings":"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f,QAAM,SAAS;AACf,QAAM,SAAS;AACf,QAAM,SAAS;AACf,QAAM,SAAS;AACf,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QA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","names":["BitType","import_superenum","BitType","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","TextFormat","import_superenum","import_superenum","import_superenum","tags","tags","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","tags","path","objs","clone","import_superenum","tags","BitType","TextFormat","BitType","tags","TextFormat","instance","import_superenum","import_superenum","i","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","TextLocation","import_superenum","TextLocation","Breakscape","TextFormat","TextLocation","Breakscape","instance","import_superenum","instance","BitType","instance","import_superenum","import_superenum","TextFormat","TextLocation","href","s","instance","instance","s","expected","found","start","location","text","offset","TextLocation","instance","instance","instance","TextLocation","TextLocation","instance","import_superenum","instance","document","TextLocation","instance","BitType","instance","TextFormat","BitType","TextLocation","tags","index","path","parser","import_superenum","import_superenum","import_superenum","DEFAULT_OPTIONS","BitType","TextFormat","instance","tags","TextLocation","import_superenum","DEFAULT_OPTIONS","instance","BitType","TextFormat","TextLocation","r","parser","import_superenum","BitType","instance","import_superenum","import_superenum","import_superenum","import_superenum","parser","instance","BitType","TextFormat","import_superenum","import_superenum","instance","TextFormat","TextLocation","parser","value","import_superenum","import_superenum","instance","tags","data","instance","textParser","instance","TextFormat","TextLocation","parser","instance","tags","BitType","__isDefaultExample","example","heading","textParser","TextLocation","instance","TextFormat","textParser","TextFormat","instance","TextLocation","import_superenum","textParser","instance","TextFormat","TextLocation","instance","import_superenum","textParser","TextLocation","instance","TextFormat","instance","import_superenum","instance","tags","import_superenum","tags","instance","TextFormat","TextLocation","textParser","instance","BitType","TextLocation","TextFormat","tags","import_superenum","instance","TextFormat","TextLocation","tags","import_superenum","instance","tags","TextFormat","TextLocation","tags","instance","TextFormat","TextLocation","textParser","tags","instance","TextLocation","tags","instance","tags","instance","TextFormat","TextLocation","textParser","instance","v","TextFormat","TextLocation","instance","TextFormat","TextLocation","import_superenum","instance","tags","TextFormat","TextLocation","textParser","TextLocation","instance","BitType","textParser","instance","TextFormat","TextLocation","instance","BitType","tags","builder","instance","BitType","TextFormat","tags","TextLocation","parser","peg$SyntaxError","s","expected","found","peg$parse","location","text","offset","parse","peg$parse","parse","builder","instance","isString"]}