{"version":3,"file":"./lib/fxparser.min.js","mappings":"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","sources":["webpack://XMLParser/webpack/universalModuleDefinition","webpack://XMLParser/webpack/bootstrap","webpack://XMLParser/webpack/runtime/define property getters","webpack://XMLParser/webpack/runtime/hasOwnProperty shorthand","webpack://XMLParser/webpack/runtime/make namespace object","webpack://XMLParser/./src/util.js","webpack://XMLParser/./src/xmlparser/OptionsBuilder.js","webpack://XMLParser/./src/xmlparser/xmlNode.js","webpack://XMLParser/./src/xmlparser/DocTypeReader.js","webpack://XMLParser/./node_modules/strnum/strnum.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/Matcher.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/Expression.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/ExpressionSet.js","webpack://XMLParser/./node_modules/@nodable/entities/src/entities.js","webpack://XMLParser/./node_modules/@nodable/entities/src/EntityDecoder.js","webpack://XMLParser/./src/xmlparser/OrderedObjParser.js","webpack://XMLParser/./src/ignoreAttributes.js","webpack://XMLParser/./src/xmlparser/node2json.js","webpack://XMLParser/./src/validator.js","webpack://XMLParser/./src/xmlparser/XMLParser.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"XMLParser\"] = factory();\n\telse\n\t\troot[\"XMLParser\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(string, regex) {\n  const matches = [];\n  let match = regex.exec(string);\n  while (match) {\n    const allmatches = [];\n    allmatches.startIndex = regex.lastIndex - match[0].length;\n    const len = match.length;\n    for (let index = 0; index < len; index++) {\n      allmatches.push(match[index]);\n    }\n    matches.push(allmatches);\n    match = regex.exec(string);\n  }\n  return matches;\n}\n\nexport const isName = function (string) {\n  const match = regexName.exec(string);\n  return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n  return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n  return Object.keys(obj).length === 0;\n}\n\nexport function getValue(v) {\n  if (exports.isExist(v)) {\n    return v;\n  } else {\n    return '';\n  }\n}\n\n/**\n * Dangerous property names that could lead to prototype pollution or security issues\n */\nexport const DANGEROUS_PROPERTY_NAMES = [\n  // '__proto__',\n  // 'constructor',\n  // 'prototype',\n  'hasOwnProperty',\n  'toString',\n  'valueOf',\n  '__defineGetter__',\n  '__defineSetter__',\n  '__lookupGetter__',\n  '__lookupSetter__'\n];\n\nexport const criticalProperties = [\"__proto__\", \"constructor\", \"prototype\"];","import { DANGEROUS_PROPERTY_NAMES, criticalProperties } from \"../util.js\";\nimport { COMMON_HTML, CURRENCY } from '@nodable/entities';\n\nconst defaultOnDangerousProperty = (name) => {\n  if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n    return \"__\" + name;\n  }\n  return name;\n};\n\n\nexport const defaultOptions = {\n  preserveOrder: false,\n  attributeNamePrefix: '@_',\n  attributesGroupName: false,\n  textNodeName: '#text',\n  ignoreAttributes: true,\n  removeNSPrefix: false, // remove NS from tag name or attribute name if true\n  allowBooleanAttributes: false, //a tag can have attributes without any value\n  //ignoreRootElement : false,\n  parseTagValue: true,\n  parseAttributeValue: false,\n  trimValues: true, //Trim string values of tag and attributes\n  cdataPropName: false,\n  numberParseOptions: {\n    hex: true,\n    leadingZeros: true,\n    eNotation: true\n  },\n  tagValueProcessor: function (tagName, val) {\n    return val;\n  },\n  attributeValueProcessor: function (attrName, val) {\n    return val;\n  },\n  stopNodes: [], //nested tags will not be parsed even for errors\n  alwaysCreateTextNode: false,\n  isArray: () => false,\n  commentPropName: false,\n  unpairedTags: [],\n  processEntities: true,\n  htmlEntities: false,\n  entityDecoder: null,\n  ignoreDeclaration: false,\n  ignorePiTags: false,\n  transformTagName: false,\n  transformAttributeName: false,\n  updateTag: function (tagName, jPath, attrs) {\n    return tagName\n  },\n  // skipEmptyListItem: false\n  captureMetaData: false,\n  maxNestedTags: 100,\n  strictReservedNames: true,\n  jPath: true, // if true, pass jPath string to callbacks; if false, pass matcher instance\n  onDangerousProperty: defaultOnDangerousProperty\n};\n\n\n/**\n * Validates that a property name is safe to use\n * @param {string} propertyName - The property name to validate\n * @param {string} optionName - The option field name (for error message)\n * @throws {Error} If property name is dangerous\n */\nfunction validatePropertyName(propertyName, optionName) {\n  if (typeof propertyName !== 'string') {\n    return; // Only validate string property names\n  }\n\n  const normalized = propertyName.toLowerCase();\n  if (DANGEROUS_PROPERTY_NAMES.some(dangerous => normalized === dangerous.toLowerCase())) {\n    throw new Error(\n      `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n    );\n  }\n\n  if (criticalProperties.some(dangerous => normalized === dangerous.toLowerCase())) {\n    throw new Error(\n      `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n    );\n  }\n}\n\n/**\n * Normalizes processEntities option for backward compatibility\n * @param {boolean|object} value \n * @returns {object} Always returns normalized object\n */\nfunction normalizeProcessEntities(value, htmlEntities) {\n  // Boolean backward compatibility\n  if (typeof value === 'boolean') {\n    return {\n      enabled: value, // true or false\n      maxEntitySize: 10000,\n      maxExpansionDepth: 10000,\n      maxTotalExpansions: Infinity,\n      maxExpandedLength: 100000,\n      maxEntityCount: 1000,\n      allowedTags: null,\n      tagFilter: null,\n      appliesTo: \"all\",\n    };\n  }\n\n  // Object config - merge with defaults\n  if (typeof value === 'object' && value !== null) {\n    return {\n      enabled: value.enabled !== false,\n      maxEntitySize: Math.max(1, value.maxEntitySize ?? 10000),\n      maxExpansionDepth: Math.max(1, value.maxExpansionDepth ?? 10000),\n      maxTotalExpansions: Math.max(1, value.maxTotalExpansions ?? Infinity),\n      maxExpandedLength: Math.max(1, value.maxExpandedLength ?? 100000),\n      maxEntityCount: Math.max(1, value.maxEntityCount ?? 1000),\n      allowedTags: value.allowedTags ?? null,\n      tagFilter: value.tagFilter ?? null,\n      appliesTo: value.appliesTo ?? \"all\",\n    };\n  }\n\n  // Default to enabled with limits\n  return normalizeProcessEntities(true);\n}\n\nexport const buildOptions = function (options) {\n  const built = Object.assign({}, defaultOptions, options);\n\n  // Validate property names to prevent prototype pollution\n  const propertyNameOptions = [\n    { value: built.attributeNamePrefix, name: 'attributeNamePrefix' },\n    { value: built.attributesGroupName, name: 'attributesGroupName' },\n    { value: built.textNodeName, name: 'textNodeName' },\n    { value: built.cdataPropName, name: 'cdataPropName' },\n    { value: built.commentPropName, name: 'commentPropName' }\n  ];\n\n  for (const { value, name } of propertyNameOptions) {\n    if (value) {\n      validatePropertyName(value, name);\n    }\n  }\n\n  if (built.onDangerousProperty === null) {\n    built.onDangerousProperty = defaultOnDangerousProperty;\n  }\n\n  // Always normalize processEntities for backward compatibility and validation\n  built.processEntities = normalizeProcessEntities(built.processEntities, built.htmlEntities);\n  built.unpairedTagsSet = new Set(built.unpairedTags);\n  // Convert old-style stopNodes for backward compatibility\n  if (built.stopNodes && Array.isArray(built.stopNodes)) {\n    built.stopNodes = built.stopNodes.map(node => {\n      if (typeof node === 'string' && node.startsWith('*.')) {\n        // Old syntax: *.tagname meant \"tagname anywhere\"\n        // Convert to new syntax: ..tagname\n        return '..' + node.substring(2);\n      }\n      return node;\n    });\n  }\n  //console.debug(built.processEntities)\n  return built;\n};","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n  METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n  METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode {\n  constructor(tagname) {\n    this.tagname = tagname;\n    this.child = []; //nested tags, text, cdata, comments in order\n    this[\":@\"] = Object.create(null); //attributes map\n  }\n  add(key, val) {\n    // this.child.push( {name : key, val: val, isCdata: isCdata });\n    if (key === \"__proto__\") key = \"#__proto__\";\n    this.child.push({ [key]: val });\n  }\n  addChild(node, startIndex) {\n    if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n    if (node[\":@\"] && Object.keys(node[\":@\"]).length > 0) {\n      this.child.push({ [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n    } else {\n      this.child.push({ [node.tagname]: node.child });\n    }\n    // if requested, add the startIndex\n    if (startIndex !== undefined) {\n      // Note: for now we just overwrite the metadata. If we had more complex metadata,\n      // we might need to do an object append here:  metadata = { ...metadata, startIndex }\n      this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n    }\n  }\n  /** symbol used for metadata */\n  static getMetaDataSymbol() {\n    return METADATA_SYMBOL;\n  }\n}\n","import { isName } from '../util.js';\n\nexport default class DocTypeReader {\n    constructor(options) {\n        this.suppressValidationErr = !options;\n        this.options = options;\n    }\n\n    readDocType(xmlData, i) {\n        const entities = Object.create(null);\n        let entityCount = 0;\n\n        if (xmlData[i + 3] === 'O' &&\n            xmlData[i + 4] === 'C' &&\n            xmlData[i + 5] === 'T' &&\n            xmlData[i + 6] === 'Y' &&\n            xmlData[i + 7] === 'P' &&\n            xmlData[i + 8] === 'E') {\n            i = i + 9;\n            let angleBracketsCount = 1;\n            let hasBody = false, comment = false;\n            let exp = \"\";\n            for (; i < xmlData.length; i++) {\n                if (xmlData[i] === '<' && !comment) { //Determine the tag type\n                    if (hasBody && hasSeq(xmlData, \"!ENTITY\", i)) {\n                        i += 7;\n                        let entityName, val;\n                        [entityName, val, i] = this.readEntityExp(xmlData, i + 1, this.suppressValidationErr);\n                        if (val.indexOf(\"&\") === -1) { //Parameter entities are not supported\n                            if (this.options.enabled !== false &&\n                                this.options.maxEntityCount != null &&\n                                entityCount >= this.options.maxEntityCount) {\n                                throw new Error(\n                                    `Entity count (${entityCount + 1}) exceeds maximum allowed (${this.options.maxEntityCount})`\n                                );\n                            }\n                            //const escaped = entityName.replace(/[.\\-+*:]/g, '\\\\.');\n                            //const escaped = entityName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n                            entities[entityName] = val;\n                            entityCount++;\n                        }\n                    }\n                    else if (hasBody && hasSeq(xmlData, \"!ELEMENT\", i)) {\n                        i += 8;//Not supported\n                        const { index } = this.readElementExp(xmlData, i + 1);\n                        i = index;\n                    } else if (hasBody && hasSeq(xmlData, \"!ATTLIST\", i)) {\n                        i += 8;//Not supported\n                        // const {index} = this.readAttlistExp(xmlData,i+1);\n                        // i = index;\n                    } else if (hasBody && hasSeq(xmlData, \"!NOTATION\", i)) {\n                        i += 9;//Not supported\n                        const { index } = this.readNotationExp(xmlData, i + 1, this.suppressValidationErr);\n                        i = index;\n                    } else if (hasSeq(xmlData, \"!--\", i)) comment = true;\n                    else throw new Error(`Invalid DOCTYPE`);\n\n                    angleBracketsCount++;\n                    exp = \"\";\n                } else if (xmlData[i] === '>') { //Read tag content\n                    if (comment) {\n                        if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n                            comment = false;\n                            angleBracketsCount--;\n                        }\n                    } else {\n                        angleBracketsCount--;\n                    }\n                    if (angleBracketsCount === 0) {\n                        break;\n                    }\n                } else if (xmlData[i] === '[') {\n                    hasBody = true;\n                } else {\n                    exp += xmlData[i];\n                }\n            }\n            if (angleBracketsCount !== 0) {\n                throw new Error(`Unclosed DOCTYPE`);\n            }\n        } else {\n            throw new Error(`Invalid Tag instead of DOCTYPE`);\n        }\n        return { entities, i };\n    }\n    readEntityExp(xmlData, i) {\n        //External entities are not supported\n        //    <!ENTITY ext SYSTEM \"http://normal-website.com\" >\n\n        //Parameter entities are not supported\n        //    <!ENTITY entityname \"&anotherElement;\">\n\n        //Internal entities are supported\n        //    <!ENTITY entityname \"replacement text\">\n\n        // Skip leading whitespace after <!ENTITY\n        i = skipWhitespace(xmlData, i);\n\n        // Read entity name\n        const startIndex = i;\n        while (i < xmlData.length && !/\\s/.test(xmlData[i]) && xmlData[i] !== '\"' && xmlData[i] !== \"'\") {\n            i++;\n        }\n        let entityName = xmlData.substring(startIndex, i);\n\n        validateEntityName(entityName);\n\n        // Skip whitespace after entity name\n        i = skipWhitespace(xmlData, i);\n\n        // Check for unsupported constructs (external entities or parameter entities)\n        if (!this.suppressValidationErr) {\n            if (xmlData.substring(i, i + 6).toUpperCase() === \"SYSTEM\") {\n                throw new Error(\"External entities are not supported\");\n            } else if (xmlData[i] === \"%\") {\n                throw new Error(\"Parameter entities are not supported\");\n            }\n        }\n\n        // Read entity value (internal entity)\n        let entityValue = \"\";\n        [i, entityValue] = this.readIdentifierVal(xmlData, i, \"entity\");\n\n        // Validate entity size\n        if (this.options.enabled !== false &&\n            this.options.maxEntitySize != null &&\n            entityValue.length > this.options.maxEntitySize) {\n            throw new Error(\n                `Entity \"${entityName}\" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`\n            );\n        }\n\n        i--;\n        return [entityName, entityValue, i];\n    }\n\n    readNotationExp(xmlData, i) {\n        // Skip leading whitespace after <!NOTATION\n        i = skipWhitespace(xmlData, i);\n\n        // Read notation name\n\n        const startIndex = i;\n        while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n            i++;\n        }\n        let notationName = xmlData.substring(startIndex, i);\n\n        !this.suppressValidationErr && validateEntityName(notationName);\n\n        // Skip whitespace after notation name\n        i = skipWhitespace(xmlData, i);\n\n        // Check identifier type (SYSTEM or PUBLIC)\n        const identifierType = xmlData.substring(i, i + 6).toUpperCase();\n        if (!this.suppressValidationErr && identifierType !== \"SYSTEM\" && identifierType !== \"PUBLIC\") {\n            throw new Error(`Expected SYSTEM or PUBLIC, found \"${identifierType}\"`);\n        }\n        i += identifierType.length;\n\n        // Skip whitespace after identifier type\n        i = skipWhitespace(xmlData, i);\n\n        // Read public identifier (if PUBLIC)\n        let publicIdentifier = null;\n        let systemIdentifier = null;\n\n        if (identifierType === \"PUBLIC\") {\n            [i, publicIdentifier] = this.readIdentifierVal(xmlData, i, \"publicIdentifier\");\n\n            // Skip whitespace after public identifier\n            i = skipWhitespace(xmlData, i);\n\n            // Optionally read system identifier\n            if (xmlData[i] === '\"' || xmlData[i] === \"'\") {\n                [i, systemIdentifier] = this.readIdentifierVal(xmlData, i, \"systemIdentifier\");\n            }\n        } else if (identifierType === \"SYSTEM\") {\n            // Read system identifier (mandatory for SYSTEM)\n            [i, systemIdentifier] = this.readIdentifierVal(xmlData, i, \"systemIdentifier\");\n\n            if (!this.suppressValidationErr && !systemIdentifier) {\n                throw new Error(\"Missing mandatory system identifier for SYSTEM notation\");\n            }\n        }\n\n        return { notationName, publicIdentifier, systemIdentifier, index: --i };\n    }\n\n    readIdentifierVal(xmlData, i, type) {\n        let identifierVal = \"\";\n        const startChar = xmlData[i];\n        if (startChar !== '\"' && startChar !== \"'\") {\n            throw new Error(`Expected quoted string, found \"${startChar}\"`);\n        }\n        i++;\n\n        const startIndex = i;\n        while (i < xmlData.length && xmlData[i] !== startChar) {\n            i++;\n        }\n        identifierVal = xmlData.substring(startIndex, i);\n\n        if (xmlData[i] !== startChar) {\n            throw new Error(`Unterminated ${type} value`);\n        }\n        i++;\n        return [i, identifierVal];\n    }\n\n    readElementExp(xmlData, i) {\n        // <!ELEMENT br EMPTY>\n        // <!ELEMENT div ANY>\n        // <!ELEMENT title (#PCDATA)>\n        // <!ELEMENT book (title, author+)>\n        // <!ELEMENT name (content-model)>\n\n        // Skip leading whitespace after <!ELEMENT\n        i = skipWhitespace(xmlData, i);\n\n        // Read element name\n        const startIndex = i;\n        while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n            i++;\n        }\n        let elementName = xmlData.substring(startIndex, i);\n\n        // Validate element name\n        if (!this.suppressValidationErr && !isName(elementName)) {\n            throw new Error(`Invalid element name: \"${elementName}\"`);\n        }\n\n        // Skip whitespace after element name\n        i = skipWhitespace(xmlData, i);\n        let contentModel = \"\";\n        // Expect '(' to start content model\n        if (xmlData[i] === \"E\" && hasSeq(xmlData, \"MPTY\", i)) i += 4;\n        else if (xmlData[i] === \"A\" && hasSeq(xmlData, \"NY\", i)) i += 2;\n        else if (xmlData[i] === \"(\") {\n            i++; // Move past '('\n\n            // Read content model\n            const startIndex = i;\n            while (i < xmlData.length && xmlData[i] !== \")\") {\n                i++;\n            }\n            contentModel = xmlData.substring(startIndex, i);\n\n            if (xmlData[i] !== \")\") {\n                throw new Error(\"Unterminated content model\");\n            }\n\n        } else if (!this.suppressValidationErr) {\n            throw new Error(`Invalid Element Expression, found \"${xmlData[i]}\"`);\n        }\n\n        return {\n            elementName,\n            contentModel: contentModel.trim(),\n            index: i\n        };\n    }\n\n    readAttlistExp(xmlData, i) {\n        // Skip leading whitespace after <!ATTLIST\n        i = skipWhitespace(xmlData, i);\n\n        // Read element name\n        let startIndex = i;\n        while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n            i++;\n        }\n        let elementName = xmlData.substring(startIndex, i);\n\n        // Validate element name\n        validateEntityName(elementName)\n\n        // Skip whitespace after element name\n        i = skipWhitespace(xmlData, i);\n\n        // Read attribute name\n        startIndex = i;\n        while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n            i++;\n        }\n        let attributeName = xmlData.substring(startIndex, i);\n\n        // Validate attribute name\n        if (!validateEntityName(attributeName)) {\n            throw new Error(`Invalid attribute name: \"${attributeName}\"`);\n        }\n\n        // Skip whitespace after attribute name\n        i = skipWhitespace(xmlData, i);\n\n        // Read attribute type\n        let attributeType = \"\";\n        if (xmlData.substring(i, i + 8).toUpperCase() === \"NOTATION\") {\n            attributeType = \"NOTATION\";\n            i += 8; // Move past \"NOTATION\"\n\n            // Skip whitespace after \"NOTATION\"\n            i = skipWhitespace(xmlData, i);\n\n            // Expect '(' to start the list of notations\n            if (xmlData[i] !== \"(\") {\n                throw new Error(`Expected '(', found \"${xmlData[i]}\"`);\n            }\n            i++; // Move past '('\n\n            // Read the list of allowed notations\n            let allowedNotations = [];\n            while (i < xmlData.length && xmlData[i] !== \")\") {\n\n\n                const startIndex = i;\n                while (i < xmlData.length && xmlData[i] !== \"|\" && xmlData[i] !== \")\") {\n                    i++;\n                }\n                let notation = xmlData.substring(startIndex, i);\n\n                // Validate notation name\n                notation = notation.trim();\n                if (!validateEntityName(notation)) {\n                    throw new Error(`Invalid notation name: \"${notation}\"`);\n                }\n\n                allowedNotations.push(notation);\n\n                // Skip '|' separator or exit loop\n                if (xmlData[i] === \"|\") {\n                    i++; // Move past '|'\n                    i = skipWhitespace(xmlData, i); // Skip optional whitespace after '|'\n                }\n            }\n\n            if (xmlData[i] !== \")\") {\n                throw new Error(\"Unterminated list of notations\");\n            }\n            i++; // Move past ')'\n\n            // Store the allowed notations as part of the attribute type\n            attributeType += \" (\" + allowedNotations.join(\"|\") + \")\";\n        } else {\n            // Handle simple types (e.g., CDATA, ID, IDREF, etc.)\n            const startIndex = i;\n            while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n                i++;\n            }\n            attributeType += xmlData.substring(startIndex, i);\n\n            // Validate simple attribute type\n            const validTypes = [\"CDATA\", \"ID\", \"IDREF\", \"IDREFS\", \"ENTITY\", \"ENTITIES\", \"NMTOKEN\", \"NMTOKENS\"];\n            if (!this.suppressValidationErr && !validTypes.includes(attributeType.toUpperCase())) {\n                throw new Error(`Invalid attribute type: \"${attributeType}\"`);\n            }\n        }\n\n        // Skip whitespace after attribute type\n        i = skipWhitespace(xmlData, i);\n\n        // Read default value\n        let defaultValue = \"\";\n        if (xmlData.substring(i, i + 8).toUpperCase() === \"#REQUIRED\") {\n            defaultValue = \"#REQUIRED\";\n            i += 8;\n        } else if (xmlData.substring(i, i + 7).toUpperCase() === \"#IMPLIED\") {\n            defaultValue = \"#IMPLIED\";\n            i += 7;\n        } else {\n            [i, defaultValue] = this.readIdentifierVal(xmlData, i, \"ATTLIST\");\n        }\n\n        return {\n            elementName,\n            attributeName,\n            attributeType,\n            defaultValue,\n            index: i\n        }\n    }\n}\n\n\n\nconst skipWhitespace = (data, index) => {\n    while (index < data.length && /\\s/.test(data[index])) {\n        index++;\n    }\n    return index;\n};\n\n\n\nfunction hasSeq(data, seq, i) {\n    for (let j = 0; j < seq.length; j++) {\n        if (seq[j] !== data[i + j + 1]) return false;\n    }\n    return true;\n}\n\nfunction validateEntityName(name) {\n    if (isName(name))\n        return name;\n    else\n        throw new Error(`Invalid entity name ${name}`);\n}","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/;\n// const octRegex = /^0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\nconst consider = {\n    hex: true,\n    // oct: false,\n    leadingZeros: true,\n    decimalPoint: \"\\.\",\n    eNotation: true,\n    //skipLike: /regex/,\n    infinity: \"original\", // \"null\", \"infinity\" (Infinity type), \"string\" (\"Infinity\" (the string literal))\n};\n\nexport default function toNumber(str, options = {}) {\n    options = Object.assign({}, consider, options);\n    if (!str || typeof str !== \"string\") return str;\n\n    let trimmedStr = str.trim();\n\n    if (trimmedStr.length === 0) return str;\n    else if (options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n    else if (trimmedStr === \"0\") return 0;\n    else if (options.hex && hexRegex.test(trimmedStr)) {\n        return parse_int(trimmedStr, 16);\n        // }else if (options.oct && octRegex.test(str)) {\n        //     return Number.parseInt(val, 8);\n    } else if (!isFinite(trimmedStr)) { //Infinity\n        return handleInfinity(str, Number(trimmedStr), options);\n    } else if (trimmedStr.includes('e') || trimmedStr.includes('E')) { //eNotation\n        return resolveEnotation(str, trimmedStr, options);\n        // }else if (options.parseBin && binRegex.test(str)) {\n        //     return Number.parseInt(val, 2);\n    } else {\n        //separate negative sign, leading zeros, and rest number\n        const match = numRegex.exec(trimmedStr);\n        // +00.123 => [ , '+', '00', '.123', ..\n        if (match) {\n            const sign = match[1] || \"\";\n            const leadingZeros = match[2];\n            let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n            const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n                str[leadingZeros.length + 1] === \".\"\n                : str[leadingZeros.length] === \".\";\n\n            //trim ending zeros for floating number\n            if (!options.leadingZeros //leading zeros are not allowed\n                && (leadingZeros.length > 1\n                    || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))) {\n                // 00, 00.3, +03.24, 03, 03.24\n                return str;\n            }\n            else {//no leading zeros or leading zeros are allowed\n                const num = Number(trimmedStr);\n                const parsedStr = String(num);\n\n                if (num === 0) return num;\n                if (parsedStr.search(/[eE]/) !== -1) { //given number is long and parsed to eNotation\n                    if (options.eNotation) return num;\n                    else return str;\n                } else if (trimmedStr.indexOf(\".\") !== -1) { //floating number\n                    if (parsedStr === \"0\") return num; //0.0\n                    else if (parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n                    else if (parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n                    else return str;\n                }\n\n                let n = leadingZeros ? numTrimmedByZeros : trimmedStr;\n                if (leadingZeros) {\n                    // -009 => -9\n                    return (n === parsedStr) || (sign + n === parsedStr) ? num : str\n                } else {\n                    // +9\n                    return (n === parsedStr) || (n === sign + parsedStr) ? num : str\n                }\n            }\n        } else { //non-numeric string\n            return str;\n        }\n    }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str, trimmedStr, options) {\n    if (!options.eNotation) return str;\n    const notation = trimmedStr.match(eNotationRegx);\n    if (notation) {\n        let sign = notation[1] || \"\";\n        const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n        const leadingZeros = notation[2];\n        const eAdjacentToLeadingZeros = sign ? // 0E.\n            str[leadingZeros.length + 1] === eChar\n            : str[leadingZeros.length] === eChar;\n\n        if (leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n        else if (leadingZeros.length === 1\n            && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)) {\n            return Number(trimmedStr);\n        } else if (leadingZeros.length > 0) {\n            // Has leading zeros — only accept if leadingZeros option allows it\n            if (options.leadingZeros && !eAdjacentToLeadingZeros) {\n                trimmedStr = (notation[1] || \"\") + notation[3];\n                return Number(trimmedStr);\n            } else return str;\n        } else {\n            // No leading zeros — always valid e-notation, parse it\n            return Number(trimmedStr);\n        }\n    } else {\n        return str;\n    }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr) {\n    if (numStr && numStr.indexOf(\".\") !== -1) {//float\n        numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n        if (numStr === \".\") numStr = \"0\";\n        else if (numStr[0] === \".\") numStr = \"0\" + numStr;\n        else if (numStr[numStr.length - 1] === \".\") numStr = numStr.substring(0, numStr.length - 1);\n        return numStr;\n    }\n    return numStr;\n}\n\nfunction parse_int(numStr, base) {\n    //polyfill\n    if (parseInt) return parseInt(numStr, base);\n    else if (Number.parseInt) return Number.parseInt(numStr, base);\n    else if (window && window.parseInt) return window.parseInt(numStr, base);\n    else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}\n\n/**\n * Handle infinite values based on user option\n * @param {string} str - original input string\n * @param {number} num - parsed number (Infinity or -Infinity)\n * @param {object} options - user options\n * @returns {string|number|null} based on infinity option\n */\nfunction handleInfinity(str, num, options) {\n    const isPositive = num === Infinity;\n\n    switch (options.infinity.toLowerCase()) {\n        case \"null\":\n            return null;\n        case \"infinity\":\n            return num; // Return Infinity or -Infinity\n        case \"string\":\n            return isPositive ? \"Infinity\" : \"-Infinity\";\n        case \"original\":\n        default:\n            return str; // Return original string like \"1e1000\"\n    }\n}","import ExpressionSet from \"./ExpressionSet.js\";\n\n/**\n * MatcherView - A lightweight read-only view over a Matcher's internal state.\n *\n * Created once by Matcher and reused across all callbacks. Holds a direct\n * reference to the parent Matcher so it always reflects current parser state\n * with zero copying or freezing overhead.\n *\n * Users receive this via {@link Matcher#readOnly} or directly from parser\n * callbacks. It exposes all query and matching methods but has no mutation\n * methods — misuse is caught at the TypeScript level rather than at runtime.\n *\n * @example\n * const matcher = new Matcher();\n * const view = matcher.readOnly();\n *\n * matcher.push(\"root\", {});\n * view.getCurrentTag(); // \"root\"\n * view.getDepth();      // 1\n */\nexport class MatcherView {\n  /**\n   * @param {Matcher} matcher - The parent Matcher instance to read from.\n   */\n  constructor(matcher) {\n    this._matcher = matcher;\n  }\n\n  /**\n   * Get the path separator used by the parent matcher.\n   * @returns {string}\n   */\n  get separator() {\n    return this._matcher.separator;\n  }\n\n  /**\n   * Get current tag name.\n   * @returns {string|undefined}\n   */\n  getCurrentTag() {\n    const path = this._matcher.path;\n    return path.length > 0 ? path[path.length - 1].tag : undefined;\n  }\n\n  /**\n   * Get current namespace.\n   * @returns {string|undefined}\n   */\n  getCurrentNamespace() {\n    const path = this._matcher.path;\n    return path.length > 0 ? path[path.length - 1].namespace : undefined;\n  }\n\n  /**\n   * Get current node's attribute value.\n   * @param {string} attrName\n   * @returns {*}\n   */\n  getAttrValue(attrName) {\n    const path = this._matcher.path;\n    if (path.length === 0) return undefined;\n    return path[path.length - 1].values?.[attrName];\n  }\n\n  /**\n   * Check if current node has an attribute.\n   * @param {string} attrName\n   * @returns {boolean}\n   */\n  hasAttr(attrName) {\n    const path = this._matcher.path;\n    if (path.length === 0) return false;\n    const current = path[path.length - 1];\n    return current.values !== undefined && attrName in current.values;\n  }\n\n  /**\n   * Get current node's sibling position (child index in parent).\n   * @returns {number}\n   */\n  getPosition() {\n    const path = this._matcher.path;\n    if (path.length === 0) return -1;\n    return path[path.length - 1].position ?? 0;\n  }\n\n  /**\n   * Get current node's repeat counter (occurrence count of this tag name).\n   * @returns {number}\n   */\n  getCounter() {\n    const path = this._matcher.path;\n    if (path.length === 0) return -1;\n    return path[path.length - 1].counter ?? 0;\n  }\n\n  /**\n   * Get current node's sibling index (alias for getPosition).\n   * @returns {number}\n   * @deprecated Use getPosition() or getCounter() instead\n   */\n  getIndex() {\n    return this.getPosition();\n  }\n\n  /**\n   * Get current path depth.\n   * @returns {number}\n   */\n  getDepth() {\n    return this._matcher.path.length;\n  }\n\n  /**\n   * Get path as string.\n   * @param {string} [separator] - Optional separator (uses default if not provided)\n   * @param {boolean} [includeNamespace=true]\n   * @returns {string}\n   */\n  toString(separator, includeNamespace = true) {\n    return this._matcher.toString(separator, includeNamespace);\n  }\n\n  /**\n   * Get path as array of tag names.\n   * @returns {string[]}\n   */\n  toArray() {\n    return this._matcher.path.map(n => n.tag);\n  }\n\n  /**\n   * Match current path against an Expression.\n   * @param {Expression} expression\n   * @returns {boolean}\n   */\n  matches(expression) {\n    return this._matcher.matches(expression);\n  }\n\n  /**\n   * Match any expression in the given set against the current path.\n   * @param {ExpressionSet} exprSet\n   * @returns {boolean}\n   */\n  matchesAny(exprSet) {\n    return exprSet.matchesAny(this._matcher);\n  }\n}\n\n/**\n * Matcher - Tracks current path in XML/JSON tree and matches against Expressions.\n *\n * The matcher maintains a stack of nodes representing the current path from root to\n * current tag. It only stores attribute values for the current (top) node to minimize\n * memory usage. Sibling tracking is used to auto-calculate position and counter.\n *\n * Use {@link Matcher#readOnly} to obtain a {@link MatcherView} safe to pass to\n * user callbacks — it always reflects current state with no Proxy overhead.\n *\n * @example\n * const matcher = new Matcher();\n * matcher.push(\"root\", {});\n * matcher.push(\"users\", {});\n * matcher.push(\"user\", { id: \"123\", type: \"admin\" });\n *\n * const expr = new Expression(\"root.users.user\");\n * matcher.matches(expr); // true\n */\nexport default class Matcher {\n  /**\n   * Create a new Matcher.\n   * @param {Object} [options={}]\n   * @param {string} [options.separator='.'] - Default path separator\n   */\n  constructor(options = {}) {\n    this.separator = options.separator || '.';\n    this.path = [];\n    this.siblingStacks = [];\n    // Each path node: { tag, values, position, counter, namespace? }\n    // values only present for current (last) node\n    // Each siblingStacks entry: Map<tagName, count> tracking occurrences at each level\n    this._pathStringCache = null;\n    this._view = new MatcherView(this);\n  }\n\n  /**\n   * Push a new tag onto the path.\n   * @param {string} tagName\n   * @param {Object|null} [attrValues=null]\n   * @param {string|null} [namespace=null]\n   */\n  push(tagName, attrValues = null, namespace = null) {\n    this._pathStringCache = null;\n\n    // Remove values from previous current node (now becoming ancestor)\n    if (this.path.length > 0) {\n      this.path[this.path.length - 1].values = undefined;\n    }\n\n    // Get or create sibling tracking for current level\n    const currentLevel = this.path.length;\n    if (!this.siblingStacks[currentLevel]) {\n      this.siblingStacks[currentLevel] = new Map();\n    }\n\n    const siblings = this.siblingStacks[currentLevel];\n\n    // Create a unique key for sibling tracking that includes namespace\n    const siblingKey = namespace ? `${namespace}:${tagName}` : tagName;\n\n    // Calculate counter (how many times this tag appeared at this level)\n    const counter = siblings.get(siblingKey) || 0;\n\n    // Calculate position (total children at this level so far)\n    let position = 0;\n    for (const count of siblings.values()) {\n      position += count;\n    }\n\n    // Update sibling count for this tag\n    siblings.set(siblingKey, counter + 1);\n\n    // Create new node\n    const node = {\n      tag: tagName,\n      position: position,\n      counter: counter\n    };\n\n    if (namespace !== null && namespace !== undefined) {\n      node.namespace = namespace;\n    }\n\n    if (attrValues !== null && attrValues !== undefined) {\n      node.values = attrValues;\n    }\n\n    this.path.push(node);\n  }\n\n  /**\n   * Pop the last tag from the path.\n   * @returns {Object|undefined} The popped node\n   */\n  pop() {\n    if (this.path.length === 0) return undefined;\n    this._pathStringCache = null;\n\n    const node = this.path.pop();\n\n    if (this.siblingStacks.length > this.path.length + 1) {\n      this.siblingStacks.length = this.path.length + 1;\n    }\n\n    return node;\n  }\n\n  /**\n   * Update current node's attribute values.\n   * Useful when attributes are parsed after push.\n   * @param {Object} attrValues\n   */\n  updateCurrent(attrValues) {\n    if (this.path.length > 0) {\n      const current = this.path[this.path.length - 1];\n      if (attrValues !== null && attrValues !== undefined) {\n        current.values = attrValues;\n      }\n    }\n  }\n\n  /**\n   * Get current tag name.\n   * @returns {string|undefined}\n   */\n  getCurrentTag() {\n    return this.path.length > 0 ? this.path[this.path.length - 1].tag : undefined;\n  }\n\n  /**\n   * Get current namespace.\n   * @returns {string|undefined}\n   */\n  getCurrentNamespace() {\n    return this.path.length > 0 ? this.path[this.path.length - 1].namespace : undefined;\n  }\n\n  /**\n   * Get current node's attribute value.\n   * @param {string} attrName\n   * @returns {*}\n   */\n  getAttrValue(attrName) {\n    if (this.path.length === 0) return undefined;\n    return this.path[this.path.length - 1].values?.[attrName];\n  }\n\n  /**\n   * Check if current node has an attribute.\n   * @param {string} attrName\n   * @returns {boolean}\n   */\n  hasAttr(attrName) {\n    if (this.path.length === 0) return false;\n    const current = this.path[this.path.length - 1];\n    return current.values !== undefined && attrName in current.values;\n  }\n\n  /**\n   * Get current node's sibling position (child index in parent).\n   * @returns {number}\n   */\n  getPosition() {\n    if (this.path.length === 0) return -1;\n    return this.path[this.path.length - 1].position ?? 0;\n  }\n\n  /**\n   * Get current node's repeat counter (occurrence count of this tag name).\n   * @returns {number}\n   */\n  getCounter() {\n    if (this.path.length === 0) return -1;\n    return this.path[this.path.length - 1].counter ?? 0;\n  }\n\n  /**\n   * Get current node's sibling index (alias for getPosition).\n   * @returns {number}\n   * @deprecated Use getPosition() or getCounter() instead\n   */\n  getIndex() {\n    return this.getPosition();\n  }\n\n  /**\n   * Get current path depth.\n   * @returns {number}\n   */\n  getDepth() {\n    return this.path.length;\n  }\n\n  /**\n   * Get path as string.\n   * @param {string} [separator] - Optional separator (uses default if not provided)\n   * @param {boolean} [includeNamespace=true]\n   * @returns {string}\n   */\n  toString(separator, includeNamespace = true) {\n    const sep = separator || this.separator;\n    const isDefault = (sep === this.separator && includeNamespace === true);\n\n    if (isDefault) {\n      if (this._pathStringCache !== null) {\n        return this._pathStringCache;\n      }\n      const result = this.path.map(n =>\n        (n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n      ).join(sep);\n      this._pathStringCache = result;\n      return result;\n    }\n\n    return this.path.map(n =>\n      (includeNamespace && n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n    ).join(sep);\n  }\n\n  /**\n   * Get path as array of tag names.\n   * @returns {string[]}\n   */\n  toArray() {\n    return this.path.map(n => n.tag);\n  }\n\n  /**\n   * Reset the path to empty.\n   */\n  reset() {\n    this._pathStringCache = null;\n    this.path = [];\n    this.siblingStacks = [];\n  }\n\n  /**\n   * Match current path against an Expression.\n   * @param {Expression} expression\n   * @returns {boolean}\n   */\n  matches(expression) {\n    const segments = expression.segments;\n\n    if (segments.length === 0) {\n      return false;\n    }\n\n    if (expression.hasDeepWildcard()) {\n      return this._matchWithDeepWildcard(segments);\n    }\n\n    return this._matchSimple(segments);\n  }\n\n  /**\n   * @private\n   */\n  _matchSimple(segments) {\n    if (this.path.length !== segments.length) {\n      return false;\n    }\n\n    for (let i = 0; i < segments.length; i++) {\n      if (!this._matchSegment(segments[i], this.path[i], i === this.path.length - 1)) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * @private\n   */\n  _matchWithDeepWildcard(segments) {\n    let pathIdx = this.path.length - 1;\n    let segIdx = segments.length - 1;\n\n    while (segIdx >= 0 && pathIdx >= 0) {\n      const segment = segments[segIdx];\n\n      if (segment.type === 'deep-wildcard') {\n        segIdx--;\n\n        if (segIdx < 0) {\n          return true;\n        }\n\n        const nextSeg = segments[segIdx];\n        let found = false;\n\n        for (let i = pathIdx; i >= 0; i--) {\n          if (this._matchSegment(nextSeg, this.path[i], i === this.path.length - 1)) {\n            pathIdx = i - 1;\n            segIdx--;\n            found = true;\n            break;\n          }\n        }\n\n        if (!found) {\n          return false;\n        }\n      } else {\n        if (!this._matchSegment(segment, this.path[pathIdx], pathIdx === this.path.length - 1)) {\n          return false;\n        }\n        pathIdx--;\n        segIdx--;\n      }\n    }\n\n    return segIdx < 0;\n  }\n\n  /**\n   * @private\n   */\n  _matchSegment(segment, node, isCurrentNode) {\n    if (segment.tag !== '*' && segment.tag !== node.tag) {\n      return false;\n    }\n\n    if (segment.namespace !== undefined) {\n      if (segment.namespace !== '*' && segment.namespace !== node.namespace) {\n        return false;\n      }\n    }\n\n    if (segment.attrName !== undefined) {\n      if (!isCurrentNode) {\n        return false;\n      }\n\n      if (!node.values || !(segment.attrName in node.values)) {\n        return false;\n      }\n\n      if (segment.attrValue !== undefined) {\n        if (String(node.values[segment.attrName]) !== String(segment.attrValue)) {\n          return false;\n        }\n      }\n    }\n\n    if (segment.position !== undefined) {\n      if (!isCurrentNode) {\n        return false;\n      }\n\n      const counter = node.counter ?? 0;\n\n      if (segment.position === 'first' && counter !== 0) {\n        return false;\n      } else if (segment.position === 'odd' && counter % 2 !== 1) {\n        return false;\n      } else if (segment.position === 'even' && counter % 2 !== 0) {\n        return false;\n      } else if (segment.position === 'nth' && counter !== segment.positionValue) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Match any expression in the given set against the current path.\n   * @param {ExpressionSet} exprSet\n   * @returns {boolean}\n   */\n  matchesAny(exprSet) {\n    return exprSet.matchesAny(this);\n  }\n\n  /**\n   * Create a snapshot of current state.\n   * @returns {Object}\n   */\n  snapshot() {\n    return {\n      path: this.path.map(node => ({ ...node })),\n      siblingStacks: this.siblingStacks.map(map => new Map(map))\n    };\n  }\n\n  /**\n   * Restore state from snapshot.\n   * @param {Object} snapshot\n   */\n  restore(snapshot) {\n    this._pathStringCache = null;\n    this.path = snapshot.path.map(node => ({ ...node }));\n    this.siblingStacks = snapshot.siblingStacks.map(map => new Map(map));\n  }\n\n  /**\n   * Return the read-only {@link MatcherView} for this matcher.\n   *\n   * The same instance is returned on every call — no allocation occurs.\n   * It always reflects the current parser state and is safe to pass to\n   * user callbacks without risk of accidental mutation.\n   *\n   * @returns {MatcherView}\n   *\n   * @example\n   * const view = matcher.readOnly();\n   * // pass view to callbacks — it stays in sync automatically\n   * view.matches(expr);       // ✓\n   * view.getCurrentTag();     // ✓\n   * // view.push(...)         // ✗ method does not exist — caught by TypeScript\n   */\n  readOnly() {\n    return this._view;\n  }\n}","/**\n * Expression - Parses and stores a tag pattern expression\n * \n * Patterns are parsed once and stored in an optimized structure for fast matching.\n * \n * @example\n * const expr = new Expression(\"root.users.user\");\n * const expr2 = new Expression(\"..user[id]:first\");\n * const expr3 = new Expression(\"root/users/user\", { separator: '/' });\n */\nexport default class Expression {\n  /**\n   * Create a new Expression\n   * @param {string} pattern - Pattern string (e.g., \"root.users.user\", \"..user[id]\")\n   * @param {Object} options - Configuration options\n   * @param {string} options.separator - Path separator (default: '.')\n   */\n  constructor(pattern, options = {}, data) {\n    this.pattern = pattern;\n    this.separator = options.separator || '.';\n    this.segments = this._parse(pattern);\n    this.data = data;\n    // Cache expensive checks for performance (O(1) instead of O(n))\n    this._hasDeepWildcard = this.segments.some(seg => seg.type === 'deep-wildcard');\n    this._hasAttributeCondition = this.segments.some(seg => seg.attrName !== undefined);\n    this._hasPositionSelector = this.segments.some(seg => seg.position !== undefined);\n  }\n\n  /**\n   * Parse pattern string into segments\n   * @private\n   * @param {string} pattern - Pattern to parse\n   * @returns {Array} Array of segment objects\n   */\n  _parse(pattern) {\n    const segments = [];\n\n    // Split by separator but handle \"..\" specially\n    let i = 0;\n    let currentPart = '';\n\n    while (i < pattern.length) {\n      if (pattern[i] === this.separator) {\n        // Check if next char is also separator (deep wildcard)\n        if (i + 1 < pattern.length && pattern[i + 1] === this.separator) {\n          // Flush current part if any\n          if (currentPart.trim()) {\n            segments.push(this._parseSegment(currentPart.trim()));\n            currentPart = '';\n          }\n          // Add deep wildcard\n          segments.push({ type: 'deep-wildcard' });\n          i += 2; // Skip both separators\n        } else {\n          // Regular separator\n          if (currentPart.trim()) {\n            segments.push(this._parseSegment(currentPart.trim()));\n          }\n          currentPart = '';\n          i++;\n        }\n      } else {\n        currentPart += pattern[i];\n        i++;\n      }\n    }\n\n    // Flush remaining part\n    if (currentPart.trim()) {\n      segments.push(this._parseSegment(currentPart.trim()));\n    }\n\n    return segments;\n  }\n\n  /**\n   * Parse a single segment\n   * @private\n   * @param {string} part - Segment string (e.g., \"user\", \"ns::user\", \"user[id]\", \"ns::user:first\")\n   * @returns {Object} Segment object\n   */\n  _parseSegment(part) {\n    const segment = { type: 'tag' };\n\n    // NEW NAMESPACE SYNTAX (v2.0):\n    // ============================\n    // Namespace uses DOUBLE colon (::)\n    // Position uses SINGLE colon (:)\n    // \n    // Examples:\n    //   \"user\"              → tag\n    //   \"user:first\"        → tag + position\n    //   \"user[id]\"          → tag + attribute\n    //   \"user[id]:first\"    → tag + attribute + position\n    //   \"ns::user\"          → namespace + tag\n    //   \"ns::user:first\"    → namespace + tag + position\n    //   \"ns::user[id]\"      → namespace + tag + attribute\n    //   \"ns::user[id]:first\" → namespace + tag + attribute + position\n    //   \"ns::first\"         → namespace + tag named \"first\" (NO ambiguity!)\n    //\n    // This eliminates all ambiguity:\n    //   :: = namespace separator\n    //   :  = position selector\n    //   [] = attributes\n\n    // Step 1: Extract brackets [attr] or [attr=value]\n    let bracketContent = null;\n    let withoutBrackets = part;\n\n    const bracketMatch = part.match(/^([^\\[]+)(\\[[^\\]]*\\])(.*)$/);\n    if (bracketMatch) {\n      withoutBrackets = bracketMatch[1] + bracketMatch[3];\n      if (bracketMatch[2]) {\n        const content = bracketMatch[2].slice(1, -1);\n        if (content) {\n          bracketContent = content;\n        }\n      }\n    }\n\n    // Step 2: Check for namespace (double colon ::)\n    let namespace = undefined;\n    let tagAndPosition = withoutBrackets;\n\n    if (withoutBrackets.includes('::')) {\n      const nsIndex = withoutBrackets.indexOf('::');\n      namespace = withoutBrackets.substring(0, nsIndex).trim();\n      tagAndPosition = withoutBrackets.substring(nsIndex + 2).trim(); // Skip ::\n\n      if (!namespace) {\n        throw new Error(`Invalid namespace in pattern: ${part}`);\n      }\n    }\n\n    // Step 3: Parse tag and position (single colon :)\n    let tag = undefined;\n    let positionMatch = null;\n\n    if (tagAndPosition.includes(':')) {\n      const colonIndex = tagAndPosition.lastIndexOf(':'); // Use last colon for position\n      const tagPart = tagAndPosition.substring(0, colonIndex).trim();\n      const posPart = tagAndPosition.substring(colonIndex + 1).trim();\n\n      // Verify position is a valid keyword\n      const isPositionKeyword = ['first', 'last', 'odd', 'even'].includes(posPart) ||\n        /^nth\\(\\d+\\)$/.test(posPart);\n\n      if (isPositionKeyword) {\n        tag = tagPart;\n        positionMatch = posPart;\n      } else {\n        // Not a valid position keyword, treat whole thing as tag\n        tag = tagAndPosition;\n      }\n    } else {\n      tag = tagAndPosition;\n    }\n\n    if (!tag) {\n      throw new Error(`Invalid segment pattern: ${part}`);\n    }\n\n    segment.tag = tag;\n    if (namespace) {\n      segment.namespace = namespace;\n    }\n\n    // Step 4: Parse attributes\n    if (bracketContent) {\n      if (bracketContent.includes('=')) {\n        const eqIndex = bracketContent.indexOf('=');\n        segment.attrName = bracketContent.substring(0, eqIndex).trim();\n        segment.attrValue = bracketContent.substring(eqIndex + 1).trim();\n      } else {\n        segment.attrName = bracketContent.trim();\n      }\n    }\n\n    // Step 5: Parse position selector\n    if (positionMatch) {\n      const nthMatch = positionMatch.match(/^nth\\((\\d+)\\)$/);\n      if (nthMatch) {\n        segment.position = 'nth';\n        segment.positionValue = parseInt(nthMatch[1], 10);\n      } else {\n        segment.position = positionMatch;\n      }\n    }\n\n    return segment;\n  }\n\n  /**\n   * Get the number of segments\n   * @returns {number}\n   */\n  get length() {\n    return this.segments.length;\n  }\n\n  /**\n   * Check if expression contains deep wildcard\n   * @returns {boolean}\n   */\n  hasDeepWildcard() {\n    return this._hasDeepWildcard;\n  }\n\n  /**\n   * Check if expression has attribute conditions\n   * @returns {boolean}\n   */\n  hasAttributeCondition() {\n    return this._hasAttributeCondition;\n  }\n\n  /**\n   * Check if expression has position selectors\n   * @returns {boolean}\n   */\n  hasPositionSelector() {\n    return this._hasPositionSelector;\n  }\n\n  /**\n   * Get string representation\n   * @returns {string}\n   */\n  toString() {\n    return this.pattern;\n  }\n}","/**\n * ExpressionSet - An indexed collection of Expressions for efficient bulk matching\n *\n * Instead of iterating all expressions on every tag, ExpressionSet pre-indexes\n * them at insertion time by depth and terminal tag name. At match time, only\n * the relevant bucket is evaluated — typically reducing checks from O(E) to O(1)\n * lookup plus O(small bucket) matches.\n *\n * Three buckets are maintained:\n *  - `_byDepthAndTag`  — exact depth + exact tag name  (tightest, used first)\n *  - `_wildcardByDepth` — exact depth + wildcard tag `*` (depth-matched only)\n *  - `_deepWildcards`  — expressions containing `..`  (cannot be depth-indexed)\n *\n * @example\n * import { Expression, ExpressionSet } from 'fast-xml-tagger';\n *\n * // Build once at config time\n * const stopNodes = new ExpressionSet();\n * stopNodes.add(new Expression('root.users.user'));\n * stopNodes.add(new Expression('root.config.setting'));\n * stopNodes.add(new Expression('..script'));\n *\n * // Query on every tag — hot path\n * if (stopNodes.matchesAny(matcher)) { ... }\n */\nexport default class ExpressionSet {\n  constructor() {\n    /** @type {Map<string, import('./Expression.js').default[]>} depth:tag → expressions */\n    this._byDepthAndTag = new Map();\n\n    /** @type {Map<number, import('./Expression.js').default[]>} depth → wildcard-tag expressions */\n    this._wildcardByDepth = new Map();\n\n    /** @type {import('./Expression.js').default[]} expressions containing deep wildcard (..) */\n    this._deepWildcards = [];\n\n    /** @type {Set<string>} pattern strings already added — used for deduplication */\n    this._patterns = new Set();\n\n    /** @type {boolean} whether the set is sealed against further additions */\n    this._sealed = false;\n  }\n\n  /**\n   * Add an Expression to the set.\n   * Duplicate patterns (same pattern string) are silently ignored.\n   *\n   * @param {import('./Expression.js').default} expression - A pre-constructed Expression instance\n   * @returns {this} for chaining\n   * @throws {TypeError} if called after seal()\n   *\n   * @example\n   * set.add(new Expression('root.users.user'));\n   * set.add(new Expression('..script'));\n   */\n  add(expression) {\n    if (this._sealed) {\n      throw new TypeError(\n        'ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.'\n      );\n    }\n\n    // Deduplicate by pattern string\n    if (this._patterns.has(expression.pattern)) return this;\n    this._patterns.add(expression.pattern);\n\n    if (expression.hasDeepWildcard()) {\n      this._deepWildcards.push(expression);\n      return this;\n    }\n\n    const depth = expression.length;\n    const lastSeg = expression.segments[expression.segments.length - 1];\n    const tag = lastSeg?.tag;\n\n    if (!tag || tag === '*') {\n      // Can index by depth but not by tag\n      if (!this._wildcardByDepth.has(depth)) this._wildcardByDepth.set(depth, []);\n      this._wildcardByDepth.get(depth).push(expression);\n    } else {\n      // Tightest bucket: depth + tag\n      const key = `${depth}:${tag}`;\n      if (!this._byDepthAndTag.has(key)) this._byDepthAndTag.set(key, []);\n      this._byDepthAndTag.get(key).push(expression);\n    }\n\n    return this;\n  }\n\n  /**\n   * Add multiple expressions at once.\n   *\n   * @param {import('./Expression.js').default[]} expressions - Array of Expression instances\n   * @returns {this} for chaining\n   *\n   * @example\n   * set.addAll([\n   *   new Expression('root.users.user'),\n   *   new Expression('root.config.setting'),\n   * ]);\n   */\n  addAll(expressions) {\n    for (const expr of expressions) this.add(expr);\n    return this;\n  }\n\n  /**\n   * Check whether a pattern string is already present in the set.\n   *\n   * @param {import('./Expression.js').default} expression\n   * @returns {boolean}\n   */\n  has(expression) {\n    return this._patterns.has(expression.pattern);\n  }\n\n  /**\n   * Number of expressions in the set.\n   * @type {number}\n   */\n  get size() {\n    return this._patterns.size;\n  }\n\n  /**\n   * Seal the set against further modifications.\n   * Useful to prevent accidental mutations after config is built.\n   * Calling add() or addAll() on a sealed set throws a TypeError.\n   *\n   * @returns {this}\n   */\n  seal() {\n    this._sealed = true;\n    return this;\n  }\n\n  /**\n   * Whether the set has been sealed.\n   * @type {boolean}\n   */\n  get isSealed() {\n    return this._sealed;\n  }\n\n  /**\n   * Test whether the matcher's current path matches any expression in the set.\n   *\n   * Evaluation order (cheapest → most expensive):\n   *  1. Exact depth + tag bucket  — O(1) lookup, typically 0–2 expressions\n   *  2. Depth-only wildcard bucket — O(1) lookup, rare\n   *  3. Deep-wildcard list         — always checked, but usually small\n   *\n   * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n   * @returns {boolean} true if any expression matches the current path\n   *\n   * @example\n   * if (stopNodes.matchesAny(matcher)) {\n   *   // handle stop node\n   * }\n   */\n  matchesAny(matcher) {\n    return this.findMatch(matcher) !== null;\n  }\n  /**\n * Find and return the first Expression that matches the matcher's current path.\n *\n * Uses the same evaluation order as matchesAny (cheapest → most expensive):\n *  1. Exact depth + tag bucket\n *  2. Depth-only wildcard bucket\n *  3. Deep-wildcard list\n *\n * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n * @returns {import('./Expression.js').default | null} the first matching Expression, or null\n *\n * @example\n * const expr = stopNodes.findMatch(matcher);\n * if (expr) {\n *   // access expr.config, expr.pattern, etc.\n * }\n */\n  findMatch(matcher) {\n    const depth = matcher.getDepth();\n    const tag = matcher.getCurrentTag();\n\n    // 1. Tightest bucket — most expressions live here\n    const exactKey = `${depth}:${tag}`;\n    const exactBucket = this._byDepthAndTag.get(exactKey);\n    if (exactBucket) {\n      for (let i = 0; i < exactBucket.length; i++) {\n        if (matcher.matches(exactBucket[i])) return exactBucket[i];\n      }\n    }\n\n    // 2. Depth-matched wildcard-tag expressions\n    const wildcardBucket = this._wildcardByDepth.get(depth);\n    if (wildcardBucket) {\n      for (let i = 0; i < wildcardBucket.length; i++) {\n        if (matcher.matches(wildcardBucket[i])) return wildcardBucket[i];\n      }\n    }\n\n    // 3. Deep wildcards — cannot be pre-filtered by depth or tag\n    for (let i = 0; i < this._deepWildcards.length; i++) {\n      if (matcher.matches(this._deepWildcards[i])) return this._deepWildcards[i];\n    }\n\n    return null;\n  }\n}\n","// ---------------------------------------------------------------------------\n// Complete HTML5 named entity reference\n// Organized by logical categories for easy maintenance and selective importing\n// ---------------------------------------------------------------------------\n\n/**\n * Basic Latin & Special Characters\n * @type {Record<string, string>}\n */\nexport const BASIC_LATIN = {\n  amp: '&',\n  AMP: '&',\n  lt: '<',\n  LT: '<',\n  gt: '>',\n  GT: '>',\n  quot: '\"',\n  QUOT: '\"',\n  apos: \"'\",\n  lsquo: '‘',\n  rsquo: '’',\n  ldquo: '“',\n  rdquo: '”',\n  lsquor: '‚',\n  rsquor: '’',\n  ldquor: '„',\n  bdquo: '„',\n  comma: ',',\n  period: '.',\n  colon: ':',\n  semi: ';',\n  excl: '!',\n  quest: '?',\n  num: '#',\n  dollar: '$',\n  percent: '%',\n  amp: '&',\n  ast: '*',\n  commat: '@',\n  lowbar: '_',\n  verbar: '|',\n  vert: '|',\n  sol: '/',\n  bsol: '\\\\',\n  lbrace: '{',\n  rbrace: '}',\n  lbrack: '[',\n  rbrack: ']',\n  lpar: '(',\n  rpar: ')',\n  nbsp: '\\u00a0',\n  iexcl: '¡',\n  cent: '¢',\n  pound: '£',\n  curren: '¤',\n  yen: '¥',\n  brvbar: '¦',\n  sect: '§',\n  uml: '¨',\n  copy: '©',\n  COPY: '©',\n  ordf: 'ª',\n  laquo: '«',\n  not: '¬',\n  shy: '\\u00ad',\n  reg: '®',\n  REG: '®',\n  macr: '¯',\n  deg: '°',\n  plusmn: '±',\n  sup2: '²',\n  sup3: '³',\n  acute: '´',\n  micro: 'µ',\n  para: '¶',\n  middot: '·',\n  cedil: '¸',\n  sup1: '¹',\n  ordm: 'º',\n  raquo: '»',\n  frac14: '¼',\n  frac12: '½',\n  half: '½',\n  frac34: '¾',\n  iquest: '¿',\n  times: '×',\n  div: '÷',\n  divide: '÷',\n};\n\n/**\n * Latin Extended & Accented Letters (A-Z)\n * @type {Record<string, string>}\n */\nexport const LATIN_ACCENTS = {\n  Agrave: 'À',\n  agrave: 'à',\n  Aacute: 'Á',\n  aacute: 'á',\n  Acirc: 'Â',\n  acirc: 'â',\n  Atilde: 'Ã',\n  atilde: 'ã',\n  Auml: 'Ä',\n  auml: 'ä',\n  Aring: 'Å',\n  aring: 'å',\n  AElig: 'Æ',\n  aelig: 'æ',\n  Ccedil: 'Ç',\n  ccedil: 'ç',\n  Egrave: 'È',\n  egrave: 'è',\n  Eacute: 'É',\n  eacute: 'é',\n  Ecirc: 'Ê',\n  ecirc: 'ê',\n  Euml: 'Ë',\n  euml: 'ë',\n  Igrave: 'Ì',\n  igrave: 'ì',\n  Iacute: 'Í',\n  iacute: 'í',\n  Icirc: 'Î',\n  icirc: 'î',\n  Iuml: 'Ï',\n  iuml: 'ï',\n  ETH: 'Ð',\n  eth: 'ð',\n  Ntilde: 'Ñ',\n  ntilde: 'ñ',\n  Ograve: 'Ò',\n  ograve: 'ò',\n  Oacute: 'Ó',\n  oacute: 'ó',\n  Ocirc: 'Ô',\n  ocirc: 'ô',\n  Otilde: 'Õ',\n  otilde: 'õ',\n  Ouml: 'Ö',\n  ouml: 'ö',\n  Oslash: 'Ø',\n  oslash: 'ø',\n  Ugrave: 'Ù',\n  ugrave: 'ù',\n  Uacute: 'Ú',\n  uacute: 'ú',\n  Ucirc: 'Û',\n  ucirc: 'û',\n  Uuml: 'Ü',\n  uuml: 'ü',\n  Yacute: 'Ý',\n  yacute: 'ý',\n  THORN: 'Þ',\n  thorn: 'þ',\n  szlig: 'ß',\n  yuml: 'ÿ',\n  Yuml: 'Ÿ',\n};\n\n/**\n * Latin Extended (Letters with diacritics)\n * @type {Record<string, string>}\n */\nexport const LATIN_EXTENDED = {\n  Amacr: 'Ā',\n  amacr: 'ā',\n  Abreve: 'Ă',\n  abreve: 'ă',\n  Aogon: 'Ą',\n  aogon: 'ą',\n  Cacute: 'Ć',\n  cacute: 'ć',\n  Ccirc: 'Ĉ',\n  ccirc: 'ĉ',\n  Cdot: 'Ċ',\n  cdot: 'ċ',\n  Ccaron: 'Č',\n  ccaron: 'č',\n  Dcaron: 'Ď',\n  dcaron: 'ď',\n  Dstrok: 'Đ',\n  dstrok: 'đ',\n  Emacr: 'Ē',\n  emacr: 'ē',\n  Ecaron: 'Ě',\n  ecaron: 'ě',\n  Edot: 'Ė',\n  edot: 'ė',\n  Eogon: 'Ę',\n  eogon: 'ę',\n  Gcirc: 'Ĝ',\n  gcirc: 'ĝ',\n  Gbreve: 'Ğ',\n  gbreve: 'ğ',\n  Gdot: 'Ġ',\n  gdot: 'ġ',\n  Gcedil: 'Ģ',\n  Hcirc: 'Ĥ',\n  hcirc: 'ĥ',\n  Hstrok: 'Ħ',\n  hstrok: 'ħ',\n  Itilde: 'Ĩ',\n  itilde: 'ĩ',\n  Imacr: 'Ī',\n  imacr: 'ī',\n  Iogon: 'Į',\n  iogon: 'į',\n  Idot: 'İ',\n  IJlig: 'Ĳ',\n  ijlig: 'ĳ',\n  Jcirc: 'Ĵ',\n  jcirc: 'ĵ',\n  Kcedil: 'Ķ',\n  kcedil: 'ķ',\n  kgreen: 'ĸ',\n  Lacute: 'Ĺ',\n  lacute: 'ĺ',\n  Lcedil: 'Ļ',\n  lcedil: 'ļ',\n  Lcaron: 'Ľ',\n  lcaron: 'ľ',\n  Lmidot: 'Ŀ',\n  lmidot: 'ŀ',\n  Lstrok: 'Ł',\n  lstrok: 'ł',\n  Nacute: 'Ń',\n  nacute: 'ń',\n  Ncaron: 'Ň',\n  ncaron: 'ň',\n  Ncedil: 'Ņ',\n  ncedil: 'ņ',\n  ENG: 'Ŋ',\n  eng: 'ŋ',\n  Omacr: 'Ō',\n  omacr: 'ō',\n  Odblac: 'Ő',\n  odblac: 'ő',\n  OElig: 'Œ',\n  oelig: 'œ',\n  Racute: 'Ŕ',\n  racute: 'ŕ',\n  Rcaron: 'Ř',\n  rcaron: 'ř',\n  Rcedil: 'Ŗ',\n  rcedil: 'ŗ',\n  Sacute: 'Ś',\n  sacute: 'ś',\n  Scirc: 'Ŝ',\n  scirc: 'ŝ',\n  Scedil: 'Ş',\n  scedil: 'ş',\n  Scaron: 'Š',\n  scaron: 'š',\n  Tcedil: 'Ţ',\n  tcedil: 'ţ',\n  Tcaron: 'Ť',\n  tcaron: 'ť',\n  Tstrok: 'Ŧ',\n  tstrok: 'ŧ',\n  Utilde: 'Ũ',\n  utilde: 'ũ',\n  Umacr: 'Ū',\n  umacr: 'ū',\n  Ubreve: 'Ŭ',\n  ubreve: 'ŭ',\n  Uring: 'Ů',\n  uring: 'ů',\n  Udblac: 'Ű',\n  udblac: 'ű',\n  Uogon: 'Ų',\n  uogon: 'ų',\n  Wcirc: 'Ŵ',\n  wcirc: 'ŵ',\n  Ycirc: 'Ŷ',\n  ycirc: 'ŷ',\n  Zacute: 'Ź',\n  zacute: 'ź',\n  Zdot: 'Ż',\n  zdot: 'ż',\n  Zcaron: 'Ž',\n  zcaron: 'ž',\n};\n\n/**\n * Greek Letters\n * @type {Record<string, string>}\n */\nexport const GREEK = {\n  Alpha: 'Α',\n  alpha: 'α',\n  Beta: 'Β',\n  beta: 'β',\n  Gamma: 'Γ',\n  gamma: 'γ',\n  Delta: 'Δ',\n  delta: 'δ',\n  Epsilon: 'Ε',\n  epsilon: 'ε',\n  epsiv: 'ϵ',\n  varepsilon: 'ϵ',\n  Zeta: 'Ζ',\n  zeta: 'ζ',\n  Eta: 'Η',\n  eta: 'η',\n  Theta: 'Θ',\n  theta: 'θ',\n  thetasym: 'ϑ',\n  vartheta: 'ϑ',\n  Iota: 'Ι',\n  iota: 'ι',\n  Kappa: 'Κ',\n  kappa: 'κ',\n  kappav: 'ϰ',\n  varkappa: 'ϰ',\n  Lambda: 'Λ',\n  lambda: 'λ',\n  Mu: 'Μ',\n  mu: 'μ',\n  Nu: 'Ν',\n  nu: 'ν',\n  Xi: 'Ξ',\n  xi: 'ξ',\n  Omicron: 'Ο',\n  omicron: 'ο',\n  Pi: 'Π',\n  pi: 'π',\n  piv: 'ϖ',\n  varpi: 'ϖ',\n  Rho: 'Ρ',\n  rho: 'ρ',\n  rhov: 'ϱ',\n  varrho: 'ϱ',\n  Sigma: 'Σ',\n  sigma: 'σ',\n  sigmaf: 'ς',\n  sigmav: 'ς',\n  varsigma: 'ς',\n  Tau: 'Τ',\n  tau: 'τ',\n  Upsilon: 'Υ',\n  upsilon: 'υ',\n  upsi: 'υ',\n  Upsi: 'ϒ',\n  upsih: 'ϒ',\n  Phi: 'Φ',\n  phi: 'φ',\n  phiv: 'ϕ',\n  varphi: 'ϕ',\n  Chi: 'Χ',\n  chi: 'χ',\n  Psi: 'Ψ',\n  psi: 'ψ',\n  Omega: 'Ω',\n  omega: 'ω',\n  ohm: 'Ω',\n  Gammad: 'Ϝ',\n  gammad: 'ϝ',\n  digamma: 'ϝ',\n};\n\n/**\n * Cyrillic Letters\n * @type {Record<string, string>}\n */\nexport const CYRILLIC = {\n  Afr: '𝔄',\n  afr: '𝔞',\n  Acy: 'А',\n  acy: 'а',\n  Bcy: 'Б',\n  bcy: 'б',\n  Vcy: 'В',\n  vcy: 'в',\n  Gcy: 'Г',\n  gcy: 'г',\n  Dcy: 'Д',\n  dcy: 'д',\n  IEcy: 'Е',\n  iecy: 'е',\n  IOcy: 'Ё',\n  iocy: 'ё',\n  ZHcy: 'Ж',\n  zhcy: 'ж',\n  Zcy: 'З',\n  zcy: 'з',\n  Icy: 'И',\n  icy: 'и',\n  Jcy: 'Й',\n  jcy: 'й',\n  Kcy: 'К',\n  kcy: 'к',\n  Lcy: 'Л',\n  lcy: 'л',\n  Mcy: 'М',\n  mcy: 'м',\n  Ncy: 'Н',\n  ncy: 'н',\n  Ocy: 'О',\n  ocy: 'о',\n  Pcy: 'П',\n  pcy: 'п',\n  Rcy: 'Р',\n  rcy: 'р',\n  Scy: 'С',\n  scy: 'с',\n  Tcy: 'Т',\n  tcy: 'т',\n  Ucy: 'У',\n  ucy: 'у',\n  Fcy: 'Ф',\n  fcy: 'ф',\n  KHcy: 'Х',\n  khcy: 'х',\n  TScy: 'Ц',\n  tscy: 'ц',\n  CHcy: 'Ч',\n  chcy: 'ч',\n  SHcy: 'Ш',\n  shcy: 'ш',\n  SHCHcy: 'Щ',\n  shchcy: 'щ',\n  HARDcy: 'Ъ',\n  hardcy: 'ъ',\n  Ycy: 'Ы',\n  ycy: 'ы',\n  SOFTcy: 'Ь',\n  softcy: 'ь',\n  Ecy: 'Э',\n  ecy: 'э',\n  YUcy: 'Ю',\n  yucy: 'ю',\n  YAcy: 'Я',\n  yacy: 'я',\n  DJcy: 'Ђ',\n  djcy: 'ђ',\n  GJcy: 'Ѓ',\n  gjcy: 'ѓ',\n  Jukcy: 'Є',\n  jukcy: 'є',\n  DScy: 'Ѕ',\n  dscy: 'ѕ',\n  Iukcy: 'І',\n  iukcy: 'і',\n  YIcy: 'Ї',\n  yicy: 'ї',\n  Jsercy: 'Ј',\n  jsercy: 'ј',\n  LJcy: 'Љ',\n  ljcy: 'љ',\n  NJcy: 'Њ',\n  njcy: 'њ',\n  TSHcy: 'Ћ',\n  tshcy: 'ћ',\n  KJcy: 'Ќ',\n  kjcy: 'ќ',\n  Ubrcy: 'Ў',\n  ubrcy: 'ў',\n  DZcy: 'Џ',\n  dzcy: 'џ',\n};\n\n/**\n * Mathematical Operators & Relations\n * @type {Record<string, string>}\n */\nexport const MATH = {\n  plus: '+',\n  minus: '−',\n  mnplus: '∓',\n  mp: '∓',\n  pm: '±',\n  times: '×',\n  div: '÷',\n  divide: '÷',\n  sdot: '⋅',\n  star: '☆',\n  starf: '★',\n  bigstar: '★',\n  lowast: '∗',\n  ast: '*',\n  midast: '*',\n  compfn: '∘',\n  smallcircle: '∘',\n  bullet: '•',\n  bull: '•',\n  nbsp: '\\u00a0',\n  hellip: '…',\n  mldr: '…',\n  prime: '′',\n  Prime: '″',\n  tprime: '‴',\n  bprime: '‵',\n  backprime: '‵',\n  minus: '−',\n  minusd: '∸',\n  dotminus: '∸',\n  plusdo: '∔',\n  dotplus: '∔',\n  plusmn: '±',\n  minusplus: '∓',\n  mnplus: '∓',\n  mp: '∓',\n  setminus: '∖',\n  smallsetminus: '∖',\n  Backslash: '∖',\n  setmn: '∖',\n  ssetmn: '∖',\n  lowbar: '_',\n  verbar: '|',\n  vert: '|',\n  VerticalLine: '|',\n  colon: ':',\n  Colon: '∷',\n  Proportion: '∷',\n  ratio: '∶',\n  equals: '=',\n  ne: '≠',\n  nequiv: '≢',\n  equiv: '≡',\n  Congruent: '≡',\n  sim: '∼',\n  thicksim: '∼',\n  thksim: '∼',\n  sime: '≃',\n  simeq: '≃',\n  TildeEqual: '≃',\n  asymp: '≈',\n  approx: '≈',\n  thickapprox: '≈',\n  thkap: '≈',\n  TildeTilde: '≈',\n  ncong: '≇',\n  cong: '≅',\n  TildeFullEqual: '≅',\n  asympeq: '≍',\n  CupCap: '≍',\n  bump: '≎',\n  Bumpeq: '≎',\n  HumpDownHump: '≎',\n  bumpe: '≏',\n  bumpeq: '≏',\n  HumpEqual: '≏',\n  dotminus: '∸',\n  minusd: '∸',\n  plusdo: '∔',\n  dotplus: '∔',\n  le: '≤',\n  LessEqual: '≤',\n  ge: '≥',\n  GreaterEqual: '≥',\n  lesseqgtr: '⋚',\n  lesseqqgtr: '⪋',\n  greater: '>',\n  less: '<',\n};\n\n/**\n * Mathematical Operators (Advanced)\n * @type {Record<string, string>}\n */\nexport const MATH_ADVANCED = {\n  alefsym: 'ℵ',\n  aleph: 'ℵ',\n  beth: 'ℶ',\n  gimel: 'ℷ',\n  daleth: 'ℸ',\n  forall: '∀',\n  ForAll: '∀',\n  part: '∂',\n  PartialD: '∂',\n  exist: '∃',\n  Exists: '∃',\n  nexist: '∄',\n  nexists: '∄',\n  empty: '∅',\n  emptyset: '∅',\n  emptyv: '∅',\n  varnothing: '∅',\n  nabla: '∇',\n  Del: '∇',\n  isin: '∈',\n  isinv: '∈',\n  in: '∈',\n  Element: '∈',\n  notin: '∉',\n  notinva: '∉',\n  ni: '∋',\n  niv: '∋',\n  SuchThat: '∋',\n  ReverseElement: '∋',\n  notni: '∌',\n  notniva: '∌',\n  prod: '∏',\n  Product: '∏',\n  coprod: '∐',\n  Coproduct: '∐',\n  sum: '∑',\n  Sum: '∑',\n  minus: '−',\n  mp: '∓',\n  plusdo: '∔',\n  dotplus: '∔',\n  setminus: '∖',\n  lowast: '∗',\n  radic: '√',\n  Sqrt: '√',\n  prop: '∝',\n  propto: '∝',\n  Proportional: '∝',\n  varpropto: '∝',\n  infin: '∞',\n  infintie: '⧝',\n  ang: '∠',\n  angle: '∠',\n  angmsd: '∡',\n  measuredangle: '∡',\n  angsph: '∢',\n  mid: '∣',\n  VerticalBar: '∣',\n  nmid: '∤',\n  nsmid: '∤',\n  npar: '∦',\n  parallel: '∥',\n  spar: '∥',\n  nparallel: '∦',\n  nspar: '∦',\n  and: '∧',\n  wedge: '∧',\n  or: '∨',\n  vee: '∨',\n  cap: '∩',\n  cup: '∪',\n  int: '∫',\n  Integral: '∫',\n  conint: '∮',\n  ContourIntegral: '∮',\n  Conint: '∯',\n  DoubleContourIntegral: '∯',\n  Cconint: '∰',\n  there4: '∴',\n  therefore: '∴',\n  Therefore: '∴',\n  becaus: '∵',\n  because: '∵',\n  Because: '∵',\n  ratio: '∶',\n  Proportion: '∷',\n  minusd: '∸',\n  dotminus: '∸',\n  mDDot: '∺',\n  homtht: '∻',\n  sim: '∼',\n  bsimg: '∽',\n  backsim: '∽',\n  ac: '∾',\n  mstpos: '∾',\n  acd: '∿',\n  VerticalTilde: '≀',\n  wr: '≀',\n  wreath: '≀',\n  nsime: '≄',\n  nsimeq: '≄',\n  nsimeq: '≄',\n  ncong: '≇',\n  simne: '≆',\n  ncongdot: '⩭̸',\n  ngsim: '≵',\n  nsim: '≁',\n  napprox: '≉',\n  nap: '≉',\n  ngeq: '≱',\n  nge: '≱',\n  nleq: '≰',\n  nle: '≰',\n  ngtr: '≯',\n  ngt: '≯',\n  nless: '≮',\n  nlt: '≮',\n  nprec: '⊀',\n  npr: '⊀',\n  nsucc: '⊁',\n  nsc: '⊁',\n};\n\n/**\n * Arrows\n * @type {Record<string, string>}\n */\nexport const ARROWS = {\n  larr: '←',\n  leftarrow: '←',\n  LeftArrow: '←',\n  uarr: '↑',\n  uparrow: '↑',\n  UpArrow: '↑',\n  rarr: '→',\n  rightarrow: '→',\n  RightArrow: '→',\n  darr: '↓',\n  downarrow: '↓',\n  DownArrow: '↓',\n  harr: '↔',\n  leftrightarrow: '↔',\n  LeftRightArrow: '↔',\n  varr: '↕',\n  updownarrow: '↕',\n  UpDownArrow: '↕',\n  nwarr: '↖',\n  nwarrow: '↖',\n  UpperLeftArrow: '↖',\n  nearr: '↗',\n  nearrow: '↗',\n  UpperRightArrow: '↗',\n  searr: '↘',\n  searrow: '↘',\n  LowerRightArrow: '↘',\n  swarr: '↙',\n  swarrow: '↙',\n  LowerLeftArrow: '↙',\n  lArr: '⇐',\n  Leftarrow: '⇐',\n  uArr: '⇑',\n  Uparrow: '⇑',\n  rArr: '⇒',\n  Rightarrow: '⇒',\n  dArr: '⇓',\n  Downarrow: '⇓',\n  hArr: '⇔',\n  Leftrightarrow: '⇔',\n  iff: '⇔',\n  vArr: '⇕',\n  Updownarrow: '⇕',\n  lAarr: '⇚',\n  Lleftarrow: '⇚',\n  rAarr: '⇛',\n  Rrightarrow: '⇛',\n  lrarr: '⇆',\n  leftrightarrows: '⇆',\n  rlarr: '⇄',\n  rightleftarrows: '⇄',\n  lrhar: '⇋',\n  leftrightharpoons: '⇋',\n  ReverseEquilibrium: '⇋',\n  rlhar: '⇌',\n  rightleftharpoons: '⇌',\n  Equilibrium: '⇌',\n  udarr: '⇅',\n  UpArrowDownArrow: '⇅',\n  duarr: '⇵',\n  DownArrowUpArrow: '⇵',\n  llarr: '⇇',\n  leftleftarrows: '⇇',\n  rrarr: '⇉',\n  rightrightarrows: '⇉',\n  ddarr: '⇊',\n  downdownarrows: '⇊',\n  har: '↽',\n  lhard: '↽',\n  leftharpoondown: '↽',\n  lharu: '↼',\n  leftharpoonup: '↼',\n  rhard: '⇁',\n  rightharpoondown: '⇁',\n  rharu: '⇀',\n  rightharpoonup: '⇀',\n  lsh: '↰',\n  Lsh: '↰',\n  rsh: '↱',\n  Rsh: '↱',\n  ldsh: '↲',\n  rdsh: '↳',\n  hookleftarrow: '↩',\n  hookrightarrow: '↪',\n  mapstoleft: '↤',\n  mapstoup: '↥',\n  map: '↦',\n  mapsto: '↦',\n  mapstodown: '↧',\n  crarr: '↵',\n  nwarrow: '↖',\n  nearrow: '↗',\n  searrow: '↘',\n  swarrow: '↙',\n  nleftarrow: '↚',\n  nleftrightarrow: '↮',\n  nrightarrow: '↛',\n  nrarr: '↛',\n  larrtl: '↢',\n  rarrtl: '↣',\n  leftarrowtail: '↢',\n  rightarrowtail: '↣',\n  twoheadleftarrow: '↞',\n  twoheadrightarrow: '↠',\n  Larr: '↞',\n  Rarr: '↠',\n  larrhk: '↩',\n  rarrhk: '↪',\n  larrlp: '↫',\n  looparrowleft: '↫',\n  rarrlp: '↬',\n  looparrowright: '↬',\n  harrw: '↭',\n  leftrightsquigarrow: '↭',\n  nrarrw: '↝̸',\n  rarrw: '↝',\n  rightsquigarrow: '↝',\n  larrbfs: '⤟',\n  rarrbfs: '⤠',\n  nvHarr: '⤄',\n  nvlArr: '⤂',\n  nvrArr: '⤃',\n  larrfs: '⤝',\n  rarrfs: '⤞',\n  Map: '⤅',\n  larrsim: '⥳',\n  rarrsim: '⥴',\n  harrcir: '⥈',\n  Uarrocir: '⥉',\n  lurdshar: '⥊',\n  ldrdhar: '⥧',\n  ldrushar: '⥋',\n  rdldhar: '⥩',\n  lrhard: '⥭',\n  rlhar: '⇌',\n  uharr: '↾',\n  uharl: '↿',\n  dharr: '⇂',\n  dharl: '⇃',\n  Uarr: '↟',\n  Darr: '↡',\n  zigrarr: '⇝',\n  nwArr: '⇖',\n  neArr: '⇗',\n  seArr: '⇘',\n  swArr: '⇙',\n  nharr: '↮',\n  nhArr: '⇎',\n  nlarr: '↚',\n  nlArr: '⇍',\n  nrarr: '↛',\n  nrArr: '⇏',\n  larrb: '⇤',\n  LeftArrowBar: '⇤',\n  rarrb: '⇥',\n  RightArrowBar: '⇥',\n};\n\n/**\n * Geometric Shapes\n * @type {Record<string, string>}\n */\nexport const SHAPES = {\n  square: '□',\n  Square: '□',\n  squ: '□',\n  squf: '▪',\n  squarf: '▪',\n  blacksquar: '▪',\n  blacksquare: '▪',\n  FilledVerySmallSquare: '▪',\n  blk34: '▓',\n  blk12: '▒',\n  blk14: '░',\n  block: '█',\n  srect: '▭',\n  rect: '▭',\n  sdot: '⋅',\n  sdotb: '⊡',\n  dotsquare: '⊡',\n  triangle: '▵',\n  tri: '▵',\n  trine: '▵',\n  utri: '▵',\n  triangledown: '▿',\n  dtri: '▿',\n  tridown: '▿',\n  triangleleft: '◃',\n  ltri: '◃',\n  triangleright: '▹',\n  rtri: '▹',\n  blacktriangle: '▴',\n  utrif: '▴',\n  blacktriangledown: '▾',\n  dtrif: '▾',\n  blacktriangleleft: '◂',\n  ltrif: '◂',\n  blacktriangleright: '▸',\n  rtrif: '▸',\n  loz: '◊',\n  lozenge: '◊',\n  blacklozenge: '⧫',\n  lozf: '⧫',\n  bigcirc: '◯',\n  xcirc: '◯',\n  circ: 'ˆ',\n  Circle: '○',\n  cir: '○',\n  o: '○',\n  bullet: '•',\n  bull: '•',\n  hellip: '…',\n  mldr: '…',\n  nldr: '‥',\n  boxh: '─',\n  HorizontalLine: '─',\n  boxv: '│',\n  boxdr: '┌',\n  boxdl: '┐',\n  boxur: '└',\n  boxul: '┘',\n  boxvr: '├',\n  boxvl: '┤',\n  boxhd: '┬',\n  boxhu: '┴',\n  boxvh: '┼',\n  boxH: '═',\n  boxV: '║',\n  boxdR: '╒',\n  boxDr: '╓',\n  boxDR: '╔',\n  boxDl: '╕',\n  boxdL: '╖',\n  boxDL: '╗',\n  boxuR: '╘',\n  boxUr: '╙',\n  boxUR: '╚',\n  boxUl: '╜',\n  boxuL: '╛',\n  boxUL: '╝',\n  boxvR: '╞',\n  boxVr: '╟',\n  boxVR: '╠',\n  boxVl: '╢',\n  boxvL: '╡',\n  boxVL: '╣',\n  boxHd: '╤',\n  boxhD: '╥',\n  boxHD: '╦',\n  boxHu: '╧',\n  boxhU: '╨',\n  boxHU: '╩',\n  boxvH: '╪',\n  boxVh: '╫',\n  boxVH: '╬',\n};\n\n/**\n * Punctuation & Diacritics\n * @type {Record<string, string>}\n */\nexport const PUNCTUATION = {\n  excl: '!',\n  iexcl: '¡',\n  brvbar: '¦',\n  sect: '§',\n  uml: '¨',\n  copy: '©',\n  ordf: 'ª',\n  laquo: '«',\n  not: '¬',\n  shy: '\\u00ad',\n  reg: '®',\n  macr: '¯',\n  deg: '°',\n  plusmn: '±',\n  sup2: '²',\n  sup3: '³',\n  acute: '´',\n  micro: 'µ',\n  para: '¶',\n  middot: '·',\n  cedil: '¸',\n  sup1: '¹',\n  ordm: 'º',\n  raquo: '»',\n  frac14: '¼',\n  frac12: '½',\n  frac34: '¾',\n  iquest: '¿',\n  nbsp: '\\u00a0',\n  comma: ',',\n  period: '.',\n  colon: ':',\n  semi: ';',\n  vert: '|',\n  Verbar: '‖',\n  verbar: '|',\n  dblac: '˝',\n  circ: 'ˆ',\n  caron: 'ˇ',\n  breve: '˘',\n  dot: '˙',\n  ring: '˚',\n  ogon: '˛',\n  tilde: '˜',\n  DiacriticalGrave: '`',\n  DiacriticalAcute: '´',\n  DiacriticalTilde: '˜',\n  DiacriticalDot: '˙',\n  DiacriticalDoubleAcute: '˝',\n  grave: '`',\n  acute: '´',\n};\n\n/**\n * Currency Symbols\n * @type {Record<string, string>}\n */\nexport const CURRENCY = {\n  cent: '¢',\n  pound: '£',\n  curren: '¤',\n  yen: '¥',\n  euro: '€',\n  dollar: '$',\n  euro: '€',\n  fnof: 'ƒ',\n  inr: '₹',\n  af: '؋',\n  birr: 'ብር',\n  peso: '₱',\n  rub: '₽',\n  won: '₩',\n  yuan: '¥',\n  cedil: '¸',\n};\n\n/**\n * Fractions\n * @type {Record<string, string>}\n */\nexport const FRACTIONS = {\n  frac12: '½',\n  half: '½',\n  frac13: '⅓',\n  frac14: '¼',\n  frac15: '⅕',\n  frac16: '⅙',\n  frac18: '⅛',\n  frac23: '⅔',\n  frac25: '⅖',\n  frac34: '¾',\n  frac35: '⅗',\n  frac38: '⅜',\n  frac45: '⅘',\n  frac56: '⅚',\n  frac58: '⅝',\n  frac78: '⅞',\n  frasl: '⁄',\n};\n\n/**\n * Miscellaneous Symbols\n * @type {Record<string, string>}\n */\nexport const MISC_SYMBOLS = {\n  trade: '™',\n  TRADE: '™',\n  telrec: '⌕',\n  target: '⌖',\n  ulcorn: '⌜',\n  ulcorner: '⌜',\n  urcorn: '⌝',\n  urcorner: '⌝',\n  dlcorn: '⌞',\n  llcorner: '⌞',\n  drcorn: '⌟',\n  lrcorner: '⌟',\n  intercal: '⊺',\n  intcal: '⊺',\n  oplus: '⊕',\n  CirclePlus: '⊕',\n  ominus: '⊖',\n  CircleMinus: '⊖',\n  otimes: '⊗',\n  CircleTimes: '⊗',\n  osol: '⊘',\n  odot: '⊙',\n  CircleDot: '⊙',\n  oast: '⊛',\n  circledast: '⊛',\n  odash: '⊝',\n  circleddash: '⊝',\n  ocirc: '⊚',\n  circledcirc: '⊚',\n  boxplus: '⊞',\n  plusb: '⊞',\n  boxminus: '⊟',\n  minusb: '⊟',\n  boxtimes: '⊠',\n  timesb: '⊠',\n  boxdot: '⊡',\n  sdotb: '⊡',\n  veebar: '⊻',\n  vee: '∨',\n  barvee: '⊽',\n  and: '∧',\n  wedge: '∧',\n  Cap: '⋒',\n  Cup: '⋓',\n  Fork: '⋔',\n  pitchfork: '⋔',\n  epar: '⋕',\n  ltlarr: '⥶',\n  nvap: '≍⃒',\n  nvsim: '∼⃒',\n  nvge: '≥⃒',\n  nvle: '≤⃒',\n  nvlt: '<⃒',\n  nvgt: '>⃒',\n  nvltrie: '⊴⃒',\n  nvrtrie: '⊵⃒',\n  Vdash: '⊩',\n  dashv: '⊣',\n  vDash: '⊨',\n  Vdash: '⊩',\n  Vvdash: '⊪',\n  nvdash: '⊬',\n  nvDash: '⊭',\n  nVdash: '⊮',\n  nVDash: '⊯',\n};\n\n/**\n * All entities combined (if you need everything)\n * @type {Record<string, string>}\n */\nexport const ALL_ENTITIES = {\n  ...BASIC_LATIN,\n  ...LATIN_ACCENTS,\n  ...LATIN_EXTENDED,\n  ...GREEK,\n  ...CYRILLIC,\n  ...MATH,\n  ...MATH_ADVANCED,\n  ...ARROWS,\n  ...SHAPES,\n  ...PUNCTUATION,\n  ...CURRENCY,\n  ...FRACTIONS,\n  ...MISC_SYMBOLS,\n};\n\nexport const XML = {\n  amp: \"&\",\n  apos: \"'\",\n  gt: \">\",\n  lt: \"<\",\n  quot: \"\\\"\"\n}\nexport const COMMON_HTML = {\n  nbsp: '\\u00a0',\n  copy: '\\u00a9',\n  reg: '\\u00ae',\n  trade: '\\u2122',\n  mdash: '\\u2014',\n  ndash: '\\u2013',\n  hellip: '\\u2026',\n  laquo: '\\u00ab',\n  raquo: '\\u00bb',\n  lsquo: '\\u2018',\n  rsquo: '\\u2019',\n  ldquo: '\\u201c',\n  rdquo: '\\u201d',\n  bull: '\\u2022',\n  para: '\\u00b6',\n  sect: '\\u00a7',\n  deg: '\\u00b0',\n  frac12: '\\u00bd',\n  frac14: '\\u00bc',\n  frac34: '\\u00be',\n}\n// ---------------------------------------------------------------------------\n// Note: NUMERIC_ENTITIES (&#NNN; / &#xHH;) are handled by the scanner directly\n// via String.fromCodePoint() without any map lookup.\n// ---------------------------------------------------------------------------","// ---------------------------------------------------------------------------\n// Built-in named entity map  (name → replacement string)\n// No regex, no {regex,val} objects — just flat key/value pairs.\n// ---------------------------------------------------------------------------\n\nimport { XML as DEFAULT_XML_ENTITIES } from \"./entities.js\"\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst SPECIAL_CHARS = new Set('!?\\\\\\\\/[]$%{}^&*()<>|+');\n\n/**\n * Validate that an entity name contains no dangerous characters.\n * @param {string} name\n * @returns {string} the name, unchanged\n * @throws {Error} on invalid characters\n */\nfunction validateEntityName(name) {\n  if (name[0] === '#') {\n    throw new Error(`[EntityReplacer] Invalid character '#' in entity name: \"${name}\"`);\n  }\n  for (const ch of name) {\n    if (SPECIAL_CHARS.has(ch)) {\n      throw new Error(`[EntityReplacer] Invalid character '${ch}' in entity name: \"${name}\"`);\n    }\n  }\n  return name;\n}\n\n/**\n * Merge one or more entity maps into a flat name→string map.\n * Accepts either:\n *   - plain string values:             { amp: '&' }\n *   - legacy {regex,val} / {regx,val}: { lt: { regex: /.../, val: '<' } }\n *\n * Values containing '&' are skipped (recursive expansion risk).\n *\n * @param {...object} maps\n * @returns {Record<string, string>}\n */\nfunction mergeEntityMaps(...maps) {\n  const out = Object.create(null);\n  for (const map of maps) {\n    if (!map) continue;\n    for (const key of Object.keys(map)) {\n      const raw = map[key];\n      if (typeof raw === 'string') {\n        out[key] = raw;\n      } else if (raw && typeof raw === 'object' && raw.val !== undefined) {\n        // Legacy {regex,val} or {regx,val} — extract the string val only\n        const val = raw.val;\n        if (typeof val === 'string') {\n          out[key] = val;\n        }\n        // function vals are not supported in the scanner — skip\n      }\n    }\n  }\n  return out;\n}\n\n// ---------------------------------------------------------------------------\n// applyLimitsTo helpers\n// ---------------------------------------------------------------------------\n\nconst LIMIT_TIER_EXTERNAL = 'external'; // input/runtime + persistent external maps\nconst LIMIT_TIER_BASE = 'base';     // DEFAULT_XML_ENTITIES + namedEntities (system) maps\nconst LIMIT_TIER_ALL = 'all';      // every entity regardless of tier\n\n/**\n * Resolve `applyLimitsTo` option into a normalised Set of tier strings.\n * Accepted values: 'external' | 'base' | 'all' | string[]\n * Default: 'external' (only untrusted injected entities are counted).\n * @param {string|string[]|undefined} raw\n * @returns {Set<string>}\n */\nfunction parseLimitTiers(raw) {\n  if (!raw || raw === LIMIT_TIER_EXTERNAL) return new Set([LIMIT_TIER_EXTERNAL]);\n  if (raw === LIMIT_TIER_ALL) return new Set([LIMIT_TIER_ALL]);\n  if (raw === LIMIT_TIER_BASE) return new Set([LIMIT_TIER_BASE]);\n  if (Array.isArray(raw)) return new Set(raw);\n  return new Set([LIMIT_TIER_EXTERNAL]); // safe default for unrecognised values\n}\n\n// ---------------------------------------------------------------------------\n// NCR (Numeric Character Reference) classification\n// ---------------------------------------------------------------------------\n\n// Severity order — higher number = stricter action.\n// Used to enforce minimum action levels for specific codepoint ranges.\nconst NCR_LEVEL = Object.freeze({ allow: 0, leave: 1, remove: 2, throw: 3 });\n\n// XML 1.0 §2.2: allowed chars are #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]\n// Restricted C0: U+0001–U+001F excluding U+0009, U+000A, U+000D\nconst XML10_ALLOWED_C0 = new Set([0x09, 0x0A, 0x0D]);\n\n/**\n * Parse the `ncr` constructor option into flat, hot-path-friendly fields.\n * @param {object|undefined} ncr\n * @returns {{ xmlVersion: number, onLevel: number, nullLevel: number }}\n */\nfunction parseNCRConfig(ncr) {\n  if (!ncr) {\n    return { xmlVersion: 1.0, onLevel: NCR_LEVEL.allow, nullLevel: NCR_LEVEL.remove };\n  }\n  const xmlVersion = ncr.xmlVersion === 1.1 ? 1.1 : 1.0;\n  const onLevel = NCR_LEVEL[ncr.onNCR] ?? NCR_LEVEL.allow;\n  const nullLevel = NCR_LEVEL[ncr.nullNCR] ?? NCR_LEVEL.remove;\n  // 'allow' is not meaningful for null — clamp to at least 'remove'\n  const clampedNull = Math.max(nullLevel, NCR_LEVEL.remove);\n  return { xmlVersion, onLevel, nullLevel: clampedNull };\n}\n\n// ---------------------------------------------------------------------------\n// EntityReplacer\n// ---------------------------------------------------------------------------\n\n/**\n * Single-pass, zero-regex entity replacer for XML/HTML content.\n *\n * Algorithm: scan the string once for '&', read to ';', resolve via map\n * or direct codepoint conversion, build output chunks, join once at the end.\n *\n * Entity lookup priority (highest → lowest):\n *   1. input / runtime  (DOCTYPE entities for current document)\n *   2. persistent external (survive across documents)\n *   3. base named map   (DEFAULT_XML_ENTITIES + user-supplied namedEntities)\n *\n * Both input and external resolve as the 'external' tier for limit purposes.\n * Base map entities resolve as the 'base' tier.\n *\n * Numeric / hex references (&#NNN; / &#xHH;) are resolved directly via\n * String.fromCodePoint() — no map needed. They count as 'base' tier.\n *\n * @example\n * const replacer = new EntityReplacer({ namedEntities: COMMON_HTML });\n * replacer.setExternalEntities({ brand: 'Acme' });\n *\n * const instance = replacer.reset();\n * instance.addInputEntities({ version: '1.0' });\n * instance.encode('&brand; v&version; &lt;'); // 'Acme v1.0 <'\n */\nexport default class EntityDecoder {\n  /**\n   * @param {object} [options]\n   * @param {object|null}  [options.namedEntities]        — extra named entities merged into base map\n   * @param {object}  [options.limit]                 — security limits\n   * @param {number}       [options.limit.maxTotalExpansions=0]  — 0 = unlimited\n   * @param {number}       [options.limit.maxExpandedLength=0]   — 0 = unlimited\n   * @param {'external'|'base'|'all'|string[]} [options.limit.applyLimitsTo='external']\n   *   Which entity tiers count against the security limits:\n   *   - 'external' (default) — only input/runtime + persistent external entities\n   *   - 'base'               — only DEFAULT_XML_ENTITIES + namedEntities\n   *   - 'all'                — every entity regardless of tier\n   *   - string[]             — explicit combination, e.g. ['external', 'base']\n   * @param {((resolved: string, original: string) => string)|null} [options.postCheck=null]\n   * @param {string[]} [options.remove=[]] — entity names (e.g. ['nbsp', '#13']) to delete (replace with empty string)\n   * @param {string[]} [options.leave=[]]  — entity names to keep as literal (unchanged in output)\n   * @param {object}   [options.ncr]       — Numeric Character Reference controls\n   * @param {1.0|1.1}  [options.ncr.xmlVersion=1.0]\n   *   XML version governing which codepoint ranges are restricted:\n   *   - 1.0 — C0 controls U+0001–U+001F (except U+0009/000A/000D) are prohibited\n   *   - 1.1 — C0 controls are allowed when written as NCRs; C1 (U+007F–U+009F) decoded as-is\n   * @param {'allow'|'leave'|'remove'|'throw'} [options.ncr.onNCR='allow']\n   *   Base action for numeric references. Severity order: allow < leave < remove < throw.\n   *   For codepoint ranges that carry a minimum level (surrogates → remove, XML 1.0 C0 → remove),\n   *   the effective action is max(onNCR, rangeMinimum).\n   * @param {'remove'|'throw'} [options.ncr.nullNCR='remove']\n   *   Action for U+0000 (null). 'allow' and 'leave' are clamped to 'remove' since null is never safe.\n   */\n  constructor(options = {}) {\n    this._limit = options.limit || {};\n    this._maxTotalExpansions = this._limit.maxTotalExpansions || 0;\n    this._maxExpandedLength = this._limit.maxExpandedLength || 0;\n    this._postCheck = typeof options.postCheck === 'function' ? options.postCheck : r => r;\n    this._limitTiers = parseLimitTiers(this._limit.applyLimitsTo ?? LIMIT_TIER_EXTERNAL);\n    this._numericAllowed = options.numericAllowed ?? true;\n    // Base map: DEFAULT_XML_ENTITIES + user-supplied extras. Immutable after construction.\n    this._baseMap = mergeEntityMaps(DEFAULT_XML_ENTITIES, options.namedEntities || null);\n\n    // Persistent external entities — survive across documents.\n    // Stored as a separate map so reset() never touches them.\n    /** @type {Record<string, string>} */\n    this._externalMap = Object.create(null);\n\n    // Input / runtime entities — current document only, wiped on reset().\n    /** @type {Record<string, string>} */\n    this._inputMap = Object.create(null);\n\n    // Per-document counters\n    this._totalExpansions = 0;\n    this._expandedLength = 0;\n\n    // --- New: remove / leave sets ---\n    /** @type {Set<string>} */\n    this._removeSet = new Set(options.remove && Array.isArray(options.remove) ? options.remove : []);\n    /** @type {Set<string>} */\n    this._leaveSet = new Set(options.leave && Array.isArray(options.leave) ? options.leave : []);\n\n    // --- NCR config (parsed into flat fields for hot-path speed) ---\n    const ncrCfg = parseNCRConfig(options.ncr);\n    this._ncrXmlVersion = ncrCfg.xmlVersion;\n    this._ncrOnLevel = ncrCfg.onLevel;\n    this._ncrNullLevel = ncrCfg.nullLevel;\n  }\n\n  // -------------------------------------------------------------------------\n  // Persistent external entity registration\n  // -------------------------------------------------------------------------\n\n  /**\n   * Replace the full set of persistent external entities.\n   * All keys are validated — throws on invalid characters.\n   * @param {Record<string, string | { regex?: RegExp, val: string }>} map\n   */\n  setExternalEntities(map) {\n    if (map) {\n      for (const key of Object.keys(map)) {\n        validateEntityName(key);\n      }\n    }\n    this._externalMap = mergeEntityMaps(map);\n  }\n\n  /**\n   * Add a single persistent external entity.\n   * @param {string} key\n   * @param {string} value\n   */\n  addExternalEntity(key, value) {\n    validateEntityName(key);\n    if (typeof value === 'string' && value.indexOf('&') === -1) {\n      this._externalMap[key] = value;\n    }\n  }\n\n  // -------------------------------------------------------------------------\n  // Input / runtime entity registration (per document)\n  // -------------------------------------------------------------------------\n\n  /**\n   * Inject DOCTYPE entities for the current document.\n   * Also resets per-document expansion counters.\n   * @param {Record<string, string | { regx?: RegExp, regex?: RegExp, val: string }>} map\n   */\n  addInputEntities(map) {\n    this._totalExpansions = 0;\n    this._expandedLength = 0;\n    this._inputMap = mergeEntityMaps(map);\n  }\n\n  // -------------------------------------------------------------------------\n  // Per-document reset\n  // -------------------------------------------------------------------------\n\n  /**\n   * Wipe input/runtime entities and reset counters.\n   * Call this before processing each new document.\n   * @returns {this}\n   */\n  reset() {\n    this._inputMap = Object.create(null);\n    this._totalExpansions = 0;\n    this._expandedLength = 0;\n    return this;\n  }\n\n  // -------------------------------------------------------------------------\n  // XML version (can be set after construction, e.g. once parser reads <?xml?>)\n  // -------------------------------------------------------------------------\n\n  /**\n   * Update the XML version used for NCR classification.\n   * Call this as soon as the document's `<?xml version=\"...\">` declaration is parsed.\n   * @param {1.0|1.1|number} version\n   */\n  setXmlVersion(version) {\n    this._ncrXmlVersion = version === 1.1 ? 1.1 : 1.0;\n  }\n\n  // -------------------------------------------------------------------------\n  // Primary API\n  // -------------------------------------------------------------------------\n\n  /**\n   * Replace all entity references in `str` in a single pass.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  decode(str) {\n    if (typeof str !== 'string' || str.length === 0) return str;\n    //TODO: check if needed\n    //if (str.indexOf('&') === -1) return str; // fast path — no entities at all\n\n    const original = str;\n    const chunks = [];\n    const len = str.length;\n    let last = 0; // start of next unprocessed literal chunk\n    let i = 0;\n\n    const limitExpansions = this._maxTotalExpansions > 0;\n    const limitLength = this._maxExpandedLength > 0;\n    const checkLimits = limitExpansions || limitLength;\n\n    while (i < len) {\n      // Scan forward to next '&'\n      if (str.charCodeAt(i) !== 38 /* '&' */) { i++; continue; }\n\n      // --- Found '&' at position i ---\n\n      // Scan forward to ';'\n      let j = i + 1;\n      while (j < len && str.charCodeAt(j) !== 59 /* ';' */ && (j - i) <= 32) j++;\n\n      if (j >= len || str.charCodeAt(j) !== 59) {\n        // No closing ';' within window — treat '&' as literal\n        i++;\n        continue;\n      }\n\n      // Raw token between '&' and ';' (exclusive)\n      const token = str.slice(i + 1, j);\n      if (token.length === 0) { i++; continue; }\n\n      let replacement;\n      let tier; // which limit tier this entity belongs to\n\n      if (this._removeSet.has(token)) {\n        // Remove entity: replace with empty string\n        replacement = '';\n        // If entity was unknown (replacement undefined), we still need a tier for limits.\n        // Treat as external tier because it's user-directed removal of an unknown reference.\n        if (tier === undefined) {\n          tier = LIMIT_TIER_EXTERNAL;\n        }\n      } else if (this._leaveSet.has(token)) {\n        // Do not replace — keep original &token; as literal\n        i++;\n        continue;\n      } else if (token.charCodeAt(0) === 35 /* '#' */) {\n        // ---- Numeric / NCR reference ----\n        // NCR classification always runs first — prohibited codepoints must be\n        // caught regardless of numericAllowed.\n        const ncrResult = this._resolveNCR(token);\n        if (ncrResult === undefined) {\n          // 'leave' action — keep original &token; as-is\n          i++;\n          continue;\n        }\n        replacement = ncrResult; // '' for remove, char string for allow\n        tier = LIMIT_TIER_BASE;\n      } else {\n        // ---- Named reference ----\n        const resolved = this._resolveName(token);\n        replacement = resolved?.value;\n        tier = resolved?.tier;\n      }\n\n      if (replacement === undefined) {\n        // Unknown entity — leave as-is, advance past '&' only\n        i++;\n        continue;\n      }\n\n      // Flush literal chunk before this entity\n      if (i > last) chunks.push(str.slice(last, i));\n      chunks.push(replacement);\n      last = j + 1; // skip past ';'\n      i = last;\n\n      // Apply expansion limits only if this tier is being tracked\n      if (checkLimits && this._tierCounts(tier)) {\n        if (limitExpansions) {\n          this._totalExpansions++;\n          if (this._totalExpansions > this._maxTotalExpansions) {\n            throw new Error(\n              `[EntityReplacer] Entity expansion count limit exceeded: ` +\n              `${this._totalExpansions} > ${this._maxTotalExpansions}`\n            );\n          }\n        }\n        if (limitLength) {\n          // delta: replacement.length minus the raw &token; length (token.length + 2 for '&' and ';')\n          const delta = replacement.length - (token.length + 2);\n          if (delta > 0) {\n            this._expandedLength += delta;\n            if (this._expandedLength > this._maxExpandedLength) {\n              throw new Error(\n                `[EntityReplacer] Expanded content length limit exceeded: ` +\n                `${this._expandedLength} > ${this._maxExpandedLength}`\n              );\n            }\n          }\n        }\n      }\n    }\n\n    // Flush trailing literal\n    if (last < len) chunks.push(str.slice(last));\n\n    // If nothing was replaced, chunks is empty — return original\n    const result = chunks.length === 0 ? str : chunks.join('');\n\n    return this._postCheck(result, original);\n  }\n\n  // -------------------------------------------------------------------------\n  // Private: limit tier check\n  // -------------------------------------------------------------------------\n\n  /**\n   * Returns true if a resolved entity of the given tier should count\n   * against the expansion/length limits.\n   * @param {string} tier  — LIMIT_TIER_EXTERNAL | LIMIT_TIER_BASE\n   * @returns {boolean}\n   */\n  _tierCounts(tier) {\n    if (this._limitTiers.has(LIMIT_TIER_ALL)) return true;\n    return this._limitTiers.has(tier);\n  }\n\n  // -------------------------------------------------------------------------\n  // Private: entity resolution\n  // -------------------------------------------------------------------------\n\n  /**\n   * Resolve a named entity token (without & and ;).\n   * Priority: inputMap > externalMap > baseMap\n   * Returns the resolved value tagged with its limit tier.\n   *\n   * @param {string} name\n   * @returns {{ value: string, tier: string }|undefined}\n   */\n  _resolveName(name) {\n    // input and external both count as 'external' tier for limit purposes —\n    // they are injected at runtime and are the untrusted surface.\n    if (name in this._inputMap) return { value: this._inputMap[name], tier: LIMIT_TIER_EXTERNAL };\n    if (name in this._externalMap) return { value: this._externalMap[name], tier: LIMIT_TIER_EXTERNAL };\n    if (name in this._baseMap) return { value: this._baseMap[name], tier: LIMIT_TIER_BASE };\n    return undefined;\n  }\n\n  /**\n   * Classify a codepoint and return the minimum action level that must be applied.\n   * Returns -1 when no minimum is imposed (normal allow path).\n   *\n   * Ranges checked (in priority order):\n   *   1. U+0000            — null, governed by nullNCR (always ≥ remove)\n   *   2. U+D800–U+DFFF     — surrogates, always prohibited (min: remove)\n   *   3. U+0001–U+001F \\ {0x09,0x0A,0x0D}  — XML 1.0 restricted C0 (min: remove)\n   *      (skipped in XML 1.1 — C0 controls are allowed when written as NCRs)\n   *\n   * @param {number} cp  — codepoint\n   * @returns {number}   — minimum NCR_LEVEL value, or -1 for no restriction\n   */\n  _classifyNCR(cp) {\n    // 1. Null\n    if (cp === 0) return this._ncrNullLevel;\n\n    // 2. Surrogates — always prohibited, minimum 'remove'\n    if (cp >= 0xD800 && cp <= 0xDFFF) return NCR_LEVEL.remove;\n\n    // 3. XML 1.0 restricted C0 controls\n    if (this._ncrXmlVersion === 1.0) {\n      if (cp >= 0x01 && cp <= 0x1F && !XML10_ALLOWED_C0.has(cp)) return NCR_LEVEL.remove;\n    }\n\n    return -1; // no restriction\n  }\n\n  /**\n   * Execute a resolved NCR action.\n   *\n   * @param {number} action   — NCR_LEVEL value\n   * @param {string} token    — raw token (e.g. '#38') for error messages\n   * @param {number} cp       — codepoint, used only for error messages\n   * @returns {string|undefined}\n   *   - decoded character string  → 'allow'\n   *   - ''                        → 'remove'\n   *   - undefined                 → 'leave' (caller must skip past '&' only)\n   *   - throws Error              → 'throw'\n   */\n  _applyNCRAction(action, token, cp) {\n    switch (action) {\n      case NCR_LEVEL.allow: return String.fromCodePoint(cp);\n      case NCR_LEVEL.remove: return '';\n      case NCR_LEVEL.leave: return undefined; // signal: keep literal\n      case NCR_LEVEL.throw:\n        throw new Error(\n          `[EntityDecoder] Prohibited numeric character reference ` +\n          `&${token}; (U+${cp.toString(16).toUpperCase().padStart(4, '0')})`\n        );\n      default: return String.fromCodePoint(cp);\n    }\n  }\n\n  /**\n   * Full NCR resolution pipeline for a numeric token.\n   *\n   * Steps:\n   *   1. Parse the codepoint (decimal or hex).\n   *   2. Validate the raw codepoint range (NaN, <0, >0x10FFFF).\n   *   3. If numericAllowed is false and no minimum restriction applies → leave as-is.\n   *   4. Classify the codepoint to find the minimum required action level.\n   *   5. Resolve effective action = max(onNCR, minimum).\n   *   6. Apply and return.\n   *\n   * @param {string} token  — e.g. '#38', '#x26', '#X26'\n   * @returns {string|undefined}\n   *   - string (incl. '')  — replacement ('' = remove)\n   *   - undefined          — leave original &token; as-is\n   */\n  _resolveNCR(token) {\n    // Step 1: parse codepoint\n    const second = token.charCodeAt(1);\n    let cp;\n    if (second === 120 /* x */ || second === 88 /* X */) {\n      cp = parseInt(token.slice(2), 16);\n    } else {\n      cp = parseInt(token.slice(1), 10);\n    }\n\n    // Step 2: out-of-range → leave as-is unconditionally\n    if (Number.isNaN(cp) || cp < 0 || cp > 0x10FFFF) return undefined;\n\n    // Step 3: classify to get minimum action level\n    const minimum = this._classifyNCR(cp);\n\n    // Step 4: if numericAllowed is false and no hard minimum → leave\n    if (!this._numericAllowed && minimum < NCR_LEVEL.remove) return undefined;\n\n    // Step 5: effective action = max(configured onNCR, range minimum)\n    const effective = minimum === -1\n      ? this._ncrOnLevel\n      : Math.max(this._ncrOnLevel, minimum);\n\n    // Step 6: apply\n    return this._applyNCRAction(effective, token, cp);\n  }\n}","'use strict';\n///@ts-check\n\nimport { getAllMatches, isExist, DANGEROUS_PROPERTY_NAMES, criticalProperties } from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\nimport { ExpressionSet } from 'path-expression-matcher';\nimport { EntityDecoder, XML, CURRENCY, COMMON_HTML } from '@nodable/entities';\n\n// const regx =\n//   '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n//   .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\n// Helper functions for attribute and namespace handling\n\n/**\n * Extract raw attributes (without prefix) from prefixed attribute map\n * @param {object} prefixedAttrs - Attributes with prefix from buildAttributesMap\n * @param {object} options - Parser options containing attributeNamePrefix\n * @returns {object} Raw attributes for matcher\n */\nfunction extractRawAttributes(prefixedAttrs, options) {\n  if (!prefixedAttrs) return {};\n\n  // Handle attributesGroupName option\n  const attrs = options.attributesGroupName\n    ? prefixedAttrs[options.attributesGroupName]\n    : prefixedAttrs;\n\n  if (!attrs) return {};\n\n  const rawAttrs = {};\n  for (const key in attrs) {\n    // Remove the attribute prefix to get raw name\n    if (key.startsWith(options.attributeNamePrefix)) {\n      const rawName = key.substring(options.attributeNamePrefix.length);\n      rawAttrs[rawName] = attrs[key];\n    } else {\n      // Attribute without prefix (shouldn't normally happen, but be safe)\n      rawAttrs[key] = attrs[key];\n    }\n  }\n  return rawAttrs;\n}\n\n/**\n * Extract namespace from raw tag name\n * @param {string} rawTagName - Tag name possibly with namespace (e.g., \"soap:Envelope\")\n * @returns {string|undefined} Namespace or undefined\n */\nfunction extractNamespace(rawTagName) {\n  if (!rawTagName || typeof rawTagName !== 'string') return undefined;\n\n  const colonIndex = rawTagName.indexOf(':');\n  if (colonIndex !== -1 && colonIndex > 0) {\n    const ns = rawTagName.substring(0, colonIndex);\n    // Don't treat xmlns as a namespace\n    if (ns !== 'xmlns') {\n      return ns;\n    }\n  }\n  return undefined;\n}\n\nexport default class OrderedObjParser {\n  constructor(options, externalEntities) {\n    this.options = options;\n    this.currentNode = null;\n    this.tagsNodeStack = [];\n    this.parseXml = parseXml;\n    this.parseTextData = parseTextData;\n    this.resolveNameSpace = resolveNameSpace;\n    this.buildAttributesMap = buildAttributesMap;\n    this.isItStopNode = isItStopNode;\n    this.replaceEntitiesValue = replaceEntitiesValue;\n    this.readStopNodeData = readStopNodeData;\n    this.saveTextToParentTag = saveTextToParentTag;\n    this.addChild = addChild;\n    this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n    this.entityExpansionCount = 0;\n    this.currentExpandedLength = 0;\n    let namedEntities = { ...XML };\n    if (this.options.entityDecoder) {\n      this.entityDecoder = this.options.entityDecoder\n    } else {\n      if (typeof this.options.htmlEntities === \"object\") namedEntities = this.options.htmlEntities;\n      else if (this.options.htmlEntities === true) namedEntities = { ...COMMON_HTML, ...CURRENCY };\n      this.entityDecoder = new EntityDecoder({\n        namedEntities: { ...namedEntities, ...externalEntities },\n        numericAllowed: this.options.htmlEntities,\n        limit: {\n          maxTotalExpansions: this.options.processEntities.maxTotalExpansions,\n          maxExpandedLength: this.options.processEntities.maxExpandedLength,\n          applyLimitsTo: this.options.processEntities.appliesTo,\n        }\n        //postCheck: resolved => resolved\n      });\n    }\n\n    // Initialize path matcher for path-expression-matcher\n    this.matcher = new Matcher();\n\n    // Live read-only proxy of matcher — PEM creates and caches this internally.\n    // All user callbacks receive this instead of the mutable matcher.\n    this.readonlyMatcher = this.matcher.readOnly();\n\n    // Flag to track if current node is a stop node (optimization)\n    this.isCurrentNodeStopNode = false;\n\n    // Pre-compile stopNodes expressions\n    this.stopNodeExpressionsSet = new ExpressionSet();\n    const stopNodesOpts = this.options.stopNodes;\n    if (stopNodesOpts && stopNodesOpts.length > 0) {\n      for (let i = 0; i < stopNodesOpts.length; i++) {\n        const stopNodeExp = stopNodesOpts[i];\n        if (typeof stopNodeExp === 'string') {\n          // Convert string to Expression object\n          this.stopNodeExpressionsSet.add(new Expression(stopNodeExp));\n        } else if (stopNodeExp instanceof Expression) {\n          // Already an Expression object\n          this.stopNodeExpressionsSet.add(stopNodeExp);\n        }\n      }\n      this.stopNodeExpressionsSet.seal();\n    }\n  }\n\n}\n\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n  const options = this.options;\n  if (val !== undefined) {\n    if (options.trimValues && !dontTrim) {\n      val = val.trim();\n    }\n    if (val.length > 0) {\n      if (!escapeEntities) val = this.replaceEntitiesValue(val, tagName, jPath);\n\n      // Pass jPath string or matcher based on options.jPath setting\n      const jPathOrMatcher = options.jPath ? jPath.toString() : jPath;\n      const newval = options.tagValueProcessor(tagName, val, jPathOrMatcher, hasAttributes, isLeafNode);\n      if (newval === null || newval === undefined) {\n        //don't parse\n        return val;\n      } else if (typeof newval !== typeof val || newval !== val) {\n        //overwrite\n        return newval;\n      } else if (options.trimValues) {\n        return parseValue(val, options.parseTagValue, options.numberParseOptions);\n      } else {\n        const trimmedVal = val.trim();\n        if (trimmedVal === val) {\n          return parseValue(val, options.parseTagValue, options.numberParseOptions);\n        } else {\n          return val;\n        }\n      }\n    }\n  }\n}\n\nfunction resolveNameSpace(tagname) {\n  if (this.options.removeNSPrefix) {\n    const tags = tagname.split(':');\n    const prefix = tagname.charAt(0) === '/' ? '/' : '';\n    if (tags[0] === 'xmlns') {\n      return '';\n    }\n    if (tags.length === 2) {\n      tagname = prefix + tags[1];\n    }\n  }\n  return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath, tagName, force = false) {\n  const options = this.options;\n  if (force === true || (options.ignoreAttributes !== true && typeof attrStr === 'string')) {\n    // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n    //attrStr = attrStr || attrStr.trim();\n\n    const matches = getAllMatches(attrStr, attrsRegx);\n    const len = matches.length; //don't make it inline\n    const attrs = {};\n\n    // Pre-process values once: trim + entity replacement\n    // Reused in both matcher update and second pass\n    const processedVals = new Array(len);\n    let hasRawAttrs = false;\n    const rawAttrsForMatcher = {};\n\n    for (let i = 0; i < len; i++) {\n      const attrName = this.resolveNameSpace(matches[i][1]);\n      const oldVal = matches[i][4];\n\n      if (attrName.length && oldVal !== undefined) {\n        let val = oldVal;\n        if (options.trimValues) val = val.trim();\n        val = this.replaceEntitiesValue(val, tagName, this.readonlyMatcher);\n        processedVals[i] = val;\n\n        rawAttrsForMatcher[attrName] = val;\n        hasRawAttrs = true;\n      }\n    }\n\n    // Update matcher ONCE before second pass, if applicable\n    if (hasRawAttrs && typeof jPath === 'object' && jPath.updateCurrent) {\n      jPath.updateCurrent(rawAttrsForMatcher);\n    }\n\n    // Hoist toString() once — path doesn't change during attribute processing\n    const jPathStr = options.jPath ? jPath.toString() : this.readonlyMatcher;\n\n    // Second pass: apply processors, build final attrs\n    let hasAttrs = false;\n    for (let i = 0; i < len; i++) {\n      const attrName = this.resolveNameSpace(matches[i][1]);\n\n      if (this.ignoreAttributesFn(attrName, jPathStr)) continue;\n\n      let aName = options.attributeNamePrefix + attrName;\n\n      if (attrName.length) {\n        if (options.transformAttributeName) {\n          aName = options.transformAttributeName(aName);\n        }\n        aName = sanitizeName(aName, options);\n\n        if (matches[i][4] !== undefined) {\n          // Reuse already-processed value — no double entity replacement\n          const oldVal = processedVals[i];\n\n          const newVal = options.attributeValueProcessor(attrName, oldVal, jPathStr);\n          if (newVal === null || newVal === undefined) {\n            attrs[aName] = oldVal;\n          } else if (typeof newVal !== typeof oldVal || newVal !== oldVal) {\n            attrs[aName] = newVal;\n          } else {\n            attrs[aName] = parseValue(oldVal, options.parseAttributeValue, options.numberParseOptions);\n          }\n          hasAttrs = true;\n        } else if (options.allowBooleanAttributes) {\n          attrs[aName] = true;\n          hasAttrs = true;\n        }\n      }\n    }\n\n    if (!hasAttrs) return;\n\n    if (options.attributesGroupName && !options.preserveOrder) {\n      const attrCollection = {};\n      attrCollection[options.attributesGroupName] = attrs;\n      return attrCollection;\n    }\n    return attrs;\n  }\n}\nconst parseXml = function (xmlData) {\n  xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n  const xmlObj = new xmlNode('!xml');\n  let currentNode = xmlObj;\n  let textData = \"\";\n\n  // Reset matcher for new document\n  this.matcher.reset();\n  this.entityDecoder.reset();\n\n  // Reset entity expansion counters for this document\n  this.entityExpansionCount = 0;\n  this.currentExpandedLength = 0;\n  const options = this.options;\n  const docTypeReader = new DocTypeReader(options.processEntities);\n  const xmlLen = xmlData.length;\n  for (let i = 0; i < xmlLen; i++) {//for each char in XML data\n    const ch = xmlData[i];\n    if (ch === '<') {\n      // const nextIndex = i+1;\n      // const _2ndChar = xmlData[nextIndex];\n      const c1 = xmlData.charCodeAt(i + 1);\n      if (c1 === 47) {//Closing Tag '/'\n        const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n        let tagName = xmlData.substring(i + 2, closeIndex).trim();\n\n        if (options.removeNSPrefix) {\n          const colonIndex = tagName.indexOf(\":\");\n          if (colonIndex !== -1) {\n            tagName = tagName.substr(colonIndex + 1);\n          }\n        }\n\n        tagName = transformTagName(options.transformTagName, tagName, \"\", options).tagName;\n\n        if (currentNode) {\n          textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n        }\n\n        //check if last tag of nested tag was unpaired tag\n        const lastTagName = this.matcher.getCurrentTag();\n        if (tagName && options.unpairedTagsSet.has(tagName)) {\n          throw new Error(`Unpaired tag can not be used as closing tag: </${tagName}>`);\n        }\n        if (lastTagName && options.unpairedTagsSet.has(lastTagName)) {\n          // Pop the unpaired tag\n          this.matcher.pop();\n          this.tagsNodeStack.pop();\n        }\n        // Pop the closing tag\n        this.matcher.pop();\n        this.isCurrentNodeStopNode = false; // Reset flag when closing tag\n\n        currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n        textData = \"\";\n        i = closeIndex;\n      } else if (c1 === 63) { //'?'\n\n        let tagData = readTagExp(xmlData, i, false, \"?>\");\n        if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n        textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n        const attsMap = this.buildAttributesMap(tagData.tagExp, this.matcher, tagData.tagName, true);\n        if (attsMap) {\n          const ver = attsMap[this.options.attributeNamePrefix + \"version\"];\n          this.entityDecoder.setXmlVersion(Number(ver) || 1.0);\n        }\n        if ((options.ignoreDeclaration && tagData.tagName === \"?xml\") || options.ignorePiTags) {\n          //do nothing\n        } else {\n\n          const childNode = new xmlNode(tagData.tagName);\n          childNode.add(options.textNodeName, \"\");\n\n          if (tagData.tagName !== tagData.tagExp && tagData.attrExpPresent && options.ignoreAttributes !== true) {\n            childNode[\":@\"] = attsMap\n          }\n          this.addChild(currentNode, childNode, this.readonlyMatcher, i);\n        }\n\n\n        i = tagData.closeIndex + 1;\n      } else if (c1 === 33\n        && xmlData.charCodeAt(i + 2) === 45\n        && xmlData.charCodeAt(i + 3) === 45) { //'!--'\n        const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"Comment is not closed.\")\n        if (options.commentPropName) {\n          const comment = xmlData.substring(i + 4, endIndex - 2);\n\n          textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n          currentNode.add(options.commentPropName, [{ [options.textNodeName]: comment }]);\n        }\n        i = endIndex;\n      } else if (c1 === 33\n        && xmlData.charCodeAt(i + 2) === 68) { //'!D'\n        const result = docTypeReader.readDocType(xmlData, i);\n        this.entityDecoder.addInputEntities(result.entities);\n        i = result.i;\n      } else if (c1 === 33\n        && xmlData.charCodeAt(i + 2) === 91) { // '!['\n        const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n        const tagExp = xmlData.substring(i + 9, closeIndex);\n\n        textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n        let val = this.parseTextData(tagExp, currentNode.tagname, this.readonlyMatcher, true, false, true, true);\n        if (val == undefined) val = \"\";\n\n        //cdata should be set even if it is 0 length string\n        if (options.cdataPropName) {\n          currentNode.add(options.cdataPropName, [{ [options.textNodeName]: tagExp }]);\n        } else {\n          currentNode.add(options.textNodeName, val);\n        }\n\n        i = closeIndex + 2;\n      } else {//Opening tag\n        let result = readTagExp(xmlData, i, options.removeNSPrefix);\n\n        // Safety check: readTagExp can return undefined\n        if (!result) {\n          // Log context for debugging\n          const context = xmlData.substring(Math.max(0, i - 50), Math.min(xmlLen, i + 50));\n          throw new Error(`readTagExp returned undefined at position ${i}. Context: \"${context}\"`);\n        }\n\n        let tagName = result.tagName;\n        const rawTagName = result.rawTagName;\n        let tagExp = result.tagExp;\n        let attrExpPresent = result.attrExpPresent;\n        let closeIndex = result.closeIndex;\n\n        ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n        if (options.strictReservedNames &&\n          (tagName === options.commentPropName\n            || tagName === options.cdataPropName\n            || tagName === options.textNodeName\n            || tagName === options.attributesGroupName\n          )) {\n          throw new Error(`Invalid tag name: ${tagName}`);\n        }\n\n        //save text as child node\n        if (currentNode && textData) {\n          if (currentNode.tagname !== '!xml') {\n            //when nested tag is found\n            textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher, false);\n          }\n        }\n\n        //check if last tag was unpaired tag\n        const lastTag = currentNode;\n        if (lastTag && options.unpairedTagsSet.has(lastTag.tagname)) {\n          currentNode = this.tagsNodeStack.pop();\n          this.matcher.pop();\n        }\n\n        // Clean up self-closing syntax BEFORE processing attributes\n        // This is where tagExp gets the trailing / removed\n        let isSelfClosing = false;\n        if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n          isSelfClosing = true;\n          if (tagName[tagName.length - 1] === \"/\") {\n            tagName = tagName.substr(0, tagName.length - 1);\n            tagExp = tagName;\n          } else {\n            tagExp = tagExp.substr(0, tagExp.length - 1);\n          }\n\n          // Re-check attrExpPresent after cleaning\n          attrExpPresent = (tagName !== tagExp);\n        }\n\n        // Now process attributes with CLEAN tagExp (no trailing /)\n        let prefixedAttrs = null;\n        let rawAttrs = {};\n        let namespace = undefined;\n\n        // Extract namespace from rawTagName\n        namespace = extractNamespace(rawTagName);\n\n        // Push tag to matcher FIRST (with empty attrs for now) so callbacks see correct path\n        if (tagName !== xmlObj.tagname) {\n          this.matcher.push(tagName, {}, namespace);\n        }\n\n        // Now build attributes - callbacks will see correct matcher state\n        if (tagName !== tagExp && attrExpPresent) {\n          // Build attributes (returns prefixed attributes for the tree)\n          // Note: buildAttributesMap now internally updates the matcher with raw attributes\n          prefixedAttrs = this.buildAttributesMap(tagExp, this.matcher, tagName);\n\n          if (prefixedAttrs) {\n            // Extract raw attributes (without prefix) for our use\n            //TODO: seems a performance overhead\n            rawAttrs = extractRawAttributes(prefixedAttrs, options);\n          }\n        }\n\n        // Now check if this is a stop node (after attributes are set)\n        if (tagName !== xmlObj.tagname) {\n          this.isCurrentNodeStopNode = this.isItStopNode();\n        }\n\n        const startIndex = i;\n        if (this.isCurrentNodeStopNode) {\n          let tagContent = \"\";\n\n          // For self-closing tags, content is empty\n          if (isSelfClosing) {\n            i = result.closeIndex;\n          }\n          //unpaired tag\n          else if (options.unpairedTagsSet.has(tagName)) {\n            i = result.closeIndex;\n          }\n          //normal tag\n          else {\n            //read until closing tag is found\n            const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n            if (!result) throw new Error(`Unexpected end of ${rawTagName}`);\n            i = result.i;\n            tagContent = result.tagContent;\n          }\n\n          const childNode = new xmlNode(tagName);\n\n          if (prefixedAttrs) {\n            childNode[\":@\"] = prefixedAttrs;\n          }\n\n          // For stop nodes, store raw content as-is without any processing\n          childNode.add(options.textNodeName, tagContent);\n\n          this.matcher.pop(); // Pop the stop node tag\n          this.isCurrentNodeStopNode = false; // Reset flag\n\n          this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n        } else {\n          //selfClosing tag\n          if (isSelfClosing) {\n            ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n            const childNode = new xmlNode(tagName);\n            if (prefixedAttrs) {\n              childNode[\":@\"] = prefixedAttrs;\n            }\n            this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n            this.matcher.pop(); // Pop self-closing tag\n            this.isCurrentNodeStopNode = false; // Reset flag\n          }\n          else if (options.unpairedTagsSet.has(tagName)) {//unpaired tag\n            const childNode = new xmlNode(tagName);\n            if (prefixedAttrs) {\n              childNode[\":@\"] = prefixedAttrs;\n            }\n            this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n            this.matcher.pop(); // Pop unpaired tag\n            this.isCurrentNodeStopNode = false; // Reset flag\n            i = result.closeIndex;\n            // Continue to next iteration without changing currentNode\n            continue;\n          }\n          //opening tag\n          else {\n            const childNode = new xmlNode(tagName);\n            if (this.tagsNodeStack.length > options.maxNestedTags) {\n              throw new Error(\"Maximum nested tags exceeded\");\n            }\n            this.tagsNodeStack.push(currentNode);\n\n            if (prefixedAttrs) {\n              childNode[\":@\"] = prefixedAttrs;\n            }\n            this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n            currentNode = childNode;\n          }\n          textData = \"\";\n          i = closeIndex;\n        }\n      }\n    } else {\n      textData += xmlData[i];\n    }\n  }\n  return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, matcher, startIndex) {\n  // unset startIndex if not requested\n  if (!this.options.captureMetaData) startIndex = undefined;\n\n  // Pass jPath string or matcher based on options.jPath setting\n  const jPathOrMatcher = this.options.jPath ? matcher.toString() : matcher;\n  const result = this.options.updateTag(childNode.tagname, jPathOrMatcher, childNode[\":@\"])\n  if (result === false) {\n    //do nothing\n  } else if (typeof result === \"string\") {\n    childNode.tagname = result\n    currentNode.addChild(childNode, startIndex);\n  } else {\n    currentNode.addChild(childNode, startIndex);\n  }\n}\n\n/**\n * @param {object} val - Entity object with regex and val properties\n * @param {string} tagName - Tag name\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n */\nfunction replaceEntitiesValue(val, tagName, jPath) {\n  const entityConfig = this.options.processEntities;\n\n  if (!entityConfig || !entityConfig.enabled) {\n    return val;\n  }\n\n  // Check if tag is allowed to contain entities\n  if (entityConfig.allowedTags) {\n    const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n    const allowed = Array.isArray(entityConfig.allowedTags)\n      ? entityConfig.allowedTags.includes(tagName)\n      : entityConfig.allowedTags(tagName, jPathOrMatcher);\n\n    if (!allowed) {\n      return val;\n    }\n  }\n\n  // Apply custom tag filter if provided\n  if (entityConfig.tagFilter) {\n    const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n    if (!entityConfig.tagFilter(tagName, jPathOrMatcher)) {\n      return val; // Skip based on custom filter\n    }\n  }\n\n  return this.entityDecoder.decode(val);\n}\n\n\nfunction saveTextToParentTag(textData, parentNode, matcher, isLeafNode) {\n  if (textData) { //store previously collected data as textNode\n    if (isLeafNode === undefined) isLeafNode = parentNode.child.length === 0\n\n    textData = this.parseTextData(textData,\n      parentNode.tagname,\n      matcher,\n      false,\n      parentNode[\":@\"] ? Object.keys(parentNode[\":@\"]).length !== 0 : false,\n      isLeafNode);\n\n    if (textData !== undefined && textData !== \"\")\n      parentNode.add(this.options.textNodeName, textData);\n    textData = \"\";\n  }\n  return textData;\n}\n\n/**\n * @param {Array<Expression>} stopNodeExpressions - Array of compiled Expression objects\n * @param {Matcher} matcher - Current path matcher\n */\nfunction isItStopNode() {\n  if (this.stopNodeExpressionsSet.size === 0) return false;\n\n  return this.matcher.matchesAny(this.stopNodeExpressionsSet);\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\") {\n  //TODO: ignore boolean attributes in tag expression\n  //TODO: if ignore attributes, dont read full attribute expression but the end. But read for xml declaration\n  let attrBoundary = 0;\n  const len = xmlData.length;\n  const closeCode0 = closingChar.charCodeAt(0);\n  const closeCode1 = closingChar.length > 1 ? closingChar.charCodeAt(1) : -1;\n\n  let result = '';\n  let segmentStart = i;\n\n  for (let index = i; index < len; index++) {\n    const code = xmlData.charCodeAt(index);\n\n    if (attrBoundary) {\n      if (code === attrBoundary) attrBoundary = 0;\n    } else if (code === 34 || code === 39) { // \" or '\n      attrBoundary = code;\n    } else if (code === closeCode0) {\n      if (closeCode1 !== -1) {\n        if (xmlData.charCodeAt(index + 1) === closeCode1) {\n          result += xmlData.substring(segmentStart, index);\n          return { data: result, index };\n        }\n      } else {\n        result += xmlData.substring(segmentStart, index);\n        return { data: result, index };\n      }\n    } else if (code === 9 && !attrBoundary) { // \\t - only replace with space outside attribute values\n      // Flush accumulated segment, add space, start new segment\n      result += xmlData.substring(segmentStart, index) + ' ';\n      segmentStart = index + 1;\n    }\n  }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg) {\n  const closingIndex = xmlData.indexOf(str, i);\n  if (closingIndex === -1) {\n    throw new Error(errMsg)\n  } else {\n    return closingIndex + str.length - 1;\n  }\n}\n\nfunction findClosingChar(xmlData, char, i, errMsg) {\n  const closingIndex = xmlData.indexOf(char, i);\n  if (closingIndex === -1) throw new Error(errMsg);\n  return closingIndex; // no offset needed\n}\n\nfunction readTagExp(xmlData, i, removeNSPrefix, closingChar = \">\") {\n  const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar);\n  if (!result) return;\n  let tagExp = result.data;\n  const closeIndex = result.index;\n  const separatorIndex = tagExp.search(/\\s/);\n  let tagName = tagExp;\n  let attrExpPresent = true;\n  if (separatorIndex !== -1) {//separate tag name and attributes expression\n    tagName = tagExp.substring(0, separatorIndex);\n    tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n  }\n\n  const rawTagName = tagName;\n  if (removeNSPrefix) {\n    const colonIndex = tagName.indexOf(\":\");\n    if (colonIndex !== -1) {\n      tagName = tagName.substr(colonIndex + 1);\n      attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n    }\n  }\n\n  return {\n    tagName: tagName,\n    tagExp: tagExp,\n    closeIndex: closeIndex,\n    attrExpPresent: attrExpPresent,\n    rawTagName: rawTagName,\n  }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i) {\n  const startIndex = i;\n  // Starting at 1 since we already have an open tag\n  let openTagCount = 1;\n\n  const xmllen = xmlData.length;\n  for (; i < xmllen; i++) {\n    if (xmlData[i] === \"<\") {\n      const c1 = xmlData.charCodeAt(i + 1);\n      if (c1 === 47) {//close tag '/'\n        const closeIndex = findClosingChar(xmlData, \">\", i, `${tagName} is not closed`);\n        let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n        if (closeTagName === tagName) {\n          openTagCount--;\n          if (openTagCount === 0) {\n            return {\n              tagContent: xmlData.substring(startIndex, i),\n              i: closeIndex\n            }\n          }\n        }\n        i = closeIndex;\n      } else if (c1 === 63) { //?\n        const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\")\n        i = closeIndex;\n      } else if (c1 === 33\n        && xmlData.charCodeAt(i + 2) === 45\n        && xmlData.charCodeAt(i + 3) === 45) { // '!--'\n        const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\")\n        i = closeIndex;\n      } else if (c1 === 33\n        && xmlData.charCodeAt(i + 2) === 91) { // '!['\n        const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n        i = closeIndex;\n      } else {\n        const tagData = readTagExp(xmlData, i, '>')\n\n        if (tagData) {\n          const openTagName = tagData && tagData.tagName;\n          if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n            openTagCount++;\n          }\n          i = tagData.closeIndex;\n        }\n      }\n    }\n  }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n  if (shouldParse && typeof val === 'string') {\n    //console.log(options)\n    const newval = val.trim();\n    if (newval === 'true') return true;\n    else if (newval === 'false') return false;\n    else return toNumber(val, options);\n  } else {\n    if (isExist(val)) {\n      return val;\n    } else {\n      return '';\n    }\n  }\n}\n\nfunction fromCodePoint(str, base, prefix) {\n  const codePoint = Number.parseInt(str, base);\n\n  if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n    return String.fromCodePoint(codePoint);\n  } else {\n    return prefix + str + \";\";\n  }\n}\n\nfunction transformTagName(fn, tagName, tagExp, options) {\n  if (fn) {\n    const newTagName = fn(tagName);\n    if (tagExp === tagName) {\n      tagExp = newTagName\n    }\n    tagName = newTagName;\n  }\n  tagName = sanitizeName(tagName, options);\n  return { tagName, tagExp };\n}\n\n\n\nfunction sanitizeName(name, options) {\n  if (criticalProperties.includes(name)) {\n    throw new Error(`[SECURITY] Invalid name: \"${name}\" is a reserved JavaScript keyword that could cause prototype pollution`);\n  } else if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n    return options.onDangerousProperty(name);\n  }\n  return name;\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n    if (typeof ignoreAttributes === 'function') {\n        return ignoreAttributes\n    }\n    if (Array.isArray(ignoreAttributes)) {\n        return (attrName) => {\n            for (const pattern of ignoreAttributes) {\n                if (typeof pattern === 'string' && attrName === pattern) {\n                    return true\n                }\n                if (pattern instanceof RegExp && pattern.test(attrName)) {\n                    return true\n                }\n            }\n        }\n    }\n    return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\nimport { Matcher } from 'path-expression-matcher';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * Helper function to strip attribute prefix from attribute map\n * @param {object} attrs - Attributes with prefix (e.g., {\"@_class\": \"code\"})\n * @param {string} prefix - Attribute prefix to remove (e.g., \"@_\")\n * @returns {object} Attributes without prefix (e.g., {\"class\": \"code\"})\n */\nfunction stripAttributePrefix(attrs, prefix) {\n  if (!attrs || typeof attrs !== 'object') return {};\n  if (!prefix) return attrs;\n\n  const rawAttrs = {};\n  for (const key in attrs) {\n    if (key.startsWith(prefix)) {\n      const rawName = key.substring(prefix.length);\n      rawAttrs[rawName] = attrs[key];\n    } else {\n      // Attribute without prefix (shouldn't normally happen, but be safe)\n      rawAttrs[key] = attrs[key];\n    }\n  }\n  return rawAttrs;\n}\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns \n */\nexport default function prettify(node, options, matcher, readonlyMatcher) {\n  return compress(node, options, matcher, readonlyMatcher);\n}\n\n/**\n * @param {array} arr \n * @param {object} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns object\n */\nfunction compress(arr, options, matcher, readonlyMatcher) {\n  let text;\n  const compressedObj = {}; //This is intended to be a plain object\n  for (let i = 0; i < arr.length; i++) {\n    const tagObj = arr[i];\n    const property = propName(tagObj);\n\n    // Push current property to matcher WITH RAW ATTRIBUTES (no prefix)\n    if (property !== undefined && property !== options.textNodeName) {\n      const rawAttrs = stripAttributePrefix(\n        tagObj[\":@\"] || {},\n        options.attributeNamePrefix\n      );\n      matcher.push(property, rawAttrs);\n    }\n\n    if (property === options.textNodeName) {\n      if (text === undefined) text = tagObj[property];\n      else text += \"\" + tagObj[property];\n    } else if (property === undefined) {\n      continue;\n    } else if (tagObj[property]) {\n\n      let val = compress(tagObj[property], options, matcher, readonlyMatcher);\n      const isLeaf = isLeafTag(val, options);\n\n      if (tagObj[\":@\"]) {\n        assignAttributes(val, tagObj[\":@\"], readonlyMatcher, options);\n      } else if (Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode) {\n        val = val[options.textNodeName];\n      } else if (Object.keys(val).length === 0) {\n        if (options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n        else val = \"\";\n      }\n\n      if (tagObj[METADATA_SYMBOL] !== undefined && typeof val === \"object\" && val !== null) {\n        val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n      }\n\n\n      if (compressedObj[property] !== undefined && Object.prototype.hasOwnProperty.call(compressedObj, property)) {\n        if (!Array.isArray(compressedObj[property])) {\n          compressedObj[property] = [compressedObj[property]];\n        }\n        compressedObj[property].push(val);\n      } else {\n        //TODO: if a node is not an array, then check if it should be an array\n        //also determine if it is a leaf node\n\n        // Pass jPath string or readonlyMatcher based on options.jPath setting\n        const jPathOrMatcher = options.jPath ? readonlyMatcher.toString() : readonlyMatcher;\n        if (options.isArray(property, jPathOrMatcher, isLeaf)) {\n          compressedObj[property] = [val];\n        } else {\n          compressedObj[property] = val;\n        }\n      }\n\n      // Pop property from matcher after processing\n      if (property !== undefined && property !== options.textNodeName) {\n        matcher.pop();\n      }\n    }\n\n  }\n  // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n  if (typeof text === \"string\") {\n    if (text.length > 0) compressedObj[options.textNodeName] = text;\n  } else if (text !== undefined) compressedObj[options.textNodeName] = text;\n\n\n  return compressedObj;\n}\n\nfunction propName(obj) {\n  const keys = Object.keys(obj);\n  for (let i = 0; i < keys.length; i++) {\n    const key = keys[i];\n    if (key !== \":@\") return key;\n  }\n}\n\nfunction assignAttributes(obj, attrMap, readonlyMatcher, options) {\n  if (attrMap) {\n    const keys = Object.keys(attrMap);\n    const len = keys.length; //don't make it inline\n    for (let i = 0; i < len; i++) {\n      const atrrName = keys[i];  // This is the PREFIXED name (e.g., \"@_class\")\n\n      // Strip prefix for matcher path (for isArray callback)\n      const rawAttrName = atrrName.startsWith(options.attributeNamePrefix)\n        ? atrrName.substring(options.attributeNamePrefix.length)\n        : atrrName;\n\n      // For attributes, we need to create a temporary path\n      // Pass jPath string or matcher based on options.jPath setting\n      const jPathOrMatcher = options.jPath\n        ? readonlyMatcher.toString() + \".\" + rawAttrName\n        : readonlyMatcher;\n\n      if (options.isArray(atrrName, jPathOrMatcher, true, true)) {\n        obj[atrrName] = [attrMap[atrrName]];\n      } else {\n        obj[atrrName] = attrMap[atrrName];\n      }\n    }\n  }\n}\n\nfunction isLeafTag(obj, options) {\n  const { textNodeName } = options;\n  const propCount = Object.keys(obj).length;\n\n  if (propCount === 0) {\n    return true;\n  }\n\n  if (\n    propCount === 1 &&\n    (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n  ) {\n    return true;\n  }\n\n  return false;\n}","'use strict';\n\nimport { getAllMatches, isName } from './util.js';\n\nconst defaultOptions = {\n  allowBooleanAttributes: false, //A tag can have attributes without any value\n  unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexport function validate(xmlData, options) {\n  options = Object.assign({}, defaultOptions, options);\n\n  //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n  //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n  //xmlData = xmlData.replace(/(<!DOCTYPE[\\s\\w\\\"\\.\\/\\-\\:]+(\\[.*\\])*\\s*>)/g,\"\");//Remove DOCTYPE\n  const tags = [];\n  let tagFound = false;\n\n  //indicates that the root tag has been closed (aka. depth 0 has been reached)\n  let reachedRoot = false;\n\n  if (xmlData[0] === '\\ufeff') {\n    // check for byte order mark (BOM)\n    xmlData = xmlData.substr(1);\n  }\n\n  for (let i = 0; i < xmlData.length; i++) {\n\n    if (xmlData[i] === '<' && xmlData[i + 1] === '?') {\n      i += 2;\n      i = readPI(xmlData, i);\n      if (i.err) return i;\n    } else if (xmlData[i] === '<') {\n      //starting of tag\n      //read until you reach to '>' avoiding any '>' in attribute value\n      let tagStartPos = i;\n      i++;\n\n      if (xmlData[i] === '!') {\n        i = readCommentAndCDATA(xmlData, i);\n        continue;\n      } else {\n        let closingTag = false;\n        if (xmlData[i] === '/') {\n          //closing tag\n          closingTag = true;\n          i++;\n        }\n        //read tagname\n        let tagName = '';\n        for (; i < xmlData.length &&\n          xmlData[i] !== '>' &&\n          xmlData[i] !== ' ' &&\n          xmlData[i] !== '\\t' &&\n          xmlData[i] !== '\\n' &&\n          xmlData[i] !== '\\r'; i++\n        ) {\n          tagName += xmlData[i];\n        }\n        tagName = tagName.trim();\n        //console.log(tagName);\n\n        if (tagName[tagName.length - 1] === '/') {\n          //self closing tag without attributes\n          tagName = tagName.substring(0, tagName.length - 1);\n          //continue;\n          i--;\n        }\n        if (!validateTagName(tagName)) {\n          let msg;\n          if (tagName.trim().length === 0) {\n            msg = \"Invalid space after '<'.\";\n          } else {\n            msg = \"Tag '\" + tagName + \"' is an invalid name.\";\n          }\n          return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n        }\n\n        const result = readAttributeStr(xmlData, i);\n        if (result === false) {\n          return getErrorObject('InvalidAttr', \"Attributes for '\" + tagName + \"' have open quote.\", getLineNumberForPosition(xmlData, i));\n        }\n        let attrStr = result.value;\n        i = result.index;\n\n        if (attrStr[attrStr.length - 1] === '/') {\n          //self closing tag\n          const attrStrStart = i - attrStr.length;\n          attrStr = attrStr.substring(0, attrStr.length - 1);\n          const isValid = validateAttributeString(attrStr, options);\n          if (isValid === true) {\n            tagFound = true;\n            //continue; //text may presents after self closing tag\n          } else {\n            //the result from the nested function returns the position of the error within the attribute\n            //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n            //this gives us the absolute index in the entire xml, which we can use to find the line at last\n            return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n          }\n        } else if (closingTag) {\n          if (!result.tagClosed) {\n            return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n          } else if (attrStr.trim().length > 0) {\n            return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n          } else if (tags.length === 0) {\n            return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n          } else {\n            const otg = tags.pop();\n            if (tagName !== otg.tagName) {\n              let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n              return getErrorObject('InvalidTag',\n                \"Expected closing tag '\" + otg.tagName + \"' (opened in line \" + openPos.line + \", col \" + openPos.col + \") instead of closing tag '\" + tagName + \"'.\",\n                getLineNumberForPosition(xmlData, tagStartPos));\n            }\n\n            //when there are no more tags, we reached the root level.\n            if (tags.length == 0) {\n              reachedRoot = true;\n            }\n          }\n        } else {\n          const isValid = validateAttributeString(attrStr, options);\n          if (isValid !== true) {\n            //the result from the nested function returns the position of the error within the attribute\n            //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n            //this gives us the absolute index in the entire xml, which we can use to find the line at last\n            return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n          }\n\n          //if the root level has been reached before ...\n          if (reachedRoot === true) {\n            return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n          } else if (options.unpairedTags.indexOf(tagName) !== -1) {\n            //don't push into stack\n          } else {\n            tags.push({ tagName, tagStartPos });\n          }\n          tagFound = true;\n        }\n\n        //skip tag text value\n        //It may include comments and CDATA value\n        for (i++; i < xmlData.length; i++) {\n          if (xmlData[i] === '<') {\n            if (xmlData[i + 1] === '!') {\n              //comment or CADATA\n              i++;\n              i = readCommentAndCDATA(xmlData, i);\n              continue;\n            } else if (xmlData[i + 1] === '?') {\n              i = readPI(xmlData, ++i);\n              if (i.err) return i;\n            } else {\n              break;\n            }\n          } else if (xmlData[i] === '&') {\n            const afterAmp = validateAmpersand(xmlData, i);\n            if (afterAmp == -1)\n              return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n            i = afterAmp;\n          } else {\n            if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n              return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n            }\n          }\n        } //end of reading tag text value\n        if (xmlData[i] === '<') {\n          i--;\n        }\n      }\n    } else {\n      if (isWhiteSpace(xmlData[i])) {\n        continue;\n      }\n      return getErrorObject('InvalidChar', \"char '\" + xmlData[i] + \"' is not expected.\", getLineNumberForPosition(xmlData, i));\n    }\n  }\n\n  if (!tagFound) {\n    return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n  } else if (tags.length == 1) {\n    return getErrorObject('InvalidTag', \"Unclosed tag '\" + tags[0].tagName + \"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n  } else if (tags.length > 0) {\n    return getErrorObject('InvalidXml', \"Invalid '\" +\n      JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '') +\n      \"' found.\", { line: 1, col: 1 });\n  }\n\n  return true;\n};\n\nfunction isWhiteSpace(char) {\n  return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n  const start = i;\n  for (; i < xmlData.length; i++) {\n    if (xmlData[i] == '?' || xmlData[i] == ' ') {\n      //tagname\n      const tagname = xmlData.substr(start, i - start);\n      if (i > 5 && tagname === 'xml') {\n        return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n      } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n        //check if valid attribut string\n        i++;\n        break;\n      } else {\n        continue;\n      }\n    }\n  }\n  return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n  if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n    //comment\n    for (i += 3; i < xmlData.length; i++) {\n      if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n        i += 2;\n        break;\n      }\n    }\n  } else if (\n    xmlData.length > i + 8 &&\n    xmlData[i + 1] === 'D' &&\n    xmlData[i + 2] === 'O' &&\n    xmlData[i + 3] === 'C' &&\n    xmlData[i + 4] === 'T' &&\n    xmlData[i + 5] === 'Y' &&\n    xmlData[i + 6] === 'P' &&\n    xmlData[i + 7] === 'E'\n  ) {\n    let angleBracketsCount = 1;\n    for (i += 8; i < xmlData.length; i++) {\n      if (xmlData[i] === '<') {\n        angleBracketsCount++;\n      } else if (xmlData[i] === '>') {\n        angleBracketsCount--;\n        if (angleBracketsCount === 0) {\n          break;\n        }\n      }\n    }\n  } else if (\n    xmlData.length > i + 9 &&\n    xmlData[i + 1] === '[' &&\n    xmlData[i + 2] === 'C' &&\n    xmlData[i + 3] === 'D' &&\n    xmlData[i + 4] === 'A' &&\n    xmlData[i + 5] === 'T' &&\n    xmlData[i + 6] === 'A' &&\n    xmlData[i + 7] === '['\n  ) {\n    for (i += 8; i < xmlData.length; i++) {\n      if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n        i += 2;\n        break;\n      }\n    }\n  }\n\n  return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n  let attrStr = '';\n  let startChar = '';\n  let tagClosed = false;\n  for (; i < xmlData.length; i++) {\n    if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n      if (startChar === '') {\n        startChar = xmlData[i];\n      } else if (startChar !== xmlData[i]) {\n        //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n      } else {\n        startChar = '';\n      }\n    } else if (xmlData[i] === '>') {\n      if (startChar === '') {\n        tagClosed = true;\n        break;\n      }\n    }\n    attrStr += xmlData[i];\n  }\n  if (startChar !== '') {\n    return false;\n  }\n\n  return {\n    value: attrStr,\n    index: i,\n    tagClosed: tagClosed\n  };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab  cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n  //console.log(\"start:\"+attrStr+\":end\");\n\n  //if(attrStr.trim().length === 0) return true; //empty string\n\n  const matches = getAllMatches(attrStr, validAttrStrRegxp);\n  const attrNames = {};\n\n  for (let i = 0; i < matches.length; i++) {\n    if (matches[i][1].length === 0) {\n      //nospace before attribute name: a=\"sd\"b=\"saf\"\n      return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' has no space in starting.\", getPositionFromMatch(matches[i]))\n    } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n      return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' is without value.\", getPositionFromMatch(matches[i]));\n    } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n      //independent attribute: ab\n      return getErrorObject('InvalidAttr', \"boolean attribute '\" + matches[i][2] + \"' is not allowed.\", getPositionFromMatch(matches[i]));\n    }\n    /* else if(matches[i][6] === undefined){//attribute without value: ab=\n                    return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n                } */\n    const attrName = matches[i][2];\n    if (!validateAttrName(attrName)) {\n      return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is an invalid name.\", getPositionFromMatch(matches[i]));\n    }\n    if (!Object.prototype.hasOwnProperty.call(attrNames, attrName)) {\n      //check for duplicate attribute.\n      attrNames[attrName] = 1;\n    } else {\n      return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is repeated.\", getPositionFromMatch(matches[i]));\n    }\n  }\n\n  return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n  let re = /\\d/;\n  if (xmlData[i] === 'x') {\n    i++;\n    re = /[\\da-fA-F]/;\n  }\n  for (; i < xmlData.length; i++) {\n    if (xmlData[i] === ';')\n      return i;\n    if (!xmlData[i].match(re))\n      break;\n  }\n  return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n  // https://www.w3.org/TR/xml/#dt-charref\n  i++;\n  if (xmlData[i] === ';')\n    return -1;\n  if (xmlData[i] === '#') {\n    i++;\n    return validateNumberAmpersand(xmlData, i);\n  }\n  let count = 0;\n  for (; i < xmlData.length; i++, count++) {\n    if (xmlData[i].match(/\\w/) && count < 20)\n      continue;\n    if (xmlData[i] === ';')\n      break;\n    return -1;\n  }\n  return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n  return {\n    err: {\n      code: code,\n      msg: message,\n      line: lineNumber.line || lineNumber,\n      col: lineNumber.col,\n    },\n  };\n}\n\nfunction validateAttrName(attrName) {\n  return isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n  return isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n  const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n  return {\n    line: lines.length,\n\n    // column number is last line's length + 1, because column numbering starts at 1:\n    col: lines[lines.length - 1].length + 1\n  };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n  return match.startIndex + match[1].length;\n}\n","import { buildOptions } from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport { validate } from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class XMLParser {\n\n    constructor(options) {\n        this.externalEntities = {};\n        this.options = buildOptions(options);\n\n    }\n    /**\n     * Parse XML dats to JS object \n     * @param {string|Uint8Array} xmlData \n     * @param {boolean|Object} validationOption \n     */\n    parse(xmlData, validationOption) {\n        if (typeof xmlData !== \"string\" && xmlData.toString) {\n            xmlData = xmlData.toString();\n        } else if (typeof xmlData !== \"string\") {\n            throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n        }\n\n        if (validationOption) {\n            if (validationOption === true) validationOption = {}; //validate with default options\n\n            const result = validate(xmlData, validationOption);\n            if (result !== true) {\n                throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`)\n            }\n        }\n        const orderedObjParser = new OrderedObjParser(this.options, this.externalEntities);\n        // orderedObjParser.entityDecoder.setExternalEntities(this.externalEntities);\n        const orderedResult = orderedObjParser.parseXml(xmlData);\n        if (this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n        else return prettify(orderedResult, this.options, orderedObjParser.matcher, orderedObjParser.readonlyMatcher);\n    }\n\n    /**\n     * Add Entity which is not by default supported by this library\n     * @param {string} key \n     * @param {string} value \n     */\n    addEntity(key, value) {\n        if (value.indexOf(\"&\") !== -1) {\n            throw new Error(\"Entity value can't have '&'\")\n        } else if (key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1) {\n            throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '&#xD;'\")\n        } else if (value === \"&\") {\n            throw new Error(\"An entity with value '&' is not permitted\");\n        } else {\n            this.externalEntities[key] = value;\n        }\n    }\n\n    /**\n     * Returns a Symbol that can be used to access the metadata\n     * property on a node.\n     * \n     * If Symbol is not available in the environment, an ordinary property is used\n     * and the name of the property is here returned.\n     * \n     * The XMLMetaData property is only present when `captureMetaData`\n     * is true in the options.\n     */\n    static getMetaDataSymbol() {\n        return XmlNode.getMetaDataSymbol();\n    }\n}"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","isName","DANGEROUS_PROPERTY_NAMES","criticalProperties","defaultOnDangerousProperty","name","includes","defaultOptions","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","allowBooleanAttributes","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","tagName","val","attributeValueProcessor","attrName","stopNodes","alwaysCreateTextNode","isArray","commentPropName","unpairedTags","processEntities","htmlEntities","entityDecoder","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","maxNestedTags","strictReservedNames","onDangerousProperty","validatePropertyName","propertyName","optionName","normalized","toLowerCase","some","dangerous","Error","normalizeProcessEntities","enabled","maxEntitySize","maxExpansionDepth","maxTotalExpansions","Infinity","maxExpandedLength","maxEntityCount","allowedTags","tagFilter","appliesTo","Math","max","_value$maxEntitySize","_value$maxExpansionDe","_value$maxTotalExpans","_value$maxExpandedLen","_value$maxEntityCount","_value$allowedTags","_value$tagFilter","_value$appliesTo","METADATA_SYMBOL","buildOptions","options","built","assign","_i","_propertyNameOptions","_propertyNameOptions$","unpairedTagsSet","Set","Array","map","node","startsWith","substring","XmlNode","tagname","child","create","_proto","add","_this$child$push","addChild","_this$child$push2","_this$child$push3","keys","undefined","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","xmlData","i","entities","entityCount","angleBracketsCount","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","indexOf","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","toUpperCase","entityValue","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","startChar","elementName","contentModel","trim","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","defaultValue","_this$readIdentifierV5","data","seq","j","hexRegex","numRegex","consider","decimalPoint","infinity","eNotationRegx","MatcherView","constructor","matcher","_matcher","separator","getCurrentTag","path","tag","getCurrentNamespace","namespace","getAttrValue","values","hasAttr","current","getPosition","position","getCounter","counter","getIndex","getDepth","toString","includeNamespace","toArray","n","expression","matchesAny","exprSet","Matcher","siblingStacks","_pathStringCache","_view","attrValues","currentLevel","Map","siblings","siblingKey","count","set","pop","updateCurrent","sep","result","reset","segments","hasDeepWildcard","_matchWithDeepWildcard","_matchSimple","_matchSegment","pathIdx","segIdx","segment","nextSeg","found","isCurrentNode","attrValue","String","positionValue","snapshot","restore","readOnly","Expression","pattern","_parse","_hasDeepWildcard","seg","_hasAttributeCondition","_hasPositionSelector","currentPart","_parseSegment","part","bracketContent","withoutBrackets","bracketMatch","content","slice","tagAndPosition","nsIndex","positionMatch","colonIndex","lastIndexOf","tagPart","posPart","eqIndex","nthMatch","parseInt","hasAttributeCondition","hasPositionSelector","ExpressionSet","_byDepthAndTag","_wildcardByDepth","_deepWildcards","_patterns","_sealed","TypeError","has","depth","lastSeg","addAll","expressions","expr","size","seal","isSealed","findMatch","exactKey","exactBucket","wildcardBucket","CURRENCY","cent","pound","curren","yen","euro","dollar","fnof","inr","af","birr","peso","rub","won","yuan","cedil","XML","amp","apos","gt","lt","quot","COMMON_HTML","nbsp","copy","reg","trade","mdash","ndash","hellip","laquo","raquo","lsquo","rsquo","ldquo","rdquo","bull","para","sect","deg","frac12","frac14","frac34","SPECIAL_CHARS","ch","mergeEntityMaps","maps","out","raw","LIMIT_TIER_EXTERNAL","LIMIT_TIER_BASE","LIMIT_TIER_ALL","NCR_LEVEL","freeze","allow","leave","remove","throw","XML10_ALLOWED_C0","EntityDecoder","_limit","limit","_maxTotalExpansions","_maxExpandedLength","_postCheck","postCheck","r","_limitTiers","applyLimitsTo","_numericAllowed","numericAllowed","_baseMap","DEFAULT_XML_ENTITIES","namedEntities","_externalMap","_inputMap","_totalExpansions","_expandedLength","_removeSet","_leaveSet","ncrCfg","ncr","xmlVersion","onLevel","nullLevel","onNCR","nullNCR","parseNCRConfig","_ncrXmlVersion","_ncrOnLevel","_ncrNullLevel","setExternalEntities","addExternalEntity","addInputEntities","setXmlVersion","version","decode","str","original","chunks","last","limitExpansions","limitLength","checkLimits","charCodeAt","token","replacement","tier","ncrResult","_resolveNCR","resolved","_resolveName","_tierCounts","delta","_classifyNCR","cp","_applyNCRAction","action","fromCodePoint","padStart","second","Number","isNaN","minimum","effective","_extends","bind","e","arguments","t","apply","extractRawAttributes","prefixedAttrs","rawAttrs","extractNamespace","rawTagName","ns","OrderedObjParser","externalEntities","currentNode","tagsNodeStack","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","_step","_iterator","_createForOfIteratorHelperLoose","done","entityExpansionCount","currentExpandedLength","readonlyMatcher","isCurrentNodeStopNode","stopNodeExpressionsSet","stopNodesOpts","stopNodeExp","dontTrim","hasAttributes","isLeafNode","escapeEntities","jPathOrMatcher","newval","parseValue","tags","split","prefix","charAt","attrsRegx","attrStr","force","processedVals","hasRawAttrs","rawAttrsForMatcher","oldVal","jPathStr","hasAttrs","aName","sanitizeName","newVal","attrCollection","replace","xmlObj","xmlNode","textData","docTypeReader","xmlLen","c1","closeIndex","findClosingIndex","substr","lastTagName","tagData","readTagExp","attsMap","tagExp","ver","childNode","attrExpPresent","endIndex","_ref","_ref2","context","min","_transformTagName","lastTag","isSelfClosing","tagContent","_transformTagName2","entityConfig","parentNode","errMsg","closingIndex","findClosingChar","char","closingChar","attrBoundary","closeCode0","closeCode1","segmentStart","code","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","xmllen","shouldParse","trimmedStr","skipLike","numStr","window","parse_int","isFinite","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","isPositive","handleInfinity","toNumber","fn","newTagName","stripAttributePrefix","prettify","compress","arr","text","compressedObj","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","atrrName","rawAttrName","propCount","isWhiteSpace","readPI","start","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","readAttributeStr","tagClosed","validAttrStrRegxp","validateAttributeString","attrNames","getPositionFromMatch","validateAttrName","validateAmpersand","re","validateNumberAmpersand","message","lineNumber","err","msg","line","col","validateTagName","lines","XMLParser","parse","validationOption","tagFound","reachedRoot","tagStartPos","closingTag","attrStrStart","isValid","otg","openPos","afterAmp","JSON","stringify","validate","orderedObjParser","orderedResult","addEntity"],"sourceRoot":""}