[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ninsert_final_newline = false\ncharset = utf-8\nindent_style = tab\nindent_size = 4\n\n[tests/languages/**.test]\nend_of_line = crlf\n\n[{package.json,.travis.yml}]\nindent_style = space\nindent_size = 2"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve.\ntitle: ''\nlabels: ''\nassignees: ''\n---\n\n**Information:**\n\n- Prism version: [e.g. 1.14, latest from the download page, etc.]\n- Plugins: [a list of plugins you are using or 'none']\n- Environment: [e.g. Browser, Node, Webpack]\n\n<!--\nDoes the latest version of Prism from the [download page](https://prismjs.com/download.html) also have this issue?\n\nIf you're using Prism with Node or Webpack, please also see the [usage section](https://prismjs.com/index.html#basic-usage).\n-->\n\n**Description**\nA clear and concise description of what the bug is and how to reproduce it.\nIf applicable, add screenshots to help explain your problem.\n\n**Example**\nAn example which reproduces the bug. This can be a link to a website, a [JSFiddle](https://jsfiddle.net/), an attached example project, etc.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "contact_links:\n  - name: Questions and Help\n    url: https://github.com/PrismJS/prism/discussions/categories/q-a\n    about: This issue tracker is not for support questions. Please refer to the Prism's Discussion tab.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest a new feature for Prism.\ntitle: ''\nlabels: enhancement\nassignees: ''\n---\n\n**Motivation**\nPlease explain the problem you're having/why you propose this feature. Ex. I'm always frustrated when [...]\n\n**Description**\nA clear and concise description of what you want to happen.\n\n**Alternatives**\nA clear and concise description of any alternative solutions or features you've considered, if applicable.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/highlighting-bug-report.md",
    "content": "---\nname: Highlighting bug report\nabout: Does Prism highlight parts of your code incorrectly or is a language feature\n    not supported?\ntitle: ''\nlabels: language-definitions\nassignees: ''\n---\n\n**Information**\n\n- Language: [e.g. C++, JavaScript, YAML, etc.]\n- Plugins: [a list of plugins you are using or 'none']\n\n<!--\nPlease verify that the problem still occurs in the latest version of Prism.\n\nYou can check this using the [test page](https://prismjs.com/test.html) or by getting the latest version at our [download page](https://prismjs.com/download.html).\n-->\n\n**Description**\nA clear and concise description of what is being highlighted incorrectly and how it should be highlighted instead. Add screenshots to illustrate the problem.\n\n**Code snippet**\n\n<!--\nPlease add a link to the [test page](https://prismjs.com/test.html) that reproduces your issue (hover over \"Share\" and insert the link below).\n-->\n\n[Test page]()\n\n<details>\n<summary>The code being highlighted incorrectly.</summary>\n\n```\nYour code goes here\n```\n\n</details>\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/new-language-request.md",
    "content": "---\nname: New language request\nabout: Suggest a new language Prism should support.\ntitle: ''\nlabels: language-definitions, new language\nassignees: ''\n---\n\n**Language**\nA short description of the language.\n\n**Additional resources**\nE.g. The official website, documentation or language specification.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: 'github-actions'\n    directory: '/'\n    schedule:\n      interval: 'weekly'\n"
  },
  {
    "path": ".github/workflows/danger.yml",
    "content": "name: Danger\n\non:\n  pull_request_target:\n\njobs:\n  run:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n      # create a new branch called pr from the remote PR branch\n      - run: git remote add pr_repo $PR_URL && git fetch pr_repo $PR_REF && git branch pr pr_repo/$PR_REF\n        env:\n          PR_URL: ${{github.event.pull_request.head.repo.clone_url}}\n          PR_REF: ${{github.event.pull_request.head.ref}}\n      - run: npm ci\n      - name: Danger\n        run: npx danger ci\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: CI\n\non:\n  push:\n    branches: [v2]\n  pull_request:\n    branches: [v2]\n\npermissions:\n  contents: read\n\njobs:\n  tests:\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [20.x, 22.x, 24.x]\n\n    steps:\n      - uses: actions/checkout@v6\n      - name: Use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@v3\n        with:\n          node-version: ${{ matrix.node-version }}\n      - run: npm ci\n      - run: npm test\n\n  build:\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [20.x, 22.x, 24.x]\n\n    steps:\n      - uses: actions/checkout@v6\n      - name: Use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@v3\n        with:\n          node-version: ${{ matrix.node-version }}\n      - run: npm ci\n      - run: npm run build\n\n  lint:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v6\n      - name: Use Node.js 20.x\n        uses: actions/setup-node@v3\n        with:\n          node-version: 20.x\n      - run: npm ci\n      - run: npm run lint:ci\n\n  coverage:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v6\n      - name: Use Node.js 20.x\n        uses: actions/setup-node@v3\n        with:\n          node-version: 20.x\n      - run: npm ci\n      - run: npm run regex-coverage\n"
  },
  {
    "path": ".github/workflows/website-rebuild.yml",
    "content": "name: Rebuild Website\n\non:\n  push:\n    branches:\n      # FIXME: Use the main branch when v2 is out\n      - v2\n\njobs:\n  trigger-rebuild:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Trigger Netlify Build Hook\n        run: curl -X POST -d \"{}\" \"${{ secrets.WEBSITE_BUILD_HOOK_URL }}?trigger_title=The+Prism+code+has+been+updated\"\n"
  },
  {
    "path": ".gitignore",
    "content": "hide-*.js\nnode_modules\n.idea/\n.DS_Store\n.eslintcache\ndist/\ntypes/\n\nbenchmark/remotes/\nbenchmark/downloads/\n"
  },
  {
    "path": ".jsdoc.json",
    "content": "{\n\t\"plugins\": [\"plugins/markdown\", \"./gulpfile.js/docs.js\"],\n\t\"opts\": {\n\t\t\"destination\": \"./docs\",\n\t\t\"encoding\": \"utf8\",\n\t\t\"template\": \"./node_modules/docdash\",\n\t\t\"access\": [\"public\", \"protected\"]\n\t},\n\t\"recurseDepth\": 10,\n\t\"source\": {\n\t\t\"includePattern\": \"\\\\.js$\",\n\t\t\"excludePattern\": \"\\\\.min\\\\.js$\"\n\t},\n\t\"tags\": {\n\t\t\"allowUnknownTags\": true,\n\t\t\"dictionaries\": [\"jsdoc\", \"closure\"]\n\t},\n\t\"templates\": {\n\t\t\"cleverLinks\": true,\n\t\t\"monospaceLinks\": true,\n\t\t\"default\": {\n\t\t\t\"includeDate\": false\n\t\t}\n\t},\n\t\"docdash\": {\n\t\t\"static\": true,\n\t\t\"sort\": true,\n\t\t\"search\": true,\n\t\t\"collapse\": false,\n\t\t\"wrap\": false,\n\t\t\"typedefs\": true,\n\t\t\"private\": false,\n\t\t\"scripts\": [\"styles/overwrites.css\"],\n\t\t\"openGraph\": {\n\t\t\t\"title\": \"Prism generated API documentation\",\n\t\t\t\"type\": \"website\",\n\t\t\t\"image\": \"/logo.svg\",\n\t\t\t\"site_name\": \"Prism\",\n\t\t\t\"url\": \"https://prismjs.com\"\n\t\t},\n\t\t\"menu\": {\n\t\t\t\"PrismJS\": {\n\t\t\t\t\"href\": \"https://prismjs.com\",\n\t\t\t\t\"class\": \"menu-item\",\n\t\t\t\t\"id\": \"website_link\"\n\t\t\t},\n\t\t\t\"GitHub\": {\n\t\t\t\t\"href\": \"https://github.com/PrismJS/prism\",\n\t\t\t\t\"target\": \"_blank\",\n\t\t\t\t\"class\": \"menu-item\",\n\t\t\t\t\"id\": \"github_link\"\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": ".npmignore",
    "content": ".idea\n*.iml\n\nhide-*.js\n.DS_Store\nCNAME\n.github/\nbenchmark/\ntests/\n*.tgz\n*.html\n*.svg\ncomposer.json\ndangerfile.js\n.editorconfig\n.gitattributes\n.travis.yml\neslint.config.mjs\n.eslintcache\n.jsdoc.json\nMAINTAINERS.md\nSECURITY.md\n"
  },
  {
    "path": ".prettierrc.js",
    "content": "/**\n * @see https://prettier.io/docs/configuration\n * @type {import(\"prettier\").Config}\n */\nexport default {\n\tplugins: [\n\t\t'@ianvs/prettier-plugin-sort-imports', // Consider https://www.npmjs.com/package/prettier-plugin-organize-imports as an alternative\n\t\t'prettier-plugin-brace-style',\n\t\t'prettier-plugin-space-before-function-paren',\n\t\t'prettier-plugin-merge',\n\t],\n\timportOrder: [\n\t\t'<BUILTIN_MODULES>', // Node.js built-in modules\n\t\t'<THIRD_PARTY_MODULES>', // Imports not matched by other special words or groups.\n\t\t'^\\\\.\\\\./', // Parent imports\n\t\t'^\\\\./', // Sibling imports\n\t\t'^\\\\.$', // Index file\n\t\t'<TYPES>', // Type imports\n\t],\n\tbraceStyle: 'stroustrup',\n\tarrowParens: 'avoid',\n\tbracketSpacing: true,\n\tendOfLine: 'auto',\n\tsemi: true,\n\tsingleQuote: true,\n\ttabWidth: 4,\n\tuseTabs: true,\n\ttrailingComma: 'es5',\n\tquoteProps: 'preserve',\n\tprintWidth: 100,\n\toverrides: [\n\t\t{\n\t\t\tfiles: ['*.yml', '*.yaml'],\n\t\t\toptions: {\n\t\t\t\ttabWidth: 2,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: '*.css',\n\t\t\toptions: {\n\t\t\t\tsingleQuote: false,\n\t\t\t},\n\t\t},\n\t],\n};\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n\t\"editor.formatOnSave\": true,\n\t\"editor.formatOnSaveMode\": \"file\",\n\t\"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n\t\"prettier.enable\": true\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Prism Changelog\n\n## 1.29.0 (2022-08-23)\n\n### New components\n\n- **BBj** ([#3511](https://github.com/PrismJS/prism/issues/3511)) [`1134bdfc`](https://github.com/PrismJS/prism/commit/1134bdfc)\n- **BQN** ([#3515](https://github.com/PrismJS/prism/issues/3515)) [`859f99a0`](https://github.com/PrismJS/prism/commit/859f99a0)\n- **Cilk/C** & **Cilk/C++** ([#3522](https://github.com/PrismJS/prism/issues/3522)) [`c8462a29`](https://github.com/PrismJS/prism/commit/c8462a29)\n- **Gradle** ([#3443](https://github.com/PrismJS/prism/issues/3443)) [`32119823`](https://github.com/PrismJS/prism/commit/32119823)\n- **METAFONT** ([#3465](https://github.com/PrismJS/prism/issues/3465)) [`2815f699`](https://github.com/PrismJS/prism/commit/2815f699)\n- **WGSL** ([#3455](https://github.com/PrismJS/prism/issues/3455)) [`4c87d418`](https://github.com/PrismJS/prism/commit/4c87d418)\n\n### Updated components\n\n- **AsciiDoc**\n    - Some regexes are too greedy ([#3481](https://github.com/PrismJS/prism/issues/3481)) [`c4cbeeaa`](https://github.com/PrismJS/prism/commit/c4cbeeaa)\n- **Bash**\n    - Added \"sh\" alias ([#3509](https://github.com/PrismJS/prism/issues/3509)) [`6b824d47`](https://github.com/PrismJS/prism/commit/6b824d47)\n    - Added support for parameters and the `java` and `sysctl` commands. ([#3505](https://github.com/PrismJS/prism/issues/3505)) [`b9512b22`](https://github.com/PrismJS/prism/commit/b9512b22)\n    - Added `cargo` command ([#3488](https://github.com/PrismJS/prism/issues/3488)) [`3e937137`](https://github.com/PrismJS/prism/commit/3e937137)\n- **BBj**\n    - Improve regexes ([#3512](https://github.com/PrismJS/prism/issues/3512)) [`0cad9ae5`](https://github.com/PrismJS/prism/commit/0cad9ae5)\n- **CSS**\n    - Fixed @-rules not accounting for strings ([#3438](https://github.com/PrismJS/prism/issues/3438)) [`0d4b6cb6`](https://github.com/PrismJS/prism/commit/0d4b6cb6)\n- **CSS Extras**\n    - Added support for `RebeccaPurple` color ([#3448](https://github.com/PrismJS/prism/issues/3448)) [`646b2e0a`](https://github.com/PrismJS/prism/commit/646b2e0a)\n- **Hoon**\n    - Fixed escaped strings ([#3473](https://github.com/PrismJS/prism/issues/3473)) [`64642716`](https://github.com/PrismJS/prism/commit/64642716)\n- **Java**\n    - Added support for constants ([#3507](https://github.com/PrismJS/prism/issues/3507)) [`342a0039`](https://github.com/PrismJS/prism/commit/342a0039)\n- **Markup**\n    - Fixed quotes in HTML attribute values ([#3442](https://github.com/PrismJS/prism/issues/3442)) [`ca8eaeee`](https://github.com/PrismJS/prism/commit/ca8eaeee)\n- **NSIS**\n    - Added missing commands ([#3504](https://github.com/PrismJS/prism/issues/3504)) [`b0c2a9b4`](https://github.com/PrismJS/prism/commit/b0c2a9b4)\n- **Scala**\n    - Updated keywords to support Scala 3 ([#3506](https://github.com/PrismJS/prism/issues/3506)) [`a090d063`](https://github.com/PrismJS/prism/commit/a090d063)\n- **SCSS**\n    - Fix casing in title of the `scss` lang ([#3501](https://github.com/PrismJS/prism/issues/3501)) [`2aed9ce7`](https://github.com/PrismJS/prism/commit/2aed9ce7)\n\n### Updated plugins\n\n- **Line Highlight**\n    - Account for offset when clamping ranges ([#3518](https://github.com/PrismJS/prism/issues/3518)) [`098e3000`](https://github.com/PrismJS/prism/commit/098e3000)\n    - Ignore ranges outside of actual lines ([#3475](https://github.com/PrismJS/prism/issues/3475)) [`9a4e725b`](https://github.com/PrismJS/prism/commit/9a4e725b)\n- **Normalize Whitespace**\n    - Add configuration via attributes ([#3467](https://github.com/PrismJS/prism/issues/3467)) [`91dea0c8`](https://github.com/PrismJS/prism/commit/91dea0c8)\n\n### Other\n\n- Added security policy ([#3070](https://github.com/PrismJS/prism/issues/3070)) [`05ee042a`](https://github.com/PrismJS/prism/commit/05ee042a)\n- Added list of maintainers ([#3410](https://github.com/PrismJS/prism/issues/3410)) [`866b302e`](https://github.com/PrismJS/prism/commit/866b302e)\n- Included githubactions in the dependabot config ([#3470](https://github.com/PrismJS/prism/issues/3470)) [`9561a9ab`](https://github.com/PrismJS/prism/commit/9561a9ab)\n- Set permissions for GitHub actions ([#3468](https://github.com/PrismJS/prism/issues/3468)) [`b85e1ada`](https://github.com/PrismJS/prism/commit/b85e1ada)\n- **Website**\n    - Website: Added third-party tutorial for Pug template ([#3459](https://github.com/PrismJS/prism/issues/3459)) [`15272f76`](https://github.com/PrismJS/prism/commit/15272f76)\n    - Docs: Add missing word ([#3489](https://github.com/PrismJS/prism/issues/3489)) [`9d603ef4`](https://github.com/PrismJS/prism/commit/9d603ef4)\n\n## 1.28.0 (2022-04-17)\n\n### New components\n\n- **Ado** & **Mata** (Stata) ([#3383](https://github.com/PrismJS/prism/issues/3383)) [`63806d57`](https://github.com/PrismJS/prism/commit/63806d57)\n- **ARM Assembly** ([#3376](https://github.com/PrismJS/prism/issues/3376)) [`554ff324`](https://github.com/PrismJS/prism/commit/554ff324)\n- **Arturo** ([#3403](https://github.com/PrismJS/prism/issues/3403)) [`e2fe1f79`](https://github.com/PrismJS/prism/commit/e2fe1f79)\n- **AWK** & **GAWK** ([#3374](https://github.com/PrismJS/prism/issues/3374)) [`ea8a0f40`](https://github.com/PrismJS/prism/commit/ea8a0f40)\n- **Cooklang** ([#3337](https://github.com/PrismJS/prism/issues/3337)) [`4eb928c3`](https://github.com/PrismJS/prism/commit/4eb928c3)\n- **CUE** ([#3375](https://github.com/PrismJS/prism/issues/3375)) [`a1340666`](https://github.com/PrismJS/prism/commit/a1340666)\n- **gettext** ([#3369](https://github.com/PrismJS/prism/issues/3369)) [`dfef9b61`](https://github.com/PrismJS/prism/commit/dfef9b61)\n- **GNU Linker Script** ([#3373](https://github.com/PrismJS/prism/issues/3373)) [`33f2cf95`](https://github.com/PrismJS/prism/commit/33f2cf95)\n- **Odin** ([#3424](https://github.com/PrismJS/prism/issues/3424)) [`8a3fef6d`](https://github.com/PrismJS/prism/commit/8a3fef6d)\n- **PlantUML** ([#3372](https://github.com/PrismJS/prism/issues/3372)) [`0d49553c`](https://github.com/PrismJS/prism/commit/0d49553c)\n- **ReScript** ([#3435](https://github.com/PrismJS/prism/issues/3435)) [`cbef9af7`](https://github.com/PrismJS/prism/commit/cbef9af7)\n- **SuperCollider** ([#3371](https://github.com/PrismJS/prism/issues/3371)) [`1b1d6731`](https://github.com/PrismJS/prism/commit/1b1d6731)\n\n### Updated components\n\n- **.properties**\n    - Use `key`, `value` for token names; `attr-name`, `attr-value` as aliases ([#3377](https://github.com/PrismJS/prism/issues/3377)) [`b94a664d`](https://github.com/PrismJS/prism/commit/b94a664d)\n- **ABAP**\n    - Sorted keyword list ([#3368](https://github.com/PrismJS/prism/issues/3368)) [`7bda2bf1`](https://github.com/PrismJS/prism/commit/7bda2bf1)\n- **Ada**\n    - Changed `attr-name` to `attribute`; Use `attr-name` as alias ([#3381](https://github.com/PrismJS/prism/issues/3381)) [`cde0b5b2`](https://github.com/PrismJS/prism/commit/cde0b5b2)\n    - Added `or` keyword ([#3380](https://github.com/PrismJS/prism/issues/3380)) [`c30b736f`](https://github.com/PrismJS/prism/commit/c30b736f)\n- **Atmel AVR Assembly**\n    - Fixed `&=` and `|=` operators ([#3395](https://github.com/PrismJS/prism/issues/3395)) [`8c4ae5a5`](https://github.com/PrismJS/prism/commit/8c4ae5a5)\n- **AutoHotkey**\n    - Use standard tokens ([#3385](https://github.com/PrismJS/prism/issues/3385)) [`61c460e8`](https://github.com/PrismJS/prism/commit/61c460e8)\n    - Use general pattern instead of name list for directives ([#3384](https://github.com/PrismJS/prism/issues/3384)) [`7ac84dda`](https://github.com/PrismJS/prism/commit/7ac84dda)\n- **CFScript**\n    - Simplified operator regex ([#3396](https://github.com/PrismJS/prism/issues/3396)) [`6a215fe0`](https://github.com/PrismJS/prism/commit/6a215fe0)\n- **CMake**\n    - Simplified `variable` and `operator` regexes ([#3398](https://github.com/PrismJS/prism/issues/3398)) [`8e59744b`](https://github.com/PrismJS/prism/commit/8e59744b)\n- **Erlang**\n    - Added `begin` keyword ([#3387](https://github.com/PrismJS/prism/issues/3387)) [`cf38d059`](https://github.com/PrismJS/prism/commit/cf38d059)\n- **Excel Formula**\n    - Use more fitting aliases for `function-name`, `range`, and `cell` ([#3391](https://github.com/PrismJS/prism/issues/3391)) [`ef0ec02a`](https://github.com/PrismJS/prism/commit/ef0ec02a)\n- **Flow**\n    - Changed alias of `type` to `class-name` ([#3390](https://github.com/PrismJS/prism/issues/3390)) [`ce41434d`](https://github.com/PrismJS/prism/commit/ce41434d)\n    - Recognise `[Ss]ymbol` as a type ([#3388](https://github.com/PrismJS/prism/issues/3388)) [`3916883a`](https://github.com/PrismJS/prism/commit/3916883a)\n- **GEDCOM**\n    - Update `tag` to `record` ([#3386](https://github.com/PrismJS/prism/issues/3386)) [`f8f95340`](https://github.com/PrismJS/prism/commit/f8f95340)\n- **Groovy**\n    - Added string interpolation without hook ([#3366](https://github.com/PrismJS/prism/issues/3366)) [`5617765f`](https://github.com/PrismJS/prism/commit/5617765f)\n- **Handlebars**\n    - Added Mustache alias ([#3422](https://github.com/PrismJS/prism/issues/3422)) [`cb5229af`](https://github.com/PrismJS/prism/commit/cb5229af)\n- **Java**\n    - Improved class name detection ([#3351](https://github.com/PrismJS/prism/issues/3351)) [`4cb3d038`](https://github.com/PrismJS/prism/commit/4cb3d038)\n    - Fixed `record` false positives ([#3348](https://github.com/PrismJS/prism/issues/3348)) [`3bd8fdb1`](https://github.com/PrismJS/prism/commit/3bd8fdb1)\n- **JavaScript**\n    - Added support for new regex syntax ([#3399](https://github.com/PrismJS/prism/issues/3399)) [`ca78cde6`](https://github.com/PrismJS/prism/commit/ca78cde6)\n- **Keyman**\n    - Added new keywords ([#3401](https://github.com/PrismJS/prism/issues/3401)) [`bac36827`](https://github.com/PrismJS/prism/commit/bac36827)\n- **MEL**\n    - Improved functions, code, and comments ([#3393](https://github.com/PrismJS/prism/issues/3393)) [`8e648dab`](https://github.com/PrismJS/prism/commit/8e648dab)\n- **NEON**\n    - Change alias of `key` to `property` ([#3394](https://github.com/PrismJS/prism/issues/3394)) [`1c533f4a`](https://github.com/PrismJS/prism/commit/1c533f4a)\n- **PHP**\n    - Added `never` return type + minor fix of named arguments ([#3421](https://github.com/PrismJS/prism/issues/3421)) [`4ffab525`](https://github.com/PrismJS/prism/commit/4ffab525)\n    - Added `readonly` keyword ([#3349](https://github.com/PrismJS/prism/issues/3349)) [`4c3f1969`](https://github.com/PrismJS/prism/commit/4c3f1969)\n- **PureBasic**\n    - Added support for pointer to string operator ([#3362](https://github.com/PrismJS/prism/issues/3362)) [`499b1fa0`](https://github.com/PrismJS/prism/commit/499b1fa0)\n- **Razor C#**\n    - Added support for `@helper` and inline C# inside attribute values ([#3355](https://github.com/PrismJS/prism/issues/3355)) [`31a38d0c`](https://github.com/PrismJS/prism/commit/31a38d0c)\n- **VHDL**\n    - Add `private`, `view` keywords; Distinguish `attribute` from `keyword` ([#3389](https://github.com/PrismJS/prism/issues/3389)) [`d1a5ce30`](https://github.com/PrismJS/prism/commit/d1a5ce30)\n- **Wolfram language**\n    - Simplified `operator` regex ([#3397](https://github.com/PrismJS/prism/issues/3397)) [`10ae6da3`](https://github.com/PrismJS/prism/commit/10ae6da3)\n\n### Updated plugins\n\n- **Autolinker**\n    - Fixed URL regex to match more valid URLs ([#3358](https://github.com/PrismJS/prism/issues/3358)) [`17ed9160`](https://github.com/PrismJS/prism/commit/17ed9160)\n- **Command Line**\n    - Add support for command continuation prefix ([#3344](https://github.com/PrismJS/prism/issues/3344)) [`b53832cd`](https://github.com/PrismJS/prism/commit/b53832cd)\n    - Increased prompt opacity ([#3352](https://github.com/PrismJS/prism/issues/3352)) [`f95dd190`](https://github.com/PrismJS/prism/commit/f95dd190)\n- **Keep Markup**\n    - Use original nodes instead of clones ([#3365](https://github.com/PrismJS/prism/issues/3365)) [`8a843a17`](https://github.com/PrismJS/prism/commit/8a843a17)\n\n### Other\n\n- **Infrastructure**\n    - Use terser ([#3407](https://github.com/PrismJS/prism/issues/3407)) [`11c54624`](https://github.com/PrismJS/prism/commit/11c54624)\n    - Tests: Cache results for exp backtracking check ([#3356](https://github.com/PrismJS/prism/issues/3356)) [`ead22e1e`](https://github.com/PrismJS/prism/commit/ead22e1e)\n- **Website**\n    - More documentation for language definitons ([#3427](https://github.com/PrismJS/prism/issues/3427)) [`333bd590`](https://github.com/PrismJS/prism/commit/333bd590)\n\n## 1.27.0 (2022-02-17)\n\n### New components\n\n- **UO Razor Script** ([#3309](https://github.com/PrismJS/prism/issues/3309)) [`3f8cc5a0`](https://github.com/PrismJS/prism/commit/3f8cc5a0)\n\n### Updated components\n\n- **AutoIt**\n    - Allow hyphen in directive ([#3308](https://github.com/PrismJS/prism/issues/3308)) [`bcb2e2c8`](https://github.com/PrismJS/prism/commit/bcb2e2c8)\n- **EditorConfig**\n    - Change alias of `section` from `keyword` to `selector` ([#3305](https://github.com/PrismJS/prism/issues/3305)) [`e46501b9`](https://github.com/PrismJS/prism/commit/e46501b9)\n- **Ini**\n    - Swap out `header` for `section` ([#3304](https://github.com/PrismJS/prism/issues/3304)) [`deb3a97f`](https://github.com/PrismJS/prism/commit/deb3a97f)\n- **MongoDB**\n    - Added v5 support ([#3297](https://github.com/PrismJS/prism/issues/3297)) [`8458c41f`](https://github.com/PrismJS/prism/commit/8458c41f)\n- **PureBasic**\n    - Added missing keyword and fixed constants ending with `$` ([#3320](https://github.com/PrismJS/prism/issues/3320)) [`d6c53726`](https://github.com/PrismJS/prism/commit/d6c53726)\n- **Scala**\n    - Added support for interpolated strings ([#3293](https://github.com/PrismJS/prism/issues/3293)) [`441a1422`](https://github.com/PrismJS/prism/commit/441a1422)\n- **Systemd configuration file**\n    - Swap out `operator` for `punctuation` ([#3306](https://github.com/PrismJS/prism/issues/3306)) [`2eb89e15`](https://github.com/PrismJS/prism/commit/2eb89e15)\n\n### Updated plugins\n\n- **Command Line**\n    - Escape markup in command line output ([#3341](https://github.com/PrismJS/prism/issues/3341)) [`e002e78c`](https://github.com/PrismJS/prism/commit/e002e78c)\n    - Add support for line continuation and improved colors ([#3326](https://github.com/PrismJS/prism/issues/3326)) [`1784b175`](https://github.com/PrismJS/prism/commit/1784b175)\n    - Added span around command and output ([#3312](https://github.com/PrismJS/prism/issues/3312)) [`82d0ca15`](https://github.com/PrismJS/prism/commit/82d0ca15)\n\n### Other\n\n- **Core**\n    - Added better error message for missing grammars ([#3311](https://github.com/PrismJS/prism/issues/3311)) [`2cc4660b`](https://github.com/PrismJS/prism/commit/2cc4660b)\n\n## 1.26.0 (2022-01-06)\n\n### New components\n\n- **Atmel AVR Assembly** ([#2078](https://github.com/PrismJS/prism/issues/2078)) [`b5a70e4c`](https://github.com/PrismJS/prism/commit/b5a70e4c)\n- **Go module** ([#3209](https://github.com/PrismJS/prism/issues/3209)) [`8476a9ab`](https://github.com/PrismJS/prism/commit/8476a9ab)\n- **Keepalived Configure** ([#2417](https://github.com/PrismJS/prism/issues/2417)) [`d908e457`](https://github.com/PrismJS/prism/commit/d908e457)\n- **Tremor** & **Trickle** & **Troy** ([#3087](https://github.com/PrismJS/prism/issues/3087)) [`ec25ba65`](https://github.com/PrismJS/prism/commit/ec25ba65)\n- **Web IDL** ([#3107](https://github.com/PrismJS/prism/issues/3107)) [`ef53f021`](https://github.com/PrismJS/prism/commit/ef53f021)\n\n### Updated components\n\n- Use `\\d` for `[0-9]` ([#3097](https://github.com/PrismJS/prism/issues/3097)) [`9fe2f93e`](https://github.com/PrismJS/prism/commit/9fe2f93e)\n- **6502 Assembly**\n    - Use standard tokens and minor improvements ([#3184](https://github.com/PrismJS/prism/issues/3184)) [`929c33e0`](https://github.com/PrismJS/prism/commit/929c33e0)\n- **AppleScript**\n    - Use `class-name` standard token ([#3182](https://github.com/PrismJS/prism/issues/3182)) [`9f5e511d`](https://github.com/PrismJS/prism/commit/9f5e511d)\n- **AQL**\n    - Differentiate between strings and identifiers ([#3183](https://github.com/PrismJS/prism/issues/3183)) [`fa540ab7`](https://github.com/PrismJS/prism/commit/fa540ab7)\n- **Arduino**\n    - Added `ino` alias ([#2990](https://github.com/PrismJS/prism/issues/2990)) [`5b7ce5e4`](https://github.com/PrismJS/prism/commit/5b7ce5e4)\n- **Avro IDL**\n    - Removed char syntax ([#3185](https://github.com/PrismJS/prism/issues/3185)) [`c7809285`](https://github.com/PrismJS/prism/commit/c7809285)\n- **Bash**\n    - Added `node` to known commands ([#3291](https://github.com/PrismJS/prism/issues/3291)) [`4b19b502`](https://github.com/PrismJS/prism/commit/4b19b502)\n    - Added `vcpkg` command ([#3282](https://github.com/PrismJS/prism/issues/3282)) [`b351bc69`](https://github.com/PrismJS/prism/commit/b351bc69)\n    - Added `docker` and `podman` commands ([#3237](https://github.com/PrismJS/prism/issues/3237)) [`8c5ed251`](https://github.com/PrismJS/prism/commit/8c5ed251)\n- **Birb**\n    - Fixed class name false positives ([#3111](https://github.com/PrismJS/prism/issues/3111)) [`d7017beb`](https://github.com/PrismJS/prism/commit/d7017beb)\n- **Bro**\n    - Removed `variable` and minor improvements ([#3186](https://github.com/PrismJS/prism/issues/3186)) [`4cebf34c`](https://github.com/PrismJS/prism/commit/4cebf34c)\n- **BSL (1C:Enterprise)**\n    - Made `directive` greedy ([#3112](https://github.com/PrismJS/prism/issues/3112)) [`5c412cbb`](https://github.com/PrismJS/prism/commit/5c412cbb)\n- **C**\n    - Added `char` token ([#3207](https://github.com/PrismJS/prism/issues/3207)) [`d85a64ae`](https://github.com/PrismJS/prism/commit/d85a64ae)\n- **C#**\n    - Added `char` token ([#3270](https://github.com/PrismJS/prism/issues/3270)) [`220bc40f`](https://github.com/PrismJS/prism/commit/220bc40f)\n    - Move everything into the IIFE ([#3077](https://github.com/PrismJS/prism/issues/3077)) [`9ed4cf6e`](https://github.com/PrismJS/prism/commit/9ed4cf6e)\n- **Clojure**\n    - Added `char` token ([#3188](https://github.com/PrismJS/prism/issues/3188)) [`1c88c7da`](https://github.com/PrismJS/prism/commit/1c88c7da)\n- **Concurnas**\n    - Improved tokenization ([#3189](https://github.com/PrismJS/prism/issues/3189)) [`7b34e65d`](https://github.com/PrismJS/prism/commit/7b34e65d)\n- **Content-Security-Policy**\n    - Improved tokenization ([#3276](https://github.com/PrismJS/prism/issues/3276)) [`a943f2bb`](https://github.com/PrismJS/prism/commit/a943f2bb)\n- **Coq**\n    - Improved attribute pattern performance ([#3085](https://github.com/PrismJS/prism/issues/3085)) [`2f9672aa`](https://github.com/PrismJS/prism/commit/2f9672aa)\n- **Crystal**\n    - Improved tokenization ([#3194](https://github.com/PrismJS/prism/issues/3194)) [`51e3ecc0`](https://github.com/PrismJS/prism/commit/51e3ecc0)\n- **Cypher**\n    - Removed non-standard use of `symbol` token name ([#3195](https://github.com/PrismJS/prism/issues/3195)) [`6af8a644`](https://github.com/PrismJS/prism/commit/6af8a644)\n- **D**\n    - Added standard char token ([#3196](https://github.com/PrismJS/prism/issues/3196)) [`dafdbdec`](https://github.com/PrismJS/prism/commit/dafdbdec)\n- **Dart**\n    - Added string interpolation and improved metadata ([#3197](https://github.com/PrismJS/prism/issues/3197)) [`e1370357`](https://github.com/PrismJS/prism/commit/e1370357)\n- **DataWeave**\n    - Fixed keywords being highlighted as functions ([#3113](https://github.com/PrismJS/prism/issues/3113)) [`532212b2`](https://github.com/PrismJS/prism/commit/532212b2)\n- **EditorConfig**\n    - Swap out `property` for `key`; alias with `attr-name` ([#3272](https://github.com/PrismJS/prism/issues/3272)) [`bee6ad56`](https://github.com/PrismJS/prism/commit/bee6ad56)\n- **Eiffel**\n    - Removed non-standard use of `builtin` name ([#3198](https://github.com/PrismJS/prism/issues/3198)) [`6add768b`](https://github.com/PrismJS/prism/commit/6add768b)\n- **Elm**\n    - Recognize unicode escapes as valid Char ([#3105](https://github.com/PrismJS/prism/issues/3105)) [`736c581d`](https://github.com/PrismJS/prism/commit/736c581d)\n- **ERB**\n    - Better embedding of Ruby ([#3192](https://github.com/PrismJS/prism/issues/3192)) [`336edeea`](https://github.com/PrismJS/prism/commit/336edeea)\n- **F#**\n    - Added `char` token ([#3271](https://github.com/PrismJS/prism/issues/3271)) [`b58cd722`](https://github.com/PrismJS/prism/commit/b58cd722)\n- **G-code**\n    - Use standard-conforming alias for checksum ([#3205](https://github.com/PrismJS/prism/issues/3205)) [`ee7ab563`](https://github.com/PrismJS/prism/commit/ee7ab563)\n- **GameMaker Language**\n    - Fixed `operator` token and added tests ([#3114](https://github.com/PrismJS/prism/issues/3114)) [`d359eeae`](https://github.com/PrismJS/prism/commit/d359eeae)\n- **Go**\n    - Added `char` token and improved `string` and `number` tokens ([#3208](https://github.com/PrismJS/prism/issues/3208)) [`f11b86e2`](https://github.com/PrismJS/prism/commit/f11b86e2)\n- **GraphQL**\n    - Optimized regexes ([#3136](https://github.com/PrismJS/prism/issues/3136)) [`8494519e`](https://github.com/PrismJS/prism/commit/8494519e)\n- **Haml**\n    - Use `symbol` alias for filter names ([#3210](https://github.com/PrismJS/prism/issues/3210)) [`3d410670`](https://github.com/PrismJS/prism/commit/3d410670)\n    - Improved filter and interpolation tokenization ([#3191](https://github.com/PrismJS/prism/issues/3191)) [`005ba469`](https://github.com/PrismJS/prism/commit/005ba469)\n- **Haxe**\n    - Improved tokenization ([#3211](https://github.com/PrismJS/prism/issues/3211)) [`f41bcf23`](https://github.com/PrismJS/prism/commit/f41bcf23)\n- **Hoon**\n    - Simplified the language definition a little ([#3212](https://github.com/PrismJS/prism/issues/3212)) [`81920b62`](https://github.com/PrismJS/prism/commit/81920b62)\n- **HTTP**\n    - Added support for special header value tokenization ([#3275](https://github.com/PrismJS/prism/issues/3275)) [`3362fc79`](https://github.com/PrismJS/prism/commit/3362fc79)\n    - Relax pattern for body ([#3169](https://github.com/PrismJS/prism/issues/3169)) [`22d0c6ba`](https://github.com/PrismJS/prism/commit/22d0c6ba)\n- **HTTP Public-Key-Pins**\n    - Improved tokenization ([#3278](https://github.com/PrismJS/prism/issues/3278)) [`0f1b5810`](https://github.com/PrismJS/prism/commit/0f1b5810)\n- **HTTP Strict-Transport-Security**\n    - Improved tokenization ([#3277](https://github.com/PrismJS/prism/issues/3277)) [`3d708b97`](https://github.com/PrismJS/prism/commit/3d708b97)\n- **Idris**\n    - Fixed import statements ([#3115](https://github.com/PrismJS/prism/issues/3115)) [`15cb3b78`](https://github.com/PrismJS/prism/commit/15cb3b78)\n- **Io**\n    - Simplified comment token ([#3214](https://github.com/PrismJS/prism/issues/3214)) [`c2afa59b`](https://github.com/PrismJS/prism/commit/c2afa59b)\n- **J**\n    - Made comments greedy ([#3215](https://github.com/PrismJS/prism/issues/3215)) [`5af16014`](https://github.com/PrismJS/prism/commit/5af16014)\n- **Java**\n    - Added `char` token ([#3217](https://github.com/PrismJS/prism/issues/3217)) [`0a9f909c`](https://github.com/PrismJS/prism/commit/0a9f909c)\n- **Java stack trace**\n    - Removed unreachable parts of regexes ([#3219](https://github.com/PrismJS/prism/issues/3219)) [`fa55492b`](https://github.com/PrismJS/prism/commit/fa55492b)\n    - Added missing lookbehinds ([#3116](https://github.com/PrismJS/prism/issues/3116)) [`cfb2e782`](https://github.com/PrismJS/prism/commit/cfb2e782)\n- **JavaScript**\n    - Improved `number` pattern ([#3149](https://github.com/PrismJS/prism/issues/3149)) [`5a24cbff`](https://github.com/PrismJS/prism/commit/5a24cbff)\n    - Added properties ([#3099](https://github.com/PrismJS/prism/issues/3099)) [`3b2238fa`](https://github.com/PrismJS/prism/commit/3b2238fa)\n- **Jolie**\n    - Improved tokenization ([#3221](https://github.com/PrismJS/prism/issues/3221)) [`dfbb2020`](https://github.com/PrismJS/prism/commit/dfbb2020)\n- **JQ**\n    - Improved performance of strings ([#3084](https://github.com/PrismJS/prism/issues/3084)) [`233415b8`](https://github.com/PrismJS/prism/commit/233415b8)\n- **JS stack trace**\n    - Added missing boundary assertion ([#3117](https://github.com/PrismJS/prism/issues/3117)) [`23d9aec1`](https://github.com/PrismJS/prism/commit/23d9aec1)\n- **Julia**\n    - Added `char` token ([#3223](https://github.com/PrismJS/prism/issues/3223)) [`3a876df0`](https://github.com/PrismJS/prism/commit/3a876df0)\n- **Keyman**\n    - Improved tokenization ([#3224](https://github.com/PrismJS/prism/issues/3224)) [`baa95cab`](https://github.com/PrismJS/prism/commit/baa95cab)\n- **Kotlin**\n    - Added `char` token and improved string interpolation ([#3225](https://github.com/PrismJS/prism/issues/3225)) [`563cd73e`](https://github.com/PrismJS/prism/commit/563cd73e)\n- **Latte**\n    - Use standard token names and combined delimiter tokens ([#3226](https://github.com/PrismJS/prism/issues/3226)) [`6b168a3b`](https://github.com/PrismJS/prism/commit/6b168a3b)\n- **Liquid**\n    - Removed unmatchable object variants ([#3135](https://github.com/PrismJS/prism/issues/3135)) [`05e7ab04`](https://github.com/PrismJS/prism/commit/05e7ab04)\n- **Lisp**\n    - Improved `defun` ([#3130](https://github.com/PrismJS/prism/issues/3130)) [`e8f84a6c`](https://github.com/PrismJS/prism/commit/e8f84a6c)\n- **Makefile**\n    - Use standard token names correctly ([#3227](https://github.com/PrismJS/prism/issues/3227)) [`21a3c2d7`](https://github.com/PrismJS/prism/commit/21a3c2d7)\n- **Markdown**\n    - Fixed typo in token name ([#3101](https://github.com/PrismJS/prism/issues/3101)) [`00f77a2c`](https://github.com/PrismJS/prism/commit/00f77a2c)\n- **MAXScript**\n    - Various improvements ([#3181](https://github.com/PrismJS/prism/issues/3181)) [`e9b856c8`](https://github.com/PrismJS/prism/commit/e9b856c8)\n    - Fixed booleans not being highlighted ([#3134](https://github.com/PrismJS/prism/issues/3134)) [`c6574e6b`](https://github.com/PrismJS/prism/commit/c6574e6b)\n- **Monkey**\n    - Use standard tokens correctly ([#3228](https://github.com/PrismJS/prism/issues/3228)) [`c1025aa6`](https://github.com/PrismJS/prism/commit/c1025aa6)\n- **N1QL**\n    - Updated keywords + minor improvements ([#3229](https://github.com/PrismJS/prism/issues/3229)) [`642d93ec`](https://github.com/PrismJS/prism/commit/642d93ec)\n- **nginx**\n    - Made some patterns greedy ([#3230](https://github.com/PrismJS/prism/issues/3230)) [`7b72e0ad`](https://github.com/PrismJS/prism/commit/7b72e0ad)\n- **Nim**\n    - Added `char` token and made some tokens greedy ([#3231](https://github.com/PrismJS/prism/issues/3231)) [`2334b4b6`](https://github.com/PrismJS/prism/commit/2334b4b6)\n    - Fixed backtick identifier ([#3118](https://github.com/PrismJS/prism/issues/3118)) [`75331bea`](https://github.com/PrismJS/prism/commit/75331bea)\n- **Nix**\n    - Use standard token name correctly ([#3232](https://github.com/PrismJS/prism/issues/3232)) [`5bf6e35f`](https://github.com/PrismJS/prism/commit/5bf6e35f)\n    - Removed unmatchable token ([#3119](https://github.com/PrismJS/prism/issues/3119)) [`dc1e808f`](https://github.com/PrismJS/prism/commit/dc1e808f)\n- **NSIS**\n    - Made `comment` greedy ([#3234](https://github.com/PrismJS/prism/issues/3234)) [`969f152a`](https://github.com/PrismJS/prism/commit/969f152a)\n    - Update regex pattern for variables ([#3266](https://github.com/PrismJS/prism/issues/3266)) [`adcc8784`](https://github.com/PrismJS/prism/commit/adcc8784)\n    - Update regex for constants pattern ([#3267](https://github.com/PrismJS/prism/issues/3267)) [`55583fb2`](https://github.com/PrismJS/prism/commit/55583fb2)\n- **Objective-C**\n    - Improved `string` token ([#3235](https://github.com/PrismJS/prism/issues/3235)) [`8e0e95f3`](https://github.com/PrismJS/prism/commit/8e0e95f3)\n- **OCaml**\n    - Improved tokenization ([#3269](https://github.com/PrismJS/prism/issues/3269)) [`7bcc5da0`](https://github.com/PrismJS/prism/commit/7bcc5da0)\n    - Removed unmatchable punctuation variant ([#3120](https://github.com/PrismJS/prism/issues/3120)) [`314d6994`](https://github.com/PrismJS/prism/commit/314d6994)\n- **Oz**\n    - Improved tokenization ([#3240](https://github.com/PrismJS/prism/issues/3240)) [`a3905c04`](https://github.com/PrismJS/prism/commit/a3905c04)\n- **Pascal**\n    - Added support for asm and directives ([#2653](https://github.com/PrismJS/prism/issues/2653)) [`f053af13`](https://github.com/PrismJS/prism/commit/f053af13)\n- **PATROL Scripting Language**\n    - Added `boolean` token ([#3248](https://github.com/PrismJS/prism/issues/3248)) [`a5b6c5eb`](https://github.com/PrismJS/prism/commit/a5b6c5eb)\n- **Perl**\n    - Improved tokenization ([#3241](https://github.com/PrismJS/prism/issues/3241)) [`f22ea9f9`](https://github.com/PrismJS/prism/commit/f22ea9f9)\n- **PHP**\n    - Removed useless keyword tokens ([#3121](https://github.com/PrismJS/prism/issues/3121)) [`ee62a080`](https://github.com/PrismJS/prism/commit/ee62a080)\n- **PHP Extras**\n    - Improved `scope` and `this` ([#3243](https://github.com/PrismJS/prism/issues/3243)) [`59ef51db`](https://github.com/PrismJS/prism/commit/59ef51db)\n- **PL/SQL**\n    - Updated keywords + other improvements ([#3109](https://github.com/PrismJS/prism/issues/3109)) [`e7ba877b`](https://github.com/PrismJS/prism/commit/e7ba877b)\n- **PowerQuery**\n    - Improved tokenization and use standard tokens correctly ([#3244](https://github.com/PrismJS/prism/issues/3244)) [`5688f487`](https://github.com/PrismJS/prism/commit/5688f487)\n    - Removed useless `data-type` alternative ([#3122](https://github.com/PrismJS/prism/issues/3122)) [`eeb13996`](https://github.com/PrismJS/prism/commit/eeb13996)\n- **PowerShell**\n    - Fixed lookbehind + refactoring ([#3245](https://github.com/PrismJS/prism/issues/3245)) [`d30a2da6`](https://github.com/PrismJS/prism/commit/d30a2da6)\n- **Processing**\n    - Use standard tokens correctly ([#3246](https://github.com/PrismJS/prism/issues/3246)) [`5ee8c557`](https://github.com/PrismJS/prism/commit/5ee8c557)\n- **Prolog**\n    - Removed variable token + minor improvements ([#3247](https://github.com/PrismJS/prism/issues/3247)) [`bacf9ae3`](https://github.com/PrismJS/prism/commit/bacf9ae3)\n- **Pug**\n    - Improved filter tokenization ([#3258](https://github.com/PrismJS/prism/issues/3258)) [`0390e644`](https://github.com/PrismJS/prism/commit/0390e644)\n- **PureBasic**\n    - Fixed token order inside `asm` token ([#3123](https://github.com/PrismJS/prism/issues/3123)) [`f3b25786`](https://github.com/PrismJS/prism/commit/f3b25786)\n- **Python**\n    - Made `comment` greedy ([#3249](https://github.com/PrismJS/prism/issues/3249)) [`8ecef306`](https://github.com/PrismJS/prism/commit/8ecef306)\n    - Add `match` and `case` (soft) keywords ([#3142](https://github.com/PrismJS/prism/issues/3142)) [`3f24dc72`](https://github.com/PrismJS/prism/commit/3f24dc72)\n    - Recognize walrus operator ([#3126](https://github.com/PrismJS/prism/issues/3126)) [`18bd101c`](https://github.com/PrismJS/prism/commit/18bd101c)\n    - Fixed numbers ending with a dot ([#3106](https://github.com/PrismJS/prism/issues/3106)) [`2c63efa6`](https://github.com/PrismJS/prism/commit/2c63efa6)\n- **QML**\n    - Made `string` greedy ([#3250](https://github.com/PrismJS/prism/issues/3250)) [`1e6dcb51`](https://github.com/PrismJS/prism/commit/1e6dcb51)\n- **React JSX**\n    - Move alias property ([#3222](https://github.com/PrismJS/prism/issues/3222)) [`18c92048`](https://github.com/PrismJS/prism/commit/18c92048)\n- **React TSX**\n    - Removed `parameter` token ([#3090](https://github.com/PrismJS/prism/issues/3090)) [`0a313f4f`](https://github.com/PrismJS/prism/commit/0a313f4f)\n- **Reason**\n    - Use standard tokens correctly ([#3251](https://github.com/PrismJS/prism/issues/3251)) [`809af0d9`](https://github.com/PrismJS/prism/commit/809af0d9)\n- **Regex**\n    - Fixed char-class/char-set confusion ([#3124](https://github.com/PrismJS/prism/issues/3124)) [`4dde2e20`](https://github.com/PrismJS/prism/commit/4dde2e20)\n- **Ren'py**\n    - Improved language + added tests ([#3125](https://github.com/PrismJS/prism/issues/3125)) [`ede55b2c`](https://github.com/PrismJS/prism/commit/ede55b2c)\n- **Rip**\n    - Use standard `char` token ([#3252](https://github.com/PrismJS/prism/issues/3252)) [`2069ab0c`](https://github.com/PrismJS/prism/commit/2069ab0c)\n- **Ruby**\n    - Improved tokenization ([#3193](https://github.com/PrismJS/prism/issues/3193)) [`86028adb`](https://github.com/PrismJS/prism/commit/86028adb)\n- **Rust**\n    - Improved `type-definition` and use standard tokens correctly ([#3253](https://github.com/PrismJS/prism/issues/3253)) [`4049e5c6`](https://github.com/PrismJS/prism/commit/4049e5c6)\n- **Scheme**\n    - Use standard `char` token ([#3254](https://github.com/PrismJS/prism/issues/3254)) [`7d740c45`](https://github.com/PrismJS/prism/commit/7d740c45)\n    - Updates syntax for reals ([#3159](https://github.com/PrismJS/prism/issues/3159)) [`4eb81fa1`](https://github.com/PrismJS/prism/commit/4eb81fa1)\n- **Smalltalk**\n    - Use standard `char` token ([#3255](https://github.com/PrismJS/prism/issues/3255)) [`a7bb3001`](https://github.com/PrismJS/prism/commit/a7bb3001)\n    - Added `boolean` token ([#3100](https://github.com/PrismJS/prism/issues/3100)) [`51382524`](https://github.com/PrismJS/prism/commit/51382524)\n- **Smarty**\n    - Improved tokenization ([#3268](https://github.com/PrismJS/prism/issues/3268)) [`acc0bc09`](https://github.com/PrismJS/prism/commit/acc0bc09)\n- **SQL**\n    - Added identifier token ([#3141](https://github.com/PrismJS/prism/issues/3141)) [`4e00cddd`](https://github.com/PrismJS/prism/commit/4e00cddd)\n- **Squirrel**\n    - Use standard `char` token ([#3256](https://github.com/PrismJS/prism/issues/3256)) [`58a65bfd`](https://github.com/PrismJS/prism/commit/58a65bfd)\n- **Stan**\n    - Added missing keywords and HOFs ([#3238](https://github.com/PrismJS/prism/issues/3238)) [`afd77ed1`](https://github.com/PrismJS/prism/commit/afd77ed1)\n- **Structured Text (IEC 61131-3)**\n    - Structured text: Improved tokenization ([#3213](https://github.com/PrismJS/prism/issues/3213)) [`d04d166d`](https://github.com/PrismJS/prism/commit/d04d166d)\n- **Swift**\n    - Added support for `isolated` keyword ([#3174](https://github.com/PrismJS/prism/issues/3174)) [`18c828a6`](https://github.com/PrismJS/prism/commit/18c828a6)\n- **TAP**\n    - Conform to quoted-properties style ([#3127](https://github.com/PrismJS/prism/issues/3127)) [`3ef71533`](https://github.com/PrismJS/prism/commit/3ef71533)\n- **Tremor**\n    - Use standard `regex` token ([#3257](https://github.com/PrismJS/prism/issues/3257)) [`c56e4bf5`](https://github.com/PrismJS/prism/commit/c56e4bf5)\n- **Twig**\n    - Improved tokenization ([#3259](https://github.com/PrismJS/prism/issues/3259)) [`e03a7c24`](https://github.com/PrismJS/prism/commit/e03a7c24)\n- **TypeScript**\n    - Removed duplicate keywords ([#3132](https://github.com/PrismJS/prism/issues/3132)) [`91060fd6`](https://github.com/PrismJS/prism/commit/91060fd6)\n- **URI**\n    - Fixed IPv4 regex ([#3128](https://github.com/PrismJS/prism/issues/3128)) [`599e30ee`](https://github.com/PrismJS/prism/commit/599e30ee)\n- **V**\n    - Use standard `char` token ([#3260](https://github.com/PrismJS/prism/issues/3260)) [`e4373256`](https://github.com/PrismJS/prism/commit/e4373256)\n- **Verilog**\n    - Use standard tokens correctly ([#3261](https://github.com/PrismJS/prism/issues/3261)) [`43124129`](https://github.com/PrismJS/prism/commit/43124129)\n- **Visual Basic**\n    - Simplify regexes and use more common aliases ([#3262](https://github.com/PrismJS/prism/issues/3262)) [`aa73d448`](https://github.com/PrismJS/prism/commit/aa73d448)\n- **Wolfram language**\n    - Removed unmatchable punctuation variant ([#3133](https://github.com/PrismJS/prism/issues/3133)) [`a28a86ad`](https://github.com/PrismJS/prism/commit/a28a86ad)\n- **Xojo (REALbasic)**\n    - Proper token name for directives ([#3263](https://github.com/PrismJS/prism/issues/3263)) [`ffd8343f`](https://github.com/PrismJS/prism/commit/ffd8343f)\n- **Zig**\n    - Added missing keywords ([#3279](https://github.com/PrismJS/prism/issues/3279)) [`deed35e3`](https://github.com/PrismJS/prism/commit/deed35e3)\n    - Use standard `char` token ([#3264](https://github.com/PrismJS/prism/issues/3264)) [`c3f9fb70`](https://github.com/PrismJS/prism/commit/c3f9fb70)\n    - Fixed module comments and astral chars ([#3129](https://github.com/PrismJS/prism/issues/3129)) [`09a0e2ba`](https://github.com/PrismJS/prism/commit/09a0e2ba)\n\n### Updated plugins\n\n- **File Highlight**\n    - File highlight+data range ([#1813](https://github.com/PrismJS/prism/issues/1813)) [`d38592c5`](https://github.com/PrismJS/prism/commit/d38592c5)\n- **Keep Markup**\n    - Added `drop-tokens` option class ([#3166](https://github.com/PrismJS/prism/issues/3166)) [`b679cfe6`](https://github.com/PrismJS/prism/commit/b679cfe6)\n- **Line Highlight**\n    - Expose `highlightLines` function as `Prism.plugins.highlightLines` ([#3086](https://github.com/PrismJS/prism/issues/3086)) [`9f4c0e74`](https://github.com/PrismJS/prism/commit/9f4c0e74)\n- **Toolbar**\n    - Set `z-index` of `.toolbar` to 10 ([#3163](https://github.com/PrismJS/prism/issues/3163)) [`1cac3559`](https://github.com/PrismJS/prism/commit/1cac3559)\n\n### Updated themes\n\n- Coy: Set `z-index` to make shadows visible in colored table cells ([#3161](https://github.com/PrismJS/prism/issues/3161)) [`79f250f3`](https://github.com/PrismJS/prism/commit/79f250f3)\n- Coy: Added padding to account for box shadow ([#3143](https://github.com/PrismJS/prism/issues/3143)) [`a6a4ce7e`](https://github.com/PrismJS/prism/commit/a6a4ce7e)\n\n### Other\n\n- **Core**\n    - Added `setLanguage` util function ([#3167](https://github.com/PrismJS/prism/issues/3167)) [`b631949a`](https://github.com/PrismJS/prism/commit/b631949a)\n    - Fixed type error on null ([#3057](https://github.com/PrismJS/prism/issues/3057)) [`a80a68ba`](https://github.com/PrismJS/prism/commit/a80a68ba)\n    - Document `disableWorkerMessageHandler` ([#3088](https://github.com/PrismJS/prism/issues/3088)) [`213cf7be`](https://github.com/PrismJS/prism/commit/213cf7be)\n- **Infrastructure**\n    - Tests: Added `.html.test` files for replace `.js` language tests ([#3148](https://github.com/PrismJS/prism/issues/3148)) [`2e834c8c`](https://github.com/PrismJS/prism/commit/2e834c8c)\n    - Added regex coverage ([#3138](https://github.com/PrismJS/prism/issues/3138)) [`5333e281`](https://github.com/PrismJS/prism/commit/5333e281)\n    - Tests: Added `TestCaseFile` class and generalized `runTestCase` ([#3147](https://github.com/PrismJS/prism/issues/3147)) [`ae8888a0`](https://github.com/PrismJS/prism/commit/ae8888a0)\n    - Added even more language tests ([#3137](https://github.com/PrismJS/prism/issues/3137)) [`344d0b27`](https://github.com/PrismJS/prism/commit/344d0b27)\n    - Added more plugin tests ([#1969](https://github.com/PrismJS/prism/issues/1969)) [`a394a14d`](https://github.com/PrismJS/prism/commit/a394a14d)\n    - Added more language tests ([#3131](https://github.com/PrismJS/prism/issues/3131)) [`2f7f7364`](https://github.com/PrismJS/prism/commit/2f7f7364)\n    - `package.json`: Added `engines.node` field ([#3108](https://github.com/PrismJS/prism/issues/3108)) [`798ee4f6`](https://github.com/PrismJS/prism/commit/798ee4f6)\n    - Use tabs in `package(-lock).json` ([#3098](https://github.com/PrismJS/prism/issues/3098)) [`8daebb4a`](https://github.com/PrismJS/prism/commit/8daebb4a)\n    - Update `eslint-plugin-regexp@1.2.0` ([#3091](https://github.com/PrismJS/prism/issues/3091)) [`e6e1d5ae`](https://github.com/PrismJS/prism/commit/e6e1d5ae)\n    - Added minified CSS ([#3073](https://github.com/PrismJS/prism/issues/3073)) [`d63d6c0e`](https://github.com/PrismJS/prism/commit/d63d6c0e)\n- **Website**\n    - Readme: Clarify usage of our build system ([#3239](https://github.com/PrismJS/prism/issues/3239)) [`6f1d904a`](https://github.com/PrismJS/prism/commit/6f1d904a)\n    - Improved CDN usage URLs ([#3285](https://github.com/PrismJS/prism/issues/3285)) [`6c21b2f7`](https://github.com/PrismJS/prism/commit/6c21b2f7)\n    - Update download.html [`9d5424b6`](https://github.com/PrismJS/prism/commit/9d5424b6)\n    - Autoloader: Mention how to load grammars from URLs ([#3218](https://github.com/PrismJS/prism/issues/3218)) [`cefccdd1`](https://github.com/PrismJS/prism/commit/cefccdd1)\n    - Added PrismJS React and HTML tutorial link ([#3190](https://github.com/PrismJS/prism/issues/3190)) [`0ecdbdce`](https://github.com/PrismJS/prism/commit/0ecdbdce)\n    - Improved readability ([#3177](https://github.com/PrismJS/prism/issues/3177)) [`4433d7fe`](https://github.com/PrismJS/prism/commit/4433d7fe)\n    - Fixed red highlighting in Firefox ([#3178](https://github.com/PrismJS/prism/issues/3178)) [`746da79b`](https://github.com/PrismJS/prism/commit/746da79b)\n    - Use Keep markup to highlight code section ([#3164](https://github.com/PrismJS/prism/issues/3164)) [`ebd59e32`](https://github.com/PrismJS/prism/commit/ebd59e32)\n    - Document standard tokens and provide examples ([#3104](https://github.com/PrismJS/prism/issues/3104)) [`37551200`](https://github.com/PrismJS/prism/commit/37551200)\n    - Fixed dead link to third-party tutorial [#3155](https://github.com/PrismJS/prism/issues/3155) ([#3156](https://github.com/PrismJS/prism/issues/3156)) [`31b4c1b8`](https://github.com/PrismJS/prism/commit/31b4c1b8)\n    - Repositioned theme selector ([#3146](https://github.com/PrismJS/prism/issues/3146)) [`ea361e5a`](https://github.com/PrismJS/prism/commit/ea361e5a)\n    - Adjusted TOC's line height for better readability ([#3145](https://github.com/PrismJS/prism/issues/3145)) [`c5629706`](https://github.com/PrismJS/prism/commit/c5629706)\n    - Updated plugin header template ([#3144](https://github.com/PrismJS/prism/issues/3144)) [`faedfe85`](https://github.com/PrismJS/prism/commit/faedfe85)\n    - Update test and example pages to use Autoloader ([#1936](https://github.com/PrismJS/prism/issues/1936)) [`3d96eedc`](https://github.com/PrismJS/prism/commit/3d96eedc)\n\n## 1.25.0 (2021-09-16)\n\n### New components\n\n- **AviSynth** ([#3071](https://github.com/PrismJS/prism/issues/3071)) [`746a4b1a`](https://github.com/PrismJS/prism/commit/746a4b1a)\n- **Avro IDL** ([#3051](https://github.com/PrismJS/prism/issues/3051)) [`87e5a376`](https://github.com/PrismJS/prism/commit/87e5a376)\n- **Bicep** ([#3027](https://github.com/PrismJS/prism/issues/3027)) [`c1dce998`](https://github.com/PrismJS/prism/commit/c1dce998)\n- **GAP (CAS)** ([#3054](https://github.com/PrismJS/prism/issues/3054)) [`23cd9b65`](https://github.com/PrismJS/prism/commit/23cd9b65)\n- **GN** ([#3062](https://github.com/PrismJS/prism/issues/3062)) [`4f97b82b`](https://github.com/PrismJS/prism/commit/4f97b82b)\n- **Hoon** ([#2978](https://github.com/PrismJS/prism/issues/2978)) [`ea776756`](https://github.com/PrismJS/prism/commit/ea776756)\n- **Kusto** ([#3068](https://github.com/PrismJS/prism/issues/3068)) [`e008ea05`](https://github.com/PrismJS/prism/commit/e008ea05)\n- **Magma (CAS)** ([#3055](https://github.com/PrismJS/prism/issues/3055)) [`a1b67ce3`](https://github.com/PrismJS/prism/commit/a1b67ce3)\n- **MAXScript** ([#3060](https://github.com/PrismJS/prism/issues/3060)) [`4fbdd2f8`](https://github.com/PrismJS/prism/commit/4fbdd2f8)\n- **Mermaid** ([#3050](https://github.com/PrismJS/prism/issues/3050)) [`148c1eca`](https://github.com/PrismJS/prism/commit/148c1eca)\n- **Razor C#** ([#3064](https://github.com/PrismJS/prism/issues/3064)) [`4433ccfc`](https://github.com/PrismJS/prism/commit/4433ccfc)\n- **Systemd configuration file** ([#3053](https://github.com/PrismJS/prism/issues/3053)) [`8df825e0`](https://github.com/PrismJS/prism/commit/8df825e0)\n- **Wren** ([#3063](https://github.com/PrismJS/prism/issues/3063)) [`6a356d25`](https://github.com/PrismJS/prism/commit/6a356d25)\n\n### Updated components\n\n- **Bicep**\n    - Added support for multiline and interpolated strings and other improvements ([#3028](https://github.com/PrismJS/prism/issues/3028)) [`748bb9ac`](https://github.com/PrismJS/prism/commit/748bb9ac)\n- **C#**\n    - Added `with` keyword & improved record support ([#2993](https://github.com/PrismJS/prism/issues/2993)) [`fdd291c0`](https://github.com/PrismJS/prism/commit/fdd291c0)\n    - Added `record`, `init`, and `nullable` keyword ([#2991](https://github.com/PrismJS/prism/issues/2991)) [`9b561565`](https://github.com/PrismJS/prism/commit/9b561565)\n    - Added context check for `from` keyword ([#2970](https://github.com/PrismJS/prism/issues/2970)) [`158f25d4`](https://github.com/PrismJS/prism/commit/158f25d4)\n- **C++**\n    - Fixed generic function false positive ([#3043](https://github.com/PrismJS/prism/issues/3043)) [`5de8947f`](https://github.com/PrismJS/prism/commit/5de8947f)\n- **Clojure**\n    - Improved tokenization ([#3056](https://github.com/PrismJS/prism/issues/3056)) [`8d0b74b5`](https://github.com/PrismJS/prism/commit/8d0b74b5)\n- **Hoon**\n    - Fixed mixed-case aura tokenization ([#3002](https://github.com/PrismJS/prism/issues/3002)) [`9c8911bd`](https://github.com/PrismJS/prism/commit/9c8911bd)\n- **Liquid**\n    - Added all objects from Shopify reference ([#2998](https://github.com/PrismJS/prism/issues/2998)) [`693b7433`](https://github.com/PrismJS/prism/commit/693b7433)\n    - Added `empty` keyword ([#2997](https://github.com/PrismJS/prism/issues/2997)) [`fe3bc526`](https://github.com/PrismJS/prism/commit/fe3bc526)\n- **Log file**\n    - Added support for Java stack traces ([#3003](https://github.com/PrismJS/prism/issues/3003)) [`b0365e70`](https://github.com/PrismJS/prism/commit/b0365e70)\n- **Markup**\n    - Made most patterns greedy ([#3065](https://github.com/PrismJS/prism/issues/3065)) [`52e8cee9`](https://github.com/PrismJS/prism/commit/52e8cee9)\n    - Fixed ReDoS ([#3078](https://github.com/PrismJS/prism/issues/3078)) [`0ff371bb`](https://github.com/PrismJS/prism/commit/0ff371bb)\n- **PureScript**\n    - Made `∀` a keyword (alias for `forall`) ([#3005](https://github.com/PrismJS/prism/issues/3005)) [`b38fc89a`](https://github.com/PrismJS/prism/commit/b38fc89a)\n    - Improved Haskell and PureScript ([#3020](https://github.com/PrismJS/prism/issues/3020)) [`679539ec`](https://github.com/PrismJS/prism/commit/679539ec)\n- **Python**\n    - Support for underscores in numbers ([#3039](https://github.com/PrismJS/prism/issues/3039)) [`6f5d68f7`](https://github.com/PrismJS/prism/commit/6f5d68f7)\n- **Sass**\n    - Fixed issues with CSS Extras ([#2994](https://github.com/PrismJS/prism/issues/2994)) [`14fdfe32`](https://github.com/PrismJS/prism/commit/14fdfe32)\n- **Shell session**\n    - Fixed command false positives ([#3048](https://github.com/PrismJS/prism/issues/3048)) [`35b88fcf`](https://github.com/PrismJS/prism/commit/35b88fcf)\n    - Added support for the percent sign as shell symbol ([#3010](https://github.com/PrismJS/prism/issues/3010)) [`4492b62b`](https://github.com/PrismJS/prism/commit/4492b62b)\n- **Swift**\n    - Major improvements ([#3022](https://github.com/PrismJS/prism/issues/3022)) [`8541db2e`](https://github.com/PrismJS/prism/commit/8541db2e)\n    - Added support for `@propertyWrapper`, `@MainActor`, and `@globalActor` ([#3009](https://github.com/PrismJS/prism/issues/3009)) [`ce5e0f01`](https://github.com/PrismJS/prism/commit/ce5e0f01)\n    - Added support for new Swift 5.5 keywords ([#2988](https://github.com/PrismJS/prism/issues/2988)) [`bb93fac0`](https://github.com/PrismJS/prism/commit/bb93fac0)\n- **TypeScript**\n    - Fixed keyword false positives ([#3001](https://github.com/PrismJS/prism/issues/3001)) [`212e0ef2`](https://github.com/PrismJS/prism/commit/212e0ef2)\n\n### Updated plugins\n\n- **JSONP Highlight**\n    - Refactored JSONP logic ([#3018](https://github.com/PrismJS/prism/issues/3018)) [`5126d1e1`](https://github.com/PrismJS/prism/commit/5126d1e1)\n- **Line Highlight**\n    - Extend highlight to full line width inside scroll container ([#3011](https://github.com/PrismJS/prism/issues/3011)) [`e289ec60`](https://github.com/PrismJS/prism/commit/e289ec60)\n- **Normalize Whitespace**\n    - Removed unnecessary checks ([#3017](https://github.com/PrismJS/prism/issues/3017)) [`63edf14c`](https://github.com/PrismJS/prism/commit/63edf14c)\n- **Previewers**\n    - Ensure popup is visible across themes ([#3080](https://github.com/PrismJS/prism/issues/3080)) [`c7b6a7f6`](https://github.com/PrismJS/prism/commit/c7b6a7f6)\n\n### Updated themes\n\n- **Twilight**\n    - Increase selector specificities of plugin overrides ([#3081](https://github.com/PrismJS/prism/issues/3081)) [`ffb20439`](https://github.com/PrismJS/prism/commit/ffb20439)\n\n### Other\n\n- **Infrastructure**\n    - Added benchmark suite ([#2153](https://github.com/PrismJS/prism/issues/2153)) [`44456b21`](https://github.com/PrismJS/prism/commit/44456b21)\n    - Tests: Insert expected JSON by Default ([#2960](https://github.com/PrismJS/prism/issues/2960)) [`e997dd35`](https://github.com/PrismJS/prism/commit/e997dd35)\n    - Tests: Improved dection of empty patterns ([#3058](https://github.com/PrismJS/prism/issues/3058)) [`d216e602`](https://github.com/PrismJS/prism/commit/d216e602)\n- **Website**\n    - Highlight Keywords: More documentation ([#3049](https://github.com/PrismJS/prism/issues/3049)) [`247fd9a3`](https://github.com/PrismJS/prism/commit/247fd9a3)\n\n## 1.24.1 (2021-07-03)\n\n### Updated components\n\n- **Markdown**\n    - Fixed Markdown not working in NodeJS ([#2977](https://github.com/PrismJS/prism/issues/2977)) [`151121cd`](https://github.com/PrismJS/prism/commit/151121cd)\n\n### Updated plugins\n\n- **Toolbar**\n    - Fixed styles being applies to nested elements ([#2980](https://github.com/PrismJS/prism/issues/2980)) [`748ecddc`](https://github.com/PrismJS/prism/commit/748ecddc)\n\n## 1.24.0 (2021-06-27)\n\n### New components\n\n- **CFScript** ([#2771](https://github.com/PrismJS/prism/issues/2771)) [`b0a6ec85`](https://github.com/PrismJS/prism/commit/b0a6ec85)\n- **ChaiScript** ([#2706](https://github.com/PrismJS/prism/issues/2706)) [`3f7d7453`](https://github.com/PrismJS/prism/commit/3f7d7453)\n- **COBOL** ([#2800](https://github.com/PrismJS/prism/issues/2800)) [`7e5f78ff`](https://github.com/PrismJS/prism/commit/7e5f78ff)\n- **Coq** ([#2803](https://github.com/PrismJS/prism/issues/2803)) [`41e25d3c`](https://github.com/PrismJS/prism/commit/41e25d3c)\n- **CSV** ([#2794](https://github.com/PrismJS/prism/issues/2794)) [`f9b69528`](https://github.com/PrismJS/prism/commit/f9b69528)\n- **DOT (Graphviz)** ([#2690](https://github.com/PrismJS/prism/issues/2690)) [`1f91868e`](https://github.com/PrismJS/prism/commit/1f91868e)\n- **False** ([#2802](https://github.com/PrismJS/prism/issues/2802)) [`99a21dc5`](https://github.com/PrismJS/prism/commit/99a21dc5)\n- **ICU Message Format** ([#2745](https://github.com/PrismJS/prism/issues/2745)) [`bf4e7ba9`](https://github.com/PrismJS/prism/commit/bf4e7ba9)\n- **Idris** ([#2755](https://github.com/PrismJS/prism/issues/2755)) [`e9314415`](https://github.com/PrismJS/prism/commit/e9314415)\n- **Jexl** ([#2764](https://github.com/PrismJS/prism/issues/2764)) [`7e51b99c`](https://github.com/PrismJS/prism/commit/7e51b99c)\n- **KuMir (КуМир)** ([#2760](https://github.com/PrismJS/prism/issues/2760)) [`3419fb77`](https://github.com/PrismJS/prism/commit/3419fb77)\n- **Log file** ([#2796](https://github.com/PrismJS/prism/issues/2796)) [`2bc6475b`](https://github.com/PrismJS/prism/commit/2bc6475b)\n- **Nevod** ([#2798](https://github.com/PrismJS/prism/issues/2798)) [`f84c49c5`](https://github.com/PrismJS/prism/commit/f84c49c5)\n- **OpenQasm** ([#2797](https://github.com/PrismJS/prism/issues/2797)) [`1a2347a3`](https://github.com/PrismJS/prism/commit/1a2347a3)\n- **PATROL Scripting Language** ([#2739](https://github.com/PrismJS/prism/issues/2739)) [`18c67b49`](https://github.com/PrismJS/prism/commit/18c67b49)\n- **Q#** ([#2804](https://github.com/PrismJS/prism/issues/2804)) [`1b63cd01`](https://github.com/PrismJS/prism/commit/1b63cd01)\n- **Rego** ([#2624](https://github.com/PrismJS/prism/issues/2624)) [`e38986f9`](https://github.com/PrismJS/prism/commit/e38986f9)\n- **Squirrel** ([#2721](https://github.com/PrismJS/prism/issues/2721)) [`fd1081d2`](https://github.com/PrismJS/prism/commit/fd1081d2)\n- **URI** ([#2708](https://github.com/PrismJS/prism/issues/2708)) [`bbc77d19`](https://github.com/PrismJS/prism/commit/bbc77d19)\n- **V** ([#2687](https://github.com/PrismJS/prism/issues/2687)) [`72962701`](https://github.com/PrismJS/prism/commit/72962701)\n- **Wolfram language** & **Mathematica** & **Mathematica Notebook** ([#2921](https://github.com/PrismJS/prism/issues/2921)) [`c4f6b2cc`](https://github.com/PrismJS/prism/commit/c4f6b2cc)\n\n### Updated components\n\n- Fixed problems reported by `regexp/no-dupe-disjunctions` ([#2952](https://github.com/PrismJS/prism/issues/2952)) [`f471d2d7`](https://github.com/PrismJS/prism/commit/f471d2d7)\n- Fixed some cases of quadratic worst-case runtime ([#2922](https://github.com/PrismJS/prism/issues/2922)) [`79d22182`](https://github.com/PrismJS/prism/commit/79d22182)\n- Fixed 2 cases of exponential backtracking ([#2774](https://github.com/PrismJS/prism/issues/2774)) [`d85e30da`](https://github.com/PrismJS/prism/commit/d85e30da)\n- **AQL**\n    - Update for ArangoDB 3.8 ([#2842](https://github.com/PrismJS/prism/issues/2842)) [`ea82478d`](https://github.com/PrismJS/prism/commit/ea82478d)\n- **AutoHotkey**\n    - Improved tag pattern ([#2920](https://github.com/PrismJS/prism/issues/2920)) [`fc2a3334`](https://github.com/PrismJS/prism/commit/fc2a3334)\n- **Bash**\n    - Accept hyphens in function names ([#2832](https://github.com/PrismJS/prism/issues/2832)) [`e4ad22ad`](https://github.com/PrismJS/prism/commit/e4ad22ad)\n    - Fixed single-quoted strings ([#2792](https://github.com/PrismJS/prism/issues/2792)) [`e5cfdb4a`](https://github.com/PrismJS/prism/commit/e5cfdb4a)\n- **C++**\n    - Added support for generic functions and made `::` punctuation ([#2814](https://github.com/PrismJS/prism/issues/2814)) [`3df62fd0`](https://github.com/PrismJS/prism/commit/3df62fd0)\n    - Added missing keywords and modules ([#2763](https://github.com/PrismJS/prism/issues/2763)) [`88fa72cf`](https://github.com/PrismJS/prism/commit/88fa72cf)\n- **Dart**\n    - Improved support for classes & generics ([#2810](https://github.com/PrismJS/prism/issues/2810)) [`d0bcd074`](https://github.com/PrismJS/prism/commit/d0bcd074)\n- **Docker**\n    - Improvements ([#2720](https://github.com/PrismJS/prism/issues/2720)) [`93dd83c2`](https://github.com/PrismJS/prism/commit/93dd83c2)\n- **Elixir**\n    - Added missing keywords ([#2958](https://github.com/PrismJS/prism/issues/2958)) [`114e4626`](https://github.com/PrismJS/prism/commit/114e4626)\n    - Added missing keyword and other improvements ([#2773](https://github.com/PrismJS/prism/issues/2773)) [`e6c0d298`](https://github.com/PrismJS/prism/commit/e6c0d298)\n    - Added `defdelagate` keyword and highlighting for function/module names ([#2709](https://github.com/PrismJS/prism/issues/2709)) [`59f725d7`](https://github.com/PrismJS/prism/commit/59f725d7)\n- **F#**\n    - Fixed comment false positive ([#2703](https://github.com/PrismJS/prism/issues/2703)) [`a5d7178c`](https://github.com/PrismJS/prism/commit/a5d7178c)\n- **GraphQL**\n    - Fixed `definition-query` and `definition-mutation` tokens ([#2964](https://github.com/PrismJS/prism/issues/2964)) [`bfd7fded`](https://github.com/PrismJS/prism/commit/bfd7fded)\n    - Added more detailed tokens ([#2939](https://github.com/PrismJS/prism/issues/2939)) [`34f24ac9`](https://github.com/PrismJS/prism/commit/34f24ac9)\n- **Handlebars**\n    - Added `hbs` alias ([#2874](https://github.com/PrismJS/prism/issues/2874)) [`43976351`](https://github.com/PrismJS/prism/commit/43976351)\n- **HTTP**\n    - Fixed body not being highlighted ([#2734](https://github.com/PrismJS/prism/issues/2734)) [`1dfc8271`](https://github.com/PrismJS/prism/commit/1dfc8271)\n    - More granular tokenization ([#2722](https://github.com/PrismJS/prism/issues/2722)) [`6183fd9b`](https://github.com/PrismJS/prism/commit/6183fd9b)\n    - Allow root path in request line ([#2711](https://github.com/PrismJS/prism/issues/2711)) [`4e7b2a82`](https://github.com/PrismJS/prism/commit/4e7b2a82)\n- **Ini**\n    - Consistently mimic Win32 INI parsing ([#2779](https://github.com/PrismJS/prism/issues/2779)) [`42d24fa2`](https://github.com/PrismJS/prism/commit/42d24fa2)\n- **Java**\n    - Improved generics ([#2812](https://github.com/PrismJS/prism/issues/2812)) [`4ec7535c`](https://github.com/PrismJS/prism/commit/4ec7535c)\n- **JavaScript**\n    - Added support for import assertions ([#2953](https://github.com/PrismJS/prism/issues/2953)) [`ab7c9953`](https://github.com/PrismJS/prism/commit/ab7c9953)\n    - Added support for RegExp Match Indices ([#2900](https://github.com/PrismJS/prism/issues/2900)) [`415651a0`](https://github.com/PrismJS/prism/commit/415651a0)\n    - Added hashbang and private getters/setters ([#2815](https://github.com/PrismJS/prism/issues/2815)) [`9c610ae6`](https://github.com/PrismJS/prism/commit/9c610ae6)\n    - Improved contextual keywords ([#2713](https://github.com/PrismJS/prism/issues/2713)) [`022f90a0`](https://github.com/PrismJS/prism/commit/022f90a0)\n- **JS Templates**\n    - Added SQL templates ([#2945](https://github.com/PrismJS/prism/issues/2945)) [`abab9104`](https://github.com/PrismJS/prism/commit/abab9104)\n- **JSON**\n    - Fixed backtracking issue in Safari ([#2691](https://github.com/PrismJS/prism/issues/2691)) [`cf28d1b2`](https://github.com/PrismJS/prism/commit/cf28d1b2)\n- **Liquid**\n    - Added Markup support, missing tokens, and other improvements ([#2950](https://github.com/PrismJS/prism/issues/2950)) [`ac1d12f9`](https://github.com/PrismJS/prism/commit/ac1d12f9)\n- **Log file**\n    - Minor improvements ([#2851](https://github.com/PrismJS/prism/issues/2851)) [`45ec4a88`](https://github.com/PrismJS/prism/commit/45ec4a88)\n- **Markdown**\n    - Improved code snippets ([#2967](https://github.com/PrismJS/prism/issues/2967)) [`e9477d83`](https://github.com/PrismJS/prism/commit/e9477d83)\n    - Workaround for incorrect highlighting due to double `wrap` hook ([#2719](https://github.com/PrismJS/prism/issues/2719)) [`2b355c98`](https://github.com/PrismJS/prism/commit/2b355c98)\n- **Markup**\n    - Added support for DOM event attributes ([#2702](https://github.com/PrismJS/prism/issues/2702)) [`8dbbbb35`](https://github.com/PrismJS/prism/commit/8dbbbb35)\n- **nginx**\n    - Complete rewrite ([#2793](https://github.com/PrismJS/prism/issues/2793)) [`5943f4cb`](https://github.com/PrismJS/prism/commit/5943f4cb)\n- **PHP**\n    - Fixed functions with namespaces ([#2889](https://github.com/PrismJS/prism/issues/2889)) [`87d79390`](https://github.com/PrismJS/prism/commit/87d79390)\n    - Fixed string interpolation ([#2864](https://github.com/PrismJS/prism/issues/2864)) [`cf3755cb`](https://github.com/PrismJS/prism/commit/cf3755cb)\n    - Added missing PHP 7.4 `fn` keyword ([#2858](https://github.com/PrismJS/prism/issues/2858)) [`e0ee93f1`](https://github.com/PrismJS/prism/commit/e0ee93f1)\n    - Fixed methods with keyword names + minor improvements ([#2818](https://github.com/PrismJS/prism/issues/2818)) [`7e8cd40d`](https://github.com/PrismJS/prism/commit/7e8cd40d)\n    - Improved constant support for PHP 8.1 enums ([#2770](https://github.com/PrismJS/prism/issues/2770)) [`8019e2f6`](https://github.com/PrismJS/prism/commit/8019e2f6)\n    - Added support for PHP 8.1 enums ([#2752](https://github.com/PrismJS/prism/issues/2752)) [`f79b0eef`](https://github.com/PrismJS/prism/commit/f79b0eef)\n    - Class names at the start of a string are now highlighted correctly ([#2731](https://github.com/PrismJS/prism/issues/2731)) [`04ef309c`](https://github.com/PrismJS/prism/commit/04ef309c)\n    - Numeral syntax improvements ([#2701](https://github.com/PrismJS/prism/issues/2701)) [`01af04ed`](https://github.com/PrismJS/prism/commit/01af04ed)\n- **React JSX**\n    - Added support for general spread expressions ([#2754](https://github.com/PrismJS/prism/issues/2754)) [`9f59f52d`](https://github.com/PrismJS/prism/commit/9f59f52d)\n    - Added support for comments inside tags ([#2728](https://github.com/PrismJS/prism/issues/2728)) [`30b0444f`](https://github.com/PrismJS/prism/commit/30b0444f)\n- **reST (reStructuredText)**\n    - Fixed `inline` pattern ([#2946](https://github.com/PrismJS/prism/issues/2946)) [`a7656de6`](https://github.com/PrismJS/prism/commit/a7656de6)\n- **Ruby**\n    - Added heredoc literals ([#2885](https://github.com/PrismJS/prism/issues/2885)) [`20b77bff`](https://github.com/PrismJS/prism/commit/20b77bff)\n    - Added missing regex flags ([#2845](https://github.com/PrismJS/prism/issues/2845)) [`3786f396`](https://github.com/PrismJS/prism/commit/3786f396)\n    - Added missing regex interpolation ([#2841](https://github.com/PrismJS/prism/issues/2841)) [`f08c2f7f`](https://github.com/PrismJS/prism/commit/f08c2f7f)\n- **Scheme**\n    - Added support for high Unicode characters ([#2693](https://github.com/PrismJS/prism/issues/2693)) [`0e61a7e1`](https://github.com/PrismJS/prism/commit/0e61a7e1)\n    - Added bracket support ([#2813](https://github.com/PrismJS/prism/issues/2813)) [`1c6c0bf3`](https://github.com/PrismJS/prism/commit/1c6c0bf3)\n- **Shell session**\n    - Fixed multi-line commands ([#2872](https://github.com/PrismJS/prism/issues/2872)) [`cda976b1`](https://github.com/PrismJS/prism/commit/cda976b1)\n    - Commands prefixed with a path are now detected ([#2686](https://github.com/PrismJS/prism/issues/2686)) [`c83fd0b8`](https://github.com/PrismJS/prism/commit/c83fd0b8)\n- **SQL**\n    - Added `ILIKE` operator ([#2704](https://github.com/PrismJS/prism/issues/2704)) [`6e34771f`](https://github.com/PrismJS/prism/commit/6e34771f)\n- **Swift**\n    - Added `some` keyword ([#2756](https://github.com/PrismJS/prism/issues/2756)) [`cf354ef5`](https://github.com/PrismJS/prism/commit/cf354ef5)\n- **TypeScript**\n    - Updated keywords ([#2861](https://github.com/PrismJS/prism/issues/2861)) [`fe98d536`](https://github.com/PrismJS/prism/commit/fe98d536)\n    - Added support for decorators ([#2820](https://github.com/PrismJS/prism/issues/2820)) [`31cc2142`](https://github.com/PrismJS/prism/commit/31cc2142)\n- **VB.Net**\n    - Improved strings, comments, and punctuation ([#2782](https://github.com/PrismJS/prism/issues/2782)) [`a68f1fb6`](https://github.com/PrismJS/prism/commit/a68f1fb6)\n- **Xojo (REALbasic)**\n    - `REM` is no longer highlighted as a keyword in comments ([#2823](https://github.com/PrismJS/prism/issues/2823)) [`ebbbfd47`](https://github.com/PrismJS/prism/commit/ebbbfd47)\n    - Added last missing Keyword \"Selector\" ([#2807](https://github.com/PrismJS/prism/issues/2807)) [`e32e043b`](https://github.com/PrismJS/prism/commit/e32e043b)\n    - Added missing keywords ([#2805](https://github.com/PrismJS/prism/issues/2805)) [`459365ec`](https://github.com/PrismJS/prism/commit/459365ec)\n\n### Updated plugins\n\n- Made Match Braces and Custom Class compatible ([#2947](https://github.com/PrismJS/prism/issues/2947)) [`4b55bd6a`](https://github.com/PrismJS/prism/commit/4b55bd6a)\n- Consistent Prism check ([#2788](https://github.com/PrismJS/prism/issues/2788)) [`96335642`](https://github.com/PrismJS/prism/commit/96335642)\n- **Command Line**\n    - Don't modify empty code blocks ([#2896](https://github.com/PrismJS/prism/issues/2896)) [`c81c3319`](https://github.com/PrismJS/prism/commit/c81c3319)\n- **Copy to Clipboard**\n    - Removed ClipboardJS dependency ([#2784](https://github.com/PrismJS/prism/issues/2784)) [`d5e14e1a`](https://github.com/PrismJS/prism/commit/d5e14e1a)\n    - Fixed `clipboard.writeText` not working inside iFrames ([#2826](https://github.com/PrismJS/prism/issues/2826)) [`01b7b6f7`](https://github.com/PrismJS/prism/commit/01b7b6f7)\n    - Added support for custom styles ([#2789](https://github.com/PrismJS/prism/issues/2789)) [`4d7f75b0`](https://github.com/PrismJS/prism/commit/4d7f75b0)\n    - Make copy-to-clipboard configurable with multiple attributes ([#2723](https://github.com/PrismJS/prism/issues/2723)) [`2cb909e1`](https://github.com/PrismJS/prism/commit/2cb909e1)\n- **File Highlight**\n    - Fixed Prism check ([#2827](https://github.com/PrismJS/prism/issues/2827)) [`53d34b22`](https://github.com/PrismJS/prism/commit/53d34b22)\n- **Line Highlight**\n    - Fixed linkable line numbers not being initialized ([#2732](https://github.com/PrismJS/prism/issues/2732)) [`ccc73ab7`](https://github.com/PrismJS/prism/commit/ccc73ab7)\n- **Previewers**\n    - Use `classList` instead of `className` ([#2787](https://github.com/PrismJS/prism/issues/2787)) [`d298d46e`](https://github.com/PrismJS/prism/commit/d298d46e)\n\n### Other\n\n- **Core**\n    - Add `tabindex` to code blocks to enable keyboard navigation ([#2799](https://github.com/PrismJS/prism/issues/2799)) [`dbf70515`](https://github.com/PrismJS/prism/commit/dbf70515)\n    - Fixed greedy rematching reach bug ([#2705](https://github.com/PrismJS/prism/issues/2705)) [`b37987d3`](https://github.com/PrismJS/prism/commit/b37987d3)\n    - Added support for plaintext ([#2738](https://github.com/PrismJS/prism/issues/2738)) [`970674cf`](https://github.com/PrismJS/prism/commit/970674cf)\n- **Infrastructure**\n    - Added ESLint\n    - Added `npm-run-all` to clean up test command ([#2938](https://github.com/PrismJS/prism/issues/2938)) [`5d3d8088`](https://github.com/PrismJS/prism/commit/5d3d8088)\n    - Added link to Q&A to issue templates ([#2834](https://github.com/PrismJS/prism/issues/2834)) [`7cd9e794`](https://github.com/PrismJS/prism/commit/7cd9e794)\n    - CI: Run tests with NodeJS 16.x ([#2888](https://github.com/PrismJS/prism/issues/2888)) [`b77317c5`](https://github.com/PrismJS/prism/commit/b77317c5)\n    - Dangerfile: Trim merge base ([#2761](https://github.com/PrismJS/prism/issues/2761)) [`45b0e82a`](https://github.com/PrismJS/prism/commit/45b0e82a)\n    - Dangerfile: Fixed how changed files are determined ([#2757](https://github.com/PrismJS/prism/issues/2757)) [`0feb266f`](https://github.com/PrismJS/prism/commit/0feb266f)\n    - Deps: Updated regex tooling ([#2923](https://github.com/PrismJS/prism/issues/2923)) [`ad9878ad`](https://github.com/PrismJS/prism/commit/ad9878ad)\n    - Tests: Added `--language` for patterns tests ([#2929](https://github.com/PrismJS/prism/issues/2929)) [`a62ef796`](https://github.com/PrismJS/prism/commit/a62ef796)\n    - Tests: Fixed polynomial backtracking test ([#2891](https://github.com/PrismJS/prism/issues/2891)) [`8dbf1217`](https://github.com/PrismJS/prism/commit/8dbf1217)\n    - Tests: Fixed languages test discovery [`a9a199b6`](https://github.com/PrismJS/prism/commit/a9a199b6)\n    - Tests: Test discovery should ignore unsupported file extensions ([#2886](https://github.com/PrismJS/prism/issues/2886)) [`4492c5ce`](https://github.com/PrismJS/prism/commit/4492c5ce)\n    - Tests: Exhaustive pattern tests ([#2688](https://github.com/PrismJS/prism/issues/2688)) [`53151404`](https://github.com/PrismJS/prism/commit/53151404)\n    - Tests: Fixed pretty print incorrectly calculating print width ([#2821](https://github.com/PrismJS/prism/issues/2821)) [`5bc405e7`](https://github.com/PrismJS/prism/commit/5bc405e7)\n    - Tests: Automatically normalize line ends ([#2934](https://github.com/PrismJS/prism/issues/2934)) [`99f3ddcd`](https://github.com/PrismJS/prism/commit/99f3ddcd)\n    - Tests: Added `--insert` and `--update` parameters to language test ([#2809](https://github.com/PrismJS/prism/issues/2809)) [`4c8b855d`](https://github.com/PrismJS/prism/commit/4c8b855d)\n    - Tests: Stricter `components.json` tests ([#2758](https://github.com/PrismJS/prism/issues/2758)) [`933af805`](https://github.com/PrismJS/prism/commit/933af805)\n- **Website**\n    - Copy to clipboard: Fixed highlighting ([#2725](https://github.com/PrismJS/prism/issues/2725)) [`7a790bf9`](https://github.com/PrismJS/prism/commit/7a790bf9)\n    - Readme: Mention `npm ci` ([#2899](https://github.com/PrismJS/prism/issues/2899)) [`91f3aaed`](https://github.com/PrismJS/prism/commit/91f3aaed)\n    - Readme: Added Node and npm version requirements ([#2790](https://github.com/PrismJS/prism/issues/2790)) [`cb220168`](https://github.com/PrismJS/prism/commit/cb220168)\n    - Readme: Update link to Chinese translation ([#2749](https://github.com/PrismJS/prism/issues/2749)) [`266cc700`](https://github.com/PrismJS/prism/commit/266cc700)\n    - Replace `my.cdn` in code sample with Handlebars-like placeholder ([#2906](https://github.com/PrismJS/prism/issues/2906)) [`80471181`](https://github.com/PrismJS/prism/commit/80471181)\n    - Set dummy domain for CDN ([#2905](https://github.com/PrismJS/prism/issues/2905)) [`38f1d289`](https://github.com/PrismJS/prism/commit/38f1d289)\n    - Added MySQL to \"Used by\" section ([#2785](https://github.com/PrismJS/prism/issues/2785)) [`9b784ebf`](https://github.com/PrismJS/prism/commit/9b784ebf)\n    - Improved basic usage section ([#2777](https://github.com/PrismJS/prism/issues/2777)) [`a1209930`](https://github.com/PrismJS/prism/commit/a1209930)\n    - Updated URL in Autolinker example ([#2751](https://github.com/PrismJS/prism/issues/2751)) [`ec9767d6`](https://github.com/PrismJS/prism/commit/ec9767d6)\n    - Added React native tutorial ([#2683](https://github.com/PrismJS/prism/issues/2683)) [`1506f345`](https://github.com/PrismJS/prism/commit/1506f345)\n\n## 1.23.0 (2020-12-31)\n\n### New components\n\n- **Apex** ([#2622](https://github.com/PrismJS/prism/issues/2622)) [`f0e2b70e`](https://github.com/PrismJS/prism/commit/f0e2b70e)\n- **DataWeave** ([#2659](https://github.com/PrismJS/prism/issues/2659)) [`0803525b`](https://github.com/PrismJS/prism/commit/0803525b)\n- **PromQL** ([#2628](https://github.com/PrismJS/prism/issues/2628)) [`8831c706`](https://github.com/PrismJS/prism/commit/8831c706)\n\n### Updated components\n\n- Fixed multiple vulnerable regexes ([#2584](https://github.com/PrismJS/prism/issues/2584)) [`c2f6a644`](https://github.com/PrismJS/prism/commit/c2f6a644)\n- **Apache Configuration**\n    - Update directive-flag to match `=` ([#2612](https://github.com/PrismJS/prism/issues/2612)) [`00bf00e3`](https://github.com/PrismJS/prism/commit/00bf00e3)\n- **C-like**\n    - Made all comments greedy ([#2680](https://github.com/PrismJS/prism/issues/2680)) [`0a3932fe`](https://github.com/PrismJS/prism/commit/0a3932fe)\n- **C**\n    - Better class name and macro name detection ([#2585](https://github.com/PrismJS/prism/issues/2585)) [`129faf5c`](https://github.com/PrismJS/prism/commit/129faf5c)\n- **Content-Security-Policy**\n    - Added missing directives and keywords ([#2664](https://github.com/PrismJS/prism/issues/2664)) [`f1541342`](https://github.com/PrismJS/prism/commit/f1541342)\n    - Do not highlight directive names with adjacent hyphens ([#2662](https://github.com/PrismJS/prism/issues/2662)) [`a7ccc16d`](https://github.com/PrismJS/prism/commit/a7ccc16d)\n- **CSS**\n    - Better HTML `style` attribute tokenization ([#2569](https://github.com/PrismJS/prism/issues/2569)) [`b04cbafe`](https://github.com/PrismJS/prism/commit/b04cbafe)\n- **Java**\n    - Improved package and class name detection ([#2599](https://github.com/PrismJS/prism/issues/2599)) [`0889bc7c`](https://github.com/PrismJS/prism/commit/0889bc7c)\n    - Added Java 15 keywords ([#2567](https://github.com/PrismJS/prism/issues/2567)) [`73f81c89`](https://github.com/PrismJS/prism/commit/73f81c89)\n- **Java stack trace**\n    - Added support stack frame element class loaders and modules ([#2658](https://github.com/PrismJS/prism/issues/2658)) [`0bb4f096`](https://github.com/PrismJS/prism/commit/0bb4f096)\n- **Julia**\n    - Removed constants that are not exported by default ([#2601](https://github.com/PrismJS/prism/issues/2601)) [`093c8175`](https://github.com/PrismJS/prism/commit/093c8175)\n- **Kotlin**\n    - Added support for backticks in function names ([#2489](https://github.com/PrismJS/prism/issues/2489)) [`a5107d5c`](https://github.com/PrismJS/prism/commit/a5107d5c)\n- **Latte**\n    - Fixed exponential backtracking ([#2682](https://github.com/PrismJS/prism/issues/2682)) [`89f1e182`](https://github.com/PrismJS/prism/commit/89f1e182)\n- **Markdown**\n    - Improved URL tokenization ([#2678](https://github.com/PrismJS/prism/issues/2678)) [`2af3e2c2`](https://github.com/PrismJS/prism/commit/2af3e2c2)\n    - Added support for YAML front matter ([#2634](https://github.com/PrismJS/prism/issues/2634)) [`5cf9cfbc`](https://github.com/PrismJS/prism/commit/5cf9cfbc)\n- **PHP**\n    - Added support for PHP 7.4 + other major improvements ([#2566](https://github.com/PrismJS/prism/issues/2566)) [`38808e64`](https://github.com/PrismJS/prism/commit/38808e64)\n    - Added support for PHP 8.0 features ([#2591](https://github.com/PrismJS/prism/issues/2591)) [`df922d90`](https://github.com/PrismJS/prism/commit/df922d90)\n    - Removed C-like dependency ([#2619](https://github.com/PrismJS/prism/issues/2619)) [`89ebb0b7`](https://github.com/PrismJS/prism/commit/89ebb0b7)\n    - Fixed exponential backtracking ([#2684](https://github.com/PrismJS/prism/issues/2684)) [`37b9c9a1`](https://github.com/PrismJS/prism/commit/37b9c9a1)\n- **Sass (Scss)**\n    - Added support for Sass modules ([#2643](https://github.com/PrismJS/prism/issues/2643)) [`deb238a6`](https://github.com/PrismJS/prism/commit/deb238a6)\n- **Scheme**\n    - Fixed number pattern ([#2648](https://github.com/PrismJS/prism/issues/2648)) [`e01ecd00`](https://github.com/PrismJS/prism/commit/e01ecd00)\n    - Fixed function and function-like false positives ([#2611](https://github.com/PrismJS/prism/issues/2611)) [`7951ca24`](https://github.com/PrismJS/prism/commit/7951ca24)\n- **Shell session**\n    - Fixed false positives because of links in command output ([#2649](https://github.com/PrismJS/prism/issues/2649)) [`8e76a978`](https://github.com/PrismJS/prism/commit/8e76a978)\n- **TSX**\n    - Temporary fix for the collisions of JSX tags and TS generics ([#2596](https://github.com/PrismJS/prism/issues/2596)) [`25bdb494`](https://github.com/PrismJS/prism/commit/25bdb494)\n\n### Updated plugins\n\n- Made Autoloader and Diff Highlight compatible ([#2580](https://github.com/PrismJS/prism/issues/2580)) [`7a74497a`](https://github.com/PrismJS/prism/commit/7a74497a)\n- **Copy to Clipboard Button**\n    - Set `type=\"button\"` attribute for copy to clipboard plugin ([#2593](https://github.com/PrismJS/prism/issues/2593)) [`f59a85f1`](https://github.com/PrismJS/prism/commit/f59a85f1)\n- **File Highlight**\n    - Fixed IE compatibility problem ([#2656](https://github.com/PrismJS/prism/issues/2656)) [`3f4ae00d`](https://github.com/PrismJS/prism/commit/3f4ae00d)\n- **Line Highlight**\n    - Fixed top offset in combination with Line numbers ([#2237](https://github.com/PrismJS/prism/issues/2237)) [`b40f8f4b`](https://github.com/PrismJS/prism/commit/b40f8f4b)\n    - Fixed print background color ([#2668](https://github.com/PrismJS/prism/issues/2668)) [`cdb24abe`](https://github.com/PrismJS/prism/commit/cdb24abe)\n- **Line Numbers**\n    - Fixed null reference ([#2605](https://github.com/PrismJS/prism/issues/2605)) [`7cdfe556`](https://github.com/PrismJS/prism/commit/7cdfe556)\n- **Treeview**\n    - Fixed icons on dark themes ([#2631](https://github.com/PrismJS/prism/issues/2631)) [`7266e32f`](https://github.com/PrismJS/prism/commit/7266e32f)\n- **Unescaped Markup**\n    - Refactoring ([#2445](https://github.com/PrismJS/prism/issues/2445)) [`fc602822`](https://github.com/PrismJS/prism/commit/fc602822)\n\n### Other\n\n- Readme: Added alternative link for Chinese translation [`071232b4`](https://github.com/PrismJS/prism/commit/071232b4)\n- Readme: Removed broken icon for Chinese translation ([#2670](https://github.com/PrismJS/prism/issues/2670)) [`2ea202b9`](https://github.com/PrismJS/prism/commit/2ea202b9)\n- Readme: Grammar adjustments ([#2629](https://github.com/PrismJS/prism/issues/2629)) [`f217ab75`](https://github.com/PrismJS/prism/commit/f217ab75)\n- **Core**\n    - Moved pattern matching + lookbehind logic into function ([#2633](https://github.com/PrismJS/prism/issues/2633)) [`24574406`](https://github.com/PrismJS/prism/commit/24574406)\n    - Fixed bug with greedy matching ([#2632](https://github.com/PrismJS/prism/issues/2632)) [`8fa8dd24`](https://github.com/PrismJS/prism/commit/8fa8dd24)\n- **Infrastructure**\n    - Migrate from TravisCI -> GitHub Actions ([#2606](https://github.com/PrismJS/prism/issues/2606)) [`69132045`](https://github.com/PrismJS/prism/commit/69132045)\n    - Added Dangerfile and provide bundle size info ([#2608](https://github.com/PrismJS/prism/issues/2608)) [`9df20c5e`](https://github.com/PrismJS/prism/commit/9df20c5e)\n    - New `start` script to start local server ([#2491](https://github.com/PrismJS/prism/issues/2491)) [`0604793c`](https://github.com/PrismJS/prism/commit/0604793c)\n    - Added test for exponential backtracking ([#2590](https://github.com/PrismJS/prism/issues/2590)) [`05afbb10`](https://github.com/PrismJS/prism/commit/05afbb10)\n    - Added test for polynomial backtracking ([#2597](https://github.com/PrismJS/prism/issues/2597)) [`e644178b`](https://github.com/PrismJS/prism/commit/e644178b)\n    - Tests: Better pretty print ([#2600](https://github.com/PrismJS/prism/issues/2600)) [`8bfcc819`](https://github.com/PrismJS/prism/commit/8bfcc819)\n    - Tests: Fixed sorted language list test ([#2623](https://github.com/PrismJS/prism/issues/2623)) [`2d3a1267`](https://github.com/PrismJS/prism/commit/2d3a1267)\n    - Tests: Stricter pattern for nice-token-names test ([#2588](https://github.com/PrismJS/prism/issues/2588)) [`0df60be1`](https://github.com/PrismJS/prism/commit/0df60be1)\n    - Tests: Added strict checks for `Prism.languages.extend` ([#2572](https://github.com/PrismJS/prism/issues/2572)) [`8828500e`](https://github.com/PrismJS/prism/commit/8828500e)\n- **Website**\n    - Test page: Added \"Share\" option ([#2575](https://github.com/PrismJS/prism/issues/2575)) [`b5f4f10e`](https://github.com/PrismJS/prism/commit/b5f4f10e)\n    - Test page: Don't trigger ad-blockers with class ([#2677](https://github.com/PrismJS/prism/issues/2677)) [`df0738e9`](https://github.com/PrismJS/prism/commit/df0738e9)\n    - Thousands -> millions [`9f82de50`](https://github.com/PrismJS/prism/commit/9f82de50)\n    - Unescaped Markup: More doc regarding comments ([#2652](https://github.com/PrismJS/prism/issues/2652)) [`add3736a`](https://github.com/PrismJS/prism/commit/add3736a)\n    - Website: Added and updated documentation ([#2654](https://github.com/PrismJS/prism/issues/2654)) [`8e660495`](https://github.com/PrismJS/prism/commit/8e660495)\n    - Website: Updated and improved guide on \"Extending Prism\" page ([#2586](https://github.com/PrismJS/prism/issues/2586)) [`8e1f38ff`](https://github.com/PrismJS/prism/commit/8e1f38ff)\n\n## 1.22.0 (2020-10-10)\n\n### New components\n\n- **Birb** ([#2542](https://github.com/PrismJS/prism/issues/2542)) [`4d31e22a`](https://github.com/PrismJS/prism/commit/4d31e22a)\n- **BSL (1C:Enterprise)** & **OneScript** ([#2520](https://github.com/PrismJS/prism/issues/2520)) [`5c33f0bb`](https://github.com/PrismJS/prism/commit/5c33f0bb)\n- **MongoDB** ([#2518](https://github.com/PrismJS/prism/issues/2518)) [`004eaa74`](https://github.com/PrismJS/prism/commit/004eaa74)\n- **Naninovel Script** ([#2494](https://github.com/PrismJS/prism/issues/2494)) [`388ad996`](https://github.com/PrismJS/prism/commit/388ad996)\n- **PureScript** ([#2526](https://github.com/PrismJS/prism/issues/2526)) [`ad748a00`](https://github.com/PrismJS/prism/commit/ad748a00)\n- **SML** & **SML/NJ** ([#2537](https://github.com/PrismJS/prism/issues/2537)) [`cb75d9e2`](https://github.com/PrismJS/prism/commit/cb75d9e2)\n- **Stan** ([#2490](https://github.com/PrismJS/prism/issues/2490)) [`2da2beba`](https://github.com/PrismJS/prism/commit/2da2beba)\n- **TypoScript** & **TSConfig** ([#2505](https://github.com/PrismJS/prism/issues/2505)) [`bf115f47`](https://github.com/PrismJS/prism/commit/bf115f47)\n\n### Updated components\n\n- Removed duplicate alternatives in various languages ([#2524](https://github.com/PrismJS/prism/issues/2524)) [`fa2225ff`](https://github.com/PrismJS/prism/commit/fa2225ff)\n- **Haskell**\n    - Improvements ([#2535](https://github.com/PrismJS/prism/issues/2535)) [`e023044c`](https://github.com/PrismJS/prism/commit/e023044c)\n- **JS Extras**\n    - Highlight import and export bindings ([#2533](https://github.com/PrismJS/prism/issues/2533)) [`c51ababb`](https://github.com/PrismJS/prism/commit/c51ababb)\n    - Added control-flow keywords ([#2529](https://github.com/PrismJS/prism/issues/2529)) [`bcef22af`](https://github.com/PrismJS/prism/commit/bcef22af)\n- **PHP**\n    - Added `match` keyword (PHP 8.0) ([#2574](https://github.com/PrismJS/prism/issues/2574)) [`1761513e`](https://github.com/PrismJS/prism/commit/1761513e)\n- **Processing**\n    - Fixed function pattern ([#2564](https://github.com/PrismJS/prism/issues/2564)) [`35cbc02f`](https://github.com/PrismJS/prism/commit/35cbc02f)\n- **Regex**\n    - Changed how languages embed regexes ([#2532](https://github.com/PrismJS/prism/issues/2532)) [`f62ca787`](https://github.com/PrismJS/prism/commit/f62ca787)\n- **Rust**\n    - Fixed Unicode char literals ([#2550](https://github.com/PrismJS/prism/issues/2550)) [`3b4f14ca`](https://github.com/PrismJS/prism/commit/3b4f14ca)\n- **Scheme**\n    - Added support for R7RS syntax ([#2525](https://github.com/PrismJS/prism/issues/2525)) [`e4f6ccac`](https://github.com/PrismJS/prism/commit/e4f6ccac)\n- **Shell session**\n    - Added aliases ([#2548](https://github.com/PrismJS/prism/issues/2548)) [`bfb36748`](https://github.com/PrismJS/prism/commit/bfb36748)\n    - Highlight all commands after the start of any Heredoc string ([#2509](https://github.com/PrismJS/prism/issues/2509)) [`6c921801`](https://github.com/PrismJS/prism/commit/6c921801)\n- **YAML**\n    - Improved key pattern ([#2561](https://github.com/PrismJS/prism/issues/2561)) [`59853a52`](https://github.com/PrismJS/prism/commit/59853a52)\n\n### Updated plugins\n\n- **Autoloader**\n    - Fixed file detection regexes ([#2549](https://github.com/PrismJS/prism/issues/2549)) [`d36ea993`](https://github.com/PrismJS/prism/commit/d36ea993)\n- **Match braces**\n    - Fixed JS interpolation punctuation ([#2541](https://github.com/PrismJS/prism/issues/2541)) [`6b47133d`](https://github.com/PrismJS/prism/commit/6b47133d)\n- **Show Language**\n    - Added title for plain text ([#2555](https://github.com/PrismJS/prism/issues/2555)) [`a409245e`](https://github.com/PrismJS/prism/commit/a409245e)\n\n### Other\n\n- Tests: Added an option to accept the actual token stream ([#2515](https://github.com/PrismJS/prism/issues/2515)) [`bafab634`](https://github.com/PrismJS/prism/commit/bafab634)\n- **Core**\n    - Docs: Minor improvement ([#2513](https://github.com/PrismJS/prism/issues/2513)) [`206dc80f`](https://github.com/PrismJS/prism/commit/206dc80f)\n- **Infrastructure**\n    - JSDoc: Fixed line ends ([#2523](https://github.com/PrismJS/prism/issues/2523)) [`bf169e5f`](https://github.com/PrismJS/prism/commit/bf169e5f)\n- **Website**\n    - Website: Added new SB101 tutorial replacing the Crambler one ([#2576](https://github.com/PrismJS/prism/issues/2576)) [`655f985c`](https://github.com/PrismJS/prism/commit/655f985c)\n    - Website: Fix typo on homepage by adding missing word add ([#2570](https://github.com/PrismJS/prism/issues/2570)) [`8ae6a4ba`](https://github.com/PrismJS/prism/commit/8ae6a4ba)\n    - Custom class: Improved doc ([#2512](https://github.com/PrismJS/prism/issues/2512)) [`5ad6cb23`](https://github.com/PrismJS/prism/commit/5ad6cb23)\n\n## 1.21.0 (2020-08-06)\n\n### New components\n\n- **.ignore** & **.gitignore** & **.hgignore** & **.npmignore** ([#2481](https://github.com/PrismJS/prism/issues/2481)) [`3fcce6fe`](https://github.com/PrismJS/prism/commit/3fcce6fe)\n- **Agda** ([#2430](https://github.com/PrismJS/prism/issues/2430)) [`3a127c7d`](https://github.com/PrismJS/prism/commit/3a127c7d)\n- **AL** ([#2300](https://github.com/PrismJS/prism/issues/2300)) [`de21eb64`](https://github.com/PrismJS/prism/commit/de21eb64)\n- **Cypher** ([#2459](https://github.com/PrismJS/prism/issues/2459)) [`398e2943`](https://github.com/PrismJS/prism/commit/398e2943)\n- **Dhall** ([#2473](https://github.com/PrismJS/prism/issues/2473)) [`649e51e5`](https://github.com/PrismJS/prism/commit/649e51e5)\n- **EditorConfig** ([#2471](https://github.com/PrismJS/prism/issues/2471)) [`ed8fff91`](https://github.com/PrismJS/prism/commit/ed8fff91)\n- **HLSL** ([#2318](https://github.com/PrismJS/prism/issues/2318)) [`87a5c7ae`](https://github.com/PrismJS/prism/commit/87a5c7ae)\n- **JS stack trace** ([#2418](https://github.com/PrismJS/prism/issues/2418)) [`ae0327b3`](https://github.com/PrismJS/prism/commit/ae0327b3)\n- **PeopleCode** ([#2302](https://github.com/PrismJS/prism/issues/2302)) [`bd4d8165`](https://github.com/PrismJS/prism/commit/bd4d8165)\n- **PureBasic** ([#2369](https://github.com/PrismJS/prism/issues/2369)) [`d0c1c70d`](https://github.com/PrismJS/prism/commit/d0c1c70d)\n- **Racket** ([#2315](https://github.com/PrismJS/prism/issues/2315)) [`053016ef`](https://github.com/PrismJS/prism/commit/053016ef)\n- **Smali** ([#2419](https://github.com/PrismJS/prism/issues/2419)) [`22eb5cad`](https://github.com/PrismJS/prism/commit/22eb5cad)\n- **Structured Text (IEC 61131-3)** ([#2311](https://github.com/PrismJS/prism/issues/2311)) [`8704cdfb`](https://github.com/PrismJS/prism/commit/8704cdfb)\n- **UnrealScript** ([#2305](https://github.com/PrismJS/prism/issues/2305)) [`1093ceb3`](https://github.com/PrismJS/prism/commit/1093ceb3)\n- **WarpScript** ([#2307](https://github.com/PrismJS/prism/issues/2307)) [`cde5b0fa`](https://github.com/PrismJS/prism/commit/cde5b0fa)\n- **XML doc (.net)** ([#2340](https://github.com/PrismJS/prism/issues/2340)) [`caec5e30`](https://github.com/PrismJS/prism/commit/caec5e30)\n- **YANG** ([#2467](https://github.com/PrismJS/prism/issues/2467)) [`ed1df1e1`](https://github.com/PrismJS/prism/commit/ed1df1e1)\n\n### Updated components\n\n- Markup & JSON: Added new aliases ([#2390](https://github.com/PrismJS/prism/issues/2390)) [`9782cfe6`](https://github.com/PrismJS/prism/commit/9782cfe6)\n- Fixed several cases of exponential backtracking ([#2268](https://github.com/PrismJS/prism/issues/2268)) [`7a554b5f`](https://github.com/PrismJS/prism/commit/7a554b5f)\n- **APL**\n    - Added `⍥` ([#2409](https://github.com/PrismJS/prism/issues/2409)) [`0255cb6a`](https://github.com/PrismJS/prism/commit/0255cb6a)\n- **AutoHotkey**\n    - Added missing `format` built-in ([#2450](https://github.com/PrismJS/prism/issues/2450)) [`7c66cfc4`](https://github.com/PrismJS/prism/commit/7c66cfc4)\n    - Improved comments and other improvements ([#2412](https://github.com/PrismJS/prism/issues/2412)) [`ddf3cc62`](https://github.com/PrismJS/prism/commit/ddf3cc62)\n    - Added missing definitions ([#2400](https://github.com/PrismJS/prism/issues/2400)) [`4fe03676`](https://github.com/PrismJS/prism/commit/4fe03676)\n- **Bash**\n    - Added `composer` command ([#2298](https://github.com/PrismJS/prism/issues/2298)) [`044dd271`](https://github.com/PrismJS/prism/commit/044dd271)\n- **Batch**\n    - Fix escaped double quote ([#2485](https://github.com/PrismJS/prism/issues/2485)) [`f0f8210c`](https://github.com/PrismJS/prism/commit/f0f8210c)\n- **C**\n    - Improved macros and expressions ([#2440](https://github.com/PrismJS/prism/issues/2440)) [`8a72fa6f`](https://github.com/PrismJS/prism/commit/8a72fa6f)\n    - Improved macros ([#2320](https://github.com/PrismJS/prism/issues/2320)) [`fdcf7ed2`](https://github.com/PrismJS/prism/commit/fdcf7ed2)\n- **C#**\n    - Improved pattern matching ([#2411](https://github.com/PrismJS/prism/issues/2411)) [`7f341fc1`](https://github.com/PrismJS/prism/commit/7f341fc1)\n    - Fixed adjacent string interpolations ([#2402](https://github.com/PrismJS/prism/issues/2402)) [`2a2e79ed`](https://github.com/PrismJS/prism/commit/2a2e79ed)\n- **C++**\n    - Added support for default comparison operator ([#2426](https://github.com/PrismJS/prism/issues/2426)) [`8e9d161c`](https://github.com/PrismJS/prism/commit/8e9d161c)\n    - Improved class name detection ([#2348](https://github.com/PrismJS/prism/issues/2348)) [`e3fe9040`](https://github.com/PrismJS/prism/commit/e3fe9040)\n    - Fixed `enum class` class names ([#2342](https://github.com/PrismJS/prism/issues/2342)) [`30b4e254`](https://github.com/PrismJS/prism/commit/30b4e254)\n- **Content-Security-Policy**\n    - Fixed directives ([#2461](https://github.com/PrismJS/prism/issues/2461)) [`537a9e80`](https://github.com/PrismJS/prism/commit/537a9e80)\n- **CSS**\n    - Improved url and added keywords ([#2432](https://github.com/PrismJS/prism/issues/2432)) [`964de5a1`](https://github.com/PrismJS/prism/commit/964de5a1)\n- **CSS Extras**\n    - Optimized `class` and `id` patterns ([#2359](https://github.com/PrismJS/prism/issues/2359)) [`fdbc4473`](https://github.com/PrismJS/prism/commit/fdbc4473)\n    - Renamed `attr-{name,value}` tokens and added tokens for combinators and selector lists ([#2373](https://github.com/PrismJS/prism/issues/2373)) [`e523f5d0`](https://github.com/PrismJS/prism/commit/e523f5d0)\n- **Dart**\n    - Added missing keywords ([#2355](https://github.com/PrismJS/prism/issues/2355)) [`4172ab6f`](https://github.com/PrismJS/prism/commit/4172ab6f)\n- **Diff**\n    - Added `prefix` token ([#2281](https://github.com/PrismJS/prism/issues/2281)) [`fd432a5b`](https://github.com/PrismJS/prism/commit/fd432a5b)\n- **Docker**\n    - Fixed strings inside comments ([#2428](https://github.com/PrismJS/prism/issues/2428)) [`37273a6f`](https://github.com/PrismJS/prism/commit/37273a6f)\n- **EditorConfig**\n    - Trim spaces before key and section title ([#2482](https://github.com/PrismJS/prism/issues/2482)) [`0c30c582`](https://github.com/PrismJS/prism/commit/0c30c582)\n- **EJS**\n    - Added `eta` alias ([#2282](https://github.com/PrismJS/prism/issues/2282)) [`0cfb6c5f`](https://github.com/PrismJS/prism/commit/0cfb6c5f)\n- **GLSL**\n    - Improvements ([#2321](https://github.com/PrismJS/prism/issues/2321)) [`33e49956`](https://github.com/PrismJS/prism/commit/33e49956)\n- **GraphQL**\n    - Added missing keywords ([#2407](https://github.com/PrismJS/prism/issues/2407)) [`de8ed16d`](https://github.com/PrismJS/prism/commit/de8ed16d)\n    - Added support for multi-line strings and descriptions ([#2406](https://github.com/PrismJS/prism/issues/2406)) [`9e64c62e`](https://github.com/PrismJS/prism/commit/9e64c62e)\n- **Io**\n    - Fixed operator pattern ([#2365](https://github.com/PrismJS/prism/issues/2365)) [`d6055771`](https://github.com/PrismJS/prism/commit/d6055771)\n- **Java**\n    - Fixed `namespace` token ([#2295](https://github.com/PrismJS/prism/issues/2295)) [`62e184bb`](https://github.com/PrismJS/prism/commit/62e184bb)\n- **JavaDoc**\n    - Improvements ([#2324](https://github.com/PrismJS/prism/issues/2324)) [`032910ba`](https://github.com/PrismJS/prism/commit/032910ba)\n- **JavaScript**\n    - Improved regex detection ([#2465](https://github.com/PrismJS/prism/issues/2465)) [`4f55052f`](https://github.com/PrismJS/prism/commit/4f55052f)\n    - Improved `get`/`set` and parameter detection ([#2387](https://github.com/PrismJS/prism/issues/2387)) [`ed715158`](https://github.com/PrismJS/prism/commit/ed715158)\n    - Added support for logical assignment operators ([#2378](https://github.com/PrismJS/prism/issues/2378)) [`b28f21b7`](https://github.com/PrismJS/prism/commit/b28f21b7)\n- **JSDoc**\n    - Improvements ([#2466](https://github.com/PrismJS/prism/issues/2466)) [`2805ae35`](https://github.com/PrismJS/prism/commit/2805ae35)\n- **JSON**\n    - Greedy comments ([#2479](https://github.com/PrismJS/prism/issues/2479)) [`158caf52`](https://github.com/PrismJS/prism/commit/158caf52)\n- **Julia**\n    - Improved strings, comments, and other patterns ([#2363](https://github.com/PrismJS/prism/issues/2363)) [`81cf2344`](https://github.com/PrismJS/prism/commit/81cf2344)\n- **Kotlin**\n    - Added `kt` and `kts` aliases ([#2474](https://github.com/PrismJS/prism/issues/2474)) [`67f97e2e`](https://github.com/PrismJS/prism/commit/67f97e2e)\n- **Markup**\n    - Added tokens inside DOCTYPE ([#2349](https://github.com/PrismJS/prism/issues/2349)) [`9c7bc820`](https://github.com/PrismJS/prism/commit/9c7bc820)\n    - Added `attr-equals` alias for the attribute `=` sign ([#2350](https://github.com/PrismJS/prism/issues/2350)) [`96a0116e`](https://github.com/PrismJS/prism/commit/96a0116e)\n    - Added alias for named entities ([#2351](https://github.com/PrismJS/prism/issues/2351)) [`ab1e34ae`](https://github.com/PrismJS/prism/commit/ab1e34ae)\n    - Added support for SSML ([#2306](https://github.com/PrismJS/prism/issues/2306)) [`eb70070d`](https://github.com/PrismJS/prism/commit/eb70070d)\n- **Objective-C**\n    - Added `objc` alias ([#2331](https://github.com/PrismJS/prism/issues/2331)) [`67c6b7af`](https://github.com/PrismJS/prism/commit/67c6b7af)\n- **PowerShell**\n    - New functions pattern bases on naming conventions ([#2301](https://github.com/PrismJS/prism/issues/2301)) [`fec39bcf`](https://github.com/PrismJS/prism/commit/fec39bcf)\n- **Protocol Buffers**\n    - Added support for RPC syntax ([#2414](https://github.com/PrismJS/prism/issues/2414)) [`939a17c4`](https://github.com/PrismJS/prism/commit/939a17c4)\n- **Pug**\n    - Improved class and id detection in tags ([#2358](https://github.com/PrismJS/prism/issues/2358)) [`7f948ecb`](https://github.com/PrismJS/prism/commit/7f948ecb)\n- **Python**\n    - Fixed empty multiline strings ([#2344](https://github.com/PrismJS/prism/issues/2344)) [`c9324476`](https://github.com/PrismJS/prism/commit/c9324476)\n- **Regex**\n    - Added aliases and minor improvements ([#2325](https://github.com/PrismJS/prism/issues/2325)) [`8a72830a`](https://github.com/PrismJS/prism/commit/8a72830a)\n- **Ren'py**\n    - Added `rpy` alias ([#2385](https://github.com/PrismJS/prism/issues/2385)) [`4935b5ca`](https://github.com/PrismJS/prism/commit/4935b5ca)\n- **Ruby**\n    - Optimized `regex` and `string` patterns ([#2354](https://github.com/PrismJS/prism/issues/2354)) [`b526e8c0`](https://github.com/PrismJS/prism/commit/b526e8c0)\n- **Rust**\n    - Improvements ([#2464](https://github.com/PrismJS/prism/issues/2464)) [`2ff40fe0`](https://github.com/PrismJS/prism/commit/2ff40fe0)\n    - Improvements ([#2332](https://github.com/PrismJS/prism/issues/2332)) [`194c5429`](https://github.com/PrismJS/prism/commit/194c5429)\n- **SAS**\n    - Improved macro string functions ([#2463](https://github.com/PrismJS/prism/issues/2463)) [`278316ca`](https://github.com/PrismJS/prism/commit/278316ca)\n    - Handle edge case of string macro functions ([#2451](https://github.com/PrismJS/prism/issues/2451)) [`a0a9f1ef`](https://github.com/PrismJS/prism/commit/a0a9f1ef)\n    - Improved comments in `proc groovy` and `proc lua` ([#2392](https://github.com/PrismJS/prism/issues/2392)) [`475a5903`](https://github.com/PrismJS/prism/commit/475a5903)\n- **Scheme**\n    - Adjusted lookbehind for literals ([#2396](https://github.com/PrismJS/prism/issues/2396)) [`1e3f542b`](https://github.com/PrismJS/prism/commit/1e3f542b)\n    - Improved lambda parameter ([#2346](https://github.com/PrismJS/prism/issues/2346)) [`1946918a`](https://github.com/PrismJS/prism/commit/1946918a)\n    - Consistent lookaheads ([#2322](https://github.com/PrismJS/prism/issues/2322)) [`d2541d54`](https://github.com/PrismJS/prism/commit/d2541d54)\n    - Improved boolean ([#2316](https://github.com/PrismJS/prism/issues/2316)) [`e27e65af`](https://github.com/PrismJS/prism/commit/e27e65af)\n    - Added missing special keywords ([#2304](https://github.com/PrismJS/prism/issues/2304)) [`ac297ba5`](https://github.com/PrismJS/prism/commit/ac297ba5)\n    - Improvements ([#2263](https://github.com/PrismJS/prism/issues/2263)) [`9a49f78f`](https://github.com/PrismJS/prism/commit/9a49f78f)\n- **Solidity (Ethereum)**\n    - Added `sol` alias ([#2382](https://github.com/PrismJS/prism/issues/2382)) [`6352213a`](https://github.com/PrismJS/prism/commit/6352213a)\n- **SQL**\n    - Added PostgreSQL `RETURNING` keyword ([#2476](https://github.com/PrismJS/prism/issues/2476)) [`bea7a585`](https://github.com/PrismJS/prism/commit/bea7a585)\n- **Stylus**\n    - Fixed comments breaking declarations + minor improvements ([#2372](https://github.com/PrismJS/prism/issues/2372)) [`6d663b6e`](https://github.com/PrismJS/prism/commit/6d663b6e)\n    - New tokens and other improvements ([#2368](https://github.com/PrismJS/prism/issues/2368)) [`2c10ef8a`](https://github.com/PrismJS/prism/commit/2c10ef8a)\n    - Fixed comments breaking strings and URLs ([#2361](https://github.com/PrismJS/prism/issues/2361)) [`0d65d6c9`](https://github.com/PrismJS/prism/commit/0d65d6c9)\n- **T4 Text Templates (VB)**\n    - Use the correct VB variant ([#2341](https://github.com/PrismJS/prism/issues/2341)) [`b6093339`](https://github.com/PrismJS/prism/commit/b6093339)\n- **TypeScript**\n    - Added `asserts` keyword and other improvements ([#2280](https://github.com/PrismJS/prism/issues/2280)) [`a197cfcd`](https://github.com/PrismJS/prism/commit/a197cfcd)\n- **Visual Basic**\n    - Added VBA alias ([#2469](https://github.com/PrismJS/prism/issues/2469)) [`78161d60`](https://github.com/PrismJS/prism/commit/78161d60)\n    - Added `until` keyword ([#2423](https://github.com/PrismJS/prism/issues/2423)) [`a13ee8d9`](https://github.com/PrismJS/prism/commit/a13ee8d9)\n    - Added missing keywords ([#2376](https://github.com/PrismJS/prism/issues/2376)) [`ba5ac1da`](https://github.com/PrismJS/prism/commit/ba5ac1da)\n\n### Updated plugins\n\n- File Highlight & JSONP Highlight update ([#1974](https://github.com/PrismJS/prism/issues/1974)) [`afea17d9`](https://github.com/PrismJS/prism/commit/afea17d9)\n- Added general de/activation mechanism for plugins ([#2434](https://github.com/PrismJS/prism/issues/2434)) [`a36e96ab`](https://github.com/PrismJS/prism/commit/a36e96ab)\n- **Autoloader**\n    - Fixed bug breaking Autoloader ([#2449](https://github.com/PrismJS/prism/issues/2449)) [`a3416bf3`](https://github.com/PrismJS/prism/commit/a3416bf3)\n    - Fixed `data-dependencies` and extensions ([#2326](https://github.com/PrismJS/prism/issues/2326)) [`1654b25f`](https://github.com/PrismJS/prism/commit/1654b25f)\n    - Improved path detection and other minor improvements ([#2245](https://github.com/PrismJS/prism/issues/2245)) [`5cdc3251`](https://github.com/PrismJS/prism/commit/5cdc3251)\n- **Command Line**\n    - Some refactoring ([#2290](https://github.com/PrismJS/prism/issues/2290)) [`8c9c2896`](https://github.com/PrismJS/prism/commit/8c9c2896)\n    - Correctly rehighlight elements ([#2291](https://github.com/PrismJS/prism/issues/2291)) [`e6b2c6fc`](https://github.com/PrismJS/prism/commit/e6b2c6fc)\n- **Line Highlight**\n    - Added linkable line numbers ([#2328](https://github.com/PrismJS/prism/issues/2328)) [`eb82e804`](https://github.com/PrismJS/prism/commit/eb82e804)\n- **Line Numbers**\n    - Improved resize performance ([#2125](https://github.com/PrismJS/prism/issues/2125)) [`b96ed225`](https://github.com/PrismJS/prism/commit/b96ed225)\n    - Fixed TypeError when `lineNumberWrapper` is null ([#2337](https://github.com/PrismJS/prism/issues/2337)) [`4b61661d`](https://github.com/PrismJS/prism/commit/4b61661d)\n    - Exposed `_resizeElement` function ([#2288](https://github.com/PrismJS/prism/issues/2288)) [`893f2a79`](https://github.com/PrismJS/prism/commit/893f2a79)\n- **Previewers**\n    - Fixed XSS ([#2506](https://github.com/PrismJS/prism/issues/2506)) [`8bba4880`](https://github.com/PrismJS/prism/commit/8bba4880)\n- **Unescaped Markup**\n    - No longer requires `Prism.languages.markup` ([#2444](https://github.com/PrismJS/prism/issues/2444)) [`af132dd3`](https://github.com/PrismJS/prism/commit/af132dd3)\n\n### Updated themes\n\n- **Coy**\n    - Minor improvements ([#2176](https://github.com/PrismJS/prism/issues/2176)) [`7109c18c`](https://github.com/PrismJS/prism/commit/7109c18c)\n- **Default**\n    - Added a comment that declares the background color of `operator` tokens as intentional ([#2309](https://github.com/PrismJS/prism/issues/2309)) [`937e2691`](https://github.com/PrismJS/prism/commit/937e2691)\n- **Okaidia**\n    - Update comment text color to meet WCAG contrast recommendations to AA level ([#2292](https://github.com/PrismJS/prism/issues/2292)) [`06495f90`](https://github.com/PrismJS/prism/commit/06495f90)\n\n### Other\n\n- Changelog: Fixed v1.20.0 release date [`cb6349e2`](https://github.com/PrismJS/prism/commit/cb6349e2)\n- **Core**\n    - Fixed greedy matching bug ([#2032](https://github.com/PrismJS/prism/issues/2032)) [`40285203`](https://github.com/PrismJS/prism/commit/40285203)\n    - Added JSDoc ([#1782](https://github.com/PrismJS/prism/issues/1782)) [`4ff555be`](https://github.com/PrismJS/prism/commit/4ff555be)\n- **Infrastructure**\n    - Update Git repo URL in package.json ([#2334](https://github.com/PrismJS/prism/issues/2334)) [`10f43275`](https://github.com/PrismJS/prism/commit/10f43275)\n    - Added docs to ignore files ([#2437](https://github.com/PrismJS/prism/issues/2437)) [`05c9f20b`](https://github.com/PrismJS/prism/commit/05c9f20b)\n    - Added `npm run build` command ([#2356](https://github.com/PrismJS/prism/issues/2356)) [`ff74a610`](https://github.com/PrismJS/prism/commit/ff74a610)\n    - gulp: Improved `inlineRegexSource` ([#2296](https://github.com/PrismJS/prism/issues/2296)) [`abb800dd`](https://github.com/PrismJS/prism/commit/abb800dd)\n    - gulp: Fixed language map ([#2283](https://github.com/PrismJS/prism/issues/2283)) [`11053193`](https://github.com/PrismJS/prism/commit/11053193)\n    - gulp: Removed `premerge` task ([#2357](https://github.com/PrismJS/prism/issues/2357)) [`5ff7932b`](https://github.com/PrismJS/prism/commit/5ff7932b)\n    - Tests are now faster ([#2165](https://github.com/PrismJS/prism/issues/2165)) [`e756be3f`](https://github.com/PrismJS/prism/commit/e756be3f)\n    - Tests: Added extra newlines in pretty token streams ([#2070](https://github.com/PrismJS/prism/issues/2070)) [`681adeef`](https://github.com/PrismJS/prism/commit/681adeef)\n    - Tests: Added test for identifier support across all languages ([#2371](https://github.com/PrismJS/prism/issues/2371)) [`48fac3b2`](https://github.com/PrismJS/prism/commit/48fac3b2)\n    - Tests: Added test to sort the language list ([#2222](https://github.com/PrismJS/prism/issues/2222)) [`a3758728`](https://github.com/PrismJS/prism/commit/a3758728)\n    - Tests: Always pretty-print token streams ([#2421](https://github.com/PrismJS/prism/issues/2421)) [`583e7eb5`](https://github.com/PrismJS/prism/commit/583e7eb5)\n    - Tests: Always use `components.json` ([#2370](https://github.com/PrismJS/prism/issues/2370)) [`e416341f`](https://github.com/PrismJS/prism/commit/e416341f)\n    - Tests: Better error messages for pattern tests ([#2364](https://github.com/PrismJS/prism/issues/2364)) [`10ca6433`](https://github.com/PrismJS/prism/commit/10ca6433)\n    - Tests: Included `console` in VM context ([#2353](https://github.com/PrismJS/prism/issues/2353)) [`b4ed5ded`](https://github.com/PrismJS/prism/commit/b4ed5ded)\n- **Website**\n    - Fixed typos \"Prims\" ([#2455](https://github.com/PrismJS/prism/issues/2455)) [`dfa5498a`](https://github.com/PrismJS/prism/commit/dfa5498a)\n    - New assets directory for all web-only files ([#2180](https://github.com/PrismJS/prism/issues/2180)) [`91fdd0b1`](https://github.com/PrismJS/prism/commit/91fdd0b1)\n    - Improvements ([#2053](https://github.com/PrismJS/prism/issues/2053)) [`ce0fa227`](https://github.com/PrismJS/prism/commit/ce0fa227)\n    - Fixed Treeview page ([#2484](https://github.com/PrismJS/prism/issues/2484)) [`a0efa40b`](https://github.com/PrismJS/prism/commit/a0efa40b)\n    - Line Numbers: Fixed class name on website [`453079bf`](https://github.com/PrismJS/prism/commit/453079bf)\n    - Line Numbers: Improved documentation ([#2456](https://github.com/PrismJS/prism/issues/2456)) [`447429f0`](https://github.com/PrismJS/prism/commit/447429f0)\n    - Line Numbers: Style inline code on website ([#2435](https://github.com/PrismJS/prism/issues/2435)) [`ad9c13e2`](https://github.com/PrismJS/prism/commit/ad9c13e2)\n    - Filter highlightAll: Fixed typo ([#2391](https://github.com/PrismJS/prism/issues/2391)) [`55bf7ec1`](https://github.com/PrismJS/prism/commit/55bf7ec1)\n\n## 1.20.0 (2020-04-04)\n\n### New components\n\n- **Concurnas** ([#2206](https://github.com/PrismJS/prism/issues/2206)) [`b24f7348`](https://github.com/PrismJS/prism/commit/b24f7348)\n- **DAX** ([#2248](https://github.com/PrismJS/prism/issues/2248)) [`9227853f`](https://github.com/PrismJS/prism/commit/9227853f)\n- **Excel Formula** ([#2219](https://github.com/PrismJS/prism/issues/2219)) [`bf4f7bfa`](https://github.com/PrismJS/prism/commit/bf4f7bfa)\n- **Factor** ([#2203](https://github.com/PrismJS/prism/issues/2203)) [`f941102e`](https://github.com/PrismJS/prism/commit/f941102e)\n- **LLVM IR** ([#2221](https://github.com/PrismJS/prism/issues/2221)) [`43efde2e`](https://github.com/PrismJS/prism/commit/43efde2e)\n- **PowerQuery** ([#2250](https://github.com/PrismJS/prism/issues/2250)) [`8119e57b`](https://github.com/PrismJS/prism/commit/8119e57b)\n- **Solution file** ([#2213](https://github.com/PrismJS/prism/issues/2213)) [`15983d52`](https://github.com/PrismJS/prism/commit/15983d52)\n\n### Updated components\n\n- **Bash**\n    - Added support for escaped quotes ([#2256](https://github.com/PrismJS/prism/issues/2256)) [`328d0e0e`](https://github.com/PrismJS/prism/commit/328d0e0e)\n- **BBcode**\n    - Added \"shortcode\" alias ([#2273](https://github.com/PrismJS/prism/issues/2273)) [`57eebced`](https://github.com/PrismJS/prism/commit/57eebced)\n- **C/C++/OpenCL C**\n    - Improvements ([#2196](https://github.com/PrismJS/prism/issues/2196)) [`674f4b35`](https://github.com/PrismJS/prism/commit/674f4b35)\n- **C**\n    - Improvemed `comment` pattern ([#2229](https://github.com/PrismJS/prism/issues/2229)) [`fa630726`](https://github.com/PrismJS/prism/commit/fa630726)\n- **C#**\n    - Fixed keywords in type lists blocking type names ([#2277](https://github.com/PrismJS/prism/issues/2277)) [`947a55bd`](https://github.com/PrismJS/prism/commit/947a55bd)\n    - C# improvements ([#1444](https://github.com/PrismJS/prism/issues/1444)) [`42b15463`](https://github.com/PrismJS/prism/commit/42b15463)\n- **C++**\n    - Added C++20 keywords ([#2236](https://github.com/PrismJS/prism/issues/2236)) [`462ad57e`](https://github.com/PrismJS/prism/commit/462ad57e)\n- **CSS**\n    - Fixed `url()` containing \"@\" ([#2272](https://github.com/PrismJS/prism/issues/2272)) [`504a63ba`](https://github.com/PrismJS/prism/commit/504a63ba)\n- **CSS Extras**\n    - Added support for the selector function ([#2201](https://github.com/PrismJS/prism/issues/2201)) [`2e0eff76`](https://github.com/PrismJS/prism/commit/2e0eff76)\n- **Elixir**\n    - Added support for attributes names ending with `?` ([#2182](https://github.com/PrismJS/prism/issues/2182)) [`5450e24c`](https://github.com/PrismJS/prism/commit/5450e24c)\n- **Java**\n    - Added `record` keyword ([#2185](https://github.com/PrismJS/prism/issues/2185)) [`47910b5c`](https://github.com/PrismJS/prism/commit/47910b5c)\n- **Markdown**\n    - Added support for nested lists ([#2228](https://github.com/PrismJS/prism/issues/2228)) [`73c8a376`](https://github.com/PrismJS/prism/commit/73c8a376)\n- **OpenCL**\n    - Require C ([#2231](https://github.com/PrismJS/prism/issues/2231)) [`26626ded`](https://github.com/PrismJS/prism/commit/26626ded)\n- **PHPDoc**\n    - Fixed exponential backtracking ([#2198](https://github.com/PrismJS/prism/issues/2198)) [`3b42536e`](https://github.com/PrismJS/prism/commit/3b42536e)\n- **Ruby**\n    - Fixed exponential backtracking ([#2225](https://github.com/PrismJS/prism/issues/2225)) [`c5de5aa8`](https://github.com/PrismJS/prism/commit/c5de5aa8)\n- **SAS**\n    - Fixed SAS' \"peerDependencies\" ([#2230](https://github.com/PrismJS/prism/issues/2230)) [`7d8ff7ea`](https://github.com/PrismJS/prism/commit/7d8ff7ea)\n- **Shell session**\n    - Improvements ([#2208](https://github.com/PrismJS/prism/issues/2208)) [`bd16bd57`](https://github.com/PrismJS/prism/commit/bd16bd57)\n- **Visual Basic**\n    - Added support for comments with line continuations ([#2195](https://github.com/PrismJS/prism/issues/2195)) [`a7d67ca3`](https://github.com/PrismJS/prism/commit/a7d67ca3)\n- **YAML**\n    - Improvements ([#2226](https://github.com/PrismJS/prism/issues/2226)) [`5362ba16`](https://github.com/PrismJS/prism/commit/5362ba16)\n    - Fixed highlighting of anchors and aliases ([#2217](https://github.com/PrismJS/prism/issues/2217)) [`6124c974`](https://github.com/PrismJS/prism/commit/6124c974)\n\n### New plugins\n\n- **Treeview** ([#2265](https://github.com/PrismJS/prism/issues/2265)) [`be909b18`](https://github.com/PrismJS/prism/commit/be909b18)\n\n### Updated plugins\n\n- **Inline Color**\n    - Support for (semi-)transparent colors and minor improvements ([#2223](https://github.com/PrismJS/prism/issues/2223)) [`8d2c5a3e`](https://github.com/PrismJS/prism/commit/8d2c5a3e)\n- **Keep Markup**\n    - Remove self & document from IIFE arguments ([#2258](https://github.com/PrismJS/prism/issues/2258)) [`3c043338`](https://github.com/PrismJS/prism/commit/3c043338)\n- **Toolbar**\n    - `data-toolbar-order` is now inherited ([#2205](https://github.com/PrismJS/prism/issues/2205)) [`238f1163`](https://github.com/PrismJS/prism/commit/238f1163)\n\n### Other\n\n- Updated all `String.propotype.replace` calls for literal strings [`5d7aab56`](https://github.com/PrismJS/prism/commit/5d7aab56)\n- **Core**\n    - Linked list implementation for `matchGrammar` ([#1909](https://github.com/PrismJS/prism/issues/1909)) [`2d4c94cd`](https://github.com/PrismJS/prism/commit/2d4c94cd)\n    - Faster `Token.stringify` ([#2171](https://github.com/PrismJS/prism/issues/2171)) [`f683972e`](https://github.com/PrismJS/prism/commit/f683972e)\n    - Fixed scope problem in script mode ([#2184](https://github.com/PrismJS/prism/issues/2184)) [`984e5d2e`](https://github.com/PrismJS/prism/commit/984e5d2e)\n- **Infrastructure**\n    - Travis: Updated NodeJS versions ([#2246](https://github.com/PrismJS/prism/issues/2246)) [`e635260b`](https://github.com/PrismJS/prism/commit/e635260b)\n    - gulp: Inline regex source improvement ([#2227](https://github.com/PrismJS/prism/issues/2227)) [`67afc5ad`](https://github.com/PrismJS/prism/commit/67afc5ad)\n    - Tests: Added new pattern check for octal escapes ([#2189](https://github.com/PrismJS/prism/issues/2189)) [`81e1c3dd`](https://github.com/PrismJS/prism/commit/81e1c3dd)\n    - Tests: Fixed optional dependencies in pattern tests ([#2242](https://github.com/PrismJS/prism/issues/2242)) [`1e3070a2`](https://github.com/PrismJS/prism/commit/1e3070a2)\n    - Tests: Added test for zero-width lookbehinds ([#2220](https://github.com/PrismJS/prism/issues/2220)) [`7d03ece4`](https://github.com/PrismJS/prism/commit/7d03ece4)\n    - Added tests for examples ([#2216](https://github.com/PrismJS/prism/issues/2216)) [`1f7a245c`](https://github.com/PrismJS/prism/commit/1f7a245c)\n- **Website**\n    - Removed invalid strings from C# example ([#2266](https://github.com/PrismJS/prism/issues/2266)) [`c917a8ca`](https://github.com/PrismJS/prism/commit/c917a8ca)\n    - Fixed Diff highlight plugin page title ([#2233](https://github.com/PrismJS/prism/issues/2233)) [`a82770f8`](https://github.com/PrismJS/prism/commit/a82770f8)\n    - Added link to `prism-liquibase` Bash language extension. ([#2191](https://github.com/PrismJS/prism/issues/2191)) [`0bf73dc7`](https://github.com/PrismJS/prism/commit/0bf73dc7)\n    - Examples: Updated content header ([#2232](https://github.com/PrismJS/prism/issues/2232)) [`6232878b`](https://github.com/PrismJS/prism/commit/6232878b)\n    - Website: Added Coy bug to the known failures page. ([#2170](https://github.com/PrismJS/prism/issues/2170)) [`e9dab85e`](https://github.com/PrismJS/prism/commit/e9dab85e)\n\n## 1.19.0 (2020-01-13)\n\n### New components\n\n- **Latte** ([#2140](https://github.com/PrismJS/prism/issues/2140)) [`694a81b8`](https://github.com/PrismJS/prism/commit/694a81b8)\n- **Neon** ([#2140](https://github.com/PrismJS/prism/issues/2140)) [`694a81b8`](https://github.com/PrismJS/prism/commit/694a81b8)\n- **QML** ([#2139](https://github.com/PrismJS/prism/issues/2139)) [`c40d96c6`](https://github.com/PrismJS/prism/commit/c40d96c6)\n\n### Updated components\n\n- **Handlebars**\n    - Added support for `:` and improved the `variable` pattern ([#2172](https://github.com/PrismJS/prism/issues/2172)) [`ef4d29d9`](https://github.com/PrismJS/prism/commit/ef4d29d9)\n- **JavaScript**\n    - Added support for keywords after a spread operator ([#2148](https://github.com/PrismJS/prism/issues/2148)) [`1f3f8929`](https://github.com/PrismJS/prism/commit/1f3f8929)\n    - Better regex detection ([#2158](https://github.com/PrismJS/prism/issues/2158)) [`a23d8f84`](https://github.com/PrismJS/prism/commit/a23d8f84)\n- **Markdown**\n    - Better language detection for code blocks ([#2114](https://github.com/PrismJS/prism/issues/2114)) [`d7ad48f9`](https://github.com/PrismJS/prism/commit/d7ad48f9)\n- **OCaml**\n    - Improvements ([#2179](https://github.com/PrismJS/prism/issues/2179)) [`2a570fd4`](https://github.com/PrismJS/prism/commit/2a570fd4)\n- **PHP**\n    - Fixed exponential runtime of a pattern ([#2157](https://github.com/PrismJS/prism/issues/2157)) [`24c8f833`](https://github.com/PrismJS/prism/commit/24c8f833)\n- **React JSX**\n    - Improved spread operator in tag attributes ([#2159](https://github.com/PrismJS/prism/issues/2159)) [`fd857e7b`](https://github.com/PrismJS/prism/commit/fd857e7b)\n    - Made `$` a valid character for attribute names ([#2144](https://github.com/PrismJS/prism/issues/2144)) [`f018cf04`](https://github.com/PrismJS/prism/commit/f018cf04)\n- **Reason**\n    - Added support for single line comments ([#2150](https://github.com/PrismJS/prism/issues/2150)) [`7f1c55b7`](https://github.com/PrismJS/prism/commit/7f1c55b7)\n- **Ruby**\n    - Override 'class-name' definition ([#2135](https://github.com/PrismJS/prism/issues/2135)) [`401d4b02`](https://github.com/PrismJS/prism/commit/401d4b02)\n- **SAS**\n    - Added CASL support ([#2112](https://github.com/PrismJS/prism/issues/2112)) [`99d979a0`](https://github.com/PrismJS/prism/commit/99d979a0)\n\n### Updated plugins\n\n- **Custom Class**\n    - Fixed TypeError when mapper is undefined ([#2167](https://github.com/PrismJS/prism/issues/2167)) [`543f04d7`](https://github.com/PrismJS/prism/commit/543f04d7)\n\n### Updated themes\n\n- Added missing `.token` selector ([#2161](https://github.com/PrismJS/prism/issues/2161)) [`86780457`](https://github.com/PrismJS/prism/commit/86780457)\n\n### Other\n\n- Added a check for redundant dependency declarations ([#2142](https://github.com/PrismJS/prism/issues/2142)) [`a06aca06`](https://github.com/PrismJS/prism/commit/a06aca06)\n- Added a check for examples ([#2128](https://github.com/PrismJS/prism/issues/2128)) [`0b539136`](https://github.com/PrismJS/prism/commit/0b539136)\n- Added silent option to `loadLanguages` ([#2147](https://github.com/PrismJS/prism/issues/2147)) [`191b4116`](https://github.com/PrismJS/prism/commit/191b4116)\n- **Infrastructure**\n    - Dependencies: Improved `getLoader` ([#2151](https://github.com/PrismJS/prism/issues/2151)) [`199bdcae`](https://github.com/PrismJS/prism/commit/199bdcae)\n    - Updated gulp to v4.0.2 ([#2178](https://github.com/PrismJS/prism/issues/2178)) [`e5678a00`](https://github.com/PrismJS/prism/commit/e5678a00)\n- **Website**\n    - Custom Class: Fixed examples ([#2160](https://github.com/PrismJS/prism/issues/2160)) [`0c2fe405`](https://github.com/PrismJS/prism/commit/0c2fe405)\n    - Added documentation for new dependency API ([#2141](https://github.com/PrismJS/prism/issues/2141)) [`59068d67`](https://github.com/PrismJS/prism/commit/59068d67)\n\n## 1.18.0 (2020-01-04)\n\n### New components\n\n- **ANTLR4** ([#2063](https://github.com/PrismJS/prism/issues/2063)) [`aaaa29a8`](https://github.com/PrismJS/prism/commit/aaaa29a8)\n- **AQL** ([#2025](https://github.com/PrismJS/prism/issues/2025)) [`3fdb7d55`](https://github.com/PrismJS/prism/commit/3fdb7d55)\n- **BBcode** ([#2095](https://github.com/PrismJS/prism/issues/2095)) [`aaf13aa6`](https://github.com/PrismJS/prism/commit/aaf13aa6)\n- **BrightScript** ([#2096](https://github.com/PrismJS/prism/issues/2096)) [`631f1e34`](https://github.com/PrismJS/prism/commit/631f1e34)\n- **Embedded Lua templating** ([#2050](https://github.com/PrismJS/prism/issues/2050)) [`0b771c90`](https://github.com/PrismJS/prism/commit/0b771c90)\n- **Firestore security rules** ([#2010](https://github.com/PrismJS/prism/issues/2010)) [`9f722586`](https://github.com/PrismJS/prism/commit/9f722586)\n- **FreeMarker Template Language** ([#2080](https://github.com/PrismJS/prism/issues/2080)) [`2f3da7e8`](https://github.com/PrismJS/prism/commit/2f3da7e8)\n- **GDScript** ([#2006](https://github.com/PrismJS/prism/issues/2006)) [`e2b99f40`](https://github.com/PrismJS/prism/commit/e2b99f40)\n- **MoonScript** ([#2100](https://github.com/PrismJS/prism/issues/2100)) [`f31946b3`](https://github.com/PrismJS/prism/commit/f31946b3)\n- **Robot Framework** (only the plain text format) ([#2034](https://github.com/PrismJS/prism/issues/2034)) [`f7eaa618`](https://github.com/PrismJS/prism/commit/f7eaa618)\n- **Solidity (Ethereum)** ([#2031](https://github.com/PrismJS/prism/issues/2031)) [`cc2cf3f7`](https://github.com/PrismJS/prism/commit/cc2cf3f7)\n- **SPARQL** ([#2033](https://github.com/PrismJS/prism/issues/2033)) [`c42f877d`](https://github.com/PrismJS/prism/commit/c42f877d)\n- **SQF: Status Quo Function (Arma 3)** ([#2079](https://github.com/PrismJS/prism/issues/2079)) [`cfac94ec`](https://github.com/PrismJS/prism/commit/cfac94ec)\n- **Turtle** & **TriG** ([#2012](https://github.com/PrismJS/prism/issues/2012)) [`508d57ac`](https://github.com/PrismJS/prism/commit/508d57ac)\n- **Zig** ([#2019](https://github.com/PrismJS/prism/issues/2019)) [`a7cf56b7`](https://github.com/PrismJS/prism/commit/a7cf56b7)\n\n### Updated components\n\n- Minor improvements for C-like and Clojure ([#2064](https://github.com/PrismJS/prism/issues/2064)) [`7db0cab3`](https://github.com/PrismJS/prism/commit/7db0cab3)\n- Inlined some unnecessary rest properties ([#2082](https://github.com/PrismJS/prism/issues/2082)) [`ad3fa443`](https://github.com/PrismJS/prism/commit/ad3fa443)\n- **AQL**\n    - Disallow unclosed multiline comments again ([#2089](https://github.com/PrismJS/prism/issues/2089)) [`717ace02`](https://github.com/PrismJS/prism/commit/717ace02)\n    - Allow unclosed multi-line comments ([#2058](https://github.com/PrismJS/prism/issues/2058)) [`f3c6ba59`](https://github.com/PrismJS/prism/commit/f3c6ba59)\n    - More pseudo keywords ([#2055](https://github.com/PrismJS/prism/issues/2055)) [`899574eb`](https://github.com/PrismJS/prism/commit/899574eb)\n    - Added missing keyword + minor improvements ([#2047](https://github.com/PrismJS/prism/issues/2047)) [`32a4c422`](https://github.com/PrismJS/prism/commit/32a4c422)\n- **Clojure**\n    - Added multiline strings (lisp style) ([#2061](https://github.com/PrismJS/prism/issues/2061)) [`8ea685b8`](https://github.com/PrismJS/prism/commit/8ea685b8)\n- **CSS Extras**\n    - CSS Extras & PHP: Fixed too greedy number token ([#2009](https://github.com/PrismJS/prism/issues/2009)) [`ebe363f4`](https://github.com/PrismJS/prism/commit/ebe363f4)\n- **D**\n    - Fixed strings ([#2029](https://github.com/PrismJS/prism/issues/2029)) [`010a0157`](https://github.com/PrismJS/prism/commit/010a0157)\n- **Groovy**\n    - Minor improvements ([#2036](https://github.com/PrismJS/prism/issues/2036)) [`fb618331`](https://github.com/PrismJS/prism/commit/fb618331)\n- **Java**\n    - Added missing `::` operator ([#2101](https://github.com/PrismJS/prism/issues/2101)) [`ee7fdbee`](https://github.com/PrismJS/prism/commit/ee7fdbee)\n    - Added support for new Java 13 syntax ([#2060](https://github.com/PrismJS/prism/issues/2060)) [`a7b95dd3`](https://github.com/PrismJS/prism/commit/a7b95dd3)\n- **JavaScript**\n    - Added Optional Chaining and Nullish Coalescing ([#2084](https://github.com/PrismJS/prism/issues/2084)) [`fdb7de0d`](https://github.com/PrismJS/prism/commit/fdb7de0d)\n    - Tokenize `:` as an operator ([#2073](https://github.com/PrismJS/prism/issues/2073)) [`0e5c48d1`](https://github.com/PrismJS/prism/commit/0e5c48d1)\n- **Less**\n    - Fixed exponential backtracking ([#2016](https://github.com/PrismJS/prism/issues/2016)) [`d03d19b4`](https://github.com/PrismJS/prism/commit/d03d19b4)\n- **Markup**\n    - Improved doctype pattern ([#2094](https://github.com/PrismJS/prism/issues/2094)) [`99994c58`](https://github.com/PrismJS/prism/commit/99994c58)\n- **Python**\n    - Fixed decorators ([#2018](https://github.com/PrismJS/prism/issues/2018)) [`5b8a16d9`](https://github.com/PrismJS/prism/commit/5b8a16d9)\n- **Robot Framework**\n    - Rename \"robot-framework\" to \"robotframework\" ([#2113](https://github.com/PrismJS/prism/issues/2113)) [`baa78774`](https://github.com/PrismJS/prism/commit/baa78774)\n- **Ruby**\n    - Made `true` and `false` booleans ([#2098](https://github.com/PrismJS/prism/issues/2098)) [`68d1c472`](https://github.com/PrismJS/prism/commit/68d1c472)\n    - Added missing keywords ([#2097](https://github.com/PrismJS/prism/issues/2097)) [`f460eafc`](https://github.com/PrismJS/prism/commit/f460eafc)\n- **SAS**\n    - Added support for embedded Groovy and Lua code ([#2091](https://github.com/PrismJS/prism/issues/2091)) [`3640b3f2`](https://github.com/PrismJS/prism/commit/3640b3f2)\n    - Minor improvements ([#2085](https://github.com/PrismJS/prism/issues/2085)) [`07020c7a`](https://github.com/PrismJS/prism/commit/07020c7a)\n    - Fixed `proc-args` token by removing backreferences from string pattern ([#2013](https://github.com/PrismJS/prism/issues/2013)) [`af5a36ae`](https://github.com/PrismJS/prism/commit/af5a36ae)\n    - Major improvements ([#1981](https://github.com/PrismJS/prism/issues/1981)) [`076f6155`](https://github.com/PrismJS/prism/commit/076f6155)\n- **Smalltalk**\n    - Fixed single quote character literal ([#2041](https://github.com/PrismJS/prism/issues/2041)) [`1aabcd17`](https://github.com/PrismJS/prism/commit/1aabcd17)\n- **Turtle**\n    - Minor improvements ([#2038](https://github.com/PrismJS/prism/issues/2038)) [`8ccd258b`](https://github.com/PrismJS/prism/commit/8ccd258b)\n- **TypeScript**\n    - Added missing keyword `undefined` ([#2088](https://github.com/PrismJS/prism/issues/2088)) [`c8b48b9f`](https://github.com/PrismJS/prism/commit/c8b48b9f)\n\n### Updated plugins\n\n- New Match Braces plugin ([#1944](https://github.com/PrismJS/prism/issues/1944)) [`365faade`](https://github.com/PrismJS/prism/commit/365faade)\n- New Inline color plugin ([#2007](https://github.com/PrismJS/prism/issues/2007)) [`8403e453`](https://github.com/PrismJS/prism/commit/8403e453)\n- New Filter highlightAll plugin ([#2074](https://github.com/PrismJS/prism/issues/2074)) [`a7f70090`](https://github.com/PrismJS/prism/commit/a7f70090)\n- **Custom Class**\n    - New class adder feature ([#2075](https://github.com/PrismJS/prism/issues/2075)) [`dab7998e`](https://github.com/PrismJS/prism/commit/dab7998e)\n- **File Highlight**\n    - Made the download button its own plugin ([#1840](https://github.com/PrismJS/prism/issues/1840)) [`c6c62a69`](https://github.com/PrismJS/prism/commit/c6c62a69)\n\n### Other\n\n- Issue template improvements ([#2069](https://github.com/PrismJS/prism/issues/2069)) [`53f07b1b`](https://github.com/PrismJS/prism/commit/53f07b1b)\n- Readme: Links now use HTTPS if available ([#2045](https://github.com/PrismJS/prism/issues/2045)) [`6cd0738a`](https://github.com/PrismJS/prism/commit/6cd0738a)\n- **Core**\n    - Fixed null reference ([#2106](https://github.com/PrismJS/prism/issues/2106)) [`0fd062d5`](https://github.com/PrismJS/prism/commit/0fd062d5)\n    - Fixed race condition caused by deferring the script ([#2103](https://github.com/PrismJS/prism/issues/2103)) [`a3785ec9`](https://github.com/PrismJS/prism/commit/a3785ec9)\n    - Minor improvements ([#1973](https://github.com/PrismJS/prism/issues/1973)) [`2d858e0a`](https://github.com/PrismJS/prism/commit/2d858e0a)\n    - Fixed greedy partial lookbehinds not working ([#2030](https://github.com/PrismJS/prism/issues/2030)) [`174ed103`](https://github.com/PrismJS/prism/commit/174ed103)\n    - Fixed greedy targeting bug ([#1932](https://github.com/PrismJS/prism/issues/1932)) [`e864d518`](https://github.com/PrismJS/prism/commit/e864d518)\n    - Doubly check the `manual` flag ([#1957](https://github.com/PrismJS/prism/issues/1957)) [`d49f0f26`](https://github.com/PrismJS/prism/commit/d49f0f26)\n    - IE11 workaround for `currentScript` ([#2104](https://github.com/PrismJS/prism/issues/2104)) [`2108c60f`](https://github.com/PrismJS/prism/commit/2108c60f)\n- **Infrastructure**\n    - gulp: Fixed changes task [`2f495905`](https://github.com/PrismJS/prism/commit/2f495905)\n    - npm: Added `.github` folder to npm ignore ([#2052](https://github.com/PrismJS/prism/issues/2052)) [`1af89e06`](https://github.com/PrismJS/prism/commit/1af89e06)\n    - npm: Updated dependencies to fix 122 vulnerabilities ([#1997](https://github.com/PrismJS/prism/issues/1997)) [`3af5d744`](https://github.com/PrismJS/prism/commit/3af5d744)\n    - Tests: New test for unused capturing groups ([#1996](https://github.com/PrismJS/prism/issues/1996)) [`c187e229`](https://github.com/PrismJS/prism/commit/c187e229)\n    - Tests: Simplified error message format ([#2056](https://github.com/PrismJS/prism/issues/2056)) [`007c9af4`](https://github.com/PrismJS/prism/commit/007c9af4)\n    - Tests: New test for nice names ([#1911](https://github.com/PrismJS/prism/issues/1911)) [`3fda5c95`](https://github.com/PrismJS/prism/commit/3fda5c95)\n    - Standardized dependency logic implementation ([#1998](https://github.com/PrismJS/prism/issues/1998)) [`7a4a0c7c`](https://github.com/PrismJS/prism/commit/7a4a0c7c)\n- **Website**\n    - Added @mAAdhaTTah and @RunDevelopment to credits and footer [`5d07aa7c`](https://github.com/PrismJS/prism/commit/5d07aa7c)\n    - Added plugin descriptions to plugin list ([#2076](https://github.com/PrismJS/prism/issues/2076)) [`cdfa60ac`](https://github.com/PrismJS/prism/commit/cdfa60ac)\n    - Use HTTPS link to alistapart.com ([#2044](https://github.com/PrismJS/prism/issues/2044)) [`8bcc1b85`](https://github.com/PrismJS/prism/commit/8bcc1b85)\n    - Fixed the Toolbar plugin's overflow issue ([#1966](https://github.com/PrismJS/prism/issues/1966)) [`56a8711c`](https://github.com/PrismJS/prism/commit/56a8711c)\n    - FAQ update ([#1977](https://github.com/PrismJS/prism/issues/1977)) [`8a572af5`](https://github.com/PrismJS/prism/commit/8a572af5)\n    - Use modern JavaScript in the NodeJS usage section ([#1942](https://github.com/PrismJS/prism/issues/1942)) [`5c68a556`](https://github.com/PrismJS/prism/commit/5c68a556)\n    - Improved test page performance for Chromium ([#2020](https://github.com/PrismJS/prism/issues/2020)) [`3509f3e5`](https://github.com/PrismJS/prism/commit/3509f3e5)\n    - Fixed alias example in extending page ([#2011](https://github.com/PrismJS/prism/issues/2011)) [`7cb65eec`](https://github.com/PrismJS/prism/commit/7cb65eec)\n    - Robot Framework: Renamed example file ([#2126](https://github.com/PrismJS/prism/issues/2126)) [`9908ca69`](https://github.com/PrismJS/prism/commit/9908ca69)\n\n## 1.17.1 (2019-07-21)\n\n### Other\n\n- **Infrastructure**\n    - Add .DS_Store to npmignore [`c2229ec2`](https://github.com/PrismJS/prism/commit/c2229ec2)\n\n## 1.17.0 (2019-07-21)\n\n### New components\n\n- **DNS zone file** ([#1961](https://github.com/PrismJS/prism/issues/1961)) [`bb84f98c`](https://github.com/PrismJS/prism/commit/bb84f98c)\n- **JQ** ([#1896](https://github.com/PrismJS/prism/issues/1896)) [`73d964be`](https://github.com/PrismJS/prism/commit/73d964be)\n- **JS Templates**: Syntax highlighting inside tagged template literals ([#1931](https://github.com/PrismJS/prism/issues/1931)) [`c8844286`](https://github.com/PrismJS/prism/commit/c8844286)\n- **LilyPond** ([#1967](https://github.com/PrismJS/prism/issues/1967)) [`5d992fc5`](https://github.com/PrismJS/prism/commit/5d992fc5)\n- **PascaLIGO** ([#1947](https://github.com/PrismJS/prism/issues/1947)) [`858201c7`](https://github.com/PrismJS/prism/commit/858201c7)\n- **PC-Axis** ([#1940](https://github.com/PrismJS/prism/issues/1940)) [`473f7fbd`](https://github.com/PrismJS/prism/commit/473f7fbd)\n- **Shell session** ([#1892](https://github.com/PrismJS/prism/issues/1892)) [`96044979`](https://github.com/PrismJS/prism/commit/96044979)\n- **Splunk SPL** ([#1962](https://github.com/PrismJS/prism/issues/1962)) [`c93c066b`](https://github.com/PrismJS/prism/commit/c93c066b)\n\n### New plugins\n\n- **Diff Highlight**: Syntax highlighting inside diff blocks ([#1889](https://github.com/PrismJS/prism/issues/1889)) [`e7702ae1`](https://github.com/PrismJS/prism/commit/e7702ae1)\n\n### Updated components\n\n- **Bash**\n    - Major improvements ([#1443](https://github.com/PrismJS/prism/issues/1443)) [`363281b3`](https://github.com/PrismJS/prism/commit/363281b3)\n- **C#**\n    - Added `cs` alias ([#1899](https://github.com/PrismJS/prism/issues/1899)) [`a8164559`](https://github.com/PrismJS/prism/commit/a8164559)\n- **C++**\n    - Fixed number pattern ([#1887](https://github.com/PrismJS/prism/issues/1887)) [`3de29e72`](https://github.com/PrismJS/prism/commit/3de29e72)\n- **CSS**\n    - Extended `url` inside ([#1874](https://github.com/PrismJS/prism/issues/1874)) [`f0a10669`](https://github.com/PrismJS/prism/commit/f0a10669)\n    - Removed unnecessary flag and modifier ([#1875](https://github.com/PrismJS/prism/issues/1875)) [`74050c68`](https://github.com/PrismJS/prism/commit/74050c68)\n- **CSS Extras**\n    - Added `even` & `odd` keywords to `n-th` pattern ([#1872](https://github.com/PrismJS/prism/issues/1872)) [`5e5a3e00`](https://github.com/PrismJS/prism/commit/5e5a3e00)\n- **F#**\n    - Improved character literals ([#1956](https://github.com/PrismJS/prism/issues/1956)) [`d58d2aeb`](https://github.com/PrismJS/prism/commit/d58d2aeb)\n- **JavaScript**\n    - Fixed escaped template interpolation ([#1931](https://github.com/PrismJS/prism/issues/1931)) [`c8844286`](https://github.com/PrismJS/prism/commit/c8844286)\n    - Added support for private fields ([#1950](https://github.com/PrismJS/prism/issues/1950)) [`7bd08327`](https://github.com/PrismJS/prism/commit/7bd08327)\n    - Added support for numeric separators ([#1895](https://github.com/PrismJS/prism/issues/1895)) [`6068bf18`](https://github.com/PrismJS/prism/commit/6068bf18)\n    - Increased bracket count of interpolation expressions in template strings ([#1845](https://github.com/PrismJS/prism/issues/1845)) [`c13d6e7d`](https://github.com/PrismJS/prism/commit/c13d6e7d)\n    - Added support for the `s` regex flag ([#1846](https://github.com/PrismJS/prism/issues/1846)) [`9e164935`](https://github.com/PrismJS/prism/commit/9e164935)\n    - Formatting: Added missing semicolon ([#1856](https://github.com/PrismJS/prism/issues/1856)) [`e2683959`](https://github.com/PrismJS/prism/commit/e2683959)\n- **JSON**\n    - Kinda fixed comment issue ([#1853](https://github.com/PrismJS/prism/issues/1853)) [`cbe05ec3`](https://github.com/PrismJS/prism/commit/cbe05ec3)\n- **Julia**\n    - Added `struct` keyword ([#1941](https://github.com/PrismJS/prism/issues/1941)) [`feb1b6f5`](https://github.com/PrismJS/prism/commit/feb1b6f5)\n    - Highlight `Inf` and `NaN` as constants ([#1921](https://github.com/PrismJS/prism/issues/1921)) [`2141129f`](https://github.com/PrismJS/prism/commit/2141129f)\n    - Added `in` keyword ([#1918](https://github.com/PrismJS/prism/issues/1918)) [`feb3187f`](https://github.com/PrismJS/prism/commit/feb3187f)\n- **LaTeX**\n    - Added TeX and ConTeXt alias ([#1915](https://github.com/PrismJS/prism/issues/1915)) [`5ad58a75`](https://github.com/PrismJS/prism/commit/5ad58a75)\n    - Added support for $$ equations [`6f53f749`](https://github.com/PrismJS/prism/commit/6f53f749)\n- **Markdown**\n    - Markdown: Added support for auto-loading code block languages ([#1898](https://github.com/PrismJS/prism/issues/1898)) [`05823e88`](https://github.com/PrismJS/prism/commit/05823e88)\n    - Improved URLs ([#1955](https://github.com/PrismJS/prism/issues/1955)) [`b9ec6fd8`](https://github.com/PrismJS/prism/commit/b9ec6fd8)\n    - Added support for nested bold and italic expressions ([#1897](https://github.com/PrismJS/prism/issues/1897)) [`11903721`](https://github.com/PrismJS/prism/commit/11903721)\n    - Added support for tables ([#1848](https://github.com/PrismJS/prism/issues/1848)) [`cedb8e84`](https://github.com/PrismJS/prism/commit/cedb8e84)\n- **Perl**\n    - Added `return` keyword ([#1943](https://github.com/PrismJS/prism/issues/1943)) [`2f39de97`](https://github.com/PrismJS/prism/commit/2f39de97)\n- **Protocol Buffers**\n    - Full support for PB2 and PB3 syntax + numerous other improvements ([#1948](https://github.com/PrismJS/prism/issues/1948)) [`de10bd1d`](https://github.com/PrismJS/prism/commit/de10bd1d)\n- **reST (reStructuredText)**\n    - Fixed exponentially backtracking pattern ([#1986](https://github.com/PrismJS/prism/issues/1986)) [`8b5d67a3`](https://github.com/PrismJS/prism/commit/8b5d67a3)\n- **Rust**\n    - Added `async` and `await` keywords. ([#1882](https://github.com/PrismJS/prism/issues/1882)) [`4faa3314`](https://github.com/PrismJS/prism/commit/4faa3314)\n    - Improved punctuation and operators ([#1839](https://github.com/PrismJS/prism/issues/1839)) [`a42b1557`](https://github.com/PrismJS/prism/commit/a42b1557)\n- **Sass (Scss)**\n    - Fixed exponential url pattern ([#1938](https://github.com/PrismJS/prism/issues/1938)) [`4b6b6e8b`](https://github.com/PrismJS/prism/commit/4b6b6e8b)\n- **Scheme**\n    - Added support for rational number literals ([#1964](https://github.com/PrismJS/prism/issues/1964)) [`e8811d22`](https://github.com/PrismJS/prism/commit/e8811d22)\n- **TOML**\n    - Minor improvements ([#1917](https://github.com/PrismJS/prism/issues/1917)) [`3e181241`](https://github.com/PrismJS/prism/commit/3e181241)\n- **Visual Basic**\n    - Added support for interpolation strings ([#1971](https://github.com/PrismJS/prism/issues/1971)) [`4a2c90c1`](https://github.com/PrismJS/prism/commit/4a2c90c1)\n\n### Updated plugins\n\n- **Autolinker**\n    - Improved component path guessing ([#1928](https://github.com/PrismJS/prism/issues/1928)) [`452d5c7d`](https://github.com/PrismJS/prism/commit/452d5c7d)\n    - Improved URL regex ([#1842](https://github.com/PrismJS/prism/issues/1842)) [`eb28b62b`](https://github.com/PrismJS/prism/commit/eb28b62b)\n- **Autoloader**\n    - Fixed and improved callbacks ([#1935](https://github.com/PrismJS/prism/issues/1935)) [`b19f512f`](https://github.com/PrismJS/prism/commit/b19f512f)\n- **Command Line**\n    - Fix for uncaught errors for empty 'commandLine' object. ([#1862](https://github.com/PrismJS/prism/issues/1862)) [`c24831b5`](https://github.com/PrismJS/prism/commit/c24831b5)\n- **Copy to Clipboard Button**\n    - Switch anchor to button ([#1926](https://github.com/PrismJS/prism/issues/1926)) [`79880197`](https://github.com/PrismJS/prism/commit/79880197)\n- **Custom Class**\n    - Added mapper functions for language specific transformations ([#1873](https://github.com/PrismJS/prism/issues/1873)) [`acceb3b5`](https://github.com/PrismJS/prism/commit/acceb3b5)\n- **Line Highlight**\n    - Batching DOM read/writes to avoid reflows ([#1865](https://github.com/PrismJS/prism/issues/1865)) [`632ce00c`](https://github.com/PrismJS/prism/commit/632ce00c)\n- **Toolbar**\n    - Added `className` option for toolbar items ([#1951](https://github.com/PrismJS/prism/issues/1951)) [`5ab28bbe`](https://github.com/PrismJS/prism/commit/5ab28bbe)\n    - Set opacity to 1 when focus is within ([#1927](https://github.com/PrismJS/prism/issues/1927)) [`0b1662dd`](https://github.com/PrismJS/prism/commit/0b1662dd)\n\n### Updated themes\n\n- **Funky**\n    - Fixed typo ([#1960](https://github.com/PrismJS/prism/issues/1960)) [`7d056591`](https://github.com/PrismJS/prism/commit/7d056591)\n\n### Other\n\n- README: Added npm downloads badge ([#1934](https://github.com/PrismJS/prism/issues/1934)) [`d673d701`](https://github.com/PrismJS/prism/commit/d673d701)\n- README: Minor changes ([#1857](https://github.com/PrismJS/prism/issues/1857)) [`77e403cb`](https://github.com/PrismJS/prism/commit/77e403cb)\n- Clearer description for the highlighting bug report template ([#1850](https://github.com/PrismJS/prism/issues/1850)) [`2f9c9261`](https://github.com/PrismJS/prism/commit/2f9c9261)\n- More language examples ([#1917](https://github.com/PrismJS/prism/issues/1917)) [`3e181241`](https://github.com/PrismJS/prism/commit/3e181241)\n- **Core**\n    - Removed `env.elements` from `before-highlightall` hook ([#1968](https://github.com/PrismJS/prism/issues/1968)) [`9d9e2ca4`](https://github.com/PrismJS/prism/commit/9d9e2ca4)\n    - Made `language-none` the default language ([#1858](https://github.com/PrismJS/prism/issues/1858)) [`fd691c52`](https://github.com/PrismJS/prism/commit/fd691c52)\n    - Removed `parent` from the `wrap` hook's environment ([#1837](https://github.com/PrismJS/prism/issues/1837)) [`65a4e894`](https://github.com/PrismJS/prism/commit/65a4e894)\n- **Infrastructure**\n    - gulp: Split `gulpfile.js` and expanded `changes` task ([#1835](https://github.com/PrismJS/prism/issues/1835)) [`033c5ad8`](https://github.com/PrismJS/prism/commit/033c5ad8)\n    - gulp: JSON formatting for partly generated files ([#1933](https://github.com/PrismJS/prism/issues/1933)) [`d4373f3a`](https://github.com/PrismJS/prism/commit/d4373f3a)\n    - gulp: Use `async` functions & drop testing on Node v6 ([#1783](https://github.com/PrismJS/prism/issues/1783)) [`0dd44d53`](https://github.com/PrismJS/prism/commit/0dd44d53)\n    - Tests: `lookbehind` test for patterns ([#1890](https://github.com/PrismJS/prism/issues/1890)) [`3ba786cd`](https://github.com/PrismJS/prism/commit/3ba786cd)\n    - Tests: Added test for empty regexes ([#1847](https://github.com/PrismJS/prism/issues/1847)) [`c1e6a7fd`](https://github.com/PrismJS/prism/commit/c1e6a7fd)\n- **Website**\n    - Added tutorial for using PrismJS with React ([#1979](https://github.com/PrismJS/prism/issues/1979)) [`f1e16c7b`](https://github.com/PrismJS/prism/commit/f1e16c7b)\n    - Update footer's GitHub repository URL and capitalisation of \"GitHub\" ([#1983](https://github.com/PrismJS/prism/issues/1983)) [`bab744a6`](https://github.com/PrismJS/prism/commit/bab744a6)\n    - Added known failures page ([#1876](https://github.com/PrismJS/prism/issues/1876)) [`36a5fa0e`](https://github.com/PrismJS/prism/commit/36a5fa0e)\n    - Added basic usage for CDNs ([#1924](https://github.com/PrismJS/prism/issues/1924)) [`922ec555`](https://github.com/PrismJS/prism/commit/922ec555)\n    - New tutorial for Drupal ([#1859](https://github.com/PrismJS/prism/issues/1859)) [`d2089d83`](https://github.com/PrismJS/prism/commit/d2089d83)\n    - Updated website page styles to not interfere with themes ([#1952](https://github.com/PrismJS/prism/issues/1952)) [`b6543853`](https://github.com/PrismJS/prism/commit/b6543853)\n    - Download page: Improved performance for Chromium-based browsers ([#1907](https://github.com/PrismJS/prism/issues/1907)) [`11f18e36`](https://github.com/PrismJS/prism/commit/11f18e36)\n    - Download page: Fixed Edge's word wrap ([#1920](https://github.com/PrismJS/prism/issues/1920)) [`5d191b92`](https://github.com/PrismJS/prism/commit/5d191b92)\n    - Examples page: Minor improvements ([#1919](https://github.com/PrismJS/prism/issues/1919)) [`a16d4a25`](https://github.com/PrismJS/prism/commit/a16d4a25)\n    - Extending page: Fixed typo + new alias section ([#1949](https://github.com/PrismJS/prism/issues/1949)) [`24c8e717`](https://github.com/PrismJS/prism/commit/24c8e717)\n    - Extending page: Added \"Creating a new language definition\" section ([#1925](https://github.com/PrismJS/prism/issues/1925)) [`ddf81233`](https://github.com/PrismJS/prism/commit/ddf81233)\n    - Test page: Use `prism-core.js` instead of `prism.js` ([#1908](https://github.com/PrismJS/prism/issues/1908)) [`0853e694`](https://github.com/PrismJS/prism/commit/0853e694)\n    - Copy to clipboard: Fixed typo ([#1869](https://github.com/PrismJS/prism/issues/1869)) [`59d4323f`](https://github.com/PrismJS/prism/commit/59d4323f)\n    - JSONP Highlight: Fixed examples ([#1877](https://github.com/PrismJS/prism/issues/1877)) [`f8ae465d`](https://github.com/PrismJS/prism/commit/f8ae465d)\n    - Line numbers: Fixed typo on webpage ([#1838](https://github.com/PrismJS/prism/issues/1838)) [`0f16eb87`](https://github.com/PrismJS/prism/commit/0f16eb87)\n\n## 1.16.0 (2019-03-24)\n\n### New components\n\n- **ANBF** ([#1753](https://github.com/PrismJS/prism/issues/1753)) [`6d98f0e7`](https://github.com/PrismJS/prism/commit/6d98f0e7)\n- **BNF** & **RBNF** ([#1754](https://github.com/PrismJS/prism/issues/1754)) [`1df96c55`](https://github.com/PrismJS/prism/commit/1df96c55)\n- **CIL** ([#1593](https://github.com/PrismJS/prism/issues/1593)) [`38def334`](https://github.com/PrismJS/prism/commit/38def334)\n- **CMake** ([#1820](https://github.com/PrismJS/prism/issues/1820)) [`30779976`](https://github.com/PrismJS/prism/commit/30779976)\n- **Doc comment** ([#1541](https://github.com/PrismJS/prism/issues/1541)) [`493d19ef`](https://github.com/PrismJS/prism/commit/493d19ef)\n- **EBNF** ([#1756](https://github.com/PrismJS/prism/issues/1756)) [`13e1c97d`](https://github.com/PrismJS/prism/commit/13e1c97d)\n- **EJS** ([#1769](https://github.com/PrismJS/prism/issues/1769)) [`c37c90df`](https://github.com/PrismJS/prism/commit/c37c90df)\n- **G-code** ([#1572](https://github.com/PrismJS/prism/issues/1572)) [`2288c25e`](https://github.com/PrismJS/prism/commit/2288c25e)\n- **GameMaker Language** ([#1551](https://github.com/PrismJS/prism/issues/1551)) [`e529edd8`](https://github.com/PrismJS/prism/commit/e529edd8)\n- **HCL** ([#1594](https://github.com/PrismJS/prism/issues/1594)) [`c939df8e`](https://github.com/PrismJS/prism/commit/c939df8e)\n- **Java stack trace** ([#1520](https://github.com/PrismJS/prism/issues/1520)) [`4a8219a4`](https://github.com/PrismJS/prism/commit/4a8219a4)\n- **JavaScript Extras** ([#1743](https://github.com/PrismJS/prism/issues/1743)) [`bb628606`](https://github.com/PrismJS/prism/commit/bb628606)\n- **JSON5** ([#1744](https://github.com/PrismJS/prism/issues/1744)) [`64dc049d`](https://github.com/PrismJS/prism/commit/64dc049d)\n- **N1QL** ([#1620](https://github.com/PrismJS/prism/issues/1620)) [`7def8f5c`](https://github.com/PrismJS/prism/commit/7def8f5c)\n- **Nand To Tetris HDL** ([#1710](https://github.com/PrismJS/prism/issues/1710)) [`b94b56c1`](https://github.com/PrismJS/prism/commit/b94b56c1)\n- **Regex** ([#1682](https://github.com/PrismJS/prism/issues/1682)) [`571704cb`](https://github.com/PrismJS/prism/commit/571704cb)\n- **T4** ([#1699](https://github.com/PrismJS/prism/issues/1699)) [`16f2ad06`](https://github.com/PrismJS/prism/commit/16f2ad06)\n- **TOML** ([#1488](https://github.com/PrismJS/prism/issues/1488)) [`5b6ad70d`](https://github.com/PrismJS/prism/commit/5b6ad70d)\n- **Vala** ([#1658](https://github.com/PrismJS/prism/issues/1658)) [`b48c012c`](https://github.com/PrismJS/prism/commit/b48c012c)\n\n### Updated components\n\n- Fixed dependencies of Pug and Pure ([#1759](https://github.com/PrismJS/prism/issues/1759)) [`c9a32674`](https://github.com/PrismJS/prism/commit/c9a32674)\n- Add file extensions support for major languages ([#1478](https://github.com/PrismJS/prism/issues/1478)) [`0c8f6504`](https://github.com/PrismJS/prism/commit/0c8f6504)\n- Fixed patterns which can match the empty string ([#1775](https://github.com/PrismJS/prism/issues/1775)) [`86dd3e42`](https://github.com/PrismJS/prism/commit/86dd3e42)\n- More variables for better code compression ([#1489](https://github.com/PrismJS/prism/issues/1489)) [`bc53e093`](https://github.com/PrismJS/prism/commit/bc53e093)\n- Added missing aliases ([#1830](https://github.com/PrismJS/prism/issues/1830)) [`8d28c74c`](https://github.com/PrismJS/prism/commit/8d28c74c)\n- Replaced all occurrences of `new RegExp` with `RegExp` ([#1493](https://github.com/PrismJS/prism/issues/1493)) [`44fed4d3`](https://github.com/PrismJS/prism/commit/44fed4d3)\n- Added missing aliases to components.json ([#1503](https://github.com/PrismJS/prism/issues/1503)) [`2fb66e04`](https://github.com/PrismJS/prism/commit/2fb66e04)\n- **Apacheconf**\n    - Apache config: Minor improvements + new keyword ([#1823](https://github.com/PrismJS/prism/issues/1823)) [`a91be7b2`](https://github.com/PrismJS/prism/commit/a91be7b2)\n- **AsciiDoc**\n    - Added `adoc` alias for AsciiDoc ([#1685](https://github.com/PrismJS/prism/issues/1685)) [`88434f7a`](https://github.com/PrismJS/prism/commit/88434f7a)\n- **Bash**\n    - Add additional commands to bash ([#1577](https://github.com/PrismJS/prism/issues/1577)) [`a2230c38`](https://github.com/PrismJS/prism/commit/a2230c38)\n    - Added `yarn add` to bash functions ([#1731](https://github.com/PrismJS/prism/issues/1731)) [`3a32cb75`](https://github.com/PrismJS/prism/commit/3a32cb75)\n    - Added `pnpm` function to Bash ([#1734](https://github.com/PrismJS/prism/issues/1734)) [`fccfb98d`](https://github.com/PrismJS/prism/commit/fccfb98d)\n- **Batch**\n    - Remove batch's shell alias ([#1543](https://github.com/PrismJS/prism/issues/1543)) [`7155e60f`](https://github.com/PrismJS/prism/commit/7155e60f)\n- **C**\n    - Improve C language ([#1697](https://github.com/PrismJS/prism/issues/1697)) [`7eccea5c`](https://github.com/PrismJS/prism/commit/7eccea5c)\n- **C-like**\n    - Simplify function pattern of C-like language ([#1552](https://github.com/PrismJS/prism/issues/1552)) [`b520e1b6`](https://github.com/PrismJS/prism/commit/b520e1b6)\n- **C/C++/Java**\n    - Operator fixes ([#1528](https://github.com/PrismJS/prism/issues/1528)) [`7af8f8be`](https://github.com/PrismJS/prism/commit/7af8f8be)\n- **C#**\n    - Improvements to C# operator and punctuation ([#1532](https://github.com/PrismJS/prism/issues/1532)) [`3b1e0916`](https://github.com/PrismJS/prism/commit/3b1e0916)\n- **CSS**\n    - Fix tokenizing !important ([#1585](https://github.com/PrismJS/prism/issues/1585)) [`c1d6cb85`](https://github.com/PrismJS/prism/commit/c1d6cb85)\n    - Added the comma to the list of CSS punctuation [`7ea2ff28`](https://github.com/PrismJS/prism/commit/7ea2ff28)\n    - CSS: Comma punctuation ([#1632](https://github.com/PrismJS/prism/issues/1632)) [`1b812386`](https://github.com/PrismJS/prism/commit/1b812386)\n    - Reuse CSS selector pattern in CSS Extras ([#1637](https://github.com/PrismJS/prism/issues/1637)) [`e2f2fd19`](https://github.com/PrismJS/prism/commit/e2f2fd19)\n    - Fixed CSS extra variable ([#1649](https://github.com/PrismJS/prism/issues/1649)) [`9de47d3a`](https://github.com/PrismJS/prism/commit/9de47d3a)\n    - Identify CSS units and variables ([#1450](https://github.com/PrismJS/prism/issues/1450)) [`5fcee966`](https://github.com/PrismJS/prism/commit/5fcee966)\n    - Allow multiline CSS at-rules ([#1676](https://github.com/PrismJS/prism/issues/1676)) [`4f6f3c7d`](https://github.com/PrismJS/prism/commit/4f6f3c7d)\n    - CSS: Highlight attribute selector ([#1671](https://github.com/PrismJS/prism/issues/1671)) [`245b59d4`](https://github.com/PrismJS/prism/commit/245b59d4)\n    - CSS: Selectors can contain any string ([#1638](https://github.com/PrismJS/prism/issues/1638)) [`a2d445d0`](https://github.com/PrismJS/prism/commit/a2d445d0)\n    - CSS extras: Highlighting for pseudo class arguments ([#1650](https://github.com/PrismJS/prism/issues/1650)) [`70a40414`](https://github.com/PrismJS/prism/commit/70a40414)\n- **Django**\n    - Django/Jinja2 improvements ([#1800](https://github.com/PrismJS/prism/issues/1800)) [`f2467488`](https://github.com/PrismJS/prism/commit/f2467488)\n- **F#**\n    - Chars can only contain one character ([#1570](https://github.com/PrismJS/prism/issues/1570)) [`f96b083a`](https://github.com/PrismJS/prism/commit/f96b083a)\n    - Improve F# ([#1573](https://github.com/PrismJS/prism/issues/1573)) [`00bfc969`](https://github.com/PrismJS/prism/commit/00bfc969)\n- **GraphQL**\n    - Improved field highlighting for GraphQL ([#1711](https://github.com/PrismJS/prism/issues/1711)) [`44aeffb9`](https://github.com/PrismJS/prism/commit/44aeffb9)\n    - Added GraphQL improvements and tests ([#1788](https://github.com/PrismJS/prism/issues/1788)) [`b2298b12`](https://github.com/PrismJS/prism/commit/b2298b12)\n- **Haskell**\n    - Added `hs` alias for Haskell ([#1831](https://github.com/PrismJS/prism/issues/1831)) [`64baec3c`](https://github.com/PrismJS/prism/commit/64baec3c)\n- **HTTP**\n    - Improved HTTP content highlighting ([#1598](https://github.com/PrismJS/prism/issues/1598)) [`1b75da90`](https://github.com/PrismJS/prism/commit/1b75da90)\n- **Ini**\n    - Add support for # comments to INI language ([#1730](https://github.com/PrismJS/prism/issues/1730)) [`baf6bb0c`](https://github.com/PrismJS/prism/commit/baf6bb0c)\n- **Java**\n    - Add Java 10 support ([#1549](https://github.com/PrismJS/prism/issues/1549)) [`8c981a22`](https://github.com/PrismJS/prism/commit/8c981a22)\n    - Added module keywords to Java. ([#1655](https://github.com/PrismJS/prism/issues/1655)) [`6e250a5f`](https://github.com/PrismJS/prism/commit/6e250a5f)\n    - Improve Java ([#1474](https://github.com/PrismJS/prism/issues/1474)) [`81bd8f0b`](https://github.com/PrismJS/prism/commit/81bd8f0b)\n- **JavaScript**\n    - Fix regex for `catch` and `finally` ([#1527](https://github.com/PrismJS/prism/issues/1527)) [`ebd1b9a6`](https://github.com/PrismJS/prism/commit/ebd1b9a6)\n    - Highlighting of supposed classes and functions ([#1482](https://github.com/PrismJS/prism/issues/1482)) [`c40f6047`](https://github.com/PrismJS/prism/commit/c40f6047)\n    - Added support for JS BigInt literals ([#1542](https://github.com/PrismJS/prism/issues/1542)) [`2b62e57b`](https://github.com/PrismJS/prism/commit/2b62e57b)\n    - Fixed lowercase supposed class names ([#1544](https://github.com/PrismJS/prism/issues/1544)) [`a47c05ad`](https://github.com/PrismJS/prism/commit/a47c05ad)\n    - Fixes regex for JS examples ([#1591](https://github.com/PrismJS/prism/issues/1591)) [`b41fb8f1`](https://github.com/PrismJS/prism/commit/b41fb8f1)\n    - Improve regex detection in JS ([#1473](https://github.com/PrismJS/prism/issues/1473)) [`2a4758ab`](https://github.com/PrismJS/prism/commit/2a4758ab)\n    - Identify JavaScript function parameters ([#1446](https://github.com/PrismJS/prism/issues/1446)) [`0cc8c56a`](https://github.com/PrismJS/prism/commit/0cc8c56a)\n    - Improved JavaScript parameter recognization ([#1722](https://github.com/PrismJS/prism/issues/1722)) [`57a92035`](https://github.com/PrismJS/prism/commit/57a92035)\n    - Make `undefined` a keyword in JS ([#1740](https://github.com/PrismJS/prism/issues/1740)) [`d9fa29a8`](https://github.com/PrismJS/prism/commit/d9fa29a8)\n    - Fix `function-variable` in JS ([#1739](https://github.com/PrismJS/prism/issues/1739)) [`bfbea4d6`](https://github.com/PrismJS/prism/commit/bfbea4d6)\n    - Improved JS constant pattern ([#1737](https://github.com/PrismJS/prism/issues/1737)) [`7bcec584`](https://github.com/PrismJS/prism/commit/7bcec584)\n    - Improved JS function pattern ([#1736](https://github.com/PrismJS/prism/issues/1736)) [`8378ac83`](https://github.com/PrismJS/prism/commit/8378ac83)\n    - JS: Fixed variables named \"async\" ([#1738](https://github.com/PrismJS/prism/issues/1738)) [`3560c643`](https://github.com/PrismJS/prism/commit/3560c643)\n    - JS: Keyword fix ([#1808](https://github.com/PrismJS/prism/issues/1808)) [`f2d8e1c7`](https://github.com/PrismJS/prism/commit/f2d8e1c7)\n- **JSON** / **JSONP**\n    - Fix bugs in JSON language ([#1479](https://github.com/PrismJS/prism/issues/1479)) [`74fe81c6`](https://github.com/PrismJS/prism/commit/74fe81c6)\n    - Adds support for comments in JSON ([#1595](https://github.com/PrismJS/prism/issues/1595)) [`8720b3e6`](https://github.com/PrismJS/prism/commit/8720b3e6)\n    - Cleaned up JSON ([#1596](https://github.com/PrismJS/prism/issues/1596)) [`da474c77`](https://github.com/PrismJS/prism/commit/da474c77)\n    - Added `keyword` alias to JSON's `null` ([#1733](https://github.com/PrismJS/prism/issues/1733)) [`eee06649`](https://github.com/PrismJS/prism/commit/eee06649)\n    - Fix JSONP support ([#1745](https://github.com/PrismJS/prism/issues/1745)) [`b5041cf9`](https://github.com/PrismJS/prism/commit/b5041cf9)\n    - Fixed JSON/JSONP examples ([#1765](https://github.com/PrismJS/prism/issues/1765)) [`ae4842db`](https://github.com/PrismJS/prism/commit/ae4842db)\n- **JSX**\n    - React component tags are styled as classes in JSX ([#1519](https://github.com/PrismJS/prism/issues/1519)) [`3e1a9a3d`](https://github.com/PrismJS/prism/commit/3e1a9a3d)\n    - Support JSX/TSX class-name with dot ([#1725](https://github.com/PrismJS/prism/issues/1725)) [`4362e42c`](https://github.com/PrismJS/prism/commit/4362e42c)\n- **Less**\n    - Remove useless insertBefore in LESS ([#1629](https://github.com/PrismJS/prism/issues/1629)) [`86d31793`](https://github.com/PrismJS/prism/commit/86d31793)\n- **Lisp**\n    - Fix Lisp exponential string pattern ([#1763](https://github.com/PrismJS/prism/issues/1763)) [`5bd182c0`](https://github.com/PrismJS/prism/commit/5bd182c0))\n- **Markdown**\n    - Added strike support to markdown ([#1563](https://github.com/PrismJS/prism/issues/1563)) [`9d2fddc2`](https://github.com/PrismJS/prism/commit/9d2fddc2)\n    - Fixed Markdown headers ([#1557](https://github.com/PrismJS/prism/issues/1557)) [`c6584290`](https://github.com/PrismJS/prism/commit/c6584290)\n    - Add support for code blocks in Markdown ([#1562](https://github.com/PrismJS/prism/issues/1562)) [`b0717e70`](https://github.com/PrismJS/prism/commit/b0717e70)\n    - Markdown: The 'md' alias is now recognized by hooks ([#1771](https://github.com/PrismJS/prism/issues/1771)) [`8ca3d65b`](https://github.com/PrismJS/prism/commit/8ca3d65b)\n- **Markup**\n    - Decouple XML from Markup ([#1603](https://github.com/PrismJS/prism/issues/1603)) [`0030a4ef`](https://github.com/PrismJS/prism/commit/0030a4ef)\n    - Fix for markup attributes ([#1752](https://github.com/PrismJS/prism/issues/1752)) [`c3862a24`](https://github.com/PrismJS/prism/commit/c3862a24)\n    - Markup: Added support for CSS and JS inside of CDATAs ([#1660](https://github.com/PrismJS/prism/issues/1660)) [`57127701`](https://github.com/PrismJS/prism/commit/57127701)\n    - Markup `addInline` improvements ([#1798](https://github.com/PrismJS/prism/issues/1798)) [`af67c32e`](https://github.com/PrismJS/prism/commit/af67c32e)\n- **Markup Templating**\n    - Markup-templating improvements ([#1653](https://github.com/PrismJS/prism/issues/1653)) [`b62e282b`](https://github.com/PrismJS/prism/commit/b62e282b)\n- **nginx**\n    - Add new keywords to nginx ([#1587](https://github.com/PrismJS/prism/issues/1587)) [`0d73f7f5`](https://github.com/PrismJS/prism/commit/0d73f7f5)\n- **PHP**\n    - Update PHP keywords ([#1690](https://github.com/PrismJS/prism/issues/1690)) [`55fb0f8e`](https://github.com/PrismJS/prism/commit/55fb0f8e)\n    - Improve recognition of constants in PHP ([#1688](https://github.com/PrismJS/prism/issues/1688)) [`f1026b4b`](https://github.com/PrismJS/prism/commit/f1026b4b)\n    - Made false, true, and null constants in PHP ([#1694](https://github.com/PrismJS/prism/issues/1694)) [`439e3bd7`](https://github.com/PrismJS/prism/commit/439e3bd7)\n    - PHP: Fixed closing tag issue ([#1652](https://github.com/PrismJS/prism/issues/1652)) [`289ddd9b`](https://github.com/PrismJS/prism/commit/289ddd9b)\n- **Python**\n    - Operator keywords are now keywords ([#1617](https://github.com/PrismJS/prism/issues/1617)) [`1d1fb800`](https://github.com/PrismJS/prism/commit/1d1fb800)\n    - Add decorator support to Python ([#1639](https://github.com/PrismJS/prism/issues/1639)) [`2577b6e6`](https://github.com/PrismJS/prism/commit/2577b6e6)\n    - Improvements to Python F-strings and string prefixes ([#1642](https://github.com/PrismJS/prism/issues/1642)) [`a69c2b62`](https://github.com/PrismJS/prism/commit/a69c2b62)\n- **Reason**\n    - Added additional operators to Reason ([#1648](https://github.com/PrismJS/prism/issues/1648)) [`8b1bb469`](https://github.com/PrismJS/prism/commit/8b1bb469)\n- **Ruby**\n    - Consistent Ruby method highlighting ([#1523](https://github.com/PrismJS/prism/issues/1523)) [`72775919`](https://github.com/PrismJS/prism/commit/72775919)\n    - Ruby/ERB: Fixed block comments ([#1768](https://github.com/PrismJS/prism/issues/1768)) [`c805f859`](https://github.com/PrismJS/prism/commit/c805f859)\n- **Rust**\n    - Add missing keywords ([#1634](https://github.com/PrismJS/prism/issues/1634)) [`3590edde`](https://github.com/PrismJS/prism/commit/3590edde)\n- **SAS**\n    - Added new SAS keywords ([#1784](https://github.com/PrismJS/prism/issues/1784)) [`3b396ef5`](https://github.com/PrismJS/prism/commit/3b396ef5)\n- **Scheme**\n    - Fix function without arguments in scheme language ([#1463](https://github.com/PrismJS/prism/issues/1463)) [`12a827e7`](https://github.com/PrismJS/prism/commit/12a827e7)\n    - Scheme improvements ([#1556](https://github.com/PrismJS/prism/issues/1556)) [`225dd3f7`](https://github.com/PrismJS/prism/commit/225dd3f7)\n    - Fixed operator-like functions in Scheme ([#1467](https://github.com/PrismJS/prism/issues/1467)) [`f8c8add2`](https://github.com/PrismJS/prism/commit/f8c8add2)\n    - Scheme: Minor improvements ([#1814](https://github.com/PrismJS/prism/issues/1814)) [`191830f2`](https://github.com/PrismJS/prism/commit/191830f2)\n- **SCSS**\n    - Fixed that selector pattern can take exponential time ([#1499](https://github.com/PrismJS/prism/issues/1499)) [`0f75d9d4`](https://github.com/PrismJS/prism/commit/0f75d9d4)\n    - Move SCSS `property` definition ([#1633](https://github.com/PrismJS/prism/issues/1633)) [`0536fb14`](https://github.com/PrismJS/prism/commit/0536fb14)\n    - Add `keyword` alias for SCSS' `null` ([#1735](https://github.com/PrismJS/prism/issues/1735)) [`bd0378f0`](https://github.com/PrismJS/prism/commit/bd0378f0)\n- **Smalltalk**\n    - Allowed empty strings and comments ([#1747](https://github.com/PrismJS/prism/issues/1747)) [`5fd7577a`](https://github.com/PrismJS/prism/commit/5fd7577a)\n- **Smarty**\n    - Removed useless `insertBefore` call in Smarty ([#1677](https://github.com/PrismJS/prism/issues/1677)) [`bc49c361`](https://github.com/PrismJS/prism/commit/bc49c361)\n- **SQL**\n    - Added support for quote escapes to SQL strings ([#1500](https://github.com/PrismJS/prism/issues/1500)) [`a59a7926`](https://github.com/PrismJS/prism/commit/a59a7926)\n    - SQL Quoted variables are now greedy ([#1510](https://github.com/PrismJS/prism/issues/1510)) [`42d119a2`](https://github.com/PrismJS/prism/commit/42d119a2)\n- **TypeScript**\n    - Enhance definitions in TypeScript component ([#1522](https://github.com/PrismJS/prism/issues/1522)) [`11695629`](https://github.com/PrismJS/prism/commit/11695629)\n- **YAML**\n    - Allow YAML strings to have trailing comments ([#1602](https://github.com/PrismJS/prism/issues/1602)) [`1c5f28a9`](https://github.com/PrismJS/prism/commit/1c5f28a9)\n\n### Updated plugins\n\n- Better class name detection for plugins ([#1772](https://github.com/PrismJS/prism/issues/1772)) [`c9762c6f`](https://github.com/PrismJS/prism/commit/c9762c6f)\n- **Autolinker**\n    - Fix Autolinker url-decoding all tokens ([#1723](https://github.com/PrismJS/prism/issues/1723)) [`8cf20d49`](https://github.com/PrismJS/prism/commit/8cf20d49)\n- **Autoloader**\n    - Resolved variable name clash ([#1568](https://github.com/PrismJS/prism/issues/1568)) [`bfa5a8d9`](https://github.com/PrismJS/prism/commit/bfa5a8d9)\n    - Autoloader: Fixed the directory of scripts ([#1828](https://github.com/PrismJS/prism/issues/1828)) [`fd4c764f`](https://github.com/PrismJS/prism/commit/fd4c764f)\n    - Autoloader: Added support for aliases ([#1829](https://github.com/PrismJS/prism/issues/1829)) [`52889b5b`](https://github.com/PrismJS/prism/commit/52889b5b)\n- **Command Line**\n    - Fixed class regex for Command Line plugin ([#1566](https://github.com/PrismJS/prism/issues/1566)) [`9f6e5026`](https://github.com/PrismJS/prism/commit/9f6e5026)\n- **File Highlight**\n    - Prevent double-loading & add scope to File Highlight ([#1586](https://github.com/PrismJS/prism/issues/1586)) [`10239c14`](https://github.com/PrismJS/prism/commit/10239c14)\n- **JSONP Highlight**\n    - Cleanup JSONP highlight code ([#1674](https://github.com/PrismJS/prism/issues/1674)) [`28489698`](https://github.com/PrismJS/prism/commit/28489698)\n    - Fix typos & other issues in JSONP docs ([#1672](https://github.com/PrismJS/prism/issues/1672)) [`cd058a91`](https://github.com/PrismJS/prism/commit/cd058a91)\n    - JSONP highlight: Fixed minified adapter names ([#1793](https://github.com/PrismJS/prism/issues/1793)) [`5dd8f916`](https://github.com/PrismJS/prism/commit/5dd8f916)\n- **Keep Markup**\n    - Add unit tests to the Keep Markup plugin ([#1646](https://github.com/PrismJS/prism/issues/1646)) [`a944c418`](https://github.com/PrismJS/prism/commit/a944c418)\n- **Line Numbers**\n    - Added inheritance for the `line-numbers` class ([#1799](https://github.com/PrismJS/prism/issues/1799)) [`14be7489`](https://github.com/PrismJS/prism/commit/14be7489)\n- **Previewers**\n    - Fixed Previewers bug [#1496](https://github.com/PrismJS/prism/issues/1496) ([#1497](https://github.com/PrismJS/prism/issues/1497)) [`4b56f3c1`](https://github.com/PrismJS/prism/commit/4b56f3c1)\n- **Show Invisibles**\n    - Updated styles of show invisibles ([#1607](https://github.com/PrismJS/prism/issues/1607)) [`2ba62268`](https://github.com/PrismJS/prism/commit/2ba62268)\n    - Corrected load order of Show Invisibles ([#1612](https://github.com/PrismJS/prism/issues/1612)) [`6e0c6e86`](https://github.com/PrismJS/prism/commit/6e0c6e86)\n    - Show invisibles inside tokens ([#1610](https://github.com/PrismJS/prism/issues/1610)) [`1090b253`](https://github.com/PrismJS/prism/commit/1090b253)\n- **Show Language**\n    - Show Language plugin alias support and improvements ([#1683](https://github.com/PrismJS/prism/issues/1683)) [`4c66d72c`](https://github.com/PrismJS/prism/commit/4c66d72c)\n- **Toolbar**\n    - Toolbar: Minor improvements ([#1818](https://github.com/PrismJS/prism/issues/1818)) [`3ad47047`](https://github.com/PrismJS/prism/commit/3ad47047)\n\n### Updated themes\n\n- Normalized the font-size of pre and code ([#1791](https://github.com/PrismJS/prism/issues/1791)) [`878ef295`](https://github.com/PrismJS/prism/commit/878ef295)\n- **Coy**\n    - Correct typo ([#1508](https://github.com/PrismJS/prism/issues/1508)) [`c322fc80`](https://github.com/PrismJS/prism/commit/c322fc80)\n\n### Other changes\n\n- **Core**\n    - `insertBefore` now correctly updates references ([#1531](https://github.com/PrismJS/prism/issues/1531)) [`9dfec340`](https://github.com/PrismJS/prism/commit/9dfec340)\n    - Invoke `callback` after `after-highlight` hook ([#1588](https://github.com/PrismJS/prism/issues/1588)) [`bfbe4464`](https://github.com/PrismJS/prism/commit/bfbe4464)\n    - Improve `Prism.util.type` performance ([#1545](https://github.com/PrismJS/prism/issues/1545)) [`2864fe24`](https://github.com/PrismJS/prism/commit/2864fe24)\n    - Remove unused `insertBefore` overload ([#1631](https://github.com/PrismJS/prism/issues/1631)) [`39686e12`](https://github.com/PrismJS/prism/commit/39686e12)\n    - Ignore duplicates in insertBefore ([#1628](https://github.com/PrismJS/prism/issues/1628)) [`d33d259c`](https://github.com/PrismJS/prism/commit/d33d259c)\n    - Remove the Prism.tokenize language parameter ([#1654](https://github.com/PrismJS/prism/issues/1654)) [`fbf0b094`](https://github.com/PrismJS/prism/commit/fbf0b094)\n    - Call `insert-before` hook properly ([#1709](https://github.com/PrismJS/prism/issues/1709)) [`393ab164`](https://github.com/PrismJS/prism/commit/393ab164)\n    - Improved languages.DFS and util.clone ([#1506](https://github.com/PrismJS/prism/issues/1506)) [`152a68ef`](https://github.com/PrismJS/prism/commit/152a68ef)\n    - Core: Avoid redeclaring variables in util.clone ([#1778](https://github.com/PrismJS/prism/issues/1778)) [`b06f532f`](https://github.com/PrismJS/prism/commit/b06f532f)\n    - Made prism-core a little more editor friendly ([#1776](https://github.com/PrismJS/prism/issues/1776)) [`bac09f0a`](https://github.com/PrismJS/prism/commit/bac09f0a)\n    - Applied Array.isArray ([#1804](https://github.com/PrismJS/prism/issues/1804)) [`11d0f75e`](https://github.com/PrismJS/prism/commit/11d0f75e)\n- **Infrastructure**\n    - Linkify changelog more + add missing PR references [`2a100db7`](https://github.com/PrismJS/prism/commit/2a100db7)\n    - Set default indentation size ([#1516](https://github.com/PrismJS/prism/issues/1516)) [`e63d1597`](https://github.com/PrismJS/prism/commit/e63d1597)\n    - Add travis repo badge to readme ([#1561](https://github.com/PrismJS/prism/issues/1561)) [`716923f4`](https://github.com/PrismJS/prism/commit/716923f4)\n    - Update README.md ([#1553](https://github.com/PrismJS/prism/issues/1553)) [`6d1a2c61`](https://github.com/PrismJS/prism/commit/6d1a2c61)\n    - Mention Prism Themes in README ([#1625](https://github.com/PrismJS/prism/issues/1625)) [`5db04656`](https://github.com/PrismJS/prism/commit/5db04656)\n    - Fixed CHANGELOG.md ([#1707](https://github.com/PrismJS/prism/issues/1707)) [`b1f8a65d`](https://github.com/PrismJS/prism/commit/b1f8a65d) ([#1704](https://github.com/PrismJS/prism/issues/1704)) [`66d2104a`](https://github.com/PrismJS/prism/commit/66d2104a)\n    - Change tested NodeJS versions ([#1651](https://github.com/PrismJS/prism/issues/1651)) [`6ec71e0b`](https://github.com/PrismJS/prism/commit/6ec71e0b)\n    - Inline regex source with gulp ([#1537](https://github.com/PrismJS/prism/issues/1537)) [`e894fc89`](https://github.com/PrismJS/prism/commit/e894fc89) ([#1716](https://github.com/PrismJS/prism/issues/1716)) [`217a6ea4`](https://github.com/PrismJS/prism/commit/217a6ea4)\n    - Improve gulp error messages with pump ([#1741](https://github.com/PrismJS/prism/issues/1741)) [`671f4ca0`](https://github.com/PrismJS/prism/commit/671f4ca0)\n    - Update gulp to version 4.0.0 ([#1779](https://github.com/PrismJS/prism/issues/1779)) [`06627f6a`](https://github.com/PrismJS/prism/commit/06627f6a)\n    - gulp: Refactoring ([#1780](https://github.com/PrismJS/prism/issues/1780)) [`6c9fe257`](https://github.com/PrismJS/prism/commit/6c9fe257)\n    - npm: Updated all dependencies ([#1742](https://github.com/PrismJS/prism/issues/1742)) [`9d908d5a`](https://github.com/PrismJS/prism/commit/9d908d5a)\n    - Tests: Pretty-printed token stream ([#1801](https://github.com/PrismJS/prism/issues/1801)) [`9ea6d600`](https://github.com/PrismJS/prism/commit/9ea6d600)\n    - Refactored tests ([#1795](https://github.com/PrismJS/prism/issues/1795)) [`832a9643`](https://github.com/PrismJS/prism/commit/832a9643)\n    - Added issue templates ([#1805](https://github.com/PrismJS/prism/issues/1805)) [`dedb475f`](https://github.com/PrismJS/prism/commit/dedb475f)\n    - npm: Fixed `test` script ([#1809](https://github.com/PrismJS/prism/issues/1809)) [`bc649dfa`](https://github.com/PrismJS/prism/commit/bc649dfa)\n    - Add command to generate CHANGELOG [`212666d3`](https://github.com/PrismJS/prism/commit/212666d3)\n    - Name in composer.json set to lowercase ([#1824](https://github.com/PrismJS/prism/issues/1824)) [`4f78f1d6`](https://github.com/PrismJS/prism/commit/4f78f1d6)\n    - Added alias tests ([#1832](https://github.com/PrismJS/prism/issues/1832)) [`5c1a6fb2`](https://github.com/PrismJS/prism/commit/5c1a6fb2)\n    - Travis: Fail when changed files are detected ([#1819](https://github.com/PrismJS/prism/issues/1819)) [`66b44e3b`](https://github.com/PrismJS/prism/commit/66b44e3b)\n    - Tests: Additional checks for Prism functions ([#1803](https://github.com/PrismJS/prism/issues/1803)) [`c3e74ea3`](https://github.com/PrismJS/prism/commit/c3e74ea3)\n    - Adjusted .npmignore ([#1834](https://github.com/PrismJS/prism/issues/1834)) [`29a30c62`](https://github.com/PrismJS/prism/commit/29a30c62)\n- **Website**\n    - Add Python triple-quoted strings \"known failure\" ([#1449](https://github.com/PrismJS/prism/issues/1449)) [`334c7bca`](https://github.com/PrismJS/prism/commit/334c7bca)\n    - Updated index.html to fix broken instructions ([#1462](https://github.com/PrismJS/prism/issues/1462)) [`7418dfdd`](https://github.com/PrismJS/prism/commit/7418dfdd)\n    - Improve download page typography ([#1484](https://github.com/PrismJS/prism/issues/1484)) [`b1c2f4df`](https://github.com/PrismJS/prism/commit/b1c2f4df)\n    - Fixed peer dependencies in download page ([#1491](https://github.com/PrismJS/prism/issues/1491)) [`9d15ff6e`](https://github.com/PrismJS/prism/commit/9d15ff6e)\n    - Fixed empty link in extending ([#1507](https://github.com/PrismJS/prism/issues/1507)) [`74916d48`](https://github.com/PrismJS/prism/commit/74916d48)\n    - Display language aliases ([#1626](https://github.com/PrismJS/prism/issues/1626)) [`654b527b`](https://github.com/PrismJS/prism/commit/654b527b)\n    - Clean up Previewers' page ([#1630](https://github.com/PrismJS/prism/issues/1630)) [`b0d1823c`](https://github.com/PrismJS/prism/commit/b0d1823c)\n    - Updated website table of contents styles ([#1681](https://github.com/PrismJS/prism/issues/1681)) [`efdd96c3`](https://github.com/PrismJS/prism/commit/efdd96c3)\n    - Added new third-party tutorial for using Prism in Gutenberg ([#1701](https://github.com/PrismJS/prism/issues/1701)) [`ff9ccbe5`](https://github.com/PrismJS/prism/commit/ff9ccbe5)\n    - Remove dead tutorial ([#1702](https://github.com/PrismJS/prism/issues/1702)) [`e2d3bc7e`](https://github.com/PrismJS/prism/commit/e2d3bc7e)\n    - Fix downloads page fetching from GitHub([#1684](https://github.com/PrismJS/prism/issues/1684)) [`dbd3555e`](https://github.com/PrismJS/prism/commit/dbd3555e)\n    - Remove parentheses from download page ([#1627](https://github.com/PrismJS/prism/issues/1627)) [`2ce0666d`](https://github.com/PrismJS/prism/commit/2ce0666d)\n    - Line Numbers plugin instructions clarifications ([#1719](https://github.com/PrismJS/prism/issues/1719)) [`00f4f04f`](https://github.com/PrismJS/prism/commit/00f4f04f)\n    - Fixed Toolbar plugin example ([#1726](https://github.com/PrismJS/prism/issues/1726)) [`5311ca32`](https://github.com/PrismJS/prism/commit/5311ca32)\n    - Test page: Show tokens option ([#1757](https://github.com/PrismJS/prism/issues/1757)) [`729cb28b`](https://github.com/PrismJS/prism/commit/729cb28b)\n    - Some encouragement for visitors of PrismJS.com to request new languages ([#1760](https://github.com/PrismJS/prism/issues/1760)) [`ea769e0b`](https://github.com/PrismJS/prism/commit/ea769e0b)\n    - Docs: Added missing parameter ([#1774](https://github.com/PrismJS/prism/issues/1774)) [`18f2921d`](https://github.com/PrismJS/prism/commit/18f2921d)\n    - More persistent test page ([#1529](https://github.com/PrismJS/prism/issues/1529)) [`3100fa31`](https://github.com/PrismJS/prism/commit/3100fa31)\n    - Added scripts directory ([#1781](https://github.com/PrismJS/prism/issues/1781)) [`439ea1ee`](https://github.com/PrismJS/prism/commit/439ea1ee)\n    - Fixed download page ([#1811](https://github.com/PrismJS/prism/issues/1811)) [`77c57446`](https://github.com/PrismJS/prism/commit/77c57446)\n\n## 1.15.0 (2018-06-16)\n\n### New components\n\n- **Template Tookit 2** ([#1418](https://github.com/PrismJS/prism/issues/1418)) [[`e063992`](https://github.com/PrismJS/prism/commit/e063992)]\n- **XQuery** ([#1411](https://github.com/PrismJS/prism/issues/1411)) [[`e326cb0`](https://github.com/PrismJS/prism/commit/e326cb0)]\n- **TAP** ([#1430](https://github.com/PrismJS/prism/issues/1430)) [[`8c2b71f`](https://github.com/PrismJS/prism/commit/8c2b71f)]\n\n### Updated components\n\n- **HTTP**\n    - Absolute path is a valid request uri ([#1388](https://github.com/PrismJS/prism/issues/1388)) [[`f6e81cb`](https://github.com/PrismJS/prism/commit/f6e81cb)]\n- **Kotlin**\n    - Add keywords of Kotlin and modify it's number pattern. ([#1389](https://github.com/PrismJS/prism/issues/1389)) [[`1bf73b0`](https://github.com/PrismJS/prism/commit/1bf73b0)]\n    - Add `typealias` keyword ([#1437](https://github.com/PrismJS/prism/issues/1437)) [[`a21fdee`](https://github.com/PrismJS/prism/commit/a21fdee)]\n- **JavaScript**\n    - Improve Regexp pattern [[`5b043cf`](https://github.com/PrismJS/prism/commit/5b043cf)]\n    - Add support for one level of nesting inside template strings. Fix [#1397](https://github.com/PrismJS/prism/issues/1397) [[`db2d0eb`](https://github.com/PrismJS/prism/commit/db2d0eb)]\n- **Elixir**\n    - Elixir: Fix attributes consuming punctuation. Fix [#1392](https://github.com/PrismJS/prism/issues/1392) [[`dac0485`](https://github.com/PrismJS/prism/commit/dac0485)]\n- **Bash**\n    - Change reserved keyword reference ([#1396](https://github.com/PrismJS/prism/issues/1396)) [[`b94f01f`](https://github.com/PrismJS/prism/commit/b94f01f)]\n- **PowerShell**\n    - Allow for one level of nesting in expressions inside strings. Fix [#1407](https://github.com/PrismJS/prism/issues/1407) [[`9272d6f`](https://github.com/PrismJS/prism/commit/9272d6f)]\n- **JSX**\n    - Allow for two levels of nesting inside JSX tags. Fix [#1408](https://github.com/PrismJS/prism/issues/1408) [[`f1cd7c5`](https://github.com/PrismJS/prism/commit/f1cd7c5)]\n    - Add support for fragments short syntax. Fix [#1421](https://github.com/PrismJS/prism/issues/1421) [[`38ce121`](https://github.com/PrismJS/prism/commit/38ce121)]\n- **Pascal**\n    - Add `objectpascal` as an alias to `pascal` ([#1426](https://github.com/PrismJS/prism/issues/1426)) [[`a0bfc84`](https://github.com/PrismJS/prism/commit/a0bfc84)]\n- **Swift**\n    - Fix Swift 'protocol' keyword ([#1440](https://github.com/PrismJS/prism/issues/1440)) [[`081e318`](https://github.com/PrismJS/prism/commit/081e318)]\n\n### Updated plugins\n\n- **File Highlight**\n    - Fix issue causing the Download button to show up on every code blocks. [[`cd22499`](https://github.com/PrismJS/prism/commit/cd22499)]\n    - Simplify lang regex on File Highlight plugin ([#1399](https://github.com/PrismJS/prism/issues/1399)) [[`7bc9a4a`](https://github.com/PrismJS/prism/commit/7bc9a4a)]\n- **Show Language**\n    - Don't process language if block language not set ([#1410](https://github.com/PrismJS/prism/issues/1410)) [[`c111869`](https://github.com/PrismJS/prism/commit/c111869)]\n- **Autoloader**\n    - ASP.NET should require C# [[`fa328bb`](https://github.com/PrismJS/prism/commit/fa328bb)]\n- **Line Numbers**\n    - Make line-numbers styles more specific ([#1434](https://github.com/PrismJS/prism/issues/1434), [#1435](https://github.com/PrismJS/prism/issues/1435)) [[`9ee4f54`](https://github.com/PrismJS/prism/commit/9ee4f54)]\n\n### Updated themes\n\n- Add .token.class-name to rest of themes ([#1360](https://github.com/PrismJS/prism/issues/1360)) [[`f356dfe`](https://github.com/PrismJS/prism/commit/f356dfe)]\n\n### Other changes\n\n- **Website**\n    - Site now loads over HTTPS!\n    - Use HTTPS / canonical URLs ([#1390](https://github.com/PrismJS/prism/issues/1390)) [[`95146c8`](https://github.com/PrismJS/prism/commit/95146c8)]\n    - Added Angular tutorial link [[`c436a7c`](https://github.com/PrismJS/prism/commit/c436a7c)]\n    - Use rel=\"icon\" instead of rel=\"shortcut icon\" ([#1398](https://github.com/PrismJS/prism/issues/1398)) [[`d95f8fb`](https://github.com/PrismJS/prism/commit/d95f8fb)]\n    - Fix Download page not handling multiple dependencies when from Redownload URL [[`c2ff248`](https://github.com/PrismJS/prism/commit/c2ff248)]\n    - Update documentation for node & webpack usage [[`1e99e96`](https://github.com/PrismJS/prism/commit/1e99e96)]\n- Handle optional dependencies in `loadLanguages()` ([#1417](https://github.com/PrismJS/prism/issues/1417)) [[`84935ac`](https://github.com/PrismJS/prism/commit/84935ac)]\n- Add Chinese translation [[`f2b1964`](https://github.com/PrismJS/prism/commit/f2b1964)]\n\n## 1.14.0 (2018-04-11)\n\n### New components\n\n- **GEDCOM** ([#1385](https://github.com/PrismJS/prism/issues/1385)) [[`6e0b20a`](https://github.com/PrismJS/prism/commit/6e0b20a)]\n- **Lisp** ([#1297](https://github.com/PrismJS/prism/issues/1297)) [[`46468f8`](https://github.com/PrismJS/prism/commit/46468f8)]\n- **Markup Templating** ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)]\n- **Soy** ([#1387](https://github.com/PrismJS/prism/issues/1387)) [[`b4509bf`](https://github.com/PrismJS/prism/commit/b4509bf)]\n- **Velocity** ([#1378](https://github.com/PrismJS/prism/issues/1378)) [[`5a524f7`](https://github.com/PrismJS/prism/commit/5a524f7)]\n- **Visual Basic** ([#1382](https://github.com/PrismJS/prism/issues/1382)) [[`c673ec2`](https://github.com/PrismJS/prism/commit/c673ec2)]\n- **WebAssembly** ([#1386](https://github.com/PrismJS/prism/issues/1386)) [[`c28d8c5`](https://github.com/PrismJS/prism/commit/c28d8c5)]\n\n### Updated components\n\n- **Bash**:\n    - Add curl to the list of common functions. Close [#1160](https://github.com/PrismJS/prism/issues/1160) [[`1bfc084`](https://github.com/PrismJS/prism/commit/1bfc084)]\n- **C-like**:\n    - Make single-line comments greedy. Fix [#1337](https://github.com/PrismJS/prism/issues/1337). Make sure [#1340](https://github.com/PrismJS/prism/issues/1340) stays fixed. [[`571f2c5`](https://github.com/PrismJS/prism/commit/571f2c5)]\n- **C#**:\n    - More generic class-name highlighting. Fix [#1365](https://github.com/PrismJS/prism/issues/1365) [[`a6837d2`](https://github.com/PrismJS/prism/commit/a6837d2)]\n    - More specific class-name highlighting. Fix [#1371](https://github.com/PrismJS/prism/issues/1371) [[`0a95f69`](https://github.com/PrismJS/prism/commit/0a95f69)]\n- **Eiffel**:\n    - Fix verbatim strings. Fix [#1379](https://github.com/PrismJS/prism/issues/1379) [[`04df41b`](https://github.com/PrismJS/prism/commit/04df41b)]\n- **Elixir**\n    - Make regexps greedy, remove comment hacks. Update known failures and tests. [[`e93d61f`](https://github.com/PrismJS/prism/commit/e93d61f)]\n- **ERB**:\n    - Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)]\n- **Fortran**:\n    - Make single-line comments greedy. Update known failures and tests. [[`c083b78`](https://github.com/PrismJS/prism/commit/c083b78)]\n- **Handlebars**:\n    - Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)]\n- **Java**:\n    - Add support for generics. Fix [#1351](https://github.com/PrismJS/prism/issues/1351) [[`a5cf302`](https://github.com/PrismJS/prism/commit/a5cf302)]\n- **JavaScript**:\n    - Add support for constants. Fix [#1348](https://github.com/PrismJS/prism/issues/1348) [[`9084481`](https://github.com/PrismJS/prism/commit/9084481)]\n    - Improve Regex matching [[`172d351`](https://github.com/PrismJS/prism/commit/172d351)]\n- **JSX**:\n    - Fix highlighting of empty objects. Fix [#1364](https://github.com/PrismJS/prism/issues/1364) [[`b26bbb8`](https://github.com/PrismJS/prism/commit/b26bbb8)]\n- **Monkey**:\n    - Make comments greedy. Update known failures and tests. [[`d7b2b43`](https://github.com/PrismJS/prism/commit/d7b2b43)]\n- **PHP**:\n    - Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)]\n- **Puppet**:\n    - Make heredoc, comments, regexps and strings greedy. Update known failures and tests. [[`0c139d1`](https://github.com/PrismJS/prism/commit/0c139d1)]\n- **Q**:\n    - Make comments greedy. Update known failures and tests. [[`a0f5081`](https://github.com/PrismJS/prism/commit/a0f5081)]\n- **Ruby**:\n    - Make multi-line comments greedy, remove single-line comment hack. Update known failures and tests. [[`b0e34fb`](https://github.com/PrismJS/prism/commit/b0e34fb)]\n- **SQL**:\n    - Add missing keywords. Fix [#1374](https://github.com/PrismJS/prism/issues/1374) [[`238b195`](https://github.com/PrismJS/prism/commit/238b195)]\n\n### Updated plugins\n\n- **Command Line**:\n    - Command Line: Allow specifying output prefix using data-filter-output attribute. ([#856](https://github.com/PrismJS/prism/issues/856)) [[`094d546`](https://github.com/PrismJS/prism/commit/094d546)]\n- **File Highlight**:\n    - Add option to provide a download button, when used with the Toolbar plugin. Fix [#1030](https://github.com/PrismJS/prism/issues/1030) [[`9f22952`](https://github.com/PrismJS/prism/commit/9f22952)]\n\n### Updated themes\n\n- **Default**:\n    - Reach AA contrast ratio level ([#1296](https://github.com/PrismJS/prism/issues/1296)) [[`8aea939`](https://github.com/PrismJS/prism/commit/8aea939)]\n\n### Other changes\n\n- Website: Remove broken third-party tutorials from homepage [[`0efd6e1`](https://github.com/PrismJS/prism/commit/0efd6e1)]\n- Docs: Mention `loadLanguages()` function on homepage in the nodeJS section. Close [#972](https://github.com/PrismJS/prism/issues/972), close [#593](https://github.com/PrismJS/prism/issues/593) [[`4a14d20`](https://github.com/PrismJS/prism/commit/4a14d20)]\n- Core: Greedy patterns should always be matched against the full string. Fix [#1355](https://github.com/PrismJS/prism/issues/1355) [[`294efaa`](https://github.com/PrismJS/prism/commit/294efaa)]\n- Crystal: Update known failures. [[`e1d2d42`](https://github.com/PrismJS/prism/commit/e1d2d42)]\n- D: Update known failures and tests. [[`13d9991`](https://github.com/PrismJS/prism/commit/13d9991)]\n- Markdown: Update known failures. [[`5b6c76d`](https://github.com/PrismJS/prism/commit/5b6c76d)]\n- Matlab: Update known failures. [[`259b6fc`](https://github.com/PrismJS/prism/commit/259b6fc)]\n- Website: Remove non-existent anchor to failures. Reword on homepage to make is less misleading. [[`8c0911a`](https://github.com/PrismJS/prism/commit/8c0911a)]\n- Website: Add link to Keep Markup plugin in FAQ [[`e8cb6d4`](https://github.com/PrismJS/prism/commit/e8cb6d4)]\n- Test suite: Memory leak in vm.runInNewContext() seems fixed. Revert [[`9a4b6fa`](https://github.com/PrismJS/prism/commit/9a4b6fa)] to drastically improve tests execution time. [[`9bceece`](https://github.com/PrismJS/prism/commit/9bceece), [`7c7602b`](https://github.com/PrismJS/prism/commit/7c7602b)]\n- Gulp: Don't minify `components/index.js` [[`689227b`](https://github.com/PrismJS/prism/commit/689227b)]\n- Website: Fix theme selection on Download page, when theme is in query string or hash. [[`b4d3063`](https://github.com/PrismJS/prism/commit/b4d3063)]\n- Update JSPM config to also include unminified components. Close [#995](https://github.com/PrismJS/prism/issues/995) [[`218f160`](https://github.com/PrismJS/prism/commit/218f160)]\n- Core: Fix support for language alias containing dash `-` [[`659ea31`](https://github.com/PrismJS/prism/commit/659ea31)]\n\n## 1.13.0 (2018-03-21)\n\n### New components\n\n- **ERB** [[`e6213ac`](https://github.com/PrismJS/prism/commit/e6213ac)]\n- **PL/SQL** ([#1338](https://github.com/PrismJS/prism/issues/1338)) [[`3599e6a`](https://github.com/PrismJS/prism/commit/3599e6a)]\n\n### Updated components\n\n- **JSX**:\n    - Add support for plain text inside tags ([#1357](https://github.com/PrismJS/prism/issues/1357)) [[`2b8321d`](https://github.com/PrismJS/prism/commit/2b8321d)]\n- **Markup**:\n    - Make tags greedy. Fix [#1356](https://github.com/PrismJS/prism/issues/1356) [[`af834be`](https://github.com/PrismJS/prism/commit/af834be)]\n- **Powershell**:\n    - Add lookbehind to fix function interpolation inside strings. Fix [#1361](https://github.com/PrismJS/prism/issues/1361) [[`d2c026e`](https://github.com/PrismJS/prism/commit/d2c026e)]\n- **Rust**:\n    - Improve char pattern so that lifetime annotations are matched better. Fix [#1353](https://github.com/PrismJS/prism/issues/1353) [[`efdccbf`](https://github.com/PrismJS/prism/commit/efdccbf)]\n\n### Updated themes\n\n- **Default**:\n    - Add color for class names [[`8572474`](https://github.com/PrismJS/prism/commit/8572474)]\n- **Coy**:\n    - Inherit pre's height on code, so it does not break on Download page. [[`c6c7fd1`](https://github.com/PrismJS/prism/commit/c6c7fd1)]\n\n### Other changes\n\n- Website: Auto-generate example headers [[`c3ed5b5`](https://github.com/PrismJS/prism/commit/c3ed5b5)]\n- Core: Allow cloning of circular structures. ([#1345](https://github.com/PrismJS/prism/issues/1345)) [[`f90d555`](https://github.com/PrismJS/prism/commit/f90d555)]\n- Core: Generate components.js from components.json and make it exportable to nodeJS. ([#1354](https://github.com/PrismJS/prism/issues/1354)) [[`ba60df0`](https://github.com/PrismJS/prism/commit/ba60df0)]\n- Website: Improve appearance of theme selector [[`0460cad`](https://github.com/PrismJS/prism/commit/0460cad)]\n- Website: Check stored theme by default + link both theme selectors together. Close [#1038](https://github.com/PrismJS/prism/issues/1038) [[`212dd4e`](https://github.com/PrismJS/prism/commit/212dd4e)]\n- Tests: Use the new components.js file directly [[`0e1a8b7`](https://github.com/PrismJS/prism/commit/0e1a8b7)]\n- Update .npmignore Close [#1274](https://github.com/PrismJS/prism/issues/1274) [[`a52319a`](https://github.com/PrismJS/prism/commit/a52319a)]\n- Add a loadLanguages() function for easy component loading on NodeJS ([#1359](https://github.com/PrismJS/prism/issues/1359)) [[`a5331a6`](https://github.com/PrismJS/prism/commit/a5331a6)]\n\n## 1.12.2 (2018-03-08)\n\n### Other changes\n\n- Test against NodeJS 4, 6, 8 and 9 ([#1329](https://github.com/PrismJS/prism/issues/1329)) [[`97b7d0a`](https://github.com/PrismJS/prism/commit/97b7d0a)]\n- Stop testing against NodeJS 0.10 and 0.12 [[`df01b1b`](https://github.com/PrismJS/prism/commit/df01b1b)]\n\n## 1.12.1 (2018-03-08)\n\n### Updated components\n\n- **C-like**:\n    - Revert [[`b98e5b9`](https://github.com/PrismJS/prism/commit/b98e5b9)] to fix [#1340](https://github.com/PrismJS/prism/issues/1340). Reopened [#1337](https://github.com/PrismJS/prism/issues/1337). [[`cebacdf`](https://github.com/PrismJS/prism/commit/cebacdf)]\n- **JSX**:\n    - Allow for one level of nested curly braces inside tag attribute value. Fix [#1335](https://github.com/PrismJS/prism/issues/1335) [[`05bf67d`](https://github.com/PrismJS/prism/commit/05bf67d)]\n- **Ruby**:\n    - Ensure module syntax is not confused with symbols. Fix [#1336](https://github.com/PrismJS/prism/issues/1336) [[`31a2a69`](https://github.com/PrismJS/prism/commit/31a2a69)]\n\n## 1.12.0 (2018-03-07)\n\n### New components\n\n- **ARFF** ([#1327](https://github.com/PrismJS/prism/issues/1327)) [[`0bc98ac`](https://github.com/PrismJS/prism/commit/0bc98ac)]\n- **Clojure** ([#1311](https://github.com/PrismJS/prism/issues/1311)) [[`8b4d3bd`](https://github.com/PrismJS/prism/commit/8b4d3bd)]\n- **Liquid** ([#1326](https://github.com/PrismJS/prism/issues/1326)) [[`f0b2c9e`](https://github.com/PrismJS/prism/commit/f0b2c9e)]\n\n### Updated components\n\n- **Bash**:\n    - Add shell as an alias ([#1321](https://github.com/PrismJS/prism/issues/1321)) [[`67e16a2`](https://github.com/PrismJS/prism/commit/67e16a2)]\n    - Add support for quoted command substitution. Fix [#1287](https://github.com/PrismJS/prism/issues/1287) [[`63fc215`](https://github.com/PrismJS/prism/commit/63fc215)]\n- **C#**:\n    - Add \"dotnet\" alias. [[`405867c`](https://github.com/PrismJS/prism/commit/405867c)]\n- **C-like**:\n    - Change order of comment patterns and make multi-line one greedy. Fix [#1337](https://github.com/PrismJS/prism/issues/1337) [[`b98e5b9`](https://github.com/PrismJS/prism/commit/b98e5b9)]\n- **NSIS**:\n    - Add support for NSIS 3.03 ([#1288](https://github.com/PrismJS/prism/issues/1288)) [[`bd1e98b`](https://github.com/PrismJS/prism/commit/bd1e98b)]\n    - Add missing NSIS commands ([#1289](https://github.com/PrismJS/prism/issues/1289)) [[`ad2948f`](https://github.com/PrismJS/prism/commit/ad2948f)]\n- **PHP**:\n    - Add support for string interpolation inside double-quoted strings. Fix [#1146](https://github.com/PrismJS/prism/issues/1146) [[`9f1f8d6`](https://github.com/PrismJS/prism/commit/9f1f8d6)]\n    - Add support for Heredoc and Nowdoc strings [[`5d7223c`](https://github.com/PrismJS/prism/commit/5d7223c)]\n    - Fix shell-comment failure now that strings are greedy [[`ad25d22`](https://github.com/PrismJS/prism/commit/ad25d22)]\n- **PowerShell**:\n    - Add support for two levels of nested brackets inside namespace pattern. Fixes [#1317](https://github.com/PrismJS/prism/issues/1317) [[`3bc3e9c`](https://github.com/PrismJS/prism/commit/3bc3e9c)]\n- **Ruby**:\n    - Add keywords \"protected\", \"private\" and \"public\" [[`4593837`](https://github.com/PrismJS/prism/commit/4593837)]\n- **Rust**:\n    - Add support for lifetime-annotation and => operator. Fix [#1339](https://github.com/PrismJS/prism/issues/1339) [[`926f6f8`](https://github.com/PrismJS/prism/commit/926f6f8)]\n- **Scheme**:\n    - Don't highlight first number of a list as a function. Fix [#1331](https://github.com/PrismJS/prism/issues/1331) [[`51bff80`](https://github.com/PrismJS/prism/commit/51bff80)]\n- **SQL**:\n    - Add missing keywords and functions, fix numbers [[`de29d4a`](https://github.com/PrismJS/prism/commit/de29d4a)]\n\n### Updated plugins\n\n- **Autolinker**:\n    - Allow more chars in query string and hash to match more URLs. Fix [#1142](https://github.com/PrismJS/prism/issues/1142) [[`109bd6f`](https://github.com/PrismJS/prism/commit/109bd6f)]\n- **Copy to Clipboard**:\n    - Bump ClipboardJS to 2.0.0 and remove hack ([#1314](https://github.com/PrismJS/prism/issues/1314)) [[`e9f410e`](https://github.com/PrismJS/prism/commit/e9f410e)]\n- **Toolbar**:\n    - Prevent scrolling toolbar with content ([#1305](https://github.com/PrismJS/prism/issues/1305), [#1314](https://github.com/PrismJS/prism/issues/1314)) [[`84eeb89`](https://github.com/PrismJS/prism/commit/84eeb89)]\n- **Unescaped Markup**:\n    - Use msMatchesSelector for IE11 and below. Fix [#1302](https://github.com/PrismJS/prism/issues/1302) [[`c246c1a`](https://github.com/PrismJS/prism/commit/c246c1a)]\n- **WebPlatform Docs**:\n    - WebPlatform Docs plugin: Fix links. Fixes [#1290](https://github.com/PrismJS/prism/issues/1290) [[`7a9dbe0`](https://github.com/PrismJS/prism/commit/7a9dbe0)]\n\n### Other changes\n\n- Fix Autoloader's demo page [[`3dddac9`](https://github.com/PrismJS/prism/commit/3dddac9)]\n- Download page: Use hash instead of query-string for redownload URL. Fix [#1263](https://github.com/PrismJS/prism/issues/1263) [[`b03c02a`](https://github.com/PrismJS/prism/commit/b03c02a)]\n- Core: Don't thow an error if lookbehing is used without anything matching. [[`e0cd47f`](https://github.com/PrismJS/prism/commit/e0cd47f)]\n- Docs: Fix link to the `<code>` element specification in HTML5 [[`a84263f`](https://github.com/PrismJS/prism/commit/a84263f)]\n- Docs: Mention support for `lang-xxxx` class. Close [#1312](https://github.com/PrismJS/prism/issues/1312) [[`a9e76db`](https://github.com/PrismJS/prism/commit/a9e76db)]\n- Docs: Add note on `async` parameter to clarify the requirement of using a single bundled file. Closes [#1249](https://github.com/PrismJS/prism/issues/1249) [[`eba0235`](https://github.com/PrismJS/prism/commit/eba0235)]\n\n## 1.11.0 (2018-02-05)\n\n### New components\n\n- **Content-Security-Policy (CSP)** ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)]\n- **HTTP Public-Key-Pins (HPKP)** ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)]\n- **HTTP String-Transport-Security (HSTS)** ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)]\n- **React TSX** ([#1280](https://github.com/PrismJS/prism/issues/1280)) [[`fbe82b8`](https://github.com/PrismJS/prism/commit/fbe82b8)]\n\n### Updated components\n\n- **C++**:\n    - Add C++ platform-independent types ([#1271](https://github.com/PrismJS/prism/issues/1271)) [[`3da238f`](https://github.com/PrismJS/prism/commit/3da238f)]\n- **TypeScript**:\n    - Improve typescript with builtins ([#1277](https://github.com/PrismJS/prism/issues/1277)) [[`5de1b1f`](https://github.com/PrismJS/prism/commit/5de1b1f)]\n\n### Other changes\n\n- Fix passing of non-enumerable Error properties from the child test runner ([#1276](https://github.com/PrismJS/prism/issues/1276)) [[`38df653`](https://github.com/PrismJS/prism/commit/38df653)]\n\n## 1.10.0 (2018-01-17)\n\n### New components\n\n- **6502 Assembly** ([#1245](https://github.com/PrismJS/prism/issues/1245)) [[`2ece18b`](https://github.com/PrismJS/prism/commit/2ece18b)]\n- **Elm** ([#1174](https://github.com/PrismJS/prism/issues/1174)) [[`d6da70e`](https://github.com/PrismJS/prism/commit/d6da70e)]\n- **IchigoJam BASIC** ([#1246](https://github.com/PrismJS/prism/issues/1246)) [[`cf840be`](https://github.com/PrismJS/prism/commit/cf840be)]\n- **Io** ([#1251](https://github.com/PrismJS/prism/issues/1251)) [[`84ed3ed`](https://github.com/PrismJS/prism/commit/84ed3ed)]\n\n### Updated components\n\n- **BASIC**:\n    - Make strings greedy [[`60114d0`](https://github.com/PrismJS/prism/commit/60114d0)]\n- **C++**:\n    - Add C++11 raw string feature ([#1254](https://github.com/PrismJS/prism/issues/1254)) [[`71595be`](https://github.com/PrismJS/prism/commit/71595be)]\n\n### Updated plugins\n\n- **Autoloader**:\n    - Add support for `data-autoloader-path` ([#1242](https://github.com/PrismJS/prism/issues/1242)) [[`39360d6`](https://github.com/PrismJS/prism/commit/39360d6)]\n- **Previewers**:\n    - New plugin combining previous plugins Previewer: Base, Previewer: Angle, Previewer: Color, Previewer: Easing, Previewer: Gradient and Previewer: Time. ([#1244](https://github.com/PrismJS/prism/issues/1244)) [[`28e4b4c`](https://github.com/PrismJS/prism/commit/28e4b4c)]\n- **Unescaped Markup**:\n    - Make it work with any language ([#1265](https://github.com/PrismJS/prism/issues/1265)) [[`7bcdae7`](https://github.com/PrismJS/prism/commit/7bcdae7)]\n\n### Other changes\n\n- Add attribute `style` in `package.json` ([#1256](https://github.com/PrismJS/prism/issues/1256)) [[`a9b6785`](https://github.com/PrismJS/prism/commit/a9b6785)]\n\n## 1.9.0 (2017-12-06)\n\n### New components\n\n- **Flow** [[`d27b70d`](https://github.com/PrismJS/prism/commit/d27b70d)]\n\n### Updated components\n\n- **CSS**:\n    - Unicode characters in CSS properties ([#1227](https://github.com/PrismJS/prism/issues/1227)) [[`f234ea4`](https://github.com/PrismJS/prism/commit/f234ea4)]\n- **JSX**:\n    - JSX: Improve highlighting support. Fix [#1235](https://github.com/PrismJS/prism/issues/1235) and [#1236](https://github.com/PrismJS/prism/issues/1236) [[`f41c5cd`](https://github.com/PrismJS/prism/commit/f41c5cd)]\n- **Markup**:\n    - Make CSS and JS inclusions in Markup greedy. Fix [#1240](https://github.com/PrismJS/prism/issues/1240) [[`7dc1e45`](https://github.com/PrismJS/prism/commit/7dc1e45)]\n- **PHP**:\n    - Add support for multi-line strings. Fix [#1233](https://github.com/PrismJS/prism/issues/1233) [[`9a542a0`](https://github.com/PrismJS/prism/commit/9a542a0)]\n\n### Updated plugins\n\n- **Copy to clipboard**:\n    - Fix test for native Clipboard. Fix [#1241](https://github.com/PrismJS/prism/issues/1241) [[`e7b5e82`](https://github.com/PrismJS/prism/commit/e7b5e82)]\n    - Copy to clipboard: Update to v1.7.1. Fix [#1220](https://github.com/PrismJS/prism/issues/1220) [[`a1b85e3`](https://github.com/PrismJS/prism/commit/a1b85e3), [`af50e44`](https://github.com/PrismJS/prism/commit/af50e44)]\n- **Line highlight**:\n    - Fixes to compatibility of line number and line higlight plugins ([#1194](https://github.com/PrismJS/prism/issues/1194)) [[`e63058f`](https://github.com/PrismJS/prism/commit/e63058f), [`3842a91`](https://github.com/PrismJS/prism/commit/3842a91)]\n- **Unescaped Markup**:\n    - Fix ambiguity in documentation by improving examples. Fix [#1197](https://github.com/PrismJS/prism/issues/1197) [[`924784a`](https://github.com/PrismJS/prism/commit/924784a)]\n\n### Other changes\n\n- Allow any element being root instead of document. ([#1230](https://github.com/PrismJS/prism/issues/1230)) [[`69f2e2c`](https://github.com/PrismJS/prism/commit/69f2e2c), [`6e50d44`](https://github.com/PrismJS/prism/commit/6e50d44)]\n- Coy Theme: The 'height' element makes code blocks the height of the browser canvas. ([#1224](https://github.com/PrismJS/prism/issues/1224)) [[`ac219d7`](https://github.com/PrismJS/prism/commit/ac219d7)]\n- Download page: Fix implicitly declared variable [[`f986551`](https://github.com/PrismJS/prism/commit/f986551)]\n- Download page: Add version number at the beginning of the generated files. Fix [#788](https://github.com/PrismJS/prism/issues/788) [[`928790d`](https://github.com/PrismJS/prism/commit/928790d)]\n\n## 1.8.4 (2017-11-05)\n\n### Updated components\n\n- **ABAP**:\n    - Regexp optimisation [[`e7b411e`](https://github.com/PrismJS/prism/commit/e7b411e)]\n- **ActionScript**:\n    - Fix XML regex + optimise [[`75d00d7`](https://github.com/PrismJS/prism/commit/75d00d7)]\n- **Ada**:\n    - Regexp simplification [[`e881fe3`](https://github.com/PrismJS/prism/commit/e881fe3)]\n- **Apacheconf**:\n    - Regexp optimisation [[`a065e61`](https://github.com/PrismJS/prism/commit/a065e61)]\n- **APL**:\n    - Regexp simplification [[`33297c4`](https://github.com/PrismJS/prism/commit/33297c4)]\n- **AppleScript**:\n    - Regexp optimisation [[`d879f36`](https://github.com/PrismJS/prism/commit/d879f36)]\n- **Arduino**:\n    - Don't use captures if not needed [[`16b338f`](https://github.com/PrismJS/prism/commit/16b338f)]\n- **ASP.NET**:\n    - Regexp optimisation [[`438926c`](https://github.com/PrismJS/prism/commit/438926c)]\n- **AutoHotkey**:\n    - Regexp simplification + don't use captures if not needed [[`5edfd2f`](https://github.com/PrismJS/prism/commit/5edfd2f)]\n- **Bash**:\n    - Regexp optimisation and simplification [[`75b9b29`](https://github.com/PrismJS/prism/commit/75b9b29)]\n- **Bro**:\n    - Regexp simplification + don't use captures if not needed [[`d4b9003`](https://github.com/PrismJS/prism/commit/d4b9003)]\n- **C**:\n    - Regexp optimisation + don't use captures if not needed [[`f61d487`](https://github.com/PrismJS/prism/commit/f61d487)]\n- **C++**:\n    - Fix operator regexp + regexp simplification + don't use captures if not needed [[`ffeb26e`](https://github.com/PrismJS/prism/commit/ffeb26e)]\n- **C#**:\n    - Remove duplicates in keywords + regexp optimisation + don't use captures if not needed [[`d28d178`](https://github.com/PrismJS/prism/commit/d28d178)]\n- **C-like**:\n    - Regexp simplification + don't use captures if not needed [[`918e0ff`](https://github.com/PrismJS/prism/commit/918e0ff)]\n- **CoffeeScript**:\n    - Regexp optimisation + don't use captures if not needed [[`5895978`](https://github.com/PrismJS/prism/commit/5895978)]\n- **Crystal**:\n    - Remove trailing comma [[`16979a3`](https://github.com/PrismJS/prism/commit/16979a3)]\n- **CSS**:\n    - Regexp simplification + don't use captures if not needed + handle multi-line style attributes [[`43d9f36`](https://github.com/PrismJS/prism/commit/43d9f36)]\n- **CSS Extras**:\n    - Regexp simplification [[`134ed70`](https://github.com/PrismJS/prism/commit/134ed70)]\n- **D**:\n    - Regexp optimisation [[`fbe39c9`](https://github.com/PrismJS/prism/commit/fbe39c9)]\n- **Dart**:\n    - Regexp optimisation [[`f24e919`](https://github.com/PrismJS/prism/commit/f24e919)]\n- **Django**:\n    - Regexp optimisation [[`a95c51d`](https://github.com/PrismJS/prism/commit/a95c51d)]\n- **Docker**:\n    - Regexp optimisation [[`27f99ff`](https://github.com/PrismJS/prism/commit/27f99ff)]\n- **Eiffel**:\n    - Regexp optimisation [[`b7cdea2`](https://github.com/PrismJS/prism/commit/b7cdea2)]\n- **Elixir**:\n    - Regexp optimisation + uniform behavior between ~r and ~s [[`5d12e80`](https://github.com/PrismJS/prism/commit/5d12e80)]\n- **Erlang**:\n    - Regexp optimisation [[`7547f83`](https://github.com/PrismJS/prism/commit/7547f83)]\n- **F#**:\n    - Regexp optimisation + don't use captures if not needed [[`7753fc4`](https://github.com/PrismJS/prism/commit/7753fc4)]\n- **Gherkin**:\n    - Regexp optimisation + don't use captures if not needed + added explanation comment on table-body regexp [[`f26197a`](https://github.com/PrismJS/prism/commit/f26197a)]\n- **Git**:\n    - Regexp optimisation [[`b9483b9`](https://github.com/PrismJS/prism/commit/b9483b9)]\n- **GLSL**:\n    - Regexp optimisation [[`e66d21b`](https://github.com/PrismJS/prism/commit/e66d21b)]\n- **Go**:\n    - Regexp optimisation + don't use captures if not needed [[`88caabb`](https://github.com/PrismJS/prism/commit/88caabb)]\n- **GraphQL**:\n    - Regexp optimisation and simplification [[`2474f06`](https://github.com/PrismJS/prism/commit/2474f06)]\n- **Groovy**:\n    - Regexp optimisation + don't use captures if not needed [[`e74e00c`](https://github.com/PrismJS/prism/commit/e74e00c)]\n- **Haml**:\n    - Regexp optimisation + don't use captures if not needed + fix typo in comment [[`23e3b43`](https://github.com/PrismJS/prism/commit/23e3b43)]\n- **Handlebars**:\n    - Regexp optimisation + don't use captures if not needed [[`09dbfce`](https://github.com/PrismJS/prism/commit/09dbfce)]\n- **Haskell**:\n    - Regexp simplification + don't use captures if not needed [[`f11390a`](https://github.com/PrismJS/prism/commit/f11390a)]\n- **HTTP**:\n    - Regexp simplification + don't use captures if not needed [[`37ef24e`](https://github.com/PrismJS/prism/commit/37ef24e)]\n- **Icon**:\n    - Regexp optimisation [[`9cf64a0`](https://github.com/PrismJS/prism/commit/9cf64a0)]\n- **J**:\n    - Regexp simplification [[`de15150`](https://github.com/PrismJS/prism/commit/de15150)]\n- **Java**:\n    - Don't use captures if not needed [[`96b35c8`](https://github.com/PrismJS/prism/commit/96b35c8)]\n- **JavaScript**:\n    - Regexp optimisation + don't use captures if not needed [[`93d4002`](https://github.com/PrismJS/prism/commit/93d4002)]\n- **Jolie**:\n    - Regexp optimisation + don't use captures if not needed + remove duplicates in keywords [[`a491f9e`](https://github.com/PrismJS/prism/commit/a491f9e)]\n- **JSON**:\n    - Make strings greedy, remove negative look-ahead for \":\". Fix [#1204](https://github.com/PrismJS/prism/issues/1204) [[`98acd2d`](https://github.com/PrismJS/prism/commit/98acd2d)]\n    - Regexp optimisation + don't use captures if not needed [[`8fc1b03`](https://github.com/PrismJS/prism/commit/8fc1b03)]\n- **JSX**:\n    - Regexp optimisation + handle spread operator as a whole [[`28de4e2`](https://github.com/PrismJS/prism/commit/28de4e2)]\n- **Julia**:\n    - Regexp optimisation and simplification [[`12684c0`](https://github.com/PrismJS/prism/commit/12684c0)]\n- **Keyman**:\n    - Regexp optimisation + don't use captures if not needed [[`9726087`](https://github.com/PrismJS/prism/commit/9726087)]\n- **Kotlin**:\n    - Regexp simplification [[`12ff8dc`](https://github.com/PrismJS/prism/commit/12ff8dc)]\n- **LaTeX**:\n    - Regexp optimisation and simplification [[`aa426b0`](https://github.com/PrismJS/prism/commit/aa426b0)]\n- **LiveScript**:\n    - Make interpolated strings greedy + fix variable and identifier regexps [[`c581049`](https://github.com/PrismJS/prism/commit/c581049)]\n- **LOLCODE**:\n    - Don't use captures if not needed [[`52903af`](https://github.com/PrismJS/prism/commit/52903af)]\n- **Makefile**:\n    - Regexp optimisation [[`20ae2e5`](https://github.com/PrismJS/prism/commit/20ae2e5)]\n- **Markdown**:\n    - Don't use captures if not needed [[`f489a1e`](https://github.com/PrismJS/prism/commit/f489a1e)]\n- **Markup**:\n    - Regexp optimisation + fix punctuation inside attr-value [[`ea380c6`](https://github.com/PrismJS/prism/commit/ea380c6)]\n- **MATLAB**:\n    - Make strings greedy + handle line feeds better [[`4cd4f01`](https://github.com/PrismJS/prism/commit/4cd4f01)]\n- **Monkey**:\n    - Don't use captures if not needed [[`7f47140`](https://github.com/PrismJS/prism/commit/7f47140)]\n- **N4JS**:\n    - Don't use captures if not needed [[`2d3f9df`](https://github.com/PrismJS/prism/commit/2d3f9df)]\n- **NASM**:\n    - Regexp optimisation and simplification + don't use captures if not needed [[`9937428`](https://github.com/PrismJS/prism/commit/9937428)]\n- **nginx**:\n    - Remove trailing comma + remove duplicates in keywords [[`c6e7195`](https://github.com/PrismJS/prism/commit/c6e7195)]\n- **NSIS**:\n    - Regexp optimisation + don't use captures if not needed [[`beeb107`](https://github.com/PrismJS/prism/commit/beeb107)]\n- **Objective-C**:\n    - Don't use captures if not needed [[`9be0f88`](https://github.com/PrismJS/prism/commit/9be0f88)]\n- **OCaml**:\n    - Regexp simplification [[`5f5f38c`](https://github.com/PrismJS/prism/commit/5f5f38c)]\n- **OpenCL**:\n    - Don't use captures if not needed [[`5e70f1d`](https://github.com/PrismJS/prism/commit/5e70f1d)]\n- **Oz**:\n    - Fix atom regexp [[`9320e92`](https://github.com/PrismJS/prism/commit/9320e92)]\n- **PARI/GP**:\n    - Regexp optimisation [[`2c7b59b`](https://github.com/PrismJS/prism/commit/2c7b59b)]\n- **Parser**:\n    - Regexp simplification [[`569d511`](https://github.com/PrismJS/prism/commit/569d511)]\n- **Perl**:\n    - Regexp optimisation and simplification + don't use captures if not needed [[`0fe4cf6`](https://github.com/PrismJS/prism/commit/0fe4cf6)]\n- **PHP**:\n    - Don't use captures if not needed Golmote [[`5235f18`](https://github.com/PrismJS/prism/commit/5235f18)]\n- **PHP Extras**:\n    - Add word boundary after global keywords + don't use captures if not needed [[`9049a2a`](https://github.com/PrismJS/prism/commit/9049a2a)]\n- **PowerShell**:\n    - Regexp optimisation + don't use captures if not needed [[`0d05957`](https://github.com/PrismJS/prism/commit/0d05957)]\n- **Processing**:\n    - Regexp simplification [[`8110d38`](https://github.com/PrismJS/prism/commit/8110d38)]\n- **.properties**:\n    - Regexp optimisation [[`678b621`](https://github.com/PrismJS/prism/commit/678b621)]\n- **Protocol Buffers**:\n    - Don't use captures if not needed [[`3e256d8`](https://github.com/PrismJS/prism/commit/3e256d8)]\n- **Pug**:\n    - Don't use captures if not needed [[`76dc925`](https://github.com/PrismJS/prism/commit/76dc925)]\n- **Pure**:\n    - Make inline-lang greedy [[`92318b0`](https://github.com/PrismJS/prism/commit/92318b0)]\n- **Python**:\n    - Add Python builtin function highlighting ([#1205](https://github.com/PrismJS/prism/issues/1205)) [[`2169c99`](https://github.com/PrismJS/prism/commit/2169c99)]\n    - Python: Add highlighting to functions with space between name and parentheses ([#1207](https://github.com/PrismJS/prism/issues/1207)) [[`3badd8a`](https://github.com/PrismJS/prism/commit/3badd8a)]\n    - Make triple-quoted strings greedy + regexp optimisation and simplification [[`f09f9f5`](https://github.com/PrismJS/prism/commit/f09f9f5)]\n- **Qore**:\n    - Regexp simplification [[`69459f0`](https://github.com/PrismJS/prism/commit/69459f0)]\n- **R**:\n    - Regexp optimisation [[`06a9da4`](https://github.com/PrismJS/prism/commit/06a9da4)]\n- **Reason**:\n    - Regexp optimisation + don't use capture if not needed [[`19d79b4`](https://github.com/PrismJS/prism/commit/19d79b4)]\n- **Ren'py**:\n    - Make strings greedy + don't use captures if not needed [[`91d84d9`](https://github.com/PrismJS/prism/commit/91d84d9)]\n- **reST**:\n    - Regexp simplification + don't use captures if not needed [[`1a8b3e9`](https://github.com/PrismJS/prism/commit/1a8b3e9)]\n- **Rip**:\n    - Regexp optimisation [[`d7f0ee8`](https://github.com/PrismJS/prism/commit/d7f0ee8)]\n- **Ruby**:\n    - Regexp optimisation and simplification + don't use captures if not needed [[`4902ed4`](https://github.com/PrismJS/prism/commit/4902ed4)]\n- **Rust**:\n    - Regexp optimisation and simplification + don't use captures if not needed [[`cc9d874`](https://github.com/PrismJS/prism/commit/cc9d874)]\n- **Sass**:\n    - Regexp simplification Golmote [[`165d957`](https://github.com/PrismJS/prism/commit/165d957)]\n- **Scala**:\n    - Regexp optimisation Golmote [[`5f50c12`](https://github.com/PrismJS/prism/commit/5f50c12)]\n- **Scheme**:\n    - Regexp optimisation [[`bd19b04`](https://github.com/PrismJS/prism/commit/bd19b04)]\n- **SCSS**:\n    - Regexp simplification [[`c60b7d4`](https://github.com/PrismJS/prism/commit/c60b7d4)]\n- **Smalltalk**:\n    - Regexp simplification [[`41a2c76`](https://github.com/PrismJS/prism/commit/41a2c76)]\n- **Smarty**:\n    - Regexp optimisation and simplification [[`e169be9`](https://github.com/PrismJS/prism/commit/e169be9)]\n- **SQL**:\n    - Regexp optimisation [[`a6244a4`](https://github.com/PrismJS/prism/commit/a6244a4)]\n- **Stylus**:\n    - Regexp optimisation [[`df9506c`](https://github.com/PrismJS/prism/commit/df9506c)]\n- **Swift**:\n    - Don't use captures if not needed [[`a2d737a`](https://github.com/PrismJS/prism/commit/a2d737a)]\n- **Tcl**:\n    - Regexp simplification + don't use captures if not needed [[`f0b8a33`](https://github.com/PrismJS/prism/commit/f0b8a33)]\n- **Textile**:\n    - Regexp optimisation + don't use captures if not needed [[`08139ad`](https://github.com/PrismJS/prism/commit/08139ad)]\n- **Twig**:\n    - Regexp optimisation and simplification + don't use captures if not needed [[`0b10fd0`](https://github.com/PrismJS/prism/commit/0b10fd0)]\n- **TypeScript**:\n    - Don't use captures if not needed [[`e296caf`](https://github.com/PrismJS/prism/commit/e296caf)]\n- **Verilog**:\n    - Regexp simplification [[`1b24b34`](https://github.com/PrismJS/prism/commit/1b24b34)]\n- **VHDL**:\n    - Regexp optimisation and simplification [[`7af36df`](https://github.com/PrismJS/prism/commit/7af36df)]\n- **vim**:\n    - Remove duplicates in keywords [[`700505e`](https://github.com/PrismJS/prism/commit/700505e)]\n- **Wiki markup**:\n    - Fix escaping consistency [[`1fd690d`](https://github.com/PrismJS/prism/commit/1fd690d)]\n- **YAML**:\n    - Regexp optimisation + don't use captures if not needed [[`1fd690d`](https://github.com/PrismJS/prism/commit/1fd690d)]\n\n### Other changes\n\n- Remove comments spellcheck for AMP validation ([#1106](https://github.com/PrismJS/prism/issues/1106)) [[`de996d7`](https://github.com/PrismJS/prism/commit/de996d7)]\n- Prevent error from throwing when element does not have a parentNode in highlightElement. [[`c33be19`](https://github.com/PrismJS/prism/commit/c33be19)]\n- Provide a way to load Prism from inside a Worker without listening to messages. ([#1188](https://github.com/PrismJS/prism/issues/1188)) [[`d09982d`](https://github.com/PrismJS/prism/commit/d09982d)]\n\n## 1.8.3 (2017-10-19)\n\n### Other changes\n\n- Fix inclusion tests for Pug [[`955c2ab`](https://github.com/PrismJS/prism/commit/955c2ab)]\n\n## 1.8.2 (2017-10-19)\n\n### Updated components\n\n- **Jade**:\n    - Jade has been renamed to **Pug** ([#1201](https://github.com/PrismJS/prism/issues/1201)) [[`bcfef7c`](https://github.com/PrismJS/prism/commit/bcfef7c)]\n- **JavaScript**:\n    - Better highlighting of functions ([#1190](https://github.com/PrismJS/prism/issues/1190)) [[`8ee2cd3`](https://github.com/PrismJS/prism/commit/8ee2cd3)]\n\n### Update plugins\n\n- **Copy to clipboard**:\n    - Fix error occurring when using in Chrome 61+ ([#1206](https://github.com/PrismJS/prism/issues/1206)) [[`b41d571`](https://github.com/PrismJS/prism/commit/b41d571)]\n- **Show invisibles**:\n    - Prevent error when using with Autoloader plugin ([#1195](https://github.com/PrismJS/prism/issues/1195)) [[`ed8bdb5`](https://github.com/PrismJS/prism/commit/ed8bdb5)]\n\n## 1.8.1 (2017-09-16)\n\n### Other changes\n\n- Add Arduino to components.js [[`290a3c6`](https://github.com/PrismJS/prism/commit/290a3c6)]\n\n## 1.8.0 (2017-09-16)\n\n### New components\n\n- **Arduino** ([#1184](https://github.com/PrismJS/prism/issues/1184)) [[`edf2454`](https://github.com/PrismJS/prism/commit/edf2454)]\n- **OpenCL** ([#1175](https://github.com/PrismJS/prism/issues/1175)) [[`131e8fa`](https://github.com/PrismJS/prism/commit/131e8fa)]\n\n### Updated plugins\n\n- **Autolinker**:\n    - Silently catch any error thrown by decodeURIComponent. Fixes [#1186](https://github.com/PrismJS/prism/issues/1186) [[`2e43fcf`](https://github.com/PrismJS/prism/commit/2e43fcf)]\n\n## 1.7.0 (2017-09-09)\n\n### New components\n\n- **Django/Jinja2** ([#1085](https://github.com/PrismJS/prism/issues/1085)) [[`345b1b2`](https://github.com/PrismJS/prism/commit/345b1b2)]\n- **N4JS** ([#1141](https://github.com/PrismJS/prism/issues/1141)) [[`eaa8ebb`](https://github.com/PrismJS/prism/commit/eaa8ebb)]\n- **Ren'py** ([#658](https://github.com/PrismJS/prism/issues/658)) [[`7ab4013`](https://github.com/PrismJS/prism/commit/7ab4013)]\n- **VB.Net** ([#1122](https://github.com/PrismJS/prism/issues/1122)) [[`5400651`](https://github.com/PrismJS/prism/commit/5400651)]\n\n### Updated components\n\n- **APL**:\n    - Add left shoe underbar and right shoe underbar ([#1072](https://github.com/PrismJS/prism/issues/1072)) [[`12238c5`](https://github.com/PrismJS/prism/commit/12238c5)]\n    - Update prism-apl.js ([#1126](https://github.com/PrismJS/prism/issues/1126)) [[`a5f3cdb`](https://github.com/PrismJS/prism/commit/a5f3cdb)]\n- **C**:\n    - Add more keywords and constants for C. ([#1029](https://github.com/PrismJS/prism/issues/1029)) [[`43a388e`](https://github.com/PrismJS/prism/commit/43a388e)]\n- **C#**:\n    - Fix wrong highlighting when three slashes appear inside string. Fix [#1091](https://github.com/PrismJS/prism/issues/1091) [[`dfb6f17`](https://github.com/PrismJS/prism/commit/dfb6f17)]\n- **C-like**:\n    - Add support for unclosed block comments. Close [#828](https://github.com/PrismJS/prism/issues/828) [[`3426ed1`](https://github.com/PrismJS/prism/commit/3426ed1)]\n- **Crystal**:\n    - Update Crystal keywords ([#1092](https://github.com/PrismJS/prism/issues/1092)) [[`125bff1`](https://github.com/PrismJS/prism/commit/125bff1)]\n- **CSS Extras**:\n    - Support CSS #RRGGBBAA ([#1139](https://github.com/PrismJS/prism/issues/1139)) [[`07a6806`](https://github.com/PrismJS/prism/commit/07a6806)]\n- **Docker**:\n    - Add dockerfile alias for docker language ([#1164](https://github.com/PrismJS/prism/issues/1164)) [[`601c47f`](https://github.com/PrismJS/prism/commit/601c47f)]\n    - Update the list of keywords for dockerfiles ([#1180](https://github.com/PrismJS/prism/issues/1180)) [[`f0d73e0`](https://github.com/PrismJS/prism/commit/f0d73e0)]\n- **Eiffel**:\n    - Add class-name highlighting for Eiffel ([#471](https://github.com/PrismJS/prism/issues/471)) [[`cd03587`](https://github.com/PrismJS/prism/commit/cd03587)]\n- **Handlebars**:\n    - Check for possible pre-existing marker strings in Handlebars [[`7a1a404`](https://github.com/PrismJS/prism/commit/7a1a404)]\n- **JavaScript**:\n    - Properly match every operator as a whole token. Fix [#1133](https://github.com/PrismJS/prism/issues/1133) [[`9f649fb`](https://github.com/PrismJS/prism/commit/9f649fb)]\n    - Allows uppercase prefixes in JS number literals ([#1151](https://github.com/PrismJS/prism/issues/1151)) [[`d4ee904`](https://github.com/PrismJS/prism/commit/d4ee904)]\n    - Reduced backtracking in regex pattern. Fix [#1159](https://github.com/PrismJS/prism/issues/1159) [[`ac09e97`](https://github.com/PrismJS/prism/commit/ac09e97)]\n- **JSON**:\n    - Fix property and string patterns performance. Fix [#1080](https://github.com/PrismJS/prism/issues/1080) [[`0ca1353`](https://github.com/PrismJS/prism/commit/0ca1353)]\n- **JSX**:\n    - JSX spread operator break. Fixes [#1061](https://github.com/PrismJS/prism/issues/1061) ([#1094](https://github.com/PrismJS/prism/issues/1094)) [[`561bceb`](https://github.com/PrismJS/prism/commit/561bceb)]\n    - Fix highlighting of attributes containing spaces [[`867ea42`](https://github.com/PrismJS/prism/commit/867ea42)]\n    - Improved performance for tags (when not matching) Fix [#1152](https://github.com/PrismJS/prism/issues/1152) [[`b0fe103`](https://github.com/PrismJS/prism/commit/b0fe103)]\n- **LOLCODE**:\n    - Make strings greedy Golmote [[`1a5e7a4`](https://github.com/PrismJS/prism/commit/1a5e7a4)]\n- **Markup**:\n    - Support HTML entities in attribute values ([#1143](https://github.com/PrismJS/prism/issues/1143)) [[`1d5047d`](https://github.com/PrismJS/prism/commit/1d5047d)]\n- **NSIS**:\n    - Update patterns ([#1033](https://github.com/PrismJS/prism/issues/1033)) [[`01a59d8`](https://github.com/PrismJS/prism/commit/01a59d8)]\n    - Add support for NSIS 3.02 ([#1169](https://github.com/PrismJS/prism/issues/1169)) [[`393b5f7`](https://github.com/PrismJS/prism/commit/393b5f7)]\n- **PHP**:\n    - Fix the PHP language ([#1100](https://github.com/PrismJS/prism/issues/1100)) [[`1453fa7`](https://github.com/PrismJS/prism/commit/1453fa7)]\n    - Check for possible pre-existing marker strings in PHP [[`36bc560`](https://github.com/PrismJS/prism/commit/36bc560)]\n- **Ruby**:\n    - Fix slash regex performance. Fix [#1083](https://github.com/PrismJS/prism/issues/1083) [[`a708730`](https://github.com/PrismJS/prism/commit/a708730)]\n    - Add support for =begin =end comments. Manual merge of [#1121](https://github.com/PrismJS/prism/issues/1121). [[`62cdaf8`](https://github.com/PrismJS/prism/commit/62cdaf8)]\n- **Smarty**:\n    - Check for possible pre-existing marker strings in Smarty [[`5df26e2`](https://github.com/PrismJS/prism/commit/5df26e2)]\n- **TypeScript**:\n    - Update typescript keywords ([#1064](https://github.com/PrismJS/prism/issues/1064)) [[`52020a0`](https://github.com/PrismJS/prism/commit/52020a0)]\n    - Chmod -x prism-typescript component ([#1145](https://github.com/PrismJS/prism/issues/1145)) [[`afe0542`](https://github.com/PrismJS/prism/commit/afe0542)]\n- **YAML**:\n    - Make strings greedy (partial fix for [#1075](https://github.com/PrismJS/prism/issues/1075)) [[`565a2cc`](https://github.com/PrismJS/prism/commit/565a2cc)]\n\n### Updated plugins\n\n- **Autolinker**:\n    - Fixed an rendering issue for encoded urls ([#1173](https://github.com/PrismJS/prism/issues/1173)) [[`abc007f`](https://github.com/PrismJS/prism/commit/abc007f)]\n- **Custom Class**:\n    - Add missing noCSS property for the Custom Class plugin [[`ba64f8d`](https://github.com/PrismJS/prism/commit/ba64f8d)]\n    - Added a default for classMap. Fixes [#1137](https://github.com/PrismJS/prism/issues/1137). ([#1157](https://github.com/PrismJS/prism/issues/1157)) [[`5400af9`](https://github.com/PrismJS/prism/commit/5400af9)]\n- **Keep Markup**:\n    - Store highlightedCode after reinserting markup. Fix [#1127](https://github.com/PrismJS/prism/issues/1127) [[`6df2ceb`](https://github.com/PrismJS/prism/commit/6df2ceb)]\n- **Line Highlight**:\n    - Cleanup left-over line-highlight tags before other plugins run [[`79b723d`](https://github.com/PrismJS/prism/commit/79b723d)]\n    - Avoid conflict between line-highlight and other plugins [[`224fdb8`](https://github.com/PrismJS/prism/commit/224fdb8)]\n- **Line Numbers**:\n    - Support soft wrap for line numbers plugin ([#584](https://github.com/PrismJS/prism/issues/584)) [[`849f1d6`](https://github.com/PrismJS/prism/commit/849f1d6)]\n    - Plugins fixes (unescaped-markup, line-numbers) ([#1012](https://github.com/PrismJS/prism/issues/1012)) [[`3fb7cf8`](https://github.com/PrismJS/prism/commit/3fb7cf8)]\n- **Normalize Whitespace**:\n    - Add Node.js support for the normalize-whitespace plugin [[`6c7dae2`](https://github.com/PrismJS/prism/commit/6c7dae2)]\n- **Unescaped Markup**:\n    - Plugins fixes (unescaped-markup, line-numbers) ([#1012](https://github.com/PrismJS/prism/issues/1012)) [[`3fb7cf8`](https://github.com/PrismJS/prism/commit/3fb7cf8)]\n\n### Updated themes\n\n- **Coy**:\n    - Scroll 'Coy' background with contents ([#1163](https://github.com/PrismJS/prism/issues/1163)) [[`310990b`](https://github.com/PrismJS/prism/commit/310990b)]\n\n### Other changes\n\n- Initial implementation of manual highlighting ([#1087](https://github.com/PrismJS/prism/issues/1087)) [[`bafc4cb`](https://github.com/PrismJS/prism/commit/bafc4cb)]\n- Remove dead link in Third-party tutorials section. Fixes [#1028](https://github.com/PrismJS/prism/issues/1028) [[`dffadc6`](https://github.com/PrismJS/prism/commit/dffadc6)]\n- Most languages now use the greedy flag for better highlighting [[`7549ecc`](https://github.com/PrismJS/prism/commit/7549ecc)]\n- .npmignore: Unignore components.js ([#1108](https://github.com/PrismJS/prism/issues/1108)) [[`1f699e7`](https://github.com/PrismJS/prism/commit/1f699e7)]\n- Run before-highlight and after-highlight hooks even when no grammar is found. Fix [#1134](https://github.com/PrismJS/prism/issues/1134) [[`70cb472`](https://github.com/PrismJS/prism/commit/70cb472)]\n- Replace [\\w\\W] with [\\s\\S] and [0-9] with \\d in regexes ([#1107](https://github.com/PrismJS/prism/issues/1107)) [[`8aa2cc4`](https://github.com/PrismJS/prism/commit/8aa2cc4)]\n- Fix corner cases for the greedy flag ([#1095](https://github.com/PrismJS/prism/issues/1095)) [[`6530709`](https://github.com/PrismJS/prism/commit/6530709)]\n- Add Third Party Tutorial ([#1156](https://github.com/PrismJS/prism/issues/1156)) [[`c34e57b`](https://github.com/PrismJS/prism/commit/c34e57b)]\n- Add Composer support ([#648](https://github.com/PrismJS/prism/issues/648)) [[`2989633`](https://github.com/PrismJS/prism/commit/2989633)]\n- Remove IE8 plugin ([#992](https://github.com/PrismJS/prism/issues/992)) [[`25788eb`](https://github.com/PrismJS/prism/commit/25788eb)]\n- Website: remove width and height on logo.svg, so it becomes scalable. Close [#1005](https://github.com/PrismJS/prism/issues/1005) [[`0621ff7`](https://github.com/PrismJS/prism/commit/0621ff7)]\n- Remove yarn.lock ([#1098](https://github.com/PrismJS/prism/issues/1098)) [[`11eed25`](https://github.com/PrismJS/prism/commit/11eed25)]\n\n## 1.6.0 (2016-12-03)\n\n### New components\n\n- **.properties** ([#980](https://github.com/PrismJS/prism/issues/980)) [[`be6219a`](https://github.com/PrismJS/prism/commit/be6219a)]\n- **Ada** ([#949](https://github.com/PrismJS/prism/issues/949)) [[`65619f7`](https://github.com/PrismJS/prism/commit/65619f7)]\n- **GraphQL** ([#971](https://github.com/PrismJS/prism/issues/971)) [[`e018087`](https://github.com/PrismJS/prism/commit/e018087)]\n- **Jolie** ([#1014](https://github.com/PrismJS/prism/issues/1014)) [[`dfc1941`](https://github.com/PrismJS/prism/commit/dfc1941)]\n- **LiveScript** ([#982](https://github.com/PrismJS/prism/issues/982)) [[`62e258c`](https://github.com/PrismJS/prism/commit/62e258c)]\n- **Reason** (Fixes [#1046](https://github.com/PrismJS/prism/issues/1046)) [[`3cae6ce`](https://github.com/PrismJS/prism/commit/3cae6ce)]\n- **Xojo** ([#994](https://github.com/PrismJS/prism/issues/994)) [[`0224b7c`](https://github.com/PrismJS/prism/commit/0224b7c)]\n\n### Updated components\n\n- **APL**:\n    - Add iota underbar ([#1024](https://github.com/PrismJS/prism/issues/1024)) [[`3c5c89a`](https://github.com/PrismJS/prism/commit/3c5c89a), [`ac21d33`](https://github.com/PrismJS/prism/commit/ac21d33)]\n- **AsciiDoc**:\n    - Optimized block regexps to prevent struggling on large files. Fixes [#1001](https://github.com/PrismJS/prism/issues/1001). [[`1a86d34`](https://github.com/PrismJS/prism/commit/1a86d34)]\n- **Bash**:\n    - Add `npm` to function list ([#969](https://github.com/PrismJS/prism/issues/969)) [[`912bdfe`](https://github.com/PrismJS/prism/commit/912bdfe)]\n- **CSS**:\n    - Make CSS strings greedy. Fix [#1013](https://github.com/PrismJS/prism/issues/1013). [[`e57e26d`](https://github.com/PrismJS/prism/commit/e57e26d)]\n- **CSS Extras**:\n    - Match attribute inside selectors [[`13fed76`](https://github.com/PrismJS/prism/commit/13fed76)]\n- **Groovy**:\n    - Fix order of decoding entities in groovy. Fixes [#1049](https://github.com/PrismJS/prism/issues/1049) ([#1050](https://github.com/PrismJS/prism/issues/1050)) [[`d75da8e`](https://github.com/PrismJS/prism/commit/d75da8e)]\n- **Ini**:\n    - Remove important token in ini definition ([#1047](https://github.com/PrismJS/prism/issues/1047)) [[`fe8ad8b`](https://github.com/PrismJS/prism/commit/fe8ad8b)]\n- **JavaScript**:\n    - Add exponentiation & spread/rest operator ([#991](https://github.com/PrismJS/prism/issues/991)) [[`b2de65a`](https://github.com/PrismJS/prism/commit/b2de65a), [`268d01e`](https://github.com/PrismJS/prism/commit/268d01e)]\n- **JSON**:\n    - JSON: Fixed issues with properties and strings + added tests. Fix [#1025](https://github.com/PrismJS/prism/issues/1025) [[`25a541d`](https://github.com/PrismJS/prism/commit/25a541d)]\n- **Markup**:\n    - Allow for dots in Markup tag names, but not in HTML tags included in Textile. Fixes [#888](https://github.com/PrismJS/prism/issues/888). [[`31ea66b`](https://github.com/PrismJS/prism/commit/31ea66b)]\n    - Make doctype case-insensitive ([#1009](https://github.com/PrismJS/prism/issues/1009)) [[`3dd7219`](https://github.com/PrismJS/prism/commit/3dd7219)]\n- **NSIS**:\n    - Updated patterns ([#1032](https://github.com/PrismJS/prism/issues/1032)) [[`76ba1b8`](https://github.com/PrismJS/prism/commit/76ba1b8)]\n- **PHP**:\n    - Make comments greedy. Fix [#197](https://github.com/PrismJS/prism/issues/197) [[`318aab3`](https://github.com/PrismJS/prism/commit/318aab3)]\n- **PowerShell**:\n    - Fix highlighting of empty comments ([#977](https://github.com/PrismJS/prism/issues/977)) [[`4fda477`](https://github.com/PrismJS/prism/commit/4fda477)]\n- **Puppet**:\n    - Fix over-greedy regexp detection ([#978](https://github.com/PrismJS/prism/issues/978)) [[`105be25`](https://github.com/PrismJS/prism/commit/105be25)]\n- **Ruby**:\n    - Fix typo `Fload` to `Float` in prism-ruby.js ([#1023](https://github.com/PrismJS/prism/issues/1023)) [[`22cb018`](https://github.com/PrismJS/prism/commit/22cb018)]\n    - Make strings greedy. Fixes [#1048](https://github.com/PrismJS/prism/issues/1048) [[`8b0520a`](https://github.com/PrismJS/prism/commit/8b0520a)]\n- **SCSS**:\n    - Alias statement as keyword. Fix [#246](https://github.com/PrismJS/prism/issues/246) [[`fd09391`](https://github.com/PrismJS/prism/commit/fd09391)]\n    - Highlight variables inside selectors and properties. [[`d6b5c2f`](https://github.com/PrismJS/prism/commit/d6b5c2f)]\n    - Highlight parent selector [[`8f5f1fa`](https://github.com/PrismJS/prism/commit/8f5f1fa)]\n- **TypeScript**:\n    - Add missing `from` keyword to typescript & set `ts` as alias. ([#1042](https://github.com/PrismJS/prism/issues/1042)) [[`cba78f3`](https://github.com/PrismJS/prism/commit/cba78f3)]\n\n### New plugins\n\n- **Copy to Clipboard** ([#891](https://github.com/PrismJS/prism/issues/891)) [[`07b81ac`](https://github.com/PrismJS/prism/commit/07b81ac)]\n- **Custom Class** ([#950](https://github.com/PrismJS/prism/issues/950)) [[`a0bd686`](https://github.com/PrismJS/prism/commit/a0bd686)]\n- **Data-URI Highlight** ([#996](https://github.com/PrismJS/prism/issues/996)) [[`bdca61b`](https://github.com/PrismJS/prism/commit/bdca61b)]\n- **Toolbar** ([#891](https://github.com/PrismJS/prism/issues/891)) [[`07b81ac`](https://github.com/PrismJS/prism/commit/07b81ac)]\n\n### Updated plugins\n\n- **Autoloader**:\n    - Updated documentation for Autoloader plugin [[`b4f3423`](https://github.com/PrismJS/prism/commit/b4f3423)]\n        - Download all grammars as a zip from Autoloader plugin page ([#981](https://github.com/PrismJS/prism/issues/981)) [[`0d0a007`](https://github.com/PrismJS/prism/commit/0d0a007), [`5c815d3`](https://github.com/PrismJS/prism/commit/5c815d3)]\n        - Removed duplicated script on Autoloader plugin page [[`9671996`](https://github.com/PrismJS/prism/commit/9671996)]\n        - Don't try to load \"none\" component. Fix [#1000](https://github.com/PrismJS/prism/issues/1000) [[`f89b0b9`](https://github.com/PrismJS/prism/commit/f89b0b9)]\n- **WPD**:\n    - Fix at-rule detection + don't process if language is not handled [[`2626728`](https://github.com/PrismJS/prism/commit/2626728)]\n\n### Other changes\n\n- Improvement to greedy-flag ([#967](https://github.com/PrismJS/prism/issues/967)) [[`500121b`](https://github.com/PrismJS/prism/commit/500121b), [`9893489`](https://github.com/PrismJS/prism/commit/9893489)]\n- Add setTimeout fallback for requestAnimationFrame. Fixes [#987](https://github.com/PrismJS/prism/issues/987). ([#988](https://github.com/PrismJS/prism/issues/988)) [[`c9bdcd3`](https://github.com/PrismJS/prism/commit/c9bdcd3)]\n- Added aria-hidden attributes on elements created by the Line Highlight and Line Numbers plugins. Fixes [#574](https://github.com/PrismJS/prism/issues/574). [[`e5587a7`](https://github.com/PrismJS/prism/commit/e5587a7)]\n- Don't insert space before \">\" when there is no attributes [[`3dc8c9e`](https://github.com/PrismJS/prism/commit/3dc8c9e)]\n- Added missing hooks-related tests for AsciiDoc, Groovy, Handlebars, Markup, PHP and Smarty [[`c1a0c1b`](https://github.com/PrismJS/prism/commit/c1a0c1b)]\n- Fix issue when using Line numbers plugin and Normalise whitespace plugin together with Handlebars, PHP or Smarty. Fix [#1018](https://github.com/PrismJS/prism/issues/1018), [#997](https://github.com/PrismJS/prism/issues/997), [#935](https://github.com/PrismJS/prism/issues/935). Revert [#998](https://github.com/PrismJS/prism/issues/998). [[`86aa3d2`](https://github.com/PrismJS/prism/commit/86aa3d2)]\n- Optimized logo ([#990](https://github.com/PrismJS/prism/issues/990)) ([#1002](https://github.com/PrismJS/prism/issues/1002)) [[`f69e570`](https://github.com/PrismJS/prism/commit/f69e570), [`218fd25`](https://github.com/PrismJS/prism/commit/218fd25)]\n- Remove unneeded prefixed CSS ([#989](https://github.com/PrismJS/prism/issues/989)) [[`5e56833`](https://github.com/PrismJS/prism/commit/5e56833)]\n- Optimize images ([#1007](https://github.com/PrismJS/prism/issues/1007)) [[`b2fa6d5`](https://github.com/PrismJS/prism/commit/b2fa6d5)]\n- Add yarn.lock to .gitignore ([#1035](https://github.com/PrismJS/prism/issues/1035)) [[`03ecf74`](https://github.com/PrismJS/prism/commit/03ecf74)]\n- Fix greedy flag bug. Fixes [#1039](https://github.com/PrismJS/prism/issues/1039) [[`32cd99f`](https://github.com/PrismJS/prism/commit/32cd99f)]\n- Ruby: Fix test after [#1023](https://github.com/PrismJS/prism/issues/1023) [[`b15d43b`](https://github.com/PrismJS/prism/commit/b15d43b)]\n- Ini: Fix test after [#1047](https://github.com/PrismJS/prism/issues/1047) [[`25cdd3f`](https://github.com/PrismJS/prism/commit/25cdd3f)]\n- Reduce risk of XSS ([#1051](https://github.com/PrismJS/prism/issues/1051)) [[`17e33bc`](https://github.com/PrismJS/prism/commit/17e33bc)]\n- env.code can be modified by before-sanity-check hook even when using language-none. Fix [#1066](https://github.com/PrismJS/prism/issues/1066) [[`83bafbd`](https://github.com/PrismJS/prism/commit/83bafbd)]\n\n## 1.5.1 (2016-06-05)\n\n### Updated components\n\n- **Normalize Whitespace**:\n    - Add class that disables the normalize whitespace plugin [[`9385c54`](https://github.com/PrismJS/prism/commit/9385c54)]\n- **JavaScript Language**:\n    - Rearrange the `string` and `template-string` token in JavaScript [[`1158e46`](https://github.com/PrismJS/prism/commit/1158e46)]\n- **SQL Language**:\n    - add delimeter and delimeters keywords to sql ([#958](https://github.com/PrismJS/prism/pull/958)) [[`a9ef24e`](https://github.com/PrismJS/prism/commit/a9ef24e)]\n    - add AUTO_INCREMENT and DATE keywords to sql ([#954](https://github.com/PrismJS/prism/pull/954)) [[`caea2af`](https://github.com/PrismJS/prism/commit/caea2af)]\n- **Diff Language**:\n    - Highlight diff lines with only + or - ([#952](https://github.com/PrismJS/prism/pull/952)) [[`4d0526f`](https://github.com/PrismJS/prism/commit/4d0526f)]\n\n### Other changes\n\n- Allow for asynchronous loading of prism.js ([#959](https://github.com/PrismJS/prism/pull/959))\n- Use toLowerCase on language names ([#957](https://github.com/PrismJS/prism/pull/957)) [[`acd9508`](https://github.com/PrismJS/prism/commit/acd9508)]\n- link to index for basic usage - fixes [#945](https://github.com/PrismJS/prism/issues/945) ([#946](https://github.com/PrismJS/prism/pull/946)) [[`6c772d8`](https://github.com/PrismJS/prism/commit/6c772d8)]\n- Fixed monospace typo ([#953](https://github.com/PrismJS/prism/pull/953)) [[`e6c3498`](https://github.com/PrismJS/prism/commit/e6c3498)]\n\n## 1.5.0 (2016-05-01)\n\n### New components\n\n- **Bro Language** ([#925](https://github.com/PrismJS/prism/pull/925))\n- **Protocol Buffers Language** ([#938](https://github.com/PrismJS/prism/pull/938)) [[`ae4a4f2`](https://github.com/PrismJS/prism/commit/ae4a4f2)]\n\n### Updated components\n\n- **Keep Markup**:\n    - Fix Keep Markup plugin incorrect highlighting ([#880](https://github.com/PrismJS/prism/pull/880)) [[`24841ef`](https://github.com/PrismJS/prism/commit/24841ef)]\n- **Groovy Language**:\n    - Fix double HTML-encoding bug in Groovy language [[`24a0936`](https://github.com/PrismJS/prism/commit/24a0936)]\n- **Java Language**:\n    - Adding annotation token for Java ([#905](https://github.com/PrismJS/prism/pull/905)) [[`367ace6`](https://github.com/PrismJS/prism/commit/367ace6)]\n- **SAS Language**:\n    - Add missing keywords for SAS ([#922](https://github.com/PrismJS/prism/pull/922))\n- **YAML Language**:\n    - fix hilighting of YAML keys on first line of code block ([#943](https://github.com/PrismJS/prism/pull/943)) [[`f19db81`](https://github.com/PrismJS/prism/commit/f19db81)]\n- **C# Language**:\n    - Support for generic methods in csharp [[`6f75735`](https://github.com/PrismJS/prism/commit/6f75735)]\n\n### New plugins\n\n- **Unescaped Markup** [[`07d77e5`](https://github.com/PrismJS/prism/commit/07d77e5)]\n- **Normalize Whitespace** ([#847](https://github.com/PrismJS/prism/pull/847)) [[`e86ec01`](https://github.com/PrismJS/prism/commit/e86ec01)]\n\n### Other changes\n\n- Add JSPM support [[`ad048ab`](https://github.com/PrismJS/prism/commit/ad048ab)]\n- update linear-gradient syntax from `left` to `to right` [[`cd234dc`](https://github.com/PrismJS/prism/commit/cd234dc)]\n- Add after-property to allow ordering of plugins [[`224b7a1`](https://github.com/PrismJS/prism/commit/224b7a1)]\n- Partial solution for the \"Comment-like substrings\"-problem [[`2705c50`](https://github.com/PrismJS/prism/commit/2705c50)]\n- Add property 'aliasTitles' to components.js [[`54400fb`](https://github.com/PrismJS/prism/commit/54400fb)]\n- Add before-highlightall hook [[`70a8602`](https://github.com/PrismJS/prism/commit/70a8602)]\n- Fix catastrophic backtracking regex issues in JavaScript [[`ab65be2`](https://github.com/PrismJS/prism/commit/ab65be2)]\n\n## 1.4.1 (2016-02-03)\n\n### Other changes\n\n- Fix DFS bug in Prism core [[`b86c727`](https://github.com/PrismJS/prism/commit/b86c727)]\n\n## 1.4.0 (2016-02-03)\n\n### New components\n\n- **Solarized Light** ([#855](https://github.com/PrismJS/prism/pull/855)) [[`70846ba`](https://github.com/PrismJS/prism/commit/70846ba)]\n- **JSON** ([#370](https://github.com/PrismJS/prism/pull/370)) [[`ad2fcd0`](https://github.com/PrismJS/prism/commit/ad2fcd0)]\n\n### Updated components\n\n- **Show Language**:\n    - Remove data-language attribute ([#840](https://github.com/PrismJS/prism/pull/840)) [[`eb9a83c`](https://github.com/PrismJS/prism/commit/eb9a83c)]\n    - Allow custom label without a language mapping ([#837](https://github.com/PrismJS/prism/pull/837)) [[`7e74aef`](https://github.com/PrismJS/prism/commit/7e74aef)]\n- **JSX**:\n    - Better Nesting in JSX attributes ([#842](https://github.com/PrismJS/prism/pull/842)) [[`971dda7`](https://github.com/PrismJS/prism/commit/971dda7)]\n- **File Highlight**:\n    - Defer File Highlight until the full DOM has loaded. ([#844](https://github.com/PrismJS/prism/pull/844)) [[`6f995ef`](https://github.com/PrismJS/prism/commit/6f995ef)]\n- **Coy Theme**:\n    - Fix coy theme shadows ([#865](https://github.com/PrismJS/prism/pull/865)) [[`58d2337`](https://github.com/PrismJS/prism/commit/58d2337)]\n- **Show Invisibles**:\n    - Ensure show-invisibles compat with autoloader ([#874](https://github.com/PrismJS/prism/pull/874)) [[`c3cfb1f`](https://github.com/PrismJS/prism/commit/c3cfb1f)]\n    - Add support for the space character for the show-invisibles plugin ([#876](https://github.com/PrismJS/prism/pull/876)) [[`05442d3`](https://github.com/PrismJS/prism/commit/05442d3)]\n\n### New plugins\n\n- **Command Line** ([#831](https://github.com/PrismJS/prism/pull/831)) [[`8378906`](https://github.com/PrismJS/prism/commit/8378906)]\n\n### Other changes\n\n- Use document.currentScript instead of document.getElementsByTagName() [[`fa98743`](https://github.com/PrismJS/prism/commit/fa98743)]\n- Add prefix for Firefox selection and move prefixed rule first [[`6d54717`](https://github.com/PrismJS/prism/commit/6d54717)]\n- No background for `<code>` in `<pre>` [[`8c310bc`](https://github.com/PrismJS/prism/commit/8c310bc)]\n- Fixing to initial copyright year [[`69cbf7a`](https://github.com/PrismJS/prism/commit/69cbf7a)]\n- Simplify the “lang” regex [[`417f54a`](https://github.com/PrismJS/prism/commit/417f54a)]\n- Fix broken heading links [[`a7f9e62`](https://github.com/PrismJS/prism/commit/a7f9e62)]\n- Prevent infinite recursion in DFS [[`02894e1`](https://github.com/PrismJS/prism/commit/02894e1)]\n- Fix incorrect page title [[`544b56f`](https://github.com/PrismJS/prism/commit/544b56f)]\n- Link scss to webplatform wiki [[`08d979a`](https://github.com/PrismJS/prism/commit/08d979a)]\n- Revert white-space to normal when code is inline instead of in a pre [[`1a971b5`](https://github.com/PrismJS/prism/commit/1a971b5)]\n\n## 1.3.0 (2015-10-26)\n\n### New components\n\n- **AsciiDoc** ([#800](https://github.com/PrismJS/prism/issues/800)) [[`6803ca0`](https://github.com/PrismJS/prism/commit/6803ca0)]\n- **Haxe** ([#811](https://github.com/PrismJS/prism/issues/811)) [[`bd44341`](https://github.com/PrismJS/prism/commit/bd44341)]\n- **Icon** ([#803](https://github.com/PrismJS/prism/issues/803)) [[`b43c5f3`](https://github.com/PrismJS/prism/commit/b43c5f3)]\n- **Kotlin** ([#814](https://github.com/PrismJS/prism/issues/814)) [[`e8a31a5`](https://github.com/PrismJS/prism/commit/e8a31a5)]\n- **Lua** ([#804](https://github.com/PrismJS/prism/issues/804)) [[`a36bc4a`](https://github.com/PrismJS/prism/commit/a36bc4a)]\n- **Nix** ([#795](https://github.com/PrismJS/prism/issues/795)) [[`9b275c8`](https://github.com/PrismJS/prism/commit/9b275c8)]\n- **Oz** ([#805](https://github.com/PrismJS/prism/issues/805)) [[`388c53f`](https://github.com/PrismJS/prism/commit/388c53f)]\n- **PARI/GP** ([#802](https://github.com/PrismJS/prism/issues/802)) [[`253c035`](https://github.com/PrismJS/prism/commit/253c035)]\n- **Parser** ([#808](https://github.com/PrismJS/prism/issues/808)) [[`a953b3a`](https://github.com/PrismJS/prism/commit/a953b3a)]\n- **Puppet** ([#813](https://github.com/PrismJS/prism/issues/813)) [[`81933ee`](https://github.com/PrismJS/prism/commit/81933ee)]\n- **Roboconf** ([#812](https://github.com/PrismJS/prism/issues/812)) [[`f5db346`](https://github.com/PrismJS/prism/commit/f5db346)]\n\n### Updated components\n\n- **C**:\n    - Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]\n- **C#**:\n    - Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]\n    - Fix detection of float numbers ([#806](https://github.com/PrismJS/prism/issues/806)) [[`1dae72b`](https://github.com/PrismJS/prism/commit/1dae72b)]\n- **F#**:\n    - Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]\n- **JavaScript**:\n    - Highlight true and false as booleans ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]\n- **Python**:\n    - Highlight triple-quoted strings before comments. Fix [#815](https://github.com/PrismJS/prism/issues/815) [[`90fbf0b`](https://github.com/PrismJS/prism/commit/90fbf0b)]\n\n### New plugins\n\n- **Previewer: Time** ([#790](https://github.com/PrismJS/prism/issues/790)) [[`88173de`](https://github.com/PrismJS/prism/commit/88173de)]\n- **Previewer: Angle** ([#791](https://github.com/PrismJS/prism/issues/791)) [[`a434c86`](https://github.com/PrismJS/prism/commit/a434c86)]\n\n### Other changes\n\n- Increase mocha's timeout [[`f1c41db`](https://github.com/PrismJS/prism/commit/f1c41db)]\n- Prevent most errors in IE8. Fix [#9](https://github.com/PrismJS/prism/issues/9) [[`9652d75`](https://github.com/PrismJS/prism/commit/9652d75)]\n- Add U.S. Web Design Standards on homepage. Fix [#785](https://github.com/PrismJS/prism/issues/785) [[`e10d48b`](https://github.com/PrismJS/prism/commit/e10d48b), [`79ebbf8`](https://github.com/PrismJS/prism/commit/79ebbf8), [`2f7088d`](https://github.com/PrismJS/prism/commit/2f7088d)]\n- Added gulp task to autolink PRs and commits in changelog [[`5ec4e4d`](https://github.com/PrismJS/prism/commit/5ec4e4d)]\n- Use child processes to run each set of tests, in order to deal with the memory leak in vm.runInNewContext() [[`9a4b6fa`](https://github.com/PrismJS/prism/commit/9a4b6fa)]\n\n## 1.2.0 (2015-10-07)\n\n### New components\n\n- **Batch** ([#781](https://github.com/PrismJS/prism/issues/781)) [[`eab5b06`](https://github.com/PrismJS/prism/commit/eab5b06)]\n\n### Updated components\n\n- **ASP.NET**:\n    - Simplified pattern for `<script>` [[`29643f4`](https://github.com/PrismJS/prism/issues/29643f4)]\n- **Bash**:\n    - Fix regression in strings ([#792](https://github.com/PrismJS/prism/issues/792)) [[`bd275c2`](https://github.com/PrismJS/prism/commit/bd275c2)]\n    - Substantially reduce wrongly highlighted stuff ([#793](https://github.com/PrismJS/prism/issues/793)) [[`ac6fe2e`](https://github.com/PrismJS/prism/commit/ac6fe2e)]\n- **CSS**:\n    - Simplified pattern for `<style>` [[`29643f4`](https://github.com/PrismJS/prism/issues/29643f4)]\n- **JavaScript**:\n    - Simplified pattern for `<script>` [[`29643f4`](https://github.com/PrismJS/prism/issues/29643f4)]\n\n### New plugins\n\n- **Previewer: Gradient** ([#783](https://github.com/PrismJS/prism/issues/783)) [[`9a63483`](https://github.com/PrismJS/prism/commit/9a63483)]\n\n### Updated plugins\n\n- **Previewer: Color**\n\n    - Add support for Sass variables [[`3a1fb04`](https://github.com/PrismJS/prism/commit/3a1fb04)]\n\n- **Previewer: Easing**\n    - Add support for Sass variables [[`7c7ab4e`](https://github.com/PrismJS/prism/commit/7c7ab4e)]\n\n### Other changes\n\n- Test runner: Allow to run tests for only some languages [[`5ade8a5`](https://github.com/PrismJS/prism/issues/5ade8a5)]\n- Download page: Fixed wrong components order raising error in generated file ([#797](https://github.com/PrismJS/prism/issues/787)) [[`7a6aed8`](https://github.com/PrismJS/prism/commit/7a6aed8)]\n\n## 1.1.0 (2015-10-04)\n\n### New components\n\n- **ABAP** ([#636](https://github.com/PrismJS/prism/issues/636)) [[`75b0328`](https://github.com/PrismJS/prism/commit/75b0328), [`0749129`](https://github.com/PrismJS/prism/commit/0749129)]\n- **APL** ([#308](https://github.com/PrismJS/prism/issues/308)) [[`1f45942`](https://github.com/PrismJS/prism/commit/1f45942), [`33a295f`](https://github.com/PrismJS/prism/commit/33a295f)]\n- **AutoIt** ([#771](https://github.com/PrismJS/prism/issues/771)) [[`211a41c`](https://github.com/PrismJS/prism/commit/211a41c)]\n- **BASIC** ([#620](https://github.com/PrismJS/prism/issues/620)) [[`805a0ce`](https://github.com/PrismJS/prism/commit/805a0ce)]\n- **Bison** ([#764](https://github.com/PrismJS/prism/issues/764)) [[`7feb135`](https://github.com/PrismJS/prism/commit/7feb135)]\n- **Crystal** ([#780](https://github.com/PrismJS/prism/issues/780)) [[`5b473de`](https://github.com/PrismJS/prism/commit/5b473de), [`414848d`](https://github.com/PrismJS/prism/commit/414848d)]\n- **D** ([#613](https://github.com/PrismJS/prism/issues/613)) [[`b5e741c`](https://github.com/PrismJS/prism/commit/b5e741c)]\n- **Diff** ([#450](https://github.com/PrismJS/prism/issues/450)) [[`ef41c74`](https://github.com/PrismJS/prism/commit/ef41c74)]\n- **Docker** ([#576](https://github.com/PrismJS/prism/issues/576)) [[`e808352`](https://github.com/PrismJS/prism/commit/e808352)]\n- **Elixir** ([#614](https://github.com/PrismJS/prism/issues/614)) [[`a1c028c`](https://github.com/PrismJS/prism/commit/a1c028c), [`c451611`](https://github.com/PrismJS/prism/commit/c451611), [`2e637f0`](https://github.com/PrismJS/prism/commit/2e637f0), [`ccb6566`](https://github.com/PrismJS/prism/commit/ccb6566)]\n- **GLSL** ([#615](https://github.com/PrismJS/prism/issues/615)) [[`247da05`](https://github.com/PrismJS/prism/commit/247da05)]\n- **Inform 7** ([#616](https://github.com/PrismJS/prism/issues/616)) [[`d2595b4`](https://github.com/PrismJS/prism/commit/d2595b4)]\n- **J** ([#623](https://github.com/PrismJS/prism/issues/623)) [[`0cc50b2`](https://github.com/PrismJS/prism/commit/0cc50b2)]\n- **MEL** ([#618](https://github.com/PrismJS/prism/issues/618)) [[`8496c14`](https://github.com/PrismJS/prism/commit/8496c14)]\n- **Mizar** ([#619](https://github.com/PrismJS/prism/issues/619)) [[`efde61d`](https://github.com/PrismJS/prism/commit/efde61d)]\n- **Monkey** ([#621](https://github.com/PrismJS/prism/issues/621)) [[`fdd4a3c`](https://github.com/PrismJS/prism/commit/fdd4a3c)]\n- **nginx** ([#776](https://github.com/PrismJS/prism/issues/776)) [[`dc4fc19`](https://github.com/PrismJS/prism/commit/dc4fc19), [`e62c88e`](https://github.com/PrismJS/prism/commit/e62c88e)]\n- **Nim** ([#622](https://github.com/PrismJS/prism/issues/622)) [[`af9c49a`](https://github.com/PrismJS/prism/commit/af9c49a)]\n- **OCaml** ([#628](https://github.com/PrismJS/prism/issues/628)) [[`556c04d`](https://github.com/PrismJS/prism/commit/556c04d)]\n- **Processing** ([#629](https://github.com/PrismJS/prism/issues/629)) [[`e47087b`](https://github.com/PrismJS/prism/commit/e47087b)]\n- **Prolog** ([#630](https://github.com/PrismJS/prism/issues/630)) [[`dd04c32`](https://github.com/PrismJS/prism/commit/dd04c32)]\n- **Pure** ([#626](https://github.com/PrismJS/prism/issues/626)) [[`9c276ab`](https://github.com/PrismJS/prism/commit/9c276ab)]\n- **Q** ([#624](https://github.com/PrismJS/prism/issues/624)) [[`c053c9e`](https://github.com/PrismJS/prism/commit/c053c9e)]\n- **Qore** [[`125e91f`](https://github.com/PrismJS/prism/commit/125e91f)]\n- **Tcl** [[`a3e751a`](https://github.com/PrismJS/prism/commit/a3e751a), [`11ff829`](https://github.com/PrismJS/prism/commit/11ff829)]\n- **Textile** ([#544](https://github.com/PrismJS/prism/issues/544)) [[`d0c6764`](https://github.com/PrismJS/prism/commit/d0c6764)]\n- **Verilog** ([#640](https://github.com/PrismJS/prism/issues/640)) [[`44a11c2`](https://github.com/PrismJS/prism/commit/44a11c2), [`795eb99`](https://github.com/PrismJS/prism/commit/795eb99)]\n- **Vim** [[`69ea994`](https://github.com/PrismJS/prism/commit/69ea994)]\n\n### Updated components\n\n- **Bash**:\n    - Add support for Here-Documents ([#787](https://github.com/PrismJS/prism/issues/787)) [[`b57a096`](https://github.com/PrismJS/prism/commit/b57a096)]\n    - Remove C-like dependency ([#789](https://github.com/PrismJS/prism/issues/789)) [[`1ab4619`](https://github.com/PrismJS/prism/commit/1ab4619)]\n- **C**:\n    - Fixed numbers [[`4d64d07`](https://github.com/PrismJS/prism/commit/4d64d07), [`071c3dd`](https://github.com/PrismJS/prism/commit/071c3dd)]\n- **C-like**:\n    - Add word boundary before class-name prefixes [[`aa757f6`](https://github.com/PrismJS/prism/commit/aa757f6)]\n    - Improved operator regex + add != and !== [[`135ee9d`](https://github.com/PrismJS/prism/commit/135ee9d)]\n    - Optimized string regexp [[`792e35c`](https://github.com/PrismJS/prism/commit/792e35c)]\n- **F#**:\n    - Fixed keywords containing exclamation mark [[`09f2005`](https://github.com/PrismJS/prism/commit/09f2005)]\n    - Improved string pattern [[`0101c89`](https://github.com/PrismJS/prism/commit/0101c89)]\n    - Insert preprocessor before keyword + don't allow line feeds before # [[`fdc9477`](https://github.com/PrismJS/prism/commit/fdc9477)]\n    - Fixed numbers [[`0aa0791`](https://github.com/PrismJS/prism/commit/0aa0791)]\n- **Gherkin**:\n    - Don't allow spaces in tags [[`48ff8b7`](https://github.com/PrismJS/prism/commit/48ff8b7)]\n    - Handle \\r\\n and \\r + allow feature alone + don't match blank td/th [[`ce1ec3b`](https://github.com/PrismJS/prism/commit/ce1ec3b)]\n- **Git**:\n    - Added more examples ([#652](https://github.com/PrismJS/prism/issues/652)) [[`95dc102`](https://github.com/PrismJS/prism/commit/95dc102)]\n    - Add support for unified diff. Fixes [#769](https://github.com/PrismJS/prism/issues/769), fixes [#357](https://github.com/PrismJS/prism/issues/357), closes [#401](https://github.com/PrismJS/prism/issues/401) [[`3aadd5d`](https://github.com/PrismJS/prism/commit/3aadd5d)]\n- **Go**:\n    - Improved operator regexp + removed punctuation from it [[`776ab90`](https://github.com/PrismJS/prism/commit/776ab90)]\n- **Haml**:\n    - Combine both multiline-comment regexps + handle \\r\\n and \\r [[`f77b40b`](https://github.com/PrismJS/prism/commit/f77b40b)]\n    - Handle \\r\\n and \\r in filter regex [[`bbe68ac`](https://github.com/PrismJS/prism/commit/bbe68ac)]\n- **Handlebars**:\n    - Fix empty strings, add plus sign in exponential notation, improve block pattern and variable pattern [[`c477f9a`](https://github.com/PrismJS/prism/commit/c477f9a)]\n    - Properly escape special replacement patterns ($) in Handlebars, PHP and Smarty. Fix [#772](https://github.com/PrismJS/prism/issues/772) [[`895bf46`](https://github.com/PrismJS/prism/commit/895bf46)]\n- **Haskell**:\n    - Removed useless backslashes and parentheses + handle \\r\\n and \\r + simplify number regexp + fix operator regexp [[`1cc8d8e`](https://github.com/PrismJS/prism/commit/1cc8d8e)]\n- **HTTP**:\n    - Fix indentation + Add multiline flag for more flexibility + Fix response status + Handle \\r\\n and \\r [[`aaa90f1`](https://github.com/PrismJS/prism/commit/aaa90f1)]\n- **Ini**:\n    - Fix some regexps + remove unused flags [[`53d5839`](https://github.com/PrismJS/prism/commit/53d5839)]\n- **Jade**:\n    - Add todo list + remove single-line comment pattern + simplified most patterns with m flag + handle \\r\\n and \\r [[`a79e838`](https://github.com/PrismJS/prism/commit/a79e838)]\n- **Java**:\n    - Fix number regexp + simplified number regexp and optimized operator regexp [[`21e20b9`](https://github.com/PrismJS/prism/commit/21e20b9)]\n- **JavaScript**:\n    - JavaScript: Allow for all non-ASCII characters in function names. Fix [#400](https://github.com/PrismJS/prism/issues/400) [[`29e26dc`](https://github.com/PrismJS/prism/commit/29e26dc)]\n- **JSX**:\n    - Allow for one level of nesting in scripts (Fix [#717](https://github.com/PrismJS/prism/issues/717)) [[`90c75d5`](https://github.com/PrismJS/prism/commit/90c75d5)]\n- **Julia**:\n    - Simplify comment regexp + improved number regexp + improved operator regexp [[`bcac7d4`](https://github.com/PrismJS/prism/commit/bcac7d4)]\n- **Keyman**:\n    - Move header statements above keywords [[`23a444c`](https://github.com/PrismJS/prism/commit/23a444c)]\n- **LaTeX**:\n    - Simplify comment regexp [[`132b41a`](https://github.com/PrismJS/prism/commit/132b41a)]\n    - Extend support [[`942a6ec`](https://github.com/PrismJS/prism/commit/942a6ec)]\n- **Less**:\n    - Remove useless part in property regexp [[`80d8260`](https://github.com/PrismJS/prism/commit/80d8260)]\n- **LOLCODE**:\n    - Removed useless parentheses [[`8147c9b`](https://github.com/PrismJS/prism/commit/8147c9b)]\n- **Makefile**:\n    - Add known failures in example [[`e0f8984`](https://github.com/PrismJS/prism/commit/e0f8984)]\n    - Handle \\r\\n in comments and strings + fix \"-include\" keyword\n- **Markup**:\n    - Simplify patterns + handle \\r\\n and \\r [[`4c551e8`](https://github.com/PrismJS/prism/commit/4c551e8)]\n    - Don't allow = to appear in tag name [[`85d8a55`](https://github.com/PrismJS/prism/commit/85d8a55)]\n    - Don't allow dot inside tag name [[`283691e`](https://github.com/PrismJS/prism/commit/283691e)]\n- **MATLAB**:\n    - Simplify string pattern to remove lookbehind [[`a3cbecc`](https://github.com/PrismJS/prism/commit/a3cbecc)]\n- **NASM**:\n    - Converted indents to tabs, removed uneeded escapes, added lookbehinds [[`a92e4bd`](https://github.com/PrismJS/prism/commit/a92e4bd)]\n- **NSIS**:\n    - Simplified patterns [[`bbd83d4`](https://github.com/PrismJS/prism/commit/bbd83d4)]\n    - Fix operator regexp [[`44ad8dc`](https://github.com/PrismJS/prism/commit/44ad8dc)]\n- **Objective-C**:\n    - Simplified regexps + fix strings + handle \\r [[`1d33147`](https://github.com/PrismJS/prism/commit/1d33147)]\n    - Fix operator regexp [[`e9d382e`](https://github.com/PrismJS/prism/commit/e9d382e)]\n- **Pascal**:\n    - Simplified regexps [[`c03c8a4`](https://github.com/PrismJS/prism/commit/c03c8a4)]\n- **Perl**:\n    - Simplified regexps + Made most string and regexp patterns multi-line + Added support for regexp's n flag + Added missing operators [[`71b00cc`](https://github.com/PrismJS/prism/commit/71b00cc)]\n- **PHP**:\n    - Simplified patterns [[`f9d9452`](https://github.com/PrismJS/prism/commit/f9d9452)]\n    - Properly escape special replacement patterns ($) in Handlebars, PHP and Smarty. Fix [#772](https://github.com/PrismJS/prism/issues/772) [[`895bf46`](https://github.com/PrismJS/prism/commit/895bf46)]\n- **PHP Extras**:\n    - Fix $this regexp + improve global regexp [[`781fdad`](https://github.com/PrismJS/prism/commit/781fdad)]\n- **PowerShell**:\n    - Update definitions for command/alias/operators [[`14da55c`](https://github.com/PrismJS/prism/commit/14da55c)]\n- **Python**:\n    - Added async/await and @ operator ([#656](https://github.com/PrismJS/prism/issues/656)) [[`7f1ae75`](https://github.com/PrismJS/prism/commit/7f1ae75)]\n    - Added 'self' keyword and support for class names ([#677](https://github.com/PrismJS/prism/issues/677)) [[`d9d4ab2`](https://github.com/PrismJS/prism/commit/d9d4ab2)]\n    - Simplified regexps + don't capture where unneeded + fixed operators [[`530f5f0`](https://github.com/PrismJS/prism/commit/530f5f0)]\n- **R**:\n    - Fixed and simplified patterns [[`c20c3ec`](https://github.com/PrismJS/prism/commit/c20c3ec)]\n- **reST**:\n    - Simplified some patterns, fixed others, prevented blank comments to match, moved list-bullet down to prevent breaking quotes [[`e6c6b85`](https://github.com/PrismJS/prism/commit/e6c6b85)]\n- **Rip**:\n    - Fixed some regexp + moved down numbers [[`1093f7d`](https://github.com/PrismJS/prism/commit/1093f7d)]\n- **Ruby**:\n    - Code cleaning, handle \\r\\n and \\r, fix some regexps [[`dd4989f`](https://github.com/PrismJS/prism/commit/dd4989f)]\n    - Add % notations for strings and regexps. Fix [#590](https://github.com/PrismJS/prism/issues/590) [[`2d37800`](https://github.com/PrismJS/prism/commit/2d37800)]\n- **Rust**:\n    - Simplified patterns and fixed operators [[`6c8494f`](https://github.com/PrismJS/prism/commit/6c8494f)]\n- **SAS**:\n    - Simplified datalines and optimized operator patterns [[`6ebb96f`](https://github.com/PrismJS/prism/commit/6ebb96f)]\n- **Sass**:\n    - Add missing require in components [[`35b8c50`](https://github.com/PrismJS/prism/commit/35b8c50)]\n    - Fix comments, operators and selectors and simplified patterns [[`28759d0`](https://github.com/PrismJS/prism/commit/28759d0)]\n    - Highlight \"-\" as operator only if surrounded by spaces, in order to not break hyphenated values (e.g. \"ease-in-out\") [[`b2763e7`](https://github.com/PrismJS/prism/commit/b2763e7)]\n- **Scala**:\n    - Simplified patterns [[`daf2597`](https://github.com/PrismJS/prism/commit/daf2597)]\n- **Scheme**:\n    - Add missing lookbehind on number pattern. Fix [#702](https://github.com/PrismJS/prism/issues/702) [[`3120ff7`](https://github.com/PrismJS/prism/commit/3120ff7)]\n    - Fixes and simplifications [[`068704a`](https://github.com/PrismJS/prism/commit/068704a)]\n    - Don't match content of symbols starting with a parenthesis [[`fa7df08`](https://github.com/PrismJS/prism/commit/fa7df08)]\n- **Scss**:\n    - Simplified patterns + fixed operators + don't match empty selectors [[`672c167`](https://github.com/PrismJS/prism/commit/672c167)]\n- **Smalltalk**:\n    - Simplified patterns [[`d896622`](https://github.com/PrismJS/prism/commit/d896622)]\n- **Smarty**:\n    - Optimized regexps + fixed punctuation and operators [[`1446700`](https://github.com/PrismJS/prism/commit/1446700)]\n    - Properly escape special replacement patterns ($) in Handlebars, PHP and Smarty. Fix [#772](https://github.com/PrismJS/prism/issues/772) [[`895bf46`](https://github.com/PrismJS/prism/commit/895bf46)]\n- **SQL**:\n    - Simplified regexp + fixed keywords and operators + add CHARSET keyword [[`d49fec0`](https://github.com/PrismJS/prism/commit/d49fec0)]\n- **Stylus**:\n    - Rewrote the component entirely [[`7729728`](https://github.com/PrismJS/prism/commit/7729728)]\n- **Swift**:\n    - Optimized keywords lists and removed duplicates [[`936e429`](https://github.com/PrismJS/prism/commit/936e429)]\n    - Add support for string interpolation. Fix [#448](https://github.com/PrismJS/prism/issues/448) [[`89cd5d0`](https://github.com/PrismJS/prism/commit/89cd5d0)]\n- **Twig**:\n    - Prevent \"other\" pattern from matching blank strings [[`cae2cef`](https://github.com/PrismJS/prism/commit/cae2cef)]\n    - Optimized regexps + fixed operators + added missing operators/keywords [[`2d8271f`](https://github.com/PrismJS/prism/commit/2d8271f)]\n- **VHDL**:\n    - Move operator overloading before strings, don't capture if not needed, handle \\r\\n and \\r, fix numbers [[`4533f17`](https://github.com/PrismJS/prism/commit/4533f17)]\n- **Wiki markup**:\n    - Fixed emphasis + merged some url patterns + added TODOs [[`8cf9e6a`](https://github.com/PrismJS/prism/commit/8cf9e6a)]\n- **YAML**:\n    - Handled \\r\\n and \\r, simplified some patterns, fixed \"---\" [[`9e33e0a`](https://github.com/PrismJS/prism/commit/9e33e0a)]\n\n### New plugins\n\n- **Autoloader** ([#766](https://github.com/PrismJS/prism/issues/766)) [[`ed4ccfe`](https://github.com/PrismJS/prism/commit/ed4ccfe)]\n- **JSONP Highlight** [[`b2f14d9`](https://github.com/PrismJS/prism/commit/b2f14d9)]\n- **Keep Markup** ([#770](https://github.com/PrismJS/prism/issues/770)) [[`bd3e9ea`](https://github.com/PrismJS/prism/commit/bd3e9ea)]\n- **Previewer: Base** ([#767](https://github.com/PrismJS/prism/issues/767)) [[`cf764c0`](https://github.com/PrismJS/prism/commit/cf764c0)]\n- **Previewer: Color** ([#767](https://github.com/PrismJS/prism/issues/767)) [[`cf764c0`](https://github.com/PrismJS/prism/commit/cf764c0)]\n- **Previewer: Easing** ([#773](https://github.com/PrismJS/prism/issues/773)) [[`513137c`](https://github.com/PrismJS/prism/commit/513137c), [`9207258`](https://github.com/PrismJS/prism/commit/9207258), [`4303c94`](https://github.com/PrismJS/prism/commit/4303c94)]\n- **Remove initial line feed** [[`ed9f2b2`](https://github.com/PrismJS/prism/commit/ed9f2b2), [`b8d098e`](https://github.com/PrismJS/prism/commit/b8d098e)]\n\n### Updated plugins\n\n- **Autolinker**:\n    - Don't process all grammars on load, process each one in before-highlight. Should fix [#760](https://github.com/PrismJS/prism/issues/760) [[`a572495`](https://github.com/PrismJS/prism/commit/a572495)]\n- **Line Highlight**:\n    - Run in `complete` hook [[`f237e67`](https://github.com/PrismJS/prism/commit/f237e67)]\n    - Fixed position when font-size is odd ([#668](https://github.com/PrismJS/prism/issues/668)) [[`86bbd4c`](https://github.com/PrismJS/prism/commit/86bbd4c), [`8ed7ce3`](https://github.com/PrismJS/prism/commit/8ed7ce3)]\n- **Line Numbers**:\n    - Run in `complete` hook [[`3f4d918`](https://github.com/PrismJS/prism/commit/3f4d918)]\n    - Don't run if already exists [[`c89bbdb`](https://github.com/PrismJS/prism/commit/c89bbdb)]\n    - Don't run if block is empty. Fix [#669](https://github.com/PrismJS/prism/issues/669) [[`ee463e8`](https://github.com/PrismJS/prism/commit/ee463e8)]\n    - Correct calculation for number of lines (fix [#385](https://github.com/PrismJS/prism/issues/385)) [[`14f3f80`](https://github.com/PrismJS/prism/commit/14f3f80)]\n    - Fix computation of line numbers for single-line code blocks. Fix [#721](https://github.com/PrismJS/prism/issues/721) [[`02b220e`](https://github.com/PrismJS/prism/commit/02b220e)]\n    - Fixing word wrap on long code lines [[`56b3d29`](https://github.com/PrismJS/prism/commit/56b3d29)]\n    - Fixing coy theme + line numbers plugin overflowing on long blocks of text ([#762](https://github.com/PrismJS/prism/issues/762)) [[`a0127eb`](https://github.com/PrismJS/prism/commit/a0127eb)]\n- **Show Language**:\n    - Add gulp task to build languages map in Show language plugin (Fix [#671](https://github.com/PrismJS/prism/issues/671)) [[`39bd827`](https://github.com/PrismJS/prism/commit/39bd827)]\n    - Add reset styles to prevent bug in Coy theme ([#703](https://github.com/PrismJS/prism/issues/703)) [[`08dd500`](https://github.com/PrismJS/prism/commit/08dd500)]\n\n### Other changes\n\n- Fixed link to David Peach article ([#647](https://github.com/PrismJS/prism/issues/647)) [[`3f679f8`](https://github.com/PrismJS/prism/commit/3f679f8)]\n- Added `complete` hook, which runs even when no grammar is found [[`e58b6c0`](https://github.com/PrismJS/prism/commit/e58b6c0), [`fd54995`](https://github.com/PrismJS/prism/commit/fd54995)]\n- Added test suite runner ([#588](https://github.com/PrismJS/prism/issues/588)) [[`956cd85`](https://github.com/PrismJS/prism/commit/956cd85)]\n- Added tests for every components\n- Added `.gitattributes` to prevent line ending changes in test files [[`45ca8c8`](https://github.com/PrismJS/prism/commit/45ca8c8)]\n- Split plugins into 3 columns on Download page [[`a88936a`](https://github.com/PrismJS/prism/commit/a88936a)]\n- Removed comment in components.js to make it easier to parse as JSON ([#679](https://github.com/PrismJS/prism/issues/679)) [[`2cb1326`](https://github.com/PrismJS/prism/commit/2cb1326)]\n- Updated README.md [[`1388256`](https://github.com/PrismJS/prism/commit/1388256)]\n- Updated documentation since the example was not relevant any more [[`80aedb2`](https://github.com/PrismJS/prism/commit/80aedb2)]\n- Fixed inline style for Coy theme [[`52829b3`](https://github.com/PrismJS/prism/commit/52829b3)]\n- Prevent errors in nodeJS ([#754](https://github.com/PrismJS/prism/issues/754)) [[`9f5c93c`](https://github.com/PrismJS/prism/commit/9f5c93c), [`0356c58`](https://github.com/PrismJS/prism/commit/0356c58)]\n- Explicitly make the Worker close itself after highlighting, so that users have control on this behaviour when directly using Prism inside a Worker. Fix [#492](https://github.com/PrismJS/prism/issues/492) [[`e42a228`](https://github.com/PrismJS/prism/commit/e42a228)]\n- Added some language aliases: js for javascript, xml, html, mathml and svg for markup [[`2f9fe1e`](https://github.com/PrismJS/prism/commit/2f9fe1e)]\n- Download page: Add a \"Select all\" checkbox ([#561](https://github.com/PrismJS/prism/issues/561)) [[`9a9020b`](https://github.com/PrismJS/prism/commit/9a9020b)]\n- Download page: Don't add semicolon unless needed in generated code. Fix [#273](https://github.com/PrismJS/prism/issues/273) [[`5a5eec5`](https://github.com/PrismJS/prism/commit/5a5eec5)]\n- Add language counter on homepage [[`889cda5`](https://github.com/PrismJS/prism/commit/889cda5)]\n- Improve performance by doing more work in the worker [[`1316abc`](https://github.com/PrismJS/prism/commit/1316abc)]\n- Replace Typeplate with SitePoint on homepage. Fix [#774](https://github.com/PrismJS/prism/issues/774) [[`0c54308`](https://github.com/PrismJS/prism/commit/0c54308)]\n- Added basic `.editorconfig` [[`c48f55d`](https://github.com/PrismJS/prism/commit/c48f55d)]\n\n---\n\n## 1.0.1 (2015-07-26)\n\n### New components\n\n- **Brainfuck** ([#611](https://github.com/PrismJS/prism/issues/611)) [[`3ede718`](https://github.com/PrismJS/prism/commit/3ede718)]\n- **Keyman** ([#609](https://github.com/PrismJS/prism/issues/609)) [[`2698f82`](https://github.com/PrismJS/prism/commit/2698f82), [`e9936c6`](https://github.com/PrismJS/prism/commit/e9936c6)]\n- **Makefile** ([#610](https://github.com/PrismJS/prism/issues/610)) [[`3baa61c`](https://github.com/PrismJS/prism/commit/3baa61c)]\n- **Sass (Sass)** (fix [#199](https://github.com/PrismJS/prism/issues/199)) [[`b081804`](https://github.com/PrismJS/prism/commit/b081804)]\n- **VHDL** ([#595](https://github.com/PrismJS/prism/issues/595)) [[`43e6157`](https://github.com/PrismJS/prism/commit/43e6157)]\n\n### Updated components\n\n- **ActionScript**:\n    - Fix ! operator and add ++ and -- as whole operators [[`6bf0794`](https://github.com/PrismJS/prism/commit/6bf0794)]\n    - Fix XML highlighting [[`90257b0`](https://github.com/PrismJS/prism/commit/90257b0)]\n    - Update examples to add inline XML [[`2c1626a`](https://github.com/PrismJS/prism/commit/2c1626a), [`3987711`](https://github.com/PrismJS/prism/commit/3987711)]\n- **Apache Configuration**:\n    - Don't include the spaces in directive-inline [[`e87efd8`](https://github.com/PrismJS/prism/commit/e87efd8)]\n- **AppleScript**:\n    - Allow one level of nesting in block comments [[`65894c5`](https://github.com/PrismJS/prism/commit/65894c5)]\n    - Removed duplicates between operators and keywords [[`1ec5a81`](https://github.com/PrismJS/prism/commit/1ec5a81)]\n    - Removed duplicates between keywords and classes [[`e8d09f6`](https://github.com/PrismJS/prism/commit/e8d09f6)]\n    - Move numbers up so they are not broken by operator pattern [[`66dac31`](https://github.com/PrismJS/prism/commit/66dac31)]\n- **ASP.NET**:\n    - Prevent Markup tags from breaking ASP tags + fix MasterType directive [[`1f0a336`](https://github.com/PrismJS/prism/commit/1f0a336)]\n- **AutoHotkey**:\n    - Allow tags (labels) to be highlighted at the end of the code [[`0a1fc4b`](https://github.com/PrismJS/prism/commit/0a1fc4b)]\n    - Match all operators + add comma to punctuation [[`f0ccb1b`](https://github.com/PrismJS/prism/commit/f0ccb1b)]\n    - Removed duplicates in keywords lists [[`fe0a068`](https://github.com/PrismJS/prism/commit/fe0a068)]\n- **Bash**:\n    - Simplify comment regex [[`2700981`](https://github.com/PrismJS/prism/commit/2700981)]\n    - Removed duplicates in keywords + removed unneeded parentheses [[`903b8a4`](https://github.com/PrismJS/prism/commit/903b8a4)]\n- **C**:\n    - Removed string pattern (inherited from C-like) [[`dcce1a7`](https://github.com/PrismJS/prism/commit/dcce1a7)]\n    - Better support for macro statements [[`4868635`](https://github.com/PrismJS/prism/commit/4868635)]\n- **C#**:\n    - Fix preprocessor pattern [[`86311f5`](https://github.com/PrismJS/prism/commit/86311f5)]\n- **C++**:\n    - Removed delete[] and new[] broken keywords [[`42fbeef`](https://github.com/PrismJS/prism/commit/42fbeef)]\n- **C-like**:\n    - Removed unused 'ignore' pattern [[`b6535dd`](https://github.com/PrismJS/prism/commit/b6535dd)]\n    - Use look-ahead instead of inside to match functions [[`d4194c9`](https://github.com/PrismJS/prism/commit/d4194c9)]\n- **CoffeeScript**:\n    - Prevent strings from ending with a backslash [[`cb6b824`](https://github.com/PrismJS/prism/commit/cb6b824)]\n- **CSS**:\n    - Highlight parentheses as punctuation [[`cd0273e`](https://github.com/PrismJS/prism/commit/cd0273e)]\n    - Improved highlighting of at-rules [[`e254088`](https://github.com/PrismJS/prism/commit/e254088)]\n    - Improved URL and strings [[`901812c`](https://github.com/PrismJS/prism/commit/901812c)]\n    - Selector regexp should not include last spaces before brace [[`f2e2718`](https://github.com/PrismJS/prism/commit/f2e2718)]\n    - Handle \\r\\n [[`15760e1`](https://github.com/PrismJS/prism/commit/15760e1)]\n- **Eiffel**:\n    - Fix string patterns order + fix /= operator [[`7d1b8d7`](https://github.com/PrismJS/prism/commit/7d1b8d7)]\n- **Erlang**:\n    - Fixed quoted functions, quoted atoms, variables and <= operator [[`fa286aa`](https://github.com/PrismJS/prism/commit/fa286aa)]\n- **Fortran**:\n    - Improved pattern for comments inside strings [[`40ae215`](https://github.com/PrismJS/prism/commit/40ae215)]\n    - Fixed order in keyword pattern [[`8a6d32d`](https://github.com/PrismJS/prism/commit/8a6d32d)]\n- **Handlebars**:\n    - Support blocks with dashes ([#587](https://github.com/PrismJS/prism/issues/587)) [[`f409b13`](https://github.com/PrismJS/prism/commit/f409b13)]\n- **JavaScript**:\n    - Added support for 'y' and 'u' ES6 JavaScript regex flags ([#596](https://github.com/PrismJS/prism/issues/596)) [[`5d99957`](https://github.com/PrismJS/prism/commit/5d99957)]\n    - Added support for missing ES6 keywords in JavaScript ([#596](https://github.com/PrismJS/prism/issues/596)) [[`ca68b87`](https://github.com/PrismJS/prism/commit/ca68b87)]\n    - Added `async` and `await` keywords ([#575](https://github.com/PrismJS/prism/issues/575)) [[`5458cec`](https://github.com/PrismJS/prism/commit/5458cec)]\n    - Added support for Template strings + interpolation [[`04f72b1`](https://github.com/PrismJS/prism/commit/04f72b1)]\n    - Added support for octal and binary numbers ([#597](https://github.com/PrismJS/prism/issues/597)) [[`a8aa058`](https://github.com/PrismJS/prism/commit/a8aa058)]\n    - Improve regex performance of C-like strings and JS regexps [[`476cbf4`](https://github.com/PrismJS/prism/commit/476cbf4)]\n- **Markup**:\n    - Allow non-ASCII chars in tag names and attributes (fix [#585](https://github.com/PrismJS/prism/issues/585)) [[`52fd55e`](https://github.com/PrismJS/prism/commit/52fd55e)]\n    - Optimized tag's regexp so that it stops crashing on large unclosed tags [[`75452ba`](https://github.com/PrismJS/prism/commit/75452ba)]\n    - Highlight single quotes in attr-value as punctuation [[`1ebcb8e`](https://github.com/PrismJS/prism/commit/1ebcb8e)]\n    - Doctype and prolog can be multi-line [[`c19a238`](https://github.com/PrismJS/prism/commit/c19a238)]\n- **Python**:\n    - Added highlighting for function declaration ([#601](https://github.com/PrismJS/prism/issues/601)) [[`a88aae8`](https://github.com/PrismJS/prism/commit/a88aae8)]\n    - Fixed wrong highlighting of variables named a, b, c... f ([#601](https://github.com/PrismJS/prism/issues/601)) [[`a88aae8`](https://github.com/PrismJS/prism/commit/a88aae8)]\n- **Ruby**:\n    - Added support for string interpolation [[`c36b123`](https://github.com/PrismJS/prism/commit/c36b123)]\n- **Scss**:\n    - Fixed media queries highlighting [[`bf8e032`](https://github.com/PrismJS/prism/commit/bf8e032)]\n    - Improved highlighting inside at-rules [[`eef4248`](https://github.com/PrismJS/prism/commit/eef4248)]\n    - Match placeholders inside selectors (fix [#238](https://github.com/PrismJS/prism/issues/238)) [[`4e42e26`](https://github.com/PrismJS/prism/commit/4e42e26)]\n- **Swift**:\n    - Update keywords list (fix [#625](https://github.com/PrismJS/prism/issues/625)) [[`88f44a7`](https://github.com/PrismJS/prism/commit/88f44a7)]\n\n### Updated plugins\n\n- **File Highlight**:\n    - Allow to specify the highlighting language. Fix [#607](https://github.com/PrismJS/prism/issues/607) [[`8030db9`](https://github.com/PrismJS/prism/commit/8030db9)]\n- **Line Highlight**:\n    - Fixed incorrect height in IE9 ([#604](https://github.com/PrismJS/prism/issues/604)) [[`f1705eb`](https://github.com/PrismJS/prism/commit/f1705eb)]\n    - Prevent errors in IE8 [[`5f133c8`](https://github.com/PrismJS/prism/commit/5f133c8)]\n\n### Other changes\n\n- Removed moot `version` property from `bower.json` ([#594](https://github.com/PrismJS/prism/issues/594)) [[`4693499`](https://github.com/PrismJS/prism/commit/4693499)]\n- Added repository to `bower.json` ([#600](https://github.com/PrismJS/prism/issues/600)) [[`8e5ebcc`](https://github.com/PrismJS/prism/commit/8e5ebcc)]\n- Added `.DS_Store` to `.gitignore` [[`1707e4e`](https://github.com/PrismJS/prism/commit/1707e4e)]\n- Improve test drive page usability. Fix [#591](https://github.com/PrismJS/prism/issues/591) [[`fe60858`](https://github.com/PrismJS/prism/commit/fe60858)]\n- Fixed prism-core and prism-file-highlight to prevent errors in IE8 [[`5f133c8`](https://github.com/PrismJS/prism/commit/5f133c8)]\n- Add Ubuntu Mono font to font stack [[`ed9d7e3`](https://github.com/PrismJS/prism/commit/ed9d7e3)]\n\n---\n\n## 1.0.0 (2015-05-23)\n\n- First release\n- Supported languages:\n    - ActionScript\n    - Apache Configuration\n    - AppleScript\n    - ASP.NET (C#)\n    - AutoHotkey\n    - Bash\n    - C\n    - C#\n    - C++\n    - C-like\n    - CoffeeScript\n    - CSS\n    - CSS Extras\n    - Dart\n    - Eiffel\n    - Erlang\n    - F#\n    - Fortran\n    - Gherkin\n    - Git\n    - Go\n    - Groovy\n    - Haml\n    - Handlebars\n    - Haskell\n    - HTTP\n    - Ini\n    - Jade\n    - Java\n    - JavaScript\n    - Julia\n    - LaTeX\n    - Less\n    - LOLCODE\n    - Markdown\n    - Markup\n    - MATLAB\n    - NASM\n    - NSIS\n    - Objective-C\n    - Pascal\n    - Perl\n    - PHP\n    - PHP Extras\n    - PowerShell\n    - Python\n    - R\n    - React JSX\n    - reST\n    - Rip\n    - Ruby\n    - Rust\n    - SAS\n    - Sass (Scss)\n    - Scala\n    - Scheme\n    - Smalltalk\n    - Smarty\n    - SQL\n    - Stylus\n    - Swift\n    - Twig\n    - TypeScript\n    - Wiki markup\n    - YAML\n- Plugins:\n    - Autolinker\n    - File Highlight\n    - Highlight Keywords\n    - Line Highlight\n    - Line Numbers\n    - Show Invisibles\n    - Show Language\n    - WebPlatform Docs\n"
  },
  {
    "path": "CNAME",
    "content": "prismjs.com"
  },
  {
    "path": "LICENSE",
    "content": "MIT LICENSE\n\nCopyright (c) 2012 Lea Verou\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "MAINTAINERS.md",
    "content": "## Maintainers (alphabetical by user name)\n\n- [@Golmote](https://github.com/Golmote)\n- [@JaKXz](https://github.com/JaKXz) Jason Kurian\n- [@LeaVerou](https://github.com/LeaVerou) Lea Verou (original author)\n- [@mAAdhaTTah](https://github.com/mAAdhaTTah) James DiGioia <jamesorodig@gmail.com>\n- [@RunDevelopment](https://github.com/RunDevelopment) Michael Schmidt <msrd0000@gmail.com>\n\n## Former Maintainers\n\n- [@zeitgeist87](https://github.com/zeitgeist87) Andreas Rohner\n"
  },
  {
    "path": "README.md",
    "content": "# [Prism](https://prismjs.com/)\n\n[![Build Status](https://github.com/PrismJS/prism/workflows/CI/badge.svg)](https://github.com/PrismJS/prism/actions)\n[![npm](https://img.shields.io/npm/dw/prismjs.svg)](https://www.npmjs.com/package/prismjs)\n\nPrism is a lightweight, robust, and elegant syntax highlighting library. It's a spin-off project from [Dabblet](https://dabblet.com/).\n\nYou can learn more on [prismjs.com](https://prismjs.com/).\n\n[Why another syntax highlighter?](https://lea.verou.me/2012/07/introducing-prism-an-awesome-new-syntax-highlighter/#more-1841)\n\n[More themes for Prism!](https://github.com/PrismJS/prism-themes)\n\n## Contribute to Prism!\n\n### **Important Notice**\n\nWe are currently working on [Prism v2](https://github.com/PrismJS/prism/discussions/3531) and will only accept security-relevant PRs for the time being.\n\nOnce work on Prism v2 is sufficiently advanced, we will accept PRs again. This will be announced on our [Discussion](https://github.com/PrismJS/prism/discussions) page and mentioned in the [roadmap discussion](https://github.com/PrismJS/prism/discussions/3531).\n\n<details>\n<summary>Prism v1 contributing notes</summary>\n\nPrism depends on community contributions to expand and cover a wider array of use cases. If you like it, consider giving back by sending a pull request. Here are a few tips:\n\n- Read the [documentation](https://prismjs.com/extending.html). Prism was designed to be extensible.\n- Do not edit `prism.js`, it’s just the version of Prism used by the Prism website and is built automatically. Limit your changes to the unminified files in the `components/` folder. `prism.js` and all minified files are generated by our build system (see below).\n- Use `npm ci` to install Prism's dependencies. Do not use `npm install` because it will cause non-deterministic builds.\n- The build system uses [gulp](https://github.com/gulpjs/gulp) to minify the files and build `prism.js`. With all of Prism's dependencies installed, you just need to run the command `npm run build`.\n- Please follow the code conventions used in the files already. For example, I use [tabs for indentation and spaces for alignment](http://lea.verou.me/2012/01/why-tabs-are-clearly-superior/). Opening braces are on the same line, closing braces on their own line regardless of construct. There is a space before the opening brace. etc etc.\n- Please try to err towards more smaller PRs rather than a few huge PRs. If a PR includes changes that I want to merge and also changes that I don't, handling it becomes difficult.\n- My time is very limited these days, so it might take a long time to review bigger PRs (small ones are usually merged very quickly), especially those modifying the Prism Core. This doesn't mean your PR is rejected.\n- If you contribute a new language definition, you will be responsible for handling bug reports about that language definition.\n- If you [add a new language definition](https://prismjs.com/extending.html#creating-a-new-language-definition) or plugin, you need to add it to `components.json` as well and rebuild Prism by running `npm run build`, so that it becomes available to the download build page. For new languages, please also add a few [tests](https://prismjs.com/test-suite.html) and an example in the `examples/` folder.\n- Go to [prism-themes](https://github.com/PrismJS/prism-themes) if you want to add a new theme.\n\nThank you so much for contributing!!\n\n### Software requirements\n\nPrism will run on [almost any browser](https://prismjs.com/#features-full) and Node.js version but you need the following software to contribute:\n\n- Node.js >= 10.x\n- npm >= 6.x\n\n</details>\n\n## Translations\n\n- [简体中文](https://www.awesomes.cn/repo/PrismJS/prism) (if unavailable, see [here](https://deepmind.t-salon.cc/article/113))\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## What is considered a vulnerability?\n\nThere are some types of [low-severity][severity] vulnerabilities that we will not acknowledge as CVE and treat as bugs instead.\nAll vulnerabilities with a severity of medium and above will of course be acknowledged and fixed.\n\nPlease see the below section on how we treat [ReDoS] vulnerabilities.\n\nIf you are unsure whether a vulnerability you found qualifies, please report it as a vulnerability via email (see below).\n\n### ReDoS\n\nPrism is a regex-based syntax highlighter.\nAs such, the main types of vulnerabilities reported to us are [ReDoS] vulnerabilities ([CWE-1333](https://cwe.mitre.org/data/definitions/1333.html)), aka slow regexes.\n\nHowever, not all ReDoS is created equal.\nA slow regex can be have a [worst-case time complexity](https://en.wikipedia.org/wiki/Time_complexity) anywhere from _O(n<sup>2</sup>)_ to _2<sup>O(n)</sup>_.\nThis matters because a worst-case time complexity _≥ O(n<sup>3</sup>)_ is a [high severity][severity] vulnerability while _O(n<sup>2</sup>)_ is low or medium severity in the context of Prism.\nFurthermore, worst-case time complexities of _O(n<sup>2</sup>)_ can have 2 different causes: backtracking or moving.\nBacktracking is always fixable by rewriting the slow regex but moving is not (except in special cases).\n\nBecause of their lower severity and the fact that moving is difficult or impossible to fix, we will treat regexes with worst-case time complexity of _O(n<sup>2</sup>)_ caused by moving as regular bugs and not as vulnerabilities.\nPlease report them as [bugs](https://github.com/PrismJS/prism/issues/new/choose) instead of as vulnerabilities.\n\nIf you found a slow regex but are unsure about the worst-case time complexity or its cause, please report it as a vulnerability via email (see below).\n\n## Reporting a Vulnerability\n\n**_DO NOT CREATE AN ISSUE_** to report a vulnerability.\n\nInstead, please send an email to at least one of [Prism's maintainers](MAINTAINERS.md).\nSee [Responsible Disclosure](https://en.wikipedia.org/wiki/Responsible_disclosure) for more details.\n\n### Procedure\n\n1.  After you send an email [a maintainer](MAINTAINERS.md), you should receive a response from the [Prism team](https://github.com/orgs/PrismJS/people) within 3 days.\n\n    We may require further information, so please keep in touch with us until the vulnerability has been fixed.\n\n2.  After the vulnerability has been confirmed and accepted, we will create a [security advisory](https://docs.github.com/en/code-security/security-advisories/about-github-security-advisories) and start working on a fix.\n\n    You will be [added as a collaborator](https://docs.github.com/en/code-security/security-advisories/adding-a-collaborator-to-a-security-advisory) (this requires a GitHub account).\n    At this point, all communication will occur using comments on the advisory and the [temporary private fork](https://docs.github.com/en/code-security/security-advisories/collaborating-in-a-temporary-private-fork-to-resolve-a-security-vulnerability).\n\n3.  After the fix has been merged, we will make a new release and publish the security advisory within one week.\n\n[ReDoS]: https://en.wikipedia.org/wiki/ReDoS\n[severity]: https://www.imperva.com/learn/application-security/cve-cvss-vulnerability/\n"
  },
  {
    "path": "_headers",
    "content": "/*\n\tAccess-Control-Allow-Origin: *\n"
  },
  {
    "path": "benchmark/benchmark.js",
    "content": "import crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport Benchmark from 'benchmark';\nimport fetch from 'cross-fetch';\nimport { gitP } from 'simple-git';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { parseLanguageNames } from '../tests/helper/test-case.js';\nimport { config as baseConfig } from './config.js';\n\n/**\n * @typedef {import('../src/core.js').Prism} Prism\n */\n\n/**\n * @typedef {import('./config.js').Config} Config\n * @typedef {import('./config.js').ConfigOptions} ConfigOptions\n */\n\n/**\n * @typedef {import('benchmark').Options} Options\n * @typedef {import('benchmark').Stats} Stats\n */\n\n/**\n * @typedef {object} Summary\n * @property {number} best\n * @property {number} worst\n * @property {number[]} relative\n * @property {number} [avgRelative]\n */\n\n/**\n * @typedef {object} Case\n * @property {string} id\n * @property {string} language The main language.\n * @property {string[]} languages All languages that have to be loaded.\n * @property {FileInfo[]} files\n */\n\n/**\n * @typedef {object} FileInfo\n * @property {string} uri\n * @property {string} path\n * @property {number} size\n */\n\n/**\n * @typedef {object} Result\n * @property {string} name\n * @property {Stats} stats\n */\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * @param {Config} config\n */\nasync function runBenchmark (config) {\n\tconst cases = await getCases(config);\n\tconst candidates = await getCandidates(config);\n\tconst maxCandidateNameLength = candidates.reduce((a, c) => Math.max(a, c.name.length), 0);\n\n\tconst totalNumberOfCaseFiles = cases.reduce((a, c) => a + c.files.length, 0);\n\tconsole.log(`Found ${cases.length} cases with ${totalNumberOfCaseFiles} files in total.`);\n\tconsole.log(`Test ${candidates.length} candidates with Prism.${config.options.testFunction}`);\n\tconst estimate = candidates.length * totalNumberOfCaseFiles * config.options.maxTime;\n\tconsole.log(`Estimated duration: ${Math.floor(estimate / 60)}m ${Math.floor(estimate % 60)}s`);\n\n\t/** @type {Summary[]} */\n\tconst totalSummary = Array.from({ length: candidates.length }, () => ({\n\t\tbest: 0,\n\t\tworst: 0,\n\t\trelative: [],\n\t}));\n\n\tfor (const $case of cases) {\n\t\tconsole.log();\n\t\tconsole.log(`\\x1b[90m${'-'.repeat(60)}\\x1b[0m`);\n\t\tconsole.log();\n\t\tif ($case.id !== $case.language) {\n\t\t\tconsole.log(`${$case.id} (${$case.language})`);\n\t\t}\n\t\telse {\n\t\t\tconsole.log($case.id);\n\t\t}\n\t\tconsole.log();\n\n\t\t// prepare candidates\n\t\tconst warmupCode = await fs.promises.readFile($case.files[0].path, 'utf8');\n\t\tconst candidateFunctions = await Promise.all(\n\t\t\tcandidates.map(async ({ name, setup }) => {\n\t\t\t\tconst fn = await setup($case.language, $case.languages);\n\t\t\t\tfn(warmupCode); // warmup\n\t\t\t\treturn [name, fn];\n\t\t\t})\n\t\t);\n\n\t\t// bench all files\n\t\tfor (const caseFile of $case.files) {\n\t\t\tconsole.log(\n\t\t\t\t`  ${caseFile.uri} \\x1b[90m(${Math.round(caseFile.size / 1024)} kB)\\x1b[0m`\n\t\t\t);\n\n\t\t\tconst code = await fs.promises.readFile(caseFile.path, 'utf8');\n\n\t\t\tconst results = measureCandidates(\n\t\t\t\tcandidateFunctions.map(([name, fn]) => [name, () => fn(code)]),\n\t\t\t\t{\n\t\t\t\t\tmaxTime: config.options.maxTime,\n\t\t\t\t\tminSamples: 1,\n\t\t\t\t\tdelay: 0,\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tconst min = results.reduce((a, c) => Math.min(a, c.stats.mean), Infinity);\n\t\t\tconst max = results.reduce((a, c) => Math.max(a, c.stats.mean), -Infinity);\n\t\t\tconst minIndex = results.findIndex(x => x.stats.mean === min);\n\t\t\tconst maxIndex = results.findIndex(x => x.stats.mean === max);\n\n\t\t\ttotalSummary[minIndex].best++;\n\t\t\ttotalSummary[maxIndex].worst++;\n\n\t\t\tconst best = getBest(results);\n\t\t\tconst worst = getWorst(results);\n\n\t\t\tresults.forEach((r, index) => {\n\t\t\t\tconst name = r.name.padEnd(maxCandidateNameLength, ' ');\n\t\t\t\tconst mean = (r.stats.mean * 1000).toFixed(2).padStart(8) + 'ms';\n\t\t\t\tconst r_moe = ((100 * r.stats.moe) / r.stats.mean).toFixed(0).padStart(3) + '%';\n\t\t\t\tconst smp = r.stats.sample.length.toString().padStart(4) + 'smp';\n\n\t\t\t\tconst relativeMean = r.stats.mean / min;\n\t\t\t\ttotalSummary[index].relative.push(relativeMean);\n\t\t\t\tconst relative =\n\t\t\t\t\trelativeMean === 1\n\t\t\t\t\t\t? ' '.repeat(5)\n\t\t\t\t\t\t: (relativeMean.toFixed(2) + 'x').padStart(5);\n\n\t\t\t\tconst color = r === best ? '\\x1b[32m' : r === worst ? '\\x1b[31m' : '\\x1b[0m';\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t`  \\x1b[90m| ${color}${name} ${mean} ±${r_moe} ${smp} ${relative}\\x1b[0m`\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\t// total summary\n\tconsole.log();\n\tconsole.log(`\\x1b[90m${'-'.repeat(60)}\\x1b[0m`);\n\tconsole.log();\n\tconsole.log('summary');\n\tconsole.log(`${' '.repeat(maxCandidateNameLength + 2)}  \\x1b[90mbest  worst  relative\\x1b[0m`);\n\n\ttotalSummary.forEach(s => {\n\t\ts.avgRelative = s.relative.reduce((a, c) => a + c, 0) / s.relative.length;\n\t});\n\tconst minAvgRelative = totalSummary.reduce(\n\t\t(a, c) => Math.min(a, c.avgRelative ?? Infinity),\n\t\tInfinity\n\t);\n\n\ttotalSummary.forEach((s, i) => {\n\t\tconst name = candidates[i].name.padEnd(maxCandidateNameLength, ' ');\n\t\tconst best = String(s.best).padStart('best'.length);\n\t\tconst worst = String(s.worst).padStart('worst'.length);\n\t\tconst relative = ((s.avgRelative / minAvgRelative).toFixed(2) + 'x').padStart(\n\t\t\t'relative'.length\n\t\t);\n\n\t\tconsole.log(`  ${name}  ${best}  ${worst}  ${relative}`);\n\t});\n}\n\n/**\n * @returns {Config}\n */\nfunction getConfig () {\n\tconst base = baseConfig;\n\n\tconst args = yargs(hideBin(process.argv)).argv;\n\n\tif (typeof args.testFunction === 'string') {\n\t\t/** @type {ConfigOptions['testFunction']} */\n\t\tbaseConfig.options.testFunction = args.testFunction;\n\t}\n\tif (typeof args.maxTime === 'number') {\n\t\tbaseConfig.options.maxTime = args.maxTime;\n\t}\n\tif (typeof args.language === 'string') {\n\t\tbaseConfig.options.language = args.language;\n\t}\n\tif (typeof args.remotesOnly === 'boolean') {\n\t\tbaseConfig.options.remotesOnly = args.remotesOnly;\n\t}\n\n\treturn base;\n}\n\n/**\n * @param {Config} config\n */\nasync function getCases (config) {\n\t/** @type {Map<string, Set<FileInfo>>} */\n\tconst caseFileCache = new Map();\n\n\t/**\n\t * Returns all files of the test case with the given id.\n\t *\n\t * @param {string} id\n\t */\n\tasync function getCaseFiles (id) {\n\t\tconst cached = caseFileCache.get(id);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst caseEntry = config.cases[id];\n\t\tif (!caseEntry) {\n\t\t\tthrow new Error(`Unknown case \"${id}\"`);\n\t\t}\n\n\t\t/** @type {Set<FileInfo>} */\n\t\tconst files = new Set();\n\t\tcaseFileCache.set(id, files);\n\n\t\tawait Promise.all(\n\t\t\ttoArray(caseEntry.files).map(async uri => {\n\t\t\t\tfiles.add(await getFileInfo(uri));\n\t\t\t})\n\t\t);\n\t\tfor (const extendId of toArray(caseEntry.extends)) {\n\t\t\t(await getCaseFiles(extendId)).forEach(info => files.add(info));\n\t\t}\n\n\t\treturn files;\n\t}\n\n\t/**\n\t * Returns whether the case is enabled by the options provided by the user.\n\t *\n\t * @param {string[]} languages\n\t * @returns {boolean}\n\t */\n\tfunction isEnabled (languages) {\n\t\tif (config.options.language) {\n\t\t\t// test whether the given languages contain any of the required languages\n\t\t\tconst required = new Set(config.options.language.split(/,/).filter(Boolean));\n\t\t\treturn languages.some(l => required.has(l));\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/** @type {Case[]} */\n\tconst cases = [];\n\tfor (const id of Object.keys(config.cases)) {\n\t\tconst parsed = parseLanguageNames(id);\n\n\t\tif (!isEnabled(parsed.languages)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tcases.push({\n\t\t\tid,\n\t\t\tlanguage: parsed.mainLanguage,\n\t\t\tlanguages: parsed.languages,\n\t\t\tfiles: [...(await getCaseFiles(id))].sort((a, b) => a.uri.localeCompare(b.uri)),\n\t\t});\n\t}\n\n\tcases.sort((a, b) => a.id.localeCompare(b.id));\n\n\treturn cases;\n}\n\n/** @type {Map<string, Promise<FileInfo>>} */\nconst fileInfoCache = new Map();\n/**\n * Returns the path and other information for the given file identifier.\n *\n * @param {string} uri\n */\nfunction getFileInfo (uri) {\n\tlet info = fileInfoCache.get(uri);\n\tif (info === undefined) {\n\t\tinfo = getFileInfoUncached(uri);\n\t\tfileInfoCache.set(uri, info);\n\t}\n\treturn info;\n}\n\n/**\n * @param {string} uri\n * @returns {Promise<FileInfo>}\n */\nasync function getFileInfoUncached (uri) {\n\tconst p = await getFilePath(uri);\n\tconst stat = await fs.promises.stat(p);\n\tif (stat.isFile()) {\n\t\treturn {\n\t\t\turi,\n\t\t\tpath: p,\n\t\t\tsize: stat.size,\n\t\t};\n\t}\n\telse {\n\t\tthrow new Error(`Unknown file \"${uri}\"`);\n\t}\n}\n/**\n * Returns the local path of the given file identifier.\n *\n * @param {string} uri\n */\nasync function getFilePath (uri) {\n\tif (/^https:\\/\\//.test(uri)) {\n\t\t// it's a URL, so let's download the file (if not downloaded already)\n\t\tconst downloadDir = path.join(__dirname, 'downloads');\n\t\tawait fs.promises.mkdir(downloadDir, { recursive: true });\n\n\t\t// file path\n\t\tconst hash = crypto.createHash('md5').update(uri).digest('hex');\n\t\tconst localPath = path.resolve(downloadDir, hash + '-' + /[-\\w\\.]*$/.exec(uri)[0]);\n\n\t\tif (!fs.existsSync(localPath)) {\n\t\t\t// download file\n\t\t\tconsole.log(`Downloading ${uri}...`);\n\t\t\tawait fs.promises.writeFile(localPath, await fetch(uri).then(r => r.text()), 'utf8');\n\t\t}\n\n\t\treturn localPath;\n\t}\n\n\t// assume that it's a local file\n\treturn path.resolve(__dirname, uri);\n}\n\n/**\n *\n * @param {Iterable<[string, () => void]>} candidates\n * @param {Options} options\n * @returns {Result[]}\n */\nfunction measureCandidates (candidates, options) {\n\tconst suite = new Benchmark.Suite('temp name');\n\n\tfor (const [name, fn] of candidates) {\n\t\tsuite.add(name, fn, options);\n\t}\n\n\t/** @type {Result[]} */\n\tconst results = [];\n\n\t/**\n\t * @typedef {object} Event\n\t * @property {Result} target\n\t */\n\n\tsuite\n\t\t.on('cycle', (/** @type {Event} */ event) => {\n\t\t\tresults.push({\n\t\t\t\tname: event.target.name,\n\t\t\t\tstats: event.target.stats,\n\t\t\t});\n\t\t})\n\t\t.run();\n\n\treturn results;\n}\n\n/**\n * @param {Result[]} results\n * @returns {Result | null}\n */\nfunction getBest (results) {\n\tif (results.length >= 2) {\n\t\tconst sorted = [...results].sort((a, b) => a.stats.mean - b.stats.mean);\n\t\tconst best = sorted[0].stats;\n\t\tconst secondBest = sorted[1].stats;\n\n\t\t// basically, it's only the best if the two means plus their moe are disjoint\n\t\tif (best.mean + best.moe + secondBest.moe < secondBest.mean) {\n\t\t\treturn sorted[0];\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * @param {Result[]} results\n * @returns {Result | null}\n */\nfunction getWorst (results) {\n\tif (results.length >= 2) {\n\t\tconst sorted = [...results].sort((a, b) => b.stats.mean - a.stats.mean);\n\t\tconst worst = sorted[0].stats;\n\t\tconst secondWorst = sorted[1].stats;\n\n\t\t// basically, it's only the best if the two means plus their moe are disjoint\n\t\t// (moe = margin of error; https://benchmarkjs.com/docs#stats_moe)\n\t\tif (worst.mean - worst.moe - secondWorst.moe > secondWorst.mean) {\n\t\t\treturn sorted[0];\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * Create a new test function from the given Prism instance.\n *\n * @param {Prism} Prism\n * @param {string} mainLanguage\n * @param {string} testFunction\n * @returns {(code: string) => void}\n */\nfunction createTestFunction (Prism, mainLanguage, testFunction) {\n\tif (testFunction === 'tokenize') {\n\t\treturn code => {\n\t\t\tconst grammar = Prism.languageRegistry.getLanguage(mainLanguage)?.resolvedGrammar;\n\t\t\tPrism.tokenize(code, grammar);\n\t\t};\n\t}\n\telse if (testFunction === 'highlight') {\n\t\treturn code => {\n\t\t\tPrism.highlight(code, mainLanguage);\n\t\t};\n\t}\n\telse {\n\t\tthrow new Error(`Unknown test function \"${testFunction}\"`);\n\t}\n}\n\n/**\n * @typedef {object} Candidate\n * @property {string} name\n * @property {(mainLanguage: string, languages: string[]) => Promise<(code: string) => void>} setup\n */\n\n/**\n *\n * @param {Config} config\n * @returns {Promise<Candidate[]>}\n */\nasync function getCandidates (config) {\n\t/** @type {Candidate[]} */\n\tconst candidates = [];\n\n\t// local\n\tif (!config.options.remotesOnly) {\n\t\tconst localPrismLoader = await import('../tests/helper/prism-loader.js');\n\t\tcandidates.push({\n\t\t\tname: 'local',\n\t\t\tasync setup (mainLanguage, languages) {\n\t\t\t\tconst Prism = await localPrismLoader.createInstance(languages);\n\t\t\t\treturn createTestFunction(Prism, mainLanguage, config.options.testFunction);\n\t\t\t},\n\t\t});\n\t}\n\n\t// remotes\n\n\t// prepare base directory\n\tconst remoteBaseDir = path.join(__dirname, 'remotes');\n\tawait fs.promises.mkdir(remoteBaseDir, { recursive: true });\n\n\tconst baseGit = gitP(remoteBaseDir);\n\n\tfor (const remote of config.remotes) {\n\t\tconst user = /[^/]+(?=\\/prism.git)/.exec(remote.repo)[0];\n\t\tconst branch = remote.branch || 'main';\n\t\tconst remoteName = `${user}@${branch}`;\n\t\tconst remoteDir = path.join(remoteBaseDir, `${user}@${branch}`);\n\n\t\tlet remoteGit;\n\t\tif (!fs.existsSync(remoteDir)) {\n\t\t\tconsole.log(`Cloning ${remote.repo}`);\n\t\t\tawait baseGit.clone(remote.repo, remoteName);\n\t\t\tremoteGit = gitP(remoteDir);\n\t\t}\n\t\telse {\n\t\t\tremoteGit = gitP(remoteDir);\n\t\t\tawait remoteGit.fetch('origin', branch); // get latest version of branch\n\t\t}\n\t\tawait remoteGit.checkout(branch); // switch to branch\n\n\t\tconst remotePrismLoader = await import(\n\t\t\tpath.join(remoteDir, 'tests/helper/prism-loader.js')\n\t\t);\n\t\tcandidates.push({\n\t\t\tname: remoteName,\n\t\t\tasync setup (mainLanguage, languages) {\n\t\t\t\tconst Prism = await remotePrismLoader.createInstance(languages);\n\t\t\t\treturn createTestFunction(Prism, mainLanguage, config.options.testFunction);\n\t\t\t},\n\t\t});\n\t}\n\n\treturn candidates;\n}\n\n/**\n * A utility function that converts the given optional array-like value into an array.\n *\n * @template {{}} T\n * @param {T[] | T | undefined | null} value\n * @returns {T[]}\n */\nfunction toArray (value) {\n\tif (Array.isArray(value)) {\n\t\treturn value;\n\t}\n\telse if (value != null) {\n\t\treturn [value];\n\t}\n\telse {\n\t\treturn [];\n\t}\n}\n\nrunBenchmark(getConfig()).catch(error => console.error(error));\n"
  },
  {
    "path": "benchmark/config.js",
    "content": "/**\n * @typedef {object} Config\n * @property {ConfigOptions} options\n * @property {ConfigRemote[]} remotes\n * @property {object} cases\n */\n\n/**\n * @typedef {object} ConfigOptions\n * @property {'tokenize' | 'highlight'} testFunction\n * @property {number} maxTime in seconds\n * @property {string} [language] An optional comma separated list of languages than, if defined, will be the only languages for which the benchmark will be run\n * @property {boolean} [remotesOnly=false] Whether the benchmark will only run with remotes. If `true`, the local project will be ignored\n */\n\n/**\n * @typedef {object} ConfigRemote\n * @property {string} repo\n * @property {string} [branch='main']\n */\n\n/**\n * @typedef {object} ConfigCase\n * @property {string | string[]} [extends]\n * @property {string | string[]} [files]\n */\n\n/** @type {Config} */\nexport const config = {\n\toptions: {\n\t\ttestFunction: 'tokenize',\n\t\tmaxTime: 3,\n\t\tremotesOnly: false,\n\t},\n\n\tremotes: [\n\t\t/**\n\t\t * This will checkout a specific branch from a given repo.\n\t\t *\n\t\t * If no branch is specified, the main branch will be used.\n\t\t */\n\n\t\t{\n\t\t\trepo: 'https://github.com/PrismJS/prism.git',\n\t\t\tbranch: 'v2', // TODO: remove this once we have a new version of Prism\n\t\t},\n\t\t/*{\n\t\t\trepo: 'https://github.com/<Your user name>/prism.git',\n\t\t\tbranch: 'some-brach-you-want-to-test'\n\t\t},*/\n\t],\n\n\tcases: {\n\t\t'css': {\n\t\t\tfiles: ['https://prismjs.com/assets/style.css'],\n\t\t},\n\t\t'css!+css-extras': { extends: 'css' },\n\t\t'javascript': {\n\t\t\textends: 'json',\n\t\t\tfiles: [\n\t\t\t\t'https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.js',\n\t\t\t\t'https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js',\n\t\t\t\t'https://code.jquery.com/jquery-3.4.1.js',\n\t\t\t\t'https://code.jquery.com/jquery-3.4.1.min.js',\n\t\t\t],\n\t\t},\n\t\t'json': {\n\t\t\tfiles: ['../src/components.json', '../package-lock.json'],\n\t\t},\n\t\t'markup': {\n\t\t\tfiles: [\n\t\t\t\t'https://prismjs.com/download.html',\n\t\t\t\t'https://prismjs.com/index.html',\n\t\t\t\t'https://github.com/PrismJS/prism', // the PrismJS/prism GitHub page\n\t\t\t],\n\t\t},\n\t\t'markup!+css+javascript': { extends: 'markup' },\n\t\t'c': {\n\t\t\tfiles: [\n\t\t\t\t'https://raw.githubusercontent.com/git/git/master/remote.h',\n\t\t\t\t'https://raw.githubusercontent.com/git/git/master/remote.c',\n\t\t\t\t'https://raw.githubusercontent.com/git/git/master/mergesort.c',\n\t\t\t\t'https://raw.githubusercontent.com/git/git/master/mergesort.h',\n\t\t\t],\n\t\t},\n\t\t'ruby': {\n\t\t\tfiles: [\n\t\t\t\t'https://raw.githubusercontent.com/rails/rails/master/actionview/lib/action_view/base.rb',\n\t\t\t\t'https://raw.githubusercontent.com/rails/rails/master/actionview/lib/action_view/layouts.rb',\n\t\t\t\t'https://raw.githubusercontent.com/rails/rails/master/actionview/lib/action_view/template.rb',\n\t\t\t],\n\t\t},\n\t\t'rust': {\n\t\t\tfiles: [\n\t\t\t\t'https://raw.githubusercontent.com/rust-lang/regex/master/src/utf8.rs',\n\t\t\t\t'https://raw.githubusercontent.com/rust-lang/regex/master/src/compile.rs',\n\t\t\t\t'https://raw.githubusercontent.com/rust-lang/regex/master/src/lib.rs',\n\t\t\t],\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "composer.json",
    "content": "{\n\t\"name\": \"prismjs/prism\",\n\t\"description\": \"Lightweight, robust, elegant syntax highlighting. A spin-off project from Dabblet.\",\n\t\"type\": \"component\",\n\t\"license\": \"MIT\",\n\t\"extra\": {\n\t\t\"component\": {\n\t\t\t\"scripts\": [\n\t\t\t\t\"prism.js\"\n\t\t\t],\n\t\t\t\"styles\": [\n\t\t\t\t\"themes/prism.css\"\n\t\t\t],\n\t\t\t\"files\": [\n\t\t\t\t\"themes/*\",\n\t\t\t\t\"components/*\"\n\t\t\t]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "dangerfile.js",
    "content": "import { markdown } from 'danger';\nimport { gzipSize } from 'gzip-size';\nimport { simpleGit } from 'simple-git';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst git = simpleGit({ baseDir: __dirname });\n\n/**\n * Returns the contents of a text file in the base of the PR.\n *\n * The base is usually PrismJS/prism/master.\n *\n * @param {string} path\n * @returns {Promise<string>}\n */\nfunction readBaseFile (path) {\n\treturn fs.readFile(path, 'utf-8');\n}\n/**\n * Returns the contents of a text file in the pull request branch.\n *\n * @param {string} path\n * @returns {Promise<string>}\n */\nfunction readPRFile (path) {\n\treturn git.show([`pr:${path}`]);\n}\n\n/**\n * Returns the relative paths of all files changed in the PR.\n *\n * @returns {Promise<string[]>}\n */\nconst getChangedFiles = async () => {\n\t// Determine the merge base between master and the PR branch.\n\t// If files changed in master since PR was branched they would show in the diff otherwise.\n\t// https://stackoverflow.com/questions/25071579/list-all-files-changed-in-a-pull-request-in-git-github\n\tconst mergeBase = (await git.raw(['merge-base', 'pr', 'HEAD'])).trim();\n\tconst result = await git.diff(['--name-only', '--no-renames', 'pr', mergeBase]);\n\treturn (result || '').trim().split(/\\r?\\n/g);\n};\n\nconst getChangedMinifiedFiles = async () => {\n\tconst changed = await getChangedFiles();\n\treturn changed.filter(file => file.endsWith('.min.js'));\n};\n\n// https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript\nconst formatBytes = (bytes, decimals = 2) => {\n\tif (bytes === 0) {\n\t\treturn '0 Bytes';\n\t}\n\n\tconst k = 1000;\n\tconst dm = decimals < 0 ? 0 : decimals;\n\tconst sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n\tconst i = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));\n\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\n\nconst maybePlus = (from, to) => (from < to ? '+' : '');\n\nconst absDiff = (from, to) => {\n\tif (from === to) {\n\t\treturn formatBytes(0);\n\t}\n\n\treturn `${maybePlus(from, to)}${formatBytes(to - from)}`;\n};\n\nconst percDiff = (from, to) => {\n\tif (from === to) {\n\t\treturn '0%';\n\t}\n\n\treturn `${maybePlus(from, to)}${((100 * (to - from)) / (from || to)).toFixed(1)}%`;\n};\n\nconst getSummary = (rows, totalMasterFileSize, totalFileSize) => {\n\tconst numFiles = rows.length;\n\tconst maybeS = rows.length > 0 ? 's' : '';\n\tconst byteDiff = absDiff(totalMasterFileSize, totalFileSize);\n\tconst percentDiff = percDiff(totalMasterFileSize, totalFileSize);\n\n\treturn `A total of ${numFiles} file${maybeS} have changed, with a combined diff of ${byteDiff} (${percentDiff}).`;\n};\n\nconst run = async () => {\n\tconst minified = await getChangedMinifiedFiles();\n\n\tif (minified.length === 0) {\n\t\tmarkdown(`## No JS Changes`);\n\t\treturn;\n\t}\n\n\tconst rows = [];\n\tlet totalFileSize = 0;\n\tlet totalMasterFileSize = 0;\n\n\tfor (const file of minified) {\n\t\tconst [fileContents, fileMasterContents] = await Promise.all([\n\t\t\treadPRFile(file).catch(() => ''),\n\t\t\treadBaseFile(file).catch(() => ''),\n\t\t]);\n\n\t\tconst [fileSize, fileMasterSize] = await Promise.all([\n\t\t\tgzipSize(fileContents),\n\t\t\tgzipSize(fileMasterContents),\n\t\t]);\n\n\t\ttotalFileSize += fileSize;\n\t\ttotalMasterFileSize += fileMasterSize;\n\n\t\trows.push([\n\t\t\tfile,\n\t\t\tformatBytes(fileMasterSize),\n\t\t\tformatBytes(fileSize),\n\t\t\tabsDiff(fileMasterSize, fileSize),\n\t\t\tpercDiff(fileMasterSize, fileSize),\n\t\t]);\n\t}\n\n\tmarkdown(`## JS File Size Changes (gzipped)\n\n${getSummary(rows, totalMasterFileSize, totalFileSize)}\n\n<details>\n\n| file | master | pull | size diff | % diff |\n| --- | --- | --- | --- | --- |\n${rows.map(row => `| ${row.join(' | ')} |`).join('\\n')}\n\n</details>\n`);\n};\n\nrun().catch(err => {\n\tconsole.error(err);\n\tprocess.exit(1);\n});\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import js from '@eslint/js';\n\nimport { defineConfig } from 'eslint/config';\nimport eslintConfigPrettier from 'eslint-config-prettier/flat';\nimport eslintCommentsPlugin from 'eslint-plugin-eslint-comments';\nimport jsdocPlugin from 'eslint-plugin-jsdoc';\nimport regexpPlugin from 'eslint-plugin-regexp';\nimport globals from 'globals';\n\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst config = [\n\t{\n\t\tignores: ['benchmark/downloads', 'benchmark/remotes', 'dist', 'node_modules', 'src/types.d.ts', 'types'],\n\t},\n\tjs.configs.recommended,\n\t{\n\t\tplugins: {\n\t\t\tjsdoc: jsdocPlugin,\n\t\t\tregexp: regexpPlugin,\n\t\t},\n\t\tlanguageOptions: {\n\t\t\tecmaVersion: 'latest',\n\t\t\tsourceType: 'module',\n\t\t\tglobals: {\n\t\t\t\t...globals.browser,\n\t\t\t\t...globals.node,\n\t\t\t},\n\t\t},\n\t\trules: {\n\t\t\t'no-use-before-define': ['warn', { 'functions': false, 'classes': false }],\n\t\t\t'eqeqeq': ['warn', 'always', { 'null': 'ignore' }],\n\n\t\t\t// stylistic rules\n\t\t\t'no-var': 'warn',\n\t\t\t'object-shorthand': ['warn', 'always', { avoidQuotes: true }],\n\t\t\t'one-var': ['warn', 'never'],\n\t\t\t'prefer-arrow-callback': 'warn',\n\t\t\t'prefer-const': ['warn', { 'destructuring': 'all' }],\n\t\t\t'prefer-spread': 'warn',\n\n\t\t\t// JSDoc\n\t\t\t'jsdoc/check-alignment': 'warn',\n\t\t\t'jsdoc/check-syntax': 'warn',\n\t\t\t'jsdoc/check-param-names': 'warn',\n\t\t\t'jsdoc/require-hyphen-before-param-description': ['warn', 'never'],\n\t\t\t'jsdoc/check-tag-names': 'warn',\n\t\t\t'jsdoc/check-types': 'warn',\n\t\t\t'jsdoc/empty-tags': 'warn',\n\t\t\t'jsdoc/tag-lines': [1, 'any', { 'startLines': 1 }],\n\t\t\t'jsdoc/require-param-name': 'warn',\n\t\t\t'jsdoc/require-property-name': 'warn',\n\n\t\t\t// regexp\n\t\t\t'regexp/no-dupe-disjunctions': 'warn',\n\t\t\t'regexp/no-empty-alternative': 'warn',\n\t\t\t'regexp/no-empty-capturing-group': 'warn',\n\t\t\t'regexp/no-empty-lookarounds-assertion': 'warn',\n\t\t\t'regexp/no-lazy-ends': 'warn',\n\t\t\t'regexp/no-obscure-range': 'warn',\n\t\t\t'regexp/no-optional-assertion': 'warn',\n\t\t\t'regexp/no-standalone-backslash': 'warn',\n\t\t\t'regexp/no-super-linear-backtracking': 'warn',\n\t\t\t'regexp/no-unused-capturing-group': 'warn',\n\t\t\t'regexp/no-zero-quantifier': 'warn',\n\t\t\t'regexp/optimal-lookaround-quantifier': 'warn',\n\n\t\t\t'regexp/match-any': 'warn',\n\t\t\t'regexp/negation': 'warn',\n\t\t\t'regexp/no-dupe-characters-character-class': 'warn',\n\t\t\t'regexp/no-trivially-nested-assertion': 'warn',\n\t\t\t'regexp/no-trivially-nested-quantifier': 'warn',\n\t\t\t'regexp/no-useless-character-class': 'warn',\n\t\t\t'regexp/no-useless-flag': 'warn',\n\t\t\t'regexp/no-useless-lazy': 'warn',\n\t\t\t'regexp/no-useless-range': 'warn',\n\t\t\t'regexp/prefer-d': ['warn', { insideCharacterClass: 'ignore' }],\n\t\t\t'regexp/prefer-plus-quantifier': 'warn',\n\t\t\t'regexp/prefer-question-quantifier': 'warn',\n\t\t\t'regexp/prefer-star-quantifier': 'warn',\n\t\t\t'regexp/prefer-w': 'warn',\n\t\t\t'regexp/sort-alternatives': 'warn',\n\t\t\t'regexp/sort-flags': 'warn',\n\t\t\t'regexp/strict': 'warn',\n\n\t\t\t// I turned this rule off because we use `hasOwnProperty` in a lot of places\n\t\t\t// TODO: Think about re-enabling this rule\n\t\t\t'no-prototype-builtins': 'off',\n\t\t\t// TODO: Think about re-enabling this rule\n\t\t\t'no-inner-declarations': 'off',\n\t\t\t// TODO: Think about re-enabling this rule\n\t\t\t'no-sparse-arrays': 'off',\n\n\t\t\t// turning off some regex rules\n\t\t\t// these are supposed to protect against accidental use but we need those quite often\n\t\t\t'no-control-regex': 'off',\n\t\t\t'no-empty-character-class': 'off',\n\t\t\t'no-useless-escape': 'off',\n\t\t},\n\t\tsettings: {\n\t\t\tregexp: {\n\t\t\t\t// allow alphanumeric and cyrillic ranges\n\t\t\t\tallowedCharacterRanges: ['alphanumeric', 'а-я', 'А-Я'],\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tfiles: ['**/*.js'],\n\t\tplugins: {\n\t\t\t'eslint-comments': eslintCommentsPlugin,\n\t\t\t'regexp': regexpPlugin,\n\t\t},\n\t\trules: {\n\t\t\t...eslintCommentsPlugin.configs.recommended.rules,\n\t\t\t...regexpPlugin.configs.recommended.rules,\n\n\t\t\t'no-use-before-define': 'off',\n\n\t\t\t// I turned this rule off because we use `hasOwnProperty` in a lot of places\n\t\t\t// TODO: Think about re-enabling this rule\n\t\t\t'no-prototype-builtins': 'off',\n\n\t\t\t// turning off some regex rules\n\t\t\t// these are supposed to protect against accidental use but we need those quite often\n\t\t\t'no-control-regex': 'off',\n\t\t\t'no-empty-character-class': 'off',\n\t\t\t'no-useless-escape': 'off',\n\n\t\t\t'eslint-comments/disable-enable-pair': ['warn', { allowWholeFile: true }],\n\t\t},\n\t},\n\t{\n\t\t// Browser-specific parts\n\t\tfiles: ['src/auto-start.js'],\n\t\tlanguageOptions: {\n\t\t\tglobals: {\n\t\t\t\t...globals.browser,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\t// Plugins\n\t\tfiles: ['src/plugins/**/*.js'],\n\t\tlanguageOptions: {\n\t\t\tglobals: {\n\t\t\t\t...globals.browser,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\t// Test files\n\t\tfiles: ['tests/**'],\n\t\tlanguageOptions: {\n\t\t\tglobals: {\n\t\t\t\t...globals.mocha,\n\t\t\t\t...globals.node,\n\t\t\t},\n\t\t\tparserOptions: {\n\t\t\t\ttsconfigRootDir: __dirname,\n\t\t\t\tproject: ['./tests/tsconfig.json'],\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\t// Benchmark\n\t\tfiles: ['benchmark/**'],\n\t\tlanguageOptions: {\n\t\t\tglobals: {\n\t\t\t\t...globals.node,\n\t\t\t},\n\t\t\tparserOptions: {\n\t\t\t\ttsconfigRootDir: __dirname,\n\t\t\t\tproject: ['./benchmark/tsconfig.json'],\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\t// Scripts\n\t\tfiles: ['scripts/**'],\n\t\tlanguageOptions: {\n\t\t\tglobals: {\n\t\t\t\t...globals.node,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\t// Danger\n\t\tfiles: ['dangerfile.js'],\n\t\tlanguageOptions: {\n\t\t\tglobals: {\n\t\t\t\t...globals.node,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\t// This file\n\t\tfiles: ['eslint.config.mjs'],\n\t\tlanguageOptions: {\n\t\t\tglobals: {\n\t\t\t\t...globals.node,\n\t\t\t},\n\t\t},\n\t},\n\teslintConfigPrettier,\n];\n\nexport default defineConfig(replaceErrorsWithWarnings(config));\n\n/*\n * Many recommended ESLint configs default to \"error\" severity for some rules.\n * However, we want all rules only to warn, not error.\n * This function recursively traverses the config and downgrades all \"error\" severities to \"warn\".\n * This ensures a consistent linting experience, even when extending third-party configs that use \"error\" by default.\n */\nfunction replaceErrorsWithWarnings (config) {\n\tif (Array.isArray(config)) {\n\t\treturn config.map(replaceErrorsWithWarnings);\n\t}\n\n\tif (typeof config === 'object' && config !== null) {\n\t\tconst newConfig = { ...config };\n\n\t\tif (newConfig.rules) {\n\t\t\tnewConfig.rules = Object.fromEntries(\n\t\t\t\tObject.entries(newConfig.rules).map(([rule, setting]) => {\n\t\t\t\t\tif (setting === 'error' || setting === 2) {\n\t\t\t\t\t\treturn [rule, 'warn'];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Array.isArray(setting) && (setting[0] === 'error' || setting[0] === 2)) {\n\t\t\t\t\t\treturn [rule, ['warn', ...setting.slice(1)]];\n\t\t\t\t\t}\n\n\t\t\t\t\treturn [rule, setting];\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\n\t\tif (newConfig.overrides) {\n\t\t\tnewConfig.overrides = replaceErrorsWithWarnings(newConfig.overrides);\n\t\t}\n\n\t\treturn newConfig;\n\t}\n\n\treturn config;\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n\t\"name\": \"prismjs\",\n\t\"version\": \"1.29.0\",\n\t\"description\": \"Lightweight, robust, elegant syntax highlighting.\",\n\t\"type\": \"module\",\n\t\"main\": \"./dist/cjs/index.js\",\n\t\"module\": \"./dist/index.js\",\n\t\"types\": \"./types/index.d.ts\",\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"types\": \"./types/index.d.ts\",\n\t\t\t\"import\": \"./dist/index.js\",\n\t\t\t\"require\": \"./dist/cjs/index.js\"\n\t\t},\n\t\t\"./shared\": {\n\t\t\t\"types\": \"./types/shared.d.ts\",\n\t\t\t\"import\": \"./dist/shared.js\",\n\t\t\t\"require\": \"./dist/cjs/shared.js\"\n\t\t},\n\t\t\"./languages/*\": {\n\t\t\t\"types\": \"./types/languages/*.d.ts\",\n\t\t\t\"import\": \"./dist/languages/*.js\",\n\t\t\t\"require\": \"./dist/cjs/languages/*.js\"\n\t\t},\n\t\t\"./plugins/*\": {\n\t\t\t\"types\": \"./types/plugins/*.d.ts\",\n\t\t\t\"import\": \"./dist/plugins/*.js\",\n\t\t\t\"require\": \"./dist/cjs/plugins/*.js\"\n\t\t},\n\t\t\"./themes/*\": \"./dist/themes/*.css\",\n\t\t\"./components.json\": \"./dist/components.json\"\n\t},\n\t\"style\": \"themes/prism.css\",\n\t\"engines\": {\n\t\t\"node\": \">=18\"\n\t},\n\t\"scripts\": {\n\t\t\"benchmark\": \"node benchmark/benchmark.js\",\n\t\t\"build\": \"node scripts/build.js\",\n\t\t\"lint\": \"eslint . --cache\",\n\t\t\"lint:fix\": \"npm run lint -- --fix\",\n\t\t\"lint:ci\": \"eslint . --max-warnings 0\",\n\t\t\"regex-coverage\": \"mocha tests/coverage.js\",\n\t\t\"test:components\": \"mocha tests/components-test.js\",\n\t\t\"test:core\": \"mocha tests/core/**/*.js\",\n\t\t\"test:identifiers\": \"mocha tests/identifier-test.js\",\n\t\t\"test:languages\": \"mocha tests/run.js\",\n\t\t\"test:patterns\": \"mocha tests/pattern-tests.js\",\n\t\t\"test:plugins\": \"mocha tests/plugins/**/*.js\",\n\t\t\"test:runner\": \"mocha tests/testrunner-tests.js\",\n\t\t\"test\": \"npm-run-all test:*\",\n\t\t\"typecheck:core\": \"tsc\",\n\t\t\"typecheck:tests\": \"tsc -p tests/tsconfig.json\",\n\t\t\"typecheck\": \"npm-run-all typecheck:*\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/PrismJS/prism.git\"\n\t},\n\t\"keywords\": [\n\t\t\"prism\",\n\t\t\"highlight\"\n\t],\n\t\"author\": \"Lea Verou\",\n\t\"license\": \"MIT\",\n\t\"funding\": {\n\t\t\"type\": \"opencollective\",\n\t\t\"url\": \"https://opencollective.com/prismjs\"\n\t},\n\t\"readmeFilename\": \"README.md\",\n\t\"devDependencies\": {\n\t\t\"@eslint/js\": \"^9.24.0\",\n\t\t\"@ianvs/prettier-plugin-sort-imports\": \"^4.4.1\",\n\t\t\"@prettier/sync\": \"^0.6.1\",\n\t\t\"@rollup/plugin-commonjs\": \"^29.0.2\",\n\t\t\"@rollup/plugin-terser\": \"^1.0.0\",\n\t\t\"@types/benchmark\": \"^2.1.2\",\n\t\t\"@types/chai\": \"^5.2.1\",\n\t\t\"@types/clean-css\": \"^4.2.11\",\n\t\t\"@types/jsdom\": \"^21.1.7\",\n\t\t\"@types/mocha\": \"^10.0.10\",\n\t\t\"@types/node\": \"^22.15.2\",\n\t\t\"@types/yargs\": \"^17.0.33\",\n\t\t\"benchmark\": \"^2.1.4\",\n\t\t\"chai\": \"^5.2.0\",\n\t\t\"clean-css\": \"^5.3.3\",\n\t\t\"cross-fetch\": \"^4.1.0\",\n\t\t\"danger\": \"^13.0.4\",\n\t\t\"eslint\": \"^9.24.0\",\n\t\t\"eslint-config-prettier\": \"^10.1.2\",\n\t\t\"eslint-plugin-eslint-comments\": \"^3.2.0\",\n\t\t\"eslint-plugin-jsdoc\": \"^50.6.9\",\n\t\t\"eslint-plugin-regexp\": \"^2.7.0\",\n\t\t\"globals\": \"^16.0.0\",\n\t\t\"gzip-size\": \"^7.0.0\",\n\t\t\"htmlparser2\": \"^10.0.0\",\n\t\t\"jsdom\": \"^24.1.3\",\n\t\t\"magic-string\": \"^0.30.17\",\n\t\t\"mocha\": \"^11.7.5\",\n\t\t\"mocha-chai-jest-snapshot\": \"^1.1.7\",\n\t\t\"npm-run-all\": \"^4.1.5\",\n\t\t\"prettier\": \"^3.5.3\",\n\t\t\"prettier-plugin-brace-style\": \"^0.10.0\",\n\t\t\"prettier-plugin-merge\": \"^0.10.0\",\n\t\t\"prettier-plugin-space-before-function-paren\": \"^0.0.10\",\n\t\t\"refa\": \"^0.9.1\",\n\t\t\"regexp-ast-analysis\": \"^0.5.1\",\n\t\t\"regexpp\": \"^3.2.0\",\n\t\t\"rollup\": \"^4.40.0\",\n\t\t\"scslre\": \"^0.3.0\",\n\t\t\"simple-git\": \"^3.27.0\",\n\t\t\"typescript\": \"^5.8.3\",\n\t\t\"webfont\": \"^11.2.26\",\n\t\t\"yargs\": \"^17.7.2\"\n\t},\n\t\"jspm\": {\n\t\t\"main\": \"prism\",\n\t\t\"registry\": \"jspm\",\n\t\t\"jspmPackage\": true,\n\t\t\"format\": \"global\",\n\t\t\"files\": [\n\t\t\t\"components/**/*.js\",\n\t\t\t\"plugins/**/*\",\n\t\t\t\"themes/*.css\",\n\t\t\t\"prism.js\"\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "scripts/build.js",
    "content": "import fs from 'fs';\nimport { copyFile, mkdir, readFile, rm, writeFile } from 'fs/promises';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport commonjs from '@rollup/plugin-commonjs';\nimport rollupTerser from '@rollup/plugin-terser';\nimport CleanCSS from 'clean-css';\nimport MagicString from 'magic-string';\nimport { rollup } from 'rollup';\nimport ts from 'typescript';\nimport { webfont } from 'webfont';\nimport components from '../src/components.json' with { type: 'json' };\nimport { toArray } from '../src/util/iterables.js';\nimport { parallel, runTask, series } from './tasks.js';\n\n/** @typedef {import('rollup').OutputOptions} OutputOptions */\n/** @typedef {import('rollup').Plugin} Plugin */\n/** @typedef {import('rollup').RollupBuild} RollupBuild */\n/** @typedef {import('rollup').RollupOptions} RollupOptions */\n/** @typedef {import('rollup').SourceMapInput} SourceMapInput */\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst SRC_DIR = path.join(__dirname, '../src/');\nconst DIST_DIR = path.join(__dirname, '../dist');\n\nconst languageIds = fs\n\t.readdirSync(path.join(SRC_DIR, 'languages'))\n\t.map(f => f.slice(0, -'.js'.length))\n\t.sort();\nconst pluginIds = fs.readdirSync(path.join(SRC_DIR, 'plugins')).sort();\nconst themeIds = fs\n\t.readdirSync(path.join(SRC_DIR, 'themes'))\n\t.filter(f => /\\.css$/i.test(f))\n\t.map(f => f.slice(0, -'.css'.length))\n\t.sort();\n\n/**\n * @param {string} id\n */\nasync function loadComponent (id) {\n\tlet file;\n\tif (pluginIds.includes(id)) {\n\t\tfile = path.join(SRC_DIR, `plugins/${id}/${id}.js`);\n\t}\n\telse {\n\t\tfile = path.join(SRC_DIR, `languages/${id}.js`);\n\t}\n\tconst exports = await import(file);\n\treturn exports.default;\n}\n\nasync function minifyCSS () {\n\tconst input = {};\n\n\tfor (const id of themeIds) {\n\t\tinput[`themes/${id}.css`] = path.join(SRC_DIR, `themes/${id}.css`);\n\t}\n\n\tfor (const id of pluginIds) {\n\t\tconst file = path.join(SRC_DIR, `plugins/${id}/${id}.css`);\n\t\tif (fs.existsSync(file)) {\n\t\t\tinput[`plugins/${id}.css`] = file;\n\t\t}\n\t}\n\n\tconst clean = new CleanCSS({});\n\n\tawait Promise.all(\n\t\tObject.entries(input).map(async ([target, file]) => {\n\t\t\tconst content = await readFile(file, 'utf-8');\n\t\t\tconst output = clean.minify(content);\n\t\t\tif (output.errors.length > 0) {\n\t\t\t\tthrow new Error(`CSS minify error:\\n${output.errors.join('\\n')}`);\n\t\t\t}\n\t\t\tfor (const warn of output.warnings) {\n\t\t\t\tconsole.warn(`${file}: ${warn}`);\n\t\t\t}\n\n\t\t\tconst targetFile = path.join(DIST_DIR, target);\n\t\t\tawait mkdir(path.dirname(targetFile), { recursive: true });\n\t\t\tawait writeFile(targetFile, output.styles, 'utf-8');\n\t\t})\n\t);\n}\n\nasync function treeviewIconFont () {\n\t// List of all icons\n\t// Add new icons to the end of the list.\n\tconst iconList = [\n\t\t'file',\n\t\t'folder',\n\t\t'image',\n\t\t'audio',\n\t\t'video',\n\t\t'text',\n\t\t'code',\n\t\t'archive',\n\t\t'pdf',\n\t\t'excel',\n\t\t'powerpoint',\n\t\t'word',\n\t];\n\tconst fontName = 'PrismTreeview';\n\n\t// generate the font\n\tconst result = await webfont({\n\t\tfiles: iconList.map(n => `src/plugins/treeview-icons/icons/${n}.svg`),\n\t\tformats: ['woff'],\n\t\tfontName,\n\t\tsort: false,\n\t});\n\n\tconst woff = result.woff;\n\tconst glyphsData = result.glyphsData;\n\n\tconst fontFace = `\n/* @GENERATED-FONT */\n@font-face {\n\tfont-family: \"${fontName}\";\n\t/**\n\t * This font is generated from the .svg files in the \\`icons\\` folder. See the \\`treeviewIconFont\\` function in\n\t * \\`scripts/build.js\\` for more information.\n\t *\n\t * Use the following escape sequences to refer to a specific icon:\n\t *\n\t * - ${glyphsData\n\t\t\t.map(({ metadata }) => {\n\t\t\t\tconst codePoint = metadata.unicode[0].codePointAt(0);\n\t\t\t\treturn `\\\\${codePoint.toString(16)} ${metadata.name}`;\n\t\t\t})\n\t\t\t.join('\\n\\t * - ')}\n\t */\n\tsrc: url(\"data:application/font-woff;base64,${woff.toString('base64')}\")\n\t\tformat(\"woff\");\n}\n`.trim();\n\n\tconst cssPath = 'src/plugins/treeview-icons/treeview-icons.css';\n\tconst fontFaceRegex =\n\t\t/\\/\\*\\s*@GENERATED-FONT\\s*\\*\\/\\s*@font-face\\s*\\{(?:[^{}/]|\\/(?!\\*)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*\\}/;\n\n\tconst css = fs.readFileSync(cssPath, 'utf-8');\n\tfs.writeFileSync(cssPath, css.replace(fontFaceRegex, fontFace), 'utf-8');\n}\n\nconst dataToInsert = {\n\taliases_placeholder: async () => {\n\t\tconst data = await Promise.all(\n\t\t\t[...languageIds, ...pluginIds].map(async id => {\n\t\t\t\tconst proto = await loadComponent(id);\n\t\t\t\treturn { id, alias: toArray(proto.alias) };\n\t\t\t})\n\t\t);\n\t\treturn Object.fromEntries(data.flatMap(({ id, alias }) => alias.map(a => [a, id])));\n\t},\n\tall_languages_placeholder: () => Promise.resolve(languageIds),\n\ttitle_placeholder: async () => {\n\t\t/** @type {Map<string, string>} */\n\t\tconst rawTitles = new Map();\n\t\tfor (const [id, entry] of Object.entries(components.languages)) {\n\t\t\tif (id === 'meta') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\trawTitles.set(id, entry.title);\n\t\t\tfor (const [alias, title] of Object.entries(entry.aliasTitles || {})) {\n\t\t\t\trawTitles.set(alias, title);\n\t\t\t}\n\t\t}\n\n\t\tconst data = (\n\t\t\tawait Promise.all(\n\t\t\t\tlanguageIds.map(async id => {\n\t\t\t\t\tconst proto = await loadComponent(id);\n\t\t\t\t\tconst title = rawTitles.get(id);\n\t\t\t\t\tif (!title) {\n\t\t\t\t\t\tthrow new Error(`No title for ${id}`);\n\t\t\t\t\t}\n\t\t\t\t\treturn [id, ...toArray(proto.alias)].map(name => ({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttitle: rawTitles.get(id) ?? title,\n\t\t\t\t\t}));\n\t\t\t\t})\n\t\t\t)\n\t\t).flat();\n\t\tdata.push({ name: 'none', title: 'Plain text' });\n\n\t\t/**\n\t\t * Tries to guess the name of a language given its id.\n\t\t *\n\t\t * @param {string} name The language id.\n\t\t */\n\t\tfunction guessTitle (name) {\n\t\t\treturn (name.substring(0, 1).toUpperCase() + name.substring(1)).replace(\n\t\t\t\t/s(?=cript)/,\n\t\t\t\t'S'\n\t\t\t);\n\t\t}\n\n\t\treturn Object.fromEntries(\n\t\t\tdata\n\t\t\t\t.filter(({ name, title }) => guessTitle(name) !== title)\n\t\t\t\t.map(({ name, title }) => [name, title])\n\t\t);\n\t},\n};\n\n/** @type {Plugin} */\nconst dataInsertPlugin = {\n\tname: 'data-insert',\n\tasync renderChunk (code, chunk) {\n\t\tconst pattern = /\\/\\*\\s*(\\w+)\\[\\s*\\*\\/[\\s\\S]*?\\/\\*\\s*\\]\\s*\\*\\//g;\n\n\t\t// search for placeholders\n\t\t/** @type {Set<string>} */\n\t\tconst contained = new Set();\n\t\tlet m;\n\t\twhile ((m = pattern.exec(code))) {\n\t\t\tcontained.add(m[1]);\n\t\t}\n\n\t\tif (contained.size === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// fetch placeholder data\n\t\tconst dataByName = {};\n\t\tfor (const name of contained) {\n\t\t\tif (name in dataToInsert) {\n\t\t\t\tdataByName[name] = await dataToInsert[name]();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unknown placeholder ${name} in ${chunk.fileName}`);\n\t\t\t}\n\t\t}\n\n\t\t// replace placeholders\n\t\tconst str = new MagicString(code);\n\t\tstr.replace(pattern, (_, /** @type {string} */ name) => {\n\t\t\treturn JSON.stringify(dataByName[name]);\n\t\t});\n\t\treturn toRenderedChunk(str);\n\t},\n};\n\n/** @type {Plugin} */\nconst inlineRegexSourcePlugin = {\n\tname: 'inline-regex-source',\n\trenderChunk (code) {\n\t\tconst str = new MagicString(code);\n\t\tstr.replace(\n\t\t\t/\\/((?:[^\\n\\r[\\\\\\/]|\\\\.|\\[(?:[^\\n\\r\\\\\\]]|\\\\.)*\\])+)\\/\\s*\\.\\s*source\\b/g,\n\t\t\t(m, /** @type {string} */ source) => {\n\t\t\t\t// escape backslashes\n\t\t\t\tsource = source.replace(\n\t\t\t\t\t/\\\\(.)|\\[(?:\\\\s\\\\S|\\\\S\\\\s)\\]/g,\n\t\t\t\t\t(m, /** @type {string} */ g1) => {\n\t\t\t\t\t\tif (g1) {\n\t\t\t\t\t\t\t// characters like /\\n/ can just be kept as \"\\n\" instead of being escaped to \"\\\\n\"\n\t\t\t\t\t\t\tif (/[nrt0/]/.test(g1)) {\n\t\t\t\t\t\t\t\treturn m;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ('\\\\' === g1) {\n\t\t\t\t\t\t\t\treturn '\\\\\\\\\\\\\\\\'; // escape using 4 backslashes\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn '\\\\\\\\' + g1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treturn '[^]';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\t// escape single quotes\n\t\t\t\tsource = source.replace(/'/g, \"\\\\'\");\n\t\t\t\t// wrap source in single quotes\n\t\t\t\treturn \"'\" + source + \"'\";\n\t\t\t}\n\t\t);\n\t\treturn toRenderedChunk(str);\n\t},\n};\n\n/**\n * This plugin wraps bare grammar objects into functions.\n *\n * When a grammar is defined as `{ id: 'foo', grammar: { ...tokens } }`, those tokens will be evaluated eagerly.\n * This is a problem because eagerly evaluating hundreds of grammars when loading a page and only using a few of them\n * is a waste of CPU and memory, and it causes the JS thread to be block for roughly 200ms during page load.\n *\n * @see https://github.com/PrismJS/prism/issues/2768\n *\n * @type {Plugin}\n */\nconst lazyGrammarPlugin = {\n\tname: 'lazy-grammar',\n\trenderChunk (code) {\n\t\tconst str = new MagicString(code);\n\t\tstr.replace(\n\t\t\t/^(?<indent>[ \\t]+)grammar: (\\{[\\s\\S]*?^\\k<indent>\\})/m,\n\t\t\t(m, _, /** @type {string} */ grammar) => `\\tgrammar: () => (${grammar})`\n\t\t);\n\t\treturn toRenderedChunk(str);\n\t},\n};\n\n/**\n * @param {MagicString} s\n * @returns {{ code: string; map: SourceMapInput }}\n */\nfunction toRenderedChunk (s) {\n\treturn {\n\t\tcode: s.toString(),\n\t\tmap: s.generateMap({ hires: true }),\n\t};\n}\n\nconst terserPlugin = rollupTerser({\n\tecma: 2020,\n\tmodule: true,\n\tcompress: {\n\t\tpasses: 4,\n\t\tunsafe: true,\n\t\tunsafe_arrows: true,\n\t\tunsafe_math: true,\n\t\tunsafe_regexp: true,\n\t},\n\tformat: {\n\t\tcomments: false,\n\t},\n\tkeep_classnames: true,\n});\n\nasync function clean () {\n\tconst outputDir = path.join(__dirname, '../dist');\n\tconst typesDir = path.join(__dirname, '../types');\n\tawait Promise.all([\n\t\trm(outputDir, { recursive: true, force: true }),\n\t\trm(typesDir, { recursive: true, force: true }),\n\t]);\n}\n\nasync function copyComponentsJson () {\n\tconst from = path.join(SRC_DIR, 'components.json');\n\tconst to = path.join(__dirname, '../dist/components.json');\n\tawait copyFile(from, to);\n}\n\nasync function buildTypes () {\n\tawait mkdir('./types');\n\n\t// Copy existing type definitions\n\tconst typeFiles = ['types.d.ts'];\n\n\tawait Promise.all(\n\t\ttypeFiles.map(file => copyFile(path.join(SRC_DIR, file), path.join('./types', file)))\n\t);\n\n\tconst configPath = ts.findConfigFile('./', ts.sys.fileExists, 'tsconfig.json');\n\n\tif (!configPath) {\n\t\tthrow new Error('Could not find tsconfig.json');\n\t}\n\n\tconst configFile = ts.readConfigFile(configPath, ts.sys.readFile);\n\tconst parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, './');\n\n\t/** @type {ts.CompilerOptions} */\n\tconst compilerOptions = {\n\t\t...parsedConfig.options,\n\t\tdeclaration: true,\n\t\temitDeclarationOnly: true,\n\t\toutDir: './types',\n\t\trootDir: './src',\n\t\tnoEmit: false,\n\t\tnoEmitOnError: false,\n\t};\n\n\tconst program = ts.createProgram(parsedConfig.fileNames, compilerOptions);\n\n\tprogram.emit();\n}\n\nasync function buildJS () {\n\tconst input = {\n\t\t'index': path.join(SRC_DIR, 'index.js'),\n\t\t'global': path.join(SRC_DIR, 'global.js'),\n\t\t'prism': path.join(SRC_DIR, 'prism.global.js'),\n\t\t'shared': path.join(SRC_DIR, 'shared.js'),\n\t};\n\tfor (const id of languageIds) {\n\t\tinput[`languages/${id}`] = path.join(SRC_DIR, `languages/${id}.js`);\n\t}\n\tfor (const id of pluginIds) {\n\t\tinput[`plugins/${id}`] = path.join(SRC_DIR, `plugins/${id}/${id}.js`);\n\t}\n\n\t/** @type {RollupOptions} */\n\tconst defaultRollupOptions = {\n\t\tinput,\n\t\tplugins: [lazyGrammarPlugin, dataInsertPlugin, inlineRegexSourcePlugin, terserPlugin],\n\t};\n\n\t/** @type {OutputOptions} */\n\tconst defaultOutputOptions = {\n\t\tdir: './dist',\n\t\tvalidate: true,\n\t\tsourcemap: 'hidden',\n\t};\n\n\tconst bundles = {\n\t\tesm: {\n\t\t\trollupOptions: defaultRollupOptions,\n\t\t\toutputOptions: defaultOutputOptions,\n\t\t},\n\t\tcjs: {\n\t\t\trollupOptions: {\n\t\t\t\t...defaultRollupOptions,\n\t\t\t\tplugins: [...defaultRollupOptions.plugins, commonjs()],\n\t\t\t},\n\t\t\toutputOptions: {\n\t\t\t\t...defaultOutputOptions,\n\t\t\t\tdir: './dist/cjs',\n\t\t\t},\n\t\t},\n\t};\n\n\ttry {\n\t\tfor (const bundle of Object.values(bundles)) {\n\t\t\tbundle.build = await rollup(bundle.rollupOptions);\n\t\t\tawait bundle.build.write(bundle.outputOptions);\n\t\t}\n\t}\n\tfinally {\n\t\tfor (const bundle of Object.values(bundles)) {\n\t\t\tawait bundle.build?.close();\n\t\t}\n\t}\n}\n\n// Helper to get file size in bytes, or 0 if not found\n/**\n * @param {string} filePath\n */\nconst getFileSize = async filePath => {\n\ttry {\n\t\tconst stat = await fs.promises.stat(filePath);\n\t\treturn stat.size;\n\t}\n\tcatch {\n\t\treturn 0;\n\t}\n};\n\n/**\n * @typedef {object} FileSizes\n * @property {number} [css]\n * @property {number} [js]\n */\n\nasync function calculateFileSizes () {\n\tconst ret = {\n\t\tcore: {},\n\t\tthemes: {},\n\t\tlanguages: {},\n\t\tplugins: {},\n\t};\n\n\tret.core.js = await getFileSize(path.join(DIST_DIR, 'index.js'));\n\n\tfor (const category of ['themes', 'languages', 'plugins']) {\n\t\tlet ids = themeIds;\n\t\tif (category === 'languages') {\n\t\t\tids = languageIds;\n\t\t}\n\t\telse if (category === 'plugins') {\n\t\t\tids = pluginIds;\n\t\t}\n\n\t\tfor (const id of ids) {\n\t\t\tret[category][id] = {};\n\n\t\t\tfor (const ext of ['js', 'css']) {\n\t\t\t\tif (\n\t\t\t\t\t(ext === 'css' &&\n\t\t\t\t\t\t(category === 'languages' || components[category][id].noCSS)) ||\n\t\t\t\t\t(category === 'themes' && ext === 'js')\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst filePath = path.join(DIST_DIR, category, id);\n\t\t\t\tret[category][id][ext] = await getFileSize(`${filePath}.${ext}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait fs.promises.writeFile(\n\t\tpath.join(DIST_DIR, 'file-sizes.json'),\n\t\tJSON.stringify(ret, null, '\\t')\n\t);\n}\n\nrunTask(\n\tseries(\n\t\tclean,\n\t\tparallel(buildTypes, buildJS, series(treeviewIconFont, minifyCSS)),\n\t\tcopyComponentsJson,\n\t\tcalculateFileSizes\n\t)\n);\n"
  },
  {
    "path": "scripts/create-changelog.js",
    "content": "import simpleGit from 'simple-git';\nimport components from '../src/components.json' with { type: 'json' };\nimport { runTask } from './tasks.js';\n\nconst git = simpleGit(__dirname);\n\n/**\n * Creates an array which iterates its items in the order given by `compareFn`.\n *\n * The array may not be sorted at all times.\n *\n * @template T\n * @param {(a: T, b: T) => number} compareFn\n * @returns {T[]}\n */\nfunction createSortedArray (compareFn) {\n\t/** @type {T[]} */\n\tconst a = [];\n\n\ta['sort'] = function () {\n\t\treturn Array.prototype.sort.call(this, compareFn);\n\t};\n\ta[Symbol.iterator] = function () {\n\t\treturn this.slice().sort(compareFn)[Symbol.iterator]();\n\t};\n\n\treturn a;\n}\n\n/**\n * @typedef {object} CommitInfo\n * @property {string} message\n * @property {string} hash\n * @property {CommitChange[]} changes\n */\n\n/**\n * @typedef {object} CommitChange\n * @property {string} file\n * @property {ChangeMode} mode\n */\n\n/** @typedef {'A' | 'C' | 'D' | 'M' | 'R' | 'T' | 'U' | 'X' | 'B'} ChangeMode */\n\n/**\n * Parses the given log line and adds the list of the changed files to the output.\n *\n * @param {string} line A one-liner log line consisting of the commit hash and the commit message.\n * @returns {Promise<CommitInfo>}\n */\nasync function getCommitInfo (line) {\n\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\tconst [, hash, message] = /^([a-f\\d]+)\\s+(.*)$/i.exec(line);\n\n\t/* The output looks like this:\n\t *\n\t * M       components.js\n\t * M       components.json\n\t *\n\t * or nothing for e.g. reverts.\n\t */\n\tconst output = await git.raw(['diff-tree', '--no-commit-id', '--name-status', '-r', hash]);\n\n\tconst changes = !output\n\t\t? []\n\t\t: output\n\t\t\t\t.trim()\n\t\t\t\t.split(/\\n/)\n\t\t\t\t.map((/** @type {CommitChange} */ line) => {\n\t\t\t\t\tconst [, mode, file] = /(\\w)\\s+(.+)/.exec(line);\n\t\t\t\t\treturn { mode, file };\n\t\t\t\t});\n\n\treturn { hash, message, changes };\n}\n\n/**\n * Parses the output of `git log` with the given revision range.\n *\n * @param {string | Promise<string>} range The revision range in which the log will be parsed.\n * @returns {Promise<CommitInfo[]>}\n */\nasync function getLog (range) {\n\t/* The output looks like this:\n\t *\n\t * bfbe4464 Invoke `callback` after `after-highlight` hook (#1588)\n\t * b41fb8f1 Fixes regex for JS examples (#1591)\n\t */\n\tconst output = await git.raw(['log', await Promise.resolve(range), '--oneline']);\n\n\tif (output) {\n\t\tconst commits = output.trim().split(/\\n/);\n\t\treturn Promise.all(commits.map(getCommitInfo));\n\t}\n\telse {\n\t\treturn [];\n\t}\n}\n\nconst revisionRanges = {\n\tnextRelease () {\n\t\treturn git.raw(['describe', '--abbrev=0', '--tags']).then(res => `${res.trim()}..HEAD`);\n\t},\n};\n\n/**\n * @param {string} a\n * @param {string} b\n * @returns {number}\n */\nconst strCompare = (a, b) => a.localeCompare(b, 'en');\n\nrunTask(async () => {\n\tconst { languages, plugins } = components;\n\n\tconst infos = await getLog(revisionRanges.nextRelease());\n\n\tconst entries = {\n\t\t'TODO:': {},\n\t\t'New components': {\n\t\t\t['']: createSortedArray(strCompare),\n\t\t},\n\t\t'Updated components': {},\n\t\t'Updated plugins': {},\n\t\t'Updated themes': {},\n\t\t'Other': {},\n\t};\n\n\t/**\n\t * @param {string} category\n\t * @param {string | { message: string; hash: string }} info\n\t */\n\tfunction addEntry (category, info) {\n\t\tconst path = category.split(/\\s*>>\\s*/);\n\t\tif (path[path.length - 1] !== '') {\n\t\t\tpath.push('');\n\t\t}\n\n\t\tlet current = entries;\n\t\tfor (const key of path) {\n\t\t\tif (key) {\n\t\t\t\tcurrent = current[key] = current[key] || {};\n\t\t\t}\n\t\t\telse {\n\t\t\t\t(current[key] = current[key] || []).push(info);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {CommitChange} change\n\t * @returns {boolean}\n\t */\n\tfunction notGenerated (change) {\n\t\treturn (\n\t\t\t!change.file.endsWith('.min.js') &&\n\t\t\t!change.file.startsWith('docs/') &&\n\t\t\t!['prism.js', 'components.js', 'package-lock.json'].includes(change.file)\n\t\t);\n\t}\n\n\t/**\n\t * @param {CommitChange} change\n\t * @returns {boolean}\n\t */\n\tfunction notPartlyGenerated (change) {\n\t\treturn (\n\t\t\tchange.file !== 'plugins/autoloader/autoloader.js' &&\n\t\t\tchange.file !== 'plugins/show-language/show-language.js'\n\t\t);\n\t}\n\n\t/**\n\t * @param {CommitChange} change\n\t * @returns {boolean}\n\t */\n\tfunction notTests (change) {\n\t\treturn !/^tests\\//.test(change.file);\n\t}\n\n\t/**\n\t *\n\t * @param {CommitChange} change\n\t * @returns {boolean}\n\t */\n\tfunction notExamples (change) {\n\t\treturn !/^examples\\//.test(change.file);\n\t}\n\n\t/**\n\t *\n\t * @param {CommitChange} change\n\t * @returns {boolean}\n\t */\n\tfunction notFailures (change) {\n\t\treturn !/^known-failures.html$/.test(change.file);\n\t}\n\n\t/**\n\t * @param {CommitChange} change\n\t * @returns {boolean}\n\t */\n\tfunction notComponentsJSON (change) {\n\t\treturn change.file !== 'components.json';\n\t}\n\n\t/**\n\t * @template T\n\t * @param {((e: T, index: number) => boolean)[]} filters\n\t * @returns {(e: T, index: number) => boolean}\n\t */\n\tfunction and (...filters) {\n\t\treturn (e, index) => {\n\t\t\tfor (let i = 0, l = filters.length; i < l; i++) {\n\t\t\t\tif (!filters[i](e, index)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\t}\n\n\t/**\n\t * Some commit message have the format `component changed: actual message`.\n\t * This function can be used to remove this prefix.\n\t *\n\t * @param {string} prefix\n\t * @param {CommitInfo} info\n\t * @returns {{ message: string; hash: string }}\n\t */\n\tfunction removeMessagePrefix (prefix, info) {\n\t\tconst source = String.raw`^${prefix.replace(/([^-\\w\\s])/g, '\\\\$1').replace(/[-\\s]/g, '[-\\\\s]')}:\\s*`;\n\t\tconst patter = RegExp(source, 'i');\n\t\treturn {\n\t\t\tmessage: info.message.replace(patter, ''),\n\t\t\thash: info.hash,\n\t\t};\n\t}\n\n\t/** @type {((info: CommitInfo) => boolean | undefined)[]} */\n\tconst commitSorters = [\n\t\tfunction rebuild (info) {\n\t\t\tif (info.changes.length > 0 && info.changes.filter(notGenerated).length === 0) {\n\t\t\t\tconsole.log('Rebuild found: ' + info.message);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\tfunction addedComponent (info) {\n\t\t\tlet relevantChanges = info.changes.filter(\n\t\t\t\tand(notGenerated, notTests, notExamples, notFailures)\n\t\t\t);\n\n\t\t\t// `components.json` has to be modified\n\t\t\tif (relevantChanges.some(c => c.file === 'components.json')) {\n\t\t\t\trelevantChanges = relevantChanges.filter(\n\t\t\t\t\tand(notComponentsJSON, notPartlyGenerated)\n\t\t\t\t);\n\n\t\t\t\t// now, only the newly added JS should be left\n\t\t\t\tif (relevantChanges.length === 1) {\n\t\t\t\t\tconst change = relevantChanges[0];\n\t\t\t\t\tif (change.mode === 'A' && change.file.startsWith('components/')) {\n\t\t\t\t\t\tconst lang = change.file.match(/([\\w-]+)\\.js$/)[1];\n\t\t\t\t\t\tconst entry = languages[lang] || {\n\t\t\t\t\t\t\ttitle: 'REMOVED LANGUAGE ' + lang,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst titles = [entry.title];\n\t\t\t\t\t\tif (entry.aliasTitles) {\n\t\t\t\t\t\t\ttitles.push(...Object.values(entry.aliasTitles));\n\t\t\t\t\t\t}\n\t\t\t\t\t\taddEntry(\n\t\t\t\t\t\t\t'New components',\n\t\t\t\t\t\t\t`__${titles.join('__ & __')}__: ${infoToString(info)}`\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfunction changedComponentOrCore (info) {\n\t\t\tlet relevantChanges = info.changes.filter(\n\t\t\t\tand(notGenerated, notTests, notExamples, notFailures)\n\t\t\t);\n\n\t\t\t// if `components.json` changed, then autoloader and show-language also change\n\t\t\tif (relevantChanges.some(c => c.file === 'components.json')) {\n\t\t\t\trelevantChanges = relevantChanges.filter(\n\t\t\t\t\tand(notComponentsJSON, notPartlyGenerated)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (relevantChanges.length === 1) {\n\t\t\t\tconst change = relevantChanges[0];\n\t\t\t\tif (change.mode === 'M' && change.file.startsWith('components/')) {\n\t\t\t\t\tconst lang = change.file.match(/([\\w-]+)\\.js$/)[1];\n\t\t\t\t\tif (lang === 'core') {\n\t\t\t\t\t\taddEntry('Other >> Core', removeMessagePrefix('Core', info));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst title = languages[lang].title;\n\t\t\t\t\t\taddEntry(\n\t\t\t\t\t\t\t'Updated components >> ' + title,\n\t\t\t\t\t\t\tremoveMessagePrefix(title, info)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfunction changedPlugin (info) {\n\t\t\tconst relevantChanges = info.changes.filter(\n\t\t\t\tand(notGenerated, notTests, notExamples, c => !/\\.(?:css|html)$/.test(c.file))\n\t\t\t);\n\n\t\t\tif (\n\t\t\t\trelevantChanges.length > 0 &&\n\t\t\t\trelevantChanges.every(c => c.mode === 'M' && /^plugins\\/.*\\.js$/.test(c.file))\n\t\t\t) {\n\t\t\t\tif (relevantChanges.length === 1) {\n\t\t\t\t\tconst change = relevantChanges[0];\n\t\t\t\t\tconst id = change.file.match(/\\/([\\w-]+)\\.js/)[1];\n\t\t\t\t\tconst title = plugins[id].title;\n\t\t\t\t\taddEntry('Updated plugins >> ' + title, removeMessagePrefix(title, info));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\taddEntry('Updated plugins', info);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\tfunction changedTheme (info) {\n\t\t\tif (\n\t\t\t\tinfo.changes.length > 0 &&\n\t\t\t\tinfo.changes.every(c => {\n\t\t\t\t\treturn /themes\\/.*\\.css/.test(c.file) && c.mode === 'M';\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\tif (info.changes.length === 1) {\n\t\t\t\t\tconst change = info.changes[0];\n\t\t\t\t\tlet name = (change.file.match(/(\\w+)\\.css$/) || [, 'Default'])[1];\n\t\t\t\t\tname = name[0].toUpperCase() + name.substr(1);\n\t\t\t\t\taddEntry('Updated themes >> ' + name, removeMessagePrefix(name, info));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\taddEntry('Updated themes', info);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\tfunction changedInfrastructure (info) {\n\t\t\tconst relevantChanges = info.changes.filter(notGenerated);\n\n\t\t\tif (\n\t\t\t\trelevantChanges.length > 0 &&\n\t\t\t\trelevantChanges.every(c => {\n\t\t\t\t\tif (/^(?:gulpfile.js|tests)\\//.test(c.file)) {\n\t\t\t\t\t\t// gulp tasks or tests\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (/^\\.[\\w.]+$/.test(c.file)) {\n\t\t\t\t\t\t// a .something file\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn ['CNAME', 'composer.json', 'package.json', 'package-lock.json'].includes(\n\t\t\t\t\t\tc.file\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\taddEntry('Other >> Infrastructure', info);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// or dependencies.js\n\t\t\tconst excludeTests = info.changes.filter(notTests);\n\t\t\tif (excludeTests.length === 1 && excludeTests[0].file === 'dependencies.js') {\n\t\t\t\taddEntry('Other >> Infrastructure', info);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\tfunction otherChanges (info) {\n\t\t\t// detect changes of the Github setup\n\t\t\t// This assumes that .md files are related to GitHub\n\t\t\tif (info.changes.length > 0 && info.changes.every(c => /\\.md$/i.test(c.file))) {\n\t\t\t\taddEntry('Other', info);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t];\n\n\tfor (const info of infos) {\n\t\tif (!commitSorters.some(sorter => sorter(info))) {\n\t\t\taddEntry('TODO:', info);\n\t\t}\n\t}\n\n\tlet md = '';\n\n\t/**\n\t * Stringifies the given commit info.\n\t *\n\t * @param {string | CommitInfo} info\n\t * @returns {string}\n\t */\n\tfunction infoToString (info) {\n\t\tif (typeof info === 'string') {\n\t\t\treturn info;\n\t\t}\n\t\treturn `${info.message} [\\`${info.hash}\\`](https://github.com/PrismJS/prism/commit/${info.hash})`;\n\t}\n\n\t/**\n\t * @param {object} category\n\t * @param {string} [indentation='']\n\t */\n\tfunction printCategory (category, indentation = '') {\n\t\tfor (const subCategory of Object.keys(category).sort(strCompare)) {\n\t\t\tif (subCategory) {\n\t\t\t\tmd += `${indentation}* __${subCategory}__\\n`;\n\t\t\t\tprintCategory(category[subCategory], indentation + '    ');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst infos = category[''];\n\t\t\t\tfor (const info of infos) {\n\t\t\t\t\tmd += `${indentation}* ${infoToString(info)}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const category of Object.keys(entries)) {\n\t\tmd += `\\n### ${category}\\n\\n`;\n\t\tprintCategory(entries[category]);\n\t}\n\tconsole.log(md);\n});\n"
  },
  {
    "path": "scripts/linkify-changelog.js",
    "content": "import fs from 'fs/promises';\nimport { runTask } from './tasks.js';\n\nrunTask(async () => {\n\tconst changelog = 'CHANGELOG.md';\n\tlet content = await fs.readFile(changelog, 'utf-8');\n\n\tcontent = content.replace(\n\t\t/#(\\d+)(?![\\d\\]])/g,\n\t\t'[#$1](https://github.com/PrismJS/prism/issues/$1)'\n\t);\n\tcontent = content.replace(/\\[[\\da-f]+(?:, *[\\da-f]+)*\\]/g, m =>\n\t\tm.replace(/([\\da-f]{7})[\\da-f]*/g, '[`$1`](https://github.com/PrismJS/prism/commit/$1)'));\n\n\tawait fs.writeFile(changelog, content, 'utf-8');\n});\n"
  },
  {
    "path": "scripts/tasks.js",
    "content": "/**\n * @typedef {() => void | Promise<void>} Task\n */\n\n/**\n * @param {string} name\n * @param {Task} task\n * @returns {Task}\n */\nfunction wrapTask (name, task) {\n\treturn async function $ () {\n\t\tconsole.log(`[Starting: ${name}]`);\n\t\tconst start = Date.now();\n\t\tawait task();\n\t\tconst duration = (Date.now() - start) / 1000;\n\t\tconsole.log(`[Done: ${name} (${duration.toFixed(2)}s)]`);\n\t};\n}\n\n/**\n * @param {Task} task\n * @returns {Task}\n */\nfunction wrapUnnamedTask (task) {\n\tconst name = task.name;\n\tif (!name.startsWith('$')) {\n\t\ttask = wrapTask(name, task);\n\t}\n\treturn task;\n}\n\n/**\n * @param  {...Task} tasks\n * @returns {Task}\n */\nexport function series (...tasks) {\n\treturn async function $ () {\n\t\tfor (const task of tasks.map(wrapUnnamedTask)) {\n\t\t\tawait task();\n\t\t}\n\t};\n}\n\n/**\n * @param  {...Task} tasks\n * @returns {Task}\n */\nexport function parallel (...tasks) {\n\treturn async function $ () {\n\t\tawait Promise.all(\n\t\t\ttasks.map(async task => {\n\t\t\t\tawait wrapUnnamedTask(task)();\n\t\t\t})\n\t\t);\n\t};\n}\n\n/**\n * Given a record of tasks, it will run the task as dictated by the CLI arguments.\n *\n * To run a specific task, run `node path/to/script.js taskName`.\n *\n * @param {object} tasks\n */\nexport function run (tasks) {\n\tconst selected = String(process.argv[2]);\n\t/** @type {Task | undefined} */\n\tconst task = tasks[selected];\n\tif (!task) {\n\t\tconsole.error(\n\t\t\t`No such task ${selected}. Available tasks: ${Object.keys(tasks).join(', ')}`\n\t\t);\n\t}\n\telse {\n\t\trunTask(task);\n\t}\n}\n\n/**\n * Runs the given task.\n *\n * @param {Task} tasks\n */\nexport function runTask (tasks) {\n\tPromise.resolve()\n\t\t.then(() => tasks())\n\t\t.catch(reason => {\n\t\t\tconsole.error('Error:');\n\t\t\tconsole.error(reason);\n\t\t});\n}\n"
  },
  {
    "path": "src/auto-start.js",
    "content": "import Prism from './global.js';\nimport './plugins/autoloader/autoloader.js';\n\nexport default Prism;\n"
  },
  {
    "path": "src/components.json",
    "content": "{\n\t\"core\": {\n\t\t\"meta\": {\n\t\t\t\"path\": \"index.js\",\n\t\t\t\"option\": \"mandatory\"\n\t\t},\n\t\t\"core\": \"Core\"\n\t},\n\t\"themes\": {\n\t\t\"meta\": {\n\t\t\t\"path\": \"themes/{id}.css\",\n\t\t\t\"link\": \"index.html?theme={id}\",\n\t\t\t\"exclusive\": true\n\t\t},\n\t\t\"prism\": {\n\t\t\t\"title\": \"Default\",\n\t\t\t\"option\": \"default\",\n\t\t\t\"owner\": \"LeaVerou\"\n\t\t},\n\t\t\"dark\": {\n\t\t\t\"title\": \"Dark\",\n\t\t\t\"owner\": \"LeaVerou\"\n\t\t},\n\t\t\"funky\": {\n\t\t\t\"title\": \"Funky\",\n\t\t\t\"owner\": \"LeaVerou\"\n\t\t},\n\t\t\"okaidia\": {\n\t\t\t\"title\": \"Okaidia\",\n\t\t\t\"owner\": \"ocodia\"\n\t\t},\n\t\t\"twilight\": {\n\t\t\t\"title\": \"Twilight\",\n\t\t\t\"owner\": \"remybach\"\n\t\t},\n\t\t\"coy\": {\n\t\t\t\"title\": \"Coy\",\n\t\t\t\"owner\": \"tshedor\"\n\t\t},\n\t\t\"solarizedlight\": {\n\t\t\t\"title\": \"Solarized Light\",\n\t\t\t\"owner\": \"hectormatos2011 \"\n\t\t},\n\t\t\"tomorrow\": {\n\t\t\t\"title\": \"Tomorrow Night\",\n\t\t\t\"owner\": \"Rosey\"\n\t\t}\n\t},\n\t\"languages\": {\n\t\t\"meta\": {\n\t\t\t\"path\": \"languages/{id}\",\n\t\t\t\"noCSS\": true,\n\t\t\t\"examplesPath\": \"examples/{id}\",\n\t\t\t\"addCheckAll\": true\n\t\t},\n\t\t\"markup\": {\n\t\t\t\"title\": \"Markup\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"html\": \"HTML\",\n\t\t\t\t\"svg\": \"SVG\",\n\t\t\t\t\"mathml\": \"MathML\"\n\t\t\t},\n\t\t\t\"option\": \"default\"\n\t\t},\n\t\t\"xml\": {\n\t\t\t\"title\": \"XML\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"ssml\": \"SSML\",\n\t\t\t\t\"atom\": \"Atom\",\n\t\t\t\t\"rss\": \"RSS\"\n\t\t\t},\n\t\t\t\"option\": \"default\"\n\t\t},\n\t\t\"css\": {\n\t\t\t\"title\": \"CSS\",\n\t\t\t\"option\": \"default\"\n\t\t},\n\t\t\"clike\": {\n\t\t\t\"title\": \"C-like\",\n\t\t\t\"option\": \"default\"\n\t\t},\n\t\t\"javascript\": {\n\t\t\t\"title\": \"JavaScript\",\n\t\t\t\"option\": \"default\"\n\t\t},\n\t\t\"plain\": {\n\t\t\t\"title\": \"Plain text\",\n\t\t\t\"option\": \"default\"\n\t\t},\n\t\t\"abap\": {\n\t\t\t\"title\": \"ABAP\",\n\t\t\t\"owner\": \"dellagustin\"\n\t\t},\n\t\t\"abnf\": {\n\t\t\t\"title\": \"ABNF\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"actionscript\": {\n\t\t\t\"title\": \"ActionScript\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"ada\": {\n\t\t\t\"title\": \"Ada\",\n\t\t\t\"owner\": \"Lucretia\"\n\t\t},\n\t\t\"agda\": {\n\t\t\t\"title\": \"Agda\",\n\t\t\t\"owner\": \"xy-ren\"\n\t\t},\n\t\t\"al\": {\n\t\t\t\"title\": \"AL\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"antlr4\": {\n\t\t\t\"title\": \"ANTLR4\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"apacheconf\": {\n\t\t\t\"title\": \"Apache Configuration\",\n\t\t\t\"owner\": \"GuiTeK\"\n\t\t},\n\t\t\"apex\": {\n\t\t\t\"title\": \"Apex\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"apl\": {\n\t\t\t\"title\": \"APL\",\n\t\t\t\"owner\": \"ngn\"\n\t\t},\n\t\t\"applescript\": {\n\t\t\t\"title\": \"AppleScript\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"aql\": {\n\t\t\t\"title\": \"AQL\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"arduino\": {\n\t\t\t\"title\": \"Arduino\",\n\t\t\t\"owner\": \"dkern\"\n\t\t},\n\t\t\"arff\": {\n\t\t\t\"title\": \"ARFF\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"armasm\": {\n\t\t\t\"title\": \"ARM Assembly\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"arturo\": {\n\t\t\t\"title\": \"Arturo\",\n\t\t\t\"owner\": \"drkameleon\"\n\t\t},\n\t\t\"asciidoc\": {\n\t\t\t\"title\": \"AsciiDoc\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"aspnet\": {\n\t\t\t\"title\": \"ASP.NET (C#)\",\n\t\t\t\"owner\": \"nauzilus\"\n\t\t},\n\t\t\"asm6502\": {\n\t\t\t\"title\": \"6502 Assembly\",\n\t\t\t\"owner\": \"kzurawel\"\n\t\t},\n\t\t\"asmatmel\": {\n\t\t\t\"title\": \"Atmel AVR Assembly\",\n\t\t\t\"owner\": \"cerkit\"\n\t\t},\n\t\t\"autohotkey\": {\n\t\t\t\"title\": \"AutoHotkey\",\n\t\t\t\"owner\": \"aviaryan\"\n\t\t},\n\t\t\"autoit\": {\n\t\t\t\"title\": \"AutoIt\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"avisynth\": {\n\t\t\t\"title\": \"AviSynth\",\n\t\t\t\"owner\": \"Zinfidel\"\n\t\t},\n\t\t\"avro-idl\": {\n\t\t\t\"title\": \"Avro IDL\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"awk\": {\n\t\t\t\"title\": \"AWK\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"gawk\": \"GAWK\"\n\t\t\t},\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"bash\": {\n\t\t\t\"title\": \"Bash\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"sh\": \"Shell\",\n\t\t\t\t\"shell\": \"Shell\"\n\t\t\t},\n\t\t\t\"owner\": \"zeitgeist87\"\n\t\t},\n\t\t\"basic\": {\n\t\t\t\"title\": \"BASIC\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"batch\": {\n\t\t\t\"title\": \"Batch\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"bbcode\": {\n\t\t\t\"title\": \"BBcode\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"shortcode\": \"Shortcode\"\n\t\t\t},\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"bbj\": {\n\t\t\t\"title\": \"BBj\",\n\t\t\t\"owner\": \"hyyan\"\n\t\t},\n\t\t\"bicep\": {\n\t\t\t\"title\": \"Bicep\",\n\t\t\t\"owner\": \"johnnyreilly\"\n\t\t},\n\t\t\"birb\": {\n\t\t\t\"title\": \"Birb\",\n\t\t\t\"owner\": \"Calamity210\"\n\t\t},\n\t\t\"bison\": {\n\t\t\t\"title\": \"Bison\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"bnf\": {\n\t\t\t\"title\": \"BNF\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"rbnf\": \"RBNF\"\n\t\t\t},\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"bqn\": {\n\t\t\t\"title\": \"BQN\",\n\t\t\t\"owner\": \"yewscion\"\n\t\t},\n\t\t\"brainfuck\": {\n\t\t\t\"title\": \"Brainfuck\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"brightscript\": {\n\t\t\t\"title\": \"BrightScript\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"bro\": {\n\t\t\t\"title\": \"Bro\",\n\t\t\t\"owner\": \"wayward710\"\n\t\t},\n\t\t\"bsl\": {\n\t\t\t\"title\": \"BSL (1C:Enterprise)\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"oscript\": \"OneScript\"\n\t\t\t},\n\t\t\t\"owner\": \"Diversus23\"\n\t\t},\n\t\t\"c\": {\n\t\t\t\"title\": \"C\",\n\t\t\t\"owner\": \"zeitgeist87\"\n\t\t},\n\t\t\"csharp\": {\n\t\t\t\"title\": \"C#\",\n\t\t\t\"owner\": \"mvalipour\"\n\t\t},\n\t\t\"cpp\": {\n\t\t\t\"title\": \"C++\",\n\t\t\t\"owner\": \"zeitgeist87\"\n\t\t},\n\t\t\"cfscript\": {\n\t\t\t\"title\": \"CFScript\",\n\t\t\t\"owner\": \"mjclemente\"\n\t\t},\n\t\t\"chaiscript\": {\n\t\t\t\"title\": \"ChaiScript\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"cil\": {\n\t\t\t\"title\": \"CIL\",\n\t\t\t\"owner\": \"sbrl\"\n\t\t},\n\t\t\"cilkc\": {\n\t\t\t\"title\": \"Cilk/C\",\n\t\t\t\"owner\": \"OpenCilk\"\n\t\t},\n\t\t\"cilkcpp\": {\n\t\t\t\"title\": \"Cilk/C++\",\n\t\t\t\"owner\": \"OpenCilk\"\n\t\t},\n\t\t\"clojure\": {\n\t\t\t\"title\": \"Clojure\",\n\t\t\t\"owner\": \"troglotit\"\n\t\t},\n\t\t\"cmake\": {\n\t\t\t\"title\": \"CMake\",\n\t\t\t\"owner\": \"mjrogozinski\"\n\t\t},\n\t\t\"cobol\": {\n\t\t\t\"title\": \"COBOL\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"coffeescript\": {\n\t\t\t\"title\": \"CoffeeScript\",\n\t\t\t\"owner\": \"R-osey\"\n\t\t},\n\t\t\"concurnas\": {\n\t\t\t\"title\": \"Concurnas\",\n\t\t\t\"owner\": \"jasontatton\"\n\t\t},\n\t\t\"csp\": {\n\t\t\t\"title\": \"Content-Security-Policy\",\n\t\t\t\"owner\": \"ScottHelme\"\n\t\t},\n\t\t\"cooklang\": {\n\t\t\t\"title\": \"Cooklang\",\n\t\t\t\"owner\": \"ahue\"\n\t\t},\n\t\t\"coq\": {\n\t\t\t\"title\": \"Coq\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"crystal\": {\n\t\t\t\"title\": \"Crystal\",\n\t\t\t\"owner\": \"MakeNowJust\"\n\t\t},\n\t\t\"css-extras\": {\n\t\t\t\"title\": \"CSS Extras\",\n\t\t\t\"owner\": \"milesj\"\n\t\t},\n\t\t\"css-selector\": {\n\t\t\t\"title\": \"CSS Selector\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"csv\": {\n\t\t\t\"title\": \"CSV\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"cue\": {\n\t\t\t\"title\": \"CUE\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"cypher\": {\n\t\t\t\"title\": \"Cypher\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"d\": {\n\t\t\t\"title\": \"D\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"dart\": {\n\t\t\t\"title\": \"Dart\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"dataweave\": {\n\t\t\t\"title\": \"DataWeave\",\n\t\t\t\"owner\": \"machaval\"\n\t\t},\n\t\t\"dax\": {\n\t\t\t\"title\": \"DAX\",\n\t\t\t\"owner\": \"peterbud\"\n\t\t},\n\t\t\"dhall\": {\n\t\t\t\"title\": \"Dhall\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"diff\": {\n\t\t\t\"title\": \"Diff\",\n\t\t\t\"owner\": \"uranusjr\"\n\t\t},\n\t\t\"django\": {\n\t\t\t\"title\": \"Django/Jinja2\",\n\t\t\t\"owner\": \"romanvm\"\n\t\t},\n\t\t\"dns-zone-file\": {\n\t\t\t\"title\": \"DNS zone file\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"docker\": {\n\t\t\t\"title\": \"Docker\",\n\t\t\t\"owner\": \"JustinBeckwith\"\n\t\t},\n\t\t\"dot\": {\n\t\t\t\"title\": \"DOT (Graphviz)\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"ebnf\": {\n\t\t\t\"title\": \"EBNF\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"editorconfig\": {\n\t\t\t\"title\": \"EditorConfig\",\n\t\t\t\"owner\": \"osipxd\"\n\t\t},\n\t\t\"eiffel\": {\n\t\t\t\"title\": \"Eiffel\",\n\t\t\t\"owner\": \"Conaclos\"\n\t\t},\n\t\t\"ejs\": {\n\t\t\t\"title\": \"EJS\",\n\t\t\t\"owner\": \"RunDevelopment\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"eta\": \"Eta\"\n\t\t\t}\n\t\t},\n\t\t\"elixir\": {\n\t\t\t\"title\": \"Elixir\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"elm\": {\n\t\t\t\"title\": \"Elm\",\n\t\t\t\"owner\": \"zwilias\"\n\t\t},\n\t\t\"etlua\": {\n\t\t\t\"title\": \"Embedded Lua templating\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"erb\": {\n\t\t\t\"title\": \"ERB\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"erlang\": {\n\t\t\t\"title\": \"Erlang\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"excel-formula\": {\n\t\t\t\"title\": \"Excel Formula\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"fsharp\": {\n\t\t\t\"title\": \"F#\",\n\t\t\t\"owner\": \"simonreynolds7\"\n\t\t},\n\t\t\"factor\": {\n\t\t\t\"title\": \"Factor\",\n\t\t\t\"owner\": \"catb0t\"\n\t\t},\n\t\t\"false\": {\n\t\t\t\"title\": \"False\",\n\t\t\t\"owner\": \"edukisto\"\n\t\t},\n\t\t\"firestore-security-rules\": {\n\t\t\t\"title\": \"Firestore security rules\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"flow\": {\n\t\t\t\"title\": \"Flow\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"fortran\": {\n\t\t\t\"title\": \"Fortran\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"ftl\": {\n\t\t\t\"title\": \"FreeMarker Template Language\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"gml\": {\n\t\t\t\"title\": \"GameMaker Language\",\n\t\t\t\"owner\": \"LiarOnce\"\n\t\t},\n\t\t\"gap\": {\n\t\t\t\"title\": \"GAP (CAS)\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"gcode\": {\n\t\t\t\"title\": \"G-code\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"gdscript\": {\n\t\t\t\"title\": \"GDScript\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"gedcom\": {\n\t\t\t\"title\": \"GEDCOM\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"gettext\": {\n\t\t\t\"title\": \"gettext\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"gherkin\": {\n\t\t\t\"title\": \"Gherkin\",\n\t\t\t\"owner\": \"hason\"\n\t\t},\n\t\t\"git\": {\n\t\t\t\"title\": \"Git\",\n\t\t\t\"owner\": \"lgiraudel\"\n\t\t},\n\t\t\"glsl\": {\n\t\t\t\"title\": \"GLSL\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"gn\": {\n\t\t\t\"title\": \"GN\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"linker-script\": {\n\t\t\t\"title\": \"GNU Linker Script\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"go\": {\n\t\t\t\"title\": \"Go\",\n\t\t\t\"owner\": \"arnehormann\"\n\t\t},\n\t\t\"go-module\": {\n\t\t\t\"title\": \"Go module\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"gradle\": {\n\t\t\t\"title\": \"Gradle\",\n\t\t\t\"owner\": \"zeabdelkhalek-badido18\"\n\t\t},\n\t\t\"graphql\": {\n\t\t\t\"title\": \"GraphQL\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"groovy\": {\n\t\t\t\"title\": \"Groovy\",\n\t\t\t\"owner\": \"robfletcher\"\n\t\t},\n\t\t\"haml\": {\n\t\t\t\"title\": \"Haml\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"handlebars\": {\n\t\t\t\"title\": \"Handlebars\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"mustache\": \"Mustache\"\n\t\t\t},\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"haskell\": {\n\t\t\t\"title\": \"Haskell\",\n\t\t\t\"owner\": \"bholst\"\n\t\t},\n\t\t\"haxe\": {\n\t\t\t\"title\": \"Haxe\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"hcl\": {\n\t\t\t\"title\": \"HCL\",\n\t\t\t\"owner\": \"outsideris\"\n\t\t},\n\t\t\"hlsl\": {\n\t\t\t\"title\": \"HLSL\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"hoon\": {\n\t\t\t\"title\": \"Hoon\",\n\t\t\t\"owner\": \"matildepark\"\n\t\t},\n\t\t\"http\": {\n\t\t\t\"title\": \"HTTP\",\n\t\t\t\"owner\": \"danielgtaylor\"\n\t\t},\n\t\t\"hpkp\": {\n\t\t\t\"title\": \"HTTP Public-Key-Pins\",\n\t\t\t\"owner\": \"ScottHelme\"\n\t\t},\n\t\t\"hsts\": {\n\t\t\t\"title\": \"HTTP Strict-Transport-Security\",\n\t\t\t\"owner\": \"ScottHelme\"\n\t\t},\n\t\t\"ichigojam\": {\n\t\t\t\"title\": \"IchigoJam\",\n\t\t\t\"owner\": \"BlueCocoa\"\n\t\t},\n\t\t\"icon\": {\n\t\t\t\"title\": \"Icon\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"icu-message-format\": {\n\t\t\t\"title\": \"ICU Message Format\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"idris\": {\n\t\t\t\"title\": \"Idris\",\n\t\t\t\"owner\": \"KeenS\"\n\t\t},\n\t\t\"ignore\": {\n\t\t\t\"title\": \".ignore\",\n\t\t\t\"owner\": \"osipxd\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"gitignore\": \".gitignore\",\n\t\t\t\t\"hgignore\": \".hgignore\",\n\t\t\t\t\"npmignore\": \".npmignore\"\n\t\t\t}\n\t\t},\n\t\t\"inform7\": {\n\t\t\t\"title\": \"Inform 7\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"ini\": {\n\t\t\t\"title\": \"Ini\",\n\t\t\t\"owner\": \"aviaryan\"\n\t\t},\n\t\t\"io\": {\n\t\t\t\"title\": \"Io\",\n\t\t\t\"owner\": \"AlesTsurko\"\n\t\t},\n\t\t\"j\": {\n\t\t\t\"title\": \"J\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"java\": {\n\t\t\t\"title\": \"Java\",\n\t\t\t\"owner\": \"sherblot\"\n\t\t},\n\t\t\"javadoc\": {\n\t\t\t\"title\": \"JavaDoc\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"javadoclike\": {\n\t\t\t\"title\": \"JavaDoc-like\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"javastacktrace\": {\n\t\t\t\"title\": \"Java stack trace\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"jexl\": {\n\t\t\t\"title\": \"Jexl\",\n\t\t\t\"owner\": \"czosel\"\n\t\t},\n\t\t\"jolie\": {\n\t\t\t\"title\": \"Jolie\",\n\t\t\t\"owner\": \"thesave\"\n\t\t},\n\t\t\"jq\": {\n\t\t\t\"title\": \"JQ\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"jsdoc\": {\n\t\t\t\"title\": \"JSDoc\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"json\": {\n\t\t\t\"title\": \"JSON\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"webmanifest\": \"Web App Manifest\"\n\t\t\t},\n\t\t\t\"owner\": \"CupOfTea696\"\n\t\t},\n\t\t\"json5\": {\n\t\t\t\"title\": \"JSON5\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"jsonp\": {\n\t\t\t\"title\": \"JSONP\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"jsstacktrace\": {\n\t\t\t\"title\": \"JS stack trace\",\n\t\t\t\"owner\": \"sbrl\"\n\t\t},\n\t\t\"js-templates\": {\n\t\t\t\"title\": \"JS Templates\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"julia\": {\n\t\t\t\"title\": \"Julia\",\n\t\t\t\"owner\": \"cdagnino\"\n\t\t},\n\t\t\"keepalived\": {\n\t\t\t\"title\": \"Keepalived Configure\",\n\t\t\t\"owner\": \"dev-itsheng\"\n\t\t},\n\t\t\"keyman\": {\n\t\t\t\"title\": \"Keyman\",\n\t\t\t\"owner\": \"mcdurdin\"\n\t\t},\n\t\t\"kotlin\": {\n\t\t\t\"title\": \"Kotlin\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"kts\": \"Kotlin Script\"\n\t\t\t},\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"kumir\": {\n\t\t\t\"title\": \"KuMir (КуМир)\",\n\t\t\t\"owner\": \"edukisto\"\n\t\t},\n\t\t\"kusto\": {\n\t\t\t\"title\": \"Kusto\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"latex\": {\n\t\t\t\"title\": \"LaTeX\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"tex\": \"TeX\",\n\t\t\t\t\"context\": \"ConTeXt\"\n\t\t\t},\n\t\t\t\"owner\": \"japborst\"\n\t\t},\n\t\t\"latte\": {\n\t\t\t\"title\": \"Latte\",\n\t\t\t\"owner\": \"nette\"\n\t\t},\n\t\t\"less\": {\n\t\t\t\"title\": \"Less\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"lilypond\": {\n\t\t\t\"title\": \"LilyPond\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"liquid\": {\n\t\t\t\"title\": \"Liquid\",\n\t\t\t\"owner\": \"cinhtau\"\n\t\t},\n\t\t\"lisp\": {\n\t\t\t\"title\": \"Lisp\",\n\t\t\t\"owner\": \"JuanCaicedo\"\n\t\t},\n\t\t\"livescript\": {\n\t\t\t\"title\": \"LiveScript\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"llvm\": {\n\t\t\t\"title\": \"LLVM IR\",\n\t\t\t\"owner\": \"porglezomp\"\n\t\t},\n\t\t\"log\": {\n\t\t\t\"title\": \"Log file\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"lolcode\": {\n\t\t\t\"title\": \"LOLCODE\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"lua\": {\n\t\t\t\"title\": \"Lua\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"magma\": {\n\t\t\t\"title\": \"Magma (CAS)\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"makefile\": {\n\t\t\t\"title\": \"Makefile\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"markdown\": {\n\t\t\t\"title\": \"Markdown\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"mata\": {\n\t\t\t\"title\": \"Mata\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"matlab\": {\n\t\t\t\"title\": \"MATLAB\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"maxscript\": {\n\t\t\t\"title\": \"MAXScript\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"mel\": {\n\t\t\t\"title\": \"MEL\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"mermaid\": {\n\t\t\t\"title\": \"Mermaid\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"metafont\": {\n\t\t\t\"title\": \"METAFONT\",\n\t\t\t\"owner\": \"LaeriExNihilo\"\n\t\t},\n\t\t\"mizar\": {\n\t\t\t\"title\": \"Mizar\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"mongodb\": {\n\t\t\t\"title\": \"MongoDB\",\n\t\t\t\"owner\": \"airs0urce\"\n\t\t},\n\t\t\"monkey\": {\n\t\t\t\"title\": \"Monkey\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"moonscript\": {\n\t\t\t\"title\": \"MoonScript\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"n1ql\": {\n\t\t\t\"title\": \"N1QL\",\n\t\t\t\"owner\": \"TMWilds\"\n\t\t},\n\t\t\"n4js\": {\n\t\t\t\"title\": \"N4JS\",\n\t\t\t\"owner\": \"bsmith-n4\"\n\t\t},\n\t\t\"nand2tetris-hdl\": {\n\t\t\t\"title\": \"Nand To Tetris HDL\",\n\t\t\t\"owner\": \"stephanmax\"\n\t\t},\n\t\t\"naniscript\": {\n\t\t\t\"title\": \"Naninovel Script\",\n\t\t\t\"owner\": \"Elringus\"\n\t\t},\n\t\t\"nasm\": {\n\t\t\t\"title\": \"NASM\",\n\t\t\t\"owner\": \"rbmj\"\n\t\t},\n\t\t\"neon\": {\n\t\t\t\"title\": \"NEON\",\n\t\t\t\"owner\": \"nette\"\n\t\t},\n\t\t\"nevod\": {\n\t\t\t\"title\": \"Nevod\",\n\t\t\t\"owner\": \"nezaboodka\"\n\t\t},\n\t\t\"nginx\": {\n\t\t\t\"title\": \"nginx\",\n\t\t\t\"owner\": \"volado\"\n\t\t},\n\t\t\"nim\": {\n\t\t\t\"title\": \"Nim\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"nix\": {\n\t\t\t\"title\": \"Nix\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"nsis\": {\n\t\t\t\"title\": \"NSIS\",\n\t\t\t\"owner\": \"idleberg\"\n\t\t},\n\t\t\"objectivec\": {\n\t\t\t\"title\": \"Objective-C\",\n\t\t\t\"owner\": \"uranusjr\"\n\t\t},\n\t\t\"ocaml\": {\n\t\t\t\"title\": \"OCaml\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"odin\": {\n\t\t\t\"title\": \"Odin\",\n\t\t\t\"owner\": \"edukisto\"\n\t\t},\n\t\t\"opencl\": {\n\t\t\t\"title\": \"OpenCL\",\n\t\t\t\"owner\": \"Milania1\"\n\t\t},\n\t\t\"opencl-extensions\": {\n\t\t\t\"title\": \"OpenCL Extensions\",\n\t\t\t\"owner\": \"Milania1\"\n\t\t},\n\t\t\"openqasm\": {\n\t\t\t\"title\": \"OpenQasm\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"oz\": {\n\t\t\t\"title\": \"Oz\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"parigp\": {\n\t\t\t\"title\": \"PARI/GP\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"parser\": {\n\t\t\t\"title\": \"Parser\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"pascal\": {\n\t\t\t\"title\": \"Pascal\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"objectpascal\": \"Object Pascal\"\n\t\t\t},\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"pascaligo\": {\n\t\t\t\"title\": \"Pascaligo\",\n\t\t\t\"owner\": \"DefinitelyNotAGoat\"\n\t\t},\n\t\t\"psl\": {\n\t\t\t\"title\": \"PATROL Scripting Language\",\n\t\t\t\"owner\": \"bertysentry\"\n\t\t},\n\t\t\"pcaxis\": {\n\t\t\t\"title\": \"PC-Axis\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"peoplecode\": {\n\t\t\t\"title\": \"PeopleCode\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"perl\": {\n\t\t\t\"title\": \"Perl\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"php\": {\n\t\t\t\"title\": \"PHP\",\n\t\t\t\"owner\": \"milesj\"\n\t\t},\n\t\t\"phpdoc\": {\n\t\t\t\"title\": \"PHPDoc\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"php-extras\": {\n\t\t\t\"title\": \"PHP Extras\",\n\t\t\t\"owner\": \"milesj\"\n\t\t},\n\t\t\"plant-uml\": {\n\t\t\t\"title\": \"PlantUML\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"plsql\": {\n\t\t\t\"title\": \"PL/SQL\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"powerquery\": {\n\t\t\t\"title\": \"PowerQuery\",\n\t\t\t\"owner\": \"peterbud\"\n\t\t},\n\t\t\"powershell\": {\n\t\t\t\"title\": \"PowerShell\",\n\t\t\t\"owner\": \"nauzilus\"\n\t\t},\n\t\t\"processing\": {\n\t\t\t\"title\": \"Processing\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"prolog\": {\n\t\t\t\"title\": \"Prolog\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"promql\": {\n\t\t\t\"title\": \"PromQL\",\n\t\t\t\"owner\": \"arendjr\"\n\t\t},\n\t\t\"properties\": {\n\t\t\t\"title\": \".properties\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"protobuf\": {\n\t\t\t\"title\": \"Protocol Buffers\",\n\t\t\t\"owner\": \"just-boris\"\n\t\t},\n\t\t\"pug\": {\n\t\t\t\"title\": \"Pug\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"puppet\": {\n\t\t\t\"title\": \"Puppet\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"pure\": {\n\t\t\t\"title\": \"Pure\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"purebasic\": {\n\t\t\t\"title\": \"PureBasic\",\n\t\t\t\"owner\": \"HeX0R101\"\n\t\t},\n\t\t\"purescript\": {\n\t\t\t\"title\": \"PureScript\",\n\t\t\t\"owner\": \"sriharshachilakapati\"\n\t\t},\n\t\t\"python\": {\n\t\t\t\"title\": \"Python\",\n\t\t\t\"owner\": \"multipetros\"\n\t\t},\n\t\t\"qsharp\": {\n\t\t\t\"title\": \"Q#\",\n\t\t\t\"owner\": \"fedonman\"\n\t\t},\n\t\t\"q\": {\n\t\t\t\"title\": \"Q (kdb+ database)\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"qml\": {\n\t\t\t\"title\": \"QML\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"qore\": {\n\t\t\t\"title\": \"Qore\",\n\t\t\t\"owner\": \"temnroegg\"\n\t\t},\n\t\t\"r\": {\n\t\t\t\"title\": \"R\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"racket\": {\n\t\t\t\"title\": \"Racket\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"cshtml\": {\n\t\t\t\"title\": \"Razor C#\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"jsx\": {\n\t\t\t\"title\": \"React JSX\",\n\t\t\t\"owner\": \"vkbansal\"\n\t\t},\n\t\t\"tsx\": {\n\t\t\t\"title\": \"React TSX\"\n\t\t},\n\t\t\"reason\": {\n\t\t\t\"title\": \"Reason\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"regex\": {\n\t\t\t\"title\": \"Regex\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"rego\": {\n\t\t\t\"title\": \"Rego\",\n\t\t\t\"owner\": \"JordanSh\"\n\t\t},\n\t\t\"renpy\": {\n\t\t\t\"title\": \"Ren'py\",\n\t\t\t\"owner\": \"HyuchiaDiego\"\n\t\t},\n\t\t\"rescript\": {\n\t\t\t\"title\": \"ReScript\",\n\t\t\t\"owner\": \"vmarcosp\"\n\t\t},\n\t\t\"rest\": {\n\t\t\t\"title\": \"reST (reStructuredText)\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"rip\": {\n\t\t\t\"title\": \"Rip\",\n\t\t\t\"owner\": \"ravinggenius\"\n\t\t},\n\t\t\"roboconf\": {\n\t\t\t\"title\": \"Roboconf\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"robotframework\": {\n\t\t\t\"title\": \"Robot Framework\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"ruby\": {\n\t\t\t\"title\": \"Ruby\",\n\t\t\t\"owner\": \"samflores\"\n\t\t},\n\t\t\"rust\": {\n\t\t\t\"title\": \"Rust\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"sas\": {\n\t\t\t\"title\": \"SAS\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"sass\": {\n\t\t\t\"title\": \"Sass (Sass)\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"scss\": {\n\t\t\t\"title\": \"Sass (SCSS)\",\n\t\t\t\"owner\": \"MoOx\"\n\t\t},\n\t\t\"scala\": {\n\t\t\t\"title\": \"Scala\",\n\t\t\t\"owner\": \"jozic\"\n\t\t},\n\t\t\"scheme\": {\n\t\t\t\"title\": \"Scheme\",\n\t\t\t\"owner\": \"bacchus123\"\n\t\t},\n\t\t\"shell-session\": {\n\t\t\t\"title\": \"Shell session\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"smali\": {\n\t\t\t\"title\": \"Smali\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"smalltalk\": {\n\t\t\t\"title\": \"Smalltalk\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"smarty\": {\n\t\t\t\"title\": \"Smarty\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"sml\": {\n\t\t\t\"title\": \"SML\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"smlnj\": \"SML/NJ\"\n\t\t\t},\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"solidity\": {\n\t\t\t\"title\": \"Solidity (Ethereum)\",\n\t\t\t\"owner\": \"glachaud\"\n\t\t},\n\t\t\"solution-file\": {\n\t\t\t\"title\": \"Solution file\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"soy\": {\n\t\t\t\"title\": \"Soy (Closure Template)\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"sparql\": {\n\t\t\t\"title\": \"SPARQL\",\n\t\t\t\"owner\": \"Triply-Dev\"\n\t\t},\n\t\t\"splunk-spl\": {\n\t\t\t\"title\": \"Splunk SPL\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"sqf\": {\n\t\t\t\"title\": \"SQF: Status Quo Function (Arma 3)\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"sql\": {\n\t\t\t\"title\": \"SQL\",\n\t\t\t\"owner\": \"multipetros\"\n\t\t},\n\t\t\"squirrel\": {\n\t\t\t\"title\": \"Squirrel\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"stan\": {\n\t\t\t\"title\": \"Stan\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"stata\": {\n\t\t\t\"title\": \"Stata Ado\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"iecst\": {\n\t\t\t\"title\": \"Structured Text (IEC 61131-3)\",\n\t\t\t\"owner\": \"serhioromano\"\n\t\t},\n\t\t\"stylus\": {\n\t\t\t\"title\": \"Stylus\",\n\t\t\t\"owner\": \"vkbansal\"\n\t\t},\n\t\t\"supercollider\": {\n\t\t\t\"title\": \"SuperCollider\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"swift\": {\n\t\t\t\"title\": \"Swift\",\n\t\t\t\"owner\": \"chrischares\"\n\t\t},\n\t\t\"systemd\": {\n\t\t\t\"title\": \"Systemd configuration file\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"t4-templating\": {\n\t\t\t\"title\": \"T4 templating\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"t4-cs\": {\n\t\t\t\"title\": \"T4 Text Templates (C#)\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"t4-vb\": {\n\t\t\t\"title\": \"T4 Text Templates (VB)\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"tap\": {\n\t\t\t\"title\": \"TAP\",\n\t\t\t\"owner\": \"isaacs\"\n\t\t},\n\t\t\"tcl\": {\n\t\t\t\"title\": \"Tcl\",\n\t\t\t\"owner\": \"PeterChaplin\"\n\t\t},\n\t\t\"tt2\": {\n\t\t\t\"title\": \"Template Toolkit 2\",\n\t\t\t\"owner\": \"gflohr\"\n\t\t},\n\t\t\"textile\": {\n\t\t\t\"title\": \"Textile\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"toml\": {\n\t\t\t\"title\": \"TOML\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"treeview\": {\n\t\t\t\"title\": \"Treeview\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"tremor\": {\n\t\t\t\"title\": \"Tremor\",\n\t\t\t\"owner\": \"darach\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"trickle\": \"trickle\",\n\t\t\t\t\"troy\": \"troy\"\n\t\t\t}\n\t\t},\n\t\t\"turtle\": {\n\t\t\t\"title\": \"Turtle\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"trig\": \"TriG\"\n\t\t\t},\n\t\t\t\"owner\": \"jakubklimek\"\n\t\t},\n\t\t\"twig\": {\n\t\t\t\"title\": \"Twig\",\n\t\t\t\"owner\": \"brandonkelly\"\n\t\t},\n\t\t\"typescript\": {\n\t\t\t\"title\": \"TypeScript\",\n\t\t\t\"owner\": \"vkbansal\"\n\t\t},\n\t\t\"typoscript\": {\n\t\t\t\"title\": \"TypoScript\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"tsconfig\": \"TSConfig\"\n\t\t\t},\n\t\t\t\"owner\": \"dkern\"\n\t\t},\n\t\t\"unrealscript\": {\n\t\t\t\"title\": \"UnrealScript\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"uorazor\": {\n\t\t\t\"title\": \"UO Razor Script\",\n\t\t\t\"owner\": \"jaseowns\"\n\t\t},\n\t\t\"uri\": {\n\t\t\t\"title\": \"URI\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"url\": \"URL\"\n\t\t\t},\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"v\": {\n\t\t\t\"title\": \"V\",\n\t\t\t\"owner\": \"taggon\"\n\t\t},\n\t\t\"vala\": {\n\t\t\t\"title\": \"Vala\",\n\t\t\t\"owner\": \"TemplarVolk\"\n\t\t},\n\t\t\"vbnet\": {\n\t\t\t\"title\": \"VB.Net\",\n\t\t\t\"owner\": \"Bigsby\"\n\t\t},\n\t\t\"velocity\": {\n\t\t\t\"title\": \"Velocity\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"verilog\": {\n\t\t\t\"title\": \"Verilog\",\n\t\t\t\"owner\": \"a-rey\"\n\t\t},\n\t\t\"vhdl\": {\n\t\t\t\"title\": \"VHDL\",\n\t\t\t\"owner\": \"a-rey\"\n\t\t},\n\t\t\"vim\": {\n\t\t\t\"title\": \"vim\",\n\t\t\t\"owner\": \"westonganger\"\n\t\t},\n\t\t\"visual-basic\": {\n\t\t\t\"title\": \"Visual Basic\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"vba\": \"VBA\"\n\t\t\t},\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"warpscript\": {\n\t\t\t\"title\": \"WarpScript\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"wasm\": {\n\t\t\t\"title\": \"WebAssembly\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"web-idl\": {\n\t\t\t\"title\": \"Web IDL\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"wgsl\": {\n\t\t\t\"title\": \"WGSL\",\n\t\t\t\"owner\": \"Dr4gonthree\"\n\t\t},\n\t\t\"wiki\": {\n\t\t\t\"title\": \"Wiki markup\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"wolfram\": {\n\t\t\t\"title\": \"Wolfram language\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"mathematica\": \"Mathematica\",\n\t\t\t\t\"nb\": \"Mathematica Notebook\"\n\t\t\t},\n\t\t\t\"owner\": \"msollami\"\n\t\t},\n\t\t\"wren\": {\n\t\t\t\"title\": \"Wren\",\n\t\t\t\"owner\": \"clsource\"\n\t\t},\n\t\t\"xeora\": {\n\t\t\t\"title\": \"Xeora\",\n\t\t\t\"aliasTitles\": {\n\t\t\t\t\"xeoracube\": \"XeoraCube\"\n\t\t\t},\n\t\t\t\"owner\": \"freakmaxi\"\n\t\t},\n\t\t\"xml-doc\": {\n\t\t\t\"title\": \"XML doc (.net)\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"xojo\": {\n\t\t\t\"title\": \"Xojo (REALbasic)\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"xquery\": {\n\t\t\t\"title\": \"XQuery\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"yaml\": {\n\t\t\t\"title\": \"YAML\",\n\t\t\t\"owner\": \"hason\"\n\t\t},\n\t\t\"yang\": {\n\t\t\t\"title\": \"YANG\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"zig\": {\n\t\t\t\"title\": \"Zig\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t}\n\t},\n\t\"plugins\": {\n\t\t\"meta\": {\n\t\t\t\"path\": \"plugins/{id}/{id}\",\n\t\t\t\"link\": \"plugins/{id}/\"\n\t\t},\n\t\t\"line-highlight\": {\n\t\t\t\"title\": \"Line Highlight\",\n\t\t\t\"description\": \"Highlights specific lines and/or line ranges.\"\n\t\t},\n\t\t\"line-numbers\": {\n\t\t\t\"title\": \"Line Numbers\",\n\t\t\t\"description\": \"Line number at the beginning of code lines.\",\n\t\t\t\"owner\": \"kuba-kubula\"\n\t\t},\n\t\t\"show-invisibles\": {\n\t\t\t\"title\": \"Show Invisibles\",\n\t\t\t\"description\": \"Show hidden characters such as tabs and line breaks.\"\n\t\t},\n\t\t\"autolinker\": {\n\t\t\t\"title\": \"Autolinker\",\n\t\t\t\"description\": \"Converts URLs and emails in code to clickable links. Parses Markdown links in comments.\"\n\t\t},\n\t\t\"wpd\": {\n\t\t\t\"title\": \"WebPlatform Docs\",\n\t\t\t\"description\": \"Makes tokens link to <a href=\\\"https://webplatform.github.io/docs/\\\">WebPlatform.org documentation</a>. The links open in a new tab.\"\n\t\t},\n\t\t\"custom-class\": {\n\t\t\t\"title\": \"Custom Class\",\n\t\t\t\"description\": \"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.\",\n\t\t\t\"owner\": \"dvkndn\",\n\t\t\t\"noCSS\": true\n\t\t},\n\t\t\"file-highlight\": {\n\t\t\t\"title\": \"File Highlight\",\n\t\t\t\"description\": \"Fetch external files and highlight them with Prism. Used on the Prism website itself.\",\n\t\t\t\"noCSS\": true\n\t\t},\n\t\t\"show-language\": {\n\t\t\t\"title\": \"Show Language\",\n\t\t\t\"description\": \"Display the highlighted language in code blocks (inline code does not show the label).\",\n\t\t\t\"owner\": \"nauzilus\",\n\t\t\t\"noCSS\": true\n\t\t},\n\t\t\"jsonp-highlight\": {\n\t\t\t\"title\": \"JSONP Highlight\",\n\t\t\t\"description\": \"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).\",\n\t\t\t\"noCSS\": true,\n\t\t\t\"owner\": \"nauzilus\"\n\t\t},\n\t\t\"highlight-keywords\": {\n\t\t\t\"title\": \"Highlight Keywords\",\n\t\t\t\"description\": \"Adds special CSS classes for each keyword for fine-grained highlighting.\",\n\t\t\t\"owner\": \"vkbansal\",\n\t\t\t\"noCSS\": true\n\t\t},\n\t\t\"inline-color\": {\n\t\t\t\"title\": \"Inline color\",\n\t\t\t\"description\": \"Adds a small inline preview for colors in style sheets.\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"previewers\": {\n\t\t\t\"title\": \"Previewers\",\n\t\t\t\"description\": \"Previewers for angles, colors, gradients, easing and time.\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t},\n\t\t\"autoloader\": {\n\t\t\t\"title\": \"Autoloader\",\n\t\t\t\"description\": \"Automatically loads the needed languages to highlight the code blocks.\",\n\t\t\t\"owner\": \"Golmote\",\n\t\t\t\"noCSS\": true\n\t\t},\n\t\t\"keep-markup\": {\n\t\t\t\"title\": \"Keep Markup\",\n\t\t\t\"description\": \"Prevents custom markup from being dropped out during highlighting.\",\n\t\t\t\"owner\": \"Golmote\",\n\t\t\t\"noCSS\": true\n\t\t},\n\t\t\"command-line\": {\n\t\t\t\"title\": \"Command Line\",\n\t\t\t\"description\": \"Display a command line with a prompt and, optionally, the output/response from the commands.\",\n\t\t\t\"owner\": \"chriswells0\"\n\t\t},\n\t\t\"unescaped-markup\": {\n\t\t\t\"title\": \"Unescaped Markup\",\n\t\t\t\"description\": \"Write markup without having to escape anything.\"\n\t\t},\n\t\t\"normalize-whitespace\": {\n\t\t\t\"title\": \"Normalize Whitespace\",\n\t\t\t\"description\": \"Supports multiple operations to normalize whitespace in code blocks.\",\n\t\t\t\"owner\": \"zeitgeist87\",\n\t\t\t\"noCSS\": true\n\t\t},\n\t\t\"data-uri-highlight\": {\n\t\t\t\"title\": \"Data-URI Highlight\",\n\t\t\t\"description\": \"Highlights data-URI contents.\",\n\t\t\t\"owner\": \"Golmote\",\n\t\t\t\"noCSS\": true\n\t\t},\n\t\t\"toolbar\": {\n\t\t\t\"title\": \"Toolbar\",\n\t\t\t\"description\": \"Attach a toolbar for plugins to easily register buttons on the top of a code block.\",\n\t\t\t\"owner\": \"mAAdhaTTah\"\n\t\t},\n\t\t\"copy-to-clipboard\": {\n\t\t\t\"title\": \"Copy to Clipboard Button\",\n\t\t\t\"description\": \"Add a button that copies the code block to the clipboard when clicked.\",\n\t\t\t\"owner\": \"mAAdhaTTah\",\n\t\t\t\"noCSS\": true\n\t\t},\n\t\t\"download-button\": {\n\t\t\t\"title\": \"Download Button\",\n\t\t\t\"description\": \"A button in the toolbar of a code block adding a convenient way to download a code file.\",\n\t\t\t\"owner\": \"Golmote\",\n\t\t\t\"noCSS\": true\n\t\t},\n\t\t\"match-braces\": {\n\t\t\t\"title\": \"Match braces\",\n\t\t\t\"description\": \"Highlights matching braces.\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"diff-highlight\": {\n\t\t\t\"title\": \"Diff Highlight\",\n\t\t\t\"description\": \"Highlights the code inside diff blocks.\",\n\t\t\t\"owner\": \"RunDevelopment\"\n\t\t},\n\t\t\"filter-highlight-all\": {\n\t\t\t\"title\": \"Filter highlightAll\",\n\t\t\t\"description\": \"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.\",\n\t\t\t\"owner\": \"RunDevelopment\",\n\t\t\t\"noCSS\": true\n\t\t},\n\t\t\"treeview-icons\": {\n\t\t\t\"title\": \"Treeview Icons\",\n\t\t\t\"description\": \"Adds icons and special styles to highlighted file system tree structures.\",\n\t\t\t\"owner\": \"Golmote\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/config.js",
    "content": "const hasDOM = typeof document !== 'undefined' && typeof window !== 'undefined';\nconst scriptElement = hasDOM ? document.currentScript : null;\n\n/**\n * @type {GlobalConfig}\n */\nconst globalConfig = globalThis.Prism?.constructor?.name === 'Object' ? globalThis.Prism : {};\n\n/**\n * @param {string} name\n */\nfunction getGlobalSetting (name) {\n\t// eslint-disable-next-line regexp/no-unused-capturing-group\n\tconst camelCaseName = name.replace(/-([a-z])/g, g => g[1].toUpperCase());\n\n\tif (camelCaseName in globalConfig) {\n\t\treturn globalConfig[camelCaseName];\n\t}\n\telse if (name in globalConfig) {\n\t\treturn globalConfig[name];\n\t}\n\telse if (hasDOM) {\n\t\treturn (\n\t\t\tscriptElement?.dataset[camelCaseName] ??\n\t\t\tdocument.querySelector(`[data-prism-${name}]`)?.getAttribute(`data-prism-${name}`)\n\t\t);\n\t}\n}\n\n/**\n * @param {string} name\n * @param {boolean} defaultValue\n * @returns {boolean}\n */\nfunction getGlobalBooleanSetting (name, defaultValue) {\n\tconst value = getGlobalSetting(name);\n\n\tif (value === null || value === undefined) {\n\t\treturn defaultValue;\n\t}\n\n\treturn !(value === false || value === 'false');\n}\n\n/**\n * @param {string} name\n * @returns {string[]}\n */\nfunction getGlobalArraySetting (name) {\n\tconst value = getGlobalSetting(name);\n\tif (value === null || value === undefined || value === false || value === 'false') {\n\t\treturn [];\n\t}\n\telse if (typeof value === 'string') {\n\t\treturn value.split(',').map(s => s.trim());\n\t}\n\telse if (Array.isArray(value)) {\n\t\treturn value;\n\t}\n\n\treturn [];\n}\n\n/**\n * @type {PrismConfig}\n */\nexport const globalDefaults = {\n\tmanual: getGlobalBooleanSetting('manual', !hasDOM),\n\tsilent: getGlobalBooleanSetting('silent', false),\n\tlanguages: getGlobalArraySetting('languages'),\n\tplugins: getGlobalArraySetting('plugins'),\n\tlanguagePath: /** @type {string} */ (getGlobalSetting('language-path') ?? './languages/'),\n\tpluginPath: /** @type {string} */ (getGlobalSetting('plugin-path') ?? './plugins/'),\n};\n\nexport default globalDefaults;\n\n/**\n * @import { PrismConfig, GlobalConfig } from './types.d.ts';\n */\n"
  },
  {
    "path": "src/core/classes/component-registry.js",
    "content": "import { allSettled } from '../../util/async.js';\n\n/**\n * @template {ComponentProto} T\n */\nexport default class ComponentRegistry extends EventTarget {\n\tstatic type = 'unknown';\n\n\t/**\n\t * All imported components.\n\t *\n\t * @type {Record<string, T>}\n\t */\n\tcache = {};\n\n\t/**\n\t * All components that are currently being loaded.\n\t *\n\t * @type {Record<string, Promise<T>>}\n\t */\n\tloading = {};\n\n\t/**\n\t * Same data as in loading, but as an array, used for aggregate promises.\n\t * IMPORTANT: Do NOT overwrite this array, only modify its contents.\n\t *\n\t * @type {Promise<T>[]}\n\t */\n\t#loadingList = [];\n\n\t/**\n\t * @type {Promise<T[]>}\n\t */\n\tready;\n\n\t/**\n\t * Path to the components, used for loading.\n\t *\n\t * @type {string}\n\t */\n\tpath;\n\n\t/**\n\t * A reference to the Prism instance.\n\t *\n\t * @type {Prism}\n\t */\n\tprism;\n\n\t/**\n\t * @type {ComponentRegistryOptions}\n\t */\n\toptions;\n\n\t/**\n\t *\n\t * @param {ComponentRegistryOptions} options\n\t */\n\tconstructor (options) {\n\t\tsuper();\n\n\t\tthis.options = options;\n\t\tlet { path, preload, prism } = options;\n\n\t\tthis.prism = prism;\n\n\t\tpath = path.endsWith('/') ? path : path + '/';\n\t\tthis.path = path;\n\n\t\tif (preload) {\n\t\t\tvoid this.loadAll(preload);\n\t\t}\n\n\t\tthis.ready = /** @type {Promise<T[]>} */ (allSettled(this.#loadingList));\n\t}\n\n\t/**\n\t * Returns the component if it is already loaded or a promise that resolves when it is loaded,\n\t * without triggering a load like `load()` would.\n\t *\n\t * @param {string} id\n\t * @returns {Promise<T>}\n\t */\n\tasync whenDefined (id) {\n\t\tif (this.cache[id]) {\n\t\t\t// Already loaded\n\t\t\treturn this.cache[id];\n\t\t}\n\n\t\tif (this.loading[id] !== undefined) {\n\t\t\t// Already loading\n\t\t\treturn this.loading[id];\n\t\t}\n\n\t\tconst Self = /** @type {typeof ComponentRegistry} */ (this.constructor);\n\t\treturn new Promise(resolve => {\n\t\t\t/**\n\t\t\t * @param {CustomEvent<AddEventPayload<T>>} e\n\t\t\t */\n\t\t\tconst handler = e => {\n\t\t\t\tif (e.detail.id === id) {\n\t\t\t\t\tresolve(e.detail.component);\n\t\t\t\t\tthis.removeEventListener('add', /** @type {EventListener} */ (handler));\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.addEventListener('add' + Self.type, /** @type {EventListener} */ (handler));\n\t\t});\n\t}\n\n\t/**\n\t * Add a component to the registry.\n\t *\n\t * @param {T} def Component\n\t * @param {string} [id=def.id] Component id\n\t * @param {object} [options] Options\n\t * @param {boolean} [options.force] Force add the component even if it is already present\n\t * @returns {boolean} true if the component was added, false if it was already present\n\t */\n\tadd (def, id = def.id, options) {\n\t\tconst Self = /** @type {typeof ComponentRegistry} */ (this.constructor);\n\n\t\tif (typeof this.loading[id] !== 'undefined') {\n\t\t\t// If it was loading, remove it from the loading list\n\t\t\tconst index = this.#loadingList.indexOf(this.loading[id]);\n\t\t\tif (index > -1) {\n\t\t\t\tthis.#loadingList.splice(index, 1);\n\t\t\t}\n\n\t\t\tdelete this.loading[id];\n\t\t}\n\n\t\tif (!this.cache[id] || options?.force) {\n\t\t\tthis.cache[id] = def;\n\n\t\t\tthis.dispatchEvent(\n\t\t\t\t/** @type {CustomEvent<AddEventPayload<T>>} */\n\t\t\t\tnew CustomEvent('add', {\n\t\t\t\t\tdetail: { id, type: Self.type, component: def },\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tthis.dispatchEvent(\n\t\t\t\t/** @type {CustomEvent<AddEventPayload<T>>} */\n\t\t\t\tnew CustomEvent('add' + Self.type, {\n\t\t\t\t\tdetail: { id, component: def },\n\t\t\t\t})\n\t\t\t);\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t *\n\t * @param {string} id\n\t * @returns {boolean}\n\t */\n\thas (id) {\n\t\treturn this.cache[id] !== undefined;\n\t}\n\n\t/**\n\t *\n\t * @param {string} id\n\t * @returns {T | null}\n\t */\n\tget (id) {\n\t\treturn this.cache[id] ?? null;\n\t}\n\n\t/**\n\t *\n\t * @param {string} id\n\t * @returns {T | Promise<T | null>}\n\t */\n\tload (id) {\n\t\tif (this.cache[id]) {\n\t\t\treturn this.cache[id];\n\t\t}\n\n\t\tif (this.loading[id] !== undefined) {\n\t\t\t// Already loading\n\t\t\treturn this.loading[id];\n\t\t}\n\n\t\tconst loadingComponent = import(this.path + id + '.js')\n\t\t\t.then(m => {\n\t\t\t\t/** @type {T} */\n\t\t\t\tconst component = m.default ?? m;\n\t\t\t\tthis.add(component, id);\n\t\t\t\treturn component;\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn null;\n\t\t\t});\n\n\t\tthis.loading[id] = /** @type {Promise<T>} */ (loadingComponent);\n\t\tthis.#loadingList.push(/** @type {Promise<T>} */ (loadingComponent));\n\t\treturn loadingComponent;\n\t}\n\n\t/**\n\t *\n\t * @param {string[]} ids\n\t * @returns {(T | Promise<T | null>)[]}\n\t */\n\tloadAll (ids) {\n\t\tif (!Array.isArray(ids)) {\n\t\t\tids = [ids];\n\t\t}\n\n\t\treturn ids.map(id => this.load(id));\n\t}\n}\n\n/**\n * @import {Prism} from '../prism.js'\n * @import {ComponentProto} from '../../types.d.ts'\n */\n\n/**\n * @typedef {object} ComponentRegistryOptions\n * @property {string} path Path to the components\n * @property {string[]} [preload] List of component ids to preload\n * @property {Prism} prism A reference to the Prism instance\n */\n\n/**\n * @template {ComponentProto} T\n * @typedef {object} AddEventPayload\n * @property {string} id\n * @property {string} [type]\n * @property {T} component\n */\n"
  },
  {
    "path": "src/core/classes/hooks.js",
    "content": "/**\n * A class for managing hooks for deep extensibility.\n * Inspired by https://www.npmjs.com/package/blissful-hooks.\n */\nexport class Hooks {\n\t/**\n\t * Private internal map of hook names to arrays of callback functions.\n\t *\n\t * @type {HooksAll}\n\t */\n\t_all = {};\n\n\t/**\n\t * Adds the given callback to the list of callbacks for the given hook and returns a function that\n\t * removes the hook again when called.\n\t *\n\t * The callback will be invoked when the hook it is registered for is run.\n\t * Hooks are usually directly run by a highlight function but you can also run hooks yourself.\n\t *\n\t * One callback function can be registered to multiple hooks.\n\t *\n\t * A callback function must not be registered for the same hook multiple times. Doing so will cause\n\t * undefined behavior. However, registering a callback again after removing it is fine.\n\t *\n\t * @type {HooksAdd}\n\t * @param name Hook name(s) or a map of hook names to callbacks.\n\t * @param callback The callback function which is given environment variables.\n\t * @returns Function that removes the callback when called.\n\t */\n\tadd (name, callback) {\n\t\tif (Array.isArray(name)) {\n\t\t\t// One function, multiple hooks\n\t\t\tfor (const n of name) {\n\t\t\t\tthis.add(n, callback);\n\t\t\t}\n\t\t}\n\t\telse if (typeof name === 'object') {\n\t\t\t// Multiple hooks\n\t\t\tconst hooks = name;\n\n\t\t\tfor (const name in hooks) {\n\t\t\t\tconst callback = hooks[name];\n\t\t\t\tif (callback) {\n\t\t\t\t\tthis.add(/** @type {string} */ (name), /** @type {HookCallback} */ (callback));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconst hooks = (this._all[name] ??= []);\n\t\t\thooks.push(/** @type {never} */ (callback));\n\t\t}\n\n\t\treturn () => {\n\t\t\tthis.remove(name, callback);\n\t\t};\n\t}\n\n\t/**\n\t * Removes the given callback from the list of callbacks for the given hook(s).\n\t *\n\t * @type {HooksRemove}\n\t * @param name Hook name(s) or a map of hook names to callbacks.\n\t * @param callback The callback function to remove.\n\t */\n\tremove (name, callback) {\n\t\tif (Array.isArray(name)) {\n\t\t\t// Multiple hook names, same callback\n\t\t\tfor (const n of name) {\n\t\t\t\tthis.remove(n, callback);\n\t\t\t}\n\t\t}\n\t\telse if (typeof name === 'object') {\n\t\t\t// Map of hook names to callbacks\n\t\t\tfor (const n in name) {\n\t\t\t\tthis.remove(n, callback);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconst index = this._all[name]?.indexOf(/** @type {never} */ (callback));\n\t\t\tif (index > -1) {\n\t\t\t\tthis._all[name].splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t *\n\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t *\n\t * @type {HooksRun}\n\t * @param name The name of the hook.\n\t * @param env The environment variables of the hook passed to all callbacks registered.\n\t */\n\trun (name, env) {\n\t\tconst callbacks = this._all[name];\n\t\tconst context = env?.this ?? env?.context ?? env;\n\n\t\tif (!callbacks || !callbacks.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const callback of callbacks) {\n\t\t\tcallback.call(context, env);\n\t\t}\n\t}\n}\n\n/**\n * @typedef {import('../../types.d.ts').HookCallback} HookCallback\n * @typedef {import('../../types.d.ts').HooksAll} HooksAll\n * @typedef {import('../../types.d.ts').HooksAdd} HooksAdd\n * @typedef {import('../../types.d.ts').HooksRemove} HooksRemove\n * @typedef {import('../../types.d.ts').HooksRun} HooksRun\n */\n"
  },
  {
    "path": "src/core/classes/language-registry.js",
    "content": "import ComponentRegistry from './component-registry.js';\nimport Language from './language.js';\n\nexport default class LanguageRegistry extends ComponentRegistry {\n\tstatic type = 'language';\n\n\t/** @type {Record<string, string>} */\n\taliases = {};\n\n\t/** @type {Languages} */\n\tinstances = {};\n\n\t/** @type {WeakMap<LanguageProto, Language>} */\n\tdefs = new WeakMap();\n\n\t/**\n\t * Add a language definition to the registry.\n\t * This does not necessarily resolve the language.\n\t *\n\t * @param {LanguageProto} def\n\t * @returns {boolean}\n\t */\n\tadd (def) {\n\t\tconst added = super.add(def);\n\n\t\tif (added) {\n\t\t\tif (def.alias) {\n\t\t\t\tconst id = def.id;\n\n\t\t\t\tif (typeof def.alias === 'string') {\n\t\t\t\t\tthis.aliases[def.alias] = id;\n\t\t\t\t}\n\t\t\t\telse if (Array.isArray(def.alias)) {\n\t\t\t\t\tfor (const alias of def.alias) {\n\t\t\t\t\t\tthis.aliases[alias] = id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdef.effect?.(this.prism);\n\t\t}\n\n\t\treturn added;\n\t}\n\n\t/**\n\t * @param {string | LanguageProto | Language} ref\n\t * @returns { {\n\t\t\tid: string;\n\t\t\tdef: LanguageProto;\n\t\t\tlanguage?: Language;\n\t\t} }\n\t */\n\tresolveRef (ref) {\n\t\tif (ref instanceof Language) {\n\t\t\treturn { id: ref.id, def: ref.def, language: ref };\n\t\t}\n\n\t\t/** @type {string} */\n\t\tlet id;\n\n\t\t/** @type {LanguageProto} */\n\t\tlet def;\n\n\t\tif (typeof ref === 'object') {\n\t\t\tdef = ref;\n\t\t\tid = def.id;\n\t\t}\n\t\telse if (typeof ref === 'string') {\n\t\t\tid = ref;\n\t\t}\n\t\telse {\n\t\t\tthrow new Error(`Invalid argument type: ${ref}`);\n\t\t}\n\n\t\tid = this.aliases[id] ?? id;\n\t\tdef ??= this.cache[id];\n\t\tconst language = this.instances[id];\n\n\t\treturn { id, def, language };\n\t}\n\n\t/**\n\t * Get resolved language, language definition or null if it doesn't exist.\n\t * If definition is loaded but not yet resolved, it will NOT be resolved. Use {@link getLanguage} for that.\n\t *\n\t * @param {string | Language | LanguageProto} ref Language id or definition\n\t * @returns {Language | null}\n\t */\n\tpeek (ref) {\n\t\tconst { id, def, language } = this.resolveRef(ref);\n\n\t\tif (language) {\n\t\t\treturn language;\n\t\t}\n\n\t\tif (this.defs.has(def)) {\n\t\t\treturn this.defs.get(def) ?? null;\n\t\t}\n\n\t\tif (this.instances[id]) {\n\t\t\treturn this.instances[id];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get resolved language or null if it doesn't exist\n\t * If definition is loaded but not yet resolved, it will be resolved and returned.\n\t *\n\t * @param {string | Language | LanguageProto} ref\n\t * @returns {Language | null}\n\t */\n\tgetLanguage (ref) {\n\t\tconst languageOrDef = this.peek(ref);\n\n\t\tif (languageOrDef instanceof Language) {\n\t\t\treturn languageOrDef;\n\t\t}\n\n\t\tconst { id, def } = this.resolveRef(ref);\n\n\t\tif (!this.cache[id]) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// NOTE: this will overwrite any existing language with the same id\n\t\t// We can add an option to prevent this in the future\n\t\tconst language = new Language(def, this);\n\t\tthis.defs.set(def, language);\n\t\tthis.instances[def.id] = language;\n\t\treturn language;\n\t}\n}\n\n/** @import { LanguageProto, Languages } from '../../types.d.ts' */\n"
  },
  {
    "path": "src/core/classes/language.js",
    "content": "import { extend } from '../../shared.js';\nimport { grammarPatch } from '../../util/grammar-patch.js';\nimport { deepClone, defineLazyProperty } from '../../util/objects.js';\nimport List from './list.js';\n\nexport default class Language extends EventTarget {\n\t/** @type {LanguageProto} */\n\tdef;\n\n\t/** @type {LanguageRegistry} */\n\tregistry;\n\n\t/** @type {List<Language | LanguageProto>} */\n\trequire = new List();\n\n\t/** @type {List<string | Language | LanguageProto>} */\n\toptional = new List();\n\n\t/** @type {LanguageGrammars} */\n\tlanguages = {};\n\n\treadyState = 0;\n\n\t/**\n\t *\n\t * @param {LanguageProto} def\n\t * @param {LanguageRegistry} registry\n\t */\n\tconstructor (def, registry) {\n\t\tsuper();\n\t\tthis.def = def;\n\t\tthis.registry = registry;\n\n\t\tif (this.def.base) {\n\t\t\tthis.require.add(this.def.base);\n\t\t}\n\t\tif (this.def.require) {\n\t\t\tthis.require.addAll(/** @type {LanguageProto | LanguageProto[]} */ (this.def.require));\n\t\t}\n\n\t\tif (this.def.optional) {\n\t\t\tthis.optional.addAll(this.def.optional);\n\n\t\t\tif (this.optional.size > 0) {\n\t\t\t\tfor (const optionalLanguageId of this.optional) {\n\t\t\t\t\tif (!this.registry.has(optionalLanguageId)) {\n\t\t\t\t\t\tthis.registry.whenDefined(optionalLanguageId).then(() => {\n\t\t\t\t\t\t\t// TODO\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const def of this.require) {\n\t\t\t// Ensure all required languages are registered, but not necessarily resolved yet\n\t\t\tthis.registry.add(def);\n\n\t\t\tdefineLazyProperty(this.languages, def.id, () => {\n\t\t\t\tconst language = this.registry.peek(def);\n\t\t\t\tif (language) {\n\t\t\t\t\t// Already resolved\n\t\t\t\t\treturn language.resolvedGrammar;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn this.registry.getLanguage(def.id).resolvedGrammar;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfor (const id of this.optional) {\n\t\t\t// TODO: we need to update the grammar\n\t\t\tdefineLazyProperty(\n\t\t\t\tthis.languages,\n\t\t\t\tid,\n\t\t\t\t() => {\n\t\t\t\t\treturn this.registry.getLanguage(id).resolvedGrammar;\n\t\t\t\t},\n\t\t\t\tthis.registry.peek(id) ?? this.registry.whenDefined(id)\n\t\t\t);\n\t\t}\n\t}\n\n\tresolve () {}\n\n\tget id () {\n\t\treturn this.def.id;\n\t}\n\n\tget alias () {\n\t\tif (!this.def.alias) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn Array.isArray(this.def.alias) ? this.def.alias : [this.def.alias];\n\t}\n\n\t/**\n\t * @returns {Language | null}\n\t */\n\tget base () {\n\t\tif (!this.def.base) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst base = this.def.base;\n\t\tconst language = this.registry.peek(base);\n\t\tif (language) {\n\t\t\t// Already resolved\n\t\t\treturn language;\n\t\t}\n\t\telse {\n\t\t\treturn this.registry.getLanguage(base.id);\n\t\t}\n\t}\n\n\t/**\n\t * @returns {Grammar}\n\t */\n\tget grammar () {\n\t\t// Lazily evaluate grammar\n\t\tconst def = this.def;\n\n\t\tlet { grammar } = def;\n\t\tconst base = this.base;\n\n\t\tif (typeof grammar === 'function') {\n\t\t\tconst options = {\n\t\t\t\t...(base && {\n\t\t\t\t\tget base () {\n\t\t\t\t\t\treturn base.resolvedGrammar;\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tlanguages: this.languages,\n\n\t\t\t\t/**\n\t\t\t\t * @param {string} id\n\t\t\t\t * @param {Grammar} ref\n\t\t\t\t */\n\t\t\t\textend: (id, ref) => extend(this.languages[id], ref),\n\n\t\t\t\t/**\n\t\t\t\t * @param {string} id\n\t\t\t\t */\n\t\t\t\tgetOptionalLanguage: id => {\n\t\t\t\t\tconst language = this.languages[id] ?? this.registry.getLanguage(id);\n\t\t\t\t\treturn language?.resolvedGrammar ?? language;\n\t\t\t\t},\n\n\t\t\t\t/**\n\t\t\t\t * @param {string} id\n\t\t\t\t */\n\t\t\t\twhenDefined: id => {\n\t\t\t\t\treturn this.registry.whenDefined(id);\n\t\t\t\t},\n\t\t\t};\n\t\t\tgrammar = grammar.call(this, /** @type {any} */ (options));\n\t\t}\n\n\t\tif (base) {\n\t\t\tgrammar = extend(base.grammar, grammar);\n\t\t}\n\n\t\tif (def.grammar === grammar) {\n\t\t\t// We need these to be separate so that any code modifying them doesn't affect other instances\n\t\t\tgrammar = deepClone(grammar);\n\t\t}\n\n\t\t// This will replace the getter with a writable property\n\t\t// @ts-ignore\n\t\treturn (this.grammar = grammar);\n\t}\n\n\t/**\n\t * @param {Grammar} grammar\n\t */\n\tset grammar (grammar) {\n\t\tthis.readyState = 2;\n\t\tObject.defineProperty(this, 'grammar', { value: grammar, writable: true });\n\t}\n\n\tget resolvedGrammar () {\n\t\tconst ret = grammarPatch(this.grammar);\n\t\treturn (this.resolvedGrammar = ret);\n\t}\n\n\t/**\n\t * @param {Grammar} grammar\n\t */\n\tset resolvedGrammar (grammar) {\n\t\tthis.readyState = 3;\n\t\tObject.defineProperty(this, 'resolvedGrammar', { value: grammar, writable: true });\n\t}\n}\n\n/** @import { LanguageGrammars, LanguageProto, LanguageRegistry, Grammar } from '../../types.d.ts' */\n"
  },
  {
    "path": "src/core/classes/list.js",
    "content": "import { toIterable } from '../../util/iterables.js';\n\n/**\n * Set with some conveniences.\n *\n * @template T\n */\nexport default class List extends Set {\n\t/**\n\t * Alias of `size` so these objects can be handled like arrays\n\t */\n\tget length () {\n\t\treturn this.size;\n\t}\n\n\t/**\n\t * @param {Iterable<T> | T} arg\n\t * @returns\n\t */\n\taddAll (arg) {\n\t\tif (!arg) {\n\t\t\treturn this;\n\t\t}\n\n\t\tfor (const item of toIterable(arg)) {\n\t\t\tthis.add(item);\n\t\t}\n\n\t\treturn this;\n\t}\n}\n"
  },
  {
    "path": "src/core/classes/plugin-registry.js",
    "content": "import ComponentRegistry from './component-registry.js';\nimport Plugin from './plugin.js';\n\nexport default class PluginRegistry extends ComponentRegistry {\n\tstatic type = 'plugin';\n\n\t/** @type {Plugins} */\n\tinstances = {};\n\n\t/** @type {WeakMap<PluginProto, Plugin>} */\n\tdefs = new WeakMap();\n\n\t/**\n\t * Add a plugin definition to the registry.\n\t *\n\t * @param {PluginProto} def\n\t * @returns {boolean}\n\t */\n\tadd (def) {\n\t\tconst added = super.add(def);\n\n\t\tif (added) {\n\t\t\tconst plugin = new Plugin(def, this);\n\n\t\t\tthis.defs.set(def, plugin);\n\t\t\tthis.instances[def.id] = plugin;\n\n\t\t\tplugin.effect?.(this.prism);\n\t\t}\n\n\t\treturn added;\n\t}\n\n\t/**\n\t * Get plugin, plugin definition or null if it doesn't exist.\n\t *\n\t * @param {string | Plugin | PluginProto} ref Plugin id or definition\n\t * @returns {Plugin | null}\n\t * @throws {Error} If the argument type is invalid\n\t */\n\tpeek (ref) {\n\t\tif (ref instanceof Plugin) {\n\t\t\treturn ref;\n\t\t}\n\n\t\tif (typeof ref === 'object') {\n\t\t\treturn this.defs.get(ref) ?? null;\n\t\t}\n\t\telse if (typeof ref === 'string') {\n\t\t\treturn this.instances[ref] ?? null;\n\t\t}\n\t\telse {\n\t\t\tthrow new Error(`Invalid argument type: ${ref}`);\n\t\t}\n\t}\n}\n\n/** @import { PluginProto, Plugins } from '../../types.d.ts'; */\n"
  },
  {
    "path": "src/core/classes/plugin.js",
    "content": "import List from './list.js';\n\nexport default class Plugin extends EventTarget {\n\t/** @type {PluginProto} */\n\tdef;\n\n\t/** @type {PluginRegistry} */\n\tregistry;\n\n\t/** @type {List<ComponentProto>} */\n\trequire = new List();\n\n\t/**\n\t * @param {PluginProto} def\n\t * @param {PluginRegistry} registry\n\t */\n\tconstructor (def, registry) {\n\t\tsuper();\n\t\tthis.def = def;\n\t\tthis.registry = registry;\n\n\t\tif (this.def.require) {\n\t\t\tthis.require.addAll(this.def.require);\n\t\t}\n\n\t\tfor (const def of this.require) {\n\t\t\t// Ensure all required plugins and languages are registered\n\t\t\tif (def.grammar) {\n\t\t\t\t// We have a language definition\n\t\t\t\tthis.registry.prism.languageRegistry.add(def);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.registry.add(def);\n\t\t\t}\n\t\t}\n\t}\n\n\tget id () {\n\t\treturn this.def.id;\n\t}\n\n\tget plugin () {\n\t\tif (!this.def.plugin) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// This will replace the getter with a writable property\n\t\treturn (this.plugin = this.def.plugin(this.registry.prism));\n\t}\n\n\tset plugin (value) {\n\t\tObject.defineProperty(this, 'plugin', { value, writable: true });\n\t}\n\n\tget effect () {\n\t\treturn this.def.effect;\n\t}\n}\n\n/** @import {ComponentProto, PluginProto, PluginRegistry} from '../../types.d.ts'; */\n"
  },
  {
    "path": "src/core/classes/prism.js",
    "content": "import globalDefaults from '../../config.js';\nimport { allSettled, documentReady, nextTick } from '../../util/async.js';\nimport { highlightAll } from '../highlight-all.js';\nimport { highlightElement } from '../highlight-element.js';\nimport { highlight } from '../highlight.js';\nimport { tokenize } from '../tokenize/tokenize.js';\nimport { Hooks } from './hooks.js';\nimport LanguageRegistry from './language-registry.js';\nimport PluginRegistry from './plugin-registry.js';\n\n/**\n * Prism class, to create Prism instances with different settings.\n * In most use cases, you just need the pre-existing Prism instance, see {@link prism}.\n */\nexport default class Prism {\n\t/**\n\t * @type {Hooks}\n\t */\n\thooks = new Hooks();\n\n\t/**\n\t * @type {LanguageRegistry}\n\t */\n\tlanguageRegistry;\n\n\t/**\n\t * @type {PluginRegistry}\n\t */\n\tpluginRegistry;\n\n\t/**\n\t * @type {PrismConfig}\n\t */\n\tconfig = globalDefaults;\n\n\t/**\n\t * @type {Promise<unknown>[]}\n\t */\n\twaitFor = [nextTick()];\n\n\t/**\n\t * @type {Promise<unknown>}\n\t */\n\tready = allSettled(this.waitFor);\n\n\t/**\n\t * @param {PrismConfig} [config={}]\n\t */\n\tconstructor (config = {}) {\n\t\tthis.config = Object.assign({}, globalDefaults, config);\n\n\t\tthis.config.errorHandler ??= /** @type {PrismConfig['errorHandler']} */ (\n\t\t\tthis.config.silent ? () => undefined : console.error\n\t\t);\n\n\t\tconst reportError = this.config.errorHandler;\n\n\t\tthis.languageRegistry = new LanguageRegistry({\n\t\t\tpath: /** @type {string} */ (this.config.languagePath),\n\t\t\tpreload: this.config.languages,\n\t\t\tprism: this,\n\t\t});\n\n\t\tthis.pluginRegistry = new PluginRegistry({\n\t\t\tpath: /** @type {string} */ (this.config.pluginPath),\n\t\t\tprism: this,\n\t\t});\n\n\t\tthis.languagesReady = this.languageRegistry.ready;\n\t\tthis.waitFor.push(this.languagesReady);\n\n\t\t// Preload plugins\n\t\tconst plugins = this.config.plugins;\n\t\tif (plugins && plugins.length > 0) {\n\t\t\tconst pluginsReady = this.languagesReady\n\t\t\t\t.then(() => this.waitFor.push(...this.pluginRegistry.loadAll(plugins)))\n\t\t\t\t.catch(reportError);\n\t\t\tthis.waitFor.push(pluginsReady);\n\t\t}\n\n\t\tif (!this.config.manual) {\n\t\t\tthis.waitFor.push(documentReady());\n\n\t\t\tthis.ready.then(() => this.highlightAll()).catch(reportError);\n\t\t}\n\t}\n\n\tget languages () {\n\t\treturn this.languageRegistry.cache;\n\t}\n\n\tget plugins () {\n\t\treturn this.pluginRegistry.cache;\n\t}\n\n\t/**\n\t * Load a language by its id.\n\t *\n\t * @param {string} id\n\t * @returns {Promise<Language | LanguageProto | null>}\n\t */\n\tasync loadLanguage (id) {\n\t\tconst language = await this.languageRegistry.load(id);\n\n\t\treturn language;\n\t}\n\n\t/**\n\t * Load a plugin by its id.\n\t *\n\t * @param {string} id\n\t * @returns {Promise<PluginProto | null>}\n\t */\n\tasync loadPlugin (id) {\n\t\tawait this.languagesReady; // first, wait for any pending languages to load\n\t\tconst plugin = await this.pluginRegistry.load(id);\n\n\t\treturn plugin;\n\t}\n\n\t/**\n\t * See {@link highlightAll}.\n\t *\n\t * @param {HighlightAllOptions} [options]\n\t */\n\thighlightAll (options = {}) {\n\t\treturn highlightAll.call(this, options);\n\t}\n\n\t/**\n\t * See {@link highlightElement}\n\t *\n\t * @param {Element} element\n\t * @param {HighlightElementOptions} [options]\n\t */\n\thighlightElement (element, options = {}) {\n\t\treturn highlightElement.call(this, element, options);\n\t}\n\n\t/**\n\t * See {@link highlight}\n\t *\n\t * @param {string} text\n\t * @param {string} language\n\t * @param {HighlightOptions} [options]\n\t * @returns {string}\n\t */\n\thighlight (text, language, options = {}) {\n\t\treturn highlight.call(this, text, language, options);\n\t}\n\n\t/**\n\t * See {@link tokenize}\n\t *\n\t * @param {string} text\n\t * @param {Grammar} grammar\n\t * @returns {TokenStream}\n\t */\n\ttokenize (text, grammar) {\n\t\treturn tokenize.call(this, text, grammar);\n\t}\n}\n\n/**\n * @import { HighlightAllOptions } from '../highlight-all.js';\n * @import { HighlightElementOptions } from '../highlight-element.js';\n * @import { HighlightOptions } from '../highlight.js';\n * @import { PrismConfig, PluginProto, Language, LanguageProto, Grammar, TokenStream } from '../../types.d.ts';\n */\n"
  },
  {
    "path": "src/core/classes/token.js",
    "content": "export class Token {\n\t/**\n\t * The type of the token.\n\t *\n\t * This is usually the key of a pattern in a {@link Grammar}.\n\t *\n\t * @see {@link GrammarToken}\n\t * @type {TokenName}\n\t */\n\ttype;\n\n\t/**\n\t * The strings or tokens contained by this token.\n\t *\n\t * This will be a token stream if the pattern matched also defined an `inside` grammar.\n\t *\n\t * @type {string | TokenStream}\n\t */\n\tcontent;\n\n\t/**\n\t * The alias(es) of the token.\n\t *\n\t * @see {@link GrammarToken#alias}\n\t * @type {TokenName | TokenName[] | undefined}\n\t */\n\talias;\n\n\t/**\n\t * Length of the full string this token was created from.\n\t *\n\t * Only used internally. The API does not guarantee that this field has any particular value or meaning.\n\t *\n\t * @internal\n\t * @type {number}\n\t */\n\tlength;\n\n\t/**\n\t * Creates a new token.\n\t *\n\t * @param {TokenName} type\n\t * @param {string | TokenStream} content\n\t * @param {TokenName | TokenName[]} [alias]\n\t * @param {string} [matchedStr='']\n\t */\n\tconstructor (type, content, alias, matchedStr = '') {\n\t\tthis.type = type;\n\t\tthis.content = content;\n\t\tthis.alias = alias;\n\t\tthis.length = matchedStr.length;\n\t}\n\n\t/**\n\t * Adds the given alias to the list of aliases of this token.\n\t *\n\t * @param {TokenName} alias\n\t * @returns {void}\n\t */\n\taddAlias (alias) {\n\t\tlet aliases = this.alias;\n\t\tif (!aliases) {\n\t\t\tthis.alias = aliases = [];\n\t\t}\n\t\telse if (!Array.isArray(aliases)) {\n\t\t\tthis.alias = aliases = [aliases];\n\t\t}\n\t\taliases.push(alias);\n\t}\n}\n\nexport default Token;\n\n/**\n * Returns the text content of the given token or token stream.\n *\n * @param {string | Token | TokenStream} token\n * @returns {string}\n */\nexport function getTextContent (token) {\n\tif (typeof token === 'string') {\n\t\treturn token;\n\t}\n\telse if (Array.isArray(token)) {\n\t\treturn token.map(getTextContent).join('');\n\t}\n\telse {\n\t\treturn getTextContent(token.content);\n\t}\n}\n\n/**\n * @typedef {import('../../types.d.ts').TokenName} TokenName\n * @typedef {import('../../types.d.ts').TokenStream} TokenStream\n */\n"
  },
  {
    "path": "src/core/highlight-all.js",
    "content": "import singleton from './prism.js';\n\n/**\n * This is the most high-level function in Prism's API.\n * It queries all the elements that have a `.language-xxxx` class and then calls {@link Prism#highlightElement} on\n * each one of them.\n *\n * The following hooks will be run:\n * 1. `before-highlightall`\n * 2. `before-all-elements-highlight`\n * 3. All hooks of {@link Prism#highlightElement} for each element.\n *\n * @this {Prism}\n * @param {HighlightAllOptions} [options={}]\n */\nexport function highlightAll (options = {}) {\n\tconst prism = this ?? singleton;\n\tconst { root, async, callback } = options;\n\n\t/** @type {HookEnv} */\n\tconst env = {\n\t\tcallback,\n\t\troot: root ?? document,\n\t\tselector:\n\t\t\t'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code',\n\t};\n\n\tprism.hooks.run('before-highlightall', env);\n\n\tenv.elements = [...env.root.querySelectorAll(env.selector)];\n\n\tprism.hooks.run('before-all-elements-highlight', env);\n\n\tfor (const element of env.elements) {\n\t\tprism.highlightElement(element, { async, callback: env.callback });\n\t}\n}\n\n/**\n * @import { Prism } from './prism.js';\n * @import { HookEnv } from '../types.d.ts';\n * @import { AsyncHighlighter } from './highlight-element.js';\n */\n\n/**\n * @typedef {object} HighlightAllOptions\n * @property {ParentNode} [root] The root element, whose descendants that have a `.language-xxxx` class will be highlighted.\n * @property {AsyncHighlighter} [async]\n * @property {(element: Element) => void} [callback] An optional callback to be invoked on each element after its highlighting is done. @see HighlightElementOptionsCallback\n */\n"
  },
  {
    "path": "src/core/highlight-element.js",
    "content": "import { getLanguage, setLanguage } from '../shared/dom-util.js';\nimport { htmlEncode } from '../shared/util.js';\nimport singleton from './prism.js';\n\n/**\n * Highlights the code inside a single element.\n *\n * The following hooks will be run:\n * 1. `before-sanity-check`\n * 2. `before-highlight`\n * 3. All hooks of {@link Prism#highlight}. These hooks will be run by an asynchronous worker if `async` is `true`.\n * 4. `before-insert`\n * 5. `after-highlight`\n * 6. `complete`\n *\n * Some the above hooks will be skipped if the element doesn't contain any text or there is no grammar loaded for\n * the element's language.\n *\n * @this {Prism}\n * @param {Element} element The element containing the code. It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier.\n * @param {HighlightElementOptions} [options={}]\n */\nexport function highlightElement (element, options = {}) {\n\tconst prism = this ?? singleton;\n\tconst { async, callback } = options;\n\n\t// Find language\n\tconst language = getLanguage(element);\n\tconst grammar = prism.languageRegistry.getLanguage(language)?.resolvedGrammar;\n\n\t// Set language on the element, if not present\n\tsetLanguage(element, language);\n\n\t// Set language on the parent, for styling\n\tlet parent = element.parentElement;\n\tif (parent && parent.nodeName.toLowerCase() === 'pre') {\n\t\tsetLanguage(parent, language);\n\t}\n\n\tconst code = element.textContent;\n\n\t/** @type {HookEnv} */\n\tconst env = {\n\t\telement,\n\t\tlanguage,\n\t\tgrammar,\n\t\tcode,\n\t};\n\n\t/**\n\t * @param {string} highlightedCode\n\t */\n\tconst insertHighlightedCode = highlightedCode => {\n\t\tenv.highlightedCode = highlightedCode;\n\t\tprism.hooks.run('before-insert', env);\n\n\t\tenv.element.innerHTML = env.highlightedCode;\n\n\t\tprism.hooks.run('after-highlight', env);\n\t\tprism.hooks.run('complete', env);\n\t\tcallback?.(env.element);\n\t};\n\n\tprism.hooks.run('before-sanity-check', env);\n\n\t// plugins may change/add the parent/element\n\tparent = env.element.parentElement;\n\tif (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) {\n\t\tparent.setAttribute('tabindex', '0');\n\t}\n\n\tif (!env.code) {\n\t\tprism.hooks.run('complete', env);\n\t\tcallback?.(env.element);\n\t\treturn;\n\t}\n\n\tprism.hooks.run('before-highlight', env);\n\n\tif (!env.grammar) {\n\t\tinsertHighlightedCode(htmlEncode(env.code));\n\t\treturn;\n\t}\n\n\tif (async) {\n\t\tasync({\n\t\t\tlanguage: env.language,\n\t\t\tcode: env.code,\n\t\t\tgrammar: env.grammar,\n\t\t}).then(insertHighlightedCode, prism.config.errorHandler);\n\t}\n\telse {\n\t\tinsertHighlightedCode(prism.highlight(env.code, env.language, { grammar: env.grammar }));\n\t}\n}\n\n/**\n * @import { Prism } from './prism.js';\n * @import { HookEnv, Grammar } from '../types.d.ts';\n */\n\n/**\n * @typedef {object} HighlightElementOptions\n * @property {AsyncHighlighter} [async]\n * @property {HighlightElementOptionsCallback} [callback]\n */\n\n/**\n * An optional callback to be invoked after the highlighting is done.\n * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously.\n *\n * @callback HighlightElementOptionsCallback\n * @param {Element} element The element successfully highlighted.\n * @returns {void}\n */\n\n/**\n * @typedef {object} AsyncHighlightingData\n * @property {string} language\n * @property {string} code\n * @property {Grammar} grammar\n */\n\n/**\n * @callback AsyncHighlighter\n * @param {AsyncHighlightingData} data\n * @returns {Promise<string>}\n */\n"
  },
  {
    "path": "src/core/highlight.js",
    "content": "import singleton from './prism.js';\nimport stringify from './stringify.js';\n\n/**\n * Low-level function, only use if you know what you're doing. It accepts a string of text as input\n * and the language definitions to use, and returns a string with the HTML produced.\n *\n * The following hooks will be run:\n * 1. `before-tokenize`\n * 2. `after-tokenize`\n * 3. `wrap`: On each {@link Token}.\n *\n * @this {Prism}\n * @param {string} text A string with the code to be highlighted.\n * @param {string} language The name of the language definition passed to `grammar`.\n * @param {HighlightOptions} [options] An object containing the tokens to use.\n *\n * Usually a language definition like `Prism.languages.markup`.\n * @returns {string} The highlighted HTML.\n * @example\n * Prism.highlight('var foo = true;', 'javascript');\n */\nexport function highlight (text, language, options) {\n\tconst prism = this ?? singleton;\n\n\tconst grammar =\n\t\toptions?.grammar ?? prism.languageRegistry.getLanguage(language)?.resolvedGrammar;\n\n\t/** @type {HookEnv} */\n\tconst env = {\n\t\tcode: text,\n\t\tgrammar,\n\t\tlanguage,\n\t};\n\tprism.hooks.run('before-tokenize', env);\n\tif (!env.grammar) {\n\t\tthrow new Error('The language \"' + env.language + '\" has no grammar.');\n\t}\n\n\tenv.tokens = prism.tokenize(env.code, env.grammar);\n\tprism.hooks.run('after-tokenize', env);\n\n\treturn stringify(env.tokens, env.language, prism.hooks);\n}\n\n/**\n * @import { Prism } from './prism.js';\n * @import { HookEnv, Grammar } from '../types.d.ts';\n */\n\n/**\n * @typedef {object} HighlightOptions\n * @property {Grammar} [grammar]\n */\n"
  },
  {
    "path": "src/core/linked-list.js",
    "content": "/**\n * @template T\n */\nexport class LinkedList {\n\t/**\n\t * @template T\n\t * @type {LinkedListHeadNode<T>}\n\t */\n\thead;\n\n\t/**\n\t * @template T\n\t * @type {LinkedListTailNode<T>}\n\t */\n\ttail;\n\n\t/** @type {number} */\n\tlength;\n\n\tconstructor () {\n\t\t/**\n\t\t * @type {LinkedListHeadNode<T>}\n\t\t */\n\t\tconst head = { value: null, prev: null, next: /** @type {any} */ (null) };\n\n\t\t/**\n\t\t * @type {LinkedListTailNode<T>}\n\t\t */\n\t\tconst tail = { value: null, prev: head, next: null };\n\t\thead.next = tail;\n\n\t\tthis.head = head;\n\t\tthis.tail = tail;\n\t\tthis.length = 0;\n\t}\n\n\t/**\n\t * Adds a new node with the given value to the list.\n\t *\n\t * @param {LinkedListHeadNode<T> | LinkedListMiddleNode<T>} node\n\t * @param {T} value\n\t * @returns {LinkedListMiddleNode<T>}\n\t */\n\taddAfter (node, value) {\n\t\t// assumes that node != list.tail && values.length >= 0\n\t\tconst next = node.next;\n\n\t\t/** @type {LinkedListMiddleNode<T>} */\n\t\tconst newNode = { value, prev: node, next };\n\t\tnode.next = newNode;\n\t\tnext.prev = newNode;\n\t\tthis.length++;\n\n\t\treturn newNode;\n\t}\n\n\t/**\n\t * Removes `count` nodes after the given node. The given node will not be removed.\n\t *\n\t * @param {LinkedListHeadNode<T> | LinkedListMiddleNode<T>} node\n\t * @param {number} count\n\t */\n\tremoveRange (node, count) {\n\t\tlet next = node.next;\n\t\tlet i = 0;\n\t\tfor (; i < count && next.next !== null; i++) {\n\t\t\tnext = next.next;\n\t\t}\n\t\tnode.next = next;\n\t\tnext.prev = node;\n\t\tthis.length -= i;\n\t}\n\n\t/**\n\t * @returns {T[]}\n\t */\n\ttoArray () {\n\t\tconst array = [];\n\t\tlet node = this.head.next;\n\t\twhile (node.next !== null) {\n\t\t\tarray.push(node.value);\n\t\t\tnode = node.next;\n\t\t}\n\t\treturn array;\n\t}\n}\n\n/**\n * @template T\n * @typedef {object} LinkedListHeadNode\n * @property {null} value\n * @property {null} prev\n * @property {LinkedListMiddleNode<T> | LinkedListTailNode<T>} next\n */\n/**\n * @template T\n * @typedef {object} LinkedListMiddleNode\n * @property {T} value\n * @property {LinkedListMiddleNode<T> | LinkedListHeadNode<T>} prev\n * @property {LinkedListMiddleNode<T> | LinkedListTailNode<T>} next\n */\n\n/**\n * @template T\n * @typedef {object} LinkedListTailNode\n * @property {null} value\n * @property {LinkedListMiddleNode<T> | LinkedListHeadNode<T>} prev\n * @property {null} next\n */\n"
  },
  {
    "path": "src/core/prism.js",
    "content": "/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n *\n * @license MIT <https://opensource.org/licenses/MIT>\n * @author Lea Verou <https://lea.verou.me> and contributors <https://github.com/PrismJS/prism/graphs/contributors>\n */\nimport Prism from './classes/prism.js';\n\n/**\n * Prism singleton.\n * This will always be available, and will automatically read config options.\n * This instance of Prism is unique. Even if this module is imported from\n * different sources, the same Prism instance will be returned.\n * In global builds, it will also be the Prism global variable.\n * Any imported plugins and languages will automatically be added to this instance.\n */\nconst prism = new Prism();\nexport default prism;\n\n/** See {@link Prism} */\nexport { Prism };\n"
  },
  {
    "path": "src/core/registry.js",
    "content": "import { kebabToCamelCase } from '../shared/util.js';\nimport { extend } from '../util/extend.js';\nimport { grammarPatch } from '../util/grammar-patch.js';\nimport { forEach, toArray } from '../util/iterables.js';\nimport { deepClone, defineLazyProperty } from '../util/objects.js';\n\n/**\n * TODO: docs\n */\nexport class Registry {\n\t/**\n\t * A private map from the aliases of components to the id of the component with that alias.\n\t *\n\t * @type {Map<string, string>}\n\t */\n\taliasMap = new Map();\n\n\t/**\n\t * A private map from the aliases of components to the id of the component with that alias.\n\t *\n\t * @type {Map<string, Entry>}\n\t */\n\tentries = new Map();\n\n\t/**\n\t * A private reference to the Prism instance.\n\t *\n\t * @type {Prism}\n\t */\n\tPrism;\n\n\t/**\n\t * @param {Prism} Prism\n\t */\n\tconstructor (Prism) {\n\t\tthis.Prism = Prism;\n\t}\n\n\t/**\n\t * If the given name is a known alias, then the id of the component of the alias will be returned. Otherwise, the\n\t * `name` will be returned as is.\n\t *\n\t * @param {string} name\n\t * @returns {string}\n\t */\n\tresolveAlias (name) {\n\t\treturn this.aliasMap.get(name) ?? name;\n\t}\n\n\t/**\n\t * Returns whether this registry has a component with the given name or alias.\n\t *\n\t * @param {string} name\n\t * @returns {boolean}\n\t */\n\thas (name) {\n\t\treturn this.entries.has(this.resolveAlias(name));\n\t}\n\n\t/**\n\t * @param {...ComponentProto} components\n\t */\n\tadd (...components) {\n\t\t/** @type {Set<string>} */\n\t\tconst added = new Set();\n\n\t\t/**\n\t\t * @param {ComponentProto} proto\n\t\t */\n\t\tconst register = proto => {\n\t\t\tconst { id } = proto;\n\t\t\tif (this.entries.has(id)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.entries.set(id, { proto });\n\t\t\tadded.add(id);\n\n\t\t\t// add aliases\n\t\t\t// @ts-ignore - alias is always there\n\t\t\tforEach(proto.alias, alias => this.aliasMap.set(alias, id));\n\n\t\t\t// @ts-ignore\n\t\t\tconst required = [...toArray(proto.require)]; // don't mutate the original array\n\n\t\t\t// @ts-ignore\n\t\t\tif (proto.base) {\n\t\t\t\t// @ts-ignore\n\t\t\t\trequired.unshift(proto.base);\n\t\t\t}\n\n\t\t\t// dependencies\n\t\t\t// @ts-ignore\n\t\t\tforEach(required, register);\n\n\t\t\t// add plugin namespace\n\t\t\tif (proto.plugin) {\n\t\t\t\tthis.Prism.plugins[kebabToCamelCase(id)] = proto.plugin(this.Prism);\n\t\t\t}\n\t\t};\n\t\tcomponents.forEach(register);\n\n\t\tthis.update(added);\n\t}\n\n\t/**\n\t * Private method to update the registry.\n\t *\n\t * @param {Set<string>} changed\n\t */\n\tupdate (changed) {\n\t\t/** @type {Map<string, boolean>} */\n\t\tconst updateCache = new Map();\n\n\t\t/** @type {string[]} */\n\t\tconst idStack = [];\n\n\t\t/**\n\t\t * @param {string} id\n\t\t * @returns {boolean}\n\t\t */\n\t\tconst performUpdateUncached = id => {\n\t\t\t// check for circular dependencies\n\t\t\tconst circularStart = idStack.indexOf(id);\n\t\t\tif (circularStart !== idStack.length - 1) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Circular dependency ${idStack.slice(circularStart).join(' -> ')} not allowed`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// check whether the component is registered\n\t\t\tconst entry = this.entries.get(id);\n\t\t\tif (!entry) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// check whether any dependencies updated\n\t\t\tif (!shouldRunEffects(entry.proto)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// reset\n\t\t\tentry.evaluatedGrammar = undefined;\n\t\t\tentry.evaluatedEffect?.();\n\n\t\t\t// redo effects\n\t\t\tentry.evaluatedEffect = entry.proto.effect?.(this.Prism);\n\n\t\t\treturn true;\n\t\t};\n\n\t\t/**\n\t\t * @param {string} id\n\t\t * @returns {boolean}\n\t\t */\n\t\tconst performUpdate = id => {\n\t\t\tlet status = updateCache.get(id);\n\t\t\tif (status === undefined) {\n\t\t\t\tidStack.push(id);\n\t\t\t\tstatus = performUpdateUncached(id);\n\t\t\t\tidStack.pop();\n\t\t\t\tupdateCache.set(id, status);\n\t\t\t}\n\t\t\treturn status;\n\t\t};\n\n\t\t/**\n\t\t * @param {ComponentProto} proto\n\t\t * @returns {boolean}\n\t\t */\n\t\tconst shouldRunEffects = proto => {\n\t\t\tlet depsChanged = false;\n\n\t\t\tforEach(/** @type {any}*/ (proto.require), ({ id }) => {\n\t\t\t\tif (performUpdate(id)) {\n\t\t\t\t\tdepsChanged = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tforEach(/** @type {any}*/ (proto.optional), id => {\n\t\t\t\tif (performUpdate(this.resolveAlias(id))) {\n\t\t\t\t\tdepsChanged = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn depsChanged || changed.has(proto.id);\n\t\t};\n\n\t\tthis.entries.forEach((_, id) => performUpdate(id));\n\t}\n\n\t/**\n\t * @param {string} id\n\t * @returns {Grammar | undefined}\n\t */\n\tgetLanguage (id) {\n\t\tid = this.resolveAlias(id);\n\n\t\tconst entry = this.entries.get(id);\n\t\tconst grammar = entry?.proto.grammar;\n\t\tif (!grammar) {\n\t\t\t// we do not have the given component registered or the component doesn't define a grammar\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (entry.evaluatedGrammar) {\n\t\t\t// use the cached grammar\n\t\t\treturn entry.evaluatedGrammar;\n\t\t}\n\n\t\t/**\n\t\t * @param {string} id\n\t\t * @returns {Grammar}\n\t\t */\n\t\tconst required = id => {\n\t\t\tconst grammar = this.getLanguage(id);\n\t\t\tif (!grammar) {\n\t\t\t\tthrow new Error(`The language ${id} was not found.`);\n\t\t\t}\n\t\t\treturn grammar;\n\t\t};\n\n\t\tconst base = entry?.proto.base;\n\t\t// We need this so that any code modifying the base grammar doesn't affect other instances\n\t\tconst baseGrammar = base && deepClone(required(base.id));\n\n\t\tconst requiredLanguages = toArray(\n\t\t\t/** @type {LanguageProto | LanguageProto[] | undefined} */ (entry?.proto.require)\n\t\t);\n\t\tconst languages = /** @type {Record<string, Grammar>} */ ({});\n\t\tfor (const lang of requiredLanguages) {\n\t\t\tdefineLazyProperty(languages, lang.id, () => required(lang.id));\n\t\t}\n\n\t\t/** @type {Grammar} */\n\t\tlet evaluatedGrammar;\n\t\tif (typeof grammar === 'object') {\n\t\t\t// if the grammar is an object, we can use it directly\n\t\t\tevaluatedGrammar = grammar;\n\t\t}\n\t\telse {\n\t\t\tconst options = {\n\t\t\t\tgetOptionalLanguage: id => this.getLanguage(id),\n\t\t\t\textend: (id, ref) => extend(required(id), ref),\n\t\t\t\t...(baseGrammar && { base: baseGrammar }),\n\t\t\t\t...(requiredLanguages.length && { languages }),\n\t\t\t};\n\n\t\t\tevaluatedGrammar = grammar(/** @type {any} */ (options));\n\t\t}\n\n\t\tif (baseGrammar) {\n\t\t\tevaluatedGrammar = extend(baseGrammar, evaluatedGrammar);\n\t\t}\n\n\t\treturn (entry.evaluatedGrammar = grammarPatch(evaluatedGrammar));\n\t}\n}\n\n/**\n * @typedef {object} Entry\n * @property {ComponentProto} proto\n * @property {Grammar} [evaluatedGrammar]\n * @property {function(): void} [evaluatedEffect]\n */\n\n/**\n * @typedef {import('../types.d.ts').ComponentProto} ComponentProto\n * @typedef {import('../types.d.ts').LanguageProto} LanguageProto\n * @typedef {import('../types.d.ts').Grammar} Grammar\n * @typedef {import('./prism.js').Prism} Prism\n */\n"
  },
  {
    "path": "src/core/stringify.js",
    "content": "import { htmlEncode } from '../shared/util.js';\n\n/**\n * Converts the given token or token stream to an HTML representation.\n *\n * The following hooks will be run:\n * 1. `wrap`: On each {@link Token}.\n *\n * @param {string | Token | TokenStream} o The token or token stream to be converted.\n * @param {string} language The name of current language.\n * @param {Hooks} hooks\n * @returns {string} The HTML representation of the token or token stream.\n */\nfunction stringify (o, language, hooks) {\n\tif (typeof o === 'string') {\n\t\treturn htmlEncode(o);\n\t}\n\tif (Array.isArray(o)) {\n\t\tlet s = '';\n\t\to.forEach(e => {\n\t\t\ts += stringify(e, language, hooks);\n\t\t});\n\t\treturn s;\n\t}\n\n\t/** @type {HookEnv} */\n\tconst env = {\n\t\ttype: o.type,\n\t\tcontent: stringify(o.content, language, hooks),\n\t\ttag: 'span',\n\t\tclasses: ['token', o.type],\n\t\tattributes: {},\n\t\tlanguage,\n\t};\n\n\tconst aliases = o.alias;\n\tif (aliases) {\n\t\tif (Array.isArray(aliases)) {\n\t\t\tenv.classes.push(...aliases);\n\t\t}\n\t\telse {\n\t\t\tenv.classes.push(aliases);\n\t\t}\n\t}\n\n\thooks.run('wrap', env);\n\n\tlet attributes = '';\n\tfor (const name in env.attributes) {\n\t\tattributes +=\n\t\t\t' ' + name + '=\"' + (env.attributes[name] || '').replace(/\"/g, '&quot;') + '\"';\n\t}\n\n\treturn (\n\t\t'<' +\n\t\tenv.tag +\n\t\t' class=\"' +\n\t\tenv.classes.join(' ') +\n\t\t'\"' +\n\t\tattributes +\n\t\t'>' +\n\t\tenv.content +\n\t\t'</' +\n\t\tenv.tag +\n\t\t'>'\n\t);\n}\n\nexport { stringify };\nexport default stringify;\n\n/**\n * @typedef {import('../types.d.ts').HookEnv} HookEnv\n * @typedef {import('./classes/hooks.js').Hooks} Hooks\n * @typedef {import('./classes/token.js').Token} Token\n * @typedef {import('../types.d.ts').TokenStream} TokenStream\n */\n"
  },
  {
    "path": "src/core/tokenize/match.js",
    "content": "import { Token } from '../classes/token.js';\nimport singleton from '../prism.js';\nimport { tokenize } from './tokenize.js';\nimport { resolve } from './util.js';\n\n/**\n * @this {Prism}\n * @param {string} text\n * @param {LinkedList<string | Token>} tokenList\n * @param {GrammarTokens} grammar\n * @param {LinkedListHeadNode<string | Token> | LinkedListMiddleNode<string | Token>} startNode\n * @param {number} startPos\n * @param {RematchOptions} [rematch]\n * @returns {void}\n */\nexport function _matchGrammar (text, tokenList, grammar, startNode, startPos, rematch) {\n\tconst prism = this ?? singleton;\n\n\t// @ts-ignore\n\tgrammar = resolve.call(prism, grammar);\n\n\tfor (const token in grammar) {\n\t\tconst tokenValue = grammar[token];\n\t\tif (!grammar.hasOwnProperty(token) || token.startsWith('$') || !tokenValue) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst patterns = Array.isArray(tokenValue) ? tokenValue : [tokenValue];\n\n\t\tfor (let j = 0; j < patterns.length; ++j) {\n\t\t\tif (rematch && rematch.cause === `${token},${j}`) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst patternObj = toGrammarToken(patterns[j]);\n\t\t\tlet { pattern, lookbehind = false, greedy = false, alias, inside } = patternObj;\n\t\t\tconst insideGrammar = resolve.call(prism, inside);\n\n\t\t\tif (greedy && !pattern.global) {\n\t\t\t\t// Without the global flag, lastIndex won't work\n\t\t\t\tpatternObj.pattern = pattern = RegExp(pattern.source, pattern.flags + 'g');\n\t\t\t}\n\n\t\t\tfor (\n\t\t\t\t// iterate the token list and keep track of the current token/string position\n\t\t\t\tlet currentNode = startNode.next, pos = startPos;\n\t\t\t\tcurrentNode.next !== null;\n\t\t\t\tpos += currentNode.value.length, currentNode = currentNode.next\n\t\t\t) {\n\t\t\t\tif (rematch && pos >= rematch.reach) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tlet str = currentNode.value;\n\n\t\t\t\tif (tokenList.length > text.length) {\n\t\t\t\t\t// Something went terribly wrong, ABORT, ABORT!\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (str instanceof Token) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet removeCount = 1; // this is the to parameter of removeBetween\n\t\t\t\tlet match;\n\n\t\t\t\tif (greedy) {\n\t\t\t\t\tmatch = matchPattern(pattern, pos, text, lookbehind);\n\t\t\t\t\tif (!match || match.index >= text.length) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst from = match.index;\n\t\t\t\t\tconst to = match.index + match[0].length;\n\t\t\t\t\tlet p = pos;\n\n\t\t\t\t\t// find the node that contains the match\n\t\t\t\t\tp += currentNode.value.length;\n\t\t\t\t\twhile (from >= p) {\n\t\t\t\t\t\tcurrentNode = currentNode.next;\n\t\t\t\t\t\tif (currentNode.next === null) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t'The linked list and the actual text have become de-synced'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tp += currentNode.value.length;\n\t\t\t\t\t}\n\t\t\t\t\t// adjust pos (and p)\n\t\t\t\t\tp -= currentNode.value.length;\n\t\t\t\t\tpos = p;\n\n\t\t\t\t\t// the current node is a Token, then the match starts inside another Token, which is invalid\n\t\t\t\t\tif (currentNode.value instanceof Token) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// find the last node which is affected by this match\n\t\t\t\t\t/** @type {LinkedListMiddleNode<string | Token> | LinkedListTailNode<string | Token>} */\n\t\t\t\t\tlet k = currentNode;\n\t\t\t\t\tfor (; k.next !== null && (p < to || typeof k.value === 'string'); k = k.next) {\n\t\t\t\t\t\tremoveCount++;\n\t\t\t\t\t\tp += k.value.length;\n\t\t\t\t\t}\n\t\t\t\t\tremoveCount--;\n\n\t\t\t\t\t// replace with the new match\n\t\t\t\t\tstr = text.slice(pos, p);\n\t\t\t\t\tmatch.index -= pos;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tmatch = matchPattern(pattern, 0, str, lookbehind);\n\t\t\t\t\tif (!match) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst from = match.index;\n\t\t\t\tconst matchStr = match[0];\n\t\t\t\tconst before = str.slice(0, from);\n\t\t\t\tconst after = str.slice(from + matchStr.length);\n\n\t\t\t\tconst reach = pos + str.length;\n\t\t\t\tif (rematch && reach > rematch.reach) {\n\t\t\t\t\trematch.reach = reach;\n\t\t\t\t}\n\n\t\t\t\tlet removeFrom = currentNode.prev;\n\n\t\t\t\tif (before) {\n\t\t\t\t\tremoveFrom = tokenList.addAfter(removeFrom, before);\n\t\t\t\t\tpos += before.length;\n\t\t\t\t}\n\n\t\t\t\ttokenList.removeRange(removeFrom, removeCount);\n\n\t\t\t\tconst wrapped = new Token(\n\t\t\t\t\ttoken,\n\t\t\t\t\tinsideGrammar\n\t\t\t\t\t\t? tokenize.call(prism, matchStr, /** @type {Grammar} */ (insideGrammar))\n\t\t\t\t\t\t: matchStr,\n\t\t\t\t\talias,\n\t\t\t\t\tmatchStr\n\t\t\t\t);\n\t\t\t\tcurrentNode = tokenList.addAfter(removeFrom, wrapped);\n\n\t\t\t\tif (after) {\n\t\t\t\t\ttokenList.addAfter(currentNode, after);\n\t\t\t\t}\n\n\t\t\t\tif (removeCount > 1) {\n\t\t\t\t\t// at least one Token object was removed, so we have to do some rematching\n\t\t\t\t\t// this can only happen if the current pattern is greedy\n\n\t\t\t\t\t/** @type {RematchOptions} */\n\t\t\t\t\tconst nestedRematch = {\n\t\t\t\t\t\tcause: `${token},${j}`,\n\t\t\t\t\t\treach,\n\t\t\t\t\t};\n\t\t\t\t\t_matchGrammar.call(\n\t\t\t\t\t\tprism,\n\t\t\t\t\t\ttext,\n\t\t\t\t\t\ttokenList,\n\t\t\t\t\t\tgrammar,\n\t\t\t\t\t\tcurrentNode.prev,\n\t\t\t\t\t\tpos,\n\t\t\t\t\t\tnestedRematch\n\t\t\t\t\t);\n\n\t\t\t\t\t// the reach might have been extended because of the rematching\n\t\t\t\t\tif (rematch && nestedRematch.reach > rematch.reach) {\n\t\t\t\t\t\trematch.reach = nestedRematch.reach;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * @param {RegExp} pattern\n * @param {number} pos\n * @param {string} text\n * @param {boolean} lookbehind\n */\nfunction matchPattern (pattern, pos, text, lookbehind) {\n\tpattern.lastIndex = pos;\n\tconst match = pattern.exec(text);\n\tif (match && lookbehind && match[1]) {\n\t\t// change the match to remove the text matched by the Prism lookbehind group\n\t\tconst lookbehindLength = match[1].length;\n\t\tmatch.index += lookbehindLength;\n\t\tmatch[0] = match[0].slice(lookbehindLength);\n\t}\n\treturn match;\n}\n\n/**\n * @param {GrammarToken | RegExpLike} pattern\n * @returns {GrammarToken}\n */\nfunction toGrammarToken (pattern) {\n\tif (!pattern.pattern) {\n\t\treturn { pattern };\n\t}\n\telse {\n\t\treturn pattern;\n\t}\n}\n\n/**\n * @typedef {object} RematchOptions\n * @property {string} cause\n * @property {number} reach\n */\n\n/**\n * @import { Prism } from '../prism.js';\n * @import { Grammar, GrammarToken, GrammarTokens, RegExpLike } from '../../types.d.ts';\n */\n\n/**\n * @template T\n * @typedef {import('../../core/linked-list.js').LinkedList<T>} LinkedList\n */\n\n/**\n * @template T\n * @typedef {import('../../core/linked-list.js').LinkedListHeadNode<T>} LinkedListHeadNode\n */\n\n/**\n * @template T\n * @typedef {import('../../core/linked-list.js').LinkedListMiddleNode<T>} LinkedListMiddleNode\n */\n\n/**\n * @template T\n * @typedef {import('../../core/linked-list.js').LinkedListTailNode<T>} LinkedListTailNode\n */\n"
  },
  {
    "path": "src/core/tokenize/tokenize.js",
    "content": "import { LinkedList } from '../linked-list.js';\nimport singleton from '../prism.js';\nimport { _matchGrammar } from './match.js';\n\n/**\n * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input\n * and the language definitions to use, and returns an array with the tokenized code.\n *\n * When the language definition includes nested tokens, the function is called recursively on each of these tokens.\n *\n * This method could be useful in other contexts as well, as a very crude parser.\n *\n * @this {Prism}\n * @param {string} text A string with the code to be highlighted.\n * @param {Grammar} grammar An object containing the tokens to use.\n *\n * Usually a language definition like `Prism.languages.markup`.\n * @returns {TokenStream} An array of strings and tokens, a token stream.\n * @example\n * let code = `var foo = 0;`;\n * let tokens = Prism.tokenize(code, Prism.getLanguage('javascript'));\n * tokens.forEach(token => {\n *     if (token instanceof Token && token.type === 'number') {\n *         console.log(`Found numeric literal: ${token.content}`);\n *     }\n * });\n */\nexport function tokenize (text, grammar) {\n\tconst prism = this ?? singleton;\n\tconst customTokenize = grammar.$tokenize;\n\tif (customTokenize) {\n\t\treturn customTokenize(text, grammar, prism);\n\t}\n\n\tconst tokenList = new LinkedList();\n\ttokenList.addAfter(tokenList.head, text);\n\n\t_matchGrammar.call(\n\t\tprism,\n\t\ttext,\n\t\ttokenList,\n\t\t/** @type {GrammarTokens} */ (grammar),\n\t\ttokenList.head,\n\t\t0\n\t);\n\n\treturn tokenList.toArray();\n}\n\n/**\n * @import { TokenStream, Grammar, GrammarTokens } from '../../types.d.ts';\n * @import { Prism } from '../prism.js';\n */\n"
  },
  {
    "path": "src/core/tokenize/util.js",
    "content": "import singleton from '../prism.js';\n\n/**\n * @this {Prism}\n * @param {Grammar | string | null | undefined} reference\n * @returns {Grammar | undefined}\n */\nexport function resolve (reference) {\n\tconst prism = this ?? singleton;\n\tlet ret = reference ?? undefined;\n\n\tif (typeof ret === 'string') {\n\t\tret = prism.languageRegistry.getLanguage(ret)?.resolvedGrammar;\n\t}\n\n\tif (typeof ret === 'object' && ret.$rest) {\n\t\tconst restGrammar = resolve.call(prism, ret.$rest) ?? {};\n\t\tif (typeof restGrammar === 'object') {\n\t\t\tret = { ...ret, ...restGrammar };\n\t\t}\n\n\t\tdelete ret.$rest;\n\t}\n\n\treturn /** @type {Grammar | undefined} */ (ret);\n}\n\n/**\n * @import { Prism } from '../prism.js';\n * @import { Grammar, LanguageRegistry } from '../../types.d.ts';\n */\n"
  },
  {
    "path": "src/core.js",
    "content": "export { Prism } from './core/prism.js';\nexport { Token } from './core/classes/token.js';\n"
  },
  {
    "path": "src/global.js",
    "content": "import globalPrism from './core/prism.js';\n\n/**\n * The global {@link Prism} instance.\n *\n * This instance of Prism is unique. Even if this module is imported from\n * different sources, the same Prism instance will be returned.\n */\nexport default globalPrism;\n"
  },
  {
    "path": "src/index.js",
    "content": "// Auto Start runs on Global Prism and the re-exports it.\nimport globalPrism from './auto-start.js';\n\nexport * from './core.js';\nexport { loadLanguages } from './load-languages.js';\nexport default globalPrism;\n"
  },
  {
    "path": "src/languages/abap.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'abap'>} */\nexport default {\n\tid: 'abap',\n\tgrammar: {\n\t\t'comment': /^\\*.*/m,\n\t\t'string': /(`|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t'string-template': {\n\t\t\tpattern: /([|}])(?:\\\\.|[^\\\\|{\\r\\n])*(?=[|{])/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'string',\n\t\t},\n\t\t/* End Of Line comments should not interfere with strings when the\n\t\tquote character occurs within them. We assume a string being highlighted\n\t\tinside an EOL comment is more acceptable than the opposite.\n\t\t*/\n\t\t'eol-comment': {\n\t\t\tpattern: /(^|\\s)\".*/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'comment',\n\t\t},\n\t\t'keyword': {\n\t\t\tpattern:\n\t\t\t\t/(\\s|\\.|^)(?:\\*-INPUT|\\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\\/MM\\/YY|DD\\/MM\\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\\/DD\\/YY|MM\\/DD\\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\\w-])/i,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t/* Numbers can be only integers. Decimal or Hex appear only as strings */\n\t\t'number': /\\b\\d+\\b/,\n\t\t/* Operators must always be surrounded by whitespace, they cannot be put\n\t\tadjacent to operands.\n\t\t*/\n\t\t'operator': {\n\t\t\tpattern: /(\\s)(?:\\*\\*?|<[=>]?|>=?|\\?=|[-+\\/=])(?=\\s)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'string-operator': {\n\t\t\tpattern: /(\\s)&&?(?=\\s)/,\n\t\t\tlookbehind: true,\n\t\t\t/* The official editor highlights */\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'token-operator': [\n\t\t\t{\n\t\t\t\t/* Special operators used to access structure components, class methods/attributes, etc. */\n\t\t\t\tpattern: /(\\w)(?:->?|=>|[~|{}])(?=\\w)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t{\n\t\t\t\t/* Special tokens used do delimit string templates */\n\t\t\t\tpattern: /[|{}]/,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t],\n\t\t'punctuation': /[,.:()]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/abnf.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'abnf'>} */\nexport default {\n\tid: 'abnf',\n\tgrammar () {\n\t\tconst coreRules =\n\t\t\t'(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)';\n\n\t\treturn {\n\t\t\t'comment': /;.*/,\n\t\t\t'string': {\n\t\t\t\tpattern: /(?:%[is])?\"[^\"\\n\\r]*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^%[is]/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'range': {\n\t\t\t\tpattern: /%(?:b[01]+-[01]+|d\\d+-\\d+|x[A-F\\d]+-[A-F\\d]+)/i,\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t\t'terminal': {\n\t\t\t\tpattern: /%(?:b[01]+(?:\\.[01]+)*|d\\d+(?:\\.\\d+)*|x[A-F\\d]+(?:\\.[A-F\\d]+)*)/i,\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t\t'repetition': {\n\t\t\t\tpattern: /(^|[^\\w-])(?:\\d*\\*\\d*|\\d+)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\t\t\t'definition': {\n\t\t\t\tpattern: /(^[ \\t]*)(?:[a-z][\\w-]*|<[^<>\\r\\n]*>)(?=\\s*=)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'keyword',\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /<|>/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'core-rule': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t'(?:(^|[^<\\\\w-])' + coreRules + '|<' + coreRules + '>)(?![\\\\w-])',\n\t\t\t\t\t'i'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: ['rule', 'constant'],\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /<|>/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'rule': {\n\t\t\t\tpattern: /(^|[^<\\w-])[a-z][\\w-]*|<[^<>\\r\\n]*>/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /<|>/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'operator': /=\\/?|\\//,\n\t\t\t'punctuation': /[()\\[\\]]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/actionscript.js",
    "content": "import javascript from './javascript.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'actionscript'>} */\nexport default {\n\tid: 'actionscript',\n\tbase: javascript,\n\tgrammar () {\n\t\treturn {\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\\b/,\n\t\t\t'operator': /\\+\\+|--|(?:[+\\-*\\/%^]|&&?|\\|\\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/,\n\t\t\t// doesn't work with AS because AS is too complex\n\t\t\t$delete: ['doc-comment', 'parameter', 'literal-property'],\n\t\t\t$merge: {\n\t\t\t\t'class-name': {\n\t\t\t\t\talias: 'function',\n\t\t\t\t},\n\t\t\t},\n\t\t\t$insert: {\n\t\t\t\t'xml': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^.])<\\/?\\w+(?:\\s+[^\\s>\\/=]+=(\"|')(?:\\\\[\\s\\S]|(?!\\2)[^\\\\])*\\2)*\\s*\\/?>/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'markup',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/ada.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'ada'>} */\nexport default {\n\tid: 'ada',\n\tgrammar: {\n\t\t'comment': /--.*/,\n\t\t'string': /\"(?:\"\"|[^\"\\r\\f\\n])*\"/,\n\t\t'number': [\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b\\d(?:_?\\d)*#[\\dA-F](?:_?[\\dA-F])*(?:\\.[\\dA-F](?:_?[\\dA-F])*)?#(?:E[+-]?\\d(?:_?\\d)*)?/i,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /\\b\\d(?:_?\\d)*(?:\\.\\d(?:_?\\d)*)?(?:E[+-]?\\d(?:_?\\d)*)?\\b/i,\n\t\t\t},\n\t\t],\n\t\t'attribute': {\n\t\t\tpattern: /\\b'\\w+/,\n\t\t\talias: 'attr-name',\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\\b/i,\n\t\t'boolean': /\\b(?:false|true)\\b/i,\n\t\t'operator': /<[=>]?|>=?|=>?|:=|\\/=?|\\*\\*?|[&+-]/,\n\t\t'punctuation': /\\.\\.?|[,;():]/,\n\t\t'char': /'.'/,\n\t\t'variable': /\\b[a-z](?:\\w)*\\b/i,\n\t},\n};\n"
  },
  {
    "path": "src/languages/agda.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'agda'>} */\nexport default {\n\tid: 'agda',\n\tgrammar: {\n\t\t'comment': /\\{-[\\s\\S]*?(?:-\\}|$)|--.*/,\n\t\t'string': {\n\t\t\tpattern: /\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\\\\\\r\\n\"])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'punctuation': /[(){}⦃⦄.;@]/,\n\t\t'class-name': {\n\t\t\tpattern: /((?:data|record) +)\\S+/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'function': {\n\t\t\tpattern: /(^[ \\t]*)(?!\\s)[^:\\r\\n]+(?=:)/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'operator': {\n\t\t\tpattern: /(^\\s*|\\s)(?:[=|:∀→λ\\\\?_]|->)(?=\\s)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\\b/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/al.js",
    "content": "// based on https://github.com/microsoft/AL/blob/master/grammar/alsyntax.tmlanguage\n\n/** @type {import('../types.d.ts').LanguageProto<'al'>} */\nexport default {\n\tid: 'al',\n\tgrammar: {\n\t\t'comment': /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t'string': {\n\t\t\tpattern: /'(?:''|[^'\\r\\n])*'(?!')|\"(?:\"\"|[^\"\\r\\n])*\"(?!\")/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'function': {\n\t\t\tpattern: /(\\b(?:event|procedure|trigger)\\s+|(?:^|[^.])\\.\\s*)[a-z_]\\w*(?=\\s*\\()/i,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'keyword': [\n\t\t\t// keywords\n\t\t\t/\\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\\b/i,\n\t\t\t// objects and metadata that are used like keywords\n\t\t\t/\\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\\b/i,\n\t\t],\n\t\t'number': /\\b(?:0x[\\da-f]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?)(?:F|LL?|U(?:LL?)?)?\\b/i,\n\t\t'boolean': /\\b(?:false|true)\\b/i,\n\t\t'variable': /\\b(?:Curr(?:FieldNo|Page|Report)|x?Rec|RequestOptionsPage)\\b/,\n\t\t'class-name':\n\t\t\t/\\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\\b/i,\n\t\t'operator': /\\.\\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\\b(?:and|div|mod|not|or|xor)\\b/i,\n\t\t'punctuation': /[()\\[\\]{}:.;,]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/antlr4.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'antlr4'>} */\nexport default {\n\tid: 'antlr4',\n\talias: 'g4',\n\tgrammar: {\n\t\t'comment': /\\/\\/.*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t'string': {\n\t\t\tpattern: /'(?:\\\\.|[^\\\\'\\r\\n])*'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'character-class': {\n\t\t\tpattern: /\\[(?:\\\\.|[^\\\\\\]\\r\\n])*\\]/,\n\t\t\tgreedy: true,\n\t\t\talias: 'regex',\n\t\t\tinside: {\n\t\t\t\t'range': {\n\t\t\t\t\tpattern: /([^[]|(?:^|[^\\\\])(?:\\\\\\\\)*\\\\\\[)-(?!\\])/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t\t'escape': /\\\\(?:u(?:[a-fA-F\\d]{4}|\\{[a-fA-F\\d]+\\})|[pP]\\{[=\\w-]+\\}|[^\\r\\nupP])/,\n\t\t\t\t'punctuation': /[\\[\\]]/,\n\t\t\t},\n\t\t},\n\t\t'action': {\n\t\t\tpattern: /\\{(?:[^{}]|\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})*\\})*\\}/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'content': {\n\t\t\t\t\t// this might be C, C++, Python, Java, C#, or any other language ANTLR4 compiles to\n\t\t\t\t\tpattern: /(\\{)[\\s\\S]+(?=\\})/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t'punctuation': /[{}]/,\n\t\t\t},\n\t\t},\n\t\t'command': {\n\t\t\tpattern: /(->\\s*(?!\\s))(?:\\s*(?:,\\s*)?\\b[a-z]\\w*(?:\\s*\\([^()\\r\\n]*\\))?)+(?=\\s*;)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'function': /\\b\\w+(?=\\s*(?:[,(]|$))/,\n\t\t\t\t'punctuation': /[,()]/,\n\t\t\t},\n\t\t},\n\t\t'annotation': {\n\t\t\tpattern: /@\\w+(?:::\\w+)*/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'label': {\n\t\t\tpattern: /#[ \\t]*\\w+/,\n\t\t\talias: 'punctuation',\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\\b/,\n\t\t'definition': [\n\t\t\t{\n\t\t\t\tpattern: /\\b[a-z]\\w*(?=\\s*:)/,\n\t\t\t\talias: ['rule', 'class-name'],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /\\b[A-Z]\\w*(?=\\s*:)/,\n\t\t\t\talias: ['token', 'constant'],\n\t\t\t},\n\t\t],\n\t\t'constant': /\\b[A-Z][A-Z_]*\\b/,\n\t\t'operator': /\\.\\.|->|[|~]|[*+?]\\??/,\n\t\t'punctuation': /[;:()=]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/apacheconf.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'apacheconf'>} */\nexport default {\n\tid: 'apacheconf',\n\tgrammar: {\n\t\t'comment': /#.*/,\n\t\t'directive-inline': {\n\t\t\tpattern:\n\t\t\t\t/(^[\\t ]*)\\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\\b/im,\n\t\t\tlookbehind: true,\n\t\t\talias: 'property',\n\t\t},\n\t\t'directive-block': {\n\t\t\tpattern:\n\t\t\t\t/<\\/?\\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\\b.*>/i,\n\t\t\tinside: {\n\t\t\t\t'directive-block': {\n\t\t\t\t\tpattern: /^<\\/?\\w+/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /^<\\/?/,\n\t\t\t\t\t},\n\t\t\t\t\talias: 'tag',\n\t\t\t\t},\n\t\t\t\t'directive-block-parameter': {\n\t\t\t\t\tpattern: /.*[^>]/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /:/,\n\t\t\t\t\t\t'string': {\n\t\t\t\t\t\t\tpattern: /(\"|').*\\1/,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'variable': /[$%]\\{?(?:\\w\\.?[-+:]?)+\\}?/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\talias: 'attr-value',\n\t\t\t\t},\n\t\t\t\t'punctuation': />/,\n\t\t\t},\n\t\t\talias: 'tag',\n\t\t},\n\t\t'directive-flags': {\n\t\t\tpattern: /\\[(?:[\\w=],?)+\\]/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /(\"|').*\\1/,\n\t\t\tinside: {\n\t\t\t\t'variable': /[$%]\\{?(?:\\w\\.?[-+:]?)+\\}?/,\n\t\t\t},\n\t\t},\n\t\t'variable': /[$%]\\{?(?:\\w\\.?[-+:]?)+\\}?/,\n\t\t'regex': /\\^?.*\\$|\\^.*\\$?/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/apex.js",
    "content": "import clike from './clike.js';\nimport sql from './sql.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'apex'>} */\nexport default {\n\tid: 'apex',\n\trequire: [clike, sql],\n\tgrammar ({ languages }) {\n\t\tconst keywords =\n\t\t\t/\\b(?:abstract|activate|(?:after|before)(?=\\s+[a-z])|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\\s+sharing)\\b/i;\n\n\t\tconst className =\n\t\t\t/\\b(?:(?=[a-z_]\\w*\\s*[<\\[])|(?!<keyword>))[A-Z_]\\w*(?:\\s*\\.\\s*[A-Z_]\\w*)*\\b(?:\\s*(?:\\[\\s*\\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*/.source.replace(\n\t\t\t\t/<keyword>/g,\n\t\t\t\t() => keywords.source\n\t\t\t);\n\n\t\t/**\n\t\t * @param {string} pattern\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction insertClassName (pattern) {\n\t\t\treturn RegExp(\n\t\t\t\tpattern.replace(/<CLASS-NAME>/g, () => className),\n\t\t\t\t'i'\n\t\t\t);\n\t\t}\n\n\t\tconst classNameInside = {\n\t\t\t'keyword': keywords,\n\t\t\t'punctuation': /[()\\[\\]{};,:.<>]/,\n\t\t};\n\n\t\tconst clike = languages.clike;\n\n\t\treturn {\n\t\t\t'comment': clike.comment,\n\t\t\t'string': clike.string,\n\t\t\t'sql': {\n\t\t\t\tpattern: /((?:[=,({:]|\\breturn)\\s*)\\[[^\\[\\]]*\\]/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'language-sql',\n\t\t\t\tinside: 'sql',\n\t\t\t},\n\n\t\t\t'annotation': {\n\t\t\t\tpattern: /@\\w+\\b/,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\tpattern: insertClassName(\n\t\t\t\t\t\t/(\\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\\s+\\w+\\s+on)\\s+)<CLASS-NAME>/\n\t\t\t\t\t\t\t.source\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: classNameInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// cast\n\t\t\t\t\tpattern: insertClassName(/(\\(\\s*)<CLASS-NAME>(?=\\s*\\)\\s*[\\w(])/.source),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: classNameInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// variable/parameter declaration and return types\n\t\t\t\t\tpattern: insertClassName(/<CLASS-NAME>(?=\\s*\\w+\\s*[;=,(){:])/.source),\n\t\t\t\t\tinside: classNameInside,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'trigger': {\n\t\t\t\tpattern: /(\\btrigger\\s+)\\w+\\b/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'class-name',\n\t\t\t},\n\t\t\t'keyword': keywords,\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\n\t\t\t'boolean': /\\b(?:false|true)\\b/i,\n\n\t\t\t'number': /(?:\\B\\.\\d+|\\b\\d+(?:\\.\\d+|L)?)\\b/i,\n\t\t\t'operator': /[!=](?:==?)?|\\?\\.?|&&|\\|\\||--|\\+\\+|[-+*/^&|]=?|:|<<?=?|>{1,3}=?/,\n\t\t\t'punctuation': /[()\\[\\]{};,.]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/apl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'apl'>} */\nexport default {\n\tid: 'apl',\n\tgrammar: {\n\t\t'comment': /(?:⍝|#[! ]).*$/m,\n\t\t'string': {\n\t\t\tpattern: /'(?:[^'\\r\\n]|'')*'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'number':\n\t\t\t/¯?(?:\\d*\\.?\\b\\d+(?:e[+¯]?\\d+)?|¯|∞)(?:j¯?(?:(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:e[+¯]?\\d+)?|¯|∞))?/i,\n\t\t'statement': /:[A-Z][a-z][A-Za-z]*\\b/,\n\t\t'system-function': {\n\t\t\tpattern: /⎕[A-Z]+/i,\n\t\t\talias: 'function',\n\t\t},\n\t\t'constant': /[⍬⌾#⎕⍞]/,\n\t\t'function': /[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,\n\t\t'monadic-operator': {\n\t\t\tpattern: /[\\\\\\/⌿⍀¨⍨⌶&∥]/,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'dyadic-operator': {\n\t\t\tpattern: /[.⍣⍠⍤∘⌸@⌺⍥]/,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'assignment': {\n\t\t\tpattern: /←/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'punctuation': /[\\[;\\]()◇⋄]/,\n\t\t'dfn': {\n\t\t\tpattern: /[{}⍺⍵⍶⍹∇⍫:]/,\n\t\t\talias: 'builtin',\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/applescript.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'applescript'>} */\nexport default {\n\tid: 'applescript',\n\tgrammar: {\n\t\t'comment': [\n\t\t\t// Allow one level of nesting\n\t\t\t/\\(\\*(?:\\(\\*(?:[^*]|\\*(?!\\)))*\\*\\)|(?!\\(\\*)[\\s\\S])*?\\*\\)/,\n\t\t\t/--.+/,\n\t\t\t/#.+/,\n\t\t],\n\t\t'string': /\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,\n\t\t'number': /(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e-?\\d+)?\\b/i,\n\t\t'operator': [\n\t\t\t/[&=≠≤≥*+\\-\\/÷^]|[<>]=?/,\n\t\t\t/\\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\\b/,\n\t\t],\n\t\t'keyword':\n\t\t\t/\\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\\b/,\n\t\t'class-name':\n\t\t\t/\\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\\b/,\n\t\t'punctuation': /[{}():,¬«»《》]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/aql.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'aql'>} */\nexport default {\n\tid: 'aql',\n\tgrammar: {\n\t\t'comment': /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t'property': {\n\t\t\tpattern: /([{,]\\s*)(?:(?!\\d)\\w+|([\"'´`])(?:(?!\\2)[^\\\\\\r\\n]|\\\\.)*\\2)(?=\\s*:)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /([\"'])(?:(?!\\1)[^\\\\\\r\\n]|\\\\.)*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'identifier': {\n\t\t\tpattern: /([´`])(?:(?!\\1)[^\\\\\\r\\n]|\\\\.)*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'variable': /@@?\\w+/,\n\t\t'keyword': [\n\t\t\t{\n\t\t\t\tpattern: /(\\bWITH\\s+)COUNT(?=\\s+INTO\\b)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t/\\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\\b/i,\n\t\t\t// pseudo keywords get a lookbehind to avoid false positives\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\w.[])(?:KEEP|PRUNE|SEARCH|TO)\\b/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\w.[])(?:CURRENT|NEW|OLD)\\b/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /\\bOPTIONS(?=\\s*\\{)/i,\n\t\t\t},\n\t\t],\n\t\t'function': /\\b(?!\\d)\\w+(?=\\s*\\()/,\n\t\t'boolean': /\\b(?:false|true)\\b/i,\n\t\t'range': {\n\t\t\tpattern: /\\.\\./,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'number': [\n\t\t\t/\\b0b[01]+/i,\n\t\t\t/\\b0x[0-9a-f]+/i,\n\t\t\t/(?:\\B\\.\\d+|\\b(?:0|[1-9]\\d*)(?:\\.\\d+)?)(?:e[+-]?\\d+)?/i,\n\t\t],\n\t\t'operator': /\\*{2,}|[=!]~|[!=<>]=?|&&|\\|\\||[-+*/%]/,\n\t\t'punctuation': /::|[?.:,;()[\\]{}]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/arduino.js",
    "content": "import cpp from './cpp.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'arduino'>} */\nexport default {\n\tid: 'arduino',\n\tbase: cpp,\n\talias: 'ino',\n\tgrammar () {\n\t\treturn {\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\\b/,\n\t\t\t'constant':\n\t\t\t\t/\\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\\b/,\n\t\t\t'builtin':\n\t\t\t\t/\\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\\b/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/arff.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'arff'>} */\nexport default {\n\tid: 'arff',\n\tgrammar: {\n\t\t'comment': /%.*/,\n\t\t'string': {\n\t\t\tpattern: /([\"'])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword': /@(?:attribute|data|end|relation)\\b/i,\n\t\t'number': /\\b\\d+(?:\\.\\d+)?\\b/,\n\t\t'punctuation': /[{},]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/armasm.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'armasm'>} */\nexport default {\n\tid: 'armasm',\n\talias: 'arm-asm',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /;.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"\\r\\n]|\"\")*\"/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'variable': {\n\t\t\t\t\tpattern: /((?:^|[^$])(?:\\${2})*)\\$\\w+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'char': {\n\t\t\tpattern: /'(?:[^'\\r\\n]{0,4}|'')'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'version-symbol': {\n\t\t\tpattern: /\\|[\\w@]+\\|/,\n\t\t\tgreedy: true,\n\t\t\talias: 'property',\n\t\t},\n\n\t\t'boolean': /\\b(?:FALSE|TRUE)\\b/,\n\t\t'directive': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\\b/,\n\t\t\talias: 'property',\n\t\t},\n\t\t'instruction': {\n\t\t\tpattern:\n\t\t\t\t/((?:^|(?:^|[^\\\\])(?:\\r\\n?|\\n))[ \\t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\\w*|[a-z]\\w*|\\d+)[ \\t]+)?)\\b[A-Z.]+\\b/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'variable': /\\$\\w+/,\n\n\t\t'number':\n\t\t\t/(?:\\b[2-9]_\\d+|(?:\\b\\d+(?:\\.\\d+)?|\\B\\.\\d+)(?:e-?\\d+)?|\\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\\b/i,\n\n\t\t'register': {\n\t\t\tpattern: /\\b(?:r\\d|lr)\\b/,\n\t\t\talias: 'symbol',\n\t\t},\n\n\t\t'operator': /<>|<<|>>|&&|\\|\\||[=!<>/]=?|[+\\-*%#?&|^]|:[A-Z]+:/,\n\t\t'punctuation': /[()[\\],]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/arturo.js",
    "content": "/**\n * @param {string} lang\n * @param {string} [pattern]\n * @returns {import('../types.d.ts').GrammarToken}\n */\nfunction createLanguageString (lang, pattern) {\n\treturn {\n\t\tpattern: RegExp(/\\{!/.source + '(?:' + (pattern || lang) + ')' + /$[\\s\\S]*\\}/.source, 'm'),\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'embedded': {\n\t\t\t\tpattern: /(^\\{!\\w+\\b)[\\s\\S]+(?=\\}$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'language-' + lang,\n\t\t\t\tinside: lang,\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/,\n\t\t},\n\t};\n}\n\n/** @type {import('../types.d.ts').LanguageProto<'arturo'>} */\nexport default {\n\tid: 'arturo',\n\talias: 'art',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /;.*/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'character': {\n\t\t\tpattern: /`.`/,\n\t\t\talias: 'char',\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'number': {\n\t\t\tpattern: /\\b\\d+(?:\\.\\d+(?:\\.\\d+(?:-[\\w+-]+)?)?)?\\b/,\n\t\t},\n\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'regex': {\n\t\t\tpattern: /\\{\\/.*?\\/\\}/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'html-string': createLanguageString('html'),\n\t\t'css-string': createLanguageString('css'),\n\t\t'js-string': createLanguageString('js'),\n\t\t'md-string': createLanguageString('md'),\n\t\t'sql-string': createLanguageString('sql'),\n\t\t'sh-string': createLanguageString('bash', 'sh'),\n\n\t\t'multistring': {\n\t\t\tpattern: /».*|\\{:[\\s\\S]*?:\\}|\\{[\\s\\S]*?\\}|^-{6}$[\\s\\S]*/m,\n\t\t\talias: 'string',\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'label': {\n\t\t\tpattern: /\\w+\\b\\??:/,\n\t\t\talias: 'property',\n\t\t},\n\n\t\t'literal': {\n\t\t\tpattern: /'(?:\\w+\\b\\??:?)/,\n\t\t\talias: 'constant',\n\t\t},\n\n\t\t'type': {\n\t\t\tpattern: /:(?:\\w+\\b\\??:?)/,\n\t\t\talias: 'class-name',\n\t\t},\n\n\t\t'color': /#\\w+/,\n\n\t\t'predicate': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\\?/,\n\t\t\talias: 'keyword',\n\t\t},\n\n\t\t'builtin-function': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\\b/,\n\t\t\talias: 'keyword',\n\t\t},\n\n\t\t'sugar': {\n\t\t\tpattern: /->|=>|\\||::/,\n\t\t\talias: 'operator',\n\t\t},\n\n\t\t'punctuation': /[()[\\],]/,\n\n\t\t'symbol': {\n\t\t\tpattern: /<:|-:|ø|@|#|\\+|\\||\\*|\\$|---|-|%|\\/|\\.\\.|\\^|~|=|<|>|\\\\/,\n\t\t},\n\n\t\t'boolean': {\n\t\t\tpattern: /\\b(?:false|maybe|true)\\b/,\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/asciidoc.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'asciidoc'>} */\nexport default {\n\tid: 'asciidoc',\n\talias: 'adoc',\n\tgrammar () {\n\t\tconst placeholder = /** @type {Grammar['inside']} */ null;\n\n\t\tconst attributes = {\n\t\t\tpattern:\n\t\t\t\t/(^[ \\t]*)\\[(?!\\[)(?:([\"'$`])(?:(?!\\2)[^\\\\]|\\\\.)*\\2|\\[(?:[^\\[\\]\\\\]|\\\\.)*\\]|[^\\[\\]\\\\\"'$`]|\\\\.)*\\]/m,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'quoted': {\n\t\t\t\t\tpattern: /([$`])(?:(?!\\1)[^\\\\]|\\\\.)*\\1/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /^[$`]|[$`]$/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'interpreted': {\n\t\t\t\t\tpattern: /'(?:[^'\\\\]|\\\\.)*'/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /^'|'$/,\n\t\t\t\t\t\t$rest: /** @type {Grammar['$rest']} */ (placeholder),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'string': /\"(?:[^\"\\\\]|\\\\.)*\"/,\n\t\t\t\t'variable': /\\w+(?==)/,\n\t\t\t\t'punctuation': /^\\[|\\]$|,/,\n\t\t\t\t'operator': /=/,\n\t\t\t\t// The negative look-ahead prevents blank matches\n\t\t\t\t'attr-value': /(?!^\\s+$).+/,\n\t\t\t},\n\t\t};\n\n\t\tconst asciidoc = /** @type {Grammar} */ ({\n\t\t\t'comment-block': {\n\t\t\t\tpattern: /^(\\/{4,})$[\\s\\S]*?^\\1/m,\n\t\t\t\talias: 'comment',\n\t\t\t},\n\t\t\t'table': {\n\t\t\t\tpattern: /^\\|={3,}(?:(?:\\r?\\n|\\r(?!\\n)).*)*?(?:\\r?\\n|\\r)\\|={3,}$/m,\n\t\t\t\tinside: {\n\t\t\t\t\t'specifiers': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/(?:(?:(?:\\d+(?:\\.\\d+)?|\\.\\d+)[+*](?:[<^>](?:\\.[<^>])?|\\.[<^>])?|[<^>](?:\\.[<^>])?|\\.[<^>])[a-z]*|[a-z]+)(?=\\|)/,\n\t\t\t\t\t\talias: 'attr-value',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': {\n\t\t\t\t\t\tpattern: /(^|[^\\\\])[|!]=*/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t$rest: /** @type {Grammar['$rest']} */ (placeholder),\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'passthrough-block': {\n\t\t\t\tpattern: /^(\\+{4,})$[\\s\\S]*?^\\1$/m,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^\\++|\\++$/,\n\t\t\t\t\t$rest: /** @type {Grammar['$rest']} */ (placeholder),\n\t\t\t\t},\n\t\t\t},\n\t\t\t// Literal blocks and listing blocks\n\t\t\t'literal-block': {\n\t\t\t\tpattern: /^(-{4,}|\\.{4,})$[\\s\\S]*?^\\1$/m,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^(?:-+|\\.+)|(?:-+|\\.+)$/,\n\t\t\t\t\t$rest: /** @type {Grammar['$rest']} */ (placeholder),\n\t\t\t\t},\n\t\t\t},\n\t\t\t// Sidebar blocks, quote blocks, example blocks and open blocks\n\t\t\t'other-block': {\n\t\t\t\tpattern: /^(--|\\*{4,}|_{4,}|={4,})$[\\s\\S]*?^\\1$/m,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^(?:-+|\\*+|_+|=+)|(?:-+|\\*+|_+|=+)$/,\n\t\t\t\t\t$rest: /** @type {Grammar['$rest']} */ (placeholder),\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// list-punctuation and list-label must appear before indented-block\n\t\t\t'list-punctuation': {\n\t\t\t\tpattern: /(^[ \\t]*)(?:-|\\*{1,5}|\\.{1,5}|(?:[a-z]|\\d+)\\.|[xvi]+\\))(?= )/im,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'list-label': {\n\t\t\t\tpattern: /(^[ \\t]*)[a-z\\d].+(?::{2,4}|;;)(?=\\s)/im,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'symbol',\n\t\t\t},\n\t\t\t'indented-block': {\n\t\t\t\tpattern: /((\\r?\\n|\\r)\\2)([ \\t]+)\\S.*(?:(?:\\r?\\n|\\r)\\3.+)*(?=\\2{2}|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'comment': /^\\/\\/.*/m,\n\t\t\t'title': {\n\t\t\t\tpattern:\n\t\t\t\t\t/^.+(?:\\r?\\n|\\r)(?:={3,}|-{3,}|~{3,}|\\^{3,}|\\+{3,})$|^={1,5} .+|^\\.(?![\\s.]).*/m,\n\t\t\t\talias: 'important',\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^(?:\\.|=+)|(?:=+|-+|~+|\\^+|\\++)$/,\n\t\t\t\t\t$rest: /** @type {Grammar['$rest']} */ (placeholder),\n\t\t\t\t},\n\t\t\t},\n\t\t\t'attribute-entry': {\n\t\t\t\tpattern: /^:[^:\\r\\n]+:(?: .*?(?: \\+(?:\\r?\\n|\\r).*?)*)?$/m,\n\t\t\t\talias: 'tag',\n\t\t\t},\n\t\t\t'attributes': attributes,\n\t\t\t'hr': {\n\t\t\t\tpattern: /^'{3,}$/m,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'page-break': {\n\t\t\t\tpattern: /^<{3,}$/m,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'admonition': {\n\t\t\t\tpattern: /^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'callout': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^[ \\t]*)<?\\d*>/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'symbol',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /<\\d+>/,\n\t\t\t\t\talias: 'symbol',\n\t\t\t\t},\n\t\t\t],\n\t\t\t'macro': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b[a-z\\d][a-z\\d-]*::?(?:[^\\s\\[\\]]*\\[(?:[^\\]\\\\\"']|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*\\1|\\\\.)*\\])/,\n\t\t\t\tinside: {\n\t\t\t\t\t'function': /^[a-z\\d-]+(?=:)/,\n\t\t\t\t\t'punctuation': /^::?/,\n\t\t\t\t\t'attributes': {\n\t\t\t\t\t\tpattern: /(?:\\[(?:[^\\]\\\\\"']|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*\\1|\\\\.)*\\])/,\n\t\t\t\t\t\tinside: attributes.inside,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'inline': {\n\t\t\t\t/*\n\t\t\t\t\tThe initial look-behind prevents the highlighting of escaped quoted text.\n\n\t\t\t\t\tQuoted text can be multi-line but cannot span an empty line.\n\t\t\t\t\tAll quoted text can have attributes before [foobar, 'foobar', baz=\"bar\"].\n\n\t\t\t\t\tFirst, we handle the constrained quotes.\n\t\t\t\t\tThose must be bounded by non-word chars and cannot have spaces between the delimiter and the first char.\n\t\t\t\t\tThey are, in order: _emphasis_, ``double quotes'', `single quotes', `monospace`, 'emphasis', *strong*, +monospace+ and #unquoted#\n\n\t\t\t\t\tThen we handle the unconstrained quotes.\n\t\t\t\t\tThose do not have the restrictions of the constrained quotes.\n\t\t\t\t\tThey are, in order: __emphasis__, **strong**, ++monospace++, +++passthrough+++, ##unquoted##, $$passthrough$$, ~subscript~, ^superscript^, {attribute-reference}, [[anchor]], [[[bibliography anchor]]], <<xref>>, (((indexes))) and ((indexes))\n\t\t\t\t\t */\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\\\])(?:(?:\\B\\[(?:[^\\]\\\\\"']|([\"'])(?:(?!\\2)[^\\\\]|\\\\.)*\\2|\\\\.)*\\])?(?:\\b_(?!\\s)(?: _|[^_\\\\\\r\\n]|\\\\.)+(?:(?:\\r?\\n|\\r)(?: _|[^_\\\\\\r\\n]|\\\\.)+)*_\\b|\\B``(?!\\s).+?(?:(?:\\r?\\n|\\r).+?)*''\\B|\\B`(?!\\s)(?:[^`'\\s]|\\s+\\S)+['`]\\B|\\B(['*+#])(?!\\s)(?: \\3|(?!\\3)[^\\\\\\r\\n]|\\\\.)+(?:(?:\\r?\\n|\\r)(?: \\3|(?!\\3)[^\\\\\\r\\n]|\\\\.)+)*\\3\\B)|(?:\\[(?:[^\\]\\\\\"']|([\"'])(?:(?!\\4)[^\\\\]|\\\\.)*\\4|\\\\.)*\\])?(?:(__|\\*\\*|\\+\\+\\+?|##|\\$\\$|[~^]).+?(?:(?:\\r?\\n|\\r).+?)*\\5|\\{[^}\\r\\n]+\\}|\\[\\[\\[?.+?(?:(?:\\r?\\n|\\r).+?)*\\]?\\]\\]|<<.+?(?:(?:\\r?\\n|\\r).+?)*>>|\\(\\(\\(?.+?(?:(?:\\r?\\n|\\r).+?)*\\)?\\)\\)))/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'attributes': attributes,\n\t\t\t\t\t'url': {\n\t\t\t\t\t\tpattern: /^(?:\\[\\[\\[?.+?\\]?\\]\\]|<<.+?>>)$/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /^(?:\\[\\[\\[?|<<)|(?:\\]\\]\\]?|>>)$/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'attribute-ref': {\n\t\t\t\t\t\tpattern: /^\\{.+\\}$/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'variable': {\n\t\t\t\t\t\t\t\tpattern: /(^\\{)[a-z\\d,+_-]+/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'operator': /^[=?!#%@$]|!(?=[:}])/,\n\t\t\t\t\t\t\t'punctuation': /^\\{|\\}$|::?/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'italic': {\n\t\t\t\t\t\tpattern: /^(['_])[\\s\\S]+\\1$/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /^(?:''?|__?)|(?:''?|__?)$/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'bold': {\n\t\t\t\t\t\tpattern: /^\\*[\\s\\S]+\\*$/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\tpunctuation: /^\\*\\*?|\\*\\*?$/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation':\n\t\t\t\t\t\t/^(?:``?|\\+{1,3}|##?|\\$\\$|[~^]|\\(\\(\\(?)|(?:''?|\\+{1,3}|##?|\\$\\$|[~^`]|\\)?\\)\\))$/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'replacement': {\n\t\t\t\tpattern: /\\((?:C|R|TM)\\)/,\n\t\t\t\talias: 'builtin',\n\t\t\t},\n\t\t\t'entity': /&#?[\\da-z]{1,8};/i,\n\t\t\t'line-continuation': {\n\t\t\t\tpattern: /(^| )\\+$/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t});\n\n\t\t// Allow some nesting. There is no recursion though, so cloning should not be needed.\n\n\t\t/**\n\t\t * @param {string[]} keys\n\t\t */\n\t\tfunction copyFromAsciiDoc (...keys) {\n\t\t\tconst o = /** @type {Grammar} */ ({});\n\t\t\tfor (const key of keys) {\n\t\t\t\to[key] = asciidoc[key];\n\t\t\t}\n\t\t\treturn o;\n\t\t}\n\n\t\tattributes.inside['interpreted'].inside.$rest = copyFromAsciiDoc(\n\t\t\t'macro',\n\t\t\t'inline',\n\t\t\t'replacement',\n\t\t\t'entity'\n\t\t);\n\n\t\t/** @type {GrammarToken & { inside: Grammar }} */ (\n\t\t\tasciidoc['passthrough-block']\n\t\t).inside.$rest = copyFromAsciiDoc('macro');\n\n\t\t/** @type {GrammarToken & { inside: Grammar }} */ (asciidoc['literal-block']).inside.$rest =\n\t\t\tcopyFromAsciiDoc('callout');\n\n\t\t/** @type {GrammarToken & { inside: Grammar }} */ (asciidoc['table']).inside.$rest =\n\t\t\tcopyFromAsciiDoc(\n\t\t\t\t'comment-block',\n\t\t\t\t'passthrough-block',\n\t\t\t\t'literal-block',\n\t\t\t\t'other-block',\n\t\t\t\t'list-punctuation',\n\t\t\t\t'indented-block',\n\t\t\t\t'comment',\n\t\t\t\t'title',\n\t\t\t\t'attribute-entry',\n\t\t\t\t'attributes',\n\t\t\t\t'hr',\n\t\t\t\t'page-break',\n\t\t\t\t'admonition',\n\t\t\t\t'list-label',\n\t\t\t\t'callout',\n\t\t\t\t'macro',\n\t\t\t\t'inline',\n\t\t\t\t'replacement',\n\t\t\t\t'entity',\n\t\t\t\t'line-continuation'\n\t\t\t);\n\n\t\t/** @type {GrammarToken & { inside: Grammar }} */ (asciidoc['other-block']).inside.$rest =\n\t\t\tcopyFromAsciiDoc(\n\t\t\t\t'table',\n\t\t\t\t'list-punctuation',\n\t\t\t\t'indented-block',\n\t\t\t\t'comment',\n\t\t\t\t'attribute-entry',\n\t\t\t\t'attributes',\n\t\t\t\t'hr',\n\t\t\t\t'page-break',\n\t\t\t\t'admonition',\n\t\t\t\t'list-label',\n\t\t\t\t'macro',\n\t\t\t\t'inline',\n\t\t\t\t'replacement',\n\t\t\t\t'entity',\n\t\t\t\t'line-continuation'\n\t\t\t);\n\n\t\t/** @type {GrammarToken & { inside: Grammar }} */ (asciidoc['title']).inside.$rest =\n\t\t\tcopyFromAsciiDoc('macro', 'inline', 'replacement', 'entity');\n\n\t\treturn asciidoc;\n\t},\n\teffect (Prism) {\n\t\t// Plugin to make entity title show the real entity, idea by Roman Komarov\n\t\treturn Prism.hooks.add('wrap', env => {\n\t\t\tif (env.type === 'entity') {\n\t\t\t\tenv.attributes['title'] = env.content.replace(/&amp;/, '&');\n\t\t\t}\n\t\t});\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/asm6502.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'asm6502'>} */\nexport default {\n\tid: 'asm6502',\n\tgrammar: {\n\t\t'comment': /;.*/,\n\t\t'directive': {\n\t\t\tpattern: /\\.\\w+(?= )/,\n\t\t\talias: 'property',\n\t\t},\n\t\t'string': /([\"'`])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t'op-code': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA|adc|and|asl|bcc|bcs|beq|bit|bmi|bne|bpl|brk|bvc|bvs|clc|cld|cli|clv|cmp|cpx|cpy|dec|dex|dey|eor|inc|inx|iny|jmp|jsr|lda|ldx|ldy|lsr|nop|ora|pha|php|pla|plp|rol|ror|rti|rts|sbc|sec|sed|sei|sta|stx|sty|tax|tay|tsx|txa|txs|tya)\\b/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'hex-number': {\n\t\t\tpattern: /#?\\$[\\da-f]{1,4}\\b/i,\n\t\t\talias: 'number',\n\t\t},\n\t\t'binary-number': {\n\t\t\tpattern: /#?%[01]+\\b/,\n\t\t\talias: 'number',\n\t\t},\n\t\t'decimal-number': {\n\t\t\tpattern: /#?\\b\\d+\\b/,\n\t\t\talias: 'number',\n\t\t},\n\t\t'register': {\n\t\t\tpattern: /\\b[xya]\\b/i,\n\t\t\talias: 'variable',\n\t\t},\n\t\t'punctuation': /[(),:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/asmatmel.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'asmatmel'>} */\nexport default {\n\tid: 'asmatmel',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /;.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /([\"'`])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'constant': /\\b(?:PORT[A-Z]|DDR[A-Z]|(?:DD|P)[A-Z](?:\\d|[0-2]\\d|3[01]))\\b/,\n\n\t\t'directive': {\n\t\t\tpattern: /\\.\\w+(?= )/,\n\t\t\talias: 'property',\n\t\t},\n\t\t'r-register': {\n\t\t\tpattern: /\\br(?:\\d|[12]\\d|3[01])\\b/,\n\t\t\talias: 'variable',\n\t\t},\n\t\t'op-code': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:ADC|ADD|ADIW|AND|ANDI|ASR|BCLR|BLD|BRBC|BRBS|BRCC|BRCS|BREAK|BREQ|BRGE|BRHC|BRHS|BRID|BRIE|BRLO|BRLT|BRMI|BRNE|BRPL|BRSH|BRTC|BRTS|BRVC|BRVS|BSET|BST|CALL|CBI|CBR|CLC|CLH|CLI|CLN|CLR|CLS|CLT|CLV|CLZ|COM|CP|CPC|CPI|CPSE|DEC|DES|EICALL|EIJMP|ELPM|EOR|FMUL|FMULS|FMULSU|ICALL|IJMP|IN|INC|JMP|LAC|LAS|LAT|LD|LD[A-Za-z0-9]|LPM|LSL|LSR|MOV|MOVW|MUL|MULS|MULSU|NEG|NOP|OR|ORI|OUT|POP|PUSH|RCALL|RET|RETI|RJMP|ROL|ROR|SBC|SBCI|SBI|SBIC|SBIS|SBIW|SBR|SBRC|SBRS|SEC|SEH|SEI|SEN|SER|SES|SET|SEV|SEZ|SLEEP|SPM|ST|ST[A-Z0-9]|SUB|SUBI|SWAP|TST|WDR|XCH|adc|add|adiw|and|andi|asr|bclr|bld|brbc|brbs|brcc|brcs|break|breq|brge|brhc|brhs|brid|brie|brlo|brlt|brmi|brne|brpl|brsh|brtc|brts|brvc|brvs|bset|bst|call|cbi|cbr|clc|clh|cli|cln|clr|cls|clt|clv|clz|com|cp|cpc|cpi|cpse|dec|des|eicall|eijmp|elpm|eor|fmul|fmuls|fmulsu|icall|ijmp|in|inc|jmp|lac|las|lat|ld|ld[a-z0-9]|lpm|lsl|lsr|mov|movw|mul|muls|mulsu|neg|nop|or|ori|out|pop|push|rcall|ret|reti|rjmp|rol|ror|sbc|sbci|sbi|sbic|sbis|sbiw|sbr|sbrc|sbrs|sec|seh|sei|sen|ser|ses|set|sev|sez|sleep|spm|st|st[a-zA-Z0-9]|sub|subi|swap|tst|wdr|xch)\\b/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'hex-number': {\n\t\t\tpattern: /#?\\$[\\da-f]{2,4}\\b/i,\n\t\t\talias: 'number',\n\t\t},\n\t\t'binary-number': {\n\t\t\tpattern: /#?%[01]+\\b/,\n\t\t\talias: 'number',\n\t\t},\n\t\t'decimal-number': {\n\t\t\tpattern: /#?\\b\\d+\\b/,\n\t\t\talias: 'number',\n\t\t},\n\t\t'register': {\n\t\t\tpattern: /\\b[acznvshtixy]\\b/i,\n\t\t\talias: 'variable',\n\t\t},\n\t\t'operator': />>=?|<<=?|&[&=]?|\\|[\\|=]?|[-+*/%^!=<>?]=?/,\n\t\t'punctuation': /[(),:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/aspnet.js",
    "content": "import csharp from './csharp.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'aspnet'>} */\nexport default {\n\tid: 'aspnet',\n\tbase: markup,\n\trequire: csharp,\n\tgrammar ({ base }) {\n\t\tconst directive = /** @type {GrammarToken} */ ({\n\t\t\tpattern: /<%.*%>/,\n\t\t\talias: 'tag',\n\t\t\tinside: {\n\t\t\t\t'directive': {\n\t\t\t\t\tpattern: /<%\\s*?[$=%#:]{0,2}|%>/,\n\t\t\t\t\talias: 'tag',\n\t\t\t\t},\n\t\t\t\t$rest: 'csharp',\n\t\t\t},\n\t\t});\n\n\t\treturn {\n\t\t\t'page-directive': {\n\t\t\t\tpattern: /<%\\s*@.*%>/,\n\t\t\t\talias: 'tag',\n\t\t\t\tinside: {\n\t\t\t\t\t'page-directive': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/<%\\s*@\\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,\n\t\t\t\t\t\talias: 'tag',\n\t\t\t\t\t},\n\t\t\t\t\t$rest: /** @type {GrammarToken} */ (base['tag']).inside,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'directive': directive,\n\t\t\t$merge: {\n\t\t\t\t'tag': {\n\t\t\t\t\t// Regexp copied from markup, with a negative look-ahead added\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/<(?!%)\\/?[^\\s>\\/]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'tag/attr-value/punctuation': {\n\t\t\t\t\t// match directives of attribute value foo=\"<% Bar %>\"\n\t\t\t\t\t'directive': directive,\n\t\t\t\t},\n\t\t\t\t'comment': {\n\t\t\t\t\t'asp-comment': {\n\t\t\t\t\t\tpattern: /<%--[\\s\\S]*?--%>/,\n\t\t\t\t\t\talias: ['asp', 'comment'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// script runat=\"server\" contains csharp, not javascript\n\t\t\t\t['script' in base ? 'script' : 'tag']: {\n\t\t\t\t\t'asp-script': {\n\t\t\t\t\t\tpattern: /(<script(?=.*runat=['\"]?server\\b)[^>]*>)[\\s\\S]*?(?=<\\/script>)/i,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: ['asp', 'script'],\n\t\t\t\t\t\tinside: 'csharp',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/autohotkey.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'autohotkey'>} */\nexport default {\n\tid: 'autohotkey',\n\tgrammar () {\n\t\t// NOTES - follows first-first highlight method, block is locked after highlight, different from SyntaxHl\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|\\s);.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^[\\t ]*)\\/\\*(?:[\\r\\n](?![ \\t]*\\*\\/)|[^\\r\\n])*(?:[\\r\\n][ \\t]*\\*\\/)?/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'tag': {\n\t\t\t\t// labels\n\t\t\t\tpattern: /^([ \\t]*)[^\\s,`\":]+(?=:[ \\t]*$)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'string': /\"(?:[^\"\\n\\r]|\"\")*\"/,\n\t\t\t'variable': /%\\w+%/,\n\t\t\t'number': /\\b0x[\\dA-Fa-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[Ee]-?\\d+)?/,\n\t\t\t'operator':\n\t\t\t\t/\\?|\\/\\/?=?|:=|\\|[=|]?|&[=&]?|\\+[=+]?|-[=-]?|\\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\\b(?:AND|NOT|OR)\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\n\t\t\t'command': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\\b/i,\n\t\t\t\talias: 'selector',\n\t\t\t},\n\n\t\t\t'constant':\n\t\t\t\t/\\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\\b/i,\n\n\t\t\t'builtin':\n\t\t\t\t/\\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\\b/i,\n\n\t\t\t'symbol':\n\t\t\t\t/\\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\\b/i,\n\n\t\t\t'directive': {\n\t\t\t\tpattern: /#[a-z]+\\b/i,\n\t\t\t\talias: 'important',\n\t\t\t},\n\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\\b/i,\n\t\t\t'function': /[^(); \\t,\\n+*\\-=?>:\\\\\\/<&%\\[\\]]+(?=\\()/,\n\t\t\t'punctuation': /[{}[\\]():,]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/autoit.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'autoit'>} */\nexport default {\n\tid: 'autoit',\n\tgrammar: {\n\t\t'comment': [\n\t\t\t/;.*/,\n\t\t\t{\n\t\t\t\t// The multi-line comments delimiters can actually be commented out with \";\"\n\t\t\t\tpattern: /(^[\\t ]*)#(?:comments-start|cs)[\\s\\S]*?^[ \\t]*#(?:ce|comments-end)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'url': {\n\t\t\tpattern: /(^[\\t ]*#include\\s+)(?:<[^\\r\\n>]+>|\"[^\\r\\n\"]+\")/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /([\"'])(?:\\1\\1|(?!\\1)[^\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'variable': /([%$@])\\w+\\1/,\n\t\t\t},\n\t\t},\n\t\t'directive': {\n\t\t\tpattern: /(^[\\t ]*)#[\\w-]+/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'function': /\\b\\w+(?=\\()/,\n\t\t// Variables and macros\n\t\t'variable': /[$@]\\w+/,\n\t\t'keyword':\n\t\t\t/\\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\\b/i,\n\t\t'number': /\\b(?:0x[\\da-f]+|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)\\b/i,\n\t\t'boolean': /\\b(?:False|True)\\b/i,\n\t\t'operator': /<[=>]?|[-+*\\/=&>]=?|[?^]|\\b(?:And|Not|Or)\\b/i,\n\t\t'punctuation': /[\\[\\]().,:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/avisynth.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'avisynth'>} */\nexport default {\n\tid: 'avisynth',\n\talias: 'avs',\n\tgrammar () {\n\t\t// http://avisynth.nl/index.php/The_full_AviSynth_grammar\n\n\t\t/**\n\t\t * @param {string} pattern\n\t\t * @param {string[]} replacements\n\t\t * @returns {string}\n\t\t */\n\t\tfunction replace (pattern, replacements) {\n\t\t\treturn pattern.replace(/<<(\\d+)>>/g, (m, index) => {\n\t\t\t\treturn replacements[+index];\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t *\n\t\t * @param {string} pattern\n\t\t * @param {string[]} replacements\n\t\t * @param {string} [flags]\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction re (pattern, replacements, flags) {\n\t\t\treturn RegExp(replace(pattern, replacements), flags || '');\n\t\t}\n\n\t\tconst types = /bool|clip|float|int|string|val/.source;\n\t\tconst internals = [\n\t\t\t// bools\n\t\t\t/is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?/.source,\n\t\t\t// control\n\t\t\t/apply|assert|default|eval|import|nop|select|undefined/.source,\n\t\t\t// global\n\t\t\t/opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)/\n\t\t\t\t.source,\n\t\t\t// conv\n\t\t\t/hex(?:value)?|value/.source,\n\t\t\t// numeric\n\t\t\t/abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt/\n\t\t\t\t.source,\n\t\t\t// trig\n\t\t\t/a?sinh?|a?cosh?|a?tan[2h]?/.source,\n\t\t\t// bit\n\t\t\t/(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))/\n\t\t\t\t.source,\n\t\t\t// runtime\n\t\t\t/average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)/\n\t\t\t\t.source,\n\t\t\t// script\n\t\t\t/getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams/\n\t\t\t\t.source,\n\t\t\t// string\n\t\t\t/chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)/\n\t\t\t\t.source,\n\t\t\t// version\n\t\t\t/isversionorgreater|version(?:number|string)/.source,\n\t\t\t// helper\n\t\t\t/buildpixeltype|colorspacenametopixeltype/.source,\n\t\t\t// avsplus\n\t\t\t/addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode/.source,\n\t\t].join('|');\n\t\tconst properties = [\n\t\t\t// content\n\t\t\t/has(?:audio|video)/.source,\n\t\t\t// resolution\n\t\t\t/height|width/.source,\n\t\t\t// framerate\n\t\t\t/frame(?:count|rate)|framerate(?:denominator|numerator)/.source,\n\t\t\t// interlacing\n\t\t\t/getparity|is(?:field|frame)based/.source,\n\t\t\t// color format\n\t\t\t/bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype/\n\t\t\t\t.source,\n\t\t\t// audio\n\t\t\t/audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)/\n\t\t\t\t.source,\n\t\t].join('|');\n\t\tconst filters = [\n\t\t\t// source\n\t\t\t/avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource/\n\t\t\t\t.source,\n\t\t\t// color\n\t\t\t/coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv/\n\t\t\t\t.source,\n\t\t\t// overlay\n\t\t\t/(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract/.source,\n\t\t\t// geometry\n\t\t\t/addborders|(?:bicubic|bilinear|blackman|gauss|lanczos|lanczos4|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)/\n\t\t\t\t.source,\n\t\t\t// pixel\n\t\t\t/blur|fixbrokenchromaupsampling|generalconvolution|sharpen|(?:spatial|temporal)soften/\n\t\t\t\t.source,\n\t\t\t// timeline\n\t\t\t/trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)/\n\t\t\t\t.source,\n\t\t\t// interlace\n\t\t\t/assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?/\n\t\t\t\t.source,\n\t\t\t// audio\n\t\t\t/amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch/\n\t\t\t\t.source,\n\t\t\t// conditional\n\t\t\t/animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?/\n\t\t\t\t.source,\n\t\t\t// export\n\t\t\t/imagewriter/.source,\n\t\t\t// debug\n\t\t\t/blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|showfiveversions|show(?:framenumber|smpte|time)|stack(?:horizontal|vertical)|subtitle|tone|version/\n\t\t\t\t.source,\n\t\t].join('|');\n\t\tconst allinternals = [internals, properties, filters].join('|');\n\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\t// Matches [* *] nestable block comments, but only supports 1 level of nested comments\n\t\t\t\t\t// /\\[\\*(?:[^\\[*]|\\[(?!\\*)|\\*(?!\\])|<self>)*\\*\\]/\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^\\\\])\\[\\*(?:[^\\[*]|\\[(?!\\*)|\\*(?!\\])|\\[\\*(?:[^\\[*]|\\[(?!\\*)|\\*(?!\\]))*\\*\\])*\\*\\]/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Matches /* */ block comments\n\t\t\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Matches # comments\n\t\t\t\t\tpattern: /(^|[^\\\\$])#.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t// Handle before strings because optional arguments are surrounded by double quotes\n\t\t\t'argument': {\n\t\t\t\tpattern: re(/\\b(?:<<0>>)\\s+(\"?)\\w+\\1/.source, [types], 'i'),\n\t\t\t\tinside: {\n\t\t\t\t\t'keyword': /^\\w+/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Optional argument assignment\n\t\t\t'argument-label': {\n\t\t\t\tpattern: /([,(][\\s\\\\]*)\\w+\\s*=(?!=)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'argument-name': {\n\t\t\t\t\t\tpattern: /^\\w+/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /=$/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\t// triple double-quoted\n\t\t\t\t\tpattern: /\"\"\"[\\s\\S]*?\"\"\"/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// single double-quoted\n\t\t\t\t\tpattern: /\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'constant': {\n\t\t\t\t\t\t\t// These *are* case-sensitive!\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/\\b(?:DEFAULT_MT_MODE|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR)\\b/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t// The special \"last\" variable that takes the value of the last implicitly returned clip\n\t\t\t'variable': /\\b(?:last)\\b/i,\n\n\t\t\t'boolean': /\\b(?:false|no|true|yes)\\b/i,\n\n\t\t\t'keyword': /\\b(?:catch|else|for|function|global|if|return|try|while|__END__)\\b/i,\n\n\t\t\t'constant': /\\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\\b/,\n\n\t\t\t// AviSynth's internal functions, filters, and properties\n\t\t\t'builtin-function': {\n\t\t\t\tpattern: re(/\\b(?:<<0>>)\\b/.source, [allinternals], 'i'),\n\t\t\t\talias: 'function',\n\t\t\t},\n\n\t\t\t'type-cast': {\n\t\t\t\tpattern: re(/\\b(?:<<0>>)(?=\\s*\\()/.source, [types], 'i'),\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\n\t\t\t// External/user-defined filters\n\t\t\t'function': {\n\t\t\t\tpattern: /\\b[a-z_]\\w*(?=\\s*\\()|(\\.)[a-z_]\\w*\\b/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t// Matches a \\ as the first or last character on a line\n\t\t\t'line-continuation': {\n\t\t\t\tpattern: /(^[ \\t]*)\\\\|\\\\(?=[ \\t]*$)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\n\t\t\t'number': /\\B\\$(?:[\\da-f]{6}|[\\da-f]{8})\\b|(?:(?:\\b|\\B-)\\d+(?:\\.\\d*)?\\b|\\B\\.\\d+\\b)/i,\n\n\t\t\t'operator': /\\+\\+?|[!=<>]=?|&&|\\|\\||[?:*/%-]/,\n\n\t\t\t'punctuation': /[{}\\[\\]();,.]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/avro-idl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'avro-idl'>} */\nexport default {\n\tid: 'avro-idl',\n\talias: 'avdl',\n\tgrammar () {\n\t\t// GitHub: https://github.com/apache/avro\n\t\t// Docs: https://avro.apache.org/docs/current/idl.html\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /(^|[^\\\\])\"(?:[^\\r\\n\"\\\\]|\\\\.)*\"/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'annotation': {\n\t\t\t\tpattern: /@(?:[$\\w.-]|`[^\\r\\n`]+`)+/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'function-identifier': {\n\t\t\t\tpattern: /`[^\\r\\n`]+`(?=\\s*\\()/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'identifier': {\n\t\t\t\tpattern: /`[^\\r\\n`]+`/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'class-name': {\n\t\t\t\tpattern: /(\\b(?:enum|error|protocol|record|throws)\\b\\s+)[$\\w]+/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:array|boolean|bytes|date|decimal|double|enum|error|false|fixed|float|idl|import|int|local_timestamp_ms|long|map|null|oneway|protocol|record|schema|string|throws|time_ms|timestamp_ms|true|union|uuid|void)\\b/,\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\n\t\t\t'number': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^\\w.])-?(?:(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|0x(?:[a-f0-9]+(?:\\.[a-f0-9]*)?|\\.[a-f0-9]+)(?:p[+-]?\\d+)?)[dfl]?(?![\\w.])/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t/-?\\b(?:Infinity|NaN)\\b/,\n\t\t\t],\n\n\t\t\t'operator': /=/,\n\t\t\t'punctuation': /[()\\[\\]{}<>.:,;-]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/awk.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'awk'>} */\nexport default {\n\tid: 'awk',\n\talias: 'gawk',\n\tgrammar: {\n\t\t'hashbang': {\n\t\t\tpattern: /^#!.*/,\n\t\t\tgreedy: true,\n\t\t\talias: 'comment',\n\t\t},\n\t\t'comment': {\n\t\t\tpattern: /#.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /(^|[^\\\\])\"(?:[^\\\\\"\\r\\n]|\\\\.)*\"/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'regex': {\n\t\t\tpattern: /((?:^|[^\\w\\s)])\\s*)\\/(?:[^\\/\\\\\\r\\n]|\\\\.)*\\//,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'variable': /\\$\\w+/,\n\t\t'keyword':\n\t\t\t/\\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\\b|@(?:include|load)\\b/,\n\n\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\t\t'number': /\\b(?:\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?|0x[a-fA-F0-9]+)\\b/,\n\n\t\t'operator': /--|\\+\\+|!?~|>&|>>|<<|(?:\\*\\*|[<>!=+\\-*/%^])=?|&&|\\|[|&]|[?:]/,\n\t\t'punctuation': /[()[\\]{},;]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/bash.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'bash'>} */\nexport default {\n\tid: 'bash',\n\talias: ['sh', 'shell'],\n\tgrammar () {\n\t\t// $ set | grep '^[A-Z][^[:space:]]*=' | cut -d= -f1 | tr '\\n' '|'\n\t\t// + LC_ALL, RANDOM, REPLY, SECONDS.\n\t\t// + make sure PS1..4 are here as they are not always set,\n\t\t// - some useless things.\n\t\tconst envVars =\n\t\t\t'\\\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\\\b';\n\n\t\tconst commandAfterHeredoc = {\n\t\t\tpattern: /(^([\"']?)\\w+\\2)[ \\t]+\\S.*/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'punctuation', // this looks reasonably well in all themes\n\t\t\tinside: 'bash',\n\t\t};\n\n\t\t/** @type {import('../types.d.ts').Grammar} */\n\t\tconst commandSubstitutionInside = {\n\t\t\t'variable': /^\\$\\(|^`|\\)$|`$/,\n\t\t};\n\n\t\tconst insideString = {\n\t\t\t'bash': commandAfterHeredoc,\n\t\t\t'environment': {\n\t\t\t\tpattern: RegExp('\\\\$' + envVars),\n\t\t\t\talias: 'constant',\n\t\t\t},\n\t\t\t'variable': [\n\t\t\t\t// [0]: Arithmetic Environment\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\$?\\(\\([\\s\\S]+?\\)\\)/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t// If there is a $ sign at the beginning highlight $(( and )) as variable\n\t\t\t\t\t\t'variable': [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpattern: /(^\\$\\(\\([\\s\\S]+)\\)\\)/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t/^\\$\\(\\(/,\n\t\t\t\t\t\t],\n\t\t\t\t\t\t'number': /\\b0x[\\dA-Fa-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[Ee]-?\\d+)?/,\n\t\t\t\t\t\t// Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic\n\t\t\t\t\t\t'operator': /--|\\+\\+|\\*\\*=?|<<=?|>>=?|&&|\\|\\||[=!+\\-*/%<>^&|]=?|[?~:]/,\n\t\t\t\t\t\t// If there is no $ sign at the beginning highlight (( and )) as punctuation\n\t\t\t\t\t\t'punctuation': /\\(\\(?|\\)\\)?|,|;/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// [1]: Command Substitution\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\$\\((?:\\([^)]+\\)|[^()])+\\)|`[^`]+`/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: commandSubstitutionInside,\n\t\t\t\t},\n\t\t\t\t// [2]: Brace expansion\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\$\\{[^}]+\\}/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'operator': /:[-=?+]?|[!\\/]|##?|%%?|\\^\\^?|,,?/,\n\t\t\t\t\t\t'punctuation': /[\\[\\]]/,\n\t\t\t\t\t\t'environment': {\n\t\t\t\t\t\t\tpattern: RegExp('(\\\\{)' + envVars),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'constant',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t/\\$(?:\\w+|[#?*!@$])/,\n\t\t\t],\n\t\t\t// Escape sequences from echo and printf's manuals, and escaped quotes.\n\t\t\t'entity':\n\t\t\t\t/\\\\(?:[abceEfnrtv\\\\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/,\n\t\t};\n\n\t\tconst bash = {\n\t\t\t'shebang': {\n\t\t\t\tpattern: /^#!\\s*\\/.*/,\n\t\t\t\talias: 'important',\n\t\t\t},\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^|[^\"{\\\\$])#.*/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'function-name': [\n\t\t\t\t// a) function foo {\n\t\t\t\t// b) foo() {\n\t\t\t\t// c) function foo() {\n\t\t\t\t// but not “foo {”\n\t\t\t\t{\n\t\t\t\t\t// a) and c)\n\t\t\t\t\tpattern: /(\\bfunction\\s+)[\\w-]+(?=(?:\\s*\\(?:\\s*\\))?\\s*\\{)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'function',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// b)\n\t\t\t\t\tpattern: /\\b[\\w-]+(?=\\s*\\(\\s*\\)\\s*\\{)/,\n\t\t\t\t\talias: 'function',\n\t\t\t\t},\n\t\t\t],\n\t\t\t// Highlight variable names as variables in for and select beginnings.\n\t\t\t'for-or-select': {\n\t\t\t\tpattern: /(\\b(?:for|select)\\s+)\\w+(?=\\s+in\\s)/,\n\t\t\t\talias: 'variable',\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t// Highlight variable names as variables in the left-hand part\n\t\t\t// of assignments (“=” and “+=”).\n\t\t\t'assign-left': {\n\t\t\t\tpattern: /(^|[\\s;|&]|[<>]\\()\\w+(?:\\.\\w+)*(?=\\+?=)/,\n\t\t\t\tinside: {\n\t\t\t\t\t'environment': {\n\t\t\t\t\t\tpattern: RegExp('(^|[\\\\s;|&]|[<>]\\\\()' + envVars),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'constant',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\talias: 'variable',\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t// Highlight parameter names as variables\n\t\t\t'parameter': {\n\t\t\t\tpattern: /(^|\\s)-{1,2}(?:\\w+:[+-]?)?\\w+(?:\\.\\w+)*(?=[=\\s]|$)/,\n\t\t\t\talias: 'variable',\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'string': [\n\t\t\t\t// Support for Here-documents https://en.wikipedia.org/wiki/Here_document\n\t\t\t\t{\n\t\t\t\t\tpattern: /((?:^|[^<])<<-?\\s*)(\\w+)\\s[\\s\\S]*?(?:\\r?\\n|\\r)\\2/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: insideString,\n\t\t\t\t},\n\t\t\t\t// Here-document with quotes around the tag\n\t\t\t\t// → No expansion (so no “inside”).\n\t\t\t\t{\n\t\t\t\t\tpattern: /((?:^|[^<])<<-?\\s*)([\"'])(\\w+)\\2\\s[\\s\\S]*?(?:\\r?\\n|\\r)\\3/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'bash': commandAfterHeredoc,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// “Normal” string\n\t\t\t\t{\n\t\t\t\t\t// https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^\\\\](?:\\\\\\\\)*)\"(?:\\\\[\\s\\S]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^\"\\\\`$])*\"/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: insideString,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// https://www.gnu.org/software/bash/manual/html_node/Single-Quotes.html\n\t\t\t\t\tpattern: /(^|[^$\\\\])'[^']*'/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html\n\t\t\t\t\tpattern: /\\$'(?:[^'\\\\]|\\\\[\\s\\S])*'/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'entity': insideString.entity,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'environment': {\n\t\t\t\tpattern: RegExp('\\\\$?' + envVars),\n\t\t\t\talias: 'constant',\n\t\t\t},\n\t\t\t'variable': insideString.variable,\n\t\t\t'function': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[\\s;|&]|[<>]\\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\\s;|&])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'keyword': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[\\s;|&]|[<>]\\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\\s;|&])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t// https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html\n\t\t\t'builtin': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[\\s;|&]|[<>]\\()(?:\\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\\s;|&])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\t// Alias added to make those easier to distinguish from strings.\n\t\t\t\talias: 'class-name',\n\t\t\t},\n\t\t\t'boolean': {\n\t\t\t\tpattern: /(^|[\\s;|&]|[<>]\\()(?:false|true)(?=$|[)\\s;|&])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'file-descriptor': {\n\t\t\t\tpattern: /\\B&\\d\\b/,\n\t\t\t\talias: 'important',\n\t\t\t},\n\t\t\t'operator': {\n\t\t\t\t// Lots of redirections here, but not just that.\n\t\t\t\tpattern:\n\t\t\t\t\t/\\d?<>|>\\||\\+=|=[=~]?|!=?|<<[<-]?|[&\\d]?>>|\\d[<>]&?|[<>][&=]?|&[>&]?|\\|[&|]?/,\n\t\t\t\tinside: {\n\t\t\t\t\t'file-descriptor': {\n\t\t\t\t\t\tpattern: /^\\d/,\n\t\t\t\t\t\talias: 'important',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'punctuation': /\\$?\\(\\(?|\\)\\)?|\\.\\.|[{}[\\];\\\\]/,\n\t\t\t'number': {\n\t\t\t\tpattern: /(^|\\s)(?:[1-9]\\d*|0)(?:[.,]\\d+)?\\b/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t};\n\n\t\t/* Patterns in command substitution. */\n\t\tconst toBeCopied = [\n\t\t\t'comment',\n\t\t\t'function-name',\n\t\t\t'for-or-select',\n\t\t\t'assign-left',\n\t\t\t'parameter',\n\t\t\t'string',\n\t\t\t'environment',\n\t\t\t'function',\n\t\t\t'keyword',\n\t\t\t'builtin',\n\t\t\t'boolean',\n\t\t\t'file-descriptor',\n\t\t\t'operator',\n\t\t\t'punctuation',\n\t\t\t'number',\n\t\t];\n\t\tfor (let i = 0; i < toBeCopied.length; i++) {\n\t\t\tcommandSubstitutionInside[toBeCopied[i]] = bash[toBeCopied[i]];\n\t\t}\n\n\t\treturn bash;\n\t},\n};\n"
  },
  {
    "path": "src/languages/basic.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'basic'>} */\nexport default {\n\tid: 'basic',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(?:!|REM\\b).+/i,\n\t\t\tinside: {\n\t\t\t\t'keyword': /^REM/i,\n\t\t\t},\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:\"\"|[!#$%&'()*,\\/:;<=>?^\\w +\\-.])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'number': /(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:E[+-]?\\d+)?/i,\n\t\t'keyword':\n\t\t\t/\\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\\$|\\b)/i,\n\t\t'function':\n\t\t\t/\\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\\$|\\b)/i,\n\t\t'operator': /<[=>]?|>=?|[+\\-*\\/^=&]|\\b(?:AND|EQV|IMP|NOT|OR|XOR)\\b/i,\n\t\t'punctuation': /[,;:()]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/batch.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'batch'>} */\nexport default {\n\tid: 'batch',\n\tgrammar () {\n\t\tconst variable = /%%?[~:\\w]+%?|!\\S+!/;\n\t\tconst parameter = {\n\t\t\tpattern: /\\/[a-z?]+(?=[ :]|$):?|-[a-z]\\b|--[a-z-]+\\b/im,\n\t\t\talias: 'attr-name',\n\t\t\tinside: {\n\t\t\t\t'punctuation': /:/,\n\t\t\t},\n\t\t};\n\t\tconst string = /\"(?:[\\\\\"]\"|[^\"])*\"(?!\")/;\n\t\tconst number = /(?:\\b|-)\\d+\\b/;\n\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t/^::.*/m,\n\t\t\t\t{\n\t\t\t\t\tpattern: /((?:^|[&(])[ \\t]*)rem\\b(?:[^^&)\\r\\n]|\\^(?:\\r\\n|[\\s\\S]))*/im,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'label': {\n\t\t\t\tpattern: /^:.*/m,\n\t\t\t\talias: 'property',\n\t\t\t},\n\t\t\t'command': [\n\t\t\t\t{\n\t\t\t\t\t// FOR command\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:^|[&(])[ \\t]*)for(?: \\/[a-z?](?:[ :](?:\"[^\"]*\"|[^\\s\"/]\\S*))?)* \\S+ in \\([^)]+\\) do/im,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'keyword': /\\b(?:do|in)\\b|^for\\b/i,\n\t\t\t\t\t\t'string': string,\n\t\t\t\t\t\t'parameter': parameter,\n\t\t\t\t\t\t'variable': variable,\n\t\t\t\t\t\t'number': number,\n\t\t\t\t\t\t'punctuation': /[()',]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// IF command\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:^|[&(])[ \\t]*)if(?: \\/[a-z?](?:[ :](?:\"[^\"]*\"|[^\\s\"/]\\S*))?)* (?:not )?(?:cmdextversion \\d+|defined \\w+|errorlevel \\d+|exist \\S+|(?:\"[^\"]*\"|(?!\")(?:(?!==)\\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:\"[^\"]*\"|[^\\s\"]\\S*))/im,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'keyword': /\\b(?:cmdextversion|defined|errorlevel|exist|not)\\b|^if\\b/i,\n\t\t\t\t\t\t'string': string,\n\t\t\t\t\t\t'parameter': parameter,\n\t\t\t\t\t\t'variable': variable,\n\t\t\t\t\t\t'number': number,\n\t\t\t\t\t\t'operator': /\\^|==|\\b(?:equ|geq|gtr|leq|lss|neq)\\b/i,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// ELSE command\n\t\t\t\t\tpattern: /((?:^|[&()])[ \\t]*)else\\b/im,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'keyword': /^else\\b/i,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// SET command\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:^|[&(])[ \\t]*)set(?: \\/[a-z](?:[ :](?:\"[^\"]*\"|[^\\s\"/]\\S*))?)* (?:[^^&)\\r\\n]|\\^(?:\\r\\n|[\\s\\S]))*/im,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'keyword': /^set\\b/i,\n\t\t\t\t\t\t'string': string,\n\t\t\t\t\t\t'parameter': parameter,\n\t\t\t\t\t\t'variable': [variable, /\\w+(?=(?:[*\\/%+\\-&^|]|<<|>>)?=)/],\n\t\t\t\t\t\t'number': number,\n\t\t\t\t\t\t'operator': /[*\\/%+\\-&^|]=?|<<=?|>>=?|[!~_=]/,\n\t\t\t\t\t\t'punctuation': /[()',]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Other commands\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:^|[&(])[ \\t]*@?)\\w+\\b(?:\"(?:[\\\\\"]\"|[^\"])*\"(?!\")|[^\"^&)\\r\\n]|\\^(?:\\r\\n|[\\s\\S]))*/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'keyword': /^\\w+\\b/,\n\t\t\t\t\t\t'string': string,\n\t\t\t\t\t\t'parameter': parameter,\n\t\t\t\t\t\t'label': {\n\t\t\t\t\t\t\tpattern: /(^\\s*):\\S+/m,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'property',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'variable': variable,\n\t\t\t\t\t\t'number': number,\n\t\t\t\t\t\t'operator': /\\^/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'operator': /[&@]/,\n\t\t\t'punctuation': /[()']/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/bbcode.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'bbcode'>} */\nexport default {\n\tid: 'bbcode',\n\talias: 'shortcode',\n\tgrammar: {\n\t\t'tag': {\n\t\t\tpattern:\n\t\t\t\t/\\[\\/?[^\\s=\\]]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\"\\]=]+))?(?:\\s+[^\\s=\\]]+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\"\\]=]+))*\\s*\\]/,\n\t\t\tinside: {\n\t\t\t\t'tag': {\n\t\t\t\t\tpattern: /^\\[\\/?[^\\s=\\]]+/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /^\\[\\/?/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'attr-value': {\n\t\t\t\t\tpattern: /=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\"\\]=]+)/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t\t/^=/,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpattern: /^(\\s*)[\"']|[\"']$/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'punctuation': /\\]/,\n\t\t\t\t'attr-name': /[^\\s=\\]]+/,\n\t\t\t},\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/bbj.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'bbj'>} */\nexport default {\n\tid: 'bbj',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(^|[^\\\\:])rem\\s+.*/i,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /(['\"])(?:(?!\\1|\\\\).|\\\\.)*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'number': /(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:E[+-]?\\d+)?/i,\n\t\t'keyword':\n\t\t\t/\\b(?:abstract|all|argc|begin|bye|callback|case|chn|class|classend|ctl|day|declare|delete|dim|dom|dread|dsz|else|end|endif|err|exitto|extends|fi|field|for|from|gosub|goto|if|implements|interface|interfaceend|iol|iolist|let|list|load|method|methodend|methodret|on|opts|pfx|print|private|process_events|protected|psz|public|read|read_resource|release|remove_callback|repeat|restore|return|rev|seterr|setesc|sqlchn|sqlunt|ssn|start|static|swend|switch|sys|then|tim|unt|until|use|void|wend|where|while)\\b/i,\n\t\t'function': /\\b\\w+(?=\\()/,\n\t\t'boolean': /\\b(?:BBjAPI\\.TRUE|BBjAPI\\.FALSE)\\b/i,\n\t\t'operator': /<[=>]?|>=?|[+\\-*\\/^=&]|\\b(?:and|not|or|xor)\\b/i,\n\t\t'punctuation': /[.,;:()]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/bicep.js",
    "content": "// based loosely upon: https://github.com/Azure/bicep/blob/main/src/textmate/bicep.tmlanguage\n\n/** @type {import('../types.d.ts').LanguageProto<'bicep'>} */\nexport default {\n\tid: 'bicep',\n\tgrammar: {\n\t\t'comment': [\n\t\t\t{\n\t\t\t\t// multiline comments eg /* ASDF */\n\t\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\t// singleline comments eg // ASDF\n\t\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\n\t\t'property': [\n\t\t\t{\n\t\t\t\tpattern: /([\\r\\n][ \\t]*)[a-z_]\\w*(?=[ \\t]*:)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /([\\r\\n][ \\t]*)'(?:\\\\.|\\$(?!\\{)|[^'\\\\\\r\\n$])*'(?=[ \\t]*:)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\t\t'string': [\n\t\t\t{\n\t\t\t\tpattern: /'''[^'][\\s\\S]*?'''/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\\\'])'(?:\\\\.|\\$(?!\\{)|[^'\\\\\\r\\n$])*'/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\t\t'interpolated-string': {\n\t\t\tpattern: /(^|[^\\\\'])'(?:\\\\.|\\$(?:(?!\\{)|\\{[^{}\\r\\n]*\\})|[^'\\\\\\r\\n$])*'/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation': {\n\t\t\t\t\tpattern: /\\$\\{[^{}\\r\\n]*\\}/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\tpattern: /(^\\$\\{)[\\s\\S]+(?=\\}$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: 'bicep',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /^\\$\\{|\\}$/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t},\n\t\t},\n\n\t\t'datatype': {\n\t\t\tpattern: /(\\b(?:output|param)\\b[ \\t]+\\w+[ \\t]+)\\w+\\b/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'class-name',\n\t\t},\n\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t// https://github.com/Azure/bicep/blob/114a3251b4e6e30082a58729f19a8cc4e374ffa6/src/textmate/bicep.tmlanguage#L184\n\t\t'keyword': /\\b(?:existing|for|if|in|module|null|output|param|resource|targetScope|var)\\b/,\n\n\t\t'decorator': /@\\w+\\b/,\n\t\t'function': /\\b[a-z_]\\w*(?=[ \\t]*\\()/i,\n\n\t\t'number': /(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:E[+-]?\\d+)?/i,\n\t\t'operator':\n\t\t\t/--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/,\n\t\t'punctuation': /[{}[\\];(),.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/birb.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'birb'>} */\nexport default {\n\tid: 'birb',\n\tbase: clike,\n\tgrammar () {\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\tpattern: /r?(\"|')(?:\\\\.|(?!\\1)[^\\\\])*\\1/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'class-name': [\n\t\t\t\t/\\b[A-Z](?:[\\d_]*[a-zA-Z]\\w*)?\\b/,\n\n\t\t\t\t// matches variable and function return types (parameters as well).\n\t\t\t\t/\\b(?:[A-Z]\\w*|(?!(?:var|void)\\b)[a-z]\\w*)(?=\\s+\\w+\\s*[;,=()])/,\n\t\t\t],\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|new|next|noSeeb|return|static|switch|throw|var|void|while)\\b/,\n\t\t\t'operator': /\\+\\+|--|&&|\\|\\||<<=?|>>=?|~(?:\\/=?)?|[+\\-*\\/%&^|=!<>]=?|\\?|:/,\n\t\t\t'variable': /\\b[a-z_]\\w*\\b/,\n\t\t\t$insert: {\n\t\t\t\t'metadata': {\n\t\t\t\t\t$before: 'function',\n\t\t\t\t\tpattern: /<\\w+>/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'symbol',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/bison.js",
    "content": "import c from './c.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'bison'>} */\nexport default {\n\tid: 'bison',\n\tbase: c,\n\tgrammar ({ base }) {\n\t\treturn {\n\t\t\t$insert: {\n\t\t\t\t'bison': {\n\t\t\t\t\t$before: 'comment',\n\t\t\t\t\t// This should match all the beginning of the file\n\t\t\t\t\t// including the prologue(s), the bison declarations and\n\t\t\t\t\t// the grammar rules.\n\t\t\t\t\tpattern: /^(?:[^%]|%(?!%))*%%[\\s\\S]*?%%/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'c': {\n\t\t\t\t\t\t\t// Allow for one level of nested braces\n\t\t\t\t\t\t\tpattern: /%\\{[\\s\\S]*?%\\}|\\{(?:\\{[^}]*\\}|[^{}])*\\}/,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\t\t\t\tpattern: /^%?\\{|%?\\}$/,\n\t\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'bison-variable': {\n\t\t\t\t\t\t\t\t\tpattern: /[$@](?:<[^\\s>]+>)?[\\w$]+/,\n\t\t\t\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t\t'punctuation': /<|>/,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t$rest: 'c',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'comment': base.comment,\n\t\t\t\t\t\t'string': base.string,\n\t\t\t\t\t\t'property': /\\S+(?=:)/,\n\t\t\t\t\t\t'keyword': /%\\w+/,\n\t\t\t\t\t\t'number': {\n\t\t\t\t\t\t\tpattern: /(^|[^@])\\b(?:0x[\\da-f]+|\\d+)/i,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /%[%?]|[|:;\\[\\]<>]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/bnf.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'bnf'>} */\nexport default {\n\tid: 'bnf',\n\talias: 'rbnf',\n\tgrammar: {\n\t\t'string': {\n\t\t\tpattern: /\"[^\\r\\n\"]*\"|'[^\\r\\n']*'/,\n\t\t},\n\t\t'definition': {\n\t\t\tpattern: /<[^<>\\r\\n\\t]+>(?=\\s*::=)/,\n\t\t\talias: ['rule', 'keyword'],\n\t\t\tinside: {\n\t\t\t\t'punctuation': /^<|>$/,\n\t\t\t},\n\t\t},\n\t\t'rule': {\n\t\t\tpattern: /<[^<>\\r\\n\\t]+>/,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /^<|>$/,\n\t\t\t},\n\t\t},\n\t\t'operator': /::=|[|()[\\]{}*+?]|\\.{3}/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/bqn.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'bqn'>} */\nexport default {\n\tid: 'bqn',\n\tgrammar: {\n\t\t'shebang': {\n\t\t\tpattern: /^#![ \\t]*\\/.*/,\n\t\t\talias: 'important',\n\t\t\tgreedy: true,\n\t\t},\n\t\t'comment': {\n\t\t\tpattern: /#.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string-literal': {\n\t\t\tpattern: /\"(?:[^\"]|\"\")*\"/,\n\t\t\tgreedy: true,\n\t\t\talias: 'string',\n\t\t},\n\t\t'character-literal': {\n\t\t\tpattern: /'(?:[\\s\\S]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])'/,\n\t\t\tgreedy: true,\n\t\t\talias: 'char',\n\t\t},\n\t\t'function': /•[\\w¯.∞π]+[\\w¯.∞π]*/,\n\t\t'dot-notation-on-brackets': {\n\t\t\tpattern: /\\{(?=.*\\}\\.)|\\}\\./,\n\t\t\talias: 'namespace',\n\t\t},\n\t\t'special-name': {\n\t\t\tpattern: /(?:𝕨|𝕩|𝕗|𝕘|𝕤|𝕣|𝕎|𝕏|𝔽|𝔾|𝕊|_𝕣_|_𝕣)/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'dot-notation-on-name': {\n\t\t\tpattern: /[A-Za-z_][\\w¯∞π]*\\./,\n\t\t\talias: 'namespace',\n\t\t},\n\t\t'word-number-scientific': {\n\t\t\tpattern: /\\d+(?:\\.\\d+)?[eE]¯?\\d+/,\n\t\t\talias: 'number',\n\t\t},\n\t\t'word-name': {\n\t\t\tpattern: /[A-Za-z_][\\w¯∞π]*/,\n\t\t\talias: 'symbol',\n\t\t},\n\t\t'word-number': {\n\t\t\tpattern:\n\t\t\t\t/[¯∞π]?(?:\\d*\\.?\\b\\d+(?:e[+¯]?\\d+|E[+¯]?\\d+)?|¯|∞|π)(?:j¯?(?:(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:e[+¯]?\\d+|E[+¯]?\\d+)?|¯|∞|π))?/,\n\t\t\talias: 'number',\n\t\t},\n\t\t'null-literal': {\n\t\t\tpattern: /@/,\n\t\t\talias: 'char',\n\t\t},\n\t\t'primitive-functions': {\n\t\t\tpattern: /[-+×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!]/,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'primitive-1-operators': {\n\t\t\tpattern: /[`˜˘¨⁼⌜´˝˙]/,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'primitive-2-operators': {\n\t\t\tpattern: /[∘⊸⟜○⌾⎉⚇⍟⊘◶⎊]/,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'punctuation': /[←⇐↩(){}⟨⟩[\\]‿·⋄,.;:?]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/brainfuck.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'brainfuck'>} */\nexport default {\n\tid: 'brainfuck',\n\tgrammar: {\n\t\t'pointer': {\n\t\t\tpattern: /<|>/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'increment': {\n\t\t\tpattern: /\\+/,\n\t\t\talias: 'inserted',\n\t\t},\n\t\t'decrement': {\n\t\t\tpattern: /-/,\n\t\t\talias: 'deleted',\n\t\t},\n\t\t'branching': {\n\t\t\tpattern: /\\[|\\]/,\n\t\t\talias: 'important',\n\t\t},\n\t\t'operator': /[.,]/,\n\t\t'comment': /\\S+/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/brightscript.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'brightscript'>} */\nexport default {\n\tid: 'brightscript',\n\tgrammar: {\n\t\t'comment': /(?:\\brem|').*/i,\n\t\t'directive-statement': {\n\t\t\tpattern: /(^[\\t ]*)#(?:const|else(?:[\\t ]+if)?|end[\\t ]+if|error|if).*/im,\n\t\t\tlookbehind: true,\n\t\t\talias: 'property',\n\t\t\tinside: {\n\t\t\t\t'error-message': {\n\t\t\t\t\tpattern: /(^#error).+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t'directive': {\n\t\t\t\t\tpattern: /^#(?:const|else(?:[\\t ]+if)?|end[\\t ]+if|error|if)/,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t\t'expression': {\n\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\tinside: 'brightscript',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'property': {\n\t\t\tpattern: /([\\r\\n{,][\\t ]*)(?:(?!\\d)\\w+|\"(?:[^\"\\r\\n]|\"\")*\"(?!\"))(?=[ \\t]*:)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"\\r\\n]|\"\")*\"(?!\")/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'class-name': {\n\t\t\tpattern: /(\\bAs[\\t ]+)\\w+/i,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\\b/i,\n\t\t'boolean': /\\b(?:false|true)\\b/i,\n\t\t'function': /\\b(?!\\d)\\w+(?=[\\t ]*\\()/,\n\t\t'number': /(?:\\b\\d+(?:\\.\\d+)?(?:[ed][+-]\\d+)?|&h[a-f\\d]+)\\b[%&!#]?/i,\n\t\t'operator': /--|\\+\\+|>>=?|<<=?|<>|[-+*/\\\\<>]=?|[:^=?]|\\b(?:and|mod|not|or)\\b/i,\n\t\t'punctuation': /[.,;()[\\]{}]/,\n\t\t'constant': /\\b(?:LINE_NUM)\\b/i,\n\t},\n};\n"
  },
  {
    "path": "src/languages/bro.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'bro'>} */\nexport default {\n\tid: 'bro',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(^|[^\\\\$])#.*/,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'italic': /\\b(?:FIXME|TODO|XXX)\\b/,\n\t\t\t},\n\t\t},\n\n\t\t'string': {\n\t\t\tpattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'boolean': /\\b[TF]\\b/,\n\n\t\t'function': {\n\t\t\tpattern: /(\\b(?:event|function|hook)[ \\t]+)\\w+(?:::\\w+)?/,\n\t\t\tlookbehind: true,\n\t\t},\n\n\t\t'builtin':\n\t\t\t/(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,\n\n\t\t'constant': {\n\t\t\tpattern: /(\\bconst[ \\t]+)\\w+/i,\n\t\t\tlookbehind: true,\n\t\t},\n\n\t\t'keyword':\n\t\t\t/\\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\\b/,\n\n\t\t'operator': /--?|\\+\\+?|!=?=?|<=?|>=?|==?=?|&&|\\|\\|?|\\?|\\*|\\/|~|\\^|%/,\n\n\t\t'number': /\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n\n\t\t'punctuation': /[{}[\\];(),.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/bsl.js",
    "content": "/* eslint-disable no-misleading-character-class */\n/** @type {import('../types.d.ts').LanguageProto<'bsl'>} */\nexport default {\n\tid: 'bsl',\n\talias: 'oscript',\n\tgrammar () {\n\t\t// 1C:Enterprise\n\t\t// https://github.com/Diversus23/\n\t\t//\n\t\treturn {\n\t\t\t'comment': /\\/\\/.*/,\n\t\t\t'string': [\n\t\t\t\t// Строки\n\t\t\t\t// Strings\n\t\t\t\t{\n\t\t\t\t\tpattern: /\"(?:[^\"]|\"\")*\"(?!\")/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t// Дата и время\n\t\t\t\t// Date & time\n\t\t\t\t{\n\t\t\t\t\tpattern: /'(?:[^'\\r\\n\\\\]|\\\\.)*'/,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword': [\n\t\t\t\t{\n\t\t\t\t\t// RU\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^\\w\\u0400-\\u0484\\u0487-\\u052f\\u1d2b\\u1d78\\u2de0-\\u2dff\\ua640-\\ua69f\\ufe2e\\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\\w\\u0400-\\u0484\\u0487-\\u052f\\u1d2b\\u1d78\\u2de0-\\u2dff\\ua640-\\ua69f\\ufe2e\\ufe2f])/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// EN\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b(?:break|do|each|else|elseif|enddo|endfunction|endif|endprocedure|endtry|except|execute|export|false|for|function|if|in|new|null|procedure|raise|return|then|to|true|try|undefined|val|var|while)\\b/i,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'number': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^(?=\\d)|[^\\w\\u0400-\\u0484\\u0487-\\u052f\\u1d2b\\u1d78\\u2de0-\\u2dff\\ua640-\\ua69f\\ufe2e\\ufe2f])(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:E[+-]?\\d+)?/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'operator': [\n\t\t\t\t/[<>+\\-*/]=?|[%=]/,\n\t\t\t\t// RU\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^\\w\\u0400-\\u0484\\u0487-\\u052f\\u1d2b\\u1d78\\u2de0-\\u2dff\\ua640-\\ua69f\\ufe2e\\ufe2f])(?:и|или|не)(?![\\w\\u0400-\\u0484\\u0487-\\u052f\\u1d2b\\u1d78\\u2de0-\\u2dff\\ua640-\\ua69f\\ufe2e\\ufe2f])/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t// EN\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\b(?:and|not|or)\\b/i,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'punctuation': /\\(\\.|\\.\\)|[()\\[\\]:;,.]/,\n\t\t\t'directive': [\n\t\t\t\t// Теги препроцессора вида &Клиент, &Сервер, ...\n\t\t\t\t// Preprocessor tags of the type &Client, &Server, ...\n\t\t\t\t{\n\t\t\t\t\tpattern: /^([ \\t]*)&.*/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'important',\n\t\t\t\t},\n\t\t\t\t// Инструкции препроцессора вида:\n\t\t\t\t// #Если Сервер Тогда\n\t\t\t\t// ...\n\t\t\t\t// #КонецЕсли\n\t\t\t\t// Preprocessor instructions of the form:\n\t\t\t\t// #If Server Then\n\t\t\t\t// ...\n\t\t\t\t// #EndIf\n\t\t\t\t{\n\t\t\t\t\tpattern: /^([ \\t]*)#.*/gm,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'important',\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/c.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'c'>} */\nexport default {\n\tid: 'c',\n\tbase: clike,\n\toptional: 'opencl-extensions',\n\tgrammar ({ base, getOptionalLanguage }) {\n\t\t/* OpenCL host API */\n\t\tconst extensions = getOptionalLanguage('opencl-extensions');\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\/(?:[^\\r\\n\\\\]|\\\\(?:\\r\\n?|\\n|(?![\\r\\n])))*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\t// https://en.cppreference.com/w/c/language/string_literal\n\t\t\t\tpattern: /\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'class-name': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(\\b(?:enum|struct)\\s+(?:__attribute__\\s*\\(\\([\\s\\S]*?\\)\\)\\s*)?)\\w+|\\b[a-z]\\w*_t\\b/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\\b/,\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\t\t\t'number':\n\t\t\t\t/(?:\\b0x(?:[\\da-f]+(?:\\.[\\da-f]*)?|\\.[\\da-f]+)(?:p[+-]?\\d+)?|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)[ful]{0,4}/i,\n\t\t\t'operator': />>=?|<<=?|->|([-+&|:])\\1|[?:~]|[-+*/%&|^!=<>]=?/,\n\t\t\t$insert: {\n\t\t\t\t'char': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\t// https://en.cppreference.com/w/c/language/character_constant\n\t\t\t\t\tpattern: /'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n]){0,32}'/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t'macro': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\t// allow for multiline macro definitions\n\t\t\t\t\t// spaces after the # character compile fine with gcc\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^[\\t ]*)#\\s*[a-z](?:[^\\r\\n\\\\/]|\\/(?!\\*)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|\\\\(?:\\r\\n|[\\s\\S]))*/im,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'property',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'string': [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t// highlight the path of the include statement as a string\n\t\t\t\t\t\t\t\tpattern: /^(#\\s*include\\s*)<[^>]+>/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t/** @type {GrammarToken} */ (base['string']),\n\t\t\t\t\t\t],\n\t\t\t\t\t\t'char': base['char'],\n\t\t\t\t\t\t'comment': base['comment'],\n\t\t\t\t\t\t'macro-name': [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpattern: /(^#\\s*define\\s+)\\w+\\b(?!\\()/i,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpattern: /(^#\\s*define\\s+)\\w+\\b(?=\\()/i,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\talias: 'function',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\t// highlight macro directives as keywords\n\t\t\t\t\t\t'directive': {\n\t\t\t\t\t\t\tpattern: /^(#\\s*)[a-z]+/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'directive-hash': /^#/,\n\t\t\t\t\t\t'punctuation': /##|\\\\(?=[\\r\\n])/,\n\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\tpattern: /\\S[\\s\\S]*/,\n\t\t\t\t\t\t\tinside: 'c',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// highlight predefined macros as constants\n\t\t\t\t'constant': {\n\t\t\t\t\t$before: 'function',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\\b/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'function': /** @type {import('../types.d.ts').GrammarTokens} */ (extensions),\n\t\t\t},\n\t\t\t$delete: ['boolean', ...(extensions ? ['type-opencl-host-cpp'] : [])],\n\t\t};\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n * @typedef {import('../types.d.ts').GrammarTokens} GrammarTokens\n */\n"
  },
  {
    "path": "src/languages/cfscript.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'cfscript'>} */\nexport default {\n\tid: 'cfscript',\n\tbase: clike,\n\talias: 'cfc',\n\tgrammar () {\n\t\t// https://cfdocs.org/script\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'annotation': {\n\t\t\t\t\t\t\tpattern: /(?:^|[^.])@[\\w\\.]+/,\n\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\\b(?!\\s*=)/,\n\t\t\t'operator': [\n\t\t\t\t/\\+\\+|--|&&|\\|\\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\\?(?:\\.|:)?|:/,\n\t\t\t\t/\\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\\b/,\n\t\t\t],\n\t\t\t'scope': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\\b/,\n\t\t\t\talias: 'global',\n\t\t\t},\n\t\t\t'type': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\\b/,\n\t\t\t\talias: 'builtin',\n\t\t\t},\n\t\t\t$insert: {\n\t\t\t\t// This must be declared before keyword because we use \"function\" inside the lookahead\n\t\t\t\t'function-variable': {\n\t\t\t\t\t$before: 'keyword',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,\n\t\t\t\t\talias: 'function',\n\t\t\t\t},\n\t\t\t},\n\t\t\t$delete: ['class-name'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/chaiscript.js",
    "content": "import { toArray } from '../util/iterables.js';\nimport clike from './clike.js';\nimport cpp from './cpp.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'chaiscript'>} */\nexport default {\n\tid: 'chaiscript',\n\tbase: clike,\n\trequire: cpp,\n\tgrammar ({ languages }) {\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\tpattern: /(^|[^\\\\])'(?:[^'\\\\]|\\\\[\\s\\S])*'/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\t// e.g. class Rectangle { ... }\n\t\t\t\t\tpattern: /(\\bclass\\s+)\\w+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// e.g. attr Rectangle::height, def Rectangle::area() { ... }\n\t\t\t\t\tpattern: /(\\b(?:attr|def)\\s+)\\w+(?=\\s*::)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\\b/,\n\t\t\t'number': [\n\t\t\t\t...toArray(\n\t\t\t\t\t/** @type {import('../types.d.ts').GrammarTokens} */ (languages.cpp).number\n\t\t\t\t),\n\t\t\t\t/\\b(?:Infinity|NaN)\\b/,\n\t\t\t],\n\t\t\t'operator': />>=?|<<=?|\\|\\||&&|:[:=]?|--|\\+\\+|[=!<>+\\-*/%|&^]=?|[?~]|`[^`\\r\\n]{1,4}`/,\n\t\t\t$insert: {\n\t\t\t\t'parameter-type': {\n\t\t\t\t\t$before: 'operator',\n\t\t\t\t\t// e.g. def foo(int x, Vector y) {...}\n\t\t\t\t\tpattern: /([,(]\\s*)\\w+(?=\\s+\\w)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'class-name',\n\t\t\t\t},\n\t\t\t\t'string-interpolation': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^\\\\])\"(?:[^\"$\\\\]|\\\\[\\s\\S]|\\$(?!\\{)|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})*\\})*\"/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})*\\}/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation-expression': {\n\t\t\t\t\t\t\t\t\tpattern: /(^\\$\\{)[\\s\\S]+(?=\\}$)/,\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t\tinside: 'chaiscript',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/cil.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'cil'>} */\nexport default {\n\tid: 'cil',\n\tgrammar: {\n\t\t'comment': /\\/\\/.*/,\n\n\t\t'string': {\n\t\t\tpattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'directive': {\n\t\t\tpattern: /(^|\\W)\\.[a-z]+(?=\\s)/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'class-name',\n\t\t},\n\n\t\t// Actually an assembly reference\n\t\t'variable': /\\[[\\w\\.]+\\]/,\n\n\t\t'keyword':\n\t\t\t/\\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|iant|idispatch|implements|import|initonly|instance|u?int(?:8|16|32|64)?|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\\b/,\n\n\t\t'function':\n\t\t\t/\\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\\.)?(?:conv\\.(?:[iu][1248]?|ovf\\.[iu][1248]?(?:\\.un)?|r\\.un|r4|r8)|ldc\\.(?:i4(?:\\.\\d+|\\.[mM]1|\\.s)?|i8|r4|r8)|ldelem(?:\\.[iu][1248]?|\\.r[48]|\\.ref|a)?|ldind\\.(?:[iu][1248]?|r[48]|ref)|stelem\\.?(?:i[1248]?|r[48]|ref)?|stind\\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\\.[0-3s]|a(?:\\.s)?)?|ldloc(?:\\.\\d+|\\.s)?|sub(?:\\.ovf(?:\\.un)?)?|mul(?:\\.ovf(?:\\.un)?)?|add(?:\\.ovf(?:\\.un)?)?|stloc(?:\\.[0-3s])?|refany(?:type|val)|blt(?:\\.un)?(?:\\.s)?|ble(?:\\.un)?(?:\\.s)?|bgt(?:\\.un)?(?:\\.s)?|bge(?:\\.un)?(?:\\.s)?|unbox(?:\\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\\.s)?|bne\\.un(?:\\.s)?|ldloca(?:\\.s)?|brzero(?:\\.s)?|brtrue(?:\\.s)?|brnull(?:\\.s)?|brinst(?:\\.s)?|starg(?:\\.s)?|leave(?:\\.s)?|shr(?:\\.un)?|rem(?:\\.un)?|div(?:\\.un)?|clt(?:\\.un)?|alignment|castclass|ldvirtftn|beq(?:\\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\\b/,\n\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'number': /\\b-?(?:0x[0-9a-f]+|\\d+)(?:\\.[0-9a-f]+)?\\b/i,\n\n\t\t'punctuation': /[{}[\\];(),:=]|IL_[0-9A-Za-z]+/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/cilkc.js",
    "content": "import c from './c.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'cilkc'>} */\nexport default {\n\tid: 'cilkc',\n\tbase: c,\n\talias: 'cilk-c',\n\tgrammar () {\n\t\treturn {\n\t\t\t$insert: {\n\t\t\t\t'parallel-keyword': {\n\t\t\t\t\t$before: 'function',\n\t\t\t\t\tpattern: /\\bcilk_(?:for|reducer|s(?:cope|pawn|ync))\\b/,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/cilkcpp.js",
    "content": "import cpp from './cpp.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'cilkcpp'>} */\nexport default {\n\tid: 'cilkcpp',\n\tbase: cpp,\n\talias: ['cilk-cpp', 'cilk'],\n\tgrammar () {\n\t\treturn {\n\t\t\t$insert: {\n\t\t\t\t'parallel-keyword': {\n\t\t\t\t\t$before: 'function',\n\t\t\t\t\tpattern: /\\bcilk_(?:for|reducer|s(?:cope|pawn|ync))\\b/,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/clike.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'clike'>} */\nexport default {\n\tid: 'clike',\n\tgrammar: {\n\t\t'comment': [\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\t\t'string': {\n\t\t\tpattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'class-name': {\n\t\t\tpattern:\n\t\t\t\t/(\\b(?:class|extends|implements|instanceof|interface|new|trait)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /[.\\\\]/,\n\t\t\t},\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\\b/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'function': /\\b\\w+(?=\\()/,\n\t\t'number': /\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n\t\t'operator': /[<>]=?|[!=]=?=?|--?|\\+\\+?|&&?|\\|\\|?|[?*/~^%]/,\n\t\t'punctuation': /[{}[\\];(),.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/clojure.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'clojure'>} */\nexport default {\n\tid: 'clojure',\n\tgrammar () {\n\t\t// Copied from https://github.com/jeluard/prism-clojure\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /;.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:[^\"\\\\]|\\\\.)*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'char': /\\\\\\w+/,\n\t\t\t'symbol': {\n\t\t\t\tpattern: /(^|[\\s()\\[\\]{},])::?[\\w*+!?'<>=/.-]+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'keyword': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(\\()(?:-|->|->>|\\.|\\.\\.|\\*|\\/|\\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\\?|ensure|eval|every\\?|false\\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\\?|new|newline|next|nil\\?|node|not|not-any\\?|not-every\\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\\?|split-at|split-with|str|string\\?|struct|struct-map|subs|subvec|symbol|symbol\\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\\?|vector|vector-zip|vector\\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\\?|zipmap|zipper)(?=[\\s)]|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'boolean': /\\b(?:false|nil|true)\\b/,\n\t\t\t'number': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\w$@])(?:\\d+(?:[/.]\\d+)?(?:e[+-]?\\d+)?|0x[a-f0-9]+|[1-9]\\d?r[a-z0-9]+)[lmn]?(?![\\w$@])/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'function': {\n\t\t\t\tpattern: /((?:^|[^'])\\()[\\w*+!?'<>=/.-]+(?=[\\s)]|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'operator': /[#@^`~]/,\n\t\t\t'punctuation': /[{}\\[\\](),]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/cmake.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'cmake'>} */\nexport default {\n\tid: 'cmake',\n\tgrammar: {\n\t\t'comment': /#.*/,\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\\\\\"]|\\\\.)*\"/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation': {\n\t\t\t\t\tpattern: /\\$\\{(?:[^{}$]|\\$\\{[^{}$]*\\})*\\}/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\$\\{|\\}/,\n\t\t\t\t\t\t'variable': /\\w+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'variable':\n\t\t\t/\\b(?:CMAKE_\\w+|\\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\\b/,\n\t\t'property':\n\t\t\t/\\b(?:cxx_\\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\\w+|\\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\\b/,\n\t\t'keyword':\n\t\t\t/\\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\\s*\\()\\b/,\n\t\t'boolean': /\\b(?:FALSE|OFF|ON|TRUE)\\b/,\n\t\t'namespace': /\\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\\b/,\n\t\t'operator':\n\t\t\t/\\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\\b/,\n\t\t'inserted': {\n\t\t\tpattern: /\\b\\w+::\\w+\\b/,\n\t\t\talias: 'class-name',\n\t\t},\n\t\t'number': /\\b\\d+(?:\\.\\d+)*\\b/,\n\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()\\b/i,\n\t\t'punctuation': /[()>}]|\\$[<{]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/cobol.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'cobol'>} */\nexport default {\n\tid: 'cobol',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\\*>.*|(^[ \\t]*)\\*.*/m,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /[xzgn]?(?:\"(?:[^\\r\\n\"]|\"\")*\"(?!\")|'(?:[^\\r\\n']|'')*'(?!'))/i,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'level': {\n\t\t\tpattern: /(^[ \\t]*)\\d+\\b/m,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\talias: 'number',\n\t\t},\n\n\t\t'class-name': {\n\t\t\t// https://github.com/antlr/grammars-v4/blob/42edd5b687d183b5fa679e858a82297bd27141e7/cobol85/Cobol85.g4#L1015\n\t\t\tpattern: /(\\bpic(?:ture)?\\s+)(?:(?:[-\\w$/,:*+<>]|\\.(?!\\s|$))(?:\\(\\d+\\))?)+/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'number': {\n\t\t\t\t\tpattern: /(\\()\\d+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t'punctuation': /[()]/,\n\t\t\t},\n\t\t},\n\n\t\t'keyword': {\n\t\t\tpattern:\n\t\t\t\t/(^|[^\\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOTTOM|BOUNDS|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COL|COLLATING|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOL|EOP|EOS|ERASE|ERROR|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTION-POINTER|FUNCTIONNAME|GENERATE|GIVING|GLOBAL|GO|GOBACK|GRID|GROUP|HEADING|HIGH-VALUE|HIGH-VALUES|HIGHLIGHT|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINE-COUNTER|LINES|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOW-VALUE|LOW-VALUES|LOWER|LOWLIGHT|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|PORT|POSITION|POSITIVE|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|RD|READ|READER|REAL|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|RESET|RETURN|RETURN-CODE|RETURNING|REVERSE-VIDEO|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TAPE|TASK|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYDDD|YYYYMMDD|ZERO-FILL|ZEROES|ZEROS)(?![\\w-])/i,\n\t\t\tlookbehind: true,\n\t\t},\n\n\t\t'boolean': {\n\t\t\tpattern: /(^|[^\\w-])(?:false|true)(?![\\w-])/i,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'number': {\n\t\t\tpattern:\n\t\t\t\t/(^|[^\\w-])(?:[+-]?(?:(?:\\d+(?:[.,]\\d+)?|[.,]\\d+)(?:e[+-]?\\d+)?|zero))(?![\\w-])/i,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'operator': [\n\t\t\t/<>|[<>]=?|[=+*/&]/,\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\w-])(?:-|and|equal|greater|less|not|or|than)(?![\\w-])/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'punctuation': /[.:,()]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/coffeescript.js",
    "content": "import javascript from './javascript.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'coffeescript'>} */\nexport default {\n\tid: 'coffeescript',\n\tbase: javascript,\n\talias: 'coffee',\n\tgrammar () {\n\t\t// Ignore comments starting with { to privilege string interpolation highlighting\n\t\tconst comment = /#(?!\\{).+/;\n\t\tconst interpolation = {\n\t\t\tpattern: /#\\{[^}]+\\}/,\n\t\t\talias: 'variable',\n\t\t};\n\n\t\treturn {\n\t\t\t'comment': comment,\n\t\t\t'string': [\n\t\t\t\t// Strings are multiline\n\t\t\t\t{\n\t\t\t\t\tpattern: /'(?:\\\\[\\s\\S]|[^\\\\'])*'/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\t// Strings are multiline\n\t\t\t\t\tpattern: /\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\\b/,\n\t\t\t'class-member': {\n\t\t\t\tpattern: /@(?!\\d)\\w+/,\n\t\t\t\talias: 'variable',\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'comment': {\n\t\t\t\t\t'multiline-comment': {\n\t\t\t\t\t\tpattern: /###[\\s\\S]+?###/,\n\t\t\t\t\t\talias: 'comment',\n\t\t\t\t\t},\n\n\t\t\t\t\t// Block regexp can contain comments and interpolation\n\t\t\t\t\t'block-regex': {\n\t\t\t\t\t\tpattern: /\\/{3}[\\s\\S]*?\\/{3}/,\n\t\t\t\t\t\talias: 'regex',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'comment': comment,\n\t\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'string': {\n\t\t\t\t\t'inline-javascript': {\n\t\t\t\t\t\tpattern: /`(?:\\\\[\\s\\S]|[^\\\\`])*`/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\t\t\tpattern: /^`|`$/,\n\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'script': {\n\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\talias: 'language-javascript',\n\t\t\t\t\t\t\t\tinside: 'javascript',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\n\t\t\t\t\t// Block strings\n\t\t\t\t\t'multiline-string': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /'''[\\s\\S]*?'''/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /\"\"\"[\\s\\S]*?\"\"\"/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t'keyword': {\n\t\t\t\t\t// Object property\n\t\t\t\t\t'property': /(?!\\d)\\w+(?=\\s*:(?!:))/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t$delete: ['doc-comment', 'template-string'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/concurnas.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'concurnas'>} */\nexport default {\n\tid: 'concurnas',\n\talias: 'conc',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?(?:\\*\\/|$)|\\/\\/.*)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'regex-literal': {\n\t\t\tpattern: /\\br(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation': {\n\t\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'concurnas',\n\t\t\t\t},\n\t\t\t\t'regex': /[\\s\\S]+/,\n\t\t\t},\n\t\t},\n\t\t'string-literal': {\n\t\t\tpattern: /(?:\\B|\\bs)(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation': {\n\t\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'concurnas',\n\t\t\t\t},\n\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t},\n\t\t},\n\t\t'langext': {\n\t\t\tpattern: /\\b\\w+\\s*\\|\\|[\\s\\S]+?\\|\\|/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'class-name': /^\\w+/,\n\t\t\t\t'string': {\n\t\t\t\t\tpattern: /(^\\s*\\|\\|)[\\s\\S]+(?=\\|\\|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t'punctuation': /\\|\\|/,\n\t\t\t},\n\t\t},\n\t\t'function': {\n\t\t\tpattern: /((?:^|\\s)def[ \\t]+)[a-zA-Z_]\\w*(?=\\s*\\()/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\\b/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'number':\n\t\t\t/\\b0b[01][01_]*L?\\b|\\b0x(?:[\\da-f_]*\\.)?[\\da-f_p+-]+\\b|(?:\\b\\d[\\d_]*(?:\\.[\\d_]*)?|\\B\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[dfls]?/i,\n\t\t'punctuation': /[{}[\\];(),.:]/,\n\t\t'operator':\n\t\t\t/<==|>==|=>|->|<-|<>|&==|&<>|\\?:?|\\.\\?|\\+\\+|--|[-+*/=<>]=?|[!^~]|\\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\\b=?/,\n\t\t'annotation': {\n\t\t\tpattern: /@(?:\\w+:)?(?:\\w+|\\[[^\\]]+\\])?/,\n\t\t\talias: 'builtin',\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/cooklang.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'cooklang'>} */\nexport default {\n\tid: 'cooklang',\n\tgrammar () {\n\t\t// see https://github.com/cooklang/spec/blob/main/EBNF.md\n\n\t\tconst single_token_suffix = /(?:(?!\\s)[\\d$+<=a-zA-Z\\x80-\\uFFFF])+/.source;\n\t\tconst multi_token_infix = /[^{}@#]+/.source;\n\t\tconst multi_token_suffix = /\\{[^}#@]*\\}/.source;\n\n\t\tconst multi_token = multi_token_infix + multi_token_suffix;\n\n\t\tconst timer_units = /(?:h|hours|hrs|m|min|minutes)/.source;\n\n\t\tconst amount_group_impl = {\n\t\t\tpattern: /\\{[^{}]*\\}/,\n\t\t\tinside: {\n\t\t\t\t'amount': {\n\t\t\t\t\tpattern: /([\\{|])[^{}|*%]+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'number',\n\t\t\t\t},\n\t\t\t\t'unit': {\n\t\t\t\t\tpattern: /(%)[^}]+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'symbol',\n\t\t\t\t},\n\t\t\t\t'servings-scaler': {\n\t\t\t\t\tpattern: /\\*/,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t\t'servings-alternative-separator': {\n\t\t\t\t\tpattern: /\\|/,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t\t'unit-separator': {\n\t\t\t\t\tpattern: /(?:%|(\\*)%)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t\t'punctuation': /[{}]/,\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\t// [- comment -]\n\t\t\t\t// -- comment\n\t\t\t\tpattern: /\\[-[\\s\\S]*?-\\]|--.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'meta': {\n\t\t\t\t// >> key: value\n\t\t\t\tpattern: />>.*:.*/,\n\t\t\t\tinside: {\n\t\t\t\t\t'property': {\n\t\t\t\t\t\t// key:\n\t\t\t\t\t\tpattern: /(>>\\s*)[^\\s:](?:[^:]*[^\\s:])?/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'cookware-group': {\n\t\t\t\t// #...{...}, #...\n\t\t\t\tpattern: new RegExp('#(?:' + multi_token + '|' + single_token_suffix + ')'),\n\t\t\t\tinside: {\n\t\t\t\t\t'cookware': {\n\t\t\t\t\t\tpattern: new RegExp('(^#)(?:' + multi_token_infix + ')'),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t\t'cookware-keyword': {\n\t\t\t\t\t\tpattern: /^#/,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t'quantity-group': {\n\t\t\t\t\t\tpattern: new RegExp(/\\{[^{}@#]*\\}/),\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'quantity': {\n\t\t\t\t\t\t\t\tpattern: new RegExp(/(^\\{)/.source + multi_token_infix),\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\talias: 'number',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'punctuation': /[{}]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'ingredient-group': {\n\t\t\t\t// @...{...}, @...\n\t\t\t\tpattern: new RegExp('@(?:' + multi_token + '|' + single_token_suffix + ')'),\n\t\t\t\tinside: {\n\t\t\t\t\t'ingredient': {\n\t\t\t\t\t\tpattern: new RegExp('(^@)(?:' + multi_token_infix + ')'),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t\t'ingredient-keyword': {\n\t\t\t\t\t\tpattern: /^@/,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t'amount-group': amount_group_impl,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'timer-group': {\n\t\t\t\t// ~timer{...}\n\t\t\t\tpattern: /~(?!\\s)[^@#~{}]*\\{[^{}]*\\}/,\n\t\t\t\tinside: {\n\t\t\t\t\t'timer': {\n\t\t\t\t\t\tpattern: /(^~)[^{]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t\t'duration-group': {\n\t\t\t\t\t\t// {...}\n\t\t\t\t\t\tpattern: /\\{[^{}]*\\}/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /[{}]/,\n\t\t\t\t\t\t\t'unit': {\n\t\t\t\t\t\t\t\tpattern: new RegExp(/(%\\s*)/.source + timer_units + /\\b/.source),\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\talias: 'symbol',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'operator': /%/,\n\t\t\t\t\t\t\t'duration': {\n\t\t\t\t\t\t\t\tpattern: /\\d+/,\n\t\t\t\t\t\t\t\talias: 'number',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'timer-keyword': {\n\t\t\t\t\t\tpattern: /^~/,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/coq.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'coq'>} */\nexport default {\n\tid: 'coq',\n\tgrammar () {\n\t\t// https://github.com/coq/coq\n\n\t\tlet commentSource = /\\(\\*(?:[^(*]|\\((?!\\*)|\\*(?!\\))|<self>)*\\*\\)/.source;\n\t\tfor (let i = 0; i < 2; i++) {\n\t\t\tcommentSource = commentSource.replace(/<self>/g, () => commentSource);\n\t\t}\n\t\tcommentSource = commentSource.replace(/<self>/g, '[]');\n\n\t\treturn {\n\t\t\t'comment': RegExp(commentSource),\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:[^\"]|\"\")*\"(?!\")/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'attribute': [\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/#\\[(?:[^\\[\\](\"]|\"(?:[^\"]|\"\")*\"(?!\")|\\((?!\\*)|<comment>)*\\]/.source.replace(\n\t\t\t\t\t\t\t/<comment>/g,\n\t\t\t\t\t\t\t() => commentSource\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'attr-name',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'comment': RegExp(commentSource),\n\t\t\t\t\t\t'string': {\n\t\t\t\t\t\t\tpattern: /\"(?:[^\"]|\"\")*\"(?!\")/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'operator': /=/,\n\t\t\t\t\t\t'punctuation': /^#\\[|\\]$|[,()]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\\b/,\n\t\t\t\t\talias: 'attr-name',\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\\b/,\n\n\t\t\t'number':\n\t\t\t\t/\\b(?:0x[a-f0-9][a-f0-9_]*(?:\\.[a-f0-9_]+)?(?:p[+-]?\\d[\\d_]*)?|\\d[\\d_]*(?:\\.[\\d_]+)?(?:e[+-]?\\d[\\d_]*)?)\\b/i,\n\n\t\t\t'punct': {\n\t\t\t\tpattern: /@\\{|\\{\\||\\[=|:>/,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'operator':\n\t\t\t\t/\\/\\\\|\\\\\\/|\\.{2,3}|:{1,2}=|\\*\\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\\|[-|]?|[-!%&*+/<=>?@^~']/,\n\t\t\t'punctuation': /\\.\\(|`\\(|@\\{|`\\{|\\{\\||\\[=|:>|[:.,;(){}\\[\\]]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/cpp.js",
    "content": "import { insertBefore } from '../util/language-util.js';\nimport c from './c.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'cpp'>} */\nexport default {\n\tid: 'cpp',\n\trequire: c,\n\toptional: 'opencl-extensions',\n\tgrammar ({ extend, getOptionalLanguage }) {\n\t\tconst keyword =\n\t\t\t/\\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\\b/;\n\t\tconst modName = /\\b(?!<keyword>)\\w+(?:\\s*\\.\\s*\\w+)*\\b/.source.replace(\n\t\t\t/<keyword>/g,\n\t\t\t() => keyword.source\n\t\t);\n\n\t\tconst cpp = extend('c', {\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/(\\b(?:class|concept|enum|struct|typename)\\s+)(?!<keyword>)\\w+/.source.replace(\n\t\t\t\t\t\t\t/<keyword>/g,\n\t\t\t\t\t\t\t() => keyword.source\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t// This is intended to capture the class name of method implementations like:\n\t\t\t\t//   void foo::bar() const {}\n\t\t\t\t// However! The `foo` in the above example could also be a namespace, so we only capture the class name if\n\t\t\t\t// it starts with an uppercase letter. This approximation should give decent results.\n\t\t\t\t/\\b[A-Z]\\w*(?=\\s*::\\s*\\w+\\s*\\()/,\n\t\t\t\t// This will capture the class name before destructors like:\n\t\t\t\t//   Foo::~Foo() {}\n\t\t\t\t/\\b[A-Z_]\\w*(?=\\s*::\\s*~\\w+\\s*\\()/i,\n\t\t\t\t// This also intends to capture the class name of method implementations but here the class has template\n\t\t\t\t// parameters, so it can't be a namespace (until C++ adds generic namespaces).\n\t\t\t\t/\\b\\w+(?=\\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\\s*::\\s*\\w+\\s*\\()/,\n\t\t\t],\n\t\t\t'keyword': keyword,\n\t\t\t'number': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(?:\\b0b[01']+|\\b0x(?:[\\da-f']+(?:\\.[\\da-f']*)?|\\.[\\da-f']+)(?:p[+-]?[\\d']+)?|(?:\\b[\\d']+(?:\\.[\\d']*)?|\\B\\.[\\d']+)(?:e[+-]?[\\d']+)?)[ful]{0,4}/i,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'operator':\n\t\t\t\t/>>=?|<<=?|->|--|\\+\\+|&&|\\|\\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t});\n\n\t\tinsertBefore(cpp, 'string', {\n\t\t\t'module': {\n\t\t\t\t// https://en.cppreference.com/w/cpp/language/modules\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/(\\b(?:import|module)\\s+)/.source +\n\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t// header-name\n\t\t\t\t\t\t/\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|<[^<>\\r\\n]*>/.source +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t// module name or partition or both\n\t\t\t\t\t\t/<mod-name>(?:\\s*:\\s*<mod-name>)?|:\\s*<mod-name>/.source.replace(\n\t\t\t\t\t\t\t/<mod-name>/g,\n\t\t\t\t\t\t\t() => modName\n\t\t\t\t\t\t) +\n\t\t\t\t\t\t')'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'string': /^[<\"][\\s\\S]+/,\n\t\t\t\t\t'operator': /:/,\n\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'raw-string': {\n\t\t\t\tpattern: /R\"([^()\\\\ ]{0,16})\\([\\s\\S]*?\\)\\1\"/,\n\t\t\t\talias: 'string',\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t});\n\n\t\tinsertBefore(cpp, 'keyword', {\n\t\t\t'generic-function': {\n\t\t\t\tpattern: /\\b(?!operator\\b)[a-z_]\\w*\\s*<(?:[^<>]|<[^<>]*>)*>(?=\\s*\\()/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'function': /^\\w+/,\n\t\t\t\t\t'generic': {\n\t\t\t\t\t\tpattern: /<[\\s\\S]+/,\n\t\t\t\t\t\talias: 'class-name',\n\t\t\t\t\t\tinside: 'cpp',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tinsertBefore(cpp, 'operator', {\n\t\t\t'double-colon': {\n\t\t\t\tpattern: /::/,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t});\n\n\t\t/* OpenCL host API */\n\t\tconst extensions = getOptionalLanguage('opencl-extensions');\n\t\tif (extensions) {\n\t\t\tinsertBefore(\n\t\t\t\tcpp,\n\t\t\t\t'keyword',\n\t\t\t\t/** @type {import('../types.d.ts').GrammarTokens} */ (extensions)\n\t\t\t);\n\t\t}\n\n\t\tconst baseInside = { ...cpp };\n\t\tinsertBefore(baseInside, 'double-colon', {\n\t\t\t// All untokenized words that are not namespaces should be class names\n\t\t\t'class-name': /\\b[a-z_]\\w*\\b(?!\\s*::)/i,\n\t\t});\n\n\t\tinsertBefore(cpp, 'class-name', {\n\t\t\t// the base clause is an optional list of parent classes\n\t\t\t// https://en.cppreference.com/w/cpp/language/class\n\t\t\t'base-clause': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(\\b(?:class|struct)\\s+\\w+\\s*:\\s*)[^;{}\"'\\s]+(?:\\s+[^;{}\"'\\s]+)*(?=\\s*[;{])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: baseInside,\n\t\t\t},\n\t\t});\n\n\t\treturn cpp;\n\t},\n};\n"
  },
  {
    "path": "src/languages/crystal.js",
    "content": "import { toArray } from '../util/iterables.js';\nimport ruby from './ruby.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'crystal'>} */\nexport default {\n\tid: 'crystal',\n\tbase: ruby,\n\tgrammar ({ base }) {\n\t\treturn {\n\t\t\t'keyword': [\n\t\t\t\t/\\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\\b/,\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\.\\s*)(?:is_a|responds_to)\\?/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'number':\n\t\t\t\t/\\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\\da-fA-F_]*[\\da-fA-F]|(?:\\d(?:[\\d_]*\\d)?)(?:\\.[\\d_]*\\d)?(?:[eE][+-]?[\\d_]*\\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\\b/,\n\t\t\t'operator': [\n\t\t\t\t/->/,\n\t\t\t\t...toArray(/** @type {import('../types.d.ts').GrammarTokens} */ (base).operator),\n\t\t\t],\n\t\t\t'punctuation': /[(){}[\\].,;\\\\]/,\n\t\t\t$insert: {\n\t\t\t\t'attribute': {\n\t\t\t\t\t$before: 'string-literal',\n\t\t\t\t\tpattern: /@\\[.*?\\]/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\t\tpattern: /^@\\[|\\]$/,\n\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'attribute': {\n\t\t\t\t\t\t\tpattern: /^(\\s*)\\w+/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'class-name',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'args': {\n\t\t\t\t\t\t\tpattern: /\\S(?:[\\s\\S]*\\S)?/,\n\t\t\t\t\t\t\tinside: 'crystal',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'expansion': {\n\t\t\t\t\t$before: 'string-literal',\n\t\t\t\t\tpattern: /\\{(?:\\{.*?\\}|%.*?%)\\}/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'content': {\n\t\t\t\t\t\t\tpattern: /^(\\{.)[\\s\\S]+(?=.\\}$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: 'crystal',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\t\tpattern: /^\\{[\\{%]|[\\}%]\\}$/,\n\t\t\t\t\t\t\talias: 'operator',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'char': {\n\t\t\t\t\t$before: 'string-literal',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/'(?:[^\\\\\\r\\n]{1,2}|\\\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\\{[A-Fa-f0-9]{1,6}\\})))'/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/csharp.js",
    "content": "import clike from './clike.js';\n\n/**\n * Replaces all placeholders \"<<n>>\" of given pattern with the n-th replacement (zero based).\n *\n * Note: This is a simple text based replacement. Be careful when using backreferences!\n *\n * @param pattern the given pattern.\n * @param replacements a list of replacement which can be inserted into the given pattern.\n * @returns the pattern with all placeholders replaced with their corresponding replacements.\n * @example replace(/a<<0>>a/.source, [/b+/.source]) === /a(?:b+)a/.source\n */\nfunction replace (pattern, replacements) {\n\treturn pattern.replace(/<<(\\d+)>>/g, (m, index) => {\n\t\treturn '(?:' + replacements[+index] + ')';\n\t});\n}\nfunction re (pattern, replacements, flags) {\n\treturn RegExp(replace(pattern, replacements), flags || '');\n}\n\n/**\n * Creates a nested pattern where all occurrences of the string `<<self>>` are replaced with the pattern itself.\n */\nfunction nested (pattern, depthLog2) {\n\tfor (let i = 0; i < depthLog2; i++) {\n\t\tpattern = pattern.replace(/<<self>>/g, () => '(?:' + pattern + ')');\n\t}\n\treturn pattern.replace(/<<self>>/g, '[^\\\\s\\\\S]');\n}\n\n/** @type {import('../types.d.ts').LanguageProto<'csharp'>} */\nexport default {\n\tid: 'csharp',\n\tbase: clike,\n\toptional: 'xml-doc',\n\talias: ['cs', 'dotnet'],\n\tgrammar ({ getOptionalLanguage }) {\n\t\t// https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/\n\t\tconst keywordKinds = {\n\t\t\t// keywords which represent a return or variable type\n\t\t\ttype: 'bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void',\n\t\t\t// keywords which are used to declare a type\n\t\t\ttypeDeclaration: 'class enum interface record struct',\n\t\t\t// contextual keywords\n\t\t\t// (\"var\" and \"dynamic\" are missing because they are used like types)\n\t\t\tcontextual:\n\t\t\t\t'add alias and ascending async await by descending from(?=\\\\s*(?:\\\\w|$)) get global group into init(?=\\\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\\\s*{)',\n\t\t\t// all other keywords\n\t\t\tother: 'abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield',\n\t\t};\n\n\t\t// keywords\n\t\tfunction keywordsToPattern (words) {\n\t\t\treturn '\\\\b(?:' + words.trim().replace(/ /g, '|') + ')\\\\b';\n\t\t}\n\t\tconst typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration);\n\t\tconst keywords = RegExp(\n\t\t\tkeywordsToPattern(\n\t\t\t\tkeywordKinds.type +\n\t\t\t\t\t' ' +\n\t\t\t\t\tkeywordKinds.typeDeclaration +\n\t\t\t\t\t' ' +\n\t\t\t\t\tkeywordKinds.contextual +\n\t\t\t\t\t' ' +\n\t\t\t\t\tkeywordKinds.other\n\t\t\t)\n\t\t);\n\t\tconst nonTypeKeywords = keywordsToPattern(\n\t\t\tkeywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other\n\t\t);\n\t\tconst nonContextualKeywords = keywordsToPattern(\n\t\t\tkeywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.other\n\t\t);\n\n\t\t// types\n\t\tconst generic = nested(/<(?:[^<>;=+\\-*/%&|^]|<<self>>)*>/.source, 2); // the idea behind the other forbidden characters is to prevent false positives. Same for tupleElement.\n\t\tconst nestedRound = nested(/\\((?:[^()]|<<self>>)*\\)/.source, 2);\n\t\tconst name = /@?\\b[A-Za-z_]\\w*\\b/.source;\n\t\tconst genericName = replace(/<<0>>(?:\\s*<<1>>)?/.source, [name, generic]);\n\t\tconst identifier = replace(/(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*/.source, [\n\t\t\tnonTypeKeywords,\n\t\t\tgenericName,\n\t\t]);\n\t\tconst array = /\\[\\s*(?:,\\s*)*\\]/.source;\n\t\tconst typeExpressionWithoutTuple = replace(\n\t\t\t/<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?/.source,\n\t\t\t[identifier, array]\n\t\t);\n\t\tconst tupleElement = replace(/[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [\n\t\t\tgeneric,\n\t\t\tnestedRound,\n\t\t\tarray,\n\t\t]);\n\t\tconst tuple = replace(/\\(<<0>>+(?:,<<0>>+)+\\)/.source, [tupleElement]);\n\t\tconst typeExpression = replace(/(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?/.source, [\n\t\t\ttuple,\n\t\t\tidentifier,\n\t\t\tarray,\n\t\t]);\n\n\t\tconst typeInside = {\n\t\t\t'keyword': keywords,\n\t\t\t'punctuation': /[<>()?,.:[\\]]/,\n\t\t};\n\n\t\t// strings & characters\n\t\t// https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#character-literals\n\t\t// https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#string-literals\n\t\tconst character = /'(?:[^\\r\\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'/.source; // simplified pattern\n\t\tconst regularString = /\"(?:\\\\.|[^\\\\\"\\r\\n])*\"/.source;\n\t\tconst verbatimString = /@\"(?:\"\"|\\\\[\\s\\S]|[^\\\\\"])*\"(?!\")/.source;\n\n\t\t// attributes\n\t\tconst regularStringOrCharacter = regularString + '|' + character;\n\t\tconst regularStringCharacterOrComment = replace(\n\t\t\t/\\/(?![*/])|\\/\\/[^\\r\\n]*[\\r\\n]|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|<<0>>/.source,\n\t\t\t[regularStringOrCharacter]\n\t\t);\n\t\tconst roundExpression = nested(\n\t\t\treplace(/[^\"'/()]|<<0>>|\\(<<self>>*\\)/.source, [regularStringCharacterOrComment]),\n\t\t\t2\n\t\t);\n\n\t\t// https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/attributes/#attribute-targets\n\t\tconst attrTarget = /\\b(?:assembly|event|field|method|module|param|property|return|type)\\b/\n\t\t\t.source;\n\t\tconst attr = replace(/<<0>>(?:\\s*\\(<<1>>*\\))?/.source, [identifier, roundExpression]);\n\n\t\t// string interpolation\n\t\tconst formatString = /:[^}\\r\\n]+/.source;\n\t\t// multi line\n\t\tconst mInterpolationRound = nested(\n\t\t\treplace(/[^\"'/()]|<<0>>|\\(<<self>>*\\)/.source, [regularStringCharacterOrComment]),\n\t\t\t2\n\t\t);\n\t\tconst mInterpolation = replace(/\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}/.source, [\n\t\t\tmInterpolationRound,\n\t\t\tformatString,\n\t\t]);\n\t\t// single line\n\t\tconst sInterpolationRound = nested(\n\t\t\treplace(/[^\"'/()]|\\/(?!\\*)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|<<0>>|\\(<<self>>*\\)/.source, [\n\t\t\t\tregularStringOrCharacter,\n\t\t\t]),\n\t\t\t2\n\t\t);\n\t\tconst sInterpolation = replace(/\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}/.source, [\n\t\t\tsInterpolationRound,\n\t\t\tformatString,\n\t\t]);\n\n\t\tfunction createInterpolationInside (interpolation, interpolationRound) {\n\t\t\treturn {\n\t\t\t\t'interpolation': {\n\t\t\t\t\tpattern: re(/((?:^|[^{])(?:\\{\\{)*)<<0>>/.source, [interpolation]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'format-string': {\n\t\t\t\t\t\t\tpattern: re(/(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)/.source, [\n\t\t\t\t\t\t\t\tinterpolationRound,\n\t\t\t\t\t\t\t\tformatString,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'punctuation': /^:/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /^\\{|\\}$/,\n\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\talias: 'language-csharp',\n\t\t\t\t\t\t\tinside: 'csharp',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\tpattern: re(/(^|[^$\\\\])<<0>>/.source, [verbatimString]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: re(/(^|[^@$\\\\])<<0>>/.source, [regularString]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\t// Using static\n\t\t\t\t\t// using static System.Math;\n\t\t\t\t\tpattern: re(/(\\busing\\s+static\\s+)<<0>>(?=\\s*;)/.source, [identifier]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Using alias (type)\n\t\t\t\t\t// using Project = PC.MyCompany.Project;\n\t\t\t\t\tpattern: re(/(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)/.source, [\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttypeExpression,\n\t\t\t\t\t]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Using alias (alias)\n\t\t\t\t\t// using Project = PC.MyCompany.Project;\n\t\t\t\t\tpattern: re(/(\\busing\\s+)<<0>>(?=\\s*=)/.source, [name]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Type declarations\n\t\t\t\t\t// class Foo<A, B>\n\t\t\t\t\t// interface Foo<out A, B>\n\t\t\t\t\tpattern: re(/(\\b<<0>>\\s+)<<1>>/.source, [typeDeclarationKeywords, genericName]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Single catch exception declaration\n\t\t\t\t\t// catch(Foo)\n\t\t\t\t\t// (things like catch(Foo e) is covered by variable declaration)\n\t\t\t\t\tpattern: re(/(\\bcatch\\s*\\(\\s*)<<0>>/.source, [identifier]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Name of the type parameter of generic constraints\n\t\t\t\t\t// where Foo : class\n\t\t\t\t\tpattern: re(/(\\bwhere\\s+)<<0>>/.source, [name]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Casts and checks via as and is.\n\t\t\t\t\t// as Foo<A>, is Bar<B>\n\t\t\t\t\t// (things like if(a is Foo b) is covered by variable declaration)\n\t\t\t\t\tpattern: re(/(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>/.source, [\n\t\t\t\t\t\ttypeExpressionWithoutTuple,\n\t\t\t\t\t]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Variable, field and parameter declaration\n\t\t\t\t\t// (Foo bar, Bar baz, Foo[,,] bay, Foo<Bar, FooBar<Bar>> bax)\n\t\t\t\t\tpattern: re(\n\t\t\t\t\t\t/\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))/\n\t\t\t\t\t\t\t.source,\n\t\t\t\t\t\t[typeExpression, nonContextualKeywords, name]\n\t\t\t\t\t),\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword': keywords,\n\t\t\t// https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#literals\n\t\t\t'number':\n\t\t\t\t/(?:\\b0(?:x[\\da-f_]*[\\da-f]|b[01_]*[01])|(?:\\B\\.\\d+(?:_+\\d+)*|\\b\\d+(?:_+\\d+)*(?:\\.\\d+(?:_+\\d+)*)?)(?:e[-+]?\\d+(?:_+\\d+)*)?)(?:[dflmu]|lu|ul)?\\b/i,\n\t\t\t'operator': />>=?|<<=?|[-=]>|([-+&|])\\1|~|\\?\\?=?|[-+*/%&|^!=<>]=?/,\n\t\t\t'punctuation': /\\?\\.?|::|[{}[\\];(),.:]/,\n\t\t\t$insertBefore: {\n\t\t\t\t'number': {\n\t\t\t\t\t'range': {\n\t\t\t\t\t\tpattern: /\\.\\./,\n\t\t\t\t\t\talias: 'operator',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'punctuation': {\n\t\t\t\t\t'named-parameter': {\n\t\t\t\t\t\tpattern: re(/([(,]\\s*)<<0>>(?=\\s*:)/.source, [name]),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'class-name': {\n\t\t\t\t\t'namespace': {\n\t\t\t\t\t\t// namespace Foo.Bar {}\n\t\t\t\t\t\t// using Foo.Bar;\n\t\t\t\t\t\tpattern: re(\n\t\t\t\t\t\t\t/(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])/.source,\n\t\t\t\t\t\t\t[name]\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'type-expression': {\n\t\t\t\t\t\t// default(Foo), typeof(Foo<Bar>), sizeof(int)\n\t\t\t\t\t\tpattern: re(\n\t\t\t\t\t\t\t/(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))/\n\t\t\t\t\t\t\t\t.source,\n\t\t\t\t\t\t\t[nestedRound]\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'class-name',\n\t\t\t\t\t\tinside: typeInside,\n\t\t\t\t\t},\n\t\t\t\t\t'return-type': {\n\t\t\t\t\t\t// Foo<Bar> ForBar(); Foo IFoo.Bar() => 0\n\t\t\t\t\t\t// int this[int index] => 0; T IReadOnlyList<T>.this[int index] => this[index];\n\t\t\t\t\t\t// int Foo => 0; int Foo { get; set } = 0;\n\t\t\t\t\t\tpattern: re(\n\t\t\t\t\t\t\t/<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))/.source,\n\t\t\t\t\t\t\t[typeExpression, identifier]\n\t\t\t\t\t\t),\n\t\t\t\t\t\tinside: typeInside,\n\t\t\t\t\t\talias: 'class-name',\n\t\t\t\t\t},\n\t\t\t\t\t'constructor-invocation': {\n\t\t\t\t\t\t// new List<Foo<Bar[]>> { }\n\t\t\t\t\t\tpattern: re(/(\\bnew\\s+)<<0>>(?=\\s*[[({])/.source, [typeExpression]),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: typeInside,\n\t\t\t\t\t\talias: 'class-name',\n\t\t\t\t\t},\n\t\t\t\t\t/*'explicit-implementation': {\n\t\t\t\t\t// int IFoo<Foo>.Bar => 0; void IFoo<Foo<Foo>>.Foo<T>();\n\t\t\t\t\tpattern: replace(/\\b<<0>>(?=\\.<<1>>)/, className, methodOrPropertyDeclaration),\n\t\t\t\t\tinside: classNameInside,\n\t\t\t\t\talias: 'class-name'\n\t\t\t\t},*/\n\t\t\t\t\t'generic-method': {\n\t\t\t\t\t\t// foo<Bar>()\n\t\t\t\t\t\tpattern: re(/<<0>>\\s*<<1>>(?=\\s*\\()/.source, [name, generic]),\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'function': re(/^<<0>>/.source, [name]),\n\t\t\t\t\t\t\t'generic': {\n\t\t\t\t\t\t\t\tpattern: RegExp(generic),\n\t\t\t\t\t\t\t\talias: 'class-name',\n\t\t\t\t\t\t\t\tinside: typeInside,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'type-list': {\n\t\t\t\t\t\t// The list of types inherited or of generic constraints\n\t\t\t\t\t\t// class Foo<F> : Bar, IList<FooBar>\n\t\t\t\t\t\t// where F : Bar, IList<int>\n\t\t\t\t\t\tpattern: re(\n\t\t\t\t\t\t\t/\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))/\n\t\t\t\t\t\t\t\t.source,\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\ttypeDeclarationKeywords,\n\t\t\t\t\t\t\t\tgenericName,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\ttypeExpression,\n\t\t\t\t\t\t\t\tkeywords.source,\n\t\t\t\t\t\t\t\tnestedRound,\n\t\t\t\t\t\t\t\t/\\bnew\\s*\\(\\s*\\)/.source,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'record-arguments': {\n\t\t\t\t\t\t\t\tpattern: re(/(^(?!new\\s*\\()<<0>>\\s*)<<1>>/.source, [\n\t\t\t\t\t\t\t\t\tgenericName,\n\t\t\t\t\t\t\t\t\tnestedRound,\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\t\tinside: 'csharp',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'keyword': keywords,\n\t\t\t\t\t\t\t'class-name': {\n\t\t\t\t\t\t\t\tpattern: RegExp(typeExpression),\n\t\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\t\tinside: typeInside,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'punctuation': /[,()]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'preprocessor': {\n\t\t\t\t\t\tpattern: /(^[\\t ]*)#.*/m,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'property',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t// highlight preprocessor directives as keywords\n\t\t\t\t\t\t\t'directive': {\n\t\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t\t/(#)\\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\\b/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'attribute': {\n\t\t\t\t\t\t// Attributes\n\t\t\t\t\t\t// [Foo], [Foo(1), Bar(2, Prop = \"foo\")], [return: Foo(1), Bar(2)], [assembly: Foo(Bar)]\n\t\t\t\t\t\tpattern: re(\n\t\t\t\t\t\t\t/((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])/\n\t\t\t\t\t\t\t\t.source,\n\t\t\t\t\t\t\t[attrTarget, attr]\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'target': {\n\t\t\t\t\t\t\t\tpattern: re(/^<<0>>(?=\\s*:)/.source, [attrTarget]),\n\t\t\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'attribute-arguments': {\n\t\t\t\t\t\t\t\tpattern: re(/\\(<<0>>*\\)/.source, [roundExpression]),\n\t\t\t\t\t\t\t\tinside: 'csharp',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'class-name': {\n\t\t\t\t\t\t\t\tpattern: RegExp(identifier),\n\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'punctuation': /[:,]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'string': {\n\t\t\t\t\t'interpolation-string': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: re(\n\t\t\t\t\t\t\t\t/(^|[^\\\\])(?:\\$@|@\\$)\"(?:\"\"|\\\\[\\s\\S]|\\{\\{|<<0>>|[^\\\\{\"])*\"/.source,\n\t\t\t\t\t\t\t\t[mInterpolation]\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: createInterpolationInside(mInterpolation, mInterpolationRound),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: re(/(^|[^@\\\\])\\$\"(?:\\\\.|\\{\\{|<<0>>|[^\\\\\"{])*\"/.source, [\n\t\t\t\t\t\t\t\tsInterpolation,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: createInterpolationInside(sInterpolation, sInterpolationRound),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'char': {\n\t\t\t\t\t\tpattern: RegExp(character),\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'comment': {\n\t\t\t\t\t'doc-comment': /** @type {import('../types.d.ts').GrammarTokens} */ (\n\t\t\t\t\t\tgetOptionalLanguage('xml-doc')\n\t\t\t\t\t)?.slash,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/cshtml.js",
    "content": "import { insertBefore } from '../util/language-util.js';\nimport csharp from './csharp.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'cshtml'>} */\nexport default {\n\tid: 'cshtml',\n\tbase: markup,\n\trequire: csharp,\n\talias: 'razor',\n\tgrammar ({ extend }) {\n\t\t// Docs:\n\t\t// https://docs.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-5.0&tabs=visual-studio\n\t\t// https://docs.microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-5.0\n\n\t\tconst commentLike = /\\/(?![/*])|\\/\\/.*[\\r\\n]|\\/\\*[^*]*(?:\\*(?!\\/)[^*]*)*\\*\\//.source;\n\t\tconst stringLike =\n\t\t\t/@(?!\")|\"(?:[^\\r\\n\\\\\"]|\\\\.)*\"|@\"(?:[^\\\\\"]|\"\"|\\\\[\\s\\S])*\"(?!\")/.source +\n\t\t\t'|' +\n\t\t\t/'(?:(?:[^\\r\\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!')))/.source;\n\n\t\t/**\n\t\t * Creates a nested pattern where all occurrences of the string `<<self>>` are replaced with the pattern itself.\n\t\t *\n\t\t * @param {string} pattern\n\t\t * @param {number} depthLog2\n\t\t */\n\t\tfunction nested (pattern, depthLog2) {\n\t\t\tfor (let i = 0; i < depthLog2; i++) {\n\t\t\t\tpattern = pattern.replace(/<self>/g, () => '(?:' + pattern + ')');\n\t\t\t}\n\t\t\treturn pattern\n\t\t\t\t.replace(/<self>/g, '[^\\\\s\\\\S]')\n\t\t\t\t.replace(/<str>/g, '(?:' + stringLike + ')')\n\t\t\t\t.replace(/<comment>/g, '(?:' + commentLike + ')');\n\t\t}\n\n\t\tconst round = nested(/\\((?:[^()'\"@/]|<str>|<comment>|<self>)*\\)/.source, 2);\n\t\tconst square = nested(/\\[(?:[^\\[\\]'\"@/]|<str>|<comment>|<self>)*\\]/.source, 1);\n\t\tconst curly = nested(/\\{(?:[^{}'\"@/]|<str>|<comment>|<self>)*\\}/.source, 2);\n\t\tconst angle = nested(/<(?:[^<>'\"@/]|<comment>|<self>)*>/.source, 1);\n\n\t\tconst inlineCs =\n\t\t\t/@/.source +\n\t\t\t/(?:await\\b\\s*)?/.source +\n\t\t\t'(?:' +\n\t\t\t/(?!await\\b)\\w+\\b/.source +\n\t\t\t'|' +\n\t\t\tround +\n\t\t\t')' +\n\t\t\t'(?:' +\n\t\t\t/[?!]?\\.\\w+\\b/.source +\n\t\t\t'|' +\n\t\t\t'(?:' +\n\t\t\tangle +\n\t\t\t')?' +\n\t\t\tround +\n\t\t\t'|' +\n\t\t\tsquare +\n\t\t\t')*' +\n\t\t\t/(?![?!\\.(\\[]|<(?!\\/))/.source;\n\n\t\t// Note about the above bracket patterns:\n\t\t// They all ignore HTML expressions that might be in the C# code. This is a problem because HTML (like strings and\n\t\t// comments) is parsed differently. This is a huge problem because HTML might contain brackets and quotes which\n\t\t// messes up the bracket and string counting implemented by the above patterns.\n\t\t//\n\t\t// This problem is not fixable because 1) HTML expression are highly context sensitive and very difficult to detect\n\t\t// and 2) they require one capturing group at every nested level. See the `tagRegion` pattern to admire the\n\t\t// complexity of an HTML expression.\n\t\t//\n\t\t// To somewhat alleviate the problem a bit, the patterns for characters (e.g. 'a') is very permissive, it also\n\t\t// allows invalid characters to support HTML expressions like this: <p>That's it!</p>.\n\n\t\tconst tagAttrInlineCs = /@(?![\\w()])/.source + '|' + inlineCs;\n\t\tconst tagAttrValue =\n\t\t\t'(?:' +\n\t\t\t/\"[^\"@]*\"|'[^'@]*'|[^\\s'\"@>=]+(?=[\\s>])/.source +\n\t\t\t'|' +\n\t\t\t'[\"\\'][^\"\\'@]*(?:(?:' +\n\t\t\ttagAttrInlineCs +\n\t\t\t')[^\"\\'@]*)+[\"\\']' +\n\t\t\t')';\n\n\t\tconst tagAttrs =\n\t\t\t/(?:\\s(?:\\s*[^\\s>\\/=]+(?:\\s*=\\s*<tagAttrValue>|(?=[\\s/>])))+)?/.source.replace(\n\t\t\t\t/<tagAttrValue>/,\n\t\t\t\ttagAttrValue\n\t\t\t);\n\t\tconst tagContent = /(?!\\d)[^\\s>\\/=$<%]+/.source + tagAttrs + /\\s*\\/?>/.source;\n\t\tconst tagRegion =\n\t\t\t/\\B@?/.source +\n\t\t\t'(?:' +\n\t\t\t/<([a-zA-Z][\\w:]*)/.source +\n\t\t\ttagAttrs +\n\t\t\t/\\s*>/.source +\n\t\t\t'(?:' +\n\t\t\t(/[^<]/.source +\n\t\t\t\t'|' +\n\t\t\t\t// all tags that are not the start tag\n\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\t/<\\/?(?!\\1\\b)/.source + // eslint-disable-line regexp/strict\n\t\t\t\ttagContent +\n\t\t\t\t'|' +\n\t\t\t\t// nested start tag\n\t\t\t\tnested(\n\t\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\t\t/<\\1/.source + // eslint-disable-line regexp/strict\n\t\t\t\t\t\ttagAttrs +\n\t\t\t\t\t\t/\\s*>/.source +\n\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t(/[^<]/.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// all tags that are not the start tag\n\t\t\t\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\t\t\t\t/<\\/?(?!\\1\\b)/.source + // eslint-disable-line regexp/strict\n\t\t\t\t\t\t\ttagContent +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t'<self>') +\n\t\t\t\t\t\t')*' +\n\t\t\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\t\t\t/<\\/\\1\\s*>/.source, // eslint-disable-line regexp/strict\n\t\t\t\t\t2\n\t\t\t\t)) +\n\t\t\t')*' +\n\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t/<\\/\\1\\s*>/.source + // eslint-disable-line regexp/strict\n\t\t\t'|' +\n\t\t\t/</.source +\n\t\t\ttagContent +\n\t\t\t')';\n\n\t\t// Now for the actual language definition(s):\n\t\t//\n\t\t// Razor as a language has 2 parts:\n\t\t//  1) CSHTML: A markup-like language that has been extended with inline C# code expressions and blocks.\n\t\t//  2) C#+HTML: A variant of C# that can contain CSHTML tags as expressions.\n\t\t//\n\t\t// In the below code, both CSHTML and C#+HTML will be create as separate language definitions that reference each\n\t\t// other. However, only CSHTML will be exported via `Prism.languages`.\n\n\t\tconst csharpWithHtml = extend('csharp', {});\n\t\tinsertBefore(csharpWithHtml, 'string', {\n\t\t\t'html': {\n\t\t\t\tpattern: RegExp(tagRegion),\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: 'cshtml',\n\t\t\t},\n\t\t});\n\n\t\tconst cs = {\n\t\t\tpattern: /\\S[\\s\\S]*/,\n\t\t\talias: 'language-csharp',\n\t\t\tinside: csharpWithHtml,\n\t\t};\n\n\t\tconst inlineValue = {\n\t\t\tpattern: RegExp(/(^|[^@])/.source + inlineCs),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\talias: 'variable',\n\t\t\tinside: {\n\t\t\t\t'keyword': /^@/,\n\t\t\t\t'csharp': cs,\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t$merge: {\n\t\t\t\t'tag': {\n\t\t\t\t\tpattern: RegExp(/<\\/?/.source + tagContent),\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'attr-value': {\n\t\t\t\t\t\t\tpattern: RegExp(/=\\s*/.source + tagAttrValue),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'tag/attr-value/punctuation': {\n\t\t\t\t\t'value': inlineValue,\n\t\t\t\t},\n\t\t\t\t'prolog': {\n\t\t\t\t\t'razor-comment': {\n\t\t\t\t\t\tpattern: /@\\*[\\s\\S]*?\\*@/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\talias: 'comment',\n\t\t\t\t\t},\n\n\t\t\t\t\t'block': {\n\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t/(^|[^@])@/.source +\n\t\t\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t// @{ ... }\n\t\t\t\t\t\t\t\t\tcurly,\n\t\t\t\t\t\t\t\t\t// @code{ ... }\n\t\t\t\t\t\t\t\t\t/(?:code|functions)\\s*/.source + curly,\n\t\t\t\t\t\t\t\t\t// @for (...) { ... }\n\t\t\t\t\t\t\t\t\t/(?:for|foreach|lock|switch|using|while)\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tround +\n\t\t\t\t\t\t\t\t\t\t/\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tcurly,\n\t\t\t\t\t\t\t\t\t// @do { ... } while (...);\n\t\t\t\t\t\t\t\t\t/do\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tcurly +\n\t\t\t\t\t\t\t\t\t\t/\\s*while\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tround +\n\t\t\t\t\t\t\t\t\t\t/(?:\\s*;)?/.source,\n\t\t\t\t\t\t\t\t\t// @try { ... } catch (...) { ... } finally { ... }\n\t\t\t\t\t\t\t\t\t/try\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tcurly +\n\t\t\t\t\t\t\t\t\t\t/\\s*catch\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tround +\n\t\t\t\t\t\t\t\t\t\t/\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tcurly +\n\t\t\t\t\t\t\t\t\t\t/\\s*finally\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tcurly,\n\t\t\t\t\t\t\t\t\t// @if (...) {...} else if (...) {...} else {...}\n\t\t\t\t\t\t\t\t\t/if\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tround +\n\t\t\t\t\t\t\t\t\t\t/\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tcurly +\n\t\t\t\t\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t\t\t\t\t/\\s*else/.source +\n\t\t\t\t\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t\t\t\t\t/\\s+if\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tround +\n\t\t\t\t\t\t\t\t\t\t')?' +\n\t\t\t\t\t\t\t\t\t\t/\\s*/.source +\n\t\t\t\t\t\t\t\t\t\tcurly +\n\t\t\t\t\t\t\t\t\t\t')*',\n\t\t\t\t\t\t\t\t\t// @helper Ident(params) { ... }\n\t\t\t\t\t\t\t\t\t/helper\\s+\\w+\\s*/.source + round + /\\s*/.source + curly,\n\t\t\t\t\t\t\t\t].join('|') +\n\t\t\t\t\t\t\t\t')'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'keyword': /^@\\w*/,\n\t\t\t\t\t\t\t'csharp': cs,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\n\t\t\t\t\t'directive': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/^([ \\t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\\s).*/m,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'keyword': /^@\\w+/,\n\t\t\t\t\t\t\t'csharp': cs,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\n\t\t\t\t\t'value': inlineValue,\n\n\t\t\t\t\t'delegate-operator': {\n\t\t\t\t\t\tpattern: /(^|[^@])@(?=<)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'operator',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/csp.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'csp'>} */\nexport default {\n\tid: 'csp',\n\tgrammar () {\n\t\t/**\n\t\t * Original by Scott Helme.\n\t\t *\n\t\t * Reference: https://scotthelme.co.uk/csp-cheat-sheet/\n\t\t *\n\t\t * Supports the following:\n\t\t *  - https://www.w3.org/TR/CSP1/\n\t\t *  - https://www.w3.org/TR/CSP2/\n\t\t *  - https://www.w3.org/TR/CSP3/\n\t\t */\n\n\t\t/**\n\t\t * @param {string} source\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction value (source) {\n\t\t\treturn RegExp(/([ \\t])/.source + '(?:' + source + ')' + /(?=[\\s;]|$)/.source, 'i');\n\t\t}\n\n\t\treturn {\n\t\t\t'directive': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[\\s;])(?:base-uri|block-all-mixed-content|(?:child|connect|default|font|frame|img|manifest|media|object|prefetch|script|style|worker)-src|disown-opener|form-action|frame-(?:ancestors|options)|input-protection(?:-(?:clip|selectors))?|navigate-to|plugin-types|policy-uri|referrer|reflected-xss|report-(?:to|uri)|require-sri-for|sandbox|(?:script|style)-src-(?:attr|elem)|upgrade-insecure-requests)(?=[\\s;]|$)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'property',\n\t\t\t},\n\t\t\t'scheme': {\n\t\t\t\tpattern: value(/[a-z][a-z0-9.+-]*:/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'none': {\n\t\t\t\tpattern: value(/'none'/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'nonce': {\n\t\t\t\tpattern: value(/'nonce-[-+/\\w=]+'/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t\t'hash': {\n\t\t\t\tpattern: value(/'sha(?:256|384|512)-[-+/\\w=]+'/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t\t'host': {\n\t\t\t\tpattern: value(\n\t\t\t\t\t/[a-z][a-z0-9.+-]*:\\/\\/[^\\s;,']*/.source +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t/\\*[^\\s;,']*/.source +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t/[a-z0-9-]+(?:\\.[a-z0-9-]+)+(?::[\\d*]+)?(?:\\/[^\\s;,']*)?/.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'url',\n\t\t\t\tinside: {\n\t\t\t\t\t'important': /\\*/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'keyword': [\n\t\t\t\t{\n\t\t\t\t\tpattern: value(/'unsafe-[a-z-]+'/.source),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'unsafe',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: value(/'[a-z-]+'/.source),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'safe',\n\t\t\t\t},\n\t\t\t],\n\t\t\t'punctuation': /;/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/css-extras.js",
    "content": "import cssSelector from './css-selector.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'css-extras'>} */\nexport default {\n\tid: 'css-extras',\n\trequire: cssSelector,\n\tgrammar () {\n\t\tconst unit = {\n\t\t\tpattern: /(\\b\\d+)(?:%|[a-z]+(?![\\w-]))/,\n\t\t\tlookbehind: true,\n\t\t};\n\t\t// 123 -123 .123 -.123 12.3 -12.3\n\t\tconst number = {\n\t\t\tpattern: /(^|[^\\w.-])-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)/,\n\t\t\tlookbehind: true,\n\t\t};\n\n\t\treturn {\n\t\t\t'operator': {\n\t\t\t\tpattern: /(\\s)[+\\-*\\/](?=\\s)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t// CAREFUL!\n\t\t\t// Previewers and Inline color use hexcode and color.\n\t\t\t'hexcode': {\n\t\t\t\tpattern: /\\B#[\\da-f]{3,8}\\b/i,\n\t\t\t\talias: 'color',\n\t\t\t},\n\t\t\t'color': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^\\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\\w-])/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b(?:hsl|rgb)\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%?\\s*,\\s*\\d{1,3}%?\\s*\\)\\B|\\b(?:hsl|rgb)a\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%?\\s*,\\s*\\d{1,3}%?\\s*,\\s*(?:0|0?\\.\\d+|1)\\s*\\)\\B/i,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'unit': unit,\n\t\t\t\t\t\t'number': number,\n\t\t\t\t\t\t'function': /[\\w-]+(?=\\()/,\n\t\t\t\t\t\t'punctuation': /[(),]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t// it's important that there is no boundary assertion after the hex digits\n\t\t\t'entity': /\\\\[\\da-f]{1,8}/i,\n\t\t\t'unit': unit,\n\t\t\t'number': number,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/css-selector.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'css-selector'>} */\nexport default {\n\tid: 'css-selector',\n\tgrammar () {\n\t\tconst string =\n\t\t\t/(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/;\n\n\t\treturn {\n\t\t\t'pseudo-element': /:(?:after|before|first-letter|first-line|selection)|::[-\\w]+/,\n\t\t\t'pseudo-class': /:[-\\w]+/,\n\t\t\t'class': /\\.[-\\w]+/,\n\t\t\t'id': /#[-\\w]+/,\n\t\t\t'attribute': {\n\t\t\t\tpattern: RegExp('\\\\[(?:[^[\\\\]\"\\']|' + string.source + ')*\\\\]'),\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^\\[|\\]$/,\n\t\t\t\t\t'case-sensitivity': {\n\t\t\t\t\t\tpattern: /(\\s)[si]$/i,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t'namespace': {\n\t\t\t\t\t\tpattern: /^(\\s*)(?:(?!\\s)[-*\\w\\xA0-\\uFFFF])*\\|(?!=)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /\\|$/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'attr-name': {\n\t\t\t\t\t\tpattern: /^(\\s*)(?:(?!\\s)[-\\w\\xA0-\\uFFFF])+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'attr-value': [\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /(=\\s*)(?:(?!\\s)[-\\w\\xA0-\\uFFFF])+(?=\\s*$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'operator': /[|~*^$]?=/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'n-th': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\(\\s*)[+-]?\\d*[\\dn](?:\\s*[+-]\\s*\\d+)?(?=\\s*\\))/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'number': /[\\dn]+/,\n\t\t\t\t\t\t'operator': /[+-]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\(\\s*)(?:even|odd)(?=\\s*\\))/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'combinator': />|\\+|~|\\|\\|/,\n\n\t\t\t// the `tag` token has been existed and removed.\n\t\t\t// because we can't find a perfect tokenize to match it.\n\t\t\t// if you want to add it, please read https://github.com/PrismJS/prism/pull/2373 first.\n\n\t\t\t'punctuation': /[(),]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/css.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'css'>} */\nexport default {\n\tid: 'css',\n\toptional: 'css-extras',\n\tgrammar ({ getOptionalLanguage }) {\n\t\tconst string =\n\t\t\t/(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/;\n\n\t\treturn {\n\t\t\t'comment': /\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t'atrule': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t'@[\\\\w-](?:' +\n\t\t\t\t\t\t/[^;{\\s\"']|\\s+(?!\\s)/.source +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\tstring.source +\n\t\t\t\t\t\t')*?' +\n\t\t\t\t\t\t/(?:;|(?=\\s*\\{))/.source\n\t\t\t\t),\n\t\t\t\tinside: {\n\t\t\t\t\t'rule': /^@[\\w-]+/,\n\t\t\t\t\t'selector-function-argument': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/(\\bselector\\s*\\(\\s*(?![\\s)]))(?:[^()\\s]|\\s+(?![\\s)])|\\((?:[^()]|\\([^()]*\\))*\\))+(?=\\s*\\))/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'selector',\n\t\t\t\t\t\tinside: 'css-selector',\n\t\t\t\t\t},\n\t\t\t\t\t'keyword': {\n\t\t\t\t\t\tpattern: /(^|[^\\w-])(?:and|not|only|or)(?![\\w-])/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t$rest: 'css',\n\t\t\t\t},\n\t\t\t},\n\t\t\t'url': {\n\t\t\t\t// https://drafts.csswg.org/css-values-3/#urls\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t'\\\\burl\\\\((?:' +\n\t\t\t\t\t\tstring.source +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t/(?:[^\\\\\\r\\n()\"']|\\\\[\\s\\S])*/.source +\n\t\t\t\t\t\t')\\\\)',\n\t\t\t\t\t'i'\n\t\t\t\t),\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'function': /^url/i,\n\t\t\t\t\t'punctuation': /^\\(|\\)$/,\n\t\t\t\t\t'string': {\n\t\t\t\t\t\tpattern: RegExp('^' + string.source + '$'),\n\t\t\t\t\t\talias: 'url',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'selector': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t'(^|[{}\\\\s])[^{}\\\\s](?:[^{};\"\\'\\\\s]|\\\\s+(?![\\\\s{])|' +\n\t\t\t\t\t\tstring.source +\n\t\t\t\t\t\t')*(?=\\\\s*\\\\{)'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: 'css-selector',\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: string,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'variable': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^-\\w\\xA0-\\uFFFF])--(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'property': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^-\\w\\xA0-\\uFFFF])(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*(?=\\s*:)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'important': /!important\\b/i,\n\t\t\t'function': {\n\t\t\t\tpattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\\()/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'punctuation': /[(){};:,]/,\n\t\t\t$insertBefore: {\n\t\t\t\t'function': /** @type {import('../types.d.ts').GrammarTokens} */ (\n\t\t\t\t\tgetOptionalLanguage('css-extras')\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/csv.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'csv'>} */\nexport default {\n\tid: 'csv',\n\tgrammar () {\n\t\t// https://tools.ietf.org/html/rfc4180\n\n\t\treturn {\n\t\t\t'value': /[^\\r\\n,\"]+|\"(?:[^\"]|\"\")*\"(?!\")/,\n\t\t\t'punctuation': /,/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/cue.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'cue'>} */\nexport default {\n\tid: 'cue',\n\tgrammar () {\n\t\t// https://cuelang.org/docs/references/spec/\n\n\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\tconst stringEscape = /\\\\(?:(?!\\2)|\\2(?:[^()\\r\\n]|\\([^()]*\\)))/.source; // eslint-disable-line regexp/strict\n\t\tconst stringTypes =\n\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t/\"\"\"(?:[^\\\\\"]|\"(?!\"\"\\2)|<esc>)*\"\"\"/.source + // eslint-disable-line regexp/strict\n\t\t\t'|' +\n\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t/'''(?:[^\\\\']|'(?!''\\2)|<esc>)*'''/.source + // eslint-disable-line regexp/strict\n\t\t\t'|' +\n\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t/\"(?:[^\\\\\\r\\n\"]|\"(?!\\2)|<esc>)*\"/.source + // eslint-disable-line regexp/strict\n\t\t\t'|' +\n\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t/'(?:[^\\\\\\r\\n']|'(?!\\2)|<esc>)*'/.source; // eslint-disable-line regexp/strict\n\t\tconst stringLiteral = '(?:' + stringTypes.replace(/<esc>/g, stringEscape) + ')';\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\/.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string-literal': {\n\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\tpattern: RegExp(/(^|[^#\"'\\\\])(#*)/.source + stringLiteral + /(?![\"'])\\2/.source), // eslint-disable-line regexp/strict\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t// I'm using dirty hack here. We have to know the number hashes at the start of the string somehow,\n\t\t\t\t\t// but we can't look back. So instead, we will use a lookahead, go to the end of the string, and\n\t\t\t\t\t// capture the hashes at the end of the string.\n\t\t\t\t\t'escape': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/(?=[\\s\\S]*[\"'](#*)$)\\\\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\\d{2,3}|[^(])/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t},\n\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\tpattern: /(?=[\\s\\S]*[\"'](#*)$)\\\\\\1\\([^()]*\\)/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /^\\\\#*\\(|\\)$/,\n\t\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\tinside: 'cue',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'keyword': {\n\t\t\t\tpattern: /(^|[^\\w$])(?:for|if|import|in|let|null|package)(?![\\w$])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'boolean': {\n\t\t\t\tpattern: /(^|[^\\w$])(?:false|true)(?![\\w$])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'builtin': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\\w$])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'attribute': {\n\t\t\t\tpattern: /@[\\w$]+(?=\\s*\\()/,\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'function': {\n\t\t\t\tpattern: /(^|[^\\w$])[a-z_$][\\w$]*(?=\\s*\\()/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'number': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[eE][+-]?\\d+(?:_\\d+)*)?(?:[KMGTP]i?)?)(?![\\w$])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'operator': /\\.{3}|_\\|_|&&?|\\|\\|?|[=!]~|[<>=!]=?|[+\\-*/?]/,\n\t\t\t'punctuation': /[()[\\]{},.:]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/cypher.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'cypher'>} */\nexport default {\n\tid: 'cypher',\n\tgrammar: {\n\t\t// https://neo4j.com/docs/cypher-manual/current/syntax/comments/\n\t\t'comment': /\\/\\/.*/,\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"|'(?:[^'\\\\\\r\\n]|\\\\.)*'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'class-name': {\n\t\t\tpattern: /(:\\s*)(?:\\w+|`(?:[^`\\\\\\r\\n])*`)(?=\\s*[{):])/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'relationship': {\n\t\t\tpattern:\n\t\t\t\t/(-\\[\\s*(?:\\w+\\s*|`(?:[^`\\\\\\r\\n])*`\\s*)?:\\s*|\\|\\s*:\\s*)(?:\\w+|`(?:[^`\\\\\\r\\n])*`)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\talias: 'property',\n\t\t},\n\t\t'identifier': {\n\t\t\tpattern: /`(?:[^`\\\\\\r\\n])*`/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'variable': /\\$\\w+/,\n\n\t\t// https://neo4j.com/docs/cypher-manual/current/syntax/reserved/\n\t\t'keyword':\n\t\t\t/\\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\\b/i,\n\n\t\t'function': /\\b\\w+\\b(?=\\s*\\()/,\n\n\t\t'boolean': /\\b(?:false|null|true)\\b/i,\n\t\t'number': /\\b(?:0x[\\da-fA-F]+|\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)\\b/,\n\t\t// https://neo4j.com/docs/cypher-manual/current/syntax/operators/\n\t\t'operator': /:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\\.\\.\\.?/,\n\t\t'punctuation': /[()[\\]{},;.]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/d.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'d'>} */\nexport default {\n\tid: 'd',\n\tbase: clike,\n\tgrammar () {\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\t// Shebang\n\t\t\t\t\tpattern: /^\\s*#!.+/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/(^|[^\\\\])/.source +\n\t\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t// /+ comment +/\n\t\t\t\t\t\t\t\t// Allow one level of nesting\n\t\t\t\t\t\t\t\t/\\/\\+(?:\\/\\+(?:[^+]|\\+(?!\\/))*\\+\\/|(?!\\/\\+)[\\s\\S])*?\\+\\//.source,\n\t\t\t\t\t\t\t\t// // comment\n\t\t\t\t\t\t\t\t/\\/\\/.*/.source,\n\t\t\t\t\t\t\t\t// /* comment */\n\t\t\t\t\t\t\t\t/\\/\\*[\\s\\S]*?\\*\\//.source,\n\t\t\t\t\t\t\t].join('|') +\n\t\t\t\t\t\t\t')'\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t// r\"\", x\"\"\n\t\t\t\t\t\t\t/\\b[rx]\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"[cwd]?/.source,\n\n\t\t\t\t\t\t\t// q\"[]\", q\"()\", q\"<>\", q\"{}\"\n\t\t\t\t\t\t\t/\\bq\"(?:\\[[\\s\\S]*?\\]|\\([\\s\\S]*?\\)|<[\\s\\S]*?>|\\{[\\s\\S]*?\\})\"/.source,\n\n\t\t\t\t\t\t\t// q\"IDENT\n\t\t\t\t\t\t\t// ...\n\t\t\t\t\t\t\t// IDENT\"\n\t\t\t\t\t\t\t/\\bq\"((?!\\d)\\w+)$[\\s\\S]*?^\\1\"/.source,\n\n\t\t\t\t\t\t\t// q\"//\", q\"||\", etc.\n\t\t\t\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\t\t\t\t/\\bq\"(.)[\\s\\S]*?\\2\"/.source, // eslint-disable-line regexp/strict\n\n\t\t\t\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\t\t\t\t/([\"`])(?:\\\\[\\s\\S]|(?!\\3)[^\\\\])*\\3[cwd]?/.source, // eslint-disable-line regexp/strict\n\t\t\t\t\t\t].join('|'),\n\t\t\t\t\t\t'm'\n\t\t\t\t\t),\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\bq\\{(?:\\{[^{}]*\\}|[^{}])*\\}/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'token-string',\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t// In order: $, keywords and special tokens, globally defined symbols\n\t\t\t'keyword':\n\t\t\t\t/\\$|\\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIME|TIMESTAMP|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\\b/,\n\n\t\t\t'number': [\n\t\t\t\t// The lookbehind and the negative look-ahead try to prevent bad highlighting of the .. operator\n\t\t\t\t// Hexadecimal numbers must be handled separately to avoid problems with exponent \"e\"\n\t\t\t\t/\\b0x\\.?[a-f\\d_]+(?:(?!\\.\\.)\\.[a-f\\d_]*)?(?:p[+-]?[a-f\\d_]+)?[ulfi]{0,4}/i,\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:\\.\\.)?)(?:\\b0b\\.?|\\b|\\.)\\d[\\d_]*(?:(?!\\.\\.)\\.[\\d_]*)?(?:e[+-]?\\d[\\d_]*)?[ulfi]{0,4}/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t'operator':\n\t\t\t\t/\\|[|=]?|&[&=]?|\\+[+=]?|-[-=]?|\\.?\\.\\.|=[>=]?|!(?:i[ns]\\b|<>?=?|>=?|=)?|\\bi[ns]\\b|(?:<[<>]?|>>?>?|\\^\\^|[*\\/%^~])=?/,\n\n\t\t\t$insertBefore: {\n\t\t\t\t'string': {\n\t\t\t\t\t// Characters\n\t\t\t\t\t// 'a', '\\\\', '\\n', '\\xFF', '\\377', '\\uFFFF', '\\U0010FFFF', '\\quot'\n\t\t\t\t\t'char': /'(?:\\\\(?:\\W|\\w+)|[^\\\\])'/,\n\t\t\t\t},\n\t\t\t\t'keyword': {\n\t\t\t\t\t'property': /\\B@\\w*/,\n\t\t\t\t},\n\t\t\t\t'function': {\n\t\t\t\t\t'register': {\n\t\t\t\t\t\t// Iasm registers\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/\\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|CR[0234]|[ECSDGF]S|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\\d))\\b|\\bST(?:\\([0-7]\\)|\\b)/,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/dart.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'dart'>} */\nexport default {\n\tid: 'dart',\n\tbase: clike,\n\tgrammar () {\n\t\tconst keywords = [\n\t\t\t/\\b(?:async|sync|yield)\\*/,\n\t\t\t/\\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\\b/,\n\t\t];\n\n\t\t// Handles named imports, such as http.Client\n\t\tconst packagePrefix = /(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*/.source;\n\n\t\t// based on the dart naming conventions\n\t\tconst className = {\n\t\t\tpattern: RegExp(packagePrefix + /[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b/.source),\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'namespace': {\n\t\t\t\t\tpattern: /^[a-z]\\w*(?:\\s*\\.\\s*[a-z]\\w*)*(?:\\s*\\.)?/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'class-name': [\n\t\t\t\tclassName,\n\t\t\t\t{\n\t\t\t\t\t// variables and parameters\n\t\t\t\t\t// this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods)\n\t\t\t\t\tpattern: RegExp(packagePrefix + /[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])/.source),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: className.inside,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword': keywords,\n\t\t\t'operator':\n\t\t\t\t/\\bis!|\\b(?:as|is)\\b|\\+\\+|--|&&|\\|\\||<<=?|>>=?|~(?:\\/=?)?|[+\\-*\\/%&^|=!<>]=?|\\?/,\n\t\t\t$insertBefore: {\n\t\t\t\t'string': {\n\t\t\t\t\t'string-literal': {\n\t\t\t\t\t\tpattern: /r?(?:(\"\"\"|''')[\\s\\S]*?\\1|([\"'])(?:\\\\.|(?!\\2)[^\\\\\\r\\n])*\\2(?!\\2))/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t\t/((?:^|[^\\\\])(?:\\\\{2})*)\\$(?:\\w+|\\{(?:[^{}]|\\{[^{}]*\\})*\\})/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t'punctuation': /^\\$\\{?|\\}$/,\n\t\t\t\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\t\t\tinside: 'dart',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'string': undefined,\n\t\t\t\t},\n\t\t\t\t'class-name': {\n\t\t\t\t\t'metadata': {\n\t\t\t\t\t\tpattern: /@\\w+/,\n\t\t\t\t\t\talias: 'function',\n\t\t\t\t\t},\n\t\t\t\t\t'generics': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/<(?:[\\w\\s,.&?]|<(?:[\\w\\s,.&?]|<(?:[\\w\\s,.&?]|<[\\w\\s,.&?]*>)*>)*>)*>/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'class-name': className,\n\t\t\t\t\t\t\t'keyword': keywords,\n\t\t\t\t\t\t\t'punctuation': /[<>(),.:]/,\n\t\t\t\t\t\t\t'operator': /[?&|]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/dataweave.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'dataweave'>} */\nexport default {\n\tid: 'dataweave',\n\tgrammar: {\n\t\t'url': /\\b[A-Za-z]+:\\/\\/[\\w/:.?=&-]+|\\burn:[\\w:.?=&-]+/,\n\t\t'property': {\n\t\t\tpattern: /(?:\\b\\w+#)?(?:\"(?:\\\\.|[^\\\\\"\\r\\n])*\"|\\b\\w+)(?=\\s*[:@])/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /([\"'`])(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'mime-type': /\\b(?:application|audio|image|multipart|text|video)\\/[\\w+-]+/,\n\t\t'date': {\n\t\t\tpattern: /\\|[\\w:+-]+\\|/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'comment': [\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\t\t'regex': {\n\t\t\tpattern: /\\/(?:[^\\\\\\/\\r\\n]|\\\\[^\\r\\n])+\\//,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\\b/,\n\t\t'function': /\\b[A-Z_]\\w*(?=\\s*\\()/i,\n\t\t'number': /-?\\b\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?\\b/i,\n\t\t'punctuation': /[{}[\\];(),.:@]/,\n\t\t'operator': /<<|>>|->|[<>~=]=?|!=|--?-?|\\+\\+?|!|\\?/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/dax.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'dax'>} */\nexport default {\n\tid: 'dax',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|(?:--|\\/\\/).*)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'data-field': {\n\t\t\tpattern: /'(?:[^']|'')*'(?!')(?:\\[[ \\w\\xA0-\\uFFFF]+\\])?|\\w+\\[[ \\w\\xA0-\\uFFFF]+\\]/,\n\t\t\talias: 'symbol',\n\t\t},\n\t\t'measure': {\n\t\t\tpattern: /\\[[ \\w\\xA0-\\uFFFF]+\\]/,\n\t\t\talias: 'constant',\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"]|\"\")*\"(?!\")/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'function':\n\t\t\t/\\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\\.DIST|BETA\\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\\.DIST|CHISQ\\.DIST\\.RT|CHISQ\\.INV|CHISQ\\.INV\\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\\.NORM|CONFIDENCE\\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\\.DIST|NORM\\.INV|NORM\\.S\\.DIST|NORM\\.S\\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\\.EXC|PERCENTILE\\.INC|PERCENTILEX\\.EXC|PERCENTILEX\\.INC|PERMUT|PI|POISSON\\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\\.P|STDEV\\.S|STDEVX\\.P|STDEVX\\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\\.DIST|T\\.DIST\\.2T|T\\.DIST\\.RT|T\\.INV|T\\.INV\\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\\.P|VAR\\.S|VARX\\.P|VARX\\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\\s*\\()/i,\n\t\t'keyword': /\\b(?:DEFINE|EVALUATE|MEASURE|ORDER\\s+BY|RETURN|VAR|START\\s+AT|ASC|DESC)\\b/i,\n\t\t'boolean': {\n\t\t\tpattern: /\\b(?:FALSE|NULL|TRUE)\\b/i,\n\t\t\talias: 'constant',\n\t\t},\n\t\t'number': /\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+\\b/,\n\t\t'operator': /:=|[-+*\\/=^]|&&?|\\|\\||<(?:=>?|<|>)?|>[>=]?|\\b(?:IN|NOT)\\b/i,\n\t\t'punctuation': /[;\\[\\](){}`,.]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/dhall.js",
    "content": "// ABNF grammar:\n// https://github.com/dhall-lang/dhall-lang/blob/master/standard/dhall.abnf\n\n/** @type {import('../types.d.ts').LanguageProto<'dhall'>} */\nexport default {\n\tid: 'dhall',\n\tgrammar: {\n\t\t// Multi-line comments can be nested. E.g. {- foo {- bar -} -}\n\t\t// The multi-line pattern is essentially this:\n\t\t//   \\{-(?:[^-{]|-(?!\\})|\\{(?!-)|<SELF>)*-\\}\n\t\t'comment': /--.*|\\{-(?:[^-{]|-(?!\\})|\\{(?!-)|\\{-(?:[^-{]|-(?!\\})|\\{(?!-))*-\\})*-\\}/,\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"\\\\]|\\\\.)*\"|''(?:[^']|'(?!')|'''|''\\$\\{)*''(?!'|\\$)/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation': {\n\t\t\t\t\tpattern: /\\$\\{[^{}]*\\}/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\tpattern: /(^\\$\\{)[\\s\\S]+(?=\\}$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'language-dhall',\n\t\t\t\t\t\t\tinside: 'dhall',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /\\$\\{|\\}/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'label': {\n\t\t\tpattern: /`[^`]*`/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'url': {\n\t\t\t// https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L596\n\t\t\tpattern:\n\t\t\t\t/\\bhttps?:\\/\\/[\\w.:%!$&'*+;=@~-]+(?:\\/[\\w.:%!$&'*+;=@~-]*)*(?:\\?[/?\\w.:%!$&'*+;=@~-]*)?/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'env': {\n\t\t\t// https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L661\n\t\t\tpattern: /\\benv:(?:(?!\\d)\\w+|\"(?:[^\"\\\\=]|\\\\.)*\")/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'function': /^env/,\n\t\t\t\t'operator': /^:/,\n\t\t\t\t'variable': /[\\s\\S]+/,\n\t\t\t},\n\t\t},\n\t\t'hash': {\n\t\t\t// https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L725\n\t\t\tpattern: /\\bsha256:[\\da-fA-F]{64}\\b/,\n\t\t\tinside: {\n\t\t\t\t'function': /sha256/,\n\t\t\t\t'operator': /:/,\n\t\t\t\t'number': /[\\da-fA-F]{64}/,\n\t\t\t},\n\t\t},\n\n\t\t// https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L359\n\t\t'keyword':\n\t\t\t/\\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\\b|\\u2200/,\n\t\t'builtin': /\\b(?:None|Some)\\b/,\n\n\t\t'boolean': /\\b(?:False|True)\\b/,\n\t\t'number': /\\bNaN\\b|-?\\bInfinity\\b|[+-]?\\b(?:0x[\\da-fA-F]+|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)\\b/,\n\t\t'operator':\n\t\t\t/\\/\\\\|\\/\\/\\\\\\\\|&&|\\|\\||===|[!=]=|\\/\\/|->|\\+\\+|::|[+*#@=:?<>|\\\\\\u2227\\u2a53\\u2261\\u2afd\\u03bb\\u2192]/,\n\t\t'punctuation': /\\.\\.|[{}\\[\\](),./]/,\n\n\t\t// we'll just assume that every capital word left is a type name\n\t\t'class-name': /\\b[A-Z]\\w*\\b/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/diff.js",
    "content": "/**\n * A map from the name of a block to its line prefix.\n */\nexport const PREFIXES = {\n\t'deleted-sign': '-',\n\t'deleted-arrow': '<',\n\t'inserted-sign': '+',\n\t'inserted-arrow': '>',\n\t'unchanged': ' ',\n\t'diff': '!',\n};\n\n/** @type {import('../types.d.ts').LanguageProto<'diff'>} */\nexport default {\n\tid: 'diff',\n\tgrammar () {\n\t\t/** @type {import('../types.d.ts').Grammar} */\n\t\tconst diff = {\n\t\t\t'coord': [\n\t\t\t\t// Match all kinds of coord lines (prefixed by \"+++\", \"---\" or \"***\").\n\t\t\t\t/^(?:\\*{3}|-{3}|\\+{3}).*$/m,\n\t\t\t\t// Match \"@@ ... @@\" coord lines in unified diff.\n\t\t\t\t/^@@.*@@$/m,\n\t\t\t\t// Match coord lines in normal diff (starts with a number).\n\t\t\t\t/^\\d.*$/m,\n\t\t\t],\n\n\t\t\t// deleted, inserted, unchanged, diff\n\t\t};\n\n\t\t// add a token for each prefix\n\t\tObject.keys(PREFIXES).forEach(name => {\n\t\t\tconst prefix = PREFIXES[name];\n\n\t\t\tconst alias = [];\n\t\t\tconst mainName = /\\w+/.exec(name)?.[0] || name;\n\t\t\tif (mainName !== name) {\n\t\t\t\t// \"deleted-sign\" -> \"deleted\"\n\t\t\t\talias.push(mainName);\n\t\t\t}\n\t\t\tif (name === 'diff') {\n\t\t\t\talias.push('bold');\n\t\t\t}\n\n\t\t\tdiff[name] = {\n\t\t\t\tpattern: RegExp(`^(?:[${prefix}].*(?:\\r\\n?|\\n|(?![\\\\s\\\\S])))+`, 'm'),\n\t\t\t\talias,\n\t\t\t\tinside: {\n\t\t\t\t\t'prefix': {\n\t\t\t\t\t\tpattern: RegExp(`^[${prefix}]`, 'm'),\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\talias: mainName,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\treturn diff;\n\t},\n};\n"
  },
  {
    "path": "src/languages/django.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport markup from './markup.js';\n\n// Django/Jinja2 syntax definition for Prism.js <http://prismjs.com> syntax highlighter.\n// Mostly it works OK but can paint code incorrectly on complex html/template tag combinations.\n\n/** @type {import('../types.d.ts').LanguageProto<'django'>} */\nexport default {\n\tid: 'django',\n\trequire: markup,\n\talias: 'jinja2',\n\tgrammar: {\n\t\t'django': {\n\t\t\tpattern: /\\{\\{[\\s\\S]*?\\}\\}|\\{%[\\s\\S]*?%\\}|\\{#[\\s\\S]*?#\\}/,\n\t\t\tinside: {\n\t\t\t\t'comment': /^\\{#[\\s\\S]*?#\\}$/,\n\t\t\t\t'tag': {\n\t\t\t\t\tpattern: /(^\\{%[+-]?\\s*)\\w+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t\t'delimiter': {\n\t\t\t\t\tpattern: /^\\{[{%][+-]?|[+-]?[}%]\\}$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t\t'string': {\n\t\t\t\t\tpattern: /(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t'filter': {\n\t\t\t\t\tpattern: /(\\|)\\w+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'function',\n\t\t\t\t},\n\t\t\t\t'test': {\n\t\t\t\t\tpattern: /(\\bis\\s+(?:not\\s+)?)(?!not\\b)\\w+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'function',\n\t\t\t\t},\n\t\t\t\t'function': /\\b[a-z_]\\w+(?=\\s*\\()/i,\n\t\t\t\t'keyword':\n\t\t\t\t\t/\\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\\b/,\n\t\t\t\t'operator': /[-+%=]=?|!=|\\*\\*?=?|\\/\\/?=?|<[<=>]?|>[=>]?|[&|^~]/,\n\t\t\t\t'number': /\\b\\d+(?:\\.\\d+)?\\b/,\n\t\t\t\t'boolean': /[Ff]alse|[Nn]one|[Tt]rue/,\n\t\t\t\t'variable': /\\b\\w+\\b/,\n\t\t\t\t'punctuation': /[{}[\\](),.:;]/,\n\t\t\t},\n\t\t},\n\t\t$tokenize: embeddedIn('markup'),\n\t},\n};\n"
  },
  {
    "path": "src/languages/dns-zone-file.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'dns-zone-file'>} */\nexport default {\n\tid: 'dns-zone-file',\n\talias: 'dns-zone',\n\tgrammar: {\n\t\t'comment': /;.*/,\n\t\t'string': {\n\t\t\tpattern: /\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'variable': [\n\t\t\t{\n\t\t\t\tpattern: /(^\\$ORIGIN[ \\t]+)\\S+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|\\s)@(?=\\s|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'keyword': /^\\$(?:INCLUDE|ORIGIN|TTL)(?=\\s|$)/m,\n\t\t'class': {\n\t\t\t// https://tools.ietf.org/html/rfc1035#page-13\n\t\t\tpattern: /(^|\\s)(?:CH|CS|HS|IN)(?=\\s|$)/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'type': {\n\t\t\t// https://en.wikipedia.org/wiki/List_of_DNS_record_types\n\t\t\tpattern:\n\t\t\t\t/(^|\\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\\s|$)/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'punctuation': /[()]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/docker.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'docker'>} */\nexport default {\n\tid: 'docker',\n\talias: 'dockerfile',\n\tgrammar () {\n\t\t// Many of the following regexes will contain negated lookaheads like `[ \\t]+(?![ \\t])`. This is a trick to ensure\n\t\t// that quantifiers behave *atomically*. Atomic quantifiers are necessary to prevent exponential backtracking.\n\n\t\tconst spaceAfterBackSlash = /\\\\[\\r\\n](?:\\s|\\\\[\\r\\n]|#.*(?!.))*(?![\\s#]|\\\\[\\r\\n])/.source;\n\t\t// At least one space, comment, or line break\n\t\tconst space = /(?:[ \\t]+(?![ \\t])(?:<SP_BS>)?|<SP_BS>)/.source.replace(\n\t\t\t/<SP_BS>/g,\n\t\t\t() => spaceAfterBackSlash\n\t\t);\n\n\t\tconst string = /\"(?:[^\"\\\\\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*\"|'(?:[^'\\\\\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*'/\n\t\t\t.source;\n\t\tconst option = /--[\\w-]+=(?:<STR>|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)/.source.replace(\n\t\t\t/<STR>/g,\n\t\t\t() => string\n\t\t);\n\n\t\tconst stringRule = {\n\t\t\tpattern: RegExp(string),\n\t\t\tgreedy: true,\n\t\t};\n\t\tconst commentRule = {\n\t\t\tpattern: /(^[ \\t]*)#.*/m,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t};\n\n\t\t/**\n\t\t * @param {string} source\n\t\t * @param {string} [flags]\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction re (source, flags) {\n\t\t\tsource = source.replace(/<OPT>/g, () => option).replace(/<SP>/g, () => space);\n\n\t\t\treturn RegExp(source, flags);\n\t\t}\n\n\t\treturn {\n\t\t\t'instruction': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[ \\t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\\s)(?:\\\\.|[^\\r\\n\\\\])*(?:\\\\$(?:\\s|#.*$)*(?![\\s#])(?:\\\\.|[^\\r\\n\\\\])*)*/im,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tpattern: re(/(^(?:ONBUILD<SP>)?\\w+<SP>)<OPT>(?:<SP><OPT>)*/.source, 'i'),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'property': {\n\t\t\t\t\t\t\t\tpattern: /(^|\\s)--[\\w-]+/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'string': [\n\t\t\t\t\t\t\t\tstringRule,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpattern: /(=)(?![\"'])(?:[^\\s\\\\]|\\\\.)+/,\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t'operator': /\\\\$/m,\n\t\t\t\t\t\t\t'punctuation': /=/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'keyword': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// https://docs.docker.com/engine/reference/builder/#healthcheck\n\t\t\t\t\t\t\tpattern: re(\n\t\t\t\t\t\t\t\t/(^(?:ONBUILD<SP>)?HEALTHCHECK<SP>(?:<OPT><SP>)*)(?:CMD|NONE)\\b/\n\t\t\t\t\t\t\t\t\t.source,\n\t\t\t\t\t\t\t\t'i'\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// https://docs.docker.com/engine/reference/builder/#from\n\t\t\t\t\t\t\tpattern: re(\n\t\t\t\t\t\t\t\t/(^(?:ONBUILD<SP>)?FROM<SP>(?:<OPT><SP>)*(?!--)[^ \\t\\\\]+<SP>)AS/\n\t\t\t\t\t\t\t\t\t.source,\n\t\t\t\t\t\t\t\t'i'\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// https://docs.docker.com/engine/reference/builder/#onbuild\n\t\t\t\t\t\t\tpattern: re(/(^ONBUILD<SP>)\\w+/.source, 'i'),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^\\w+/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'comment': commentRule,\n\t\t\t\t\t'string': stringRule,\n\t\t\t\t\t'variable': /\\$(?:\\w+|\\{[^{}\"'\\\\]*\\})/,\n\t\t\t\t\t'operator': /\\\\$/m,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'comment': commentRule,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/dot.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'dot'>} */\nexport default {\n\tid: 'dot',\n\talias: 'gv',\n\tgrammar () {\n\t\t// https://www.graphviz.org/doc/info/lang.html\n\n\t\tconst ID =\n\t\t\t'(?:' +\n\t\t\t[\n\t\t\t\t// an identifier\n\t\t\t\t/[a-zA-Z_\\x80-\\uFFFF][\\w\\x80-\\uFFFF]*/.source,\n\t\t\t\t// a number\n\t\t\t\t/-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)/.source,\n\t\t\t\t// a double-quoted string\n\t\t\t\t/\"[^\"\\\\]*(?:\\\\[\\s\\S][^\"\\\\]*)*\"/.source,\n\t\t\t\t// HTML-like string\n\t\t\t\t/<(?:[^<>]|(?!<!--)<(?:[^<>\"']|\"[^\"]*\"|'[^']*')+>|<!--(?:[^-]|-(?!->))*-->)*>/\n\t\t\t\t\t.source,\n\t\t\t].join('|') +\n\t\t\t')';\n\n\t\tconst IDInside = {\n\t\t\t'markup': {\n\t\t\t\tpattern: /(^<)[\\s\\S]+(?=>$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: ['language-markup', 'language-html', 'language-xml'],\n\t\t\t\tinside: 'markup',\n\t\t\t},\n\t\t};\n\n\t\t/**\n\t\t * @param {string} source\n\t\t * @param {string} [flags]\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction withID (source, flags) {\n\t\t\treturn RegExp(\n\t\t\t\tsource.replace(/<ID>/g, () => ID),\n\t\t\t\tflags\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\/|^#.*/m,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'graph-name': {\n\t\t\t\tpattern: withID(/(\\b(?:digraph|graph|subgraph)[ \\t\\r\\n]+)<ID>/.source, 'i'),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'class-name',\n\t\t\t\tinside: IDInside,\n\t\t\t},\n\t\t\t'attr-value': {\n\t\t\t\tpattern: withID(/(=[ \\t\\r\\n]*)<ID>/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: IDInside,\n\t\t\t},\n\t\t\t'attr-name': {\n\t\t\t\tpattern: withID(/([\\[;, \\t\\r\\n])<ID>(?=[ \\t\\r\\n]*=)/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: IDInside,\n\t\t\t},\n\t\t\t'keyword': /\\b(?:digraph|edge|graph|node|strict|subgraph)\\b/i,\n\t\t\t'compass-point': {\n\t\t\t\tpattern: /(:[ \\t\\r\\n]*)(?:[ewc_]|[ns][ew]?)(?![\\w\\x80-\\uFFFF])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'builtin',\n\t\t\t},\n\t\t\t'node': {\n\t\t\t\tpattern: withID(/(^|[^-.\\w\\x80-\\uFFFF\\\\])<ID>/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: IDInside,\n\t\t\t},\n\t\t\t'operator': /[=:]|-[->]/,\n\t\t\t'punctuation': /[\\[\\]{};,]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/ebnf.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'ebnf'>} */\nexport default {\n\tid: 'ebnf',\n\tgrammar: {\n\t\t'comment': /\\(\\*[\\s\\S]*?\\*\\)/,\n\t\t'string': {\n\t\t\tpattern: /\"[^\"\\r\\n]*\"|'[^'\\r\\n]*'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'special': {\n\t\t\tpattern: /\\?[^?\\r\\n]*\\?/,\n\t\t\tgreedy: true,\n\t\t\talias: 'class-name',\n\t\t},\n\n\t\t'definition': {\n\t\t\tpattern: /^([\\t ]*)[a-z]\\w*(?:[ \\t]+[a-z]\\w*)*(?=\\s*=)/im,\n\t\t\tlookbehind: true,\n\t\t\talias: ['rule', 'keyword'],\n\t\t},\n\t\t'rule': /\\b[a-z]\\w*(?:[ \\t]+[a-z]\\w*)*\\b/i,\n\n\t\t'punctuation': /\\([:/]|[:/]\\)|[.,;()[\\]{}]/,\n\t\t'operator': /[-=|*/!]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/editorconfig.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'editorconfig'>} */\nexport default {\n\tid: 'editorconfig',\n\tgrammar: {\n\t\t// https://editorconfig-specification.readthedocs.io\n\t\t'comment': /[;#].*/,\n\t\t'section': {\n\t\t\tpattern: /(^[ \\t]*)\\[.+\\]/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'selector',\n\t\t\tinside: {\n\t\t\t\t'regex': /\\\\\\\\[\\[\\]{},!?.*]/, // Escape special characters with '\\\\'\n\t\t\t\t'operator': /[!?]|\\.\\.|\\*{1,2}/,\n\t\t\t\t'punctuation': /[\\[\\]{},]/,\n\t\t\t},\n\t\t},\n\t\t'key': {\n\t\t\tpattern: /(^[ \\t]*)[^\\s=]+(?=[ \\t]*=)/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'attr-name',\n\t\t},\n\t\t'value': {\n\t\t\tpattern: /=.*/,\n\t\t\talias: 'attr-value',\n\t\t\tinside: {\n\t\t\t\t'punctuation': /^=/,\n\t\t\t},\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/eiffel.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'eiffel'>} */\nexport default {\n\tid: 'eiffel',\n\tgrammar: {\n\t\t'comment': /--.*/,\n\t\t'string': [\n\t\t\t// Aligned-verbatim-strings\n\t\t\t{\n\t\t\t\tpattern: /\"([^[]*)\\[[\\s\\S]*?\\]\\1\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t// Non-aligned-verbatim-strings\n\t\t\t{\n\t\t\t\tpattern: /\"([^{]*)\\{[\\s\\S]*?\\}\\1\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t// Single-line string\n\t\t\t{\n\t\t\t\tpattern: /\"(?:%(?:(?!\\n)\\s)*\\n\\s*%|%\\S|[^%\"\\r\\n])*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\t\t// normal char | special char | char code\n\t\t'char': /'(?:%.|[^%'\\r\\n])+'/,\n\t\t'keyword':\n\t\t\t/\\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\\b/i,\n\t\t'boolean': /\\b(?:False|True)\\b/i,\n\t\t// Convention: class-names are always all upper-case characters\n\t\t'class-name': /\\b[A-Z][\\dA-Z_]*\\b/,\n\t\t'number': [\n\t\t\t// hexa | octal | bin\n\t\t\t/\\b0[xcb][\\da-f](?:_*[\\da-f])*\\b/i,\n\t\t\t// Decimal\n\t\t\t/(?:\\b\\d(?:_*\\d)*)?\\.(?:(?:\\d(?:_*\\d)*)?e[+-]?)?\\d(?:_*\\d)*\\b|\\b\\d(?:_*\\d)*\\b\\.?/i,\n\t\t],\n\t\t'punctuation': /:=|<<|>>|\\(\\||\\|\\)|->|\\.(?=\\w)|[{}[\\];(),:?]/,\n\t\t'operator': /\\\\\\\\|\\|\\.\\.\\||\\.\\.|\\/[~\\/=]?|[><]=?|[-+*^=~]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/ejs.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport javascript from './javascript.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'ejs'>} */\nexport default {\n\tid: 'ejs',\n\trequire: [javascript, markup],\n\talias: 'eta',\n\tgrammar: {\n\t\t'ejs-comment': {\n\t\t\tpattern: /<%#[\\s\\S]*?%>/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'escape': {\n\t\t\tpattern: /<%%|%%>/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'ejs': {\n\t\t\tpattern: /<%(?![%#])[\\s\\S]*?%>/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'delimiter': {\n\t\t\t\t\tpattern: /^<%[-_=]?|[-_]?%>$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t\t'language-javascript': {\n\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\tinside: 'javascript',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t$tokenize: embeddedIn('markup'),\n\t},\n};\n"
  },
  {
    "path": "src/languages/elixir.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'elixir'>} */\nexport default {\n\tid: 'elixir',\n\tgrammar () {\n\t\tconst stringInside = {\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /#\\{[^}]+\\}/,\n\t\t\t\tinside: {\n\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\tpattern: /^#\\{|\\}$/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t$rest: 'elixir',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'doc': {\n\t\t\t\tpattern:\n\t\t\t\t\t/@(?:doc|moduledoc)\\s+(?:(\"\"\"|''')[\\s\\S]*?\\1|(\"|')(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2)/,\n\t\t\t\tinside: {\n\t\t\t\t\t'attribute': /^@\\w+/,\n\t\t\t\t\t'string': /['\"][\\s\\S]+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'comment': {\n\t\t\t\tpattern: /#.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t// ~r\"\"\"foo\"\"\" (multi-line), ~r'''foo''' (multi-line), ~r/foo/, ~r|foo|, ~r\"foo\", ~r'foo', ~r(foo), ~r[foo], ~r{foo}, ~r<foo>\n\t\t\t'regex': {\n\t\t\t\tpattern:\n\t\t\t\t\t/~[rR](?:(\"\"\"|''')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])+\\1|([\\/|\"'])(?:\\\\.|(?!\\2)[^\\\\\\r\\n])+\\2|\\((?:\\\\.|[^\\\\)\\r\\n])+\\)|\\[(?:\\\\.|[^\\\\\\]\\r\\n])+\\]|\\{(?:\\\\.|[^\\\\}\\r\\n])+\\}|<(?:\\\\.|[^\\\\>\\r\\n])+>)[uismxfr]*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\t// ~s\"\"\"foo\"\"\" (multi-line), ~s'''foo''' (multi-line), ~s/foo/, ~s|foo|, ~s\"foo\", ~s'foo', ~s(foo), ~s[foo], ~s{foo} (with interpolation care), ~s<foo>\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/~[cCsSwW](?:(\"\"\"|''')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])+\\1|([\\/|\"'])(?:\\\\.|(?!\\2)[^\\\\\\r\\n])+\\2|\\((?:\\\\.|[^\\\\)\\r\\n])+\\)|\\[(?:\\\\.|[^\\\\\\]\\r\\n])+\\]|\\{(?:\\\\.|#\\{[^}]+\\}|#(?!\\{)|[^#\\\\}\\r\\n])+\\}|<(?:\\\\.|[^\\\\>\\r\\n])+>)[csa]?/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: stringInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\"\"\"|''')[\\s\\S]*?\\1/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: stringInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Multi-line strings are allowed\n\t\t\t\t\tpattern: /(\"|')(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: stringInside,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'atom': {\n\t\t\t\t// Look-behind prevents bad highlighting of the :: operator\n\t\t\t\tpattern: /(^|[^:]):\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'symbol',\n\t\t\t},\n\t\t\t'module': {\n\t\t\t\tpattern: /\\b[A-Z]\\w*\\b/,\n\t\t\t\talias: 'class-name',\n\t\t\t},\n\t\t\t// Look-ahead prevents bad highlighting of the :: operator\n\t\t\t'attr-name': /\\b\\w+\\??:(?!:)/,\n\t\t\t'argument': {\n\t\t\t\t// Look-behind prevents bad highlighting of the && operator\n\t\t\t\tpattern: /(^|[^&])&\\d+/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'variable',\n\t\t\t},\n\t\t\t'attribute': {\n\t\t\t\tpattern: /@\\w+/,\n\t\t\t\talias: 'variable',\n\t\t\t},\n\t\t\t'function': /\\b[_a-zA-Z]\\w*[?!]?(?:(?=\\s*(?:\\.\\s*)?\\()|(?=\\/\\d))/,\n\t\t\t'number': /\\b(?:0[box][a-f\\d_]+|\\d[\\d_]*)(?:\\.[\\d_]+)?(?:e[+-]?[\\d_]+)?\\b/i,\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\\b/,\n\t\t\t'boolean': /\\b(?:false|nil|true)\\b/,\n\t\t\t'operator': [\n\t\t\t\t/\\bin\\b|&&?|\\|[|>]?|\\\\\\\\|::|\\.\\.\\.?|\\+\\+?|-[->]?|<[-=>]|>=|!==?|\\B!|=(?:==?|[>~])?|[*\\/^]/,\n\t\t\t\t{\n\t\t\t\t\t// We don't want to match <<\n\t\t\t\t\tpattern: /([^<])<(?!<)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// We don't want to match >>\n\t\t\t\t\tpattern: /([^>])>(?!>)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'punctuation': /<<|>>|[.,%\\[\\]{}()]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/elm.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'elm'>} */\nexport default {\n\tid: 'elm',\n\tgrammar: {\n\t\t'comment': /--.*|\\{-[\\s\\S]*?-\\}/,\n\t\t'char': {\n\t\t\tpattern: /'(?:[^\\\\'\\r\\n]|\\\\(?:[abfnrtv\\\\']|\\d+|x[0-9a-fA-F]+|u\\{[0-9a-fA-F]+\\}))'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': [\n\t\t\t{\n\t\t\t\t// Multiline strings are wrapped in triple \". Quotes may appear unescaped.\n\t\t\t\tpattern: /\"\"\"[\\s\\S]*?\"\"\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /\"(?:[^\\\\\"\\r\\n]|\\\\.)*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\t\t'import-statement': {\n\t\t\t// The imported or hidden names are not included in this import\n\t\t\t// statement. This is because we want to highlight those exactly like\n\t\t\t// we do for the names in the program.\n\t\t\tpattern:\n\t\t\t\t/(^[\\t ]*)import\\s+[A-Z]\\w*(?:\\.[A-Z]\\w*)*(?:\\s+as\\s+(?:[A-Z]\\w*)(?:\\.[A-Z]\\w*)*)?(?:\\s+exposing\\s+)?/m,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'keyword': /\\b(?:as|exposing|import)\\b/,\n\t\t\t},\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\\b/,\n\t\t// These are builtin variables only. Constructors are highlighted later as a constant.\n\t\t'builtin':\n\t\t\t/\\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\\b/,\n\t\t// decimal integers and floating point numbers | hexadecimal integers\n\t\t'number': /\\b(?:\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?|0x[0-9a-f]+)\\b/i,\n\t\t// Most of this is needed because of the meaning of a single '.'.\n\t\t// If it stands alone freely, it is the function composition.\n\t\t// It may also be a separator between a module name and an identifier => no\n\t\t// operator. If it comes together with other special characters it is an\n\t\t// operator too.\n\t\t// Valid operator characters in 0.18: +-/*=.$<>:&|^?%#@~!\n\t\t// Ref: https://groups.google.com/forum/#!msg/elm-dev/0AHSnDdkSkQ/E0SVU70JEQAJ\n\t\t'operator': /\\s\\.\\s|[+\\-/*=.$<>:&|^?%#@~!]{2,}|[+\\-/*=$<>:&|^?%#@~!]/,\n\t\t// In Elm, nearly everything is a variable, do not highlight these.\n\t\t'hvariable': /\\b(?:[A-Z]\\w*\\.)*[a-z]\\w*\\b/,\n\t\t'constant': /\\b(?:[A-Z]\\w*\\.)*[A-Z]\\w*\\b/,\n\t\t'punctuation': /[{}[\\]|(),.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/erb.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport markup from './markup.js';\nimport ruby from './ruby.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'erb'>} */\nexport default {\n\tid: 'erb',\n\trequire: [ruby, markup],\n\tgrammar: {\n\t\t'erb': {\n\t\t\tpattern:\n\t\t\t\t/<%=?(?:[^\\r\\n]|[\\r\\n](?!=begin)|[\\r\\n]=begin\\s(?:[^\\r\\n]|[\\r\\n](?!=end))*[\\r\\n]=end)+?%>/,\n\t\t\tinside: {\n\t\t\t\t'delimiter': {\n\t\t\t\t\tpattern: /^<%=?|%>$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t\t'ruby': {\n\t\t\t\t\tpattern: /\\s*\\S[\\s\\S]*/,\n\t\t\t\t\talias: 'language-ruby',\n\t\t\t\t\tinside: 'ruby',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t$tokenize: embeddedIn('markup'),\n\t},\n};\n"
  },
  {
    "path": "src/languages/erlang.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'erlang'>} */\nexport default {\n\tid: 'erlang',\n\tgrammar: {\n\t\t'comment': /%.+/,\n\t\t'string': {\n\t\t\tpattern: /\"(?:\\\\.|[^\\\\\"\\r\\n])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'quoted-function': {\n\t\t\tpattern: /'(?:\\\\.|[^\\\\'\\r\\n])+'(?=\\()/,\n\t\t\talias: 'function',\n\t\t},\n\t\t'quoted-atom': {\n\t\t\tpattern: /'(?:\\\\.|[^\\\\'\\r\\n])+'/,\n\t\t\talias: 'atom',\n\t\t},\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'keyword': /\\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\\b/,\n\t\t'number': [/\\$\\\\?./, /\\b\\d+#[a-z0-9]+/i, /(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i],\n\t\t'function': /\\b[a-z][\\w@]*(?=\\()/,\n\t\t'variable': {\n\t\t\t// Look-behind is used to prevent wrong highlighting of atoms containing \"@\"\n\t\t\tpattern: /(^|[^@])(?:\\b|\\?)[A-Z_][\\w@]*/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'operator': [\n\t\t\t/[=\\/<>:]=|=[:\\/]=|\\+\\+?|--?|[=*\\/!]|\\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\\b/,\n\t\t\t{\n\t\t\t\t// We don't want to match <<\n\t\t\t\tpattern: /(^|[^<])<(?!<)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\t// We don't want to match >>\n\t\t\t\tpattern: /(^|[^>])>(?!>)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'atom': /\\b[a-z][\\w@]*/,\n\t\t'punctuation': /[()[\\]{}:;,.#|]|<<|>>/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/etlua.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport lua from './lua.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'etlua'>} */\nexport default {\n\tid: 'etlua',\n\trequire: [lua, markup],\n\tgrammar: {\n\t\t'etlua': {\n\t\t\tpattern: /<%[\\s\\S]+?%>/,\n\t\t\tinside: {\n\t\t\t\t'delimiter': {\n\t\t\t\t\tpattern: /^<%[-=]?|-?%>$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t\t'language-lua': {\n\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\tinside: 'lua',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t$tokenize: embeddedIn('markup'),\n\t},\n};\n"
  },
  {
    "path": "src/languages/excel-formula.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'excel-formula'>} */\nexport default {\n\tid: 'excel-formula',\n\talias: ['xlsx', 'xls'],\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(\\bN\\(\\s*)\"(?:[^\"]|\"\")*\"(?=\\s*\\))/i,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"]|\"\")*\"(?!\")/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'reference': {\n\t\t\t// https://www.ablebits.com/office-addins-blog/2015/12/08/excel-reference-another-sheet-workbook/\n\n\t\t\t// Sales!B2\n\t\t\t// 'Winter sales'!B2\n\t\t\t// [Sales.xlsx]Jan!B2:B5\n\t\t\t// D:\\Reports\\[Sales.xlsx]Jan!B2:B5\n\t\t\t// '[Sales.xlsx]Jan sales'!B2:B5\n\t\t\t// 'D:\\Reports\\[Sales.xlsx]Jan sales'!B2:B5\n\n\t\t\tpattern: /(?:'[^']*'|(?:[^\\s()[\\]{}<>*?\"';,$&]*\\[[^^\\s()[\\]{}<>*?\"']+\\])?\\w+)!/,\n\t\t\tgreedy: true,\n\t\t\talias: 'string',\n\t\t\tinside: {\n\t\t\t\t'operator': /!$/,\n\t\t\t\t'punctuation': /'/,\n\t\t\t\t'sheet': {\n\t\t\t\t\tpattern: /[^[\\]]+$/,\n\t\t\t\t\talias: 'function',\n\t\t\t\t},\n\t\t\t\t'file': {\n\t\t\t\t\tpattern: /\\[[^[\\]]+\\]$/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /[[\\]]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'path': /[\\s\\S]+/,\n\t\t\t},\n\t\t},\n\t\t'function-name': {\n\t\t\tpattern: /\\b[A-Z]\\w*(?=\\()/i,\n\t\t\talias: 'builtin',\n\t\t},\n\t\t'range': {\n\t\t\tpattern: /\\$?\\b(?:[A-Z]+\\$?\\d+:\\$?[A-Z]+\\$?\\d+|[A-Z]+:\\$?[A-Z]+|\\d+:\\$?\\d+)\\b/i,\n\t\t\talias: 'selector',\n\t\t\tinside: {\n\t\t\t\t'operator': /:/,\n\t\t\t\t'cell': /\\$?[A-Z]+\\$?\\d+/i,\n\t\t\t\t'column': /\\$?[A-Z]+/i,\n\t\t\t\t'row': /\\$?\\d+/,\n\t\t\t},\n\t\t},\n\t\t'cell': {\n\t\t\t// Excel is case insensitive, so the string \"foo1\" could be either a variable or a cell.\n\t\t\t// To combat this, we match cells case insensitive, if the contain at least one \"$\", and case sensitive otherwise.\n\t\t\tpattern: /\\b[A-Z]+\\d+\\b|\\$[A-Za-z]+\\$?\\d+\\b|\\b[A-Za-z]+\\$\\d+\\b/,\n\t\t\talias: 'selector',\n\t\t},\n\t\t'number': /(?:\\b\\d+(?:\\.\\d+)?|\\B\\.\\d+)(?:e[+-]?\\d+)?\\b/i,\n\t\t'boolean': /\\b(?:FALSE|TRUE)\\b/i,\n\t\t'operator': /[-+*/^%=&,]|<[=>]?|>=?/,\n\t\t'punctuation': /[[\\]();{}|]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/factor.js",
    "content": "import { regexEscape } from '../shared/util.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'factor'>} */\nexport default {\n\tid: 'factor',\n\tgrammar () {\n\t\t/**\n\t\t * @param {string[]} arr\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction arrToWordsRegExp (arr) {\n\t\t\treturn new RegExp('(^|\\\\s)(?:' + arr.map(regexEscape).join('|') + ')(?=\\\\s|$)');\n\t\t}\n\n\t\tconst comment_inside = {\n\t\t\t'function':\n\t\t\t\t/\\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\\?{2,}|!{2,})\\b/,\n\t\t};\n\t\tconst string_inside = {\n\t\t\t'number': /\\\\[^\\s']|%\\w/,\n\t\t};\n\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\t// ! single-line exclamation point comments with whitespace after/around the !\n\t\t\t\t\tpattern: /(^|\\s)(?:! .*|!$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: comment_inside,\n\t\t\t\t},\n\n\t\t\t\t/* from basis/multiline: */\n\t\t\t\t{\n\t\t\t\t\t// /* comment */, /* comment*/\n\t\t\t\t\tpattern: /(^|\\s)\\/\\*\\s[\\s\\S]*?\\*\\/(?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: comment_inside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// ![[ comment ]] , ![===[ comment]===]\n\t\t\t\t\tpattern: /(^|\\s)!\\[(={0,6})\\[\\s[\\s\\S]*?\\]\\2\\](?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: comment_inside,\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t'number': [\n\t\t\t\t{\n\t\t\t\t\t// basic base 10 integers 9, -9\n\t\t\t\t\tpattern: /(^|\\s)[+-]?\\d+(?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// base prefix integers 0b010 0o70 0xad 0d10 0XAD -0xa9\n\t\t\t\t\tpattern: /(^|\\s)[+-]?0(?:b[01]+|o[0-7]+|d\\d+|x[\\dA-F]+)(?=\\s|$)/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// fractional ratios 1/5 -1/5 and the literal float approximations 1/5. -1/5.\n\t\t\t\t\tpattern: /(^|\\s)[+-]?\\d+\\/\\d+\\.?(?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// positive mixed numbers 23+1/5 +23+1/5\n\t\t\t\t\tpattern: /(^|\\s)\\+?\\d+\\+\\d+\\/\\d+(?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// negative mixed numbers -23-1/5\n\t\t\t\t\tpattern: /(^|\\s)-\\d+-\\d+\\/\\d+(?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// basic decimal floats -0.01 0. .0 .1 -.1 -1. -12.13 +12.13\n\t\t\t\t\t// and scientific notation with base 10 exponents 3e4 3e-4 .3e-4\n\t\t\t\t\tpattern: /(^|\\s)[+-]?(?:\\d*\\.\\d+|\\d+\\.\\d*|\\d+)(?:e[+-]?\\d+)?(?=\\s|$)/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// NAN literal syntax NAN: 80000deadbeef, NAN: a\n\t\t\t\t\tpattern: /(^|\\s)NAN:\\s+[\\da-fA-F]+(?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tbase prefix floats 0x1.0p3 (8.0) 0b1.010p2 (5.0) 0x1.p1 0b1.11111111p11111...\n\t\t\t\t\t\t\"The normalized hex form ±0x1.MMMMMMMMMMMMM[pP]±EEEE allows any floating-point number to be specified precisely.\n\t\t\t\t\t\tThe values of MMMMMMMMMMMMM and EEEE map directly to the mantissa and exponent fields of the binary IEEE 754 representation.\"\n\t\t\t\t\t\t<https://docs.factorcode.org/content/article-syntax-floats.html>\n\t\t\t\t\t*/\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|\\s)[+-]?0(?:b1\\.[01]*|o1\\.[0-7]*|d1\\.\\d*|x1\\.[\\dA-F]*)p\\d+(?=\\s|$)/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t// R/ regexp?\\/\\\\/\n\t\t\t'regexp': {\n\t\t\t\tpattern: /(^|\\s)R\\/\\s(?:\\\\\\S|[^\\\\/])*\\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\\s|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'number',\n\t\t\t\tinside: {\n\t\t\t\t\t'variable': /\\\\\\S/,\n\t\t\t\t\t'keyword': /[+?*\\[\\]^$(){}.|]/,\n\t\t\t\t\t'operator': {\n\t\t\t\t\t\tpattern: /(\\/)[idmsr]+(?:-[idmsr]+)?/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'boolean': {\n\t\t\t\tpattern: /(^|\\s)[tf](?=\\s|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t// SBUF\" asd\", URL\" ://...\", P\" /etc/\"\n\t\t\t'custom-string': {\n\t\t\t\tpattern: /(^|\\s)[A-Z0-9\\-]+\"\\s(?:\\\\\\S|[^\"\\\\])*\"/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'string',\n\t\t\t\tinside: {\n\t\t\t\t\t'number': /\\\\\\S|%\\w|\\//,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'multiline-string': [\n\t\t\t\t{\n\t\t\t\t\t// STRING: name \\n content \\n ; -> CONSTANT: name \"content\" (symbol)\n\t\t\t\t\tpattern: /(^|\\s)STRING:\\s+\\S+(?:\\n|\\r\\n).*(?:\\n|\\r\\n)\\s*;(?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'string',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'number': string_inside.number,\n\t\t\t\t\t\t// trailing semicolon on its own line\n\t\t\t\t\t\t'semicolon-or-setlocal': {\n\t\t\t\t\t\t\tpattern: /([\\r\\n][ \\t]*);(?=\\s|$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'function',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// HEREDOC: marker \\n content \\n marker ; -> \"content\" (immediate)\n\t\t\t\t\tpattern: /(^|\\s)HEREDOC:\\s+\\S+(?:\\n|\\r\\n).*(?:\\n|\\r\\n)\\s*\\S+(?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'string',\n\t\t\t\t\tinside: string_inside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// [[ string ]], [==[ string]==]\n\t\t\t\t\tpattern: /(^|\\s)\\[(={0,6})\\[\\s[\\s\\S]*?\\]\\2\\](?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'string',\n\t\t\t\t\tinside: string_inside,\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t'special-using': {\n\t\t\t\tpattern: /(^|\\s)USING:(?:\\s\\S+)*(?=\\s+;(?:\\s|$))/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'function',\n\t\t\t\tinside: {\n\t\t\t\t\t// this is essentially a regex for vocab names, which i don't want to specify\n\t\t\t\t\t// but the USING: gets picked up as a vocab name\n\t\t\t\t\t'string': {\n\t\t\t\t\t\tpattern: /(\\s)[^:\\s]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t/* this description of stack effect literal syntax is not complete and not as specific as theoretically possible\n\t\t\t\t\ttrying to do better is more work and regex-computation-time than it's worth though.\n\t\t\t\t\t- we'd like to have the \"delimiter\" parts of the stack effect [ (, --, and ) ] be a different (less-important or comment-like) colour to the stack effect contents\n\t\t\t\t\t- we'd like if nested stack effects were treated as such rather than just appearing flat (with `inside`)\n\t\t\t\t\t- we'd like if the following variable name conventions were recognised specifically:\n\t\t\t\t\t\tspecial row variables = ..a b..\n\t\t\t\t\t\ttype and stack effect annotations end with a colon = ( quot: ( a: ( -- ) -- b ) -- x ), ( x: number -- )\n\t\t\t\t\t\tword throws unconditional error = *\n\t\t\t\t\t\tany other word-like variable name = a ? q' etc\n\n\t\t\t\t\thttps://docs.factorcode.org/content/article-effects.html\n\n\t\t\t\t\tthese are pretty complicated to highlight properly without a real parser, and therefore out of scope\n\t\t\t\t\tthe old pattern, which may be later useful, was: (^|\\s)(?:call|execute|eval)?\\((?:\\s+[^\"\\r\\n\\t ]\\S*)*?\\s+--(?:\\s+[^\"\\n\\t ]\\S*)*?\\s+\\)(?=\\s|$)\n\t\t\t\t*/\n\n\t\t\t// current solution is not great\n\t\t\t'stack-effect-delimiter': [\n\t\t\t\t{\n\t\t\t\t\t// opening parenthesis\n\t\t\t\t\tpattern: /(^|\\s)(?:call|eval|execute)?\\((?=\\s)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// middle --\n\t\t\t\t\tpattern: /(\\s)--(?=\\s)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// closing parenthesis\n\t\t\t\t\tpattern: /(\\s)\\)(?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t'combinators': {\n\t\t\t\tpattern: arrToWordsRegExp([\n\t\t\t\t\t// kernel\n\t\t\t\t\t'2bi',\n\t\t\t\t\t'while',\n\t\t\t\t\t'2tri',\n\t\t\t\t\t'bi*',\n\t\t\t\t\t'4dip',\n\t\t\t\t\t'both?',\n\t\t\t\t\t'same?',\n\t\t\t\t\t'tri@',\n\t\t\t\t\t'curry',\n\t\t\t\t\t'prepose',\n\t\t\t\t\t'3bi',\n\t\t\t\t\t'?if',\n\t\t\t\t\t'tri*',\n\t\t\t\t\t'2keep',\n\t\t\t\t\t'3keep',\n\t\t\t\t\t'curried',\n\t\t\t\t\t'2keepd',\n\t\t\t\t\t'when',\n\t\t\t\t\t'2bi*',\n\t\t\t\t\t'2tri*',\n\t\t\t\t\t'4keep',\n\t\t\t\t\t'bi@',\n\t\t\t\t\t'keepdd',\n\t\t\t\t\t'do',\n\t\t\t\t\t'unless*',\n\t\t\t\t\t'tri-curry',\n\t\t\t\t\t'if*',\n\t\t\t\t\t'loop',\n\t\t\t\t\t'bi-curry*',\n\t\t\t\t\t'when*',\n\t\t\t\t\t'2bi@',\n\t\t\t\t\t'2tri@',\n\t\t\t\t\t'with',\n\t\t\t\t\t'2with',\n\t\t\t\t\t'either?',\n\t\t\t\t\t'bi',\n\t\t\t\t\t'until',\n\t\t\t\t\t'3dip',\n\t\t\t\t\t'3curry',\n\t\t\t\t\t'tri-curry*',\n\t\t\t\t\t'tri-curry@',\n\t\t\t\t\t'bi-curry',\n\t\t\t\t\t'keepd',\n\t\t\t\t\t'compose',\n\t\t\t\t\t'2dip',\n\t\t\t\t\t'if',\n\t\t\t\t\t'3tri',\n\t\t\t\t\t'unless',\n\t\t\t\t\t'tuple',\n\t\t\t\t\t'keep',\n\t\t\t\t\t'2curry',\n\t\t\t\t\t'tri',\n\t\t\t\t\t'most',\n\t\t\t\t\t'while*',\n\t\t\t\t\t'dip',\n\t\t\t\t\t'composed',\n\t\t\t\t\t'bi-curry@',\n\t\t\t\t\t// sequences\n\t\t\t\t\t'find-last-from',\n\t\t\t\t\t'trim-head-slice',\n\t\t\t\t\t'map-as',\n\t\t\t\t\t'each-from',\n\t\t\t\t\t'none?',\n\t\t\t\t\t'trim-tail',\n\t\t\t\t\t'partition',\n\t\t\t\t\t'if-empty',\n\t\t\t\t\t'accumulate*',\n\t\t\t\t\t'reject!',\n\t\t\t\t\t'find-from',\n\t\t\t\t\t'accumulate-as',\n\t\t\t\t\t'collector-for-as',\n\t\t\t\t\t'reject',\n\t\t\t\t\t'map',\n\t\t\t\t\t'map-sum',\n\t\t\t\t\t'accumulate!',\n\t\t\t\t\t'2each-from',\n\t\t\t\t\t'follow',\n\t\t\t\t\t'supremum-by',\n\t\t\t\t\t'map!',\n\t\t\t\t\t'unless-empty',\n\t\t\t\t\t'collector',\n\t\t\t\t\t'padding',\n\t\t\t\t\t'reduce-index',\n\t\t\t\t\t'replicate-as',\n\t\t\t\t\t'infimum-by',\n\t\t\t\t\t'trim-tail-slice',\n\t\t\t\t\t'count',\n\t\t\t\t\t'find-index',\n\t\t\t\t\t'filter',\n\t\t\t\t\t'accumulate*!',\n\t\t\t\t\t'reject-as',\n\t\t\t\t\t'map-integers',\n\t\t\t\t\t'map-find',\n\t\t\t\t\t'reduce',\n\t\t\t\t\t'selector',\n\t\t\t\t\t'interleave',\n\t\t\t\t\t'2map',\n\t\t\t\t\t'filter-as',\n\t\t\t\t\t'binary-reduce',\n\t\t\t\t\t'map-index-as',\n\t\t\t\t\t'find',\n\t\t\t\t\t'produce',\n\t\t\t\t\t'filter!',\n\t\t\t\t\t'replicate',\n\t\t\t\t\t'cartesian-map',\n\t\t\t\t\t'cartesian-each',\n\t\t\t\t\t'find-index-from',\n\t\t\t\t\t'map-find-last',\n\t\t\t\t\t'3map-as',\n\t\t\t\t\t'3map',\n\t\t\t\t\t'find-last',\n\t\t\t\t\t'selector-as',\n\t\t\t\t\t'2map-as',\n\t\t\t\t\t'2map-reduce',\n\t\t\t\t\t'accumulate',\n\t\t\t\t\t'each',\n\t\t\t\t\t'each-index',\n\t\t\t\t\t'accumulate*-as',\n\t\t\t\t\t'when-empty',\n\t\t\t\t\t'all?',\n\t\t\t\t\t'collector-as',\n\t\t\t\t\t'push-either',\n\t\t\t\t\t'new-like',\n\t\t\t\t\t'collector-for',\n\t\t\t\t\t'2selector',\n\t\t\t\t\t'push-if',\n\t\t\t\t\t'2all?',\n\t\t\t\t\t'map-reduce',\n\t\t\t\t\t'3each',\n\t\t\t\t\t'any?',\n\t\t\t\t\t'trim-slice',\n\t\t\t\t\t'2reduce',\n\t\t\t\t\t'change-nth',\n\t\t\t\t\t'produce-as',\n\t\t\t\t\t'2each',\n\t\t\t\t\t'trim',\n\t\t\t\t\t'trim-head',\n\t\t\t\t\t'cartesian-find',\n\t\t\t\t\t'map-index',\n\t\t\t\t\t// math\n\t\t\t\t\t'if-zero',\n\t\t\t\t\t'each-integer',\n\t\t\t\t\t'unless-zero',\n\t\t\t\t\t'(find-integer)',\n\t\t\t\t\t'when-zero',\n\t\t\t\t\t'find-last-integer',\n\t\t\t\t\t'(all-integers?)',\n\t\t\t\t\t'times',\n\t\t\t\t\t'(each-integer)',\n\t\t\t\t\t'find-integer',\n\t\t\t\t\t'all-integers?',\n\t\t\t\t\t// math.combinators\n\t\t\t\t\t'unless-negative',\n\t\t\t\t\t'if-positive',\n\t\t\t\t\t'when-positive',\n\t\t\t\t\t'when-negative',\n\t\t\t\t\t'unless-positive',\n\t\t\t\t\t'if-negative',\n\t\t\t\t\t// combinators\n\t\t\t\t\t'case',\n\t\t\t\t\t'2cleave',\n\t\t\t\t\t'cond>quot',\n\t\t\t\t\t'case>quot',\n\t\t\t\t\t'3cleave',\n\t\t\t\t\t'wrong-values',\n\t\t\t\t\t'to-fixed-point',\n\t\t\t\t\t'alist>quot',\n\t\t\t\t\t'cond',\n\t\t\t\t\t'cleave',\n\t\t\t\t\t'call-effect',\n\t\t\t\t\t'recursive-hashcode',\n\t\t\t\t\t'spread',\n\t\t\t\t\t'deep-spread>quot',\n\t\t\t\t\t// combinators.short-circuit\n\t\t\t\t\t'2||',\n\t\t\t\t\t'0||',\n\t\t\t\t\t'n||',\n\t\t\t\t\t'0&&',\n\t\t\t\t\t'2&&',\n\t\t\t\t\t'3||',\n\t\t\t\t\t'1||',\n\t\t\t\t\t'1&&',\n\t\t\t\t\t'n&&',\n\t\t\t\t\t'3&&',\n\t\t\t\t\t// combinators.smart\n\t\t\t\t\t'smart-unless*',\n\t\t\t\t\t'keep-inputs',\n\t\t\t\t\t'reduce-outputs',\n\t\t\t\t\t'smart-when*',\n\t\t\t\t\t'cleave>array',\n\t\t\t\t\t'smart-with',\n\t\t\t\t\t'smart-apply',\n\t\t\t\t\t'smart-if',\n\t\t\t\t\t'inputs/outputs',\n\t\t\t\t\t'output>sequence-n',\n\t\t\t\t\t'map-outputs',\n\t\t\t\t\t'map-reduce-outputs',\n\t\t\t\t\t'dropping',\n\t\t\t\t\t'output>array',\n\t\t\t\t\t'smart-map-reduce',\n\t\t\t\t\t'smart-2map-reduce',\n\t\t\t\t\t'output>array-n',\n\t\t\t\t\t'nullary',\n\t\t\t\t\t'input<sequence',\n\t\t\t\t\t'append-outputs',\n\t\t\t\t\t'drop-inputs',\n\t\t\t\t\t'inputs',\n\t\t\t\t\t'smart-2reduce',\n\t\t\t\t\t'drop-outputs',\n\t\t\t\t\t'smart-reduce',\n\t\t\t\t\t'preserving',\n\t\t\t\t\t'smart-when',\n\t\t\t\t\t'outputs',\n\t\t\t\t\t'append-outputs-as',\n\t\t\t\t\t'smart-unless',\n\t\t\t\t\t'smart-if*',\n\t\t\t\t\t'sum-outputs',\n\t\t\t\t\t'input<sequence-unsafe',\n\t\t\t\t\t'output>sequence',\n\t\t\t\t\t// tafn\n\t\t\t\t]),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\n\t\t\t'kernel-builtin': {\n\t\t\t\tpattern: arrToWordsRegExp([\n\t\t\t\t\t'or',\n\t\t\t\t\t'2nipd',\n\t\t\t\t\t'4drop',\n\t\t\t\t\t'tuck',\n\t\t\t\t\t'wrapper',\n\t\t\t\t\t'nip',\n\t\t\t\t\t'wrapper?',\n\t\t\t\t\t'callstack>array',\n\t\t\t\t\t'die',\n\t\t\t\t\t'dupd',\n\t\t\t\t\t'callstack',\n\t\t\t\t\t'callstack?',\n\t\t\t\t\t'3dup',\n\t\t\t\t\t'hashcode',\n\t\t\t\t\t'pick',\n\t\t\t\t\t'4nip',\n\t\t\t\t\t'build',\n\t\t\t\t\t'>boolean',\n\t\t\t\t\t'nipd',\n\t\t\t\t\t'clone',\n\t\t\t\t\t'5nip',\n\t\t\t\t\t'eq?',\n\t\t\t\t\t'?',\n\t\t\t\t\t'=',\n\t\t\t\t\t'swapd',\n\t\t\t\t\t'2over',\n\t\t\t\t\t'clear',\n\t\t\t\t\t'2dup',\n\t\t\t\t\t'get-retainstack',\n\t\t\t\t\t'not',\n\t\t\t\t\t'tuple?',\n\t\t\t\t\t'dup',\n\t\t\t\t\t'3nipd',\n\t\t\t\t\t'call',\n\t\t\t\t\t'-rotd',\n\t\t\t\t\t'object',\n\t\t\t\t\t'drop',\n\t\t\t\t\t'assert=',\n\t\t\t\t\t'assert?',\n\t\t\t\t\t'-rot',\n\t\t\t\t\t'execute',\n\t\t\t\t\t'boa',\n\t\t\t\t\t'get-callstack',\n\t\t\t\t\t'curried?',\n\t\t\t\t\t'3drop',\n\t\t\t\t\t'pickd',\n\t\t\t\t\t'overd',\n\t\t\t\t\t'over',\n\t\t\t\t\t'roll',\n\t\t\t\t\t'3nip',\n\t\t\t\t\t'swap',\n\t\t\t\t\t'and',\n\t\t\t\t\t'2nip',\n\t\t\t\t\t'rotd',\n\t\t\t\t\t'throw',\n\t\t\t\t\t'(clone)',\n\t\t\t\t\t'hashcode*',\n\t\t\t\t\t'spin',\n\t\t\t\t\t'reach',\n\t\t\t\t\t'4dup',\n\t\t\t\t\t'equal?',\n\t\t\t\t\t'get-datastack',\n\t\t\t\t\t'assert',\n\t\t\t\t\t'2drop',\n\t\t\t\t\t'<wrapper>',\n\t\t\t\t\t'boolean?',\n\t\t\t\t\t'identity-hashcode',\n\t\t\t\t\t'identity-tuple?',\n\t\t\t\t\t'null',\n\t\t\t\t\t'composed?',\n\t\t\t\t\t'new',\n\t\t\t\t\t'5drop',\n\t\t\t\t\t'rot',\n\t\t\t\t\t'-roll',\n\t\t\t\t\t'xor',\n\t\t\t\t\t'identity-tuple',\n\t\t\t\t\t'boolean',\n\t\t\t\t]),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'variable',\n\t\t\t},\n\n\t\t\t'sequences-builtin': {\n\t\t\t\tpattern: arrToWordsRegExp([\n\t\t\t\t\t'member-eq?',\n\t\t\t\t\t'mismatch',\n\t\t\t\t\t'append',\n\t\t\t\t\t'assert-sequence=',\n\t\t\t\t\t'longer',\n\t\t\t\t\t'repetition',\n\t\t\t\t\t'clone-like',\n\t\t\t\t\t'3sequence',\n\t\t\t\t\t'assert-sequence?',\n\t\t\t\t\t'last-index-from',\n\t\t\t\t\t'reversed',\n\t\t\t\t\t'index-from',\n\t\t\t\t\t'cut*',\n\t\t\t\t\t'pad-tail',\n\t\t\t\t\t'join-as',\n\t\t\t\t\t'remove-eq!',\n\t\t\t\t\t'concat-as',\n\t\t\t\t\t'but-last',\n\t\t\t\t\t'snip',\n\t\t\t\t\t'nths',\n\t\t\t\t\t'nth',\n\t\t\t\t\t'sequence',\n\t\t\t\t\t'longest',\n\t\t\t\t\t'slice?',\n\t\t\t\t\t'<slice>',\n\t\t\t\t\t'remove-nth',\n\t\t\t\t\t'tail-slice',\n\t\t\t\t\t'empty?',\n\t\t\t\t\t'tail*',\n\t\t\t\t\t'member?',\n\t\t\t\t\t'virtual-sequence?',\n\t\t\t\t\t'set-length',\n\t\t\t\t\t'drop-prefix',\n\t\t\t\t\t'iota',\n\t\t\t\t\t'unclip',\n\t\t\t\t\t'bounds-error?',\n\t\t\t\t\t'unclip-last-slice',\n\t\t\t\t\t'non-negative-integer-expected',\n\t\t\t\t\t'non-negative-integer-expected?',\n\t\t\t\t\t'midpoint@',\n\t\t\t\t\t'longer?',\n\t\t\t\t\t'?set-nth',\n\t\t\t\t\t'?first',\n\t\t\t\t\t'rest-slice',\n\t\t\t\t\t'prepend-as',\n\t\t\t\t\t'prepend',\n\t\t\t\t\t'fourth',\n\t\t\t\t\t'sift',\n\t\t\t\t\t'subseq-start',\n\t\t\t\t\t'new-sequence',\n\t\t\t\t\t'?last',\n\t\t\t\t\t'like',\n\t\t\t\t\t'first4',\n\t\t\t\t\t'1sequence',\n\t\t\t\t\t'reverse',\n\t\t\t\t\t'slice',\n\t\t\t\t\t'virtual@',\n\t\t\t\t\t'repetition?',\n\t\t\t\t\t'set-last',\n\t\t\t\t\t'index',\n\t\t\t\t\t'4sequence',\n\t\t\t\t\t'max-length',\n\t\t\t\t\t'set-second',\n\t\t\t\t\t'immutable-sequence',\n\t\t\t\t\t'first2',\n\t\t\t\t\t'first3',\n\t\t\t\t\t'supremum',\n\t\t\t\t\t'unclip-slice',\n\t\t\t\t\t'suffix!',\n\t\t\t\t\t'insert-nth',\n\t\t\t\t\t'tail',\n\t\t\t\t\t'3append',\n\t\t\t\t\t'short',\n\t\t\t\t\t'suffix',\n\t\t\t\t\t'concat',\n\t\t\t\t\t'flip',\n\t\t\t\t\t'immutable?',\n\t\t\t\t\t'reverse!',\n\t\t\t\t\t'2sequence',\n\t\t\t\t\t'sum',\n\t\t\t\t\t'delete-all',\n\t\t\t\t\t'indices',\n\t\t\t\t\t'snip-slice',\n\t\t\t\t\t'<iota>',\n\t\t\t\t\t'check-slice',\n\t\t\t\t\t'sequence?',\n\t\t\t\t\t'head',\n\t\t\t\t\t'append-as',\n\t\t\t\t\t'halves',\n\t\t\t\t\t'sequence=',\n\t\t\t\t\t'collapse-slice',\n\t\t\t\t\t'?second',\n\t\t\t\t\t'slice-error?',\n\t\t\t\t\t'product',\n\t\t\t\t\t'bounds-check?',\n\t\t\t\t\t'bounds-check',\n\t\t\t\t\t'immutable',\n\t\t\t\t\t'virtual-exemplar',\n\t\t\t\t\t'harvest',\n\t\t\t\t\t'remove',\n\t\t\t\t\t'pad-head',\n\t\t\t\t\t'last',\n\t\t\t\t\t'set-fourth',\n\t\t\t\t\t'cartesian-product',\n\t\t\t\t\t'remove-eq',\n\t\t\t\t\t'shorten',\n\t\t\t\t\t'shorter',\n\t\t\t\t\t'reversed?',\n\t\t\t\t\t'shorter?',\n\t\t\t\t\t'shortest',\n\t\t\t\t\t'head-slice',\n\t\t\t\t\t'pop*',\n\t\t\t\t\t'tail-slice*',\n\t\t\t\t\t'but-last-slice',\n\t\t\t\t\t'iota?',\n\t\t\t\t\t'append!',\n\t\t\t\t\t'cut-slice',\n\t\t\t\t\t'new-resizable',\n\t\t\t\t\t'head-slice*',\n\t\t\t\t\t'sequence-hashcode',\n\t\t\t\t\t'pop',\n\t\t\t\t\t'set-nth',\n\t\t\t\t\t'?nth',\n\t\t\t\t\t'second',\n\t\t\t\t\t'join',\n\t\t\t\t\t'immutable-sequence?',\n\t\t\t\t\t'<reversed>',\n\t\t\t\t\t'3append-as',\n\t\t\t\t\t'virtual-sequence',\n\t\t\t\t\t'subseq?',\n\t\t\t\t\t'remove-nth!',\n\t\t\t\t\t'length',\n\t\t\t\t\t'last-index',\n\t\t\t\t\t'lengthen',\n\t\t\t\t\t'assert-sequence',\n\t\t\t\t\t'copy',\n\t\t\t\t\t'move',\n\t\t\t\t\t'third',\n\t\t\t\t\t'first',\n\t\t\t\t\t'tail?',\n\t\t\t\t\t'set-first',\n\t\t\t\t\t'prefix',\n\t\t\t\t\t'bounds-error',\n\t\t\t\t\t'<repetition>',\n\t\t\t\t\t'exchange',\n\t\t\t\t\t'surround',\n\t\t\t\t\t'cut',\n\t\t\t\t\t'min-length',\n\t\t\t\t\t'set-third',\n\t\t\t\t\t'push-all',\n\t\t\t\t\t'head?',\n\t\t\t\t\t'subseq-start-from',\n\t\t\t\t\t'delete-slice',\n\t\t\t\t\t'rest',\n\t\t\t\t\t'sum-lengths',\n\t\t\t\t\t'head*',\n\t\t\t\t\t'infimum',\n\t\t\t\t\t'remove!',\n\t\t\t\t\t'glue',\n\t\t\t\t\t'slice-error',\n\t\t\t\t\t'subseq',\n\t\t\t\t\t'push',\n\t\t\t\t\t'replace-slice',\n\t\t\t\t\t'subseq-as',\n\t\t\t\t\t'unclip-last',\n\t\t\t\t]),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'variable',\n\t\t\t},\n\n\t\t\t'math-builtin': {\n\t\t\t\tpattern: arrToWordsRegExp([\n\t\t\t\t\t'number=',\n\t\t\t\t\t'next-power-of-2',\n\t\t\t\t\t'?1+',\n\t\t\t\t\t'fp-special?',\n\t\t\t\t\t'imaginary-part',\n\t\t\t\t\t'float>bits',\n\t\t\t\t\t'number?',\n\t\t\t\t\t'fp-infinity?',\n\t\t\t\t\t'bignum?',\n\t\t\t\t\t'fp-snan?',\n\t\t\t\t\t'denominator',\n\t\t\t\t\t'gcd',\n\t\t\t\t\t'*',\n\t\t\t\t\t'+',\n\t\t\t\t\t'fp-bitwise=',\n\t\t\t\t\t'-',\n\t\t\t\t\t'u>=',\n\t\t\t\t\t'/',\n\t\t\t\t\t'>=',\n\t\t\t\t\t'bitand',\n\t\t\t\t\t'power-of-2?',\n\t\t\t\t\t'log2-expects-positive',\n\t\t\t\t\t'neg?',\n\t\t\t\t\t'<',\n\t\t\t\t\t'log2',\n\t\t\t\t\t'>',\n\t\t\t\t\t'integer?',\n\t\t\t\t\t'number',\n\t\t\t\t\t'bits>double',\n\t\t\t\t\t'2/',\n\t\t\t\t\t'zero?',\n\t\t\t\t\t'bits>float',\n\t\t\t\t\t'float?',\n\t\t\t\t\t'shift',\n\t\t\t\t\t'ratio?',\n\t\t\t\t\t'rect>',\n\t\t\t\t\t'even?',\n\t\t\t\t\t'ratio',\n\t\t\t\t\t'fp-sign',\n\t\t\t\t\t'bitnot',\n\t\t\t\t\t'>fixnum',\n\t\t\t\t\t'complex?',\n\t\t\t\t\t'/i',\n\t\t\t\t\t'integer>fixnum',\n\t\t\t\t\t'/f',\n\t\t\t\t\t'sgn',\n\t\t\t\t\t'>bignum',\n\t\t\t\t\t'next-float',\n\t\t\t\t\t'u<',\n\t\t\t\t\t'u>',\n\t\t\t\t\t'mod',\n\t\t\t\t\t'recip',\n\t\t\t\t\t'rational',\n\t\t\t\t\t'>float',\n\t\t\t\t\t'2^',\n\t\t\t\t\t'integer',\n\t\t\t\t\t'fixnum?',\n\t\t\t\t\t'neg',\n\t\t\t\t\t'fixnum',\n\t\t\t\t\t'sq',\n\t\t\t\t\t'bignum',\n\t\t\t\t\t'>rect',\n\t\t\t\t\t'bit?',\n\t\t\t\t\t'fp-qnan?',\n\t\t\t\t\t'simple-gcd',\n\t\t\t\t\t'complex',\n\t\t\t\t\t'<fp-nan>',\n\t\t\t\t\t'real',\n\t\t\t\t\t'>fraction',\n\t\t\t\t\t'double>bits',\n\t\t\t\t\t'bitor',\n\t\t\t\t\t'rem',\n\t\t\t\t\t'fp-nan-payload',\n\t\t\t\t\t'real-part',\n\t\t\t\t\t'log2-expects-positive?',\n\t\t\t\t\t'prev-float',\n\t\t\t\t\t'align',\n\t\t\t\t\t'unordered?',\n\t\t\t\t\t'float',\n\t\t\t\t\t'fp-nan?',\n\t\t\t\t\t'abs',\n\t\t\t\t\t'bitxor',\n\t\t\t\t\t'integer>fixnum-strict',\n\t\t\t\t\t'u<=',\n\t\t\t\t\t'odd?',\n\t\t\t\t\t'<=',\n\t\t\t\t\t'/mod',\n\t\t\t\t\t'>integer',\n\t\t\t\t\t'real?',\n\t\t\t\t\t'rational?',\n\t\t\t\t\t'numerator',\n\t\t\t\t]),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'variable',\n\t\t\t},\n\n\t\t\t'constructor-word': {\n\t\t\t\t// <array> but not <=>\n\t\t\t\tpattern: /(^|\\s)<(?!=+>|-+>)\\S+>(?=\\s|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\n\t\t\t'other-builtin-syntax': {\n\t\t\t\tpattern: arrToWordsRegExp([\n\t\t\t\t\t// syntax\n\t\t\t\t\t'=======',\n\t\t\t\t\t'recursive',\n\t\t\t\t\t'flushable',\n\t\t\t\t\t'>>',\n\t\t\t\t\t'<<<<<<',\n\t\t\t\t\t'M\\\\',\n\t\t\t\t\t'B',\n\t\t\t\t\t'PRIVATE>',\n\t\t\t\t\t'\\\\',\n\t\t\t\t\t'======',\n\t\t\t\t\t'final',\n\t\t\t\t\t'inline',\n\t\t\t\t\t'delimiter',\n\t\t\t\t\t'deprecated',\n\t\t\t\t\t'<PRIVATE',\n\t\t\t\t\t'>>>>>>',\n\t\t\t\t\t'<<<<<<<',\n\t\t\t\t\t'parse-complex',\n\t\t\t\t\t'malformed-complex',\n\t\t\t\t\t'read-only',\n\t\t\t\t\t'>>>>>>>',\n\t\t\t\t\t'call-next-method',\n\t\t\t\t\t'<<',\n\t\t\t\t\t'foldable',\n\t\t\t\t\t// literals\n\t\t\t\t\t'$',\n\t\t\t\t\t'$[',\n\t\t\t\t\t'${',\n\t\t\t\t]),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\n\t\t\t/*\n\t\t\t\t\tfull list of supported word naming conventions: (the convention appears outside of the [brackets])\n\t\t\t\t\t\tset-[x]\n\t\t\t\t\t\tchange-[x]\n\t\t\t\t\t\twith-[x]\n\t\t\t\t\t\tnew-[x]\n\t\t\t\t\t\t>[string]\n\t\t\t\t\t\t[base]>\n\t\t\t\t\t\t[string]>[number]\n\t\t\t\t\t\t+[symbol]+\n\t\t\t\t\t\t[boolean-word]?\n\t\t\t\t\t\t?[of]\n\t\t\t\t\t\t[slot-reader]>>\n\t\t\t\t\t\t>>[slot-setter]\n\t\t\t\t\t\t[slot-writer]<<\n\t\t\t\t\t\t([implementation-detail])\n\t\t\t\t\t\t[mutater]!\n\t\t\t\t\t\t[variant]*\n\t\t\t\t\t\t[prettyprint].\n\t\t\t\t\t\t$[help-markup]\n\n\t\t\t\t\t<constructors>, SYNTAX:, etc are supported by their own patterns.\n\n\t\t\t\t\t`with` and `new` from `kernel` are their own builtins.\n\n\t\t\t\t\tsee <https://docs.factorcode.org/content/article-conventions.html>\n\t\t\t\t*/\n\t\t\t'conventionally-named-word': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|\\s)(?!\")(?:(?:change|new|set|with)-\\S+|\\$\\S+|>[^>\\s]+|[^:>\\s]+>|[^>\\s]+>[^>\\s]+|\\+[^+\\s]+\\+|[^?\\s]+\\?|\\?[^?\\s]+|[^>\\s]+>>|>>[^>\\s]+|[^<\\s]+<<|\\([^()\\s]+\\)|[^!\\s]+!|[^*\\s]\\S*\\*|[^.\\s]\\S*\\.)(?=\\s|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\n\t\t\t'colon-syntax': {\n\t\t\t\tpattern: /(^|\\s)(?:[A-Z0-9\\-]+#?)?:{1,2}\\s+(?:;\\S+|(?!;)\\S+)(?=\\s|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'function',\n\t\t\t},\n\n\t\t\t'semicolon-or-setlocal': {\n\t\t\t\tpattern: /(\\s)(?:;|:>)(?=\\s|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'function',\n\t\t\t},\n\n\t\t\t// do not highlight leading } or trailing X{ at the begin/end of the file as it's invalid syntax\n\t\t\t'curly-brace-literal-delimiter': [\n\t\t\t\t{\n\t\t\t\t\t// opening\n\t\t\t\t\tpattern: /(^|\\s)[a-z]*\\{(?=\\s)/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// closing\n\t\t\t\t\tpattern: /(\\s)\\}(?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t// do not highlight leading ] or trailing [ at the begin/end of the file as it's invalid syntax\n\t\t\t'quotation-delimiter': [\n\t\t\t\t{\n\t\t\t\t\t// opening\n\t\t\t\t\tpattern: /(^|\\s)\\[(?=\\s)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// closing\n\t\t\t\t\tpattern: /(\\s)\\](?=\\s|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t'normal-word': {\n\t\t\t\tpattern: /(^|\\s)[^\"\\s]\\S*(?=\\s|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t/*\n\t\t\t\t\tbasic first-class string \"a\"\n\t\t\t\t\t\twith escaped double-quote \"a\\\"\"\n\t\t\t\t\t\tescaped backslash \"\\\\\"\n\t\t\t\t\t\tand general escapes since Factor has so many \"\\N\"\n\n\t\t\t\t\tsyntax that works in the reference implementation that isn't fully\n\t\t\t\t\tsupported because it's an implementation detail:\n\t\t\t\t\t\t\"string 1\"\"string 2\" -> 2 strings (works anyway)\n\t\t\t\t\t\t\"string\"5 -> string, 5\n\t\t\t\t\t\t\"string\"[ ] -> string, quotation\n\t\t\t\t\t\t{ \"a\"} -> array<string>\n\n\t\t\t\t\tthe rest of those examples all properly recognise the string, but not\n\t\t\t\t\t\tthe other object (number, quotation, etc)\n\t\t\t\t\tthis is fine for a regex-only implementation.\n\t\t\t\t*/\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:\\\\\\S|[^\"\\\\])*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: string_inside,\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/false.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'false'>} */\nexport default {\n\tid: 'false',\n\tgrammar () {\n\t\t/**\n\t\t * Based on the manual by Wouter van Oortmerssen.\n\t\t *\n\t\t * @see {@link https://github.com/PrismJS/prism/issues/2801#issue-829717504}\n\t\t */\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\{[^}]*\\}/,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"]*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'character-code': {\n\t\t\t\tpattern: /'(?:[^\\r]|\\r\\n?)/,\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t\t'assembler-code': {\n\t\t\t\tpattern: /\\d+`/,\n\t\t\t\talias: 'important',\n\t\t\t},\n\t\t\t'number': /\\d+/,\n\t\t\t'operator': /[-!#$%&'*+,./:;=>?@\\\\^_`|~ßø]/,\n\t\t\t'punctuation': /\\[|\\]/,\n\t\t\t'variable': /[a-z]/,\n\t\t\t'non-standard': {\n\t\t\t\tpattern: /[()<BDO®]/,\n\t\t\t\talias: 'bold',\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/firestore-security-rules.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'firestore-security-rules'>} */\nexport default {\n\tid: 'firestore-security-rules',\n\tbase: clike,\n\tgrammar () {\n\t\treturn {\n\t\t\t'comment': /\\/\\/.*/,\n\t\t\t'keyword': /\\b(?:allow|function|if|match|null|return|rules_version|service)\\b/,\n\t\t\t'operator': /&&|\\|\\||[<>!=]=?|[-+*/%]|\\b(?:in|is)\\b/,\n\t\t\t$insert: {\n\t\t\t\t'path': {\n\t\t\t\t\t$before: 'keyword',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[\\s(),])(?:\\/(?:[\\w\\xA0-\\uFFFF]+|\\{[\\w\\xA0-\\uFFFF]+(?:=\\*\\*)?\\}|\\$\\([\\w\\xA0-\\uFFFF.]+\\)))+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'variable': {\n\t\t\t\t\t\t\tpattern: /\\{[\\w\\xA0-\\uFFFF]+(?:=\\*\\*)?\\}|\\$\\([\\w\\xA0-\\uFFFF.]+\\)/,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'operator': /=/,\n\t\t\t\t\t\t\t\t'keyword': /\\*\\*/,\n\t\t\t\t\t\t\t\t'punctuation': /[.$(){}]/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /\\//,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'method': {\n\t\t\t\t\t$before: 'keyword',\n\t\t\t\t\t// to make the pattern shorter, the actual method names are omitted\n\t\t\t\t\tpattern: /(\\ballow\\s+)[a-z]+(?:\\s*,\\s*[a-z]+)*(?=\\s*[:;])/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'builtin',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /,/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t$delete: ['class-name'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/flow.js",
    "content": "import { toArray } from '../util/iterables.js';\nimport javascript from './javascript.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'flow'>} */\nexport default {\n\tid: 'flow',\n\tbase: javascript,\n\tgrammar ({ base }) {\n\t\tconst fnVariable = /** @type {import('../types.d.ts').GrammarToken} */ (\n\t\t\tbase['function-variable']\n\t\t);\n\t\tfnVariable.pattern =\n\t\t\t/(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=\\s*(?:function\\b|(?:\\([^()]*\\)(?:\\s*:\\s*\\w+)?|(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/i;\n\n\t\treturn {\n\t\t\t'keyword': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^$]\\b)(?:Class|declare|opaque|type)\\b(?!\\$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^$]\\B)\\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\\b(?!\\$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t...toArray(/** @type {import('../types.d.ts').GrammarTokens} */ (base).keyword),\n\t\t\t],\n\t\t\t$insert: {\n\t\t\t\t'type': {\n\t\t\t\t\t$before: 'keyword',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\\b/,\n\t\t\t\t\talias: 'class-name',\n\t\t\t\t},\n\t\t\t\t'flow-punctuation': {\n\t\t\t\t\t$before: 'operator',\n\t\t\t\t\tpattern: /\\{\\||\\|\\}/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t},\n\t\t\t$delete: ['parameter'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/fortran.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'fortran'>} */\nexport default {\n\tid: 'fortran',\n\tgrammar: {\n\t\t'quoted-number': {\n\t\t\tpattern: /[BOZ](['\"])[A-F0-9]+\\1/i,\n\t\t\talias: 'number',\n\t\t},\n\t\t'string': {\n\t\t\tpattern:\n\t\t\t\t/(?:\\b\\w+_)?(['\"])(?:\\1\\1|&(?:\\r\\n?|\\n)(?:[ \\t]*!.*(?:\\r\\n?|\\n)|(?![ \\t]*!))|(?!\\1).)*(?:\\1|&)/,\n\t\t\tinside: {\n\t\t\t\t'comment': {\n\t\t\t\t\tpattern: /(&(?:\\r\\n?|\\n)\\s*)!.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'comment': {\n\t\t\tpattern: /!.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'boolean': /\\.(?:FALSE|TRUE)\\.(?:_\\w+)?/i,\n\t\t'number': /(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[ED][+-]?\\d+)?(?:_\\w+)?/i,\n\t\t'keyword': [\n\t\t\t// Types\n\t\t\t/\\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\\b/i,\n\t\t\t// END statements\n\t\t\t/\\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\\b/i,\n\t\t\t// Statements\n\t\t\t/\\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\\b/i,\n\t\t\t// Others\n\t\t\t/\\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\\b/i,\n\t\t],\n\t\t'operator': [\n\t\t\t/\\*\\*|\\/\\/|=>|[=\\/]=|[<>]=?|::|[+\\-*=%]|\\.[A-Z]+\\./i,\n\t\t\t{\n\t\t\t\t// Use lookbehind to prevent confusion with (/ /)\n\t\t\t\tpattern: /(^|(?!\\().)\\/(?!\\))/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'punctuation': /\\(\\/|\\/\\)|[(),;:&]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/fsharp.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'fsharp'>} */\nexport default {\n\tid: 'fsharp',\n\tbase: clike,\n\toptional: 'xml-doc',\n\tgrammar ({ getOptionalLanguage }) {\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\\\])\\(\\*(?!\\))[\\s\\S]*?\\*\\)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'string': {\n\t\t\t\tpattern: /(?:\"\"\"[\\s\\S]*?\"\"\"|@\"(?:\"\"|[^\"])*\"|\"(?:\\\\[\\s\\S]|[^\\\\\"])*\")B?/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'class-name': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(\\b(?:exception|inherit|interface|new|of|type)\\s+|\\w\\s*:\\s*|\\s:\\??>\\s*)[.\\w]+\\b(?:\\s*(?:->|\\*)\\s*[.\\w]+\\b)*(?!\\s*[:.])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'operator': /->|\\*/,\n\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:let|return|use|yield)(?:!\\B|\\b)|\\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\\b/,\n\t\t\t'number': [\n\t\t\t\t/\\b0x[\\da-fA-F]+(?:LF|lf|un)?\\b/,\n\t\t\t\t/\\b0b[01]+(?:uy|y)?\\b/,\n\t\t\t\t/(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[fm]|e[+-]?\\d+)?\\b/i,\n\t\t\t\t/\\b\\d+(?:[IlLsy]|UL|u[lsy]?)?\\b/,\n\t\t\t],\n\t\t\t'operator':\n\t\t\t\t/([<>~&^])\\1\\1|([*.:<>&])\\2|<-|->|[!=:]=|<?\\|{1,3}>?|\\??(?:<=|>=|<>|[-+*/%=<>])\\??|[!?^&]|~[+~-]|:>|:\\?>?/,\n\t\t\t$insert: {\n\t\t\t\t'preprocessor': {\n\t\t\t\t\t$before: 'keyword',\n\t\t\t\t\tpattern: /(^[\\t ]*)#.*/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'property',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'directive': {\n\t\t\t\t\t\t\tpattern: /(^#)\\b(?:else|endif|if|light|line|nowarn)\\b/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'computation-expression': {\n\t\t\t\t\t$before: 'punctuation',\n\t\t\t\t\tpattern: /\\b[_a-z]\\w*(?=\\s*\\{)/i,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t\t'annotation': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: /\\[<.+?>\\]/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /^\\[<|>\\]$/,\n\t\t\t\t\t\t'class-name': {\n\t\t\t\t\t\t\tpattern: /^\\w+$|(^|;\\s*)[A-Z]\\w*(?=\\()/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'annotation-content': {\n\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\tinside: 'fsharp',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'char': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/'(?:[^\\\\']|\\\\(?:.|\\d{3}|x[a-fA-F\\d]{2}|u[a-fA-F\\d]{4}|U[a-fA-F\\d]{8}))'B?/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'comment': {\n\t\t\t\t\t'doc-comment': /** @type {import('../types.d.ts').GrammarTokens} */ (\n\t\t\t\t\t\tgetOptionalLanguage('xml-doc')\n\t\t\t\t\t)?.slash,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/ftl.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'ftl'>} */\nexport default {\n\tid: 'ftl',\n\trequire: markup,\n\tgrammar () {\n\t\t// https://freemarker.apache.org/docs/dgui_template_exp.html\n\n\t\t// FTL expression with 4 levels of nesting supported\n\t\tlet FTL_EXPR =\n\t\t\t/[^<()\"']|\\((?:<expr>)*\\)|<(?!#--)|<#--(?:[^-]|-(?!->))*-->|\"(?:[^\\\\\"]|\\\\.)*\"|'(?:[^\\\\']|\\\\.)*'/\n\t\t\t\t.source;\n\t\tfor (let i = 0; i < 2; i++) {\n\t\t\tFTL_EXPR = FTL_EXPR.replace(/<expr>/g, () => FTL_EXPR);\n\t\t}\n\t\tFTL_EXPR = FTL_EXPR.replace(/<expr>/g, /[^\\s\\S]/.source);\n\n\t\tconst stringInterpolation = /** @type {GrammarToken} */ ({\n\t\t\tpattern: RegExp(\n\t\t\t\t/(\"|')(?:(?!\\1|\\$\\{)[^\\\\]|\\\\.|\\$\\{(?:(?!\\})(?:<expr>))*\\})*\\1/.source.replace(\n\t\t\t\t\t/<expr>/g,\n\t\t\t\t\t() => FTL_EXPR\n\t\t\t\t)\n\t\t\t),\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation': {\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/((?:^|[^\\\\])(?:\\\\\\\\)*)\\$\\{(?:(?!\\})(?:<expr>))*\\}/.source.replace(\n\t\t\t\t\t\t\t/<expr>/g,\n\t\t\t\t\t\t\t() => FTL_EXPR\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t$rest: /** @type {Grammar['$rest']} */ (null), // see below\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst ftl = /** @type {Grammar} */ ({\n\t\t\t'comment': /<#--[\\s\\S]*?-->/,\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\t// raw string\n\t\t\t\t\tpattern: /\\br(\"|')(?:(?!\\1)[^\\\\]|\\\\.)*\\1/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\tstringInterpolation,\n\t\t\t],\n\t\t\t'keyword': /\\b(?:as)\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'builtin-function': {\n\t\t\t\tpattern: /((?:^|[^?])\\?\\s*)\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'function': /\\b\\w+(?=\\s*\\()/,\n\t\t\t'number': /\\b\\d+(?:\\.\\d+)?\\b/,\n\t\t\t'operator': /\\.\\.[<*!]?|->|--|\\+\\+|&&|\\|\\||\\?{1,2}|[-+*/%!=<>]=?|\\b(?:gt|gte|lt|lte)\\b/,\n\t\t\t'punctuation': /[,;.:()[\\]{}]/,\n\t\t});\n\n\t\t/** @type {GrammarToken & { inside: { interpolation: { inside: Grammar } } }} */ (\n\t\t\tstringInterpolation\n\t\t).inside.interpolation.inside.$rest = ftl;\n\n\t\treturn {\n\t\t\t'ftl-comment': {\n\t\t\t\t// the pattern is shortened to be more efficient\n\t\t\t\tpattern: /<#--[\\s\\S]*?-->/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'comment',\n\t\t\t},\n\t\t\t'ftl-directive': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t// eslint-disable-next-line regexp/no-useless-lazy\n\t\t\t\t\t/<\\/?[#@][a-zA-Z](?:<expr>)*?>/.source.replace(/<expr>/g, () => FTL_EXPR),\n\t\t\t\t\t'i'\n\t\t\t\t),\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'directive': {\n\t\t\t\t\t\tpattern: /(^<\\/?)[#@][a-z]\\w*/i,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /^<\\/?|\\/?>$/,\n\t\t\t\t\t'content': {\n\t\t\t\t\t\tpattern: /\\s*\\S[\\s\\S]*/,\n\t\t\t\t\t\talias: 'ftl',\n\t\t\t\t\t\tinside: ftl,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'ftl-interpolation': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t// eslint-disable-next-line regexp/no-useless-lazy\n\t\t\t\t\t/\\$\\{(?:<expr>)*?\\}/.source.replace(/<expr>/g, () => FTL_EXPR),\n\t\t\t\t\t'i'\n\t\t\t\t),\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^\\$\\{|\\}$/,\n\t\t\t\t\t'content': {\n\t\t\t\t\t\tpattern: /\\s*\\S[\\s\\S]*/,\n\t\t\t\t\t\talias: 'ftl',\n\t\t\t\t\t\tinside: ftl,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t$tokenize: embeddedIn('markup'),\n\t\t};\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/gap.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'gap'>} */\nexport default {\n\tid: 'gap',\n\tgrammar () {\n\t\t// https://www.gap-system.org/Manuals/doc/ref/chap4.html\n\t\t// https://www.gap-system.org/Manuals/doc/ref/chap27.html\n\n\t\treturn {\n\t\t\t'shell': {\n\t\t\t\tpattern: /^gap>[\\s\\S]*?(?=^gap>|$(?![\\s\\S]))/m,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'gap': {\n\t\t\t\t\t\tpattern: /^(gap>).+(?:(?:\\r(?:\\n|(?!\\n))|\\n)>.*)*/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: 'gap',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /^gap>/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'comment': {\n\t\t\t\tpattern: /#.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\\\'\"])(?:'(?:[^\\r\\n\\\\']|\\\\.){1,10}'|\"(?:[^\\r\\n\\\\\"]|\\\\.)*\"(?!\")|\"\"\"[\\s\\S]*?\"\"\")/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'continuation': {\n\t\t\t\t\t\tpattern: /([\\r\\n])>/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:Assert|Info|IsBound|QUIT|TryNextMethod|Unbind|and|atomic|break|continue|do|elif|else|end|fi|for|function|if|in|local|mod|not|od|or|quit|readonly|readwrite|rec|repeat|return|then|until|while)\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\n\t\t\t'number': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\w.]|\\.\\.)(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?(?:_[a-z]?)?(?=$|[^\\w.]|\\.\\.)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'continuation': {\n\t\t\t\tpattern: /([\\r\\n])>/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'operator': /->|[-+*/^~=!]|<>|[<>]=?|:=|\\.\\./,\n\t\t\t'punctuation': /[()[\\]{},;.:]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/gcode.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'gcode'>} */\nexport default {\n\tid: 'gcode',\n\tgrammar: {\n\t\t'comment': /;.*|\\B\\(.*?\\)\\B/,\n\t\t'string': {\n\t\t\tpattern: /\"(?:\"\"|[^\"])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword': /\\b[GM]\\d+(?:\\.\\d+)?\\b/,\n\t\t'property': /\\b[A-Z]/,\n\t\t'checksum': {\n\t\t\tpattern: /(\\*)\\d+/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'number',\n\t\t},\n\t\t// T0:0:0\n\t\t'punctuation': /[:*]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/gdscript.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'gdscript'>} */\nexport default {\n\tid: 'gdscript',\n\tgrammar: {\n\t\t'comment': /#.*/,\n\t\t'string': {\n\t\t\tpattern: /@?(?:(\"|')(?:(?!\\1)[^\\n\\\\]|\\\\[\\s\\S])*\\1(?!\"|')|\"\"\"(?:[^\\\\]|\\\\[\\s\\S])*?\"\"\")/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'class-name': {\n\t\t\t// class_name Foo, extends Bar, class InnerClass\n\t\t\t// export(int) var baz, export(int, 0) var i\n\t\t\t// as Node\n\t\t\t// const FOO: int = 9, var bar: bool = true\n\t\t\t// func add(reference: Item, amount: int) -> Item:\n\t\t\tpattern:\n\t\t\t\t/(^(?:class|class_name|extends)[ \\t]+|^export\\([ \\t]*|\\bas[ \\t]+|(?:\\b(?:const|var)[ \\t]|[,(])[ \\t]*\\w+[ \\t]*:[ \\t]*|->[ \\t]*)[a-zA-Z_]\\w*/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\\b/,\n\t\t'function': /\\b[a-z_]\\w*(?=[ \\t]*\\()/i,\n\t\t'variable': /\\$\\w+/,\n\t\t'number': [\n\t\t\t/\\b0b[01_]+\\b|\\b0x[\\da-fA-F_]+\\b|(?:\\b\\d[\\d_]*(?:\\.[\\d_]*)?|\\B\\.[\\d_]+)(?:e[+-]?[\\d_]+)?\\b/,\n\t\t\t/\\b(?:INF|NAN|PI|TAU)\\b/,\n\t\t],\n\t\t'constant': /\\b[A-Z][A-Z_\\d]*\\b/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'operator': /->|:=|&&|\\|\\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,\n\t\t'punctuation': /[.:,;()[\\]{}]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/gedcom.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'gedcom'>} */\nexport default {\n\tid: 'gedcom',\n\tgrammar: {\n\t\t'line-value': {\n\t\t\t// Preceded by level, optional pointer, and tag\n\t\t\tpattern:\n\t\t\t\t/(^[\\t ]*\\d+ +(?:@\\w[\\w!\"$%&'()*+,\\-./:;<=>?[\\\\\\]^`{|}~\\x80-\\xfe #]*@ +)?\\w+ ).+/m,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'pointer': {\n\t\t\t\t\tpattern: /^@\\w[\\w!\"$%&'()*+,\\-./:;<=>?[\\\\\\]^`{|}~\\x80-\\xfe #]*@$/,\n\t\t\t\t\talias: 'variable',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'record': {\n\t\t\t// Preceded by level and optional pointer\n\t\t\tpattern:\n\t\t\t\t/(^[\\t ]*\\d+ +(?:@\\w[\\w!\"$%&'()*+,\\-./:;<=>?[\\\\\\]^`{|}~\\x80-\\xfe #]*@ +)?)\\w+/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'tag',\n\t\t},\n\t\t'level': {\n\t\t\tpattern: /(^[\\t ]*)\\d+/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'number',\n\t\t},\n\t\t'pointer': {\n\t\t\tpattern: /@\\w[\\w!\"$%&'()*+,\\-./:;<=>?[\\\\\\]^`{|}~\\x80-\\xfe #]*@/,\n\t\t\talias: 'variable',\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/gettext.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'gettext'>} */\nexport default {\n\tid: 'gettext',\n\talias: 'po',\n\tgrammar: {\n\t\t'comment': [\n\t\t\t{\n\t\t\t\tpattern: /# .*/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'translator-comment',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /#\\..*/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'extracted-comment',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /#:.*/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'reference-comment',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /#,.*/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'flag-comment',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /#\\|.*/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'previously-untranslated-comment',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /#.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\t\t'string': {\n\t\t\tpattern: /(^|[^\\\\])\"(?:[^\"\\\\]|\\\\.)*\"/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword': /^msg(?:ctxt|id|id_plural|str)\\b/m,\n\t\t'number': /\\b\\d+\\b/,\n\t\t'punctuation': /[\\[\\]]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/gherkin.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'gherkin'>} */\nexport default {\n\tid: 'gherkin',\n\tgrammar () {\n\t\tconst tableRow = /(?:\\r?\\n|\\r)[ \\t]*\\|.+\\|(?:(?!\\|).)*/.source;\n\n\t\treturn {\n\t\t\t'pystring': {\n\t\t\t\tpattern: /(\"\"\"|''')[\\s\\S]+?\\1/,\n\t\t\t\talias: 'string',\n\t\t\t},\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^[ \\t]*)#.*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'tag': {\n\t\t\t\tpattern: /(^[ \\t]*)@\\S*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'feature': {\n\t\t\t\tpattern:\n\t\t\t\t\t/((?:^|\\r?\\n|\\r)[ \\t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\\r\\n]+(?:\\r?\\n|\\r|$))*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'important': {\n\t\t\t\t\t\tpattern: /(:)[^\\r\\n]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'keyword': /[^:\\r\\n]+:/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'scenario': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[ \\t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut|lut chovnatlh|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN|MISHUN SRSLY|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie|Situasie Uiteensetting|Skenario|Skenario konsep|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa|Swa hwaer swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\\r\\n]*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'important': {\n\t\t\t\t\t\tpattern: /(:)[^\\r\\n]*/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'keyword': /[^:\\r\\n]+:/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'table-body': {\n\t\t\t\t// Look-behind is used to skip the table head, which has the same format as any table row\n\t\t\t\tpattern: RegExp('(' + tableRow + ')(?:' + tableRow + ')+'),\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'outline': {\n\t\t\t\t\t\tpattern: /<[^>]+>/,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t\t'td': {\n\t\t\t\t\t\tpattern: /\\s*[^\\s|][^|]*/,\n\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /\\|/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'table-head': {\n\t\t\t\tpattern: RegExp(tableRow),\n\t\t\t\tinside: {\n\t\t\t\t\t'th': {\n\t\t\t\t\t\tpattern: /\\s*[^\\s|][^|]*/,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /\\|/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'atrule': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[ \\t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \\t])/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:\\\\.|[^\"\\\\\\r\\n])*\"|'(?:\\\\.|[^'\\\\\\r\\n])*'/,\n\t\t\t\tinside: {\n\t\t\t\t\t'outline': {\n\t\t\t\t\t\tpattern: /<[^>]+>/,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'outline': {\n\t\t\t\tpattern: /<[^>]+>/,\n\t\t\t\talias: 'variable',\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/git.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'git'>} */\nexport default {\n\tid: 'git',\n\tgrammar: {\n\t\t/*\n\t\t * A simple one line comment like in a git status command\n\t\t * For instance:\n\t\t * $ git status\n\t\t * # On branch infinite-scroll\n\t\t * # Your branch and 'origin/sharedBranches/frontendTeam/infinite-scroll' have diverged,\n\t\t * # and have 1 and 2 different commits each, respectively.\n\t\t * nothing to commit (working directory clean)\n\t\t */\n\t\t'comment': /^#.*/m,\n\n\t\t/*\n\t\t * Regexp to match the changed lines in a git diff output. Check the example below.\n\t\t */\n\t\t'deleted': /^[-–].*/m,\n\t\t'inserted': /^\\+.*/m,\n\n\t\t/*\n\t\t * a string (double and simple quote)\n\t\t */\n\t\t'string': /(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\n\t\t/*\n\t\t * a git command. It starts with a random prompt finishing by a $, then \"git\" then some other parameters\n\t\t * For instance:\n\t\t * $ git add file.txt\n\t\t */\n\t\t'command': {\n\t\t\tpattern: /^.*\\$ git .*$/m,\n\t\t\tinside: {\n\t\t\t\t/*\n\t\t\t\t * A git command can contain a parameter starting by a single or a double dash followed by a string\n\t\t\t\t * For instance:\n\t\t\t\t * $ git diff --cached\n\t\t\t\t * $ git log -p\n\t\t\t\t */\n\t\t\t\t'parameter': /\\s--?\\w+/,\n\t\t\t},\n\t\t},\n\n\t\t/*\n\t\t * Coordinates displayed in a git diff command\n\t\t * For instance:\n\t\t * $ git diff\n\t\t * diff --git file.txt file.txt\n\t\t * index 6214953..1d54a52 100644\n\t\t * --- file.txt\n\t\t * +++ file.txt\n\t\t * @@ -1 +1,2 @@\n\t\t * -Here's my tetx file\n\t\t * +Here's my text file\n\t\t * +And this is the second line\n\t\t */\n\t\t'coord': /^@@.*@@$/m,\n\n\t\t/*\n\t\t * Match a \"commit [SHA1]\" line in a git log output.\n\t\t * For instance:\n\t\t * $ git log\n\t\t * commit a11a14ef7e26f2ca62d4b35eac455ce636d0dc09\n\t\t * Author: lgiraudel\n\t\t * Date:   Mon Feb 17 11:18:34 2014 +0100\n\t\t *\n\t\t *     Add of a new line\n\t\t */\n\t\t'commit-sha1': /^commit \\w{40}$/m,\n\t},\n};\n"
  },
  {
    "path": "src/languages/glsl.js",
    "content": "import c from './c.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'glsl'>} */\nexport default {\n\tid: 'glsl',\n\tbase: c,\n\tgrammar () {\n\t\treturn {\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:active|asm|atomic_uint|attribute|bool|break|buffer|[ibdu]?vec[234]|case|cast|centroid|class|coherent|common|const|continue|default|discard|d?mat[234](?:x[234])?|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|if|[iu]?image[123]D|[iu]?image[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|in|inline|inout|input|int|interface|invariant|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\\b/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/gml.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'gml'>} */\nexport default {\n\tid: 'gml',\n\tbase: clike,\n\talias: 'gamemakerlanguage',\n\tgrammar () {\n\t\treturn {\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\\b/,\n\t\t\t'number': /(?:\\b0x[\\da-f]+|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)[ulf]{0,4}/i,\n\t\t\t'operator':\n\t\t\t\t/--|\\+\\+|[-+%/=]=?|!=|\\*\\*?=?|<[<=>]?|>[=>]?|&&?|\\^\\^?|\\|\\|?|~|\\b(?:and|at|not|or|with|xor)\\b/,\n\t\t\t'constant':\n\t\t\t\t/\\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:alarm|animation_end|boundary|collision|create|destroy|draw|draw_(?:begin|end|post|pre)|end_of_path|game_end|game_start|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|keyboard|keypress|keyrelease|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse|mouse_(?:enter|leave|wheel_down|wheel_up)|no_more_health|no_more_lives|other|outside|room_end|room_start|step|trigger|user\\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\\d|numpad\\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\\w+)\\b/,\n\t\t\t'variable':\n\t\t\t\t/\\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|health|(?:h|v)speed|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:active|angular_(?:damping|velocity)|bullet|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|collision_points|dynamic|fixed_rotation|inertia|kinematic|linear_damping|mass|position_(?:x|y)previous|rotation|sleeping|speed)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|x|(?:x|y)(?:previous|start)|y|argument(?:_relitive|_count|\\d)|argument|global|local|other|self)\\b/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/gn.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'gn'>} */\nexport default {\n\tid: 'gn',\n\talias: 'gni',\n\tgrammar () {\n\t\t// https://gn.googlesource.com/gn/+/refs/heads/main/docs/reference.md#grammar\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /#.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string-literal': {\n\t\t\t\tpattern: /(^|[^\\\\\"])\"(?:[^\\r\\n\"\\\\]|\\\\.)*\"/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/((?:^|[^\\\\])(?:\\\\{2})*)\\$(?:\\{[\\s\\S]*?\\}|[a-zA-Z_]\\w*|0x[a-fA-F0-9]{2})/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'number': /^\\$0x[\\s\\S]{2}$/,\n\t\t\t\t\t\t\t'variable': /^\\$\\w+$/,\n\t\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\tinside: 'gn',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'keyword': /\\b(?:else|if)\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'builtin-function': {\n\t\t\t\t// a few functions get special highlighting to improve readability\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:assert|defined|foreach|import|pool|print|template|tool|toolchain)(?=\\s*\\()/i,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\t\t\t'constant':\n\t\t\t\t/\\b(?:current_cpu|current_os|current_toolchain|default_toolchain|host_cpu|host_os|root_build_dir|root_gen_dir|root_out_dir|target_cpu|target_gen_dir|target_os|target_out_dir)\\b/,\n\n\t\t\t'number': /-?\\b\\d+\\b/,\n\n\t\t\t'operator': /[-+!=<>]=?|&&|\\|\\|/,\n\t\t\t'punctuation': /[(){}[\\],.]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/go-module.js",
    "content": "// https://go.dev/ref/mod#go-mod-file-module\n\n/** @type {import('../types.d.ts').LanguageProto<'go-module'>} */\nexport default {\n\tid: 'go-module',\n\talias: 'go-mod',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\\/\\/.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'version': {\n\t\t\tpattern: /(^|[\\s()[\\],])v\\d+\\.\\d+\\.\\d+(?:[+-][-+.\\w]*)?(?![^\\s()[\\],])/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'number',\n\t\t},\n\t\t'go-version': {\n\t\t\tpattern: /((?:^|\\s)go\\s+)\\d+(?:\\.\\d+){1,2}/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'number',\n\t\t},\n\t\t'keyword': {\n\t\t\tpattern: /^([ \\t]*)(?:exclude|go|module|replace|require|retract)\\b/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'operator': /=>/,\n\t\t'punctuation': /[()[\\],]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/go.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'go'>} */\nexport default {\n\tid: 'go',\n\tbase: clike,\n\tgrammar () {\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\tpattern: /(^|[^\\\\])\"(?:\\\\.|[^\"\\\\\\r\\n])*\"|`[^`]*`/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\\b/,\n\t\t\t'boolean': /\\b(?:_|false|iota|nil|true)\\b/,\n\t\t\t'number': [\n\t\t\t\t// binary and octal integers\n\t\t\t\t/\\b0(?:b[01_]+|o[0-7_]+)i?\\b/i,\n\t\t\t\t// hexadecimal integers and floats\n\t\t\t\t/\\b0x(?:[a-f\\d_]+(?:\\.[a-f\\d_]*)?|\\.[a-f\\d_]+)(?:p[+-]?\\d+(?:_\\d+)*)?i?(?!\\w)/i,\n\t\t\t\t// decimal integers and floats\n\t\t\t\t/(?:\\b\\d[\\d_]*(?:\\.[\\d_]*)?|\\B\\.\\d[\\d_]*)(?:e[+-]?[\\d_]+)?i?(?!\\w)/i,\n\t\t\t],\n\t\t\t'operator':\n\t\t\t\t/[*\\/%^!=]=?|\\+[=+]?|-[=-]?|\\|[=|]?|&(?:=|&|\\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\\.\\.\\./,\n\t\t\t'builtin':\n\t\t\t\t/\\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|imag|u?int(?:8|16|32|64)?|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\\b/,\n\t\t\t$insert: {\n\t\t\t\t'char': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: /'(?:\\\\.|[^'\\\\\\r\\n]){0,10}'/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\t$delete: ['class-name'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/gradle.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'gradle'>} */\nexport default {\n\tid: 'gradle',\n\tbase: clike,\n\tgrammar () {\n\t\tconst interpolation = {\n\t\t\tpattern: /((?:^|[^\\\\$])(?:\\\\{2})*)\\$(?:\\w+|\\{[^{}]*\\})/,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\tpattern: /^\\$\\{?|\\}$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t\t'expression': {\n\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\tinside: 'gradle',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\tpattern: /'''(?:[^\\\\]|\\\\[\\s\\S])*?'''|'(?:\\\\.|[^\\\\'\\r\\n])*'/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\\b/,\n\t\t\t'number':\n\t\t\t\t/\\b(?:0b[01_]+|0x[\\da-f_]+(?:\\.[\\da-f_p\\-]+)?|[\\d_]+(?:\\.[\\d_]+)?(?:e[+-]?\\d+)?)[glidf]?\\b/i,\n\t\t\t'operator': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^.])(?:~|==?~?|\\?[.:]?|\\*(?:[.=]|\\*=?)?|\\.[@&]|\\.\\.<|\\.\\.(?!\\.)|-[-=>]?|\\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\\|[|=]?|\\/=?|\\^=?|%=?)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'punctuation': /\\.+|[{}[\\];(),:$]/,\n\t\t\t$insert: {\n\t\t\t\t'shebang': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: /#!.+/,\n\t\t\t\t\talias: 'comment',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t'interpolation-string': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\"\"\"(?:[^\\\\]|\\\\[\\s\\S])*?\"\"\"|([\"/])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1|\\$\\/(?:[^/$]|\\$(?:[/$]|(?![/$]))|\\/(?!\\$))*\\/\\$/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'spock-block': {\n\t\t\t\t\t$before: 'punctuation',\n\t\t\t\t\tpattern: /\\b(?:and|cleanup|expect|given|setup|then|when|where):/,\n\t\t\t\t},\n\t\t\t\t'annotation': {\n\t\t\t\t\t$before: 'function',\n\t\t\t\t\tpattern: /(^|[^.])@\\w+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/graphql.js",
    "content": "import { withoutTokenize } from '../util/language-util.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'graphql'>} */\nexport default {\n\tid: 'graphql',\n\tgrammar: {\n\t\t'comment': /#.*/,\n\t\t'description': {\n\t\t\tpattern: /(?:\"\"\"(?:[^\"]|(?!\"\"\")\")*\"\"\"|\"(?:\\\\.|[^\\\\\"\\r\\n])*\")(?=\\s*[a-z_])/i,\n\t\t\tgreedy: true,\n\t\t\talias: 'string',\n\t\t\tinside: {\n\t\t\t\t'language-markdown': {\n\t\t\t\t\tpattern: /(^\"(?:\"\")?)(?!\\1)[\\s\\S]+(?=\\1$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'markdown',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"\"\"(?:[^\"]|(?!\"\"\")\")*\"\"\"|\"(?:\\\\.|[^\\\\\"\\r\\n])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'number': /(?:\\B-|\\b)\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?\\b/i,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'variable': /\\$[a-z_]\\w*/i,\n\t\t'directive': {\n\t\t\tpattern: /@[a-z_]\\w*/i,\n\t\t\talias: 'function',\n\t\t},\n\t\t'attr-name': {\n\t\t\tpattern: /\\b[a-z_]\\w*(?=\\s*(?:\\((?:[^()\"]|\"(?:\\\\.|[^\\\\\"\\r\\n])*\")*\\))?:)/i,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'atom-input': {\n\t\t\tpattern: /\\b[A-Z]\\w*Input\\b/,\n\t\t\talias: 'class-name',\n\t\t},\n\t\t'scalar': /\\b(?:Boolean|Float|ID|Int|String)\\b/,\n\t\t'constant': /\\b[A-Z][A-Z_\\d]*\\b/,\n\t\t'class-name': {\n\t\t\tpattern:\n\t\t\t\t/(\\b(?:enum|implements|interface|on|scalar|type|union)\\s+|&\\s*|:\\s*|\\[)[A-Z_]\\w*/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'fragment': {\n\t\t\tpattern: /(\\bfragment\\s+|\\.{3}\\s*(?!on\\b))[a-zA-Z_]\\w*/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'function',\n\t\t},\n\t\t'definition-mutation': {\n\t\t\tpattern: /(\\bmutation\\s+)[a-zA-Z_]\\w*/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'function',\n\t\t},\n\t\t'definition-query': {\n\t\t\tpattern: /(\\bquery\\s+)[a-zA-Z_]\\w*/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'function',\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\\b/,\n\t\t'operator': /[!=|&]|\\.{3}/,\n\t\t'property-query': /\\w+(?=\\s*\\()/,\n\t\t'object': /\\w+(?=\\s*\\{)/,\n\t\t'punctuation': /[!(){}\\[\\]:=,]/,\n\t\t'property': /\\w+/,\n\t\t/** @type {Grammar['$tokenize']} */\n\t\t$tokenize (code, grammar, Prism) {\n\t\t\tconst tokens = Prism.tokenize(code, withoutTokenize(grammar));\n\n\t\t\t/**\n\t\t\t * @param {Token | string} token\n\t\t\t * @returns {token is Token}\n\t\t\t */\n\t\t\tfunction isToken (token) {\n\t\t\t\treturn typeof token !== 'string';\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * get the graphql token stream that we want to customize\n\t\t\t */\n\t\t\tconst validTokens = tokens\n\t\t\t\t.filter(isToken)\n\t\t\t\t.filter(token => token.type !== 'comment' && token.type !== 'scalar');\n\n\t\t\tlet currentIndex = 0;\n\n\t\t\t/**\n\t\t\t * Returns whether the token relative to the current index has the given type.\n\t\t\t *\n\t\t\t * @param {number} [offset=0]\n\t\t\t * @returns {Token}\n\t\t\t */\n\t\t\tfunction getToken (offset = 0) {\n\t\t\t\treturn validTokens[currentIndex + offset];\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Returns whether the token relative to the current index has the given type.\n\t\t\t *\n\t\t\t * @param {string[]} types\n\t\t\t * @param {number} [offset=0]\n\t\t\t * @returns {boolean}\n\t\t\t */\n\t\t\tfunction isTokenType (types, offset = 0) {\n\t\t\t\tfor (let i = 0; i < types.length; i++) {\n\t\t\t\t\tconst token = getToken(i + offset);\n\t\t\t\t\tif (!token || token.type !== types[i]) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Returns the index of the closing bracket to an opening bracket.\n\t\t\t *\n\t\t\t * It is assumed that `token[currentIndex - 1]` is an opening bracket.\n\t\t\t *\n\t\t\t * If no closing bracket could be found, `-1` will be returned.\n\t\t\t *\n\t\t\t * @param {RegExp} open\n\t\t\t * @param {RegExp} close\n\t\t\t * @returns {number}\n\t\t\t */\n\t\t\tfunction findClosingBracket (open, close) {\n\t\t\t\tlet stackHeight = 1;\n\n\t\t\t\tfor (let i = currentIndex; i < validTokens.length; i++) {\n\t\t\t\t\tconst token = validTokens[i];\n\t\t\t\t\tconst content = token.content;\n\n\t\t\t\t\tif (token.type === 'punctuation' && typeof content === 'string') {\n\t\t\t\t\t\tif (open.test(content)) {\n\t\t\t\t\t\t\tstackHeight++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (close.test(content)) {\n\t\t\t\t\t\t\tstackHeight--;\n\n\t\t\t\t\t\t\tif (stackHeight === 0) {\n\t\t\t\t\t\t\t\treturn i;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tfor (; currentIndex < validTokens.length; ) {\n\t\t\t\tconst startToken = validTokens[currentIndex++];\n\n\t\t\t\t// add special aliases for mutation tokens\n\t\t\t\tif (startToken.type === 'keyword' && startToken.content === 'mutation') {\n\t\t\t\t\t// any array of the names of all input variables (if any)\n\t\t\t\t\tconst inputVariables = [];\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tisTokenType(['definition-mutation', 'punctuation']) &&\n\t\t\t\t\t\tgetToken(1).content === '('\n\t\t\t\t\t) {\n\t\t\t\t\t\t// definition\n\n\t\t\t\t\t\tcurrentIndex += 2; // skip 'definition-mutation' and 'punctuation'\n\n\t\t\t\t\t\tconst definitionEnd = findClosingBracket(/^\\($/, /^\\)$/);\n\t\t\t\t\t\tif (definitionEnd === -1) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// find all input variables\n\t\t\t\t\t\tfor (; currentIndex < definitionEnd; currentIndex++) {\n\t\t\t\t\t\t\tconst t = getToken(0);\n\t\t\t\t\t\t\tif (t.type === 'variable') {\n\t\t\t\t\t\t\t\tt.addAlias('variable-input');\n\t\t\t\t\t\t\t\tinputVariables.push(t.content);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentIndex = definitionEnd + 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tisTokenType(['punctuation', 'property-query']) &&\n\t\t\t\t\t\tgetToken(0).content === '{'\n\t\t\t\t\t) {\n\t\t\t\t\t\tcurrentIndex++; // skip opening bracket\n\n\t\t\t\t\t\tgetToken(0).addAlias('property-mutation');\n\n\t\t\t\t\t\tif (inputVariables.length > 0) {\n\t\t\t\t\t\t\tconst mutationEnd = findClosingBracket(/^\\{$/, /^\\}$/);\n\t\t\t\t\t\t\tif (mutationEnd === -1) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// give references to input variables a special alias\n\t\t\t\t\t\t\tfor (let i = currentIndex; i < mutationEnd; i++) {\n\t\t\t\t\t\t\t\tconst varToken = validTokens[i];\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tvarToken.type === 'variable' &&\n\t\t\t\t\t\t\t\t\tinputVariables.includes(varToken.content)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tvarToken.addAlias('variable-input');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn tokens;\n\t\t},\n\t},\n};\n\n/**\n * @typedef {import('../core.js').Token} Token\n * @typedef {import('../types.d.ts').Grammar} Grammar\n */\n"
  },
  {
    "path": "src/languages/groovy.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'groovy'>} */\nexport default {\n\tid: 'groovy',\n\tbase: clike,\n\tgrammar () {\n\t\tconst interpolation = {\n\t\t\tpattern: /((?:^|[^\\\\$])(?:\\\\{2})*)\\$(?:\\w+|\\{[^{}]*\\})/,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\tpattern: /^\\$\\{?|\\}$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t\t'expression': {\n\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\tinside: 'groovy',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\t// https://groovy-lang.org/syntax.html#_dollar_slashy_string\n\t\t\t\tpattern: /'''(?:[^\\\\]|\\\\[\\s\\S])*?'''|'(?:\\\\.|[^\\\\'\\r\\n])*'/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\\b/,\n\t\t\t'number':\n\t\t\t\t/\\b(?:0b[01_]+|0x[\\da-f_]+(?:\\.[\\da-f_p\\-]+)?|[\\d_]+(?:\\.[\\d_]+)?(?:e[+-]?\\d+)?)[glidf]?\\b/i,\n\t\t\t'operator': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^.])(?:~|==?~?|\\?[.:]?|\\*(?:[.=]|\\*=?)?|\\.[@&]|\\.\\.<|\\.\\.(?!\\.)|-[-=>]?|\\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\\|[|=]?|\\/=?|\\^=?|%=?)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'punctuation': /\\.+|[{}[\\];(),:$]/,\n\t\t\t$insert: {\n\t\t\t\t'shebang': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: /#!.+/,\n\t\t\t\t\talias: 'comment',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t'interpolation-string': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\t// TODO: Slash strings (e.g. /foo/) can contain line breaks but this will cause a lot of trouble with\n\t\t\t\t\t// simple division (see JS regex), so find a fix maybe?\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\"\"\"(?:[^\\\\]|\\\\[\\s\\S])*?\"\"\"|([\"/])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1|\\$\\/(?:[^/$]|\\$(?:[/$]|(?![/$]))|\\/(?!\\$))*\\/\\$/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'spock-block': {\n\t\t\t\t\t$before: 'punctuation',\n\t\t\t\t\tpattern: /\\b(?:and|cleanup|expect|given|setup|then|when|where):/,\n\t\t\t\t},\n\t\t\t\t'annotation': {\n\t\t\t\t\t$before: 'function',\n\t\t\t\t\tpattern: /(^|[^.])@\\w+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/haml.js",
    "content": "import ruby from './ruby.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'haml'>} */\nexport default {\n\tid: 'haml',\n\trequire: ruby,\n\tgrammar () {\n\t\t/* TODO\n\t\t\tHandle multiline code after tag\n\t\t\t    %foo= some |\n\t\t\t\t\tmultiline |\n\t\t\t\t\tcode |\n\t\t*/\n\n\t\tconst filter_pattern =\n\t\t\t'((?:^|\\\\r?\\\\n|\\\\r)([\\\\t ]*)):{{filter_name}}(?:(?:\\\\r?\\\\n|\\\\r)(?:\\\\2[\\\\t ].+|\\\\s*?(?=\\\\r?\\\\n|\\\\r)))+';\n\n\t\t// Non exhaustive list of available filters and associated languages\n\t\tconst filters = [\n\t\t\t'css',\n\t\t\t{ filter: 'coffee', language: 'coffeescript' },\n\t\t\t'erb',\n\t\t\t'javascript',\n\t\t\t'less',\n\t\t\t'markdown',\n\t\t\t'ruby',\n\t\t\t'scss',\n\t\t\t'textile',\n\t\t];\n\n\t\tconst all_filters = /** @type {import('../types.d.ts').GrammarTokens} */ ({});\n\t\tfor (const f of filters) {\n\t\t\tconst { filter, language } = typeof f === 'string' ? { filter: f, language: f } : f;\n\t\t\tall_filters['filter-' + filter] = {\n\t\t\t\tpattern: RegExp(filter_pattern.replace('{{filter_name}}', () => filter)),\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'filter-name': {\n\t\t\t\t\t\tpattern: /^:[\\w-]+/,\n\t\t\t\t\t\talias: 'symbol',\n\t\t\t\t\t},\n\t\t\t\t\t'text': {\n\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\talias: [language, 'language-' + language],\n\t\t\t\t\t\tinside: language,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\t// Multiline stuff should appear before the rest\n\n\t\t\t'multiline-comment': {\n\t\t\t\tpattern: /((?:^|\\r?\\n|\\r)([\\t ]*))(?:\\/|-#).*(?:(?:\\r?\\n|\\r)\\2[\\t ].+)*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'comment',\n\t\t\t},\n\n\t\t\t'multiline-code': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:^|\\r?\\n|\\r)([\\t ]*)(?:[~-]|[&!]?=)).*,[\\t ]*(?:(?:\\r?\\n|\\r)\\2[\\t ].*,[\\t ]*)*(?:(?:\\r?\\n|\\r)\\2[\\t ].+)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'ruby',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:^|\\r?\\n|\\r)([\\t ]*)(?:[~-]|[&!]?=)).*\\|[\\t ]*(?:(?:\\r?\\n|\\r)\\2[\\t ].*\\|[\\t ]*)*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'ruby',\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t// See at the end of the file for known filters\n\t\t\t'filter': {\n\t\t\t\tpattern:\n\t\t\t\t\t/((?:^|\\r?\\n|\\r)([\\t ]*)):[\\w-]+(?:(?:\\r?\\n|\\r)(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'filter-name': {\n\t\t\t\t\t\tpattern: /^:[\\w-]+/,\n\t\t\t\t\t\talias: 'symbol',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'markup': {\n\t\t\t\tpattern: /((?:^|\\r?\\n|\\r)[\\t ]*)<.+/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: 'markup',\n\t\t\t},\n\t\t\t'doctype': {\n\t\t\t\tpattern: /((?:^|\\r?\\n|\\r)[\\t ]*)!!!(?: .+)?/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'tag': {\n\t\t\t\t// Allows for one nested group of braces\n\t\t\t\tpattern:\n\t\t\t\t\t/((?:^|\\r?\\n|\\r)[\\t ]*)[%.#][\\w\\-#.]*[\\w\\-](?:\\([^)]+\\)|\\{(?:\\{[^}]+\\}|[^{}])+\\}|\\[[^\\]]+\\])*[\\/<>]*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'attributes': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Lookbehind tries to prevent interpolations from breaking it all\n\t\t\t\t\t\t\t// Allows for one nested group of braces\n\t\t\t\t\t\t\tpattern: /(^|[^#])\\{(?:\\{[^}]+\\}|[^{}])+\\}/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: 'ruby',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /\\([^)]+\\)/,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'attr-value': {\n\t\t\t\t\t\t\t\t\tpattern: /(=\\s*)(?:\"(?:\\\\.|[^\\\\\"\\r\\n])*\"|[^)\\s]+)/,\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'attr-name': /[\\w:-]+(?=\\s*!?=|\\s*[,)])/,\n\t\t\t\t\t\t\t\t'punctuation': /[=(),]/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /\\[[^\\]]+\\]/,\n\t\t\t\t\t\t\tinside: 'ruby',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'punctuation': /[<>]/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'code': {\n\t\t\t\tpattern: /((?:^|\\r?\\n|\\r)[\\t ]*(?:[~-]|[&!]?=)).+/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: 'ruby',\n\t\t\t},\n\t\t\t// Interpolations in plain text\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /#\\{[^}]+\\}/,\n\t\t\t\tinside: {\n\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\tpattern: /^#\\{|\\}$/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t'ruby': {\n\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\tinside: 'ruby',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'punctuation': {\n\t\t\t\tpattern: /((?:^|\\r?\\n|\\r)[\\t ]*)[~=\\-&!]+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'filter': all_filters,\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/handlebars.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'handlebars'>} */\nexport default {\n\tid: 'handlebars',\n\trequire: markup,\n\talias: ['hbs', 'mustache'],\n\tgrammar: {\n\t\t'handlebars': {\n\t\t\tpattern: /\\{\\{\\{[\\s\\S]+?\\}\\}\\}|\\{\\{[\\s\\S]+?\\}\\}/,\n\t\t\tinside: {\n\t\t\t\t'comment': /\\{\\{![\\s\\S]*?\\}\\}/,\n\t\t\t\t'delimiter': {\n\t\t\t\t\tpattern: /^\\{\\{\\{?|\\}\\}\\}?$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t\t'string': /([\"'])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\t\t'number': /\\b0x[\\dA-Fa-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[Ee][+-]?\\d+)?/,\n\t\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t\t'block': {\n\t\t\t\t\tpattern: /^(\\s*(?:~\\s*)?)[#\\/]\\S+?(?=\\s*(?:~\\s*)?$|\\s)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t\t'brackets': {\n\t\t\t\t\tpattern: /\\[[^\\]]+\\]/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\tpunctuation: /\\[|\\]/,\n\t\t\t\t\t\tvariable: /[\\s\\S]+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'punctuation': /[!\"#%&':()*+,.\\/;<=>@\\[\\\\\\]^`{|}~]/,\n\t\t\t\t'variable': /[^!\"#%&'()*+,\\/;<=>@\\[\\\\\\]^`{|}~\\s]+/,\n\t\t\t},\n\t\t},\n\t\t$tokenize: embeddedIn('markup'),\n\t},\n};\n"
  },
  {
    "path": "src/languages/haskell.js",
    "content": "export const infixOperator = {\n\tpattern: /`(?:[A-Z][\\w']*\\.)*[_a-z][\\w']*`/,\n\tgreedy: true,\n};\n\n// Most of this is needed because of the meaning of a single '.'.\n// If it stands alone freely, it is the function composition.\n// It may also be a separator between a module name and an identifier => no\n// operator. If it comes together with other special characters it is an\n// operator too.\n//\n// This regex means: /[-!#$%*+=?&@|~.:<>^\\\\\\/]+/ without /\\./.\nexport const asciiOperator =\n\t/[-!#$%*+=?&@|~:<>^\\\\\\/][-!#$%*+=?&@|~.:<>^\\\\\\/]*|\\.[-!#$%*+=?&@|~.:<>^\\\\\\/]+/;\n\n/** @type {import('../types.d.ts').LanguageProto<'haskell'>} */\nexport default {\n\tid: 'haskell',\n\talias: 'hs',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern:\n\t\t\t\t/(^|[^-!#$%*+=?&@|~.:<>^\\\\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\\\\/].*|$)|\\{-[\\s\\S]*?-\\})/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'char': {\n\t\t\tpattern:\n\t\t\t\t/'(?:[^\\\\']|\\\\(?:[abfnrtv\\\\\"'&]|\\^[A-Z@[\\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\\d+|o[0-7]+|x[0-9a-fA-F]+))'/,\n\t\t\talias: 'string',\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\\\\\"]|\\\\(?:\\S|\\s+\\\\))*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\\b/,\n\t\t'import-statement': {\n\t\t\t// The imported or hidden names are not included in this import\n\t\t\t// statement. This is because we want to highlight those exactly like\n\t\t\t// we do for the names in the program.\n\t\t\tpattern:\n\t\t\t\t/(^[\\t ]*)import\\s+(?:qualified\\s+)?(?:[A-Z][\\w']*)(?:\\.[A-Z][\\w']*)*(?:\\s+as\\s+(?:[A-Z][\\w']*)(?:\\.[A-Z][\\w']*)*)?(?:\\s+hiding\\b)?/m,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'keyword': /\\b(?:as|hiding|import|qualified)\\b/,\n\t\t\t\t'punctuation': /\\./,\n\t\t\t},\n\t\t},\n\t\t// These are builtin variables only. Constructors are highlighted later as a constant.\n\t\t'builtin':\n\t\t\t/\\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\\b/,\n\t\t// decimal integers and floating point numbers | octal integers | hexadecimal integers\n\t\t'number': /\\b(?:\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?|0o[0-7]+|0x[0-9a-f]+)\\b/i,\n\t\t'operator': [\n\t\t\tinfixOperator,\n\t\t\t{\n\t\t\t\t// function composition\n\t\t\t\tpattern: /(\\s)\\.(?=\\s)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\tasciiOperator,\n\t\t],\n\t\t// In Haskell, nearly everything is a variable, do not highlight these.\n\t\t'hvariable': {\n\t\t\tpattern: /\\b(?:[A-Z][\\w']*\\.)*[_a-z][\\w']*/,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /\\./,\n\t\t\t},\n\t\t},\n\t\t'constant': {\n\t\t\tpattern: /\\b(?:[A-Z][\\w']*\\.)*[A-Z][\\w']*/,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /\\./,\n\t\t\t},\n\t\t},\n\t\t'punctuation': /[{}[\\];(),.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/haxe.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'haxe'>} */\nexport default {\n\tid: 'haxe',\n\tbase: clike,\n\tgrammar () {\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\t// Strings can be multi-line\n\t\t\t\tpattern: /\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(\\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\\s+)[A-Z_]\\w*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t// based on naming convention\n\t\t\t\t/\\b[A-Z]\\w*/,\n\t\t\t],\n\t\t\t// The final look-ahead prevents highlighting of keywords if expressions such as \"haxe.macro.Expr\"\n\t\t\t'keyword':\n\t\t\t\t/\\bthis\\b|\\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\\.)\\b/,\n\t\t\t'function': {\n\t\t\t\tpattern: /\\b[a-z_]\\w*(?=\\s*(?:<[^<>]*>\\s*)?\\()/i,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'operator': /\\.{3}|\\+\\+|--|&&|\\|\\||->|=>|(?:<<?|>{1,3}|[-+*/%!=&|^])=?|[?:~]/,\n\t\t\t$insert: {\n\t\t\t\t'string-interpolation': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: /'(?:[^'\\\\]|\\\\[\\s\\S])*'/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\t\tpattern: /(^|[^\\\\])\\$(?:\\w+|\\{[^{}]+\\})/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\t\t\tpattern: /^\\$\\{?|\\}$/,\n\t\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\t\tinside: 'haxe',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'regex': {\n\t\t\t\t\t$before: 'class-name',\n\t\t\t\t\tpattern: /~\\/(?:[^\\/\\\\\\r\\n]|\\\\.)+\\/[a-z]*/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'regex-flags': /\\b[a-z]+$/,\n\t\t\t\t\t\t'regex-source': {\n\t\t\t\t\t\t\tpattern: /^(~\\/)[\\s\\S]+(?=\\/$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'language-regex',\n\t\t\t\t\t\t\tinside: 'regex',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'regex-delimiter': /^~\\/|\\/$/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'keyword': {\n\t\t\t\t\t'preprocessor': {\n\t\t\t\t\t\tpattern: /#(?:else|elseif|end|if)\\b.*/,\n\t\t\t\t\t\talias: 'property',\n\t\t\t\t\t},\n\t\t\t\t\t'metadata': {\n\t\t\t\t\t\tpattern: /@:?[\\w.]+/,\n\t\t\t\t\t\talias: 'symbol',\n\t\t\t\t\t},\n\t\t\t\t\t'reification': {\n\t\t\t\t\t\tpattern: /\\$(?:\\w+|(?=\\{))/,\n\t\t\t\t\t\talias: 'important',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/hcl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'hcl'>} */\nexport default {\n\tid: 'hcl',\n\tgrammar: {\n\t\t'comment': /(?:\\/\\/|#).*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t'heredoc': {\n\t\t\tpattern: /<<-?(\\w+\\b)[\\s\\S]*?^[ \\t]*\\1/m,\n\t\t\tgreedy: true,\n\t\t\talias: 'string',\n\t\t},\n\t\t'keyword': [\n\t\t\t{\n\t\t\t\tpattern: /(?:data|resource)\\s+(?:\"(?:\\\\[\\s\\S]|[^\\\\\"])*\")(?=\\s+\"[\\w-]+\"\\s+\\{)/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'type': {\n\t\t\t\t\t\tpattern: /(resource|data|\\s+)(?:\"(?:\\\\[\\s\\S]|[^\\\\\"])*\")/i,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(?:backend|module|output|provider|provisioner|variable)\\s+(?:[\\w-]+|\"(?:\\\\[\\s\\S]|[^\\\\\"])*\")\\s+(?=\\{)/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'type': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/(backend|module|output|provider|provisioner|variable)\\s+(?:[\\w-]+|\"(?:\\\\[\\s\\S]|[^\\\\\"])*\")\\s+/i,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t/[\\w-]+(?=\\s+\\{)/,\n\t\t],\n\t\t'property': [/[-\\w\\.]+(?=\\s*=(?!=))/, /\"(?:\\\\[\\s\\S]|[^\\\\\"])+\"(?=\\s*[:=])/],\n\t\t'string': {\n\t\t\tpattern:\n\t\t\t\t/\"(?:[^\\\\$\"]|\\\\[\\s\\S]|\\$(?:(?=\")|\\$+(?!\\$)|[^\"${])|\\$\\{(?:[^{}\"]|\"(?:[^\\\\\"]|\\\\[\\s\\S])*\")*\\})*\"/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation': {\n\t\t\t\t\tpattern: /(^|[^$])\\$\\{(?:[^{}\"]|\"(?:[^\\\\\"]|\\\\[\\s\\S])*\")*\\}/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'type': {\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/(\\b(?:count|data|local|module|path|self|terraform|var)\\b\\.)[\\w\\*]+/i,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'keyword': /\\b(?:count|data|local|module|path|self|terraform|var)\\b/i,\n\t\t\t\t\t\t'function': /\\w+(?=\\()/,\n\t\t\t\t\t\t'string': {\n\t\t\t\t\t\t\tpattern: /\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'number': /\\b0x[\\da-f]+\\b|\\b\\d+(?:\\.\\d*)?(?:e[+-]?\\d+)?/i,\n\t\t\t\t\t\t'punctuation': /[!\\$#%&'()*+,.\\/;<=>@\\[\\\\\\]^`{|}~?:]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'number': /\\b0x[\\da-f]+\\b|\\b\\d+(?:\\.\\d*)?(?:e[+-]?\\d+)?/i,\n\t\t'boolean': /\\b(?:false|true)\\b/i,\n\t\t'punctuation': /[=\\[\\]{}]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/hlsl.js",
    "content": "import { toArray } from '../util/iterables.js';\nimport c from './c.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'hlsl'>} */\nexport default {\n\tid: 'hlsl',\n\tbase: c,\n\tgrammar ({ base }) {\n\t\treturn {\n\t\t\t// Regarding keywords and class names:\n\t\t\t// The list of all keywords was split into 'keyword' and 'class-name' tokens based on whether they are capitalized.\n\t\t\t// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-keywords\n\t\t\t// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-reserved-words\n\t\t\t'class-name': [\n\t\t\t\t...toArray(\n\t\t\t\t\t/** @type {import('../types.d.ts').GrammarTokens} */ (base)['class-name']\n\t\t\t\t),\n\t\t\t\t/\\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|RasterizerState|RenderTargetView|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\\b/,\n\t\t\t],\n\t\t\t'keyword': [\n\t\t\t\t// HLSL keyword\n\t\t\t\t/\\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\\b/,\n\t\t\t\t// scalar, vector, and matrix types\n\t\t\t\t/\\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\\b/,\n\t\t\t],\n\t\t\t// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-grammar#floating-point-numbers\n\t\t\t'number':\n\t\t\t\t/(?:(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?|\\b0x[\\da-fA-F]+)[fFhHlLuU]?\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/hoon.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'hoon'>} */\nexport default {\n\tid: 'hoon',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /::.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'constant': /%(?:\\.[ny]|[\\w-]+)/,\n\t\t'class-name': /@(?:[a-z0-9-]*[a-z0-9])?|\\*/i,\n\t\t'function': /(?:\\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,\n\t\t'keyword':\n\t\t\t/\\.[\\^\\+\\*=\\?]|![><:\\.=\\?!]|=[>|:,\\.\\-\\^<+;/~\\*\\?]|\\?[>|:\\.\\-\\^<\\+&~=@!]|\\|[\\$_%:\\.\\-\\^~\\*=@\\?]|\\+[|\\$\\+\\*]|:[_\\-\\^\\+~\\*]|%[_:\\.\\-\\^\\+~\\*=]|\\^[|:\\.\\-\\+&~\\*=\\?]|\\$[|_%:<>\\-\\^&~@=\\?]|;[:<\\+;\\/~\\*=]|~[>|\\$_%<\\+\\/&=\\?!]|--|==/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/hpkp.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'hpkp'>} */\nexport default {\n\tid: 'hpkp',\n\tgrammar () {\n\t\t/**\n\t\t * Original by Scott Helme.\n\t\t *\n\t\t * Reference: https://scotthelme.co.uk/hpkp-cheat-sheet/\n\t\t */\n\n\t\treturn {\n\t\t\t'directive': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\\s;=]|$)/i,\n\t\t\t\talias: 'property',\n\t\t\t},\n\t\t\t'operator': /=/,\n\t\t\t'punctuation': /;/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/hsts.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'hsts'>} */\nexport default {\n\tid: 'hsts',\n\tgrammar () {\n\t\t/**\n\t\t * Original by Scott Helme.\n\t\t *\n\t\t * Reference: https://scotthelme.co.uk/hsts-cheat-sheet/\n\t\t */\n\n\t\treturn {\n\t\t\t'directive': {\n\t\t\t\tpattern: /\\b(?:includeSubDomains|max-age|preload)(?=[\\s;=]|$)/i,\n\t\t\t\talias: 'property',\n\t\t\t},\n\t\t\t'operator': /=/,\n\t\t\t'punctuation': /;/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/http.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'http'>} */\nexport default {\n\tid: 'http',\n\toptional: 'json',\n\tgrammar ({ getOptionalLanguage }) {\n\t\t/**\n\t\t * @param {string} name\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction headerValueOf (name) {\n\t\t\treturn RegExp('(^(?:' + name + '):[ \\t]*(?![ \\t]))[^]+', 'i');\n\t\t}\n\n\t\t// Create a mapping of Content-Type headers to language definitions\n\t\tconst httpLanguages = {\n\t\t\t'application/javascript': 'javascript',\n\t\t\t'application/json': getOptionalLanguage('json') || 'javascript',\n\t\t\t'application/xml': 'xml',\n\t\t\t'text/xml': 'xml',\n\t\t\t'text/html': 'html',\n\t\t\t'text/css': 'css',\n\t\t\t'text/plain': 'plain',\n\t\t};\n\n\t\t// Declare which types can also be suffixes\n\t\tconst suffixTypes = {\n\t\t\t'application/json': true,\n\t\t\t'application/xml': true,\n\t\t};\n\n\t\t/**\n\t\t * Returns a pattern for the given content type which matches it and any type which has it as a suffix.\n\t\t *\n\t\t * @param {string} contentType\n\t\t * @returns {string}\n\t\t */\n\t\tfunction getSuffixPattern (contentType) {\n\t\t\tconst suffix = contentType.replace(/^[a-z]+\\//, '');\n\t\t\tconst suffixPattern = '\\\\w+/(?:[\\\\w.-]+\\\\+)+' + suffix + '(?![+\\\\w.-])';\n\t\t\treturn '(?:' + contentType + '|' + suffixPattern + ')';\n\t\t}\n\n\t\t// Insert each content type parser that has its associated language\n\t\t// currently loaded.\n\n\t\tconst options = /** @type {import('../types.d.ts').GrammarTokens} */ ({});\n\t\tfor (const key in httpLanguages) {\n\t\t\tconst contentType = key;\n\n\t\t\tconst pattern = suffixTypes[contentType] ? getSuffixPattern(contentType) : contentType;\n\t\t\toptions[contentType.replace(/\\//g, '-')] = {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t'(' +\n\t\t\t\t\t\t/content-type:\\s*/.source +\n\t\t\t\t\t\tpattern +\n\t\t\t\t\t\t/(?:(?:\\r\\n?|\\n)[\\w-].*)*(?:\\r(?:\\n|(?!\\n))|\\n)/.source +\n\t\t\t\t\t\t')' +\n\t\t\t\t\t\t// This is a little interesting:\n\t\t\t\t\t\t// The HTTP format spec required 1 empty line before the body to make everything unambiguous.\n\t\t\t\t\t\t// However, when writing code by hand (e.g. to display on a website) people can forget about this,\n\t\t\t\t\t\t// so we want to be liberal here. We will allow the empty line to be omitted if the first line of\n\t\t\t\t\t\t// the body does not start with a [\\w-] character (as headers do).\n\t\t\t\t\t\t/[^ \\t\\w-][\\s\\S]*/.source,\n\t\t\t\t\t'i'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: httpLanguages[contentType],\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\t'request-line': {\n\t\t\t\tpattern:\n\t\t\t\t\t/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\\s(?:https?:\\/\\/|\\/)\\S*\\sHTTP\\/[\\d.]+/m,\n\t\t\t\tinside: {\n\t\t\t\t\t// HTTP Method\n\t\t\t\t\t'method': {\n\t\t\t\t\t\tpattern: /^[A-Z]+\\b/,\n\t\t\t\t\t\talias: 'property',\n\t\t\t\t\t},\n\t\t\t\t\t// Request Target e.g. http://example.com, /path/to/file\n\t\t\t\t\t'request-target': {\n\t\t\t\t\t\tpattern: /^(\\s)(?:https?:\\/\\/|\\/)\\S*(?=\\s)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'url',\n\t\t\t\t\t\tinside: 'uri',\n\t\t\t\t\t},\n\t\t\t\t\t// HTTP Version\n\t\t\t\t\t'http-version': {\n\t\t\t\t\t\tpattern: /^(\\s)HTTP\\/[\\d.]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'property',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'response-status': {\n\t\t\t\tpattern: /^HTTP\\/[\\d.]+ \\d+ .+/m,\n\t\t\t\tinside: {\n\t\t\t\t\t// HTTP Version\n\t\t\t\t\t'http-version': {\n\t\t\t\t\t\tpattern: /^HTTP\\/[\\d.]+/,\n\t\t\t\t\t\talias: 'property',\n\t\t\t\t\t},\n\t\t\t\t\t// Status Code\n\t\t\t\t\t'status-code': {\n\t\t\t\t\t\tpattern: /^(\\s)\\d+(?=\\s)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'number',\n\t\t\t\t\t},\n\t\t\t\t\t// Reason Phrase\n\t\t\t\t\t'reason-phrase': {\n\t\t\t\t\t\tpattern: /^(\\s).+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'header': {\n\t\t\t\tpattern: /^[\\w-]+:.+(?:(?:\\r\\n?|\\n)[ \\t].+)*/m,\n\t\t\t\tinside: {\n\t\t\t\t\t'header-value': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: headerValueOf(/Content-Security-Policy/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: ['csp', 'languages-csp'],\n\t\t\t\t\t\t\tinside: 'csp',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: headerValueOf(/Public-Key-Pins(?:-Report-Only)?/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: ['hpkp', 'languages-hpkp'],\n\t\t\t\t\t\t\tinside: 'hpkp',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: headerValueOf(/Strict-Transport-Security/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: ['hsts', 'languages-hsts'],\n\t\t\t\t\t\t\tinside: 'hsts',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: headerValueOf(/[^:]+/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'header-name': {\n\t\t\t\t\t\tpattern: /^[^:]+/,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /^:/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'header': options,\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/ichigojam.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'ichigojam'>} */\nexport default {\n\tid: 'ichigojam',\n\tgrammar () {\n\t\t// according to the offical reference (EN)\n\t\t// https://ichigojam.net/IchigoJam-en.html\n\t\treturn {\n\t\t\t'comment': /(?:\\B'|REM)(?:[^\\n\\r]*)/i,\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:\"\"|[!#$%&'()*,\\/:;<=>?^\\w +\\-.])*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'number': /\\B#[0-9A-F]+|\\B`[01]+|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:E[+-]?\\d+)?/i,\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\\$|\\b)/i,\n\t\t\t'function':\n\t\t\t\t/\\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\\$|\\b)/i,\n\t\t\t'label': /(?:\\B@\\S+)/,\n\t\t\t'operator': /<[=>]?|>=?|\\|\\||&&|[+\\-*\\/=|&^~!]|\\b(?:AND|NOT|OR)\\b/i,\n\t\t\t'punctuation': /[\\[,;:()\\]]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/icon.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'icon'>} */\nexport default {\n\tid: 'icon',\n\tgrammar: {\n\t\t'comment': /#.*/,\n\t\t'string': {\n\t\t\tpattern: /([\"'])(?:(?!\\1)[^\\\\\\r\\n_]|\\\\.|_(?!\\1)(?:\\r\\n|[\\s\\S]))*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'number': /\\b(?:\\d+r[a-z\\d]+|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)\\b|\\.\\d+\\b/i,\n\t\t'builtin-keyword': {\n\t\t\tpattern:\n\t\t\t\t/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\\b/,\n\t\t\talias: 'variable',\n\t\t},\n\t\t'directive': {\n\t\t\tpattern: /\\$\\w+/,\n\t\t\talias: 'builtin',\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\\b/,\n\t\t'function': /\\b(?!\\d)\\w+(?=\\s*[({]|\\s*!\\s*\\[)/,\n\t\t'operator':\n\t\t\t/[+-]:(?!=)|(?:[\\/?@^%&]|\\+\\+?|--?|==?=?|~==?=?|\\*\\*?|\\|\\|\\|?|<(?:->?|<?=?)|>>?=?)(?::=)?|:(?:=:?)?|[!.\\\\|~]/,\n\t\t'punctuation': /[\\[\\](){},;]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/icu-message-format.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'icu-message-format'>} */\nexport default {\n\tid: 'icu-message-format',\n\tgrammar () {\n\t\t// https://unicode-org.github.io/icu/userguide/format_parse/messages/\n\t\t// https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/com/ibm/icu/text/MessageFormat.html\n\n\t\t/**\n\t\t *\n\t\t * @param {string} source\n\t\t * @param {number} level\n\t\t * @returns {string}\n\t\t */\n\t\tfunction nested (source, level) {\n\t\t\tif (level <= 0) {\n\t\t\t\treturn /[]/.source;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn source.replace(/<SELF>/g, () => nested(source, level - 1));\n\t\t\t}\n\t\t}\n\n\t\tconst stringPattern = /'[{}:=,](?:[^']|'')*'(?!')/;\n\n\t\tconst escape = {\n\t\t\tpattern: /''/,\n\t\t\tgreedy: true,\n\t\t\talias: 'operator',\n\t\t};\n\t\tconst string = {\n\t\t\tpattern: stringPattern,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'escape': escape,\n\t\t\t},\n\t\t};\n\n\t\tconst argumentSource = nested(\n\t\t\t/\\{(?:[^{}']|'(?![{},'])|''|<STR>|<SELF>)*\\}/.source.replace(\n\t\t\t\t/<STR>/g,\n\t\t\t\t() => stringPattern.source\n\t\t\t),\n\t\t\t8\n\t\t);\n\n\t\tconst nestedMessage = {\n\t\t\tpattern: RegExp(argumentSource),\n\t\t\tinside: {\n\t\t\t\t'message': {\n\t\t\t\t\tpattern: /^(\\{)[\\s\\S]+(?=\\}$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'icu-message-format',\n\t\t\t\t},\n\t\t\t\t'message-delimiter': {\n\t\t\t\t\tpattern: /./,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'argument': {\n\t\t\t\tpattern: RegExp(argumentSource),\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'content': {\n\t\t\t\t\t\tpattern: /^(\\{)[\\s\\S]+(?=\\}$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'argument-name': {\n\t\t\t\t\t\t\t\tpattern: /^(\\s*)[^{}:=,\\s]+/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'choice-style': {\n\t\t\t\t\t\t\t\t// https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1ChoiceFormat.html#details\n\t\t\t\t\t\t\t\tpattern: /^(\\s*,\\s*choice\\s*,\\s*)\\S(?:[\\s\\S]*\\S)?/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t'punctuation': /\\|/,\n\t\t\t\t\t\t\t\t\t'range': {\n\t\t\t\t\t\t\t\t\t\tpattern: /^(\\s*)[+-]?(?:\\d+(?:\\.\\d*)?|\\u221e)\\s*[<#\\u2264]/,\n\t\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t\t\t'operator': /[<#\\u2264]/,\n\t\t\t\t\t\t\t\t\t\t\t'number': /\\S+/,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t$rest: 'icu-message-format',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'plural-style': {\n\t\t\t\t\t\t\t\t// https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/com/ibm/icu/text/PluralFormat.html#:~:text=Patterns%20and%20Their%20Interpretation\n\t\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t\t/^(\\s*,\\s*(?:plural|selectordinal)\\s*,\\s*)\\S(?:[\\s\\S]*\\S)?/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t'offset': /^offset:\\s*\\d+/,\n\t\t\t\t\t\t\t\t\t'nested-message': nestedMessage,\n\t\t\t\t\t\t\t\t\t'selector': {\n\t\t\t\t\t\t\t\t\t\tpattern: /=\\d+|[^{}:=,\\s]+/,\n\t\t\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t\t\t'keyword': /^(?:few|many|one|other|two|zero)$/,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'select-style': {\n\t\t\t\t\t\t\t\t// https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/com/ibm/icu/text/SelectFormat.html#:~:text=Patterns%20and%20Their%20Interpretation\n\t\t\t\t\t\t\t\tpattern: /^(\\s*,\\s*select\\s*,\\s*)\\S(?:[\\s\\S]*\\S)?/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t'nested-message': nestedMessage,\n\t\t\t\t\t\t\t\t\t'selector': {\n\t\t\t\t\t\t\t\t\t\tpattern: /[^{}:=,\\s]+/,\n\t\t\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t\t\t'keyword': /^other$/,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'keyword': /\\b(?:choice|plural|select|selectordinal)\\b/,\n\t\t\t\t\t\t\t'arg-type': {\n\t\t\t\t\t\t\t\tpattern: /\\b(?:date|duration|number|ordinal|spellout|time)\\b/,\n\t\t\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'arg-skeleton': {\n\t\t\t\t\t\t\t\tpattern: /(,\\s*)::[^{}:=,\\s]+/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'arg-style': {\n\t\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t\t/(,\\s*)(?:currency|full|integer|long|medium|percent|short)(?=\\s*$)/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'arg-style-text': {\n\t\t\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t\t\t/(^\\s*,\\s*(?=\\S))/.source +\n\t\t\t\t\t\t\t\t\t\tnested(/(?:[^{}']|'[^']*'|\\{(?:<SELF>)?\\})+/.source, 8) +\n\t\t\t\t\t\t\t\t\t\t'$'\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'punctuation': /,/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'argument-delimiter': {\n\t\t\t\t\t\tpattern: /./,\n\t\t\t\t\t\talias: 'operator',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'escape': escape,\n\t\t\t'string': string,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/idris.js",
    "content": "import haskell from './haskell.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'idris'>} */\nexport default {\n\tid: 'idris',\n\tbase: haskell,\n\talias: 'idr',\n\tgrammar () {\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /(?:(?:--|\\|\\|\\|).*$|\\{-[\\s\\S]*?-\\})/m,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\\b/,\n\t\t\t'builtin': undefined,\n\t\t\t$insert: {\n\t\t\t\t'import-statement': {\n\t\t\t\t\t$before: 'keyword',\n\t\t\t\t\tpattern: /(^\\s*import\\s+)(?:[A-Z][\\w']*)(?:\\.[A-Z][\\w']*)*/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/iecst.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'iecst'>} */\nexport default {\n\tid: 'iecst',\n\tgrammar: {\n\t\t'comment': [\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\\\])(?:\\/\\*[\\s\\S]*?(?:\\*\\/|$)|\\(\\*[\\s\\S]*?(?:\\*\\)|$)|\\{[\\s\\S]*?(?:\\}|$))/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\t\t'string': {\n\t\t\tpattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword': [\n\t\t\t/\\b(?:END_)?(?:ACTION|CHANNEL|CONFIGURATION|FOLDER|FUNCTION|FUNCTION_BLOCK|(?:INITIAL_)?STEP|INTERFACE|LIBRARY|METHOD|NAMESPACE|PROGRAM|PROPERTY|RESOURCE|STRUCT|TRANSITION|TYPE|VAR|VAR_(?:ACCESS|CONFIG|EXTERNAL|GLOBAL|INPUT|IN_OUT|OUTPUT|TEMP))\\b/i,\n\t\t\t/\\b(?:AT|BY|(?:END_)?(?:CASE|FOR|IF|REPEAT|WHILE)|CONSTANT|CONTINUE|DO|ELSE|ELSIF|EXIT|EXTENDS|FROM|GET|GOTO|IMPLEMENTS|JMP|NON_RETAIN|OF|PRIVATE|PROTECTED|PUBLIC|RETAIN|RETURN|SET|TASK|THEN|TO|UNTIL|USING|WITH|__CATCH|__ENDTRY|__FINALLY|__TRY)\\b/,\n\t\t],\n\t\t'class-name':\n\t\t\t/\\b(?:ANY|ARRAY|BOOL|BYTE|DATE(?:_AND_TIME)?|U?(?:D|L|S)?INT|DT|(?:D|L)?WORD|L?REAL|POINTER|STRING|TIME(?:_OF_DAY)?|TOD)\\b/,\n\t\t'address': {\n\t\t\tpattern: /%[IQM][XBWDL][\\d.]*|%[IQ][\\d.]*/,\n\t\t\talias: 'symbol',\n\t\t},\n\t\t'number':\n\t\t\t/\\b(?:16#[\\da-f]+|2#[01_]+|0x[\\da-f]+)\\b|\\b(?:D|DT|T|TOD)#[\\d_shmd:]*|\\b[A-Z]*#[\\d.,_]*|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n\t\t'boolean': /\\b(?:FALSE|NULL|TRUE)\\b/,\n\t\t'operator':\n\t\t\t/S?R?:?=>?|&&?|\\*\\*?|<[=>]?|>=?|[-:^/+#]|\\b(?:AND|EQ|EXPT|GE|GT|LE|LT|MOD|NE|NOT|OR|XOR)\\b/,\n\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\t\t'punctuation': /[()[\\].,;]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/ignore.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'ignore'>} */\nexport default {\n\tid: 'ignore',\n\talias: ['gitignore', 'hgignore', 'npmignore'],\n\tgrammar: {\n\t\t// https://git-scm.com/docs/gitignore\n\t\t'comment': /^#.*/m,\n\t\t'entry': {\n\t\t\tpattern: /\\S(?:.*(?:(?:\\\\ )|\\S))?/,\n\t\t\talias: 'string',\n\t\t\tinside: {\n\t\t\t\t'operator': /^!|\\*\\*?|\\?/,\n\t\t\t\t'regex': {\n\t\t\t\t\tpattern: /(^|[^\\\\])\\[[^\\[\\]]*\\]/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t'punctuation': /\\//,\n\t\t\t},\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/inform7.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'inform7'>} */\nexport default {\n\tid: 'inform7',\n\tgrammar () {\n\t\tconst inform7 = {\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"]*\"/,\n\t\t\t\tinside: {\n\t\t\t\t\t'substitution': {\n\t\t\t\t\t\tpattern: /\\[[^\\[\\]]+\\]/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\t\t\tpattern: /\\[|\\]/,\n\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t$rest: /** @type {Grammar['$rest']} */ (null),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\[[^\\[\\]]+\\]/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'title': {\n\t\t\t\tpattern: /^[ \\t]*(?:book|chapter|part(?! of)|section|table|volume)\\b.+/im,\n\t\t\t\talias: 'important',\n\t\t\t},\n\t\t\t'number': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^-])(?:\\b\\d+(?:\\.\\d+)?(?:\\^\\d+)?(?:(?!\\d)\\w+)?|\\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\\b(?!-)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'verb': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^-])\\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\\b(?!-)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\t\t\t'keyword': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^-])\\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\\b(?!-)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'property': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^-])\\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\\b(?!-)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'symbol',\n\t\t\t},\n\t\t\t'position': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^-])\\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\\b(?!-)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'type': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^-])\\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\\b(?!-)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'variable',\n\t\t\t},\n\t\t\t'punctuation': /[.,:;(){}]/,\n\t\t};\n\n\t\tinform7['string'].inside['substitution'].inside.$rest = /** @type {Grammar['$rest']} */ ({\n\t\t\t...inform7,\n\t\t\t'text': {\n\t\t\t\tpattern: /\\S(?:\\s*\\S)*/,\n\t\t\t\talias: 'comment',\n\t\t\t},\n\t\t});\n\n\t\treturn inform7;\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n */\n"
  },
  {
    "path": "src/languages/ini.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'ini'>} */\nexport default {\n\tid: 'ini',\n\tgrammar: {\n\t\t/**\n\t\t * The component mimics the behavior of the Win32 API parser.\n\t\t *\n\t\t * @see {@link https://github.com/PrismJS/prism/issues/2775#issuecomment-787477723}\n\t\t */\n\n\t\t'comment': {\n\t\t\tpattern: /(^[ \\f\\t\\v]*)[#;][^\\n\\r]*/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'section': {\n\t\t\tpattern: /(^[ \\f\\t\\v]*)\\[[^\\n\\r\\]]*\\]?/m,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'section-name': {\n\t\t\t\t\tpattern: /(^\\[[ \\f\\t\\v]*)[^ \\f\\t\\v\\]]+(?:[ \\f\\t\\v]+[^ \\f\\t\\v\\]]+)*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'selector',\n\t\t\t\t},\n\t\t\t\t'punctuation': /\\[|\\]/,\n\t\t\t},\n\t\t},\n\t\t'key': {\n\t\t\tpattern: /(^[ \\f\\t\\v]*)[^ \\f\\n\\r\\t\\v=]+(?:[ \\f\\t\\v]+[^ \\f\\n\\r\\t\\v=]+)*(?=[ \\f\\t\\v]*=)/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'attr-name',\n\t\t},\n\t\t'value': {\n\t\t\tpattern: /(=[ \\f\\t\\v]*)[^ \\f\\n\\r\\t\\v]+(?:[ \\f\\t\\v]+[^ \\f\\n\\r\\t\\v]+)*/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'attr-value',\n\t\t\tinside: {\n\t\t\t\t'inner-value': {\n\t\t\t\t\tpattern: /^(\"|').+(?=\\1$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'punctuation': /=/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/io.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'io'>} */\nexport default {\n\tid: 'io',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?(?:\\*\\/|$)|\\/\\/.*|#.*)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'triple-quoted-string': {\n\t\t\tpattern: /\"\"\"(?:\\\\[\\s\\S]|(?!\"\"\")[^\\\\])*\"\"\"/,\n\t\t\tgreedy: true,\n\t\t\talias: 'string',\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:\\\\.|[^\\\\\\r\\n\"])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\\b/,\n\t\t'builtin':\n\t\t\t/\\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\\b/,\n\t\t'boolean': /\\b(?:false|nil|true)\\b/,\n\t\t'number': /\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e-?\\d+)?/i,\n\t\t'operator':\n\t\t\t/[=!*/%+\\-^&|]=|>>?=?|<<?=?|:?:?=|\\+\\+?|--?|\\*\\*?|\\/\\/?|%|\\|\\|?|&&?|\\b(?:and|not|or|return)\\b|@@?|\\?\\??|\\.\\./,\n\t\t'punctuation': /[{}[\\];(),.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/j.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'j'>} */\nexport default {\n\tid: 'j',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\\bNB\\..*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /'(?:''|[^'\\r\\n])*'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:(?:CR|LF|adverb|conjunction|def|define|dyad|monad|noun|verb)\\b|(?:assert|break|case|catch[dt]?|continue|do|else|elseif|end|fcase|for|for_\\w+|goto_\\w+|if|label_\\w+|return|select|throw|try|while|whilst)\\.)/,\n\t\t'verb': {\n\t\t\t// Negative look-ahead prevents bad highlighting\n\t\t\t// of ^: ;. =. =: !. !:\n\t\t\tpattern:\n\t\t\t\t/(?!\\^:|;\\.|[=!][.:])(?:\\{(?:\\.|::?)?|p(?:\\.\\.?|:)|[=!\\]]|[<>+*\\-%$|,#][.:]?|[?^]\\.?|[;\\[]:?|[~}\"i][.:]|[ACeEIjLor]\\.|(?:[_\\/\\\\qsux]|_?\\d):)/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'number':\n\t\t\t/\\b_?(?:(?!\\d:)\\d+(?:\\.\\d+)?(?:(?:ad|ar|[ejpx])_?\\d+(?:\\.\\d+)?)*(?:b_?[\\da-z]+(?:\\.[\\da-z]+)?)?|_\\b(?!\\.))/,\n\t\t'adverb': {\n\t\t\tpattern: /[~}]|[\\/\\\\]\\.?|[bfM]\\.|t[.:]/,\n\t\t\talias: 'builtin',\n\t\t},\n\t\t'operator': /[=a][.:]|_\\./,\n\t\t'conjunction': {\n\t\t\tpattern: /&(?:\\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\\.|`:?|[\\^LS]:|\"/,\n\t\t\talias: 'variable',\n\t\t},\n\t\t'punctuation': /[()]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/java.js",
    "content": "import { toArray } from '../util/iterables.js';\nimport clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'java'>} */\nexport default {\n\tid: 'java',\n\tbase: clike,\n\tgrammar ({ base }) {\n\t\tconst keywords =\n\t\t\t/\\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\\s*[(){}[\\]<>=%~.:,;?+\\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\\b/;\n\n\t\t// full package (optional) + parent classes (optional)\n\t\tconst classNamePrefix = /(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*/.source;\n\n\t\t// based on the java naming conventions\n\t\tconst className = {\n\t\t\tpattern: RegExp(\n\t\t\t\t/(^|[^\\w.])/.source + classNamePrefix + /[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b/.source\n\t\t\t),\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'namespace': {\n\t\t\t\t\tpattern: /^[a-z]\\w*(?:\\s*\\.\\s*[a-z]\\w*)*(?:\\s*\\.)?/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'punctuation': /\\./,\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\tpattern: /(^|[^\\\\])\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'class-name': [\n\t\t\t\tclassName,\n\t\t\t\t{\n\t\t\t\t\t// variables, parameters, and constructor references\n\t\t\t\t\t// this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods)\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/(^|[^\\w.])/.source +\n\t\t\t\t\t\t\tclassNamePrefix +\n\t\t\t\t\t\t\t/[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)/.source\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: className.inside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// class names based on keyword\n\t\t\t\t\t// this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods)\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)/\n\t\t\t\t\t\t\t.source +\n\t\t\t\t\t\t\tclassNamePrefix +\n\t\t\t\t\t\t\t/[A-Z]\\w*\\b/.source\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: className.inside,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword': keywords,\n\t\t\t'function': [\n\t\t\t\t...toArray(/** @type {import('../types.d.ts').GrammarTokens} */ (base).function),\n\t\t\t\t{\n\t\t\t\t\tpattern: /(::\\s*)[a-z_]\\w*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'number':\n\t\t\t\t/\\b0b[01][01_]*L?\\b|\\b0x(?:\\.[\\da-f_p+-]+|[\\da-f_]+(?:\\.[\\da-f_p+-]+)?)\\b|(?:\\b\\d[\\d_]*(?:\\.[\\d_]*)?|\\B\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[dfl]?/i,\n\t\t\t'operator': {\n\t\t\t\tpattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\\+\\+|&&|\\|\\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'constant': /\\b[A-Z][A-Z_\\d]+\\b/,\n\t\t\t$insertBefore: {\n\t\t\t\t'comment': {\n\t\t\t\t\t'doc-comment': {\n\t\t\t\t\t\tpattern: /\\/\\*\\*(?!\\/)[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\talias: 'comment',\n\t\t\t\t\t\tinside: 'javadoc',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'string': {\n\t\t\t\t\t'triple-quoted-string': {\n\t\t\t\t\t\t// http://openjdk.java.net/jeps/355#Description\n\t\t\t\t\t\tpattern: /\"\"\"[ \\t]*[\\r\\n](?:(?:\"|\"\")?(?:\\\\.|[^\"\\\\]))*\"\"\"/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t},\n\t\t\t\t\t'char': {\n\t\t\t\t\t\tpattern: /'(?:\\\\.|[^'\\\\\\r\\n]){1,6}'/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'class-name': {\n\t\t\t\t\t'annotation': {\n\t\t\t\t\t\tpattern: /(^|[^.])@\\w+(?:\\s*\\.\\s*\\w+)*/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t'generics': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/<(?:[\\w\\s,.?]|&(?!&)|<(?:[\\w\\s,.?]|&(?!&)|<(?:[\\w\\s,.?]|&(?!&)|<(?:[\\w\\s,.?]|&(?!&))*>)*>)*>)*>/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'class-name': className,\n\t\t\t\t\t\t\t'keyword': keywords,\n\t\t\t\t\t\t\t'punctuation': /[<>(),.:]/,\n\t\t\t\t\t\t\t'operator': /[?&|]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'import': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t\t/(\\bimport\\s+)/.source +\n\t\t\t\t\t\t\t\t\tclassNamePrefix +\n\t\t\t\t\t\t\t\t\t/(?:[A-Z]\\w*|\\*)(?=\\s*;)/.source\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'namespace': className.inside.namespace,\n\t\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t\t\t'operator': /\\*/,\n\t\t\t\t\t\t\t\t'class-name': /\\w+/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t\t/(\\bimport\\s+static\\s+)/.source +\n\t\t\t\t\t\t\t\t\tclassNamePrefix +\n\t\t\t\t\t\t\t\t\t/(?:\\w+|\\*)(?=\\s*;)/.source\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'static',\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'namespace': className.inside.namespace,\n\t\t\t\t\t\t\t\t'static': /\\b\\w+$/,\n\t\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t\t\t'operator': /\\*/,\n\t\t\t\t\t\t\t\t'class-name': /\\w+/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'namespace': {\n\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t/(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!<keyword>)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?/.source.replace(\n\t\t\t\t\t\t\t\t/<keyword>/g,\n\t\t\t\t\t\t\t\t() => keywords.source\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/javadoc.js",
    "content": "import java from './java.js';\nimport javadoclike from './javadoclike.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'javadoc'>} */\nexport default {\n\tid: 'javadoc',\n\tbase: javadoclike,\n\trequire: [markup, java],\n\tgrammar ({ languages }) {\n\t\tconst { tag, entity } = languages.markup;\n\n\t\tconst codeLinePattern = /(^(?:[\\t ]*(?:\\*\\s*)*))[^*\\s].*$/m;\n\n\t\tconst memberReference = /#\\s*\\w+(?:\\s*\\([^()]*\\))?/.source;\n\t\tconst reference = /(?:\\b[a-zA-Z]\\w+\\s*\\.\\s*)*\\b[A-Z]\\w*(?:\\s*<mem>)?|<mem>/.source.replace(\n\t\t\t/<mem>/g,\n\t\t\t() => memberReference\n\t\t);\n\n\t\treturn {\n\t\t\t$insertBefore: {\n\t\t\t\t'keyword': {\n\t\t\t\t\t'reference': {\n\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t/(@(?:exception|link|linkplain|see|throws|value)\\s+(?:\\*\\s*)?)/.source +\n\t\t\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t\t\treference +\n\t\t\t\t\t\t\t\t')'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'function': {\n\t\t\t\t\t\t\t\tpattern: /(#\\s*)\\w+(?=\\s*\\()/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'field': {\n\t\t\t\t\t\t\t\tpattern: /(#\\s*)\\w+/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'namespace': {\n\t\t\t\t\t\t\t\tpattern: /\\b(?:[a-z]\\w*\\s*\\.\\s*)+/,\n\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'class-name': /\\b[A-Z]\\w*/,\n\t\t\t\t\t\t\t'keyword': languages.java.keyword,\n\t\t\t\t\t\t\t'punctuation': /[#()[\\],.]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'class-name': {\n\t\t\t\t\t\t// @param <T> the first generic type parameter\n\t\t\t\t\t\tpattern: /(@param\\s+)<[A-Z]\\w*>/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /[.<>]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'code-section': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/(\\{@code\\s+(?!\\s))(?:[^\\s{}]|\\s+(?![\\s}])|\\{(?:[^{}]|\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})*\\})*\\})+(?=\\s*\\})/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'code': {\n\t\t\t\t\t\t\t\t\t// there can't be any HTML inside of {@code} tags\n\t\t\t\t\t\t\t\t\tpattern: codeLinePattern,\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t\tinside: 'java',\n\t\t\t\t\t\t\t\t\talias: 'language-java',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /(<(code|pre|tt)>(?!<code>)\\s*)\\S(?:\\S|\\s+\\S)*?(?=\\s*<\\/\\2>)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'line': {\n\t\t\t\t\t\t\t\t\tpattern: codeLinePattern,\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t\t// highlight HTML tags and entities\n\t\t\t\t\t\t\t\t\t\t'tag': tag,\n\t\t\t\t\t\t\t\t\t\t'entity': entity,\n\t\t\t\t\t\t\t\t\t\t'code': {\n\t\t\t\t\t\t\t\t\t\t\t// everything else is Java code\n\t\t\t\t\t\t\t\t\t\t\tpattern: /.+/,\n\t\t\t\t\t\t\t\t\t\t\tinside: 'java',\n\t\t\t\t\t\t\t\t\t\t\talias: 'language-java',\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'tag': tag,\n\t\t\t\t\t'entity': entity,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/javadoclike.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'javadoclike'>} */\nexport default {\n\tid: 'javadoclike',\n\tgrammar: {\n\t\t'parameter': {\n\t\t\tpattern: /(^[\\t ]*(?:\\/{3}|\\*|\\/\\*\\*)\\s*@(?:arg|arguments|param)\\s+)\\w+/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'keyword': {\n\t\t\t// keywords are the first word in a line preceded be an `@` or surrounded by curly braces.\n\t\t\t// @word, {@word}\n\t\t\tpattern: /(^[\\t ]*(?:\\/{3}|\\*|\\/\\*\\*)\\s*|\\{)@[a-z][a-zA-Z-]+\\b/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'punctuation': /[{}]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/javascript.js",
    "content": "import { JS_TEMPLATE, JS_TEMPLATE_INTERPOLATION } from '../shared/languages/patterns.js';\nimport { toArray } from '../util/iterables.js';\nimport clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'javascript'>} */\nexport default {\n\tid: 'javascript',\n\tbase: clike,\n\toptional: 'js-templates',\n\talias: 'js',\n\tgrammar ({ getOptionalLanguage }) {\n\t\tconst jsTemplates = /** @type {GrammarTokens} */ (getOptionalLanguage('js-templates'))?.[\n\t\t\t'template-string'\n\t\t];\n\n\t\treturn {\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\b(?:class|extends|implements|instanceof|interface|new)\\s+)[\\w.\\\\]+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /[.\\\\]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$A-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\.(?:constructor|prototype))/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|assert(?=\\s*\\{)|export|from(?=\\s*(?:['\"]|$))|import)\\b/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'module',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /((?:^|\\})\\s*)catch\\b/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'control-flow',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^.]|\\.\\.\\.\\s*)\\b(?:await|break|case|continue|default|do|else|finally(?=\\s*(?:\\{|$))|for|if|return|switch|throw|try|while|yield)\\b/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'control-flow',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^.]|\\.\\.\\.\\s*)\\b(?:async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|class|const|debugger|delete|enum|extends|function|(?:get|set)(?=\\s*(?:[#\\[$\\w\\xA0-\\uFFFF]|$))|implements|in|instanceof|interface|let|new|null|of|package|private|protected|public|static|super|this|typeof|undefined|var|void|with)\\b/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n\t\t\t'function':\n\t\t\t\t/#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n\t\t\t'number': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/(^|[^\\w$])/.source +\n\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t// constant\n\t\t\t\t\t\t(/NaN|Infinity/.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// binary integer\n\t\t\t\t\t\t\t/0[bB][01]+(?:_[01]+)*n?/.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// octal integer\n\t\t\t\t\t\t\t/0[oO][0-7]+(?:_[0-7]+)*n?/.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// hexadecimal integer\n\t\t\t\t\t\t\t/0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?/.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// decimal bigint\n\t\t\t\t\t\t\t/\\d+(?:_\\d+)*n/.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// decimal number (integer or float) but no bigint\n\t\t\t\t\t\t\t/(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?/\n\t\t\t\t\t\t\t\t.source) +\n\t\t\t\t\t\t')' +\n\t\t\t\t\t\t/(?![\\w$])/.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'operator':\n\t\t\t\t/--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/,\n\t\t\t$insertBefore: {\n\t\t\t\t'comment': {\n\t\t\t\t\t'doc-comment': {\n\t\t\t\t\t\tpattern: /\\/\\*\\*(?!\\/)[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\tinside: 'jsdoc',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'keyword': {\n\t\t\t\t\t'regex': {\n\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t// lookbehind\n\t\t\t\t\t\t\t// eslint-disable-next-line regexp/no-dupe-characters-character-class\n\t\t\t\t\t\t\t/((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/.source +\n\t\t\t\t\t\t\t\t// Regex pattern:\n\t\t\t\t\t\t\t\t// There are 2 regex patterns here. The RegExp set notation proposal added support for nested character\n\t\t\t\t\t\t\t\t// classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible\n\t\t\t\t\t\t\t\t// with the only syntax, so we have to define 2 different regex patterns.\n\t\t\t\t\t\t\t\t/\\//.source +\n\t\t\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t\t\t/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}/\n\t\t\t\t\t\t\t\t\t.source +\n\t\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t\t// `v` flag syntax. This supports 3 levels of nested character classes.\n\t\t\t\t\t\t\t\t/(?:\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}v[dgimyus]{0,7}/\n\t\t\t\t\t\t\t\t\t.source +\n\t\t\t\t\t\t\t\t')' +\n\t\t\t\t\t\t\t\t// lookahead\n\t\t\t\t\t\t\t\t/(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/\n\t\t\t\t\t\t\t\t\t.source\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'regex-source': {\n\t\t\t\t\t\t\t\tpattern: /^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\talias: 'language-regex',\n\t\t\t\t\t\t\t\tinside: 'regex',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'regex-delimiter': /^\\/|\\/$/,\n\t\t\t\t\t\t\t'regex-flags': /^[a-z]+$/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t// This must be declared before keyword because we use \"function\" inside the look-forward\n\t\t\t\t\t'function-variable': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,\n\t\t\t\t\t\talias: 'function',\n\t\t\t\t\t},\n\t\t\t\t\t'parameter': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: 'javascript',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: 'javascript',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: 'javascript',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: 'javascript',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'constant': /\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/,\n\t\t\t\t},\n\t\t\t\t'string': {\n\t\t\t\t\t'hashbang': {\n\t\t\t\t\t\tpattern: /^#!.*/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\talias: 'comment',\n\t\t\t\t\t},\n\t\t\t\t\t'template-string': [\n\t\t\t\t\t\t...toArray(jsTemplates),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: JS_TEMPLATE,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: /** @type {Grammar} */ ({\n\t\t\t\t\t\t\t\t'template-punctuation': {\n\t\t\t\t\t\t\t\t\tpattern: /^`|`$/,\n\t\t\t\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t\t\t\t/((?:^|[^\\\\])(?:\\\\{2})*)/.source +\n\t\t\t\t\t\t\t\t\t\t\tJS_TEMPLATE_INTERPOLATION.source\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t$rest: /** @type {Grammar['$rest']} */ ('javascript'),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'string-property': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/((?:^|[,{])[ \\t]*)([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2(?=\\s*:)/m,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\talias: 'property',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'operator': {\n\t\t\t\t\t'literal-property': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/((?:^|[,{])[ \\t]*)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/m,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'property',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n * @typedef {import('../types.d.ts').GrammarTokens} GrammarTokens\n */\n"
  },
  {
    "path": "src/languages/javastacktrace.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'javastacktrace'>} */\nexport default {\n\tid: 'javastacktrace',\n\tgrammar () {\n\t\t// Specification:\n\t\t// https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/Throwable.html#printStackTrace()\n\n\t\treturn {\n\t\t\t// java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]\n\t\t\t// Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]\n\t\t\t// Caused by: com.example.myproject.MyProjectServletException\n\t\t\t// Caused by: MidLevelException: LowLevelException\n\t\t\t// Suppressed: Resource$CloseFailException: Resource ID = 0\n\t\t\t'summary': {\n\t\t\t\tpattern:\n\t\t\t\t\t/^([\\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread \"[^\"]*\")[\\t ]+)?[\\w$.]+(?::.*)?$/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'keyword': {\n\t\t\t\t\t\tpattern: /^([\\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\n\t\t\t\t\t// the current thread if the summary starts with 'Exception in thread'\n\t\t\t\t\t'string': {\n\t\t\t\t\t\tpattern: /^(\\s*)\"[^\"]*\"/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'exceptions': {\n\t\t\t\t\t\tpattern: /^(:?\\s*)[\\w$.]+(?=:|$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'class-name': /[\\w$]+$/,\n\t\t\t\t\t\t\t'namespace': /\\b[a-z]\\w*\\b/,\n\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'message': {\n\t\t\t\t\t\tpattern: /(:\\s*)\\S.*/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /:/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)\n\t\t\t// at org.hsqldb.jdbc.Util.throwError(Unknown Source) here could be some notes\n\t\t\t// at java.base/java.lang.Class.forName0(Native Method)\n\t\t\t// at Util.<init>(Unknown Source)\n\t\t\t// at com.foo.loader/foo@9.0/com.foo.Main.run(Main.java:101)\n\t\t\t// at com.foo.loader//com.foo.bar.App.run(App.java:12)\n\t\t\t// at acme@2.1/org.acme.Lib.test(Lib.java:80)\n\t\t\t// at MyClass.mash(MyClass.java:9)\n\t\t\t//\n\t\t\t// More information:\n\t\t\t// https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/StackTraceElement.html#toString()\n\t\t\t//\n\t\t\t// A valid Java module name is defined as:\n\t\t\t//   \"A module name consists of one or more Java identifiers (§3.8) separated by \".\" tokens.\"\n\t\t\t// https://docs.oracle.com/javase/specs/jls/se9/html/jls-6.html#jls-ModuleName\n\t\t\t//\n\t\t\t// A Java module version is defined by this class:\n\t\t\t// https://docs.oracle.com/javase/9/docs/api/java/lang/module/ModuleDescriptor.Version.html\n\t\t\t// This is the implementation of the `parse` method in JDK13:\n\t\t\t// https://github.com/matcdac/jdk/blob/2305df71d1b7710266ae0956d73927a225132c0f/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java#L1108\n\t\t\t// However, to keep this simple, a version will be matched by the pattern /@[\\w$.+-]*/.\n\t\t\t'stack-frame': {\n\t\t\t\tpattern: /^([\\t ]*)at (?:[\\w$./]|@[\\w$.+-]*\\/)+(?:<init>)?\\([^()]*\\)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'keyword': {\n\t\t\t\t\t\tpattern: /^(\\s*)at(?= )/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'source': [\n\t\t\t\t\t\t// (Main.java:15)\n\t\t\t\t\t\t// (Main.scala:15)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /(\\()\\w+\\.\\w+:\\d+(?=\\))/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'file': /^\\w+\\.\\w+/,\n\t\t\t\t\t\t\t\t'punctuation': /:/,\n\t\t\t\t\t\t\t\t'line-number': {\n\t\t\t\t\t\t\t\t\tpattern: /\\b\\d+\\b/,\n\t\t\t\t\t\t\t\t\talias: 'number',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// (Unknown Source)\n\t\t\t\t\t\t// (Native Method)\n\t\t\t\t\t\t// (...something...)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /(\\()[^()]*(?=\\))/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'keyword': /^(?:Native Method|Unknown Source)$/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'class-name': /[\\w$]+(?=\\.(?:<init>|[\\w$]+)\\()/,\n\t\t\t\t\t'function': /(?:<init>|[\\w$]+)(?=\\()/,\n\t\t\t\t\t'class-loader': {\n\t\t\t\t\t\tpattern: /(\\s)[a-z]\\w*(?:\\.[a-z]\\w*)*(?=\\/[\\w@$.]*\\/)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'namespace',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'module': {\n\t\t\t\t\t\tpattern: /([\\s/])[a-z]\\w*(?:\\.[a-z]\\w*)*(?:@[\\w$.+-]*)?(?=\\/)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'version': {\n\t\t\t\t\t\t\t\tpattern: /(@)[\\s\\S]+/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\talias: 'number',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'punctuation': /[@.]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'namespace': {\n\t\t\t\t\t\tpattern: /(?:\\b[a-z]\\w*\\.)+/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /[()/.]/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// ... 32 more\n\t\t\t// ... 32 common frames omitted\n\t\t\t'more': {\n\t\t\t\tpattern: /^([\\t ]*)\\.{3} \\d+ [a-z]+(?: [a-z]+)*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /\\.{3}/,\n\t\t\t\t\t'number': /\\d+/,\n\t\t\t\t\t'keyword': /\\b[a-z]+(?: [a-z]+)*\\b/,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/jexl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'jexl'>} */\nexport default {\n\tid: 'jexl',\n\tgrammar: {\n\t\t'string': /([\"'])(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1/,\n\t\t'transform': {\n\t\t\tpattern:\n\t\t\t\t/(\\|\\s*)[a-zA-Zа-яА-Я_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF$][\\wа-яА-Я\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF$]*/,\n\t\t\talias: 'function',\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'function':\n\t\t\t/[a-zA-Zа-яА-Я_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF$][\\wа-яА-Я\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF$]*\\s*(?=\\()/,\n\t\t'number': /\\b\\d+(?:\\.\\d+)?\\b|\\B\\.\\d+\\b/,\n\t\t'operator': /[<>!]=?|-|\\+|&&|==|\\|\\|?|\\/\\/?|[?:*^%]/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'keyword': /\\bin\\b/,\n\t\t'punctuation': /[{}[\\](),.]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/jolie.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'jolie'>} */\nexport default {\n\tid: 'jolie',\n\tbase: clike,\n\tgrammar () {\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\tpattern: /(^|[^\\\\])\"(?:\\\\[\\s\\S]|[^\"\\\\])*\"/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'class-name': {\n\t\t\t\tpattern:\n\t\t\t\t\t/((?:\\b(?:as|courier|embed|in|inputPort|outputPort|service)\\b|@)[ \\t]*)\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\\b/,\n\t\t\t'function': /\\b[a-z_]\\w*(?=[ \\t]*[@(])/i,\n\t\t\t'number': /(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?l?/i,\n\t\t\t'operator': /-[-=>]?|\\+[+=]?|<[<=]?|[>=*!]=?|&&|\\|\\||[?\\/%^@|]/,\n\t\t\t'punctuation': /[()[\\]{},;.:]/,\n\t\t\t'builtin':\n\t\t\t\t/\\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\\b/,\n\t\t\t$insertBefore: {\n\t\t\t\t'keyword': {\n\t\t\t\t\t'aggregates': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/(\\bAggregates\\s*:\\s*)(?:\\w+(?:\\s+with\\s+\\w+)?\\s*,\\s*)*\\w+(?:\\s+with\\s+\\w+)?/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'keyword': /\\bwith\\b/,\n\t\t\t\t\t\t\t'class-name': /\\w+/,\n\t\t\t\t\t\t\t'punctuation': /,/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'redirects': {\n\t\t\t\t\t\tpattern: /(\\bRedirects\\s*:\\s*)(?:\\w+\\s*=>\\s*\\w+\\s*,\\s*)*(?:\\w+\\s*=>\\s*\\w+)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /,/,\n\t\t\t\t\t\t\t'class-name': /\\w+/,\n\t\t\t\t\t\t\t'operator': /=>/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'property': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/\\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\\b(?=[ \\t]*:)/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/jq.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'jq'>} */\nexport default {\n\tid: 'jq',\n\tgrammar () {\n\t\tconst interpolation = /\\\\\\((?:[^()]|\\([^()]*\\))*\\)/.source;\n\t\tconst string = RegExp(\n\t\t\t/(^|[^\\\\])\"(?:[^\"\\r\\n\\\\]|\\\\[^\\r\\n(]|__)*\"/.source.replace(/__/g, () => interpolation)\n\t\t);\n\t\tconst stringInterpolation = {\n\t\t\t'interpolation': {\n\t\t\t\tpattern: RegExp(/((?:^|[^\\\\])(?:\\\\{2})*)/.source + interpolation),\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'content': {\n\t\t\t\t\t\tpattern: /^(\\\\\\()[\\s\\S]+(?=\\)$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: 'jq',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /^\\\\\\(|\\)$/,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'comment': /#.*/,\n\t\t\t'property': {\n\t\t\t\tpattern: RegExp(string.source + /(?=\\s*:(?!:))/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: stringInterpolation,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: string,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: stringInterpolation,\n\t\t\t},\n\n\t\t\t'function': {\n\t\t\t\tpattern: /(\\bdef\\s+)[a-z_]\\w+/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'variable': /\\B\\$\\w+/,\n\t\t\t'property-literal': {\n\t\t\t\tpattern: /\\b[a-z_]\\w*(?=\\s*:(?!:))/i,\n\t\t\t\talias: 'property',\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'number': /(?:\\b\\d+\\.|\\B\\.)?\\b\\d+(?:[eE][+-]?\\d+)?\\b/,\n\n\t\t\t'operator': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\|=?/,\n\t\t\t\t\talias: 'pipe',\n\t\t\t\t},\n\t\t\t\t/\\.\\.|[!=<>]?=|\\?\\/\\/|\\/\\/=?|[-+*/%]=?|[<>?]|\\b(?:and|not|or)\\b/,\n\t\t\t],\n\t\t\t'c-style-function': {\n\t\t\t\tpattern: /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'punctuation': /::|[()\\[\\]{},:;]|\\.(?=\\s*[\\[\\w$])/,\n\t\t\t'dot': {\n\t\t\t\tpattern: /\\./,\n\t\t\t\talias: 'important',\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/js-templates.js",
    "content": "import { JS_TEMPLATE, JS_TEMPLATE_INTERPOLATION } from '../shared/languages/patterns.js';\nimport { embeddedIn } from '../shared/languages/templating.js';\n\n/**\n * Creates a new pattern to match a template string with a special tag.\n *\n * This will return `undefined` if there is no grammar with the given language id.\n *\n * @param {string} language The language id of the embedded language. E.g. `markdown`.\n * @param {string} tag The regex pattern to match the tag.\n * @returns {GrammarToken}\n * @example\n * createTemplate('css', /\\bcss/.source);\n */\nfunction createTemplate (language, tag) {\n\treturn {\n\t\tpattern: RegExp('((?:' + tag + ')\\\\s*)' + JS_TEMPLATE.source),\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\talias: 'template-string',\n\t\tinside: {\n\t\t\t'template-punctuation': {\n\t\t\t\tpattern: /^`|`$/,\n\t\t\t\talias: 'string',\n\t\t\t},\n\t\t\t[language]: {\n\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t/((?:^|[^\\\\])(?:\\\\{2})*)/.source + JS_TEMPLATE_INTERPOLATION.source\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t$rest: 'javascript',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t$tokenize: embeddedIn(language),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t};\n}\n\n/** @type {import('../types.d.ts').LanguageProto<'js-templates'>} */\nexport default {\n\tid: 'js-templates',\n\tgrammar () {\n\t\treturn {\n\t\t\t'template-string': [\n\t\t\t\t// styled-jsx:\n\t\t\t\t//   css`a { color: #25F; }`\n\t\t\t\t// styled-components:\n\t\t\t\t//   styled.h1`color: red;`\n\t\t\t\tcreateTemplate(\n\t\t\t\t\t'css',\n\t\t\t\t\t/\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)/\n\t\t\t\t\t\t.source\n\t\t\t\t),\n\n\t\t\t\t// html`<p></p>`\n\t\t\t\t// div.innerHTML = `<p></p>`\n\t\t\t\tcreateTemplate('html', /\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?=/.source),\n\n\t\t\t\t// svg`<path fill=\"#fff\" d=\"M55.37 ...\"/>`\n\t\t\t\tcreateTemplate('svg', /\\bsvg/.source),\n\n\t\t\t\t// md`# h1`, markdown`## h2`\n\t\t\t\tcreateTemplate('markdown', /\\b(?:markdown|md)/.source),\n\n\t\t\t\t// gql`...`, graphql`...`, graphql.experimental`...`\n\t\t\t\tcreateTemplate('graphql', /\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)/.source),\n\n\t\t\t\t// sql`...`\n\t\t\t\tcreateTemplate('sql', /\\bsql/.source),\n\t\t\t],\n\t\t};\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/jsdoc.js",
    "content": "import javadoclike from './javadoclike.js';\nimport javascript from './javascript.js';\nimport typescript from './typescript.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'jsdoc'>} */\nexport default {\n\tid: 'jsdoc',\n\tbase: javadoclike,\n\trequire: [javascript, typescript],\n\tgrammar ({ languages }) {\n\t\tconst { javascript, typescript } = languages;\n\n\t\tconst type = /\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})+\\}/.source;\n\t\tconst parameterPrefix = '(@(?:arg|argument|param|property)\\\\s+(?:' + type + '\\\\s+)?)';\n\n\t\treturn {\n\t\t\t'parameter': {\n\t\t\t\t// @param {string} foo - foo bar\n\t\t\t\tpattern: RegExp(parameterPrefix + /(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?=\\s|$)/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t},\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'keyword': {\n\t\t\t\t\t'optional-parameter': {\n\t\t\t\t\t\t// @param {string} [baz.foo=\"bar\"] foo bar\n\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\tparameterPrefix +\n\t\t\t\t\t\t\t\t/\\[(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?:=[^[\\]]+)?\\](?=\\s|$)/.source\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'parameter': {\n\t\t\t\t\t\t\t\tpattern: /(^\\[)[$\\w\\xA0-\\uFFFF\\.]+/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'code': {\n\t\t\t\t\t\t\t\tpattern: /(=)[\\s\\S]*(?=\\]$)/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\talias: 'language-javascript',\n\t\t\t\t\t\t\t\tinside: 'javascript',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'punctuation': /[=[\\]]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'class-name': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t\t/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\\s+(?:<TYPE>\\s+)?)[A-Z]\\w*(?:\\.[A-Z]\\w*)*/.source.replace(\n\t\t\t\t\t\t\t\t\t/<TYPE>/g,\n\t\t\t\t\t\t\t\t\t() => type\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: RegExp('(@[a-z]+\\\\s+)' + type),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'string': javascript.string,\n\t\t\t\t\t\t\t\t'number': javascript.number,\n\t\t\t\t\t\t\t\t'boolean': javascript.boolean,\n\t\t\t\t\t\t\t\t'keyword': typescript.keyword,\n\t\t\t\t\t\t\t\t'operator': /=>|\\.\\.\\.|[&|?:*]/,\n\t\t\t\t\t\t\t\t'punctuation': /[.,;=<>{}()[\\]]/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'example': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/(@example\\s+(?!\\s))(?:[^@\\s]|\\s+(?!\\s))+?(?=\\s*(?:\\*\\s*)?(?:@\\w|\\*\\/))/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'code': {\n\t\t\t\t\t\t\t\tpattern: /^([\\t ]*(?:\\*\\s*)?)\\S.*$/m,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\talias: 'language-javascript',\n\t\t\t\t\t\t\t\tinside: 'javascript',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/json.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'json'>} */\nexport default {\n\tid: 'json',\n\talias: 'webmanifest',\n\tgrammar () {\n\t\t// https://www.json.org/json-en.html\n\t\treturn {\n\t\t\t'property': {\n\t\t\t\tpattern: /(^|[^\\\\])\"(?:\\\\.|[^\\\\\"\\r\\n])*\"(?=\\s*:)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /(^|[^\\\\])\"(?:\\\\.|[^\\\\\"\\r\\n])*\"(?!\\s*:)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\/.*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'number': /-?\\b\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?\\b/i,\n\t\t\t'punctuation': /[{}[\\],]/,\n\t\t\t'operator': /:/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'null': {\n\t\t\t\tpattern: /\\bnull\\b/,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/json5.js",
    "content": "import json from './json.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'json5'>} */\nexport default {\n\tid: 'json5',\n\tbase: json,\n\tgrammar () {\n\t\tconst string = /(\"|')(?:\\\\(?:\\r\\n?|\\n|.)|(?!\\1)[^\\\\\\r\\n])*\\1/;\n\n\t\treturn {\n\t\t\t'property': [\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(string.source + '(?=\\\\s*:)'),\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/,\n\t\t\t\t\talias: 'unquoted',\n\t\t\t\t},\n\t\t\t],\n\t\t\t'string': {\n\t\t\t\tpattern: string,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'number':\n\t\t\t\t/[+-]?\\b(?:NaN|Infinity|0x[a-fA-F\\d]+)\\b|[+-]?(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[eE][+-]?\\d+\\b)?/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/jsonp.js",
    "content": "import json from './json.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'jsonp'>} */\nexport default {\n\tid: 'jsonp',\n\tbase: json,\n\tgrammar () {\n\t\treturn {\n\t\t\t'punctuation': /[{}[\\]();,.]/,\n\t\t\t$insertBefore: {\n\t\t\t\t'punctuation': {\n\t\t\t\t\t'function': /(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*\\()/,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/jsstacktrace.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'jsstacktrace'>} */\nexport default {\n\tid: 'jsstacktrace',\n\tgrammar: {\n\t\t'error-message': {\n\t\t\tpattern: /^\\S.*/m,\n\t\t\talias: 'string',\n\t\t},\n\n\t\t'stack-frame': {\n\t\t\tpattern: /(^[ \\t]+)at[ \\t].*/m,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'not-my-code': {\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/^at[ \\t]+(?!\\s)(?:node\\.js|<unknown>|.*(?:node_modules|\\(<anonymous>\\)|\\(<unknown>|<anonymous>$|\\(internal\\/|\\(node\\.js)).*/m,\n\t\t\t\t\talias: 'comment',\n\t\t\t\t},\n\n\t\t\t\t'filename': {\n\t\t\t\t\tpattern: /(\\bat\\s+(?!\\s)|\\()(?:[a-zA-Z]:)?[^():]+(?=:)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'url',\n\t\t\t\t},\n\n\t\t\t\t'function': {\n\t\t\t\t\tpattern: /(\\bat\\s+(?:new\\s+)?)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF<][.$\\w\\xA0-\\uFFFF<>]*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t},\n\t\t\t\t},\n\n\t\t\t\t'punctuation': /[()]/,\n\n\t\t\t\t'keyword': /\\b(?:at|new)\\b/,\n\n\t\t\t\t'alias': {\n\t\t\t\t\tpattern: /\\[(?:as\\s+)?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*\\]/,\n\t\t\t\t\talias: 'variable',\n\t\t\t\t},\n\n\t\t\t\t'line-number': {\n\t\t\t\t\tpattern: /:\\d+(?::\\d+)?\\b/,\n\t\t\t\t\talias: 'number',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /:/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/jsx.js",
    "content": "import { getTextContent, Token } from '../core/classes/token.js';\nimport { insertBefore, withoutTokenize } from '../util/language-util.js';\nimport javascript from './javascript.js';\nimport markup from './markup.js';\n\n/**\n * @param {string | Token | TokenStream | undefined} token\n * @returns {string}\n */\nfunction stringifyToken (token) {\n\tif (!token) {\n\t\treturn '';\n\t}\n\telse {\n\t\treturn getTextContent(token);\n\t}\n}\n\n/**\n *\n * @param {TokenStream} tokens\n * @returns {void}\n */\nfunction walkTokens (tokens) {\n\tconst openedTags = [];\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tconst token = tokens[i];\n\t\tconst isToken = typeof token !== 'string';\n\t\tlet notTagNorBrace = false;\n\n\t\tif (isToken) {\n\t\t\tconst nestedTag = token.content[1];\n\t\t\tif (token.type === 'tag' && typeof nestedTag === 'object' && nestedTag.type === 'tag') {\n\t\t\t\t// We found a tag, now find its kind\n\n\t\t\t\tconst firstChild = token.content[0];\n\t\t\t\tif (typeof firstChild === 'object' && firstChild.content === '</') {\n\t\t\t\t\t// Closing tag\n\t\t\t\t\tif (\n\t\t\t\t\t\topenedTags.length > 0 &&\n\t\t\t\t\t\topenedTags[openedTags.length - 1].tagName === stringifyToken(nestedTag)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Pop matching opening tag\n\t\t\t\t\t\topenedTags.pop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconst lastChild = token.content[token.content.length - 1];\n\t\t\t\t\tif (typeof lastChild === 'object' && lastChild.content === '/>') {\n\t\t\t\t\t\t// Autoclosed tag, ignore\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Opening tag\n\t\t\t\t\t\topenedTags.push({\n\t\t\t\t\t\t\ttagName: stringifyToken(nestedTag),\n\t\t\t\t\t\t\topenedBraces: 0,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (\n\t\t\t\topenedTags.length > 0 &&\n\t\t\t\ttoken.type === 'punctuation' &&\n\t\t\t\ttoken.content === '{'\n\t\t\t) {\n\t\t\t\t// Here we might have entered a JSX context inside a tag\n\t\t\t\topenedTags[openedTags.length - 1].openedBraces++;\n\t\t\t}\n\t\t\telse if (\n\t\t\t\topenedTags.length > 0 &&\n\t\t\t\topenedTags[openedTags.length - 1].openedBraces > 0 &&\n\t\t\t\ttoken.type === 'punctuation' &&\n\t\t\t\ttoken.content === '}'\n\t\t\t) {\n\t\t\t\t// Here we might have left a JSX context inside a tag\n\t\t\t\topenedTags[openedTags.length - 1].openedBraces--;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnotTagNorBrace = true;\n\t\t\t}\n\t\t}\n\t\tif (notTagNorBrace || !isToken) {\n\t\t\tif (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces === 0) {\n\t\t\t\t// Here we are inside a tag, and not inside a JSX context.\n\t\t\t\t// That's plain text: drop any tokens matched.\n\t\t\t\tlet plainText = stringifyToken(token);\n\n\t\t\t\t// And merge text with adjacent text\n\t\t\t\t/** @type {Token | string | undefined} */\n\t\t\t\tconst next = tokens[i + 1];\n\t\t\t\tif (next && (typeof next === 'string' || next.type === 'plain-text')) {\n\t\t\t\t\tplainText += stringifyToken(next);\n\t\t\t\t\ttokens.splice(i + 1, 1);\n\t\t\t\t}\n\t\t\t\t/** @type {Token | string | undefined} */\n\t\t\t\tconst prev = tokens[i - 1];\n\t\t\t\tif (prev && (typeof prev === 'string' || prev.type === 'plain-text')) {\n\t\t\t\t\tplainText = stringifyToken(prev) + plainText;\n\t\t\t\t\ttokens.splice(i - 1, 1);\n\t\t\t\t\ti--;\n\t\t\t\t}\n\n\t\t\t\ttokens[i] = new Token('plain-text', plainText, undefined, plainText);\n\t\t\t}\n\t\t}\n\n\t\tif (isToken && typeof token.content !== 'string') {\n\t\t\twalkTokens(token.content);\n\t\t}\n\t}\n}\n\n/** @type {import('../types.d.ts').LanguageProto<'jsx'>} */\nexport default {\n\tid: 'jsx',\n\trequire: [markup, javascript],\n\tgrammar ({ extend }) {\n\t\tconst space = /(?:\\s|\\/\\/.*(?!.)|\\/\\*(?:[^*]|\\*(?!\\/))\\*\\/)/.source;\n\t\tconst braces = /(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})/.source;\n\t\tlet spread = /(?:\\{<S>*\\.{3}(?:[^{}]|<BRACES>)*\\})/.source;\n\n\t\t/**\n\t\t *\n\t\t * @param {string} source\n\t\t * @param {string} [flags]\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction re (source, flags) {\n\t\t\tsource = source\n\t\t\t\t.replace(/<S>/g, () => space)\n\t\t\t\t.replace(/<BRACES>/g, () => braces)\n\t\t\t\t.replace(/<SPREAD>/g, () => spread);\n\t\t\treturn RegExp(source, flags);\n\t\t}\n\n\t\tspread = re(spread).source;\n\n\t\tconst javascript = extend('javascript', {});\n\t\tconst jsx = extend('markup', javascript);\n\n\t\tconst tag =\n\t\t\t/** @type {GrammarToken & {inside: Grammar & {tag: GrammarToken & { inside: Grammar };'attr-value': GrammarToken;};}} */ (\n\t\t\t\tjsx.tag\n\t\t\t);\n\t\ttag.pattern = re(\n\t\t\t/<\\/?(?:[\\w.:-]+(?:<S>+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"|'(?:\\\\[\\s\\S]|[^\\\\'])*'|[^\\s{'\"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\\/?)?>/\n\t\t\t\t.source\n\t\t);\n\n\t\ttag.inside['tag'].pattern = /^(<\\/?)[^\\s>\\/]*/;\n\t\ttag.inside['attr-value'].pattern =\n\t\t\t/=(?!\\{)(?:\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"|'(?:\\\\[\\s\\S]|[^\\\\'])*'|[^\\s'\">]+)/;\n\t\ttag.inside['tag'].inside['class-name'] = /^[A-Z]\\w*(?:\\.[A-Z]\\w*)*$/;\n\t\ttag.inside['comment'] = javascript['comment'];\n\n\t\tinsertBefore(tag.inside, 'attr-name', {\n\t\t\t'spread': {\n\t\t\t\tpattern: re(/<SPREAD>/.source),\n\t\t\t\tinside: 'jsx',\n\t\t\t},\n\t\t});\n\n\t\tinsertBefore(tag.inside, 'special-attr', {\n\t\t\t'script': {\n\t\t\t\t// Allow for two levels of nesting\n\t\t\t\tpattern: re(/=<BRACES>/.source),\n\t\t\t\talias: 'language-javascript',\n\t\t\t\tinside: /** @type {Grammar} */ ({\n\t\t\t\t\t'script-punctuation': {\n\t\t\t\t\t\tpattern: /^=(?=\\{)/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t$rest: /** @type {Grammar['$rest']} */ ('jsx'),\n\t\t\t\t}),\n\t\t\t},\n\t\t});\n\n\t\tjsx.$tokenize = (code, grammar, Prism) => {\n\t\t\tconst tokens = Prism.tokenize(code, withoutTokenize(grammar));\n\t\t\twalkTokens(tokens);\n\t\t\treturn tokens;\n\t\t};\n\n\t\treturn jsx;\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n * @typedef {import('../types.d.ts').TokenStream} TokenStream\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/julia.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'julia'>} */\nexport default {\n\tid: 'julia',\n\tgrammar: {\n\t\t'comment': {\n\t\t\t// support one level of nested comments\n\t\t\t// https://github.com/JuliaLang/julia/pull/6128\n\t\t\tpattern: /(^|[^\\\\])(?:#=(?:[^#=]|=(?!#)|#(?!=)|#=(?:[^#=]|=(?!#)|#(?!=))*=#)*=#|#.*)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'regex': {\n\t\t\t// https://docs.julialang.org/en/v1/manual/strings/#Regular-Expressions-1\n\t\t\tpattern: /r\"(?:\\\\.|[^\"\\\\\\r\\n])*\"[imsx]{0,4}/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\t// https://docs.julialang.org/en/v1/manual/strings/#String-Basics-1\n\t\t\t// https://docs.julialang.org/en/v1/manual/strings/#non-standard-string-literals-1\n\t\t\t// https://docs.julialang.org/en/v1/manual/running-external-programs/#Running-External-Programs-1\n\t\t\tpattern: /\"\"\"[\\s\\S]+?\"\"\"|(?:\\b\\w+)?\"(?:\\\\.|[^\"\\\\\\r\\n])*\"|`(?:[^\\\\`\\r\\n]|\\\\.)*`/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'char': {\n\t\t\t// https://docs.julialang.org/en/v1/manual/strings/#man-characters-1\n\t\t\tpattern: /(^|[^\\w'])'(?:\\\\[^\\r\\n][^'\\r\\n]*|[^\\\\\\r\\n])'/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|in|let|local|macro|module|print|println|quote|return|struct|try|type|typealias|using|while)\\b/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'number':\n\t\t\t/(?:\\b(?=\\d)|\\B(?=\\.))(?:0[box])?(?:[\\da-f]+(?:_[\\da-f]+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[efp][+-]?\\d+(?:_\\d+)*)?j?/i,\n\t\t// https://docs.julialang.org/en/v1/manual/mathematical-operations/\n\t\t// https://docs.julialang.org/en/v1/manual/mathematical-operations/#Operator-Precedence-and-Associativity-1\n\t\t'operator':\n\t\t\t/&&|\\|\\||[-+*^%÷⊻&$\\\\]=?|\\/[\\/=]?|!=?=?|\\|[=>]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,\n\t\t'punctuation': /::?|[{}[\\]();,.?]/,\n\t\t// https://docs.julialang.org/en/v1/base/numbers/#Base.im\n\t\t'constant': /\\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\\b|[πℯ]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/keepalived.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'keepalived'>} */\nexport default {\n\tid: 'keepalived',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /[#!].*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern:\n\t\t\t\t/(^|[^\\\\])(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t// support IPv4, IPv6, subnet mask\n\t\t'ip': {\n\t\t\tpattern: RegExp(\n\t\t\t\t/\\b(?:(?:(?:[\\da-f]{1,4}:){7}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}:[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){5}:(?:[\\da-f]{1,4}:)?[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){4}:(?:[\\da-f]{1,4}:){0,2}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){3}:(?:[\\da-f]{1,4}:){0,3}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){2}:(?:[\\da-f]{1,4}:){0,4}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}<ipv4>|(?:[\\da-f]{1,4}:){0,5}:<ipv4>|::(?:[\\da-f]{1,4}:){0,5}<ipv4>|[\\da-f]{1,4}::(?:[\\da-f]{1,4}:){0,5}[\\da-f]{1,4}|::(?:[\\da-f]{1,4}:){0,6}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){1,7}:)(?:\\/\\d{1,3})?|<ipv4>(?:\\/\\d{1,2})?)\\b/.source.replace(\n\t\t\t\t\t/<ipv4>/g,\n\t\t\t\t\t() =>\n\t\t\t\t\t\t/(?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))/\n\t\t\t\t\t\t\t.source\n\t\t\t\t),\n\t\t\t\t'i'\n\t\t\t),\n\t\t\talias: 'number',\n\t\t},\n\n\t\t// support *nix / Windows, directory / file\n\t\t'path': {\n\t\t\tpattern: /(\\s)\\/(?:[^\\/\\s]+\\/)*[^\\/\\s]*|\\b[a-zA-Z]:\\\\(?:[^\\\\\\s]+\\\\)*[^\\\\\\s]*/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'string',\n\t\t},\n\t\t'variable': /\\$\\{?\\w+\\}?/,\n\t\t'email': {\n\t\t\tpattern: /[\\w-]+@[\\w-]+(?:\\.[\\w-]{2,3}){1,2}/,\n\t\t\talias: 'string',\n\t\t},\n\t\t'conditional-configuration': {\n\t\t\tpattern: /@\\^?[\\w-]+/,\n\t\t\talias: 'variable',\n\t\t},\n\t\t'operator': /=/,\n\n\t\t'property':\n\t\t\t/\\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\\b/,\n\n\t\t'constant':\n\t\t\t/\\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\\b/,\n\n\t\t'number': {\n\t\t\tpattern: /(^|[^\\w.-])-?\\d+(?:\\.\\d+)?/,\n\t\t\tlookbehind: true,\n\t\t},\n\n\t\t'boolean': /\\b(?:false|no|off|on|true|yes)\\b/,\n\n\t\t'punctuation': /[\\{\\}]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/keyman.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'keyman'>} */\nexport default {\n\tid: 'keyman',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\\bc .*/i,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"[^\"\\r\\n]*\"|'[^'\\r\\n]*'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'virtual-key': {\n\t\t\tpattern:\n\t\t\t\t/\\[\\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\\s+)*(?:[TKU]_[\\w?]+|[A-E]\\d\\d?|\"[^\"\\r\\n]*\"|'[^'\\r\\n]*')\\s*\\]/i,\n\t\t\tgreedy: true,\n\t\t\talias: 'function', // alias for styles\n\t\t},\n\n\t\t// https://help.keyman.com/developer/language/guide/headers\n\t\t'header-keyword': {\n\t\t\tpattern: /&\\w+/,\n\t\t\talias: 'bold', // alias for styles\n\t\t},\n\t\t'header-statement': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\\b/i,\n\t\t\talias: 'bold', // alias for styles\n\t\t},\n\n\t\t'rule-keyword': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\\b/i,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'structural-keyword': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\\b/i,\n\t\t\talias: 'keyword',\n\t\t},\n\n\t\t'compile-target': {\n\t\t\tpattern: /\\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,\n\t\t\talias: 'property',\n\t\t},\n\n\t\t// U+####, x###, d### characters and numbers\n\t\t'number': /\\b(?:U\\+[\\dA-F]+|d\\d+|x[\\da-f]+|\\d+)\\b/i,\n\t\t'operator': /[+>\\\\$]|\\.\\./,\n\t\t'punctuation': /[()=,]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/kotlin.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'kotlin'>} */\nexport default {\n\tid: 'kotlin',\n\tbase: clike,\n\talias: ['kt', 'kts'],\n\tgrammar () {\n\t\tconst interpolationInside = {\n\t\t\t'interpolation-punctuation': {\n\t\t\t\tpattern: /^\\$\\{?|\\}$/,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'expression': {\n\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\tinside: 'kotlin',\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'keyword': {\n\t\t\t\t// The lookbehind prevents wrong highlighting of e.g. kotlin.properties.get\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^.])\\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\\b/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'function': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(?:`[^\\r\\n`]+`|\\b\\w+)(?=\\s*\\()/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\.)(?:`[^\\r\\n`]+`|\\w+)(?=\\s*\\{)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'number':\n\t\t\t\t/\\b(?:0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\\d+(?:_\\d+)*(?:\\.\\d+(?:_\\d+)*)?(?:[eE][+-]?\\d+(?:_\\d+)*)?[fFL]?)\\b/,\n\t\t\t'operator':\n\t\t\t\t/\\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\\/*%<>]=?|[?:]:?|\\.\\.|&&|\\|\\||\\b(?:and|inv|or|shl|shr|ushr|xor)\\b/,\n\t\t\t$insertBefore: {\n\t\t\t\t'string': {\n\t\t\t\t\t// https://kotlinlang.org/spec/expressions.html#string-interpolation-expressions\n\t\t\t\t\t'string-literal': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /\"\"\"(?:[^$]|\\$(?:(?!\\{)|\\{[^{}]*\\}))*?\"\"\"/,\n\t\t\t\t\t\t\talias: 'multiline',\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\t\t\t\tpattern: /\\$(?:[a-z_]\\w*|\\{[^{}]*\\})/i,\n\t\t\t\t\t\t\t\t\tinside: interpolationInside,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /\"(?:[^\"\\\\\\r\\n$]|\\\\.|\\$(?:(?!\\{)|\\{[^{}]*\\}))*\"/,\n\t\t\t\t\t\t\talias: 'singleline',\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\$(?:[a-z_]\\w*|\\{[^{}]*\\})/i,\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t\tinside: interpolationInside,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'char': {\n\t\t\t\t\t\t// https://kotlinlang.org/spec/expressions.html#character-literals\n\t\t\t\t\t\tpattern: /'(?:[^'\\\\\\r\\n]|\\\\(?:.|u[a-fA-F0-9]{0,4}))'/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'keyword': {\n\t\t\t\t\t'annotation': {\n\t\t\t\t\t\tpattern: /\\B@(?:\\w+:)?(?:[A-Z]\\w*|\\[[^\\]]+\\])/,\n\t\t\t\t\t\talias: 'builtin',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'function': {\n\t\t\t\t\t'label': {\n\t\t\t\t\t\tpattern: /\\b\\w+@|@\\w+\\b/,\n\t\t\t\t\t\talias: 'symbol',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t$delete: ['class-name', 'string'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/kumir.js",
    "content": "/* eslint-disable regexp/no-dupe-characters-character-class */\n\n/** @type {import('../types.d.ts').LanguageProto<'kumir'>} */\nexport default {\n\tid: 'kumir',\n\talias: 'kum',\n\tgrammar () {\n\t\t/**\n\t\t * Regular expression for characters that are not allowed in identifiers.\n\t\t */\n\t\tconst nonId = /\\s\\x00-\\x1f\\x22-\\x2f\\x3a-\\x3f\\x5b-\\x5e\\x60\\x7b-\\x7e/.source;\n\n\t\t/**\n\t\t * Surround a regular expression for IDs with patterns for non-ID sequences.\n\t\t *\n\t\t * @param {string} pattern A regular expression for identifiers.\n\t\t * @param {string} [flags] The regular expression flags.\n\t\t * @returns {RegExp} A wrapped regular expression for identifiers.\n\t\t */\n\t\tfunction wrapId (pattern, flags) {\n\t\t\treturn RegExp(pattern.replace(/<nonId>/g, nonId), flags);\n\t\t}\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\|.*/,\n\t\t\t},\n\n\t\t\t'prolog': {\n\t\t\t\tpattern: /#.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\\n\\r\"]*\"|'[^\\n\\r']*'/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'boolean': {\n\t\t\t\tpattern: wrapId(/(^|[<nonId>])(?:да|нет)(?=[<nonId>]|$)/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'operator-word': {\n\t\t\t\tpattern: wrapId(/(^|[<nonId>])(?:и|или|не)(?=[<nonId>]|$)/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\n\t\t\t'system-variable': {\n\t\t\t\tpattern: wrapId(/(^|[<nonId>])знач(?=[<nonId>]|$)/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\n\t\t\t'type': [\n\t\t\t\t{\n\t\t\t\t\tpattern: wrapId(\n\t\t\t\t\t\t/(^|[<nonId>])(?:вещ|лит|лог|сим|цел)(?:\\x20*таб)?(?=[<nonId>]|$)/.source\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'builtin',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: wrapId(\n\t\t\t\t\t\t/(^|[<nonId>])(?:компл|сканкод|файл|цвет)(?=[<nonId>]|$)/.source\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'important',\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t/**\n\t\t\t * Should be performed after searching for type names because of \"таб\".\n\t\t\t * \"таб\" is a reserved word, but never used without a preceding type name.\n\t\t\t * \"НАЗНАЧИТЬ\", \"Фввод\", and \"Фвывод\" are not reserved words.\n\t\t\t */\n\t\t\t'keyword': {\n\t\t\t\tpattern: wrapId(\n\t\t\t\t\t/(^|[<nonId>])(?:алг|арг(?:\\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\\x20+|_)исп)?|кц(?:(?:\\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[<nonId>]|$)/\n\t\t\t\t\t\t.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t/** Should be performed after searching for reserved words. */\n\t\t\t'name': {\n\t\t\t\tpattern: wrapId(\n\t\t\t\t\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\t\t\t\t\t/(^|[<nonId>])[^\\d<nonId>][^<nonId>]*(?:\\x20+[^<nonId>]+)*(?=[<nonId>]|$)/\n\t\t\t\t\t\t.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t/** Should be performed after searching for names. */\n\t\t\t'number': {\n\t\t\t\tpattern: wrapId(\n\t\t\t\t\t/(^|[<nonId>])(?:\\B\\$[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)(?=[<nonId>]|$)/\n\t\t\t\t\t\t.source,\n\t\t\t\t\t'i'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t/** Should be performed after searching for words. */\n\t\t\t'punctuation': /:=|[(),:;\\[\\]]/,\n\n\t\t\t/**\n\t\t\t * Should be performed after searching for\n\t\t\t * - numeric constants (because of \"+\" and \"-\");\n\t\t\t * - punctuation marks (because of \":=\" and \"=\").\n\t\t\t */\n\t\t\t'operator-char': {\n\t\t\t\tpattern: /\\*\\*?|<[=>]?|>=?|[-+/=]/,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/kusto.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'kusto'>} */\nexport default {\n\tid: 'kusto',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\\/\\/.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern:\n\t\t\t\t/```[\\s\\S]*?```|[hH]?(?:\"(?:[^\\r\\n\\\\\"]|\\\\.)*\"|'(?:[^\\r\\n\\\\']|\\\\.)*'|@(?:\"[^\\r\\n\"]*\"|'[^\\r\\n']*'))/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'verb': {\n\t\t\tpattern: /(\\|\\s*)[a-z][\\w-]*/i,\n\t\t\tlookbehind: true,\n\t\t\talias: 'keyword',\n\t\t},\n\n\t\t'command': {\n\t\t\tpattern: /\\.[a-z][a-z\\d-]*\\b/,\n\t\t\talias: 'keyword',\n\t\t},\n\n\t\t'class-name': /\\b(?:bool|datetime|decimal|dynamic|guid|int|long|real|string|timespan)\\b/,\n\t\t'keyword':\n\t\t\t/\\b(?:access|alias|and|anti|as|asc|auto|between|by|(?:contains|(?:ends|starts)with|has(?:perfix|suffix)?)(?:_cs)?|database|declare|desc|external|from|fullouter|has_all|in|ingestion|inline|inner|innerunique|into|(?:left|right)(?:anti(?:semi)?|inner|outer|semi)?|let|like|local|not|of|on|or|pattern|print|query_parameters|range|restrict|schema|set|step|table|tables|to|view|where|with|matches\\s+regex|nulls\\s+(?:first|last))(?![\\w-])/,\n\t\t'boolean': /\\b(?:false|null|true)\\b/,\n\n\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/,\n\n\t\t'datetime': [\n\t\t\t{\n\t\t\t\t// RFC 822 + RFC 850\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:(?:Fri|Friday|Mon|Monday|Sat|Saturday|Sun|Sunday|Thu|Thursday|Tue|Tuesday|Wed|Wednesday)\\s*,\\s*)?\\d{1,2}(?:\\s+|-)(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)(?:\\s+|-)\\d{2}\\s+\\d{2}:\\d{2}(?::\\d{2})?(?:\\s*(?:\\b(?:[A-Z]|(?:[ECMT][DS]|GM|U)T)|[+-]\\d{4}))?\\b/,\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t\t{\n\t\t\t\t// ISO 8601\n\t\t\t\tpattern:\n\t\t\t\t\t/[+-]?\\b(?:\\d{4}-\\d{2}-\\d{2}(?:[ T]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?|\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)Z?/,\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t],\n\t\t'number':\n\t\t\t/\\b(?:0x[0-9A-Fa-f]+|\\d+(?:\\.\\d+)?(?:[Ee][+-]?\\d+)?)(?:(?:min|sec|[mnµ]s|[dhms]|microsecond|tick)\\b)?|[+-]?\\binf\\b/,\n\n\t\t'operator': /=>|[!=]~|[!=<>]=?|[-+*/%|]|\\.\\./,\n\t\t'punctuation': /[()\\[\\]{},;.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/latex.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'latex'>} */\nexport default {\n\tid: 'latex',\n\talias: ['tex', 'context'],\n\tgrammar () {\n\t\tconst funcPattern = /\\\\(?:[^a-z()[\\]]|[a-z*]+)/i;\n\t\tconst insideEqu = {\n\t\t\t'equation-command': {\n\t\t\t\tpattern: funcPattern,\n\t\t\t\talias: 'regex',\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'comment': /%.*/,\n\t\t\t// the verbatim environment prints whitespace to the document\n\t\t\t'cdata': {\n\t\t\t\tpattern: /(\\\\begin\\{((?:lstlisting|verbatim)\\*?)\\})[\\s\\S]*?(?=\\\\end\\{\\2\\})/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t/*\n\t\t\t * equations can be between $$ $$ or $ $ or \\( \\) or \\[ \\]\n\t\t\t * (all are multiline)\n\t\t\t */\n\t\t\t'equation': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\$\\$(?:\\\\[\\s\\S]|[^\\\\$])+\\$\\$|\\$(?:\\\\[\\s\\S]|[^\\\\$])+\\$|\\\\\\([\\s\\S]*?\\\\\\)|\\\\\\[[\\s\\S]*?\\\\\\]/,\n\t\t\t\t\tinside: insideEqu,\n\t\t\t\t\talias: 'string',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(\\\\begin\\{((?:align|eqnarray|equation|gather|math|multline)\\*?)\\})[\\s\\S]*?(?=\\\\end\\{\\2\\})/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: insideEqu,\n\t\t\t\t\talias: 'string',\n\t\t\t\t},\n\t\t\t],\n\t\t\t/*\n\t\t\t * arguments which are keywords or references are highlighted\n\t\t\t * as keywords\n\t\t\t */\n\t\t\t'keyword': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(\\\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\\[[^\\]]+\\])?\\{)[^}]+(?=\\})/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'url': {\n\t\t\t\tpattern: /(\\\\url\\{)[^}]+(?=\\})/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t/*\n\t\t\t * section or chapter headlines are highlighted as bold so that\n\t\t\t * they stand out more\n\t\t\t */\n\t\t\t'headline': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(\\\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\\*?(?:\\[[^\\]]+\\])?\\{)[^}]+(?=\\})/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'class-name',\n\t\t\t},\n\t\t\t'function': {\n\t\t\t\tpattern: funcPattern,\n\t\t\t\talias: 'selector',\n\t\t\t},\n\t\t\t'punctuation': /[[\\]{}&]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/latte.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport { insertBefore } from '../util/language-util.js';\nimport markup from './markup.js';\nimport php from './php.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'latte'>} */\nexport default {\n\tid: 'latte',\n\trequire: [markup, php],\n\tgrammar ({ extend }) {\n\t\tconst markupLatte = extend('markup', {});\n\t\tconst tag = /** @type {GrammarToken & { inside: Grammar }} */ (markupLatte.tag);\n\t\tinsertBefore(tag.inside, 'attr-value', {\n\t\t\t'n-attr': {\n\t\t\t\tpattern: /n:[\\w-]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+))?/,\n\t\t\t\tinside: {\n\t\t\t\t\t'attr-name': {\n\t\t\t\t\t\tpattern: /^[^\\s=]+/,\n\t\t\t\t\t\talias: 'important',\n\t\t\t\t\t},\n\t\t\t\t\t'attr-value': {\n\t\t\t\t\t\tpattern: /=[\\s\\S]+/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t\t\t/^=/,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpattern: /^(\\s*)[\"']|[\"']$/,\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t'php': {\n\t\t\t\t\t\t\t\tpattern: /\\S(?:[\\s\\S]*\\S)?/,\n\t\t\t\t\t\t\t\tinside: 'php',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn {\n\t\t\t'latte-comment': {\n\t\t\t\tpattern: /\\{\\*[\\s\\S]*?\\*\\}/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'comment',\n\t\t\t},\n\t\t\t'latte': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\{[^'\"\\s{}*](?:[^\"'/{}]|\\/(?![*/])|(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*\\}/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'latte-tag': {\n\t\t\t\t\t\t// https://latte.nette.org/en/tags\n\t\t\t\t\t\tpattern: /(^\\{(?:\\/(?=[a-z]))?)(?:[=_]|[a-z]\\w*\\b(?!\\())/i,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'important',\n\t\t\t\t\t},\n\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\tpattern: /^\\{\\/?|\\}$/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t'php': {\n\t\t\t\t\t\tpattern: /\\S(?:[\\s\\S]*\\S)?/,\n\t\t\t\t\t\talias: 'language-php',\n\t\t\t\t\t\tinside: 'php',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t$tokenize: embeddedIn(markupLatte),\n\t\t};\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/less.js",
    "content": "import css from './css.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'less'>} */\nexport default {\n\tid: 'less',\n\tbase: css,\n\tgrammar () {\n\t\t/* FIXME :\n\t\t :extend() is not handled specifically : its highlighting is buggy.\n\t\t Mixin usage must be inside a ruleset to be highlighted.\n\t\t At-rules (e.g. import) containing interpolations are buggy.\n\t\t Detached rulesets are highlighted as at-rules.\n\t\t A comment before a mixin usage prevents the latter to be properly highlighted.\n\t\t */\n\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t/\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\\\])\\/\\/.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'atrule': {\n\t\t\t\tpattern: /@[\\w-](?:\\((?:[^(){}]|\\([^(){}]*\\))*\\)|[^(){};\\s]|\\s+(?!\\s))*?(?=\\s*\\{)/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /[:()]/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t// selectors and mixins are considered the same\n\t\t\t'selector': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(?:@\\{[\\w-]+\\}|[^{};\\s@])(?:@\\{[\\w-]+\\}|\\((?:[^(){}]|\\([^(){}]*\\))*\\)|[^(){};@\\s]|\\s+(?!\\s))*?(?=\\s*\\{)/,\n\t\t\t\tinside: {\n\t\t\t\t\t// mixin parameters\n\t\t\t\t\t'variable': /@+[\\w-]+/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'property': /(?:@\\{[\\w-]+\\}|[\\w-])+(?:\\+_?)?(?=\\s*:)/,\n\t\t\t'operator': /[+\\-*\\/]/,\n\t\t\t$insertBefore: {\n\t\t\t\t'property': {\n\t\t\t\t\t'variable': [\n\t\t\t\t\t\t// Variable declaration (the colon must be consumed!)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /@[\\w-]+\\s*:/,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'punctuation': /:/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t// Variable usage\n\t\t\t\t\t\t/@@?[\\w-]+/,\n\t\t\t\t\t],\n\t\t\t\t\t'mixin-usage': {\n\t\t\t\t\t\tpattern: /([{;]\\s*)[.#](?!\\d)[\\w-].*?(?=[(;])/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'function',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/lilypond.js",
    "content": "import scheme from './scheme.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'lilypond'>} */\nexport default {\n\tid: 'lilypond',\n\trequire: scheme,\n\talias: 'ly',\n\tgrammar () {\n\t\tlet schemeExpression =\n\t\t\t/\\((?:[^();\"#\\\\]|\\\\[\\s\\S]|;.*(?!.)|\"(?:[^\"\\\\]|\\\\.)*\"|#(?:\\{(?:(?!#\\})[\\s\\S])*#\\}|[^{])|<expr>)*\\)/\n\t\t\t\t.source;\n\t\t// allow for up to pow(2, recursivenessLog2) many levels of recursive brace expressions\n\t\t// For some reason, this can't be 4\n\t\tconst recursivenessLog2 = 5;\n\t\tfor (let i = 0; i < recursivenessLog2; i++) {\n\t\t\tschemeExpression = schemeExpression.replace(/<expr>/g, () => schemeExpression);\n\t\t}\n\t\tschemeExpression = schemeExpression.replace(/<expr>/g, /[^\\s\\S]/.source);\n\n\t\treturn {\n\t\t\t'comment': /%(?:(?!\\{).*|\\{[\\s\\S]*?%\\})/,\n\t\t\t'embedded-scheme': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/(^|[=\\s])#(?:\"(?:[^\"\\\\]|\\\\.)*\"|[^\\s()\"]*(?:[^\\s()]|<expr>))/.source.replace(\n\t\t\t\t\t\t/<expr>/g,\n\t\t\t\t\t\t() => schemeExpression\n\t\t\t\t\t),\n\t\t\t\t\t'm'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'scheme': {\n\t\t\t\t\t\tpattern: /^(#)[\\s\\S]+$/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'language-scheme',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'embedded-lilypond': {\n\t\t\t\t\t\t\t\tpattern: /#\\{[\\s\\S]*?#\\}/,\n\t\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t'punctuation': /^#\\{|#\\}$/,\n\t\t\t\t\t\t\t\t\t'lilypond': {\n\t\t\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\t\t\talias: 'language-lilypond',\n\t\t\t\t\t\t\t\t\t\tinside: 'lilypond',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t$rest: 'scheme',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /#/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:[^\"\\\\]|\\\\.)*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'class-name': {\n\t\t\t\tpattern: /(\\\\new\\s+)[\\w-]+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'keyword': {\n\t\t\t\tpattern: /\\\\[a-z][-\\w]*/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^\\\\/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'operator': /[=|]|<<|>>/,\n\t\t\t'punctuation': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[a-z\\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\\d))|[_^]\\.?|[.!])|[{}()[\\]<>^~]|\\\\[()[\\]<>\\\\!]|--|__/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'number': /\\b\\d+(?:\\/\\d+)?\\b/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/linker-script.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'linker-script'>} */\nexport default {\n\tid: 'linker-script',\n\talias: 'ld',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(^|\\s)\\/\\*[\\s\\S]*?(?:$|\\*\\/)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'identifier': {\n\t\t\tpattern: /\"[^\"\\r\\n]*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'location-counter': {\n\t\t\tpattern: /\\B\\.\\B/,\n\t\t\talias: 'important',\n\t\t},\n\n\t\t'section': {\n\t\t\tpattern: /(^|[^\\w*])\\.\\w+\\b/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'function': /\\b[A-Z][A-Z_]*(?=\\s*\\()/,\n\n\t\t'number': /\\b(?:0[xX][a-fA-F0-9]+|\\d+)[KM]?\\b/,\n\n\t\t'operator': />>=?|<<=?|->|\\+\\+|--|&&|\\|\\||::|[?:~]|[-+*/%&|^!=<>]=?/,\n\t\t'punctuation': /[(){},;]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/liquid.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'liquid'>} */\nexport default {\n\tid: 'liquid',\n\trequire: markup,\n\tgrammar: {\n\t\t'ignore-raw': {\n\t\t\tpattern: /(\\{%-?\\s*raw\\b[^\\}]*\\})[\\s\\S]*?(?=\\{%-?\\s*endraw\\b[^\\}]*\\})/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'liquid': {\n\t\t\tpattern:\n\t\t\t\t/\\{%\\s*comment\\s*%\\}[\\s\\S]*?\\{%\\s*endcomment\\s*%\\}|\\{(?:%[\\s\\S]*?%|\\{\\{[\\s\\S]*?\\}\\}|\\{[\\s\\S]*?\\})\\}/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'comment': {\n\t\t\t\t\tpattern: /(^\\{%\\s*comment\\s*%\\})[\\s\\S]+(?=\\{%\\s*endcomment\\s*%\\}$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t'delimiter': {\n\t\t\t\t\tpattern: /^\\{(?:\\{\\{|[%\\{])-?|-?(?:\\}\\}|[%\\}])\\}$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t\t'string': {\n\t\t\t\t\tpattern: /\"[^\"]*\"|'[^']*'/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t'keyword':\n\t\t\t\t\t/\\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\\b/,\n\t\t\t\t'object':\n\t\t\t\t\t/\\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\\b/,\n\t\t\t\t'function': [\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: /(\\|\\s*)\\w+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'filter',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t// array functions\n\t\t\t\t\t\tpattern: /(\\.\\s*)(?:first|last|size)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t'boolean': /\\b(?:false|nil|true)\\b/,\n\t\t\t\t'range': {\n\t\t\t\t\tpattern: /\\.\\./,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t\t// https://github.com/Shopify/liquid/blob/698f5e0d967423e013f6169d9111bd969bd78337/lib/liquid/lexer.rb#L21\n\t\t\t\t'number': /\\b\\d+(?:\\.\\d+)?\\b/,\n\t\t\t\t'operator': /[!=]=|<>|[<>]=?|[|?:=-]|\\b(?:and|contains(?=\\s)|or)\\b/,\n\t\t\t\t'punctuation': /[.,\\[\\]()]/,\n\t\t\t\t'empty': {\n\t\t\t\t\tpattern: /\\bempty\\b/,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t$tokenize: embeddedIn('markup'),\n\t},\n};\n"
  },
  {
    "path": "src/languages/lisp.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'lisp'>} */\nexport default {\n\tid: 'lisp',\n\talias: ['emacs', 'elisp', 'emacs-lisp'],\n\tgrammar () {\n\t\t/**\n\t\t * Functions to construct regular expressions\n\t\t * e.g. (interactive ... or (interactive)\n\t\t *\n\t\t * @param {string} name\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction simple_form (name) {\n\t\t\treturn RegExp(/(\\()/.source + '(?:' + name + ')' + /(?=[\\s\\)])/.source);\n\t\t}\n\t\t/**\n\t\t * booleans and numbers\n\t\t *\n\t\t * @param {string} pattern\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction primitive (pattern) {\n\t\t\treturn RegExp(/([\\s([])/.source + '(?:' + pattern + ')' + /(?=[\\s)])/.source);\n\t\t}\n\n\t\t// Patterns in regular expressions\n\n\t\t// Symbol name. See https://www.gnu.org/software/emacs/manual/html_node/elisp/Symbol-Type.html\n\t\t// & and : are excluded as they are usually used for special purposes\n\t\tconst symbol = /(?!\\d)[-+*/~!@$%^=<>{}\\w]+/.source;\n\t\t// symbol starting with & used in function arguments\n\t\tconst marker = '&' + symbol;\n\t\t// Open parenthesis for look-behind\n\t\tconst par = '(\\\\()';\n\t\tconst endpar = '(?=\\\\))';\n\t\t// End the pattern with look-ahead space\n\t\tconst space = '(?=\\\\s)';\n\t\tconst nestedPar =\n\t\t\t/(?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\))*\\))*\\))*/\n\t\t\t\t.source;\n\n\t\tconst arg = {\n\t\t\t'lisp-marker': RegExp(marker),\n\t\t\t'varform': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/\\(/.source + symbol + /\\s+(?=\\S)/.source + nestedPar + /\\)/.source\n\t\t\t\t),\n\t\t\t\tinside: 'lisp',\n\t\t\t},\n\t\t\t'argument': {\n\t\t\t\tpattern: RegExp(/(^|[\\s(])/.source + symbol),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'variable',\n\t\t\t},\n\t\t\t$rest: 'lisp',\n\t\t};\n\n\t\tconst forms = '\\\\S+(?:\\\\s+\\\\S+)*';\n\n\t\tconst arglist = {\n\t\t\tpattern: RegExp(par + nestedPar + endpar),\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'rest-vars': {\n\t\t\t\t\tpattern: RegExp('&(?:body|rest)\\\\s+' + forms),\n\t\t\t\t\tinside: arg,\n\t\t\t\t},\n\t\t\t\t'other-marker-vars': {\n\t\t\t\t\tpattern: RegExp('&(?:aux|optional)\\\\s+' + forms),\n\t\t\t\t\tinside: arg,\n\t\t\t\t},\n\t\t\t\t'keys': {\n\t\t\t\t\tpattern: RegExp('&key\\\\s+' + forms + '(?:\\\\s+&allow-other-keys)?'),\n\t\t\t\t\tinside: arg,\n\t\t\t\t},\n\t\t\t\t'argument': {\n\t\t\t\t\tpattern: RegExp(symbol),\n\t\t\t\t\talias: 'variable',\n\t\t\t\t},\n\t\t\t\t'punctuation': /[()]/,\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t// Three or four semicolons are considered a heading.\n\t\t\t// See https://www.gnu.org/software/emacs/manual/html_node/elisp/Comment-Tips.html\n\t\t\t'heading': {\n\t\t\t\tpattern: /;;;.*/,\n\t\t\t\talias: ['comment', 'title'],\n\t\t\t},\n\t\t\t'comment': /;.*/,\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:[^\"\\\\]|\\\\.)*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'argument': /[-A-Z]+(?=[.,\\s])/,\n\t\t\t\t\t'symbol': RegExp('`' + symbol + \"'\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\t'quoted-symbol': {\n\t\t\t\tpattern: RegExp(\"#?'\" + symbol),\n\t\t\t\talias: ['variable', 'symbol'],\n\t\t\t},\n\t\t\t'lisp-property': {\n\t\t\t\tpattern: RegExp(':' + symbol),\n\t\t\t\talias: 'property',\n\t\t\t},\n\t\t\t'splice': {\n\t\t\t\tpattern: RegExp(',@?' + symbol),\n\t\t\t\talias: ['symbol', 'variable'],\n\t\t\t},\n\t\t\t'keyword': [\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\tpar +\n\t\t\t\t\t\t\t'(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)' +\n\t\t\t\t\t\t\tspace\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\tpar + '(?:append|by|collect|concat|do|finally|for|in|return)' + space\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'declare': {\n\t\t\t\tpattern: simple_form(/declare/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'interactive': {\n\t\t\t\tpattern: simple_form(/interactive/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'boolean': {\n\t\t\t\tpattern: primitive(/nil|t/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'number': {\n\t\t\t\tpattern: primitive(/[-+]?\\d+(?:\\.\\d*)?/.source),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'defvar': {\n\t\t\t\tpattern: RegExp(par + 'def(?:const|custom|group|var)\\\\s+' + symbol),\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\tkeyword: /^def[a-z]+/,\n\t\t\t\t\tvariable: RegExp(symbol),\n\t\t\t\t},\n\t\t\t},\n\t\t\t'defun': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\tpar +\n\t\t\t\t\t\t/(?:cl-)?(?:defmacro|defun\\*?)\\s+/.source +\n\t\t\t\t\t\tsymbol +\n\t\t\t\t\t\t/\\s+\\(/.source +\n\t\t\t\t\t\tnestedPar +\n\t\t\t\t\t\t/\\)/.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'keyword': /^(?:cl-)?def\\S+/,\n\t\t\t\t\t// See below, this property needs to be defined later so that it can\n\t\t\t\t\t// reference the language object.\n\t\t\t\t\t'arguments': {\n\t\t\t\t\t\t...arglist,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t...arglist.inside,\n\t\t\t\t\t\t\t'sublist': arglist,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'function': {\n\t\t\t\t\t\tpattern: RegExp('(^\\\\s)' + symbol),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /[()]/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'lambda': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\tpar + 'lambda\\\\s+\\\\(\\\\s*(?:&?' + symbol + '(?:\\\\s+&?' + symbol + ')*\\\\s*)?\\\\)'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'keyword': /^lambda/,\n\t\t\t\t\t// See below, this property needs to be defined later so that it can\n\t\t\t\t\t// reference the language object.\n\t\t\t\t\t'arguments': arglist,\n\t\t\t\t\t'punctuation': /[()]/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'car': {\n\t\t\t\tpattern: RegExp(par + symbol),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'punctuation': [\n\t\t\t\t// open paren, brackets, and close paren\n\t\t\t\t/(?:['`,]?\\(|[)\\[\\]])/,\n\t\t\t\t// cons\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\s)\\.(?=\\s)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/livescript.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'livescript'>} */\nexport default {\n\tid: 'livescript',\n\tgrammar: {\n\t\t'comment': [\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\\\])#.*/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'interpolated-string': {\n\t\t\t/* Look-behind and look-ahead prevents wrong behavior of the greedy pattern\n\t\t\t * forcing it to match \"\"\"-quoted string when it would otherwise match \"-quoted first. */\n\t\t\tpattern: /(^|[^\"])(\"\"\"|\")(?:\\\\[\\s\\S]|(?!\\2)[^\\\\])*\\2(?!\")/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'variable': {\n\t\t\t\t\tpattern: /(^|[^\\\\])#[a-z_](?:-?[a-z]|[\\d_])*/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t'interpolation': {\n\t\t\t\t\tpattern: /(^|[^\\\\])#\\{[^}]+\\}/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\tpattern: /^#\\{|\\}$/,\n\t\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t$rest: 'livescript',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t},\n\t\t},\n\t\t'string': [\n\t\t\t{\n\t\t\t\tpattern: /('''|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /<\\[[\\s\\S]*?\\]>/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t/\\\\[^\\s,;\\])}]+/,\n\t\t],\n\t\t'regex': [\n\t\t\t{\n\t\t\t\tpattern: /\\/\\/(?:\\[[^\\r\\n\\]]*\\]|\\\\.|(?!\\/\\/)[^\\\\\\[])+\\/\\/[gimyu]{0,5}/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'comment': {\n\t\t\t\t\t\tpattern: /(^|[^\\\\])#.*/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /\\/(?:\\[[^\\r\\n\\]]*\\]|\\\\.|[^/\\\\\\r\\n\\[])+\\/[gimyu]{0,5}/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\t\t'keyword': {\n\t\t\tpattern:\n\t\t\t\t/(^|(?!-).)\\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\\b/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'keyword-operator': {\n\t\t\tpattern:\n\t\t\t\t/(^|[^-])\\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\\b)/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'boolean': {\n\t\t\tpattern: /(^|[^-])\\b(?:false|no|off|on|true|yes)(?!-)\\b/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'argument': {\n\t\t\t// Don't match .&. nor &&\n\t\t\tpattern: /(^|(?!\\.&\\.)[^&])&(?!&)\\d*/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'variable',\n\t\t},\n\t\t'number': /\\b(?:\\d+~[\\da-z]+|\\d[\\d_]*(?:\\.\\d[\\d_]*)?(?:[a-z]\\w*)?)/i,\n\t\t'identifier': /[a-z_](?:-?[a-z]|[\\d_])*/i,\n\t\t'operator': [\n\t\t\t// Spaced .\n\t\t\t{\n\t\t\t\tpattern: /( )\\.(?= )/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t// Full list, in order:\n\t\t\t// .= .~ .. ...\n\t\t\t// .&. .^. .<<. .>>. .>>>.\n\t\t\t// := :: ::=\n\t\t\t// &&\n\t\t\t// || |>\n\t\t\t// < << <<< <<<<\n\t\t\t// <- <-- <-! <--!\n\t\t\t// <~ <~~ <~! <~~!\n\t\t\t// <| <= <?\n\t\t\t// > >> >= >?\n\t\t\t// - -- -> -->\n\t\t\t// + ++\n\t\t\t// @ @@\n\t\t\t// % %%\n\t\t\t// * **\n\t\t\t// ! != !~=\n\t\t\t// !~> !~~>\n\t\t\t// !-> !-->\n\t\t\t// ~ ~> ~~> ~=\n\t\t\t// = ==\n\t\t\t// ^ ^^\n\t\t\t// / ?\n\t\t\t/\\.(?:[=~]|\\.\\.?)|\\.(?:[&|^]|<<|>>>?)\\.|:(?:=|:=?)|&&|\\|[|>]|<(?:<<?<?|--?!?|~~?!?|[|=?])?|>[>=?]?|-(?:->?|>)?|\\+\\+?|@@?|%%?|\\*\\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\\^\\^?|[\\/?]/,\n\t\t],\n\t\t'punctuation': /[(){}\\[\\]|.,:;`]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/llvm.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'llvm'>} */\nexport default {\n\tid: 'llvm',\n\tgrammar: {\n\t\t'comment': /;.*/,\n\t\t'string': {\n\t\t\tpattern: /\"[^\"]*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'variable': /[%@!#](?:(?!\\d)(?:[-$.\\w]|\\\\[a-f\\d]{2})+|\\d+)/i,\n\t\t'label': /(?!\\d)(?:[-$.\\w]|\\\\[a-f\\d]{2})+:/i,\n\t\t'type': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:double|float|fp128|half|i[1-9]\\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\\b/,\n\t\t\talias: 'class-name',\n\t\t},\n\t\t'keyword': /\\b[a-z_][a-z_0-9]*\\b/,\n\t\t'number':\n\t\t\t/[+-]?\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b|\\b0x[\\dA-Fa-f]+\\b|\\b0xK[\\dA-Fa-f]{20}\\b|\\b0x[ML][\\dA-Fa-f]{32}\\b|\\b0xH[\\dA-Fa-f]{4}\\b/,\n\t\t'punctuation': /[{}[\\];(),.!*=<>]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/log.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'log'>} */\nexport default {\n\tid: 'log',\n\toptional: 'javastacktrace',\n\tgrammar ({ getOptionalLanguage }) {\n\t\t// This is a language definition for generic log files.\n\t\t// Since there is no one log format, this language definition has to support all formats to some degree.\n\t\t//\n\t\t// Based on https://github.com/MTDL9/vim-log-highlighting\n\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\t// Single-quoted strings must not be confused with plain text. E.g. Can't isn't Susan's Chris' toy\n\t\t\t\tpattern: /\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"|'(?![st] | \\w)(?:[^'\\\\\\r\\n]|\\\\.)*'/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'exception': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\w.])[a-z][\\w.]*(?:Error|Exception):.*(?:(?:\\r\\n?|\\n)[ \\t]*(?:at[ \\t].+|\\.{3}.*|Caused by:.*))+(?:(?:\\r\\n?|\\n)[ \\t]*\\.\\.\\. .*)?/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: ['javastacktrace', 'language-javastacktrace'],\n\t\t\t\tinside: getOptionalLanguage('javastacktrace') || {\n\t\t\t\t\t'keyword': /\\bat\\b/,\n\t\t\t\t\t'function': /[a-z_][\\w$]*(?=\\()/,\n\t\t\t\t\t'punctuation': /[.:()]/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'level': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\\b/,\n\t\t\t\t\talias: ['error', 'important'],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\b(?:WARN|WARNING|WRN)\\b/,\n\t\t\t\t\talias: ['warning', 'important'],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\\b/,\n\t\t\t\t\talias: ['info', 'keyword'],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\b(?:DBG|DEBUG|FINE)\\b/,\n\t\t\t\t\talias: ['debug', 'keyword'],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\\b/,\n\t\t\t\t\talias: ['trace', 'comment'],\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t'property': {\n\t\t\t\tpattern:\n\t\t\t\t\t/((?:^|[\\]|])[ \\t]*)[a-z_](?:[\\w-]|\\b\\/\\b)*(?:[. ]\\(?\\w(?:[\\w-]|\\b\\/\\b)*\\)?)*:(?=\\s)/im,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'separator': {\n\t\t\t\tpattern: /(^|[^-+])-{3,}|={3,}|\\*{3,}|- - /m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'comment',\n\t\t\t},\n\n\t\t\t'url': /\\b(?:file|ftp|https?):\\/\\/[^\\s|,;'\"]*[^\\s|,;'\">.]/,\n\t\t\t'email': {\n\t\t\t\tpattern: /(^|\\s)[-\\w+.]+@[a-z][a-z0-9-]*(?:\\.[a-z][a-z0-9-]*)+(?=\\s)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'url',\n\t\t\t},\n\n\t\t\t'ip-address': {\n\t\t\t\tpattern: /\\b(?:\\d{1,3}(?:\\.\\d{1,3}){3})\\b/,\n\t\t\t\talias: 'constant',\n\t\t\t},\n\t\t\t'mac-address': {\n\t\t\t\tpattern: /\\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\\b/i,\n\t\t\t\talias: 'constant',\n\t\t\t},\n\t\t\t'domain': {\n\t\t\t\tpattern: /(^|\\s)[a-z][a-z0-9-]*(?:\\.[a-z][a-z0-9-]*)*\\.[a-z][a-z0-9-]+(?=\\s)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'constant',\n\t\t\t},\n\n\t\t\t'uuid': {\n\t\t\t\tpattern: /\\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\b/i,\n\t\t\t\talias: 'constant',\n\t\t\t},\n\t\t\t'hash': {\n\t\t\t\tpattern: /\\b(?:[a-f0-9]{32}){1,2}\\b/i,\n\t\t\t\talias: 'constant',\n\t\t\t},\n\n\t\t\t'file-path': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b[a-z]:[\\\\/][^\\s|,;:(){}\\[\\]\"']+|(^|[\\s:\\[\\](>|])\\.{0,2}\\/\\w[^\\s|,;:(){}\\[\\]\"']*/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'string',\n\t\t\t},\n\n\t\t\t'date': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/\\b\\d{4}[-/]\\d{2}[-/]\\d{2}(?:T(?=\\d{1,2}:)|(?=\\s\\d{1,2}:))/.source +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t/\\b\\d{1,4}[-/ ](?:\\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\\d{2,4}T?\\b/\n\t\t\t\t\t\t\t.source +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t/\\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\\s{1,2}\\d{1,2}\\b/\n\t\t\t\t\t\t\t.source,\n\t\t\t\t\t'i'\n\t\t\t\t),\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t\t'time': {\n\t\t\t\tpattern: /\\b\\d{1,2}:\\d{1,2}:\\d{1,2}(?:[.,:]\\d+)?(?:\\s?[+-]\\d{2}:?\\d{2}|Z)?\\b/,\n\t\t\t\talias: 'number',\n\t\t\t},\n\n\t\t\t'boolean': /\\b(?:false|null|true)\\b/i,\n\t\t\t'number': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^.\\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\\d[\\da-f]*(?:\\.\\d+)*(?:e[+-]?\\d+)?[a-z]{0,3}\\b)\\b(?!\\.\\w)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'operator': /[;:?<=>~/@!$%&+\\-|^(){}*#]/,\n\t\t\t'punctuation': /[\\[\\].,]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/lolcode.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'lolcode'>} */\nexport default {\n\tid: 'lolcode',\n\tgrammar: {\n\t\t'comment': [/\\bOBTW\\s[\\s\\S]*?\\sTLDR\\b/, /\\bBTW.+/],\n\t\t'string': {\n\t\t\tpattern: /\"(?::.|[^\":])*\"/,\n\t\t\tinside: {\n\t\t\t\t'variable': /:\\{[^}]+\\}/,\n\t\t\t\t'symbol': [/:\\([a-f\\d]+\\)/i, /:\\[[^\\]]+\\]/, /:[)>o\":]/],\n\t\t\t},\n\t\t\tgreedy: true,\n\t\t},\n\t\t'number': /(?:\\B-)?(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)/,\n\t\t'symbol': {\n\t\t\tpattern: /(^|\\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\\s|,|$)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'keyword': /A(?=\\s)/,\n\t\t\t},\n\t\t},\n\t\t'label': {\n\t\t\tpattern: /((?:^|\\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\\w*/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'string',\n\t\t},\n\t\t'function': {\n\t\t\tpattern: /((?:^|\\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\\w*/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'keyword': [\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|\\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\\?|YA RLY|YR)(?=\\s|,|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t/'Z(?=\\s|,|$)/,\n\t\t],\n\t\t'boolean': {\n\t\t\tpattern: /(^|\\s)(?:FAIL|WIN)(?=\\s|,|$)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'variable': {\n\t\t\tpattern: /(^|\\s)IT(?=\\s|,|$)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'operator': {\n\t\t\tpattern:\n\t\t\t\t/(^|\\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\\s|,|$)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'punctuation': /\\.{3}|…|,|!/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/lua.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'lua'>} */\nexport default {\n\tid: 'lua',\n\tgrammar: {\n\t\t'comment': /^#!.+|--(?:\\[(=*)\\[[\\s\\S]*?\\]\\1\\]|.*)/m,\n\t\t// \\z may be used to skip the following space\n\t\t'string': {\n\t\t\tpattern:\n\t\t\t\t/([\"'])(?:(?!\\1)[^\\\\\\r\\n]|\\\\z(?:\\r\\n|\\s)|\\\\(?:\\r\\n|[^z]))*\\1|\\[(=*)\\[[\\s\\S]*?\\]\\2\\]/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'number':\n\t\t\t/\\b0x[a-f\\d]+(?:\\.[a-f\\d]*)?(?:p[+-]?\\d+)?\\b|\\b\\d+(?:\\.\\B|(?:\\.\\d*)?(?:e[+-]?\\d+)?\\b)|\\B\\.\\d+(?:e[+-]?\\d+)?\\b/i,\n\t\t'keyword':\n\t\t\t/\\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\\b/,\n\t\t'function': /(?!\\d)\\w+(?=\\s*(?:[({]))/,\n\t\t'operator': [\n\t\t\t/[-+*%^&|#]|\\/\\/?|<[<=]?|>[>=]?|[=~]=?/,\n\t\t\t{\n\t\t\t\t// Match \"..\" but don't break \"...\"\n\t\t\t\tpattern: /(^|[^.])\\.\\.(?!\\.)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'punctuation': /[\\[\\](){},;]|\\.+|:+/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/magma.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'magma'>} */\nexport default {\n\tid: 'magma',\n\tgrammar: {\n\t\t'output': {\n\t\t\tpattern:\n\t\t\t\t/^(>.*(?:\\r(?:\\n|(?!\\n))|\\n))(?!>)(?:.+|(?:\\r(?:\\n|(?!\\n))|\\n)(?!>).*)(?:(?:\\r(?:\\n|(?!\\n))|\\n)(?!>).*)*/m,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'comment': {\n\t\t\tpattern: /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /(^|[^\\\\\"])\"(?:[^\\r\\n\\\\\"]|\\\\.)*\"/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t// http://magma.maths.usyd.edu.au/magma/handbook/text/82\n\t\t'keyword':\n\t\t\t/\\b(?:_|adj|and|assert|assert2|assert3|assigned|break|by|case|cat|catch|clear|cmpeq|cmpne|continue|declare|default|delete|diff|div|do|elif|else|end|eq|error|eval|exists|exit|for|forall|forward|fprintf|freeze|function|ge|gt|if|iload|import|in|intrinsic|is|join|le|load|local|lt|meet|mod|ne|not|notadj|notin|notsubset|or|print|printf|procedure|quit|random|read|readi|repeat|require|requirege|requirerange|restore|return|save|sdiff|select|subset|then|time|to|try|until|vprint|vprintf|vtime|when|where|while|xor)\\b/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\n\t\t'generator': {\n\t\t\tpattern: /\\b[a-z_]\\w*(?=\\s*<)/i,\n\t\t\talias: 'class-name',\n\t\t},\n\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\n\t\t'number': {\n\t\t\tpattern:\n\t\t\t\t/(^|[^\\w.]|\\.\\.)(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?(?:_[a-z]?)?(?=$|[^\\w.]|\\.\\.)/,\n\t\t\tlookbehind: true,\n\t\t},\n\n\t\t'operator': /->|[-+*/^~!|#=]|:=|\\.\\./,\n\t\t'punctuation': /[()[\\]{}<>,;.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/makefile.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'makefile'>} */\nexport default {\n\tid: 'makefile',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(^|[^\\\\])#(?:\\\\(?:\\r\\n|[\\s\\S])|[^\\\\\\r\\n])*/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'builtin-target': {\n\t\t\tpattern: /\\.[A-Z][^:#=\\s]+(?=\\s*:(?!=))/,\n\t\t\talias: 'builtin',\n\t\t},\n\n\t\t'target': {\n\t\t\tpattern: /^(?:[^:=\\s]|[ \\t]+(?![\\s:]))+(?=\\s*:(?!=))/m,\n\t\t\talias: 'symbol',\n\t\t\tinside: {\n\t\t\t\t'variable': /\\$+(?:(?!\\$)[^(){}:#=\\s]+|(?=[({]))/,\n\t\t\t},\n\t\t},\n\t\t'variable': /\\$+(?:(?!\\$)[^(){}:#=\\s]+|\\([@*%<^+?][DF]\\)|(?=[({]))/,\n\n\t\t// Directives\n\t\t'keyword':\n\t\t\t/-include\\b|\\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\\b/,\n\n\t\t'function': {\n\t\t\tpattern:\n\t\t\t\t/(\\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \\t])/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'operator': /(?:::|[?:+!])?=|[|@]/,\n\t\t'punctuation': /[:;(){}]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/markdown.js",
    "content": "import { getTextContent } from '../core/classes/token.js';\nimport { withoutTokenize } from '../util/language-util.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'markdown'>} */\nexport default {\n\tid: 'markdown',\n\tbase: markup,\n\talias: 'md',\n\tgrammar () {\n\t\t// Allow only one line break\n\t\tconst inner = /(?:\\\\.|[^\\\\\\n\\r]|(?:\\n|\\r\\n?)(?![\\r\\n]))/.source;\n\n\t\t/**\n\t\t * This function is intended for the creation of the bold or italic pattern.\n\t\t *\n\t\t * This also adds a lookbehind group to the given pattern to ensure that the pattern is not backslash-escaped.\n\t\t *\n\t\t * _Note:_ Keep in mind that this adds a capturing group.\n\t\t *\n\t\t * @param {string} pattern\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction createInline (pattern) {\n\t\t\tpattern = pattern.replace(/<inner>/g, () => inner);\n\t\t\treturn RegExp(/((?:^|[^\\\\])(?:\\\\{2})*)/.source + '(?:' + pattern + ')');\n\t\t}\n\n\t\tconst tableCell = /(?:\\\\.|``(?:[^`\\r\\n]|`(?!`))+``|`[^`\\r\\n]+`|[^\\\\|\\r\\n`])+/.source;\n\t\tconst tableRow = /\\|?__(?:\\|__)+\\|?(?:(?:\\n|\\r\\n?)|(?![\\s\\S]))/.source.replace(\n\t\t\t/__/g,\n\t\t\t() => tableCell\n\t\t);\n\t\tconst tableLine = /\\|?[ \\t]*:?-{3,}:?[ \\t]*(?:\\|[ \\t]*:?-{3,}:?[ \\t]*)+\\|?(?:\\n|\\r\\n?)/\n\t\t\t.source;\n\n\t\tconst markdown = {\n\t\t\t'front-matter-block': {\n\t\t\t\tpattern: /(^(?:\\s*[\\r\\n])?)---(?!.)[\\s\\S]*?[\\r\\n]---(?!.)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^---|---$/,\n\t\t\t\t\t'front-matter': {\n\t\t\t\t\t\tpattern: /\\S+(?:\\s+\\S+)*/,\n\t\t\t\t\t\talias: ['yaml', 'language-yaml'],\n\t\t\t\t\t\tinside: 'yaml',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'blockquote': {\n\t\t\t\t// > ...\n\t\t\t\tpattern: /^>(?:[\\t ]*>)*/m,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'table': {\n\t\t\t\tpattern: RegExp('^' + tableRow + tableLine + '(?:' + tableRow + ')*', 'm'),\n\t\t\t\tinside: {\n\t\t\t\t\t'table-data-rows': {\n\t\t\t\t\t\tpattern: RegExp('^(' + tableRow + tableLine + ')(?:' + tableRow + ')*$'),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'table-data': {\n\t\t\t\t\t\t\t\tpattern: RegExp(tableCell),\n\t\t\t\t\t\t\t\tinside: 'markdown',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'punctuation': /\\|/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'table-line': {\n\t\t\t\t\t\tpattern: RegExp('^(' + tableRow + ')' + tableLine + '$'),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /\\||:?-{3,}:?/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'table-header-row': {\n\t\t\t\t\t\tpattern: RegExp('^' + tableRow + '$'),\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'table-header': {\n\t\t\t\t\t\t\t\tpattern: RegExp(tableCell),\n\t\t\t\t\t\t\t\talias: 'important',\n\t\t\t\t\t\t\t\tinside: 'markdown',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'punctuation': /\\|/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'code': [\n\t\t\t\t{\n\t\t\t\t\t// Prefixed by 4 spaces or 1 tab and preceded by an empty line\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:^|\\n)[ \\t]*\\n|(?:^|\\r\\n?)[ \\t]*\\r\\n?)(?: {4}|\\t).+(?:(?:\\n|\\r\\n?)(?: {4}|\\t).+)*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// ```optional language\n\t\t\t\t\t// code block\n\t\t\t\t\t// ```\n\t\t\t\t\tpattern: /^```[\\s\\S]*?^```$/m,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: /** @type {Grammar} */ ({\n\t\t\t\t\t\t'code-block': {\n\t\t\t\t\t\t\tpattern: /^(```.*(?:\\n|\\r\\n?))[\\s\\S]+?(?=(?:\\n|\\r\\n?)^```$)/m,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'code-language': {\n\t\t\t\t\t\t\tpattern: /^(```).+/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /```/,\n\t\t\t\t\t\t/** @type {Grammar['$tokenize']} */\n\t\t\t\t\t\t$tokenize (code, grammar, Prism) {\n\t\t\t\t\t\t\tconst tokens = Prism.tokenize(code, withoutTokenize(grammar));\n\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * Add the correct `language-xxxx` class to this code block. Keep in mind that the `code-language` token\n\t\t\t\t\t\t\t * is optional. But the grammar is defined so that there is only one case we have to handle:\n\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t * token.content = [\n\t\t\t\t\t\t\t *     <span class=\"punctuation\">```</span>,\n\t\t\t\t\t\t\t *     <span class=\"code-language\">xxxx</span>,\n\t\t\t\t\t\t\t *     '\\n', // exactly one new lines (\\r or \\n or \\r\\n)\n\t\t\t\t\t\t\t *     <span class=\"code-block\">...</span>,\n\t\t\t\t\t\t\t *     '\\n', // exactly one new lines again\n\t\t\t\t\t\t\t *     <span class=\"punctuation\">```</span>\n\t\t\t\t\t\t\t * ];\n\t\t\t\t\t\t\t */\n\n\t\t\t\t\t\t\tconst codeLang = tokens[1];\n\t\t\t\t\t\t\tconst codeBlock = tokens[3];\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttypeof codeLang === 'object' &&\n\t\t\t\t\t\t\t\ttypeof codeBlock === 'object' &&\n\t\t\t\t\t\t\t\tcodeLang.type === 'code-language' &&\n\t\t\t\t\t\t\t\tcodeBlock.type === 'code-block'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// this might be a language that Prism does not support\n\n\t\t\t\t\t\t\t\t// do some replacements to support C++, C#, and F#\n\t\t\t\t\t\t\t\tconst lang = getTextContent(codeLang.content)\n\t\t\t\t\t\t\t\t\t.replace(/\\b#/g, 'sharp')\n\t\t\t\t\t\t\t\t\t.replace(/\\b\\+\\+/g, 'pp');\n\t\t\t\t\t\t\t\t// only use the first word\n\t\t\t\t\t\t\t\tconst langName = /[a-z][\\w-]*/i.exec(lang)?.[0].toLowerCase();\n\t\t\t\t\t\t\t\tif (langName) {\n\t\t\t\t\t\t\t\t\tcodeBlock.addAlias('language-' + langName);\n\n\t\t\t\t\t\t\t\t\tconst grammar =\n\t\t\t\t\t\t\t\t\t\tPrism.languageRegistry.getLanguage(lang)?.resolvedGrammar;\n\t\t\t\t\t\t\t\t\tif (grammar) {\n\t\t\t\t\t\t\t\t\t\tcodeBlock.content = Prism.tokenize(\n\t\t\t\t\t\t\t\t\t\t\tgetTextContent(codeBlock),\n\t\t\t\t\t\t\t\t\t\t\tgrammar\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tcodeBlock.addAlias('needs-highlighting');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn tokens;\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t],\n\t\t\t'title': [\n\t\t\t\t{\n\t\t\t\t\t// title 1\n\t\t\t\t\t// =======\n\n\t\t\t\t\t// title 2\n\t\t\t\t\t// -------\n\t\t\t\t\tpattern: /\\S.*(?:\\n|\\r\\n?)(?:==+|--+)(?=[ \\t]*$)/m,\n\t\t\t\t\talias: 'important',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\tpunctuation: /==+$|--+$/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// # title 1\n\t\t\t\t\t// ###### title 6\n\t\t\t\t\tpattern: /(^\\s*)#.+/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'important',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\tpunctuation: /^#+|#+$/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'hr': {\n\t\t\t\t// ***\n\t\t\t\t// ---\n\t\t\t\t// * * *\n\t\t\t\t// -----------\n\t\t\t\tpattern: /(^\\s*)([*-])(?:[\\t ]*\\2){2,}(?=\\s*$)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'list': {\n\t\t\t\t// * item\n\t\t\t\t// + item\n\t\t\t\t// - item\n\t\t\t\t// 1. item\n\t\t\t\tpattern: /(^\\s*)(?:[*+-]|\\d+\\.)(?=[\\t ].)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'url-reference': {\n\t\t\t\t// [id]: http://example.com \"Optional title\"\n\t\t\t\t// [id]: http://example.com 'Optional title'\n\t\t\t\t// [id]: http://example.com (Optional title)\n\t\t\t\t// [id]: <http://example.com> \"Optional title\"\n\t\t\t\tpattern:\n\t\t\t\t\t/!?\\[[^\\]]+\\]:[\\t ]+(?:\\S+|<(?:\\\\.|[^>\\\\])+>)(?:[\\t ]+(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\)))?/,\n\t\t\t\tinside: {\n\t\t\t\t\t'variable': {\n\t\t\t\t\t\tpattern: /^(!?\\[)[^\\]]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'string': /(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\))$/,\n\t\t\t\t\t'punctuation': /^[\\[\\]!:]|[<>]/,\n\t\t\t\t},\n\t\t\t\talias: 'url',\n\t\t\t},\n\t\t\t'bold': {\n\t\t\t\t// **strong**\n\t\t\t\t// __strong__\n\n\t\t\t\t// allow one nested instance of italic text using the same delimiter\n\t\t\t\tpattern: createInline(\n\t\t\t\t\t/\\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\\b|\\*\\*(?:(?!\\*)<inner>|\\*(?:(?!\\*)<inner>)+\\*)+\\*\\*/\n\t\t\t\t\t\t.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'content': {\n\t\t\t\t\t\tpattern: /(^..)[\\s\\S]+(?=..$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {}, // see below\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /\\*\\*|__/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'italic': {\n\t\t\t\t// *em*\n\t\t\t\t// _em_\n\n\t\t\t\t// allow one nested instance of bold text using the same delimiter\n\t\t\t\tpattern: createInline(\n\t\t\t\t\t/\\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\\b|\\*(?:(?!\\*)<inner>|\\*\\*(?:(?!\\*)<inner>)+\\*\\*)+\\*/\n\t\t\t\t\t\t.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'content': {\n\t\t\t\t\t\tpattern: /(^.)[\\s\\S]+(?=.$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {}, // see below\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /[*_]/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'strike': {\n\t\t\t\t// ~~strike through~~\n\t\t\t\t// ~strike~\n\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\tpattern: createInline(/(~~?)(?:(?!~)<inner>)+\\2/.source), // eslint-disable-line regexp/strict\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'content': {\n\t\t\t\t\t\tpattern: /(^~~?)[\\s\\S]+(?=\\1$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {}, // see below\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /~~?/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'code-snippet': {\n\t\t\t\t// `code`\n\t\t\t\t// ``code``\n\t\t\t\tpattern: /(^|[^\\\\`])(?:``[^`\\r\\n]+(?:`[^`\\r\\n]+)*``(?!`)|`[^`\\r\\n]+`(?!`))/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: ['code', 'keyword'],\n\t\t\t},\n\t\t\t'url': {\n\t\t\t\t// [example](http://example.com \"Optional title\")\n\t\t\t\t// [example][id]\n\t\t\t\t// [example] [id]\n\t\t\t\tpattern: createInline(\n\t\t\t\t\t/!?\\[(?:(?!\\])<inner>)+\\](?:\\([^\\s)]+(?:[\\t ]+\"(?:\\\\.|[^\"\\\\])*\")?\\)|[ \\t]?\\[(?:(?!\\])<inner>)+\\])/\n\t\t\t\t\t\t.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'operator': /^!/,\n\t\t\t\t\t'content': {\n\t\t\t\t\t\tpattern: /(^\\[)[^\\]]+(?=\\])/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {}, // see below\n\t\t\t\t\t},\n\t\t\t\t\t'variable': {\n\t\t\t\t\t\tpattern: /(^\\][ \\t]?\\[)[^\\]]+(?=\\]$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'url': {\n\t\t\t\t\t\tpattern: /(^\\]\\()[^\\s)]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'string': {\n\t\t\t\t\t\tpattern: /(^[ \\t]+)\"(?:\\\\.|[^\"\\\\])*\"(?=\\)$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\t['url', 'bold', 'italic', 'strike'].forEach(token => {\n\t\t\t['url', 'bold', 'italic', 'strike', 'code-snippet'].forEach(inside => {\n\t\t\t\tif (token === inside) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t/** @type {Grammar} */ (\n\t\t\t\t\t/** @type {GrammarToken}*/ (\n\t\t\t\t\t\t/** @type {Grammar} */ (\n\t\t\t\t\t\t\t/** @type {GrammarToken} */ (markdown[token]).inside\n\t\t\t\t\t\t).content\n\t\t\t\t\t).inside\n\t\t\t\t)[inside] = markdown[inside];\n\t\t\t});\n\t\t});\n\n\t\treturn {\n\t\t\t$insertBefore: {\n\t\t\t\t'prolog': markdown,\n\t\t\t},\n\t\t};\n\t},\n\teffect (Prism) {\n\t\treturn Prism.hooks.add('wrap', env => {\n\t\t\tif (\n\t\t\t\t!Prism.plugins.autoloader ||\n\t\t\t\tenv.type !== 'code-block' ||\n\t\t\t\t!env.classes.includes('needs-highlighting')\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet codeLang = '';\n\t\t\tfor (let i = 0, l = env.classes.length; i < l; i++) {\n\t\t\t\tconst cls = env.classes[i];\n\t\t\t\tconst match = /language-(.+)/.exec(cls);\n\t\t\t\tif (match) {\n\t\t\t\t\tcodeLang = match[1];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (codeLang && codeLang !== 'none' && typeof document !== 'undefined') {\n\t\t\t\tconst id = `md-${new Date().valueOf()}-${Math.floor(Math.random() * 1e16)}`;\n\t\t\t\tenv.attributes['id'] = id;\n\n\t\t\t\tconst autoloader = Prism.plugins.autoloader;\n\t\t\t\tautoloader.loadLanguages(codeLang).then(\n\t\t\t\t\t() => {\n\t\t\t\t\t\tconst element = document.getElementById(id);\n\t\t\t\t\t\tif (element) {\n\t\t\t\t\t\t\telement.innerHTML = Prism.highlight(\n\t\t\t\t\t\t\t\telement.textContent || '',\n\t\t\t\t\t\t\t\tcodeLang\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\terror => console.error(error)\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/markup.js",
    "content": "import xml from './xml.js';\n\n/**\n * Adds an inlined language to markup.\n *\n * An example of an inlined language is CSS with `<style>` tags.\n *\n * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as\n * case insensitive.\n * @param {string} lang The language key.\n * @returns {GrammarToken}\n * @example\n * inlineEmbedded('style', 'css');\n */\nfunction inlineEmbedded (tagName, lang) {\n\treturn {\n\t\tpattern: RegExp(\n\t\t\t/(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[\\s\\S])*?(?=<\\/__>)/.source.replace(\n\t\t\t\t/__/g,\n\t\t\t\t() => tagName\n\t\t\t),\n\t\t\t'i'\n\t\t),\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'included-cdata': {\n\t\t\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\t\t\tinside: {\n\t\t\t\t\t['language-' + lang]: {\n\t\t\t\t\t\tpattern: /(^<!\\[CDATA\\[)[\\s\\S]+?(?=\\]\\]>$)/i,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: lang,\n\t\t\t\t\t},\n\t\t\t\t\t'cdata': /^<!\\[CDATA\\[|\\]\\]>$/i,\n\t\t\t\t},\n\t\t\t},\n\t\t\t['language-' + lang]: {\n\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\tinside: lang,\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Returns a pattern to highlight languages embedded in HTML attributes.\n *\n * An example of an inlined language is CSS with `style` attributes.\n *\n * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as\n * case insensitive.\n * @param {string} lang The language key.\n * @returns {GrammarToken}\n * @example\n * attributeEmbedded('style', 'css');\n */\nfunction attributeEmbedded (attrName, lang) {\n\treturn {\n\t\tpattern: RegExp(\n\t\t\t/(^|[\"'\\s])/.source +\n\t\t\t\t'(?:' +\n\t\t\t\tattrName +\n\t\t\t\t')' +\n\t\t\t\t/\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))/.source,\n\t\t\t'i'\n\t\t),\n\t\tlookbehind: true,\n\t\tinside: {\n\t\t\t'attr-name': /^[^\\s=]+/,\n\t\t\t'attr-value': {\n\t\t\t\tpattern: /=[\\s\\S]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'value': {\n\t\t\t\t\t\tpattern: /(^=\\s*([\"']|(?![\"'])))\\S[\\s\\S]*(?=\\2$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: [lang, 'language-' + lang],\n\t\t\t\t\t\tinside: lang,\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\talias: 'attr-equals',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t/\"|'/,\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t};\n}\n\n/** @type {import('../types.d.ts').LanguageProto<'markup'>} */\nexport default {\n\tid: 'markup',\n\tbase: xml,\n\talias: ['html', 'svg', 'mathml'],\n\tgrammar () {\n\t\treturn {\n\t\t\t$insertBefore: {\n\t\t\t\t'cdata': {\n\t\t\t\t\t'style': inlineEmbedded('style', 'css'),\n\t\t\t\t\t'script': inlineEmbedded('script', 'javascript'),\n\t\t\t\t},\n\t\t\t\t'tag/attr-value': {\n\t\t\t\t\t'special-attr': [\n\t\t\t\t\t\tattributeEmbedded('style', 'css'),\n\t\t\t\t\t\t// add attribute support for all DOM events.\n\t\t\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events\n\t\t\t\t\t\tattributeEmbedded(\n\t\t\t\t\t\t\t/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/\n\t\t\t\t\t\t\t\t.source,\n\t\t\t\t\t\t\t'javascript'\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/mata.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'mata'>} */\nexport default {\n\tid: 'mata',\n\tgrammar () {\n\t\t// https://www.stata.com/manuals/m.pdf\n\n\t\tconst orgType = /\\b(?:(?:col|row)?vector|matrix|scalar)\\b/.source;\n\t\tconst type =\n\t\t\t/\\bvoid\\b|<org>|\\b(?:complex|numeric|pointer(?:\\s*\\([^()]*\\))?|real|string|(?:class|struct)\\s+\\w+|transmorphic)(?:\\s*<org>)?/.source.replace(\n\t\t\t\t/<org>/g,\n\t\t\t\torgType\n\t\t\t);\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\/.*|\\/\\*(?:[^*/]|\\*(?!\\/)|\\/(?!\\*)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*\\*\\//,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"\\r\\n]*\"|[‘`']\".*?\"[’`']/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'class-name': {\n\t\t\t\tpattern: /(\\b(?:class|extends|struct)\\s+)\\w+(?=\\s*(?:\\{|\\bextends\\b))/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'type': {\n\t\t\t\tpattern: RegExp(type),\n\t\t\t\talias: 'class-name',\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /[()]/,\n\t\t\t\t\t'keyword': /\\b(?:class|function|struct|void)\\b/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\\b/,\n\t\t\t'constant': /\\bNULL\\b/,\n\n\t\t\t'number': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\w.])(?:\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?|\\d[a-f0-9]*(?:\\.[a-f0-9]+)?x[+-]?\\d+)i?(?![\\w.])/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'missing': {\n\t\t\t\tpattern: /(^|[^\\w.])(?:\\.[a-z]?)(?![\\w.])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'symbol',\n\t\t\t},\n\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\n\t\t\t'operator': /\\.\\.|\\+\\+|--|&&|\\|\\||:?(?:[!=<>]=|[+\\-*/^<>&|:])|[!?=\\\\#’`']/,\n\t\t\t'punctuation': /[()[\\]{},;.]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/matlab.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'matlab'>} */\nexport default {\n\tid: 'matlab',\n\tgrammar: {\n\t\t'comment': [/%\\{[\\s\\S]*?\\}%/, /%.+/],\n\t\t'string': {\n\t\t\tpattern: /\\B'(?:''|[^'\\r\\n])*'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t// FIXME We could handle imaginary numbers as a whole\n\t\t'number': /(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?(?:[ij])?|\\b[ij]\\b/,\n\t\t'keyword':\n\t\t\t/\\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\\b/,\n\t\t'function': /\\b(?!\\d)\\w+(?=\\s*\\()/,\n\t\t'operator': /\\.?[*^\\/\\\\']|[+\\-:@]|[<>=~]=?|&&?|\\|\\|?/,\n\t\t'punctuation': /\\.{3}|[.,;\\[\\](){}!]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/maxscript.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'maxscript'>} */\nexport default {\n\tid: 'maxscript',\n\tgrammar () {\n\t\tconst keywords =\n\t\t\t/\\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\\b/i;\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\*[\\s\\S]*?(?:\\*\\/|$)|--.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /(^|[^\"\\\\@])(?:\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"|@\"[^\"]*\")/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'path': {\n\t\t\t\tpattern: /\\$(?:[\\w/\\\\.*?]|'[^']*')*/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'string',\n\t\t\t},\n\n\t\t\t'function-call': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t'((?:' +\n\t\t\t\t\t\t// start of line\n\t\t\t\t\t\t(/^/.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// operators and other language constructs\n\t\t\t\t\t\t\t/[;=<>+\\-*/^({\\[]/.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// keywords as part of statements\n\t\t\t\t\t\t\t/\\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\\b/\n\t\t\t\t\t\t\t\t.source) +\n\t\t\t\t\t\t')[ \\t]*)' +\n\t\t\t\t\t\t'(?!' +\n\t\t\t\t\t\tkeywords.source +\n\t\t\t\t\t\t')' +\n\t\t\t\t\t\t/[a-z_]\\w*\\b/.source +\n\t\t\t\t\t\t'(?=[ \\t]*(?:' +\n\t\t\t\t\t\t// variable\n\t\t\t\t\t\t('(?!' +\n\t\t\t\t\t\t\tkeywords.source +\n\t\t\t\t\t\t\t')' +\n\t\t\t\t\t\t\t/[a-z_]/.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// number\n\t\t\t\t\t\t\t/\\d|-\\.?\\d/.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// other expressions or literals\n\t\t\t\t\t\t\t/[({'\"$@#?]/.source) +\n\t\t\t\t\t\t'))',\n\t\t\t\t\t'im'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'function',\n\t\t\t},\n\n\t\t\t'function-definition': {\n\t\t\t\tpattern: /(\\b(?:fn|function)\\s+)\\w+\\b/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'function',\n\t\t\t},\n\n\t\t\t'argument': {\n\t\t\t\tpattern: /\\b[a-z_]\\w*(?=:)/i,\n\t\t\t\talias: 'attr-name',\n\t\t\t},\n\n\t\t\t'keyword': keywords,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\n\t\t\t'time': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\w.])(?:(?:(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eEdD][+-]\\d+|[LP])?[msft])+|\\d+:\\d+(?:\\.\\d*)?)(?![\\w.:])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t\t'number': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^\\w.])(?:(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eEdD][+-]\\d+|[LP])?|0x[a-fA-F0-9]+)(?![\\w.:])/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t/\\b(?:e|pi)\\b/,\n\t\t\t],\n\n\t\t\t'constant': /\\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\\b/,\n\t\t\t'color': {\n\t\t\t\tpattern: /\\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\\b/i,\n\t\t\t\talias: 'constant',\n\t\t\t},\n\n\t\t\t'operator': /[-+*/<>=!]=?|[&^?]|#(?!\\()/,\n\t\t\t'punctuation': /[()\\[\\]{}.:,;]|#(?=\\()|\\\\$/m,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/mel.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'mel'>} */\nexport default {\n\tid: 'mel',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'code': {\n\t\t\tpattern: /`(?:\\\\.|[^\\\\`])*`/,\n\t\t\tgreedy: true,\n\t\t\talias: 'italic',\n\t\t\tinside: {\n\t\t\t\t'delimiter': {\n\t\t\t\t\tpattern: /^`|`$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t\t'statement': {\n\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\tinside: 'mel',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:\\\\.|[^\\\\\"\\r\\n])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'variable': /\\$\\w+/,\n\t\t'number': /\\b0x[\\da-fA-F]+\\b|\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+/,\n\t\t'flag': {\n\t\t\tpattern: /-[^\\d\\W]\\w*/,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\\b/,\n\t\t'function': {\n\t\t\tpattern:\n\t\t\t\t/((?:^|[{;])[ \\t]*)[a-z_]\\w*\\b(?!\\s*(?:\\.(?!\\.)|[[{=]))|\\b[a-z_]\\w*(?=[ \\t]*\\()/im,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'tensor-punctuation': {\n\t\t\tpattern: /<<|>>/,\n\t\t\talias: 'punctuation',\n\t\t},\n\t\t'operator': /\\+[+=]?|-[-=]?|&&|\\|\\||[<>]=?|[*\\/!=]=?|[%^]/,\n\t\t'punctuation': /[.,:;?\\[\\](){}]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/mermaid.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'mermaid'>} */\nexport default {\n\tid: 'mermaid',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /%%.*/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'style': {\n\t\t\tpattern: /^([ \\t]*(?:classDef|linkStyle|style)[ \\t]+[\\w$-]+[ \\t]+)\\w.*[^\\s;]/m,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'property': /\\b\\w[\\w-]*(?=[ \\t]*:)/,\n\t\t\t\t'operator': /:/,\n\t\t\t\t'punctuation': /,/,\n\t\t\t},\n\t\t},\n\n\t\t'inter-arrow-label': {\n\t\t\tpattern:\n\t\t\t\t/([^<>ox.=-])(?:-[-.]|==)(?![<>ox.=-])[ \\t]*(?:\"[^\"\\r\\n]*\"|[^\\s\".=-](?:[^\\r\\n.=-]*[^\\s.=-])?)[ \\t]*(?:\\.+->?|--+[->]|==+[=>])(?![<>ox.=-])/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'arrow': {\n\t\t\t\t\tpattern: /(?:\\.+->?|--+[->]|==+[=>])$/,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t\t'label': {\n\t\t\t\t\tpattern: /^([\\s\\S]{2}[ \\t]*)\\S(?:[\\s\\S]*\\S)?/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'property',\n\t\t\t\t},\n\t\t\t\t'arrow-head': {\n\t\t\t\t\tpattern: /^\\S+/,\n\t\t\t\t\talias: ['arrow', 'operator'],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\n\t\t'arrow': [\n\t\t\t// This might look complex but it really isn't.\n\t\t\t// There are many possible arrows (see tests) and it's impossible to fit all of them into one pattern. The\n\t\t\t// problem is that we only have one lookbehind per pattern. However, we cannot disallow too many arrow\n\t\t\t// characters in the one lookbehind because that would create too many false negatives. So we have to split the\n\t\t\t// arrows into different patterns.\n\t\t\t{\n\t\t\t\t// ER diagram\n\t\t\t\tpattern: /(^|[^{}|o.-])[|}][|o](?:--|\\.\\.)[|o][|{](?![{}|o.-])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\t\t\t{\n\t\t\t\t// flow chart\n\t\t\t\t// (?:==+|--+|-\\.*-)\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^<>ox.=-])(?:[<ox](?:==+|--+|-\\.*-)[>ox]?|(?:==+|--+|-\\.*-)[>ox]|===+|---+|-\\.+-)(?![<>ox.=-])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\t\t\t{\n\t\t\t\t// sequence diagram\n\t\t\t\tpattern: /(^|[^<>()x-])(?:--?(?:>>|[x>)])(?![<>()x])|(?:<<|[x<(])--?(?!-))/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\t\t\t{\n\t\t\t\t// class diagram\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^<>|*o.-])(?:[*o]--|--[*o]|<\\|?(?:--|\\.\\.)|(?:--|\\.\\.)\\|?>|--|\\.\\.)(?![<>|*o.-])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\t\t],\n\n\t\t'label': {\n\t\t\tpattern: /(^|[^|<])\\|(?:[^\\r\\n\"|]|\"[^\"\\r\\n]*\")+\\|/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\talias: 'property',\n\t\t},\n\n\t\t'text': {\n\t\t\tpattern: /(?:[(\\[{]+|\\b>)(?:[^\\r\\n\"()\\[\\]{}]|\"[^\"\\r\\n]*\")+(?:[)\\]}]+|>)/,\n\t\t\talias: 'string',\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"[^\"\\r\\n]*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'annotation': {\n\t\t\tpattern:\n\t\t\t\t/<<(?:abstract|choice|enumeration|fork|interface|join|service)>>|\\[\\[(?:choice|fork|join)\\]\\]/i,\n\t\t\talias: 'important',\n\t\t},\n\n\t\t'keyword': [\n\t\t\t// This language has both case-sensitive and case-insensitive keywords\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[ \\t]*)(?:action|callback|class|classDef|classDiagram|click|direction|erDiagram|flowchart|gantt|gitGraph|graph|journey|link|linkStyle|pie|requirementDiagram|sequenceDiagram|stateDiagram|stateDiagram-v2|style|subgraph)(?![\\w$-])/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[ \\t]*)(?:activate|alt|and|as|autonumber|deactivate|else|end(?:[ \\t]+note)?|loop|opt|par|participant|rect|state|note[ \\t]+(?:over|(?:left|right)[ \\t]+of))(?![\\w$-])/im,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\n\t\t'entity': /#[a-z0-9]+;/,\n\n\t\t'operator': {\n\t\t\tpattern: /(\\w[ \\t]*)&(?=[ \\t]*\\w)|:::|:/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'punctuation': /[(){};]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/metafont.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'metafont'>} */\nexport default {\n\tid: 'metafont',\n\tgrammar: {\n\t\t// Syntax of METAFONT with the added (public) elements of PlainMETAFONT. Except for internal quantities they are expected to be rarely redefined. Freely inspired by the syntax of Christophe Grandsire for the Crimson Editor.\n\t\t'comment': {\n\t\t\tpattern: /%.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"[^\\r\\n\"]*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'number': /\\d*\\.?\\d+/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'punctuation': [\n\t\t\t/[,;()]/,\n\t\t\t{\n\t\t\t\tpattern: /(^|[^{}])(?:\\{|\\})(?![{}])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^[])\\[(?!\\[)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\]])\\](?!\\])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'constant': [\n\t\t\t{\n\t\t\t\tpattern: /(^|[^!?])\\?\\?\\?(?![!?])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^/*\\\\])(?:\\\\|\\\\\\\\)(?![/*\\\\])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t/\\b(?:_|blankpicture|bp|cc|cm|dd|ditto|down|eps|epsilon|fullcircle|halfcircle|identity|in|infinity|left|mm|nullpen|nullpicture|origin|pc|penrazor|penspeck|pensquare|penstroke|proof|pt|quartercircle|relax|right|smoke|unitpixel|unitsquare|up)\\b/,\n\t\t],\n\t\t'quantity': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:autorounding|blacker|boundarychar|charcode|chardp|chardx|chardy|charext|charht|charic|charwd|currentwindow|day|designsize|displaying|fillin|fontmaking|granularity|hppp|join_radius|month|o_correction|pausing|pen_(?:bot|lft|rt|top)|pixels_per_inch|proofing|showstopping|smoothing|time|tolerance|tracingcapsules|tracingchoices|tracingcommands|tracingedges|tracingequations|tracingmacros|tracingonline|tracingoutput|tracingpens|tracingrestores|tracingspecs|tracingstats|tracingtitles|turningcheck|vppp|warningcheck|xoffset|year|yoffset)\\b/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'command': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:addto|batchmode|charlist|cull|display|errhelp|errmessage|errorstopmode|everyjob|extensible|fontdimen|headerbyte|inner|interim|let|ligtable|message|newinternal|nonstopmode|numspecial|openwindow|outer|randomseed|save|scrollmode|shipout|show|showdependencies|showstats|showtoken|showvariable|special)\\b/,\n\t\t\talias: 'builtin',\n\t\t},\n\t\t'operator': [\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^>=<:|])(?:<|<=|=|=:|\\|=:|\\|=:>|=:\\|>|=:\\||\\|=:\\||\\|=:\\|>|\\|=:\\|>>|>|>=|:|:=|<>|::|\\|\\|:)(?![>=<:|])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^+-])(?:\\+|\\+\\+|-{1,3}|\\+-\\+)(?![+-])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^/*\\\\])(?:\\*|\\*\\*|\\/)(?![/*\\\\])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^.])(?:\\.{2,3})(?!\\.)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^@#&$])&(?![@#&$])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t/\\b(?:and|not|or)\\b/,\n\t\t],\n\t\t'macro': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:abs|beginchar|bot|byte|capsule_def|ceiling|change_width|clear_pen_memory|clearit|clearpen|clearxy|counterclockwise|cullit|cutdraw|cutoff|decr|define_blacker_pixels|define_corrected_pixels|define_good_x_pixels|define_good_y_pixels|define_horizontal_corrected_pixels|define_pixels|define_whole_blacker_pixels|define_whole_pixels|define_whole_vertical_blacker_pixels|define_whole_vertical_pixels|dir|direction|directionpoint|div|dotprod|downto|draw|drawdot|endchar|erase|fill|filldraw|fix_units|flex|font_coding_scheme|font_extra_space|font_identifier|font_normal_shrink|font_normal_space|font_normal_stretch|font_quad|font_size|font_slant|font_x_height|gfcorners|gobble|gobbled|good\\.(?:bot|lft|rt|top|x|y)|grayfont|hide|hround|imagerules|incr|interact|interpath|intersectionpoint|inverse|italcorr|killtext|labelfont|labels|lft|loggingall|lowres_fix|makegrid|makelabel(?:\\.(?:bot|lft|rt|top)(?:\\.nodot)?)?|max|min|mod|mode_def|mode_setup|nodisplays|notransforms|numtok|openit|penlabels|penpos|pickup|proofoffset|proofrule|proofrulethickness|range|reflectedabout|rotatedabout|rotatedaround|round|rt|savepen|screenchars|screenrule|screenstrokes|shipit|showit|slantfont|softjoin|solve|stop|superellipse|tensepath|thru|titlefont|top|tracingall|tracingnone|undraw|undrawdot|unfill|unfilldraw|upto|vround)\\b/,\n\t\t\talias: 'function',\n\t\t},\n\t\t'builtin':\n\t\t\t/\\b(?:ASCII|angle|char|cosd|decimal|directiontime|floor|hex|intersectiontimes|jobname|known|length|makepath|makepen|mexp|mlog|normaldeviate|oct|odd|pencircle|penoffset|point|postcontrol|precontrol|reverse|rotated|sind|sqrt|str|subpath|substring|totalweight|turningnumber|uniformdeviate|unknown|xpart|xxpart|xypart|ypart|yxpart|yypart)\\b/,\n\t\t'keyword':\n\t\t\t/\\b(?:also|at|atleast|begingroup|charexists|contour|controls|curl|cycle|def|delimiters|doublepath|dropping|dump|else|elseif|end|enddef|endfor|endgroup|endinput|exitif|exitunless|expandafter|fi|for|forever|forsuffixes|from|if|input|inwindow|keeping|kern|of|primarydef|quote|readstring|scaled|scantokens|secondarydef|shifted|skipto|slanted|step|tension|tertiarydef|to|transformed|until|vardef|withpen|withweight|xscaled|yscaled|zscaled)\\b/,\n\t\t'type': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:boolean|expr|numeric|pair|path|pen|picture|primary|secondary|string|suffix|tertiary|text|transform)\\b/,\n\t\t\talias: 'property',\n\t\t},\n\t\t'variable': {\n\t\t\tpattern:\n\t\t\t\t/(^|[^@#&$])(?:@#|#@|#|@)(?![@#&$])|\\b(?:aspect_ratio|currentpen|currentpicture|currenttransform|d|extra_beginchar|extra_endchar|extra_setup|h|localfont|mag|mode|screen_cols|screen_rows|w|whatever|x|y|z)\\b/,\n\t\t\tlookbehind: true,\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/mizar.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'mizar'>} */\nexport default {\n\tid: 'mizar',\n\tgrammar: {\n\t\t'comment': /::.+/,\n\t\t'keyword':\n\t\t\t/@proof\\b|\\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\\b/,\n\t\t'parameter': {\n\t\t\tpattern: /\\$(?:10|\\d)/,\n\t\t\talias: 'variable',\n\t\t},\n\t\t'variable': /\\b\\w+(?=:)/,\n\t\t'number': /(?:\\b|-)\\d+\\b/,\n\t\t'operator': /\\.\\.\\.|->|&|\\.?=/,\n\t\t'punctuation': /\\(#|#\\)|[,:;\\[\\](){}]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/mongodb.js",
    "content": "import javascript from './javascript.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'mongodb'>} */\nexport default {\n\tid: 'mongodb',\n\tbase: javascript,\n\tgrammar () {\n\t\tlet operators = [\n\t\t\t// query and projection\n\t\t\t'$eq',\n\t\t\t'$gt',\n\t\t\t'$gte',\n\t\t\t'$in',\n\t\t\t'$lt',\n\t\t\t'$lte',\n\t\t\t'$ne',\n\t\t\t'$nin',\n\t\t\t'$and',\n\t\t\t'$not',\n\t\t\t'$nor',\n\t\t\t'$or',\n\t\t\t'$exists',\n\t\t\t'$type',\n\t\t\t'$expr',\n\t\t\t'$jsonSchema',\n\t\t\t'$mod',\n\t\t\t'$regex',\n\t\t\t'$text',\n\t\t\t'$where',\n\t\t\t'$geoIntersects',\n\t\t\t'$geoWithin',\n\t\t\t'$near',\n\t\t\t'$nearSphere',\n\t\t\t'$all',\n\t\t\t'$elemMatch',\n\t\t\t'$size',\n\t\t\t'$bitsAllClear',\n\t\t\t'$bitsAllSet',\n\t\t\t'$bitsAnyClear',\n\t\t\t'$bitsAnySet',\n\t\t\t'$comment',\n\t\t\t'$elemMatch',\n\t\t\t'$meta',\n\t\t\t'$slice',\n\n\t\t\t// update\n\t\t\t'$currentDate',\n\t\t\t'$inc',\n\t\t\t'$min',\n\t\t\t'$max',\n\t\t\t'$mul',\n\t\t\t'$rename',\n\t\t\t'$set',\n\t\t\t'$setOnInsert',\n\t\t\t'$unset',\n\t\t\t'$addToSet',\n\t\t\t'$pop',\n\t\t\t'$pull',\n\t\t\t'$push',\n\t\t\t'$pullAll',\n\t\t\t'$each',\n\t\t\t'$position',\n\t\t\t'$slice',\n\t\t\t'$sort',\n\t\t\t'$bit',\n\n\t\t\t// aggregation pipeline stages\n\t\t\t'$addFields',\n\t\t\t'$bucket',\n\t\t\t'$bucketAuto',\n\t\t\t'$collStats',\n\t\t\t'$count',\n\t\t\t'$currentOp',\n\t\t\t'$facet',\n\t\t\t'$geoNear',\n\t\t\t'$graphLookup',\n\t\t\t'$group',\n\t\t\t'$indexStats',\n\t\t\t'$limit',\n\t\t\t'$listLocalSessions',\n\t\t\t'$listSessions',\n\t\t\t'$lookup',\n\t\t\t'$match',\n\t\t\t'$merge',\n\t\t\t'$out',\n\t\t\t'$planCacheStats',\n\t\t\t'$project',\n\t\t\t'$redact',\n\t\t\t'$replaceRoot',\n\t\t\t'$replaceWith',\n\t\t\t'$sample',\n\t\t\t'$set',\n\t\t\t'$skip',\n\t\t\t'$sort',\n\t\t\t'$sortByCount',\n\t\t\t'$unionWith',\n\t\t\t'$unset',\n\t\t\t'$unwind',\n\t\t\t'$setWindowFields',\n\n\t\t\t// aggregation pipeline operators\n\t\t\t'$abs',\n\t\t\t'$accumulator',\n\t\t\t'$acos',\n\t\t\t'$acosh',\n\t\t\t'$add',\n\t\t\t'$addToSet',\n\t\t\t'$allElementsTrue',\n\t\t\t'$and',\n\t\t\t'$anyElementTrue',\n\t\t\t'$arrayElemAt',\n\t\t\t'$arrayToObject',\n\t\t\t'$asin',\n\t\t\t'$asinh',\n\t\t\t'$atan',\n\t\t\t'$atan2',\n\t\t\t'$atanh',\n\t\t\t'$avg',\n\t\t\t'$binarySize',\n\t\t\t'$bsonSize',\n\t\t\t'$ceil',\n\t\t\t'$cmp',\n\t\t\t'$concat',\n\t\t\t'$concatArrays',\n\t\t\t'$cond',\n\t\t\t'$convert',\n\t\t\t'$cos',\n\t\t\t'$dateFromParts',\n\t\t\t'$dateToParts',\n\t\t\t'$dateFromString',\n\t\t\t'$dateToString',\n\t\t\t'$dayOfMonth',\n\t\t\t'$dayOfWeek',\n\t\t\t'$dayOfYear',\n\t\t\t'$degreesToRadians',\n\t\t\t'$divide',\n\t\t\t'$eq',\n\t\t\t'$exp',\n\t\t\t'$filter',\n\t\t\t'$first',\n\t\t\t'$floor',\n\t\t\t'$function',\n\t\t\t'$gt',\n\t\t\t'$gte',\n\t\t\t'$hour',\n\t\t\t'$ifNull',\n\t\t\t'$in',\n\t\t\t'$indexOfArray',\n\t\t\t'$indexOfBytes',\n\t\t\t'$indexOfCP',\n\t\t\t'$isArray',\n\t\t\t'$isNumber',\n\t\t\t'$isoDayOfWeek',\n\t\t\t'$isoWeek',\n\t\t\t'$isoWeekYear',\n\t\t\t'$last',\n\t\t\t'$last',\n\t\t\t'$let',\n\t\t\t'$literal',\n\t\t\t'$ln',\n\t\t\t'$log',\n\t\t\t'$log10',\n\t\t\t'$lt',\n\t\t\t'$lte',\n\t\t\t'$ltrim',\n\t\t\t'$map',\n\t\t\t'$max',\n\t\t\t'$mergeObjects',\n\t\t\t'$meta',\n\t\t\t'$min',\n\t\t\t'$millisecond',\n\t\t\t'$minute',\n\t\t\t'$mod',\n\t\t\t'$month',\n\t\t\t'$multiply',\n\t\t\t'$ne',\n\t\t\t'$not',\n\t\t\t'$objectToArray',\n\t\t\t'$or',\n\t\t\t'$pow',\n\t\t\t'$push',\n\t\t\t'$radiansToDegrees',\n\t\t\t'$range',\n\t\t\t'$reduce',\n\t\t\t'$regexFind',\n\t\t\t'$regexFindAll',\n\t\t\t'$regexMatch',\n\t\t\t'$replaceOne',\n\t\t\t'$replaceAll',\n\t\t\t'$reverseArray',\n\t\t\t'$round',\n\t\t\t'$rtrim',\n\t\t\t'$second',\n\t\t\t'$setDifference',\n\t\t\t'$setEquals',\n\t\t\t'$setIntersection',\n\t\t\t'$setIsSubset',\n\t\t\t'$setUnion',\n\t\t\t'$size',\n\t\t\t'$sin',\n\t\t\t'$slice',\n\t\t\t'$split',\n\t\t\t'$sqrt',\n\t\t\t'$stdDevPop',\n\t\t\t'$stdDevSamp',\n\t\t\t'$strcasecmp',\n\t\t\t'$strLenBytes',\n\t\t\t'$strLenCP',\n\t\t\t'$substr',\n\t\t\t'$substrBytes',\n\t\t\t'$substrCP',\n\t\t\t'$subtract',\n\t\t\t'$sum',\n\t\t\t'$switch',\n\t\t\t'$tan',\n\t\t\t'$toBool',\n\t\t\t'$toDate',\n\t\t\t'$toDecimal',\n\t\t\t'$toDouble',\n\t\t\t'$toInt',\n\t\t\t'$toLong',\n\t\t\t'$toObjectId',\n\t\t\t'$toString',\n\t\t\t'$toLower',\n\t\t\t'$toUpper',\n\t\t\t'$trim',\n\t\t\t'$trunc',\n\t\t\t'$type',\n\t\t\t'$week',\n\t\t\t'$year',\n\t\t\t'$zip',\n\t\t\t'$count',\n\t\t\t'$dateAdd',\n\t\t\t'$dateDiff',\n\t\t\t'$dateSubtract',\n\t\t\t'$dateTrunc',\n\t\t\t'$getField',\n\t\t\t'$rand',\n\t\t\t'$sampleRate',\n\t\t\t'$setField',\n\t\t\t'$unsetField',\n\n\t\t\t// aggregation pipeline query modifiers\n\t\t\t'$comment',\n\t\t\t'$explain',\n\t\t\t'$hint',\n\t\t\t'$max',\n\t\t\t'$maxTimeMS',\n\t\t\t'$min',\n\t\t\t'$orderby',\n\t\t\t'$query',\n\t\t\t'$returnKey',\n\t\t\t'$showDiskLoc',\n\t\t\t'$natural',\n\t\t];\n\n\t\tconst builtinFunctions = [\n\t\t\t'ObjectId',\n\t\t\t'Code',\n\t\t\t'BinData',\n\t\t\t'DBRef',\n\t\t\t'Timestamp',\n\t\t\t'NumberLong',\n\t\t\t'NumberDecimal',\n\t\t\t'MaxKey',\n\t\t\t'MinKey',\n\t\t\t'RegExp',\n\t\t\t'ISODate',\n\t\t\t'UUID',\n\t\t];\n\n\t\toperators = operators.map(operator => {\n\t\t\treturn operator.replace('$', '\\\\$');\n\t\t});\n\n\t\tconst operatorsSource = '(?:' + operators.join('|') + ')\\\\b';\n\n\t\treturn {\n\t\t\t$insert: {\n\t\t\t\t'property': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(?:([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)(?=\\s*:)/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'keyword': RegExp('^([\\'\"])?' + operatorsSource + '(?:\\\\1)?$'),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'builtin': {\n\t\t\t\t\t$before: 'constant',\n\t\t\t\t\tpattern: RegExp('\\\\b(?:' + builtinFunctions.join('|') + ')\\\\b'),\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t},\n\t\t\t$merge: {\n\t\t\t\t'string': {\n\t\t\t\t\tinside: {\n\t\t\t\t\t\turl: {\n\t\t\t\t\t\t\t// url pattern\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/https?:\\/\\/[-\\w@:%.+~#=]{1,256}\\.[a-z0-9()]{1,6}\\b[-\\w()@:%+.~#?&/=]*/i,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tentity: {\n\t\t\t\t\t\t\t// ipv4\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/\\b(?:(?:[01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d\\d?|2[0-4]\\d|25[0-5])\\b/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/monkey.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'monkey'>} */\nexport default {\n\tid: 'monkey',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /^#Rem\\s[\\s\\S]*?^#End|'.+/im,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"[^\"\\r\\n]*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'preprocessor': {\n\t\t\tpattern: /(^[ \\t]*)#.+/m,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\talias: 'property',\n\t\t},\n\n\t\t'function': /\\b\\w+(?=\\()/,\n\t\t'type-char': {\n\t\t\tpattern: /\\b[?%#$]/,\n\t\t\talias: 'class-name',\n\t\t},\n\t\t'number': {\n\t\t\tpattern: /((?:\\.\\.)?)(?:(?:\\b|\\B-\\.?|\\B\\.)\\d+(?:(?!\\.\\.)\\.\\d*)?|\\$[\\da-f]+)/i,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\\b/i,\n\t\t'operator': /\\.\\.|<[=>]?|>=?|:?=|(?:[+\\-*\\/&~|]|\\b(?:Mod|Shl|Shr)\\b)=?|\\b(?:And|Not|Or)\\b/i,\n\t\t'punctuation': /[.,:;()\\[\\]]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/moonscript.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'moonscript'>} */\nexport default {\n\tid: 'moonscript',\n\talias: 'moon',\n\tgrammar: {\n\t\t'comment': /--.*/,\n\t\t'string': [\n\t\t\t{\n\t\t\t\tpattern: /'[^']*'|\\[(=*)\\[[\\s\\S]*?\\]\\1\\]/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /\"[^\"]*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\tpattern: /#\\{[^{}]*\\}/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'moonscript': {\n\t\t\t\t\t\t\t\tpattern: /(^#\\{)[\\s\\S]+(?=\\})/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\tinside: 'moonscript',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\t\tpattern: /#\\{|\\}/,\n\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\t'class-name': [\n\t\t\t{\n\t\t\t\tpattern: /(\\b(?:class|extends)[ \\t]+)\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t// class-like names start with a capital letter\n\t\t\t/\\b[A-Z]\\w*/,\n\t\t],\n\t\t'keyword':\n\t\t\t/\\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\\b/,\n\t\t'variable': /@@?\\w*/,\n\t\t'property': {\n\t\t\tpattern: /\\b(?!\\d)\\w+(?=:)|(:)(?!\\d)\\w+/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'function': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:_G|_VERSION|assert|collectgarbage|coroutine\\.(?:create|resume|running|status|wrap|yield)|debug\\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\\b/,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /\\./,\n\t\t\t},\n\t\t},\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'number':\n\t\t\t/(?:\\B\\.\\d+|\\b\\d+\\.\\d+|\\b\\d+(?=[eE]))(?:[eE][-+]?\\d+)?\\b|\\b(?:0x[a-fA-F\\d]+|\\d+)(?:U?LL)?\\b/,\n\t\t'operator': /\\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\\.\\.)=?|[:#^]|\\b(?:and|or)\\b=?|\\b(?:not)\\b/,\n\t\t'punctuation': /[.,()[\\]{}\\\\]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/n1ql.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'n1ql'>} */\nexport default {\n\tid: 'n1ql',\n\tgrammar () {\n\t\t// https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/index.html\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\*[\\s\\S]*?(?:$|\\*\\/)|--.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /([\"'])(?:\\\\[\\s\\S]|(?!\\1)[^\\\\]|\\1\\1)*\\1/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'identifier': {\n\t\t\t\tpattern: /`(?:\\\\[\\s\\S]|[^\\\\`]|``)*`/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'parameter': /\\$[\\w.]+/,\n\t\t\t// https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/reservedwords.html#n1ql-reserved-words\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\\b/i,\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\t\t\t'boolean': /\\b(?:FALSE|TRUE)\\b/i,\n\t\t\t'number': /(?:\\b\\d+\\.|\\B\\.)\\d+e[+\\-]?\\d+\\b|\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+\\b/i,\n\t\t\t'operator':\n\t\t\t\t/[-+*\\/%]|!=|==?|\\|\\||<[>=]?|>=?|\\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\\b/i,\n\t\t\t'punctuation': /[;[\\](),.{}:]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/n4js.js",
    "content": "import javascript from './javascript.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'n4js'>} */\nexport default {\n\tid: 'n4js',\n\tbase: javascript,\n\talias: 'n4jsd',\n\tgrammar () {\n\t\treturn {\n\t\t\t// Keywords from N4JS language spec: https://numberfour.github.io/n4js/spec/N4JSSpec.html\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\\b/,\n\t\t\t$insert: {\n\t\t\t\t// Annotations in N4JS spec: https://numberfour.github.io/n4js/spec/N4JSSpec.html#_annotations\n\t\t\t\t'annotation': {\n\t\t\t\t\t$before: 'constant',\n\t\t\t\t\tpattern: /@+\\w+/,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/nand2tetris-hdl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'nand2tetris-hdl'>} */\nexport default {\n\tid: 'nand2tetris-hdl',\n\tgrammar: {\n\t\t'comment': /\\/\\/.*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t'keyword': /\\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\\b/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'function': /\\b[A-Za-z][A-Za-z0-9]*(?=\\()/,\n\t\t'number': /\\b\\d+\\b/,\n\t\t'operator': /=|\\.\\./,\n\t\t'punctuation': /[{}[\\];(),:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/naniscript.js",
    "content": "import { getTextContent } from '../core/classes/token.js';\nimport { withoutTokenize } from '../util/language-util.js';\n\n/**\n * @param {string} input\n * @returns {boolean}\n */\nfunction isBracketsBalanced (input) {\n\tconst brackets = '[]{}';\n\tconst stack = [];\n\tfor (let i = 0; i < input.length; i++) {\n\t\tconst bracket = input[i];\n\t\tconst bracketsIndex = brackets.indexOf(bracket);\n\t\tif (bracketsIndex !== -1) {\n\t\t\tif (bracketsIndex % 2 === 0) {\n\t\t\t\tstack.push(bracketsIndex + 1);\n\t\t\t}\n\t\t\telse if (stack.pop() !== bracketsIndex) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn stack.length === 0;\n}\n\n/** @type {import('../types.d.ts').LanguageProto<'naniscript'>} */\nexport default {\n\tid: 'naniscript',\n\talias: 'nani',\n\tgrammar () {\n\t\tconst expressionDef = /\\{[^\\r\\n\\[\\]{}]*\\}/;\n\n\t\tconst params = {\n\t\t\t'quoted-string': {\n\t\t\t\tpattern: /\"(?:[^\"\\\\]|\\\\.)*\"/,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\t\t\t'command-param-id': {\n\t\t\t\tpattern: /(\\s)\\w+:/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'property',\n\t\t\t},\n\t\t\t'command-param-value': [\n\t\t\t\t{\n\t\t\t\t\tpattern: expressionDef,\n\t\t\t\t\talias: 'selector',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /([\\t ])\\S+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\S(?:.*\\S)?/,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\n\t\treturn {\n\t\t\t// ; ...\n\t\t\t'comment': {\n\t\t\t\tpattern: /^([\\t ]*);.*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t// > ...\n\t\t\t// Define is a control line starting with '>' followed by a word, a space and a text.\n\t\t\t'define': {\n\t\t\t\tpattern: /^>.+/m,\n\t\t\t\talias: 'tag',\n\t\t\t\tinside: {\n\t\t\t\t\t'value': {\n\t\t\t\t\t\tpattern: /(^>\\w+[\\t ]+)(?!\\s)[^{}\\r\\n]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'operator',\n\t\t\t\t\t},\n\t\t\t\t\t'key': {\n\t\t\t\t\t\tpattern: /(^>)\\w+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t// # ...\n\t\t\t'label': {\n\t\t\t\tpattern: /^([\\t ]*)#[\\t ]*\\w+[\\t ]*$/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'regex',\n\t\t\t},\n\t\t\t'command': {\n\t\t\t\tpattern: /^([\\t ]*)@\\w+(?=[\\t ]|$).*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'function',\n\t\t\t\tinside: {\n\t\t\t\t\t'command-name': /^@\\w+/,\n\t\t\t\t\t'expression': {\n\t\t\t\t\t\tpattern: expressionDef,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\talias: 'selector',\n\t\t\t\t\t},\n\t\t\t\t\t'command-params': {\n\t\t\t\t\t\tpattern: /\\s*\\S[\\s\\S]*/,\n\t\t\t\t\t\tinside: params,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t// Generic is any line that doesn't start with operators: ;>#@\n\t\t\t'generic-text': {\n\t\t\t\tpattern: /(^[ \\t]*)[^#@>;\\s].*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'punctuation',\n\t\t\t\tinside: {\n\t\t\t\t\t// \\{ ... \\} ... \\[ ... \\] ... \\\"\n\t\t\t\t\t'escaped-char': /\\\\[{}\\[\\]\"]/,\n\t\t\t\t\t'expression': {\n\t\t\t\t\t\tpattern: expressionDef,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\talias: 'selector',\n\t\t\t\t\t},\n\t\t\t\t\t'inline-command': {\n\t\t\t\t\t\tpattern: /\\[[\\t ]*\\w[^\\r\\n\\[\\]]*\\]/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\talias: 'function',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'command-params': {\n\t\t\t\t\t\t\t\tpattern: /(^\\[[\\t ]*\\w+\\b)[\\s\\S]+(?=\\]$)/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\tinside: params,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'command-param-name': {\n\t\t\t\t\t\t\t\tpattern: /^(\\[[\\t ]*)\\w+/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\talias: 'name',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'start-stop-char': /[\\[\\]]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t$tokenize (code, grammar, Prism) {\n\t\t\t\tconst tokens = Prism.tokenize(code, withoutTokenize(grammar));\n\t\t\t\ttokens.forEach(token => {\n\t\t\t\t\tif (typeof token !== 'string' && token.type === 'generic-text') {\n\t\t\t\t\t\tconst content = getTextContent(token);\n\t\t\t\t\t\tif (!isBracketsBalanced(content)) {\n\t\t\t\t\t\t\ttoken.type = 'bad-line';\n\t\t\t\t\t\t\ttoken.content = content;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn tokens;\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/nasm.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'nasm'>} */\nexport default {\n\tid: 'nasm',\n\tgrammar: {\n\t\t'comment': /;.*$/m,\n\t\t'string': /([\"'`])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t'label': {\n\t\t\tpattern: /(^\\s*)[A-Za-z._?$][\\w.?$@~#]*:/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'function',\n\t\t},\n\t\t'keyword': [\n\t\t\t/\\[?BITS (?:16|32|64)\\]?/,\n\t\t\t{\n\t\t\t\tpattern: /(^\\s*)section\\s*[a-z.]+:?/im,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t/(?:extern|global)[^;\\r\\n]*/i,\n\t\t\t/(?:CPU|DEFAULT|FLOAT).*$/m,\n\t\t],\n\t\t'register': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:st\\d|[xyz]mm\\d\\d?|[cdt]r\\d|r\\d\\d?[bwd]?|[abcd][hl]|[er]?[abcd]x|[er]?(?:bp|di|si|sp)|[cdefgs]s)\\b/i,\n\t\t\talias: 'variable',\n\t\t},\n\t\t'number':\n\t\t\t/(?:\\b|(?=\\$))(?:0[hx](?:\\.[\\da-f]+|[\\da-f]+(?:\\.[\\da-f]+)?)(?:p[+-]?\\d+)?|\\d[\\da-f]+[hx]|\\$\\d[\\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\\d+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:\\.?e[+-]?\\d+)?[dt]?)\\b/i,\n\t\t'operator': /[\\[\\]*+\\-\\/%<>=&|$!]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/neon.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'neon'>} */\nexport default {\n\tid: 'neon',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /#.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'datetime': {\n\t\t\tpattern:\n\t\t\t\t/(^|[[{(=:,\\s])\\d\\d\\d\\d-\\d\\d?-\\d\\d?(?:(?:[Tt]| +)\\d\\d?:\\d\\d:\\d\\d(?:\\.\\d*)? *(?:Z|[-+]\\d\\d?(?::?\\d\\d)?)?)?(?=$|[\\]}),\\s])/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'number',\n\t\t},\n\t\t'key': {\n\t\t\tpattern: /(^|[[{(,\\s])[^,:=[\\]{}()'\"\\s]+(?=\\s*:(?:$|[\\]}),\\s])|\\s*=)/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'property',\n\t\t},\n\t\t'number': {\n\t\t\tpattern:\n\t\t\t\t/(^|[[{(=:,\\s])[+-]?(?:0x[\\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\\d+(?:\\.\\d*)?|\\.?\\d+)(?:[eE][+-]?\\d+)?)(?=$|[\\]}),:=\\s])/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'boolean': {\n\t\t\tpattern: /(^|[[{(=:,\\s])(?:false|no|true|yes)(?=$|[\\]}),:=\\s])/i,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'null': {\n\t\t\tpattern: /(^|[[{(=:,\\s])(?:null)(?=$|[\\]}),:=\\s])/i,\n\t\t\tlookbehind: true,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'string': {\n\t\t\tpattern:\n\t\t\t\t/(^|[[{(=:,\\s])(?:('''|\"\"\")\\r?\\n(?:(?:[^\\r\\n]|\\r?\\n(?![\\t ]*\\2))*\\r?\\n)?[\\t ]*\\2|'[^'\\r\\n]*'|\"(?:\\\\.|[^\\\\\"\\r\\n])*\")/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'literal': {\n\t\t\tpattern:\n\t\t\t\t/(^|[[{(=:,\\s])(?:[^#\"',:=[\\]{}()\\s`-]|[:-][^\"',=[\\]{}()\\s])(?:[^,:=\\]})(\\s]|:(?![\\s,\\]})]|$)|[ \\t]+[^#,:=\\]})(\\s])*/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'string',\n\t\t},\n\t\t'punctuation': /[,:=[\\]{}()-]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/nevod.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'nevod'>} */\nexport default {\n\tid: 'nevod',\n\tgrammar: {\n\t\t'comment': /\\/\\/.*|(?:\\/\\*[\\s\\S]*?(?:\\*\\/|$))/,\n\t\t'string': {\n\t\t\tpattern: /(?:\"(?:\"\"|[^\"])*\"(?!\")|'(?:''|[^'])*'(?!'))!?\\*?/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'string-attrs': /!$|!\\*$|\\*$/,\n\t\t\t},\n\t\t},\n\t\t'namespace': {\n\t\t\tpattern: /(@namespace\\s+)[a-zA-Z0-9\\-.]+(?=\\s*\\{)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'pattern': {\n\t\t\tpattern:\n\t\t\t\t/(@pattern\\s+)?#?[a-zA-Z0-9\\-.]+(?:\\s*\\(\\s*(?:~\\s*)?[a-zA-Z0-9\\-.]+\\s*(?:,\\s*(?:~\\s*)?[a-zA-Z0-9\\-.]*)*\\))?(?=\\s*=)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'pattern-name': {\n\t\t\t\t\tpattern: /^#?[a-zA-Z0-9\\-.]+/,\n\t\t\t\t\talias: 'class-name',\n\t\t\t\t},\n\t\t\t\t'fields': {\n\t\t\t\t\tpattern: /\\(.*\\)/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'field-name': {\n\t\t\t\t\t\t\tpattern: /[a-zA-Z0-9\\-.]+/,\n\t\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /[,()]/,\n\t\t\t\t\t\t'operator': {\n\t\t\t\t\t\t\tpattern: /~/,\n\t\t\t\t\t\t\talias: 'field-hidden-mark',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'search': {\n\t\t\tpattern: /(@search\\s+|#)[a-zA-Z0-9\\-.]+(?:\\.\\*)?(?=\\s*;)/,\n\t\t\talias: 'function',\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'keyword': /@(?:having|inside|namespace|outside|pattern|require|search|where)\\b/,\n\t\t'standard-pattern': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:Alpha|AlphaNum|Any|Blank|End|LineBreak|Num|NumAlpha|Punct|Space|Start|Symbol|Word|WordBreak)\\b(?:\\([a-zA-Z0-9\\-.,\\s+]*\\))?/,\n\t\t\tinside: {\n\t\t\t\t'standard-pattern-name': {\n\t\t\t\t\tpattern: /^[a-zA-Z0-9\\-.]+/,\n\t\t\t\t\talias: 'builtin',\n\t\t\t\t},\n\t\t\t\t'quantifier': {\n\t\t\t\t\tpattern: /\\b\\d+(?:\\s*\\+|\\s*-\\s*\\d+)?(?!\\w)/,\n\t\t\t\t\talias: 'number',\n\t\t\t\t},\n\t\t\t\t'standard-pattern-attr': {\n\t\t\t\t\tpattern: /[a-zA-Z0-9\\-.]+/,\n\t\t\t\t\talias: 'builtin',\n\t\t\t\t},\n\t\t\t\t'punctuation': /[,()]/,\n\t\t\t},\n\t\t},\n\t\t'quantifier': {\n\t\t\tpattern: /\\b\\d+(?:\\s*\\+|\\s*-\\s*\\d+)?(?!\\w)/,\n\t\t\talias: 'number',\n\t\t},\n\t\t'operator': [\n\t\t\t{\n\t\t\t\tpattern: /=/,\n\t\t\t\talias: 'pattern-def',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /&/,\n\t\t\t\talias: 'conjunction',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /~/,\n\t\t\t\talias: 'exception',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /\\?/,\n\t\t\t\talias: 'optionality',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /[[\\]]/,\n\t\t\t\talias: 'repetition',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /[{}]/,\n\t\t\t\talias: 'variation',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /[+_]/,\n\t\t\t\talias: 'sequence',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /\\.{2,3}/,\n\t\t\t\talias: 'span',\n\t\t\t},\n\t\t],\n\t\t'field-capture': [\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/([a-zA-Z0-9\\-.]+\\s*\\()\\s*[a-zA-Z0-9\\-.]+\\s*:\\s*[a-zA-Z0-9\\-.]+(?:\\s*,\\s*[a-zA-Z0-9\\-.]+\\s*:\\s*[a-zA-Z0-9\\-.]+)*(?=\\s*\\))/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'field-name': {\n\t\t\t\t\t\tpattern: /[a-zA-Z0-9\\-.]+/,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t\t'colon': /:/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /[a-zA-Z0-9\\-.]+\\s*:/,\n\t\t\t\tinside: {\n\t\t\t\t\t'field-name': {\n\t\t\t\t\t\tpattern: /[a-zA-Z0-9\\-.]+/,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t\t'colon': /:/,\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\t'punctuation': /[:;,()]/,\n\t\t'name': /[a-zA-Z0-9\\-.]+/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/nginx.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'nginx'>} */\nexport default {\n\tid: 'nginx',\n\tgrammar () {\n\t\tconst variable = /\\$(?:\\w[a-z\\d]*(?:_[^\\x00-\\x1F\\s\"'\\\\()$]*)?|\\{[^}\\s\"'\\\\]+\\})/i;\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^|[\\s{};])#.*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'directive': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|\\s)\\w(?:[^;{}\"'\\\\\\s]|\\\\.|\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|\\s+(?:#.*(?!.)|(?![#\\s])))*?(?=\\s*[;{])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'string': {\n\t\t\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\\\\\)*)(?:\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'escape': {\n\t\t\t\t\t\t\t\tpattern: /\\\\[\"'\\\\nrt]/,\n\t\t\t\t\t\t\t\talias: 'entity',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'variable': variable,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'comment': {\n\t\t\t\t\t\tpattern: /(\\s)#.*/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\t\t\t\t\t'keyword': {\n\t\t\t\t\t\tpattern: /^\\S+/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\n\t\t\t\t\t// other patterns\n\n\t\t\t\t\t'boolean': {\n\t\t\t\t\t\tpattern: /(\\s)(?:off|on)(?!\\S)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'number': {\n\t\t\t\t\t\tpattern: /(\\s)\\d+[a-z]*(?!\\S)/i,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'variable': variable,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'punctuation': /[{};]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/nim.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'nim'>} */\nexport default {\n\tid: 'nim',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /#.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\t// Double-quoted strings can be prefixed by an identifier (Generalized raw string literals)\n\t\t\tpattern:\n\t\t\t\t/(?:\\b(?!\\d)(?:\\w|\\\\x[89a-fA-F][0-9a-fA-F])+)?(?:\"\"\"[\\s\\S]*?\"\"\"(?!\")|\"(?:\\\\[\\s\\S]|\"\"|[^\"\\\\])*\")/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'char': {\n\t\t\t// Character literals are handled specifically to prevent issues with numeric type suffixes\n\t\t\tpattern: /'(?:\\\\(?:\\d+|x[\\da-fA-F]{0,2}|.)|[^'])'/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'function': {\n\t\t\tpattern:\n\t\t\t\t/(?:(?!\\d)(?:\\w|\\\\x[89a-fA-F][0-9a-fA-F])+|`[^`\\r\\n]+`)\\*?(?:\\[[^\\]]+\\])?(?=\\s*\\()/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'operator': /\\*$/,\n\t\t\t},\n\t\t},\n\t\t// We don't want to highlight operators (and anything really) inside backticks\n\t\t'identifier': {\n\t\t\tpattern: /`[^`\\r\\n]+`/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /`/,\n\t\t\t},\n\t\t},\n\n\t\t// The negative look ahead prevents wrong highlighting of the .. operator\n\t\t'number':\n\t\t\t/\\b(?:0[xXoObB][\\da-fA-F_]+|\\d[\\d_]*(?:(?!\\.\\.)\\.[\\d_]*)?(?:[eE][+-]?\\d[\\d_]*)?)(?:'?[iuf]\\d*)?/,\n\t\t'keyword':\n\t\t\t/\\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\\b/,\n\t\t'operator': {\n\t\t\t// Look behind and look ahead prevent wrong highlighting of punctuations [. .] {. .} (. .)\n\t\t\t// but allow the slice operator .. to take precedence over them\n\t\t\t// One can define his own operators in Nim so all combination of operators might be an operator.\n\t\t\tpattern:\n\t\t\t\t/(^|[({\\[](?=\\.\\.)|(?![({\\[]\\.).)(?:(?:[=+\\-*\\/<>@$~&%|!?^:\\\\]|\\.\\.|\\.(?![)}\\]]))+|\\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\\b)/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'punctuation': /[({\\[]\\.|\\.[)}\\]]|[`(){}\\[\\],:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/nix.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'nix'>} */\nexport default {\n\tid: 'nix',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\\/\\*[\\s\\S]*?\\*\\/|#.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"|''(?:(?!'')[\\s\\S]|''(?:'|\\\\|\\$\\{))*''/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation': {\n\t\t\t\t\t// The lookbehind ensures the ${} is not preceded by \\ or ''\n\t\t\t\t\tpattern: /(^|(?:^|(?!'').)[^\\\\])\\$\\{(?:[^{}]|\\{[^}]*\\})*\\}/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'nix',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'url': [\n\t\t\t/\\b(?:[a-z]{3,7}:\\/\\/)[\\w\\-+%~\\/.:#=?&]+/,\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/([^\\/])(?:[\\w\\-+%~.:#=?&]*(?!\\/\\/)[\\w\\-+%~\\/.:#=?&])?(?!\\/\\/)\\/[\\w\\-+%~\\/.:#=?&]*/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'antiquotation': {\n\t\t\tpattern: /\\$(?=\\{)/,\n\t\t\talias: 'important',\n\t\t},\n\t\t'number': /\\b\\d+\\b/,\n\t\t'keyword': /\\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\\b/,\n\t\t'function':\n\t\t\t/\\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\\b|\\bfoldl'\\B/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'operator': /[=!<>]=?|\\+\\+?|\\|\\||&&|\\/\\/|->?|[?@]/,\n\t\t'punctuation': /[{}()[\\].,:;]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/nsis.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'nsis'>} */\nexport default {\n\tid: 'nsis',\n\tgrammar () {\n\t\t/**\n\t\t * Original by Jan T. Sott (http://github.com/idleberg)\n\t\t *\n\t\t * Includes all commands and plug-ins shipped with NSIS 3.08\n\t\t */\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|[#;].*)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'keyword': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[\\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|KnownFolderPath|LabelAddress|TempFileName|WinVer)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|RtlLanguage|ShellVarContextAll|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|Target|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\\b/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'property':\n\t\t\t\t/\\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\\b/,\n\t\t\t'constant': /\\$\\{[!\\w\\.:\\^-]+\\}|\\$\\([!\\w\\.:\\^-]+\\)/,\n\t\t\t'variable': /\\$\\w[\\w\\.]*/,\n\t\t\t'number': /\\b0x[\\dA-Fa-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[Ee]-?\\d+)?/,\n\t\t\t'operator': /--?|\\+\\+?|<=?|>=?|==?=?|&&?|\\|\\|?|[?*\\/~^%]/,\n\t\t\t'punctuation': /[{}[\\];(),.:]/,\n\t\t\t'important': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[\\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\\b/im,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/objectivec.js",
    "content": "import c from './c.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'objectivec'>} */\nexport default {\n\tid: 'objectivec',\n\tbase: c,\n\talias: 'objc',\n\tgrammar () {\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\tpattern: /@?\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\\b/,\n\t\t\t'operator': /-[->]?|\\+\\+?|!=?|<<?=?|>>?=?|==?|&&?|\\|\\|?|[~^%?*\\/@]/,\n\t\t\t$delete: ['class-name'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/ocaml.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'ocaml'>} */\nexport default {\n\tid: 'ocaml',\n\tgrammar () {\n\t\t// https://ocaml.org/manual/lex.html\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\(\\*[\\s\\S]*?\\*\\)/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'char': {\n\t\t\t\tpattern: /'(?:[^\\\\\\r\\n']|\\\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /\"(?:\\\\(?:[\\s\\S]|\\r\\n)|[^\\\\\\r\\n\"])*\"/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\{([a-z_]*)\\|[\\s\\S]*?\\|\\1\\}/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'number': [\n\t\t\t\t// binary and octal\n\t\t\t\t/\\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\\b/i,\n\t\t\t\t// hexadecimal\n\t\t\t\t/\\b0x[a-f0-9][a-f0-9_]*(?:\\.[a-f0-9_]*)?(?:p[+-]?\\d[\\d_]*)?(?!\\w)/i,\n\t\t\t\t// decimal\n\t\t\t\t/\\b\\d[\\d_]*(?:\\.[\\d_]*)?(?:e[+-]?\\d[\\d_]*)?(?!\\w)/i,\n\t\t\t],\n\t\t\t'directive': {\n\t\t\t\tpattern: /\\B#\\w+/,\n\t\t\t\talias: 'property',\n\t\t\t},\n\t\t\t'label': {\n\t\t\t\tpattern: /\\B~\\w+/,\n\t\t\t\talias: 'property',\n\t\t\t},\n\t\t\t'type-variable': {\n\t\t\t\tpattern: /\\B'\\w+/,\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'variant': {\n\t\t\t\tpattern: /`\\w+/,\n\t\t\t\talias: 'symbol',\n\t\t\t},\n\t\t\t// For the list of keywords and operators,\n\t\t\t// see: http://caml.inria.fr/pub/docs/manual-ocaml/lex.html#sec84\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\n\t\t\t'operator-like-punctuation': {\n\t\t\t\tpattern: /\\[[<>|]|[>|]\\]|\\{<|>\\}/,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t// Custom operators are allowed\n\t\t\t'operator':\n\t\t\t\t/\\.[.~]|:[=>]|[=<>@^|&+\\-*\\/$%!?~][!$%&*+\\-.\\/:<=>?@^|~]*|\\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\\b/,\n\t\t\t'punctuation': /;;|::|[(){}\\[\\].,:;#]|\\b_\\b/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/odin.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'odin'>} */\nexport default {\n\tid: 'odin',\n\tgrammar () {\n\t\tconst escapes =\n\t\t\t/\\\\(?:[\"'\\\\abefnrtv]|0[0-7]{2}|U[\\dA-Fa-f]{6}|u[\\dA-Fa-f]{4}|x[\\dA-Fa-f]{2})/;\n\n\t\treturn {\n\t\t\t/**\n\t\t\t * The current implementation supports only 1 level of nesting.\n\t\t\t *\n\t\t\t * @author Michael Schmidt\n\t\t\t * @author edukisto\n\t\t\t */\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\/\\*(?:[^/*]|\\/(?!\\*)|\\*(?!\\/)|\\/\\*(?:\\*(?!\\/)|[^*])*(?:\\*\\/|$))*(?:\\*\\/|$)/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /#![^\\n\\r]*/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\/\\/[^\\n\\r]*/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t/**\n\t\t\t * Should be found before strings because of '\"'\"- and '`'`-like sequences.\n\t\t\t */\n\t\t\t'char': {\n\t\t\t\tpattern: /'(?:\\\\(?:.|[0Uux][0-9A-Fa-f]{1,6})|[^\\n\\r'\\\\])'/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'symbol': escapes,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /`[^`]*`/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\"(?:\\\\.|[^\\n\\r\"\\\\])*\"/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'symbol': escapes,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t'directive': {\n\t\t\t\tpattern: /#\\w+/,\n\t\t\t\talias: 'property',\n\t\t\t},\n\n\t\t\t'number':\n\t\t\t\t/\\b0(?:b[01_]+|d[\\d_]+|h_*(?:(?:(?:[\\dA-Fa-f]_*){8}){1,2}|(?:[\\dA-Fa-f]_*){4})|o[0-7_]+|x[\\dA-F_a-f]+|z[\\dAB_ab]+)\\b|(?:\\b\\d+(?:\\.(?!\\.)\\d*)?|\\B\\.\\d+)(?:[Ee][+-]?\\d*)?[ijk]?(?!\\w)/,\n\n\t\t\t'discard': {\n\t\t\t\tpattern: /\\b_\\b/,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\n\t\t\t'procedure-definition': {\n\t\t\t\tpattern: /\\b\\w+(?=[ \\t]*(?::\\s*){2}proc\\b)/,\n\t\t\t\talias: 'function',\n\t\t\t},\n\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:asm|auto_cast|bit_set|break|case|cast|context|continue|defer|distinct|do|dynamic|else|enum|fallthrough|for|foreign|if|import|in|map|matrix|not_in|or_else|or_return|package|proc|return|struct|switch|transmute|typeid|union|using|when|where)\\b/,\n\n\t\t\t/**\n\t\t\t * false, nil, true can be used as procedure names. \"_\" and keywords can't.\n\t\t\t */\n\t\t\t'procedure-name': {\n\t\t\t\tpattern: /\\b\\w+(?=[ \\t]*\\()/,\n\t\t\t\talias: 'function',\n\t\t\t},\n\n\t\t\t'boolean': /\\b(?:false|nil|true)\\b/,\n\n\t\t\t'constant-parameter-sign': {\n\t\t\t\tpattern: /\\$/,\n\t\t\t\talias: 'important',\n\t\t\t},\n\n\t\t\t'undefined': {\n\t\t\t\tpattern: /---/,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\n\t\t\t'arrow': {\n\t\t\t\tpattern: /->/,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\n\t\t\t'operator': /\\+\\+|--|\\.\\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,\n\n\t\t\t'punctuation': /[(),.:;@\\[\\]{}]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/opencl-extensions.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'opencl-extensions'>} */\nexport default {\n\tid: 'opencl-extensions',\n\tgrammar: {\n\t\t// Extracted from http://streamcomputing.eu/downloads/?opencl_host.lang (opencl-types and opencl-host)\n\t\t'type-opencl-host': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\\b/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'boolean-opencl-host': {\n\t\t\tpattern: /\\bCL_(?:FALSE|TRUE)\\b/,\n\t\t\talias: 'boolean',\n\t\t},\n\t\t// Extracted from cl.h (2.0) and http://streamcomputing.eu/downloads/?opencl_host.lang (opencl-const)\n\t\t'constant-opencl-host': {\n\t\t\tpattern:\n\t\t\t\t/\\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\\b/,\n\t\t\talias: 'constant',\n\t\t},\n\t\t// Extracted from cl.h (2.0) and http://streamcomputing.eu/downloads/?opencl_host.lang (opencl-host)\n\t\t'function-opencl-host': {\n\t\t\tpattern:\n\t\t\t\t/\\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\\b/,\n\t\t\talias: 'function',\n\t\t},\n\n\t\t// C++ includes everything from the OpenCL C host API plus the classes defined in cl2.h\n\t\t// Extracted from doxygen class list http://github.khronos.org/OpenCL-CLHPP/annotated.html\n\t\t'type-opencl-host-cpp': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\\b/,\n\t\t\talias: 'keyword',\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/opencl.js",
    "content": "import c from './c.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'opencl'>} */\nexport default {\n\tid: 'opencl',\n\tbase: c,\n\tgrammar () {\n\t\t/* OpenCL kernel language */\n\t\treturn {\n\t\t\t// Extracted from the official specs (2.0) and http://streamcomputing.eu/downloads/?opencl.lang (opencl-keywords, opencl-types) and http://sourceforge.net/tracker/?func=detail&aid=2957794&group_id=95717&atid=612384 (Words2, partly Words3)\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:__attribute__|(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|default|do|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\\b/,\n\t\t\t// Extracted from http://streamcomputing.eu/downloads/?opencl.lang (opencl-const)\n\t\t\t// Math Constants: https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/mathConstants.html\n\t\t\t// Macros and Limits: https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/macroLimits.html\n\t\t\t'number':\n\t\t\t\t/(?:\\b0x(?:[\\da-f]+(?:\\.[\\da-f]*)?|\\.[\\da-f]+)(?:p[+-]?\\d+)?|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)[fuhl]{0,4}/i,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'constant-opencl-kernel': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:A?R?G?B?[Ax]?|BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|MANT_DIG|(?:MAX|MIN)(?:(?:_10)?_EXP)?)|FLT_RADIX|HUGE_VALF?|INFINITY|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\\b/,\n\t\t\t\talias: 'constant',\n\t\t\t},\n\t\t\t$insert: {\n\t\t\t\t// https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/scalarDataTypes.html\n\t\t\t\t// https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/otherDataTypes.html\n\t\t\t\t'builtin-type': {\n\t\t\t\t\t$before: 'class-name',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_|msaa_depth_)?|depth_|msaa_|msaa_depth_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\\b/,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/openqasm.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'openqasm'>} */\nexport default {\n\tid: 'openqasm',\n\talias: 'qasm',\n\tgrammar () {\n\t\t// https://qiskit.github.io/openqasm/grammar/index.html\n\n\t\treturn {\n\t\t\t'comment': /\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*/,\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"\\r\\n\\t]*\"|'[^'\\r\\n\\t]*'/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:CX|OPENQASM|U|barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while)\\b|#pragma\\b/,\n\t\t\t'class-name':\n\t\t\t\t/\\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\\b/,\n\t\t\t'function': /\\b(?:cos|exp|ln|popcount|rotl|rotr|sin|sqrt|tan)\\b(?=\\s*\\()/,\n\n\t\t\t'constant': /\\b(?:euler|pi|tau)\\b|π|𝜏|ℇ/,\n\t\t\t'number': {\n\t\t\t\tpattern: /(^|[^.\\w$])(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?(?:dt|ns|us|µs|ms|s)?/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'operator': /->|>>=?|<<=?|&&|\\|\\||\\+\\+|--|[!=<>&|~^+\\-*/%]=?|@/,\n\t\t\t'punctuation': /[(){}\\[\\];,:.]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/oz.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'oz'>} */\nexport default {\n\tid: 'oz',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\\/\\*[\\s\\S]*?\\*\\/|%.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'atom': {\n\t\t\tpattern: /'(?:[^'\\\\]|\\\\[\\s\\S])*'/,\n\t\t\tgreedy: true,\n\t\t\talias: 'builtin',\n\t\t},\n\t\t'keyword':\n\t\t\t/\\$|\\[\\]|\\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\\b/,\n\t\t'function': [\n\t\t\t/\\b[a-z][A-Za-z\\d]*(?=\\()/,\n\t\t\t{\n\t\t\t\tpattern: /(\\{)[A-Z][A-Za-z\\d]*\\b/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'number': /\\b(?:0[bx][\\da-f]+|\\d+(?:\\.\\d*)?(?:e~?\\d+)?)\\b|&(?:[^\\\\]|\\\\(?:\\d{3}|.))/i,\n\t\t'variable': /`(?:[^`\\\\]|\\\\.)+`/,\n\t\t'attr-name': /\\b\\w+(?=[ \\t]*:(?![:=]))/,\n\t\t'operator':\n\t\t\t/:(?:=|::?)|<[-:=]?|=(?:=|<?:?)|>=?:?|\\\\=:?|!!?|[|#+\\-*\\/,~^@]|\\b(?:andthen|div|mod|orelse)\\b/,\n\t\t'punctuation': /[\\[\\](){}.:;?]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/parigp.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'parigp'>} */\nexport default {\n\tid: 'parigp',\n\tgrammar () {\n\t\tconst keywords = [\n\t\t\t'breakpoint',\n\t\t\t'break',\n\t\t\t'dbg_down',\n\t\t\t'dbg_err',\n\t\t\t'dbg_up',\n\t\t\t'dbg_x',\n\t\t\t'forcomposite',\n\t\t\t'fordiv',\n\t\t\t'forell',\n\t\t\t'forpart',\n\t\t\t'forprime',\n\t\t\t'forstep',\n\t\t\t'forsubgroup',\n\t\t\t'forvec',\n\t\t\t'for',\n\t\t\t'iferr',\n\t\t\t'if',\n\t\t\t'local',\n\t\t\t'my',\n\t\t\t'next',\n\t\t\t'return',\n\t\t\t'until',\n\t\t\t'while',\n\t\t];\n\n\t\treturn {\n\t\t\t'comment': /\\/\\*[\\s\\S]*?\\*\\/|\\\\\\\\.*/,\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t// PARI/GP does not care about white spaces at all\n\t\t\t// so let's process the keywords to build an appropriate regexp\n\t\t\t// (e.g. \"b *r *e *a *k\", etc.)\n\t\t\t'keyword': RegExp(\n\t\t\t\t'\\\\b(?:' + keywords.map(keyword => keyword.split('').join(' *')).join('|') + ')\\\\b'\n\t\t\t),\n\t\t\t'function': /\\b\\w(?:[\\w ]*\\w)?(?= *\\()/,\n\t\t\t'number': {\n\t\t\t\t// The lookbehind and the negative lookahead prevent from breaking the .. operator\n\t\t\t\tpattern:\n\t\t\t\t\t/((?:\\. *\\. *)?)(?:\\b\\d(?: *\\d)*(?: *(?!\\. *\\.)\\.(?: *\\d)*)?|\\. *\\d(?: *\\d)*)(?: *e *(?:[+-] *)?\\d(?: *\\d)*)?/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'operator':\n\t\t\t\t/\\. *\\.|[*\\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\\\(?: *\\/)?(?: *=)?|&(?: *&)?|\\| *\\||['#~^]/,\n\t\t\t'punctuation': /[\\[\\]{}().,:;|]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/parser.js",
    "content": "import markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'parser'>} */\nexport default {\n\tid: 'parser',\n\tbase: markup,\n\tgrammar () {\n\t\tconst punctuation = /[\\[\\](){};]/;\n\n\t\tconst parser = {\n\t\t\t'expression': {\n\t\t\t\t// Allow for 3 levels of depth\n\t\t\t\tpattern: /(^|[^^])\\((?:[^()]|\\((?:[^()]|\\((?:[^()])*\\))*\\))*\\)/,\n\t\t\t\tgreedy: true,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {}, // See below\n\t\t\t},\n\t\t\t'keyword': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^^])(?:\\^(?:case|eval|for|if|switch|throw)\\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\\b)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'variable': {\n\t\t\t\tpattern: /(^|[^^])\\B\\$(?:\\w+|(?=[.{]))(?:(?:\\.|::?)\\w+)*(?:\\.|::?)?/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /\\.|:+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'function': {\n\t\t\t\tpattern: /(^|[^^])\\B[@^]\\w+(?:(?:\\.|::?)\\w+)*(?:\\.|::?)?/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'keyword': {\n\t\t\t\t\t\tpattern: /(^@)(?:GET_|SET_)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /\\.|:+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'escape': {\n\t\t\t\tpattern: /\\^(?:[$^;@()\\[\\]{}\"':]|#[a-f\\d]*)/i,\n\t\t\t\talias: 'builtin',\n\t\t\t},\n\t\t\t'punctuation': punctuation,\n\t\t};\n\n\t\tparser['expression'].inside = {\n\t\t\t'string': {\n\t\t\t\tpattern: /(^|[^^])([\"'])(?:(?!\\2)[^^]|\\^[\\s\\S])*\\2/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'keyword': parser.keyword,\n\t\t\t'variable': parser.variable,\n\t\t\t'function': parser.function,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'number': /\\b(?:0x[a-f\\d]+|\\d+(?:\\.\\d*)?(?:e[+-]?\\d+)?)\\b/i,\n\t\t\t'escape': parser.escape,\n\t\t\t'operator':\n\t\t\t\t/[~+*\\/\\\\%]|!(?:\\|\\|?|=)?|&&?|\\|\\|?|==|<[<=]?|>[>=]?|-[fd]?|\\b(?:def|eq|ge|gt|in|is|le|lt|ne)\\b/,\n\t\t\t'punctuation': punctuation,\n\t\t};\n\n\t\treturn {\n\t\t\t...parser,\n\t\t\t$insertBefore: {\n\t\t\t\t'keyword': {\n\t\t\t\t\t'parser-comment': {\n\t\t\t\t\t\tpattern: /(\\s)#.*/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'comment',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'tag/attr-value/punctuation': {\n\t\t\t\t\t'expression': parser.expression,\n\t\t\t\t\t'keyword': parser.keyword,\n\t\t\t\t\t'variable': parser.variable,\n\t\t\t\t\t'function': parser.function,\n\t\t\t\t\t'escape': parser.escape,\n\t\t\t\t\t'parser-punctuation': {\n\t\t\t\t\t\tpattern: punctuation,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/pascal.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'pascal'>} */\nexport default {\n\tid: 'pascal',\n\talias: 'objectpascal',\n\tgrammar () {\n\t\t// Based on Free Pascal\n\n\t\t/* TODO\n\t\t\tSupport inline asm ?\n\t\t*/\n\n\t\tconst pascal = {\n\t\t\t'directive': {\n\t\t\t\tpattern: /\\{\\$[\\s\\S]*?\\}/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: ['marco', 'property'],\n\t\t\t},\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\(\\*[\\s\\S]*?\\*\\)|\\{[\\s\\S]*?\\}|\\/\\/.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /(?:'(?:''|[^'\\r\\n])*'(?!')|#[&$%]?[a-f\\d]+)+|\\^[a-z]/i,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'asm': {\n\t\t\t\tpattern: /(\\basm\\b)[\\s\\S]+?(?=\\bend\\s*[;[])/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: /** @type {GrammarToken['inside']} */ (null), // see below\n\t\t\t},\n\t\t\t'keyword': [\n\t\t\t\t{\n\t\t\t\t\t// Turbo Pascal\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^&])\\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\\b/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Free Pascal\n\t\t\t\t\tpattern: /(^|[^&])\\b(?:dispose|exit|false|new|true)\\b/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Object Pascal\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^&])\\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\\b/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Modifiers\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^&])\\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\\b/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'number': [\n\t\t\t\t// Hexadecimal, octal and binary\n\t\t\t\t/(?:[&%]\\d+|\\$[a-f\\d]+)/i,\n\t\t\t\t// Decimal\n\t\t\t\t/\\b\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?/i,\n\t\t\t],\n\t\t\t'operator': [\n\t\t\t\t/\\.\\.|\\*\\*|:=|<[<=>]?|>[>=]?|[+\\-*\\/]=?|[@^=]/,\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^&])\\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\\b/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'punctuation': /\\(\\.|\\.\\)|[()\\[\\]:;,.]/,\n\t\t};\n\n\t\tpascal.asm.inside = {\n\t\t\t...pascal,\n\t\t\t'asm': undefined,\n\t\t\t'keyword': undefined,\n\t\t\t'operator': undefined,\n\t\t};\n\n\t\treturn pascal;\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/pascaligo.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'pascaligo'>} */\nexport default {\n\tid: 'pascaligo',\n\tgrammar () {\n\t\t// Pascaligo is a layer 2 smart contract language for the tezos blockchain\n\n\t\tconst braces = /\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)/.source;\n\t\tconst type = /(?:\\b\\w+(?:<braces>)?|<braces>)/.source.replace(/<braces>/g, () => braces);\n\n\t\t/** @type {import('../types.d.ts').Grammar} */\n\t\tconst classNameInside = {};\n\n\t\tconst pascaligo = {\n\t\t\t'comment': /\\(\\*[\\s\\S]+?\\*\\)|\\/\\/.*/,\n\t\t\t'string': {\n\t\t\t\tpattern: /([\"'`])(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|\\^[a-z]/i,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/(\\btype\\s+\\w+\\s+is\\s+)<type>/.source.replace(/<type>/g, () => type),\n\t\t\t\t\t\t'i'\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: classNameInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/<type>(?=\\s+is\\b)/.source.replace(/<type>/g, () => type),\n\t\t\t\t\t\t'i'\n\t\t\t\t\t),\n\t\t\t\t\tinside: classNameInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(/(:\\s*)<type>/.source.replace(/<type>/g, () => type)),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: classNameInside,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^&])\\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\\b/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'boolean': {\n\t\t\t\tpattern: /(^|[^&])\\b(?:False|True)\\b/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'builtin': {\n\t\t\t\tpattern: /(^|[^&])\\b(?:bool|int|list|map|nat|record|string|unit)\\b/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'function': /\\b\\w+(?=\\s*\\()/,\n\t\t\t'number': [\n\t\t\t\t// Hexadecimal, octal and binary\n\t\t\t\t/%[01]+|&[0-7]+|\\$[a-f\\d]+/i,\n\t\t\t\t// Decimal\n\t\t\t\t/\\b\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?(?:mtz|n)?/i,\n\t\t\t],\n\t\t\t'operator': /->|=\\/=|\\.\\.|\\*\\*|:=|<[<=>]?|>[>=]?|[+\\-*\\/]=?|[@^=|]|\\b(?:and|mod|or)\\b/,\n\t\t\t'punctuation': /\\(\\.|\\.\\)|[()\\[\\]:;,.{}]/,\n\t\t};\n\n\t\tconst keys = ['comment', 'keyword', 'builtin', 'operator', 'punctuation'];\n\t\tkeys.forEach(key => (classNameInside[key] = pascaligo[key]));\n\n\t\treturn pascaligo;\n\t},\n};\n"
  },
  {
    "path": "src/languages/pcaxis.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'pcaxis'>} */\nexport default {\n\tid: 'pcaxis',\n\talias: 'px',\n\tgrammar: {\n\t\t'string': /\"[^\"]*\"/,\n\t\t'keyword': {\n\t\t\tpattern:\n\t\t\t\t/((?:^|;)\\s*)[-A-Z\\d]+(?:\\s*\\[[-\\w]+\\])?(?:\\s*\\(\"[^\"]*\"(?:,\\s*\"[^\"]*\")*\\))?(?=\\s*=)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'keyword': /^[-A-Z\\d]+/,\n\t\t\t\t'language': {\n\t\t\t\t\tpattern: /^(\\s*)\\[[-\\w]+\\]/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /^\\[|\\]$/,\n\t\t\t\t\t\t'property': /[-\\w]+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'sub-key': {\n\t\t\t\t\tpattern: /^(\\s*)\\S[\\s\\S]*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'parameter': {\n\t\t\t\t\t\t\tpattern: /\"[^\"]*\"/,\n\t\t\t\t\t\t\talias: 'property',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /^\\(|\\)$|,/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'operator': /=/,\n\t\t'tlist': {\n\t\t\tpattern: /TLIST\\s*\\(\\s*\\w+(?:(?:\\s*,\\s*\"[^\"]*\")+|\\s*,\\s*\"[^\"]*\"-\"[^\"]*\")?\\s*\\)/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'function': /^TLIST/,\n\t\t\t\t'property': {\n\t\t\t\t\tpattern: /^(\\s*\\(\\s*)\\w+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t'string': /\"[^\"]*\"/,\n\t\t\t\t'punctuation': /[(),]/,\n\t\t\t\t'operator': /-/,\n\t\t\t},\n\t\t},\n\t\t'punctuation': /[;,]/,\n\t\t'number': {\n\t\t\tpattern: /(^|\\s)\\d+(?:\\.\\d+)?(?!\\S)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'boolean': /NO|YES/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/peoplecode.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'peoplecode'>} */\nexport default {\n\tid: 'peoplecode',\n\talias: 'pcode',\n\tgrammar: {\n\t\t'comment': RegExp(\n\t\t\t[\n\t\t\t\t// C-style multiline comments\n\t\t\t\t/\\/\\*[\\s\\S]*?\\*\\//.source,\n\t\t\t\t// REM comments\n\t\t\t\t/\\bREM[^;]*;/.source,\n\t\t\t\t// Nested <* *> comments\n\t\t\t\t/<\\*(?:[^<*]|\\*(?!>)|<(?!\\*)|<\\*(?:(?!\\*>)[\\s\\S])*\\*>)*\\*>/.source,\n\t\t\t\t// /+ +/ comments\n\t\t\t\t/\\/\\+[\\s\\S]*?\\+\\//.source,\n\t\t\t].join('|')\n\t\t),\n\t\t'string': {\n\t\t\tpattern: /'(?:''|[^'\\r\\n])*'(?!')|\"(?:\"\"|[^\"\\r\\n])*\"(?!\")/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'variable': /%\\w+/,\n\t\t'function-definition': {\n\t\t\tpattern: /((?:^|[^\\w-])(?:function|method)\\s+)\\w+/i,\n\t\t\tlookbehind: true,\n\t\t\talias: 'function',\n\t\t},\n\t\t'class-name': {\n\t\t\tpattern:\n\t\t\t\t/((?:^|[^-\\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\\s+)\\w+(?::\\w+)*/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /:/,\n\t\t\t},\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|if|implements|import|instance|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\\b/i,\n\t\t'operator-keyword': {\n\t\t\tpattern: /\\b(?:and|not|or)\\b/i,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'function': /[_a-z]\\w*(?=\\s*\\()/i,\n\n\t\t'boolean': /\\b(?:false|true)\\b/i,\n\t\t'number': /\\b\\d+(?:\\.\\d+)?\\b/,\n\t\t'operator': /<>|[<>]=?|!=|\\*\\*|[-+*/|=@]/,\n\t\t'punctuation': /[:.;,()[\\]]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/perl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'perl'>} */\nexport default {\n\tid: 'perl',\n\tgrammar () {\n\t\tconst brackets =\n\t\t\t/(?:\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)|\\{(?:[^{}\\\\]|\\\\[\\s\\S])*\\}|\\[(?:[^[\\]\\\\]|\\\\[\\s\\S])*\\]|<(?:[^<>\\\\]|\\\\[\\s\\S])*>)/\n\t\t\t\t.source;\n\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\t// POD\n\t\t\t\t\tpattern: /(^\\s*)=\\w[\\s\\S]*?=cut.*/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\\\$])#.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t// TODO Could be nice to handle Heredoc too.\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/\\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\\s*/.source +\n\t\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t// q/.../\n\t\t\t\t\t\t\t\t/([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[\\s\\S])*\\1/.source,\n\n\t\t\t\t\t\t\t\t// q a...a\n\t\t\t\t\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\t\t\t\t\t/([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[\\s\\S])*\\2/.source, // eslint-disable-line regexp/strict\n\n\t\t\t\t\t\t\t\t// q(...)\n\t\t\t\t\t\t\t\t// q{...}\n\t\t\t\t\t\t\t\t// q[...]\n\t\t\t\t\t\t\t\t// q<...>\n\t\t\t\t\t\t\t\tbrackets,\n\t\t\t\t\t\t\t].join('|') +\n\t\t\t\t\t\t\t')'\n\t\t\t\t\t),\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\n\t\t\t\t// \"...\", `...`\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\"|`)(?:(?!\\1)[^\\\\]|\\\\[\\s\\S])*\\1/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\n\t\t\t\t// '...'\n\t\t\t\t// FIXME Multi-line single-quoted strings are not supported as they would break variables containing '\n\t\t\t\t{\n\t\t\t\t\tpattern: /'(?:[^'\\\\\\r\\n]|\\\\.)*'/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'regex': [\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/\\b(?:m|qr)(?![a-zA-Z0-9])\\s*/.source +\n\t\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t// m/.../\n\t\t\t\t\t\t\t\t/([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[\\s\\S])*\\1/.source,\n\n\t\t\t\t\t\t\t\t// m a...a\n\t\t\t\t\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\t\t\t\t\t/([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[\\s\\S])*\\2/.source, // eslint-disable-line regexp/strict\n\n\t\t\t\t\t\t\t\t// m(...)\n\t\t\t\t\t\t\t\t// m{...}\n\t\t\t\t\t\t\t\t// m[...]\n\t\t\t\t\t\t\t\t// m<...>\n\t\t\t\t\t\t\t\tbrackets,\n\t\t\t\t\t\t\t].join('|') +\n\t\t\t\t\t\t\t')' +\n\t\t\t\t\t\t\t/[msixpodualngc]*/.source\n\t\t\t\t\t),\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\n\t\t\t\t// The lookbehinds prevent -s from breaking\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/(^|[^-])\\b(?:s|tr|y)(?![a-zA-Z0-9])\\s*/.source +\n\t\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t// s/.../.../\n\t\t\t\t\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\t\t\t\t\t/([^a-zA-Z0-9\\s{([<])(?:(?!\\2)[^\\\\]|\\\\[\\s\\S])*\\2(?:(?!\\2)[^\\\\]|\\\\[\\s\\S])*\\2/ // eslint-disable-line regexp/strict\n\t\t\t\t\t\t\t\t\t.source,\n\n\t\t\t\t\t\t\t\t// s a...a...a\n\t\t\t\t\t\t\t\t// @ts-expect-error TS(2532): Ignore the non-existent capturing group error.\n\t\t\t\t\t\t\t\t/([a-zA-Z0-9])(?:(?!\\3)[^\\\\]|\\\\[\\s\\S])*\\3(?:(?!\\3)[^\\\\]|\\\\[\\s\\S])*\\3/ // eslint-disable-line regexp/strict\n\t\t\t\t\t\t\t\t\t.source,\n\n\t\t\t\t\t\t\t\t// s(...)(...)\n\t\t\t\t\t\t\t\t// s{...}{...}\n\t\t\t\t\t\t\t\t// s[...][...]\n\t\t\t\t\t\t\t\t// s<...><...>\n\t\t\t\t\t\t\t\t// s(...)[...]\n\t\t\t\t\t\t\t\tbrackets + /\\s*/.source + brackets,\n\t\t\t\t\t\t\t].join('|') +\n\t\t\t\t\t\t\t')' +\n\t\t\t\t\t\t\t/[msixpodualngcer]*/.source\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\n\t\t\t\t// /.../\n\t\t\t\t// The look-ahead tries to prevent two divisions on\n\t\t\t\t// the same line from being highlighted as regex.\n\t\t\t\t// This does not support multi-line regex.\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\/(?:[^\\/\\\\\\r\\n]|\\\\.)*\\/[msixpodualngc]*(?=\\s*(?:$|[\\r\\n,.;})&|\\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\\b))/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t// FIXME Not sure about the handling of ::, ', and #\n\t\t\t'variable': [\n\t\t\t\t// ${^POSTMATCH}\n\t\t\t\t/[&*$@%]\\{\\^[A-Z]+\\}/,\n\t\t\t\t// $^V\n\t\t\t\t/[&*$@%]\\^[A-Z_]/,\n\t\t\t\t// ${...}\n\t\t\t\t/[&*$@%]#?(?=\\{)/,\n\t\t\t\t// $foo\n\t\t\t\t/[&*$@%]#?(?:(?:::)*'?(?!\\d)[\\w$]+(?![\\w$]))+(?:::)*/,\n\t\t\t\t// $1\n\t\t\t\t/[&*$@%]\\d+/,\n\t\t\t\t// $_, @_, %!\n\t\t\t\t// The negative lookahead prevents from breaking the %= operator\n\t\t\t\t/(?!%=)[$@%][!\"#$%&'()*+,\\-.\\/:;<=>?@[\\\\\\]^_`{|}~]/,\n\t\t\t],\n\t\t\t'filehandle': {\n\t\t\t\t// <>, <FOO>, _\n\t\t\t\tpattern: /<(?![<=])\\S*?>|\\b_\\b/,\n\t\t\t\talias: 'symbol',\n\t\t\t},\n\t\t\t'v-string': {\n\t\t\t\t// v1.2, 1.2.3\n\t\t\t\tpattern: /v\\d+(?:\\.\\d+)*|\\d+(?:\\.\\d+){2,}/,\n\t\t\t\talias: 'string',\n\t\t\t},\n\t\t\t'function': {\n\t\t\t\tpattern: /(\\bsub[ \\t]+)\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\\b/,\n\t\t\t'number':\n\t\t\t\t/\\b(?:0x[\\dA-Fa-f](?:_?[\\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\\d(?:_?\\d)*)?\\.)?\\d(?:_?\\d)*(?:[Ee][+-]?\\d+)?)\\b/,\n\t\t\t'operator':\n\t\t\t\t/-[rwxoRWXOezsfdlpSbctugkTBMAC]\\b|\\+[+=]?|-[-=>]?|\\*\\*?=?|\\/\\/?=?|=[=~>]?|~[~=]?|\\|\\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\\.(?:=|\\.\\.?)?|[\\\\?]|\\bx(?:=|\\b)|\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\\b/,\n\t\t\t'punctuation': /[{}[\\];(),:]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/php-extras.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'php-extras'>} */\nexport default {\n\tid: 'php-extras',\n\tgrammar: {\n\t\t'this': {\n\t\t\tpattern: /\\$this\\b/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'global':\n\t\t\t/\\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\\b/,\n\t\t'scope': {\n\t\t\tpattern: /\\b[\\w\\\\]+::/,\n\t\t\tinside: {\n\t\t\t\t'keyword': /\\b(?:parent|self|static)\\b/,\n\t\t\t\t'punctuation': /::|\\\\/,\n\t\t\t},\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/php.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport { insertBefore } from '../util/language-util.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'php'>} */\nexport default {\n\tid: 'php',\n\trequire: markup,\n\toptional: 'php-extras',\n\tgrammar ({ getOptionalLanguage }) {\n\t\t/**\n\t\t * Original by Aaron Harun: http://aahacreative.com/2012/07/31/php-syntax-highlighting-prism/\n\t\t * Modified by Miles Johnson: http://milesj.me\n\t\t * Rewritten by Tom Pavelec\n\t\t *\n\t\t * Supports PHP 5.3 - 8.0\n\t\t */\n\t\tconst comment = /\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*|#(?!\\[).*/;\n\t\tconst constant = [\n\t\t\t{\n\t\t\t\tpattern: /\\b(?:false|true)\\b/i,\n\t\t\t\talias: 'boolean',\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(::\\s*)\\b[a-z_]\\w*\\b(?!\\s*\\()/i,\n\t\t\t\tgreedy: true,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(\\b(?:case|const)\\s+)\\b[a-z_]\\w*(?=\\s*[;=])/i,\n\t\t\t\tgreedy: true,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t/\\b(?:null)\\b/i,\n\t\t\t/\\b[A-Z_][A-Z0-9_]*\\b(?!\\s*\\()/,\n\t\t];\n\t\tconst number =\n\t\t\t/\\b0b[01]+(?:_[01]+)*\\b|\\b0o[0-7]+(?:_[0-7]+)*\\b|\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b|(?:\\b\\d+(?:_\\d+)*\\.?(?:\\d+(?:_\\d+)*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i;\n\t\tconst operator =\n\t\t\t/<?=>|\\?\\?=?|\\.{3}|\\??->|[!=]=?=?|::|\\*\\*=?|--|\\+\\+|&&|\\|\\||<<|>>|[?~]|[/^|%*&<>.+-]=?/;\n\t\tconst punctuation = /[{}\\[\\](),:;]/;\n\n\t\tconst php = {\n\t\t\t'delimiter': {\n\t\t\t\tpattern: /\\?>$|^<\\?(?:php(?=\\s)|=)?/i,\n\t\t\t\talias: 'important',\n\t\t\t},\n\t\t\t'doc-comment': {\n\t\t\t\tpattern: /\\/\\*\\*(?!\\/)[\\s\\S]*?\\*\\//,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'comment',\n\t\t\t\tinside: 'phpdoc',\n\t\t\t},\n\t\t\t'comment': comment,\n\t\t\t'variable': /\\$+(?:\\w+\\b|(?=\\{))/,\n\t\t\t'package': {\n\t\t\t\tpattern: /(namespace\\s+|use\\s+(?:function\\s+)?)(?:\\\\?\\b[a-z_]\\w*)+\\b(?!\\\\)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /\\\\/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'class-name-definition': {\n\t\t\t\tpattern: /(\\b(?:class|enum|interface|trait)\\s+)\\b[a-z_]\\w*(?!\\\\)\\b/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'class-name',\n\t\t\t},\n\t\t\t'function-definition': {\n\t\t\t\tpattern: /(\\bfunction\\s+)[a-z_]\\w*(?=\\s*\\()/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'keyword': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(\\(\\s*)\\b(?:array|bool|boolean|float|int|integer|object|string)\\b(?=\\s*\\))/i,\n\t\t\t\t\talias: 'type-casting',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/([(,?]\\s*)\\b(?:array(?!\\s*\\()|bool|callable|(?:false|null)(?=\\s*\\|)|float|int|iterable|mixed|object|self|static|string)\\b(?=\\s*\\$)/i,\n\t\t\t\t\talias: 'type-hint',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(\\)\\s*:\\s*(?:\\?\\s*)?)\\b(?:array(?!\\s*\\()|bool|callable|(?:false|null)(?=\\s*\\|)|float|int|iterable|mixed|never|object|self|static|string|void)\\b/i,\n\t\t\t\t\talias: 'return-type',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b(?:array(?!\\s*\\()|bool|float|int|iterable|mixed|object|string|void)\\b/i,\n\t\t\t\t\talias: 'type-declaration',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\|\\s*)(?:false|null)\\b|\\b(?:false|null)(?=\\s*\\|)/i,\n\t\t\t\t\talias: 'type-declaration',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\b(?:parent|self|static)(?=\\s*::)/i,\n\t\t\t\t\talias: 'static-context',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// yield from\n\t\t\t\t\tpattern: /(\\byield\\s+)from\\b/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t// `class` is always a keyword unlike other keywords\n\t\t\t\t/\\bclass\\b/i,\n\t\t\t\t{\n\t\t\t\t\t// https://www.php.net/manual/en/reserved.keywords.php\n\t\t\t\t\t//\n\t\t\t\t\t// keywords cannot be preceded by \"->\"\n\t\t\t\t\t// the complex lookbehind means `(?<!(?:->|::)\\s*)`\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:^|[^\\s>:]|(?:^|[^-])>|(?:^|[^:]):)\\s*)\\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\\b/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'argument-name': {\n\t\t\t\tpattern: /([(,]\\s*)\\b[a-z_]\\w*(?=\\s*:(?!:))/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(\\b(?:extends|implements|instanceof|new(?!\\s+self|\\s+static))\\s+|\\bcatch\\s*\\()\\b[a-z_]\\w*(?!\\\\)\\b/i,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\|\\s*)\\b[a-z_]\\w*(?!\\\\)\\b/i,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\b[a-z_]\\w*(?!\\\\)\\b(?=\\s*\\|)/i,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\|\\s*)(?:\\\\?\\b[a-z_]\\w*)+\\b/i,\n\t\t\t\t\talias: 'class-name-fully-qualified',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\\\/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(?:\\\\?\\b[a-z_]\\w*)+\\b(?=\\s*\\|)/i,\n\t\t\t\t\talias: 'class-name-fully-qualified',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\\\/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(\\b(?:extends|implements|instanceof|new(?!\\s+self\\b|\\s+static\\b))\\s+|\\bcatch\\s*\\()(?:\\\\?\\b[a-z_]\\w*)+\\b(?!\\\\)/i,\n\t\t\t\t\talias: 'class-name-fully-qualified',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\\\/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\b[a-z_]\\w*(?=\\s*\\$)/i,\n\t\t\t\t\talias: 'type-declaration',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(?:\\\\?\\b[a-z_]\\w*)+(?=\\s*\\$)/i,\n\t\t\t\t\talias: ['class-name-fully-qualified', 'type-declaration'],\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\\\/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\b[a-z_]\\w*(?=\\s*::)/i,\n\t\t\t\t\talias: 'static-context',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(?:\\\\?\\b[a-z_]\\w*)+(?=\\s*::)/i,\n\t\t\t\t\talias: ['class-name-fully-qualified', 'static-context'],\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\\\/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /([(,?]\\s*)[a-z_]\\w*(?=\\s*\\$)/i,\n\t\t\t\t\talias: 'type-hint',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /([(,?]\\s*)(?:\\\\?\\b[a-z_]\\w*)+(?=\\s*\\$)/i,\n\t\t\t\t\talias: ['class-name-fully-qualified', 'type-hint'],\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\\\/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\)\\s*:\\s*(?:\\?\\s*)?)\\b[a-z_]\\w*(?!\\\\)\\b/i,\n\t\t\t\t\talias: 'return-type',\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\)\\s*:\\s*(?:\\?\\s*)?)(?:\\\\?\\b[a-z_]\\w*)+\\b(?!\\\\)/i,\n\t\t\t\t\talias: ['class-name-fully-qualified', 'return-type'],\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\\\/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'constant': constant,\n\t\t\t'function': {\n\t\t\t\tpattern: /(^|[^\\\\\\w])\\\\?[a-z_](?:[\\w\\\\]*\\w)?(?=\\s*\\()/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /\\\\/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'property': {\n\t\t\t\tpattern: /(->\\s*)\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'number': number,\n\t\t\t'operator': operator,\n\t\t\t'punctuation': punctuation,\n\t\t};\n\n\t\tconst string_interpolation = {\n\t\t\tpattern:\n\t\t\t\t/\\{\\$(?:\\{(?:\\{[^{}]+\\}|[^{}]+)\\}|[^{}])+\\}|(^|[^\\\\{])\\$+(?:\\w+(?:\\[[^\\r\\n\\[\\]]+\\]|->\\w+)?)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: 'php',\n\t\t};\n\n\t\tconst string = [\n\t\t\t{\n\t\t\t\tpattern: /<<<'([^']+)'[\\r\\n](?:.*[\\r\\n])*?\\1;/,\n\t\t\t\talias: 'nowdoc-string',\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\tpattern: /^<<<'[^']+'|[a-z_]\\w*;$/i,\n\t\t\t\t\t\talias: 'symbol',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /^<<<'?|[';]$/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/<<<(?:\"([^\"]+)\"[\\r\\n](?:.*[\\r\\n])*?\\1;|([a-z_]\\w*)[\\r\\n](?:.*[\\r\\n])*?\\2;)/i,\n\t\t\t\talias: 'heredoc-string',\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\tpattern: /^<<<(?:\"[^\"]+\"|[a-z_]\\w*)|[a-z_]\\w*;$/i,\n\t\t\t\t\t\talias: 'symbol',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /^<<<\"?|[\";]$/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'interpolation': string_interpolation,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /`(?:\\\\[\\s\\S]|[^\\\\`])*`/,\n\t\t\t\talias: 'backtick-quoted-string',\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /'(?:\\\\[\\s\\S]|[^\\\\'])*'/,\n\t\t\t\talias: 'single-quoted-string',\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"/,\n\t\t\t\talias: 'double-quoted-string',\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation': string_interpolation,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tinsertBefore(php, 'variable', {\n\t\t\t'string': string,\n\t\t\t'attribute': {\n\t\t\t\tpattern:\n\t\t\t\t\t/#\\[(?:[^\"'\\/#]|\\/(?![*/])|\\/\\/.*$|#(?!\\[).*$|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"|'(?:\\\\[\\s\\S]|[^\\\\'])*')+\\](?=\\s*[a-z$#])/im,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'attribute-content': {\n\t\t\t\t\t\tpattern: /^(#\\[)[\\s\\S]+(?=\\]$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t// inside can appear subset of php\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'comment': comment,\n\t\t\t\t\t\t\t'string': string,\n\t\t\t\t\t\t\t'attribute-class-name': [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpattern: /([^:]|^)\\b[a-z_]\\w*(?!\\\\)\\b/i,\n\t\t\t\t\t\t\t\t\talias: 'class-name',\n\t\t\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpattern: /([^:]|^)(?:\\\\?\\b[a-z_]\\w*)+/i,\n\t\t\t\t\t\t\t\t\talias: ['class-name', 'class-name-fully-qualified'],\n\t\t\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t\t'punctuation': /\\\\/,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t'constant': constant,\n\t\t\t\t\t\t\t'number': number,\n\t\t\t\t\t\t\t'operator': operator,\n\t\t\t\t\t\t\t'punctuation': punctuation,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\tpattern: /^#\\[|\\]$/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst extras = getOptionalLanguage('php-extras');\n\t\tif (extras) {\n\t\t\tinsertBefore(php, 'variable', /** @type {GrammarTokens} */ (extras));\n\t\t}\n\n\t\tconst embedded = embeddedIn('markup');\n\t\treturn /** @type {Grammar} */ ({\n\t\t\t'php': {\n\t\t\t\tpattern:\n\t\t\t\t\t/<\\?(?:[^\"'/#]|\\/(?![*/])|(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|(?:\\/\\/|#(?!\\[))(?:[^?\\n\\r]|\\?(?!>))*(?=$|\\?>|[\\r\\n])|#\\[|\\/\\*(?:[^*]|\\*(?!\\/))*(?:\\*\\/|$))*?(?:\\?>|$)/,\n\t\t\t\tinside: php,\n\t\t\t},\n\t\t\t/** @type {Grammar['$tokenize']} */\n\t\t\t$tokenize: (code, grammar, Prism) => {\n\t\t\t\tif (!/<\\?/.test(code)) {\n\t\t\t\t\treturn Prism.tokenize(code, php);\n\t\t\t\t}\n\n\t\t\t\treturn embedded(code, grammar, Prism);\n\t\t\t},\n\t\t});\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n * @typedef {import('../types.d.ts').GrammarTokens} GrammarTokens\n */\n"
  },
  {
    "path": "src/languages/phpdoc.js",
    "content": "import javadoclike from './javadoclike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'phpdoc'>} */\nexport default {\n\tid: 'phpdoc',\n\tbase: javadoclike,\n\tgrammar () {\n\t\tconst typeExpression = /(?:\\b[a-zA-Z]\\w*|[|\\\\[\\]])+/.source;\n\n\t\treturn {\n\t\t\t'parameter': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t'(@(?:global|param|property(?:-read|-write)?|var)\\\\s+(?:' +\n\t\t\t\t\t\ttypeExpression +\n\t\t\t\t\t\t'\\\\s+)?)\\\\$\\\\w+'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t$insert: {\n\t\t\t\t'class-name': {\n\t\t\t\t\t$before: 'keyword',\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t'(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\\\s+)' +\n\t\t\t\t\t\t\ttypeExpression\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'keyword':\n\t\t\t\t\t\t\t/\\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\\b/,\n\t\t\t\t\t\t'punctuation': /[|\\\\[\\]()]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/plain.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'plain'>} */\nexport default {\n\tid: 'plain',\n\talias: ['text', 'txt', 'plaintext'],\n\tgrammar: {},\n};\n"
  },
  {
    "path": "src/languages/plant-uml.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'plant-uml'>} */\nexport default {\n\tid: 'plant-uml',\n\talias: 'plantuml',\n\tgrammar () {\n\t\tconst variable = /\\$\\w+|%[a-z]+%/;\n\n\t\tconst arrowAttr = /\\[[^[\\]]*\\]/.source;\n\t\tconst arrowDirection = /(?:[drlu]|do|down|le|left|ri|right|up)/.source;\n\t\tconst arrowBody =\n\t\t\t'(?:-+' +\n\t\t\tarrowDirection +\n\t\t\t'-+|\\\\.+' +\n\t\t\tarrowDirection +\n\t\t\t'\\\\.+|-+(?:' +\n\t\t\tarrowAttr +\n\t\t\t'-*)?|' +\n\t\t\tarrowAttr +\n\t\t\t'-+|\\\\.+(?:' +\n\t\t\tarrowAttr +\n\t\t\t'\\\\.*)?|' +\n\t\t\tarrowAttr +\n\t\t\t'\\\\.+)';\n\t\tconst arrowLeft = /(?:<{1,2}|\\/{1,2}|\\\\{1,2}|<\\||[#*^+}xo])/.source;\n\t\tconst arrowRight = /(?:>{1,2}|\\/{1,2}|\\\\{1,2}|\\|>|[#*^+{xo])/.source;\n\t\tconst arrowPrefix = /[[?]?[ox]?/.source;\n\t\tconst arrowSuffix = /[ox]?[\\]?]?/.source;\n\t\tconst arrow =\n\t\t\tarrowPrefix +\n\t\t\t'(?:' +\n\t\t\tarrowBody +\n\t\t\tarrowRight +\n\t\t\t'|' +\n\t\t\tarrowLeft +\n\t\t\tarrowBody +\n\t\t\t'(?:' +\n\t\t\tarrowRight +\n\t\t\t')?' +\n\t\t\t')' +\n\t\t\tarrowSuffix;\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^[ \\t]*)(?:'.*|\\/'[\\s\\S]*?'\\/)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'preprocessor': {\n\t\t\t\tpattern: /(^[ \\t]*)!.*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'property',\n\t\t\t\tinside: {\n\t\t\t\t\t'variable': variable,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'delimiter': {\n\t\t\t\tpattern: /(^[ \\t]*)@(?:end|start)uml\\b/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\n\t\t\t'arrow': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/(^|[^-.<>?|\\\\[\\]ox])/.source + arrow + /(?![-.<>?|\\\\\\]ox])/.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'operator',\n\t\t\t\tinside: {\n\t\t\t\t\t'expression': {\n\t\t\t\t\t\tpattern: /(\\[)[^[\\]]+(?=\\])/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: 'plant-uml',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /\\[(?=$|\\])|^\\]/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"]*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'text': {\n\t\t\t\tpattern: /(\\[[ \\t]*[\\r\\n]+(?![\\r\\n]))[^\\]]*(?=\\])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'string',\n\t\t\t},\n\n\t\t\t'keyword': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/^([ \\t]*)(?:abstract\\s+class|end\\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|header|hexagon|hide|[hr]?note|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\\/|while)(?=\\s|$)/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t/\\b(?:elseif|equals|not|while)(?=\\s*\\()/,\n\t\t\t\t/\\b(?:as|is|then)\\b/,\n\t\t\t],\n\n\t\t\t'divider': {\n\t\t\t\tpattern: /^==.+==$/m,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'important',\n\t\t\t},\n\n\t\t\t'time': {\n\t\t\t\tpattern: /@(?:\\d+(?:[:/]\\d+){2}|[+-]?\\d+|:[a-z]\\w*(?:[+-]\\d+)?)\\b/i,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'number',\n\t\t\t},\n\n\t\t\t'color': {\n\t\t\t\tpattern: /#(?:[a-z_]+|[a-fA-F0-9]+)\\b/,\n\t\t\t\talias: 'symbol',\n\t\t\t},\n\t\t\t'variable': variable,\n\n\t\t\t'punctuation': /[:,;()[\\]{}]|\\.{3}/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/plsql.js",
    "content": "import sql from './sql.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'plsql'>} */\nexport default {\n\tid: 'plsql',\n\tbase: sql,\n\tgrammar () {\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\*[\\s\\S]*?\\*\\/|--.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t// https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-reserved-words-keywords.html\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\\b/i,\n\t\t\t// https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-language-fundamentals.html#GUID-96A42F7C-7A71-4B90-8255-CA9C8BD9722E\n\t\t\t'operator': /:=?|=>|[<>^~!]=|\\.\\.|\\|\\||\\*\\*|[-+*/%<>=@]/,\n\t\t\t$insert: {\n\t\t\t\t'label': {\n\t\t\t\t\t$before: 'operator',\n\t\t\t\t\tpattern: /<<\\s*\\w+\\s*>>/,\n\t\t\t\t\talias: 'symbol',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/powerquery.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'powerquery'>} */\nexport default {\n\tid: 'powerquery',\n\talias: ['pq', 'mscript'],\n\tgrammar () {\n\t\t// https://docs.microsoft.com/en-us/powerquery-m/power-query-m-language-specification\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'quoted-identifier': {\n\t\t\t\tpattern: /#\"(?:[^\"\\r\\n]|\"\")*\"(?!\")/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /(?:#!)?\"(?:[^\"\\r\\n]|\"\")*\"(?!\")/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'constant': [\n\t\t\t\t/\\bDay\\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\\b/,\n\t\t\t\t/\\bTraceLevel\\.(?:Critical|Error|Information|Verbose|Warning)\\b/,\n\t\t\t\t/\\bOccurrence\\.(?:All|First|Last)\\b/,\n\t\t\t\t/\\bOrder\\.(?:Ascending|Descending)\\b/,\n\t\t\t\t/\\bRoundingMode\\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\\b/,\n\t\t\t\t/\\bMissingField\\.(?:Error|Ignore|UseNull)\\b/,\n\t\t\t\t/\\bQuoteStyle\\.(?:Csv|None)\\b/,\n\t\t\t\t/\\bJoinKind\\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\\b/,\n\t\t\t\t/\\bGroupKind\\.(?:Global|Local)\\b/,\n\t\t\t\t/\\bExtraValues\\.(?:Error|Ignore|List)\\b/,\n\t\t\t\t/\\bJoinAlgorithm\\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\\b/,\n\t\t\t\t/\\bJoinSide\\.(?:Left|Right)\\b/,\n\t\t\t\t/\\bPrecision\\.(?:Decimal|Double)\\b/,\n\t\t\t\t/\\bRelativePosition\\.From(?:End|Start)\\b/,\n\t\t\t\t/\\bTextEncoding\\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\\b/,\n\t\t\t\t/\\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\\.Type\\b/,\n\t\t\t\t/\\bnull\\b/,\n\t\t\t],\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\\b/,\n\t\t\t'function': {\n\t\t\t\tpattern: /(^|[^#\\w.])[a-z_][\\w.]*(?=\\s*\\()/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'data-type': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\\b/,\n\t\t\t\talias: 'class-name',\n\t\t\t},\n\t\t\t'number': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b0x[\\da-f]+\\b|(?:[+-]?(?:\\b\\d+\\.)?\\b\\d+|[+-]\\.\\d+|(^|[^.])\\B\\.\\d+)(?:e[+-]?\\d+)?\\b/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'operator': /[-+*\\/&?@^]|<(?:=>?|>)?|>=?|=>?|\\.\\.\\.?/,\n\t\t\t'punctuation': /[,;\\[\\](){}]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/powershell.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'powershell'>} */\nexport default {\n\tid: 'powershell',\n\tgrammar () {\n\t\tconst boolean = /\\$(?:false|true)\\b/i;\n\t\tconst variable = /\\$\\w+\\b/;\n\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^`])<#[\\s\\S]*?#>/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^`])#.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /\"(?:`[\\s\\S]|[^`\"])*\"/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'function': {\n\t\t\t\t\t\t\t// Allow for one level of nesting\n\t\t\t\t\t\t\tpattern: /(^|[^`])\\$\\((?:\\$\\([^\\r\\n()]*\\)|(?!\\$\\()[^\\r\\n)])*\\)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: 'powershell',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'boolean': boolean,\n\t\t\t\t\t\t'variable': variable,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /'(?:[^']|'')*'/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t// Matches name spaces as well as casts, attribute decorators. Force starting with letter to avoid matching array indices\n\t\t\t// Supports two levels of nested brackets (e.g. `[OutputType([System.Collections.Generic.List[int]])]`)\n\t\t\t'namespace': /\\[[a-z](?:\\[(?:\\[[^\\]]*\\]|[^\\[\\]])*\\]|[^\\[\\]])*\\]/i,\n\t\t\t'boolean': boolean,\n\t\t\t'variable': variable,\n\t\t\t// Cmdlets and aliases. Aliases should come last, otherwise \"write\" gets preferred over \"write-host\" for example\n\t\t\t// Get-Command | ?{ $_.ModuleName -match \"Microsoft.PowerShell.(Util|Core|Management)\" }\n\t\t\t// Get-Alias | ?{ $_.ReferencedCommand.Module.Name -match \"Microsoft.PowerShell.(Util|Core|Management)\" }\n\t\t\t'function': [\n\t\t\t\t/\\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\\b/i,\n\t\t\t\t/\\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\\b/i,\n\t\t\t],\n\t\t\t// per http://technet.microsoft.com/en-us/library/hh847744.aspx\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\\b/i,\n\t\t\t'operator': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|\\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\\b|-[-=]?|\\+[+=]?|[*\\/%]=?)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'punctuation': /[|{}[\\];(),.]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/processing.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'processing'>} */\nexport default {\n\tid: 'processing',\n\tbase: clike,\n\tgrammar () {\n\t\treturn {\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\\b/,\n\t\t\t// Spaces are allowed between function name and parenthesis\n\t\t\t'function': /\\b\\w+(?=\\s*\\()/,\n\t\t\t'operator': /<[<=]?|>[>=]?|&&?|\\|\\|?|[%?]|[!=+\\-*\\/]=?/,\n\t\t\t$insertBefore: {\n\t\t\t\t'number': {\n\t\t\t\t\t// Special case: XML is a type\n\t\t\t\t\t'constant': /\\b(?!XML\\b)[A-Z][A-Z\\d_]+\\b/,\n\t\t\t\t\t'type': {\n\t\t\t\t\t\tpattern: /\\b(?:boolean|byte|char|color|double|float|int|[A-Z]\\w*)\\b/,\n\t\t\t\t\t\talias: 'class-name',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/prolog.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'prolog'>} */\nexport default {\n\tid: 'prolog',\n\tgrammar: {\n\t\t// Syntax depends on the implementation\n\t\t'comment': {\n\t\t\tpattern: /\\/\\*[\\s\\S]*?\\*\\/|%.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t// Depending on the implementation, strings may allow escaped newlines and quote-escape\n\t\t'string': {\n\t\t\tpattern: /([\"'])(?:\\1\\1|\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1(?!\\1)/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'builtin': /\\b(?:fx|fy|xf[xy]?|yfx?)\\b/,\n\t\t// FIXME: Should we list all null-ary predicates (not followed by a parenthesis) like halt, trace, etc.?\n\t\t'function': /\\b[a-z]\\w*(?:(?=\\()|\\/\\d+)/,\n\t\t'number': /\\b\\d+(?:\\.\\d*)?/,\n\t\t// Custom operators are allowed\n\t\t'operator': /[:\\\\=><\\-?*@\\/;+^|!$.]+|\\b(?:is|mod|not|xor)\\b/,\n\t\t'punctuation': /[(){}\\[\\],]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/promql.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'promql'>} */\nexport default {\n\tid: 'promql',\n\tgrammar () {\n\t\t// Thanks to: https://github.com/prometheus-community/monaco-promql/blob/master/src/promql/promql.ts\n\t\t// As well as: https://kausal.co/blog/slate-prism-add-new-syntax-promql/\n\n\t\t// PromQL Aggregation Operators\n\t\t// (https://prometheus.io/docs/prometheus/latest/querying/operators/#aggregation-operators)\n\t\tconst aggregations = [\n\t\t\t'sum',\n\t\t\t'min',\n\t\t\t'max',\n\t\t\t'avg',\n\t\t\t'group',\n\t\t\t'stddev',\n\t\t\t'stdvar',\n\t\t\t'count',\n\t\t\t'count_values',\n\t\t\t'bottomk',\n\t\t\t'topk',\n\t\t\t'quantile',\n\t\t];\n\n\t\t// PromQL vector matching + the by and without clauses\n\t\t// (https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching)\n\t\tconst vectorMatching = ['on', 'ignoring', 'group_right', 'group_left', 'by', 'without'];\n\n\t\t// PromQL offset modifier\n\t\t// (https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier)\n\t\tconst offsetModifier = ['offset'];\n\n\t\tconst keywords = aggregations.concat(vectorMatching, offsetModifier);\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^[ \\t]*)#.*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'vector-match': {\n\t\t\t\t// Match the comma-separated label lists inside vector matching:\n\t\t\t\tpattern: new RegExp('((?:' + vectorMatching.join('|') + ')\\\\s*)\\\\([^)]*\\\\)'),\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'label-key': {\n\t\t\t\t\t\tpattern: /\\b[^,]+\\b/,\n\t\t\t\t\t\talias: 'attr-name',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /[(),]/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'context-labels': {\n\t\t\t\tpattern: /\\{[^{}]*\\}/,\n\t\t\t\tinside: {\n\t\t\t\t\t'label-key': {\n\t\t\t\t\t\tpattern: /\\b[a-z_]\\w*(?=\\s*(?:=|![=~]))/,\n\t\t\t\t\t\talias: 'attr-name',\n\t\t\t\t\t},\n\t\t\t\t\t'label-value': {\n\t\t\t\t\t\tpattern: /([\"'`])(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\talias: 'attr-value',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /\\{|\\}|=~?|![=~]|,/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'context-range': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\[[\\w\\s:]+\\]/, // [1m]\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\[|\\]|:/,\n\t\t\t\t\t\t'range-duration': {\n\t\t\t\t\t\t\tpattern: /\\b(?:\\d+(?:[smhdwy]|ms))+\\b/i,\n\t\t\t\t\t\t\talias: 'number',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\boffset\\s+)\\w+/, // offset 1m\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'range-duration': {\n\t\t\t\t\t\t\tpattern: /\\b(?:\\d+(?:[smhdwy]|ms))+\\b/i,\n\t\t\t\t\t\t\talias: 'number',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword': new RegExp('\\\\b(?:' + keywords.join('|') + ')\\\\b', 'i'),\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\t\t\t'number':\n\t\t\t\t/[-+]?(?:(?:\\b\\d+(?:\\.\\d+)?|\\B\\.\\d+)(?:e[-+]?\\d+)?\\b|\\b(?:0x[0-9a-f]+|nan|inf)\\b)/i,\n\t\t\t'operator': /[\\^*/%+-]|==|!=|<=|<|>=|>|\\b(?:and|or|unless)\\b/i,\n\t\t\t'punctuation': /[{};()`,.[\\]]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/properties.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'properties'>} */\nexport default {\n\tid: 'properties',\n\tgrammar: {\n\t\t'comment': /^[ \\t]*[#!].*$/m,\n\t\t'value': {\n\t\t\tpattern:\n\t\t\t\t/(^[ \\t]*(?:\\\\(?:\\r\\n|[\\s\\S])|[^\\\\\\s:=])+(?: *[=:] *(?! )| ))(?:\\\\(?:\\r\\n|[\\s\\S])|[^\\\\\\r\\n])+/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'attr-value',\n\t\t},\n\t\t'key': {\n\t\t\tpattern: /^[ \\t]*(?:\\\\(?:\\r\\n|[\\s\\S])|[^\\\\\\s:=])+(?= *[=:]| )/m,\n\t\t\talias: 'attr-name',\n\t\t},\n\t\t'punctuation': /[=:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/protobuf.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'protobuf'>} */\nexport default {\n\tid: 'protobuf',\n\tbase: clike,\n\tgrammar () {\n\t\tconst builtinTypes =\n\t\t\t/\\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\\b/;\n\n\t\treturn {\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\b(?:enum|extend|message|service)\\s+)[A-Za-z_]\\w*(?=\\s*\\{)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(\\b(?:rpc\\s+\\w+|returns)\\s*\\(\\s*(?:stream\\s+)?)\\.?[A-Za-z_]\\w*(?:\\.[A-Za-z_]\\w*)*(?=\\s*\\))/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\\s+\\w)|service|stream|syntax|to)\\b(?!\\s*=\\s*\\d)/,\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\t\t\t$insertBefore: {\n\t\t\t\t'operator': {\n\t\t\t\t\t'map': {\n\t\t\t\t\t\tpattern: /\\bmap<\\s*[\\w.]+\\s*,\\s*[\\w.]+\\s*>(?=\\s+[a-z_]\\w*\\s*[=;])/i,\n\t\t\t\t\t\talias: 'class-name',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /[<>.,]/,\n\t\t\t\t\t\t\t'builtin': builtinTypes,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'builtin': builtinTypes,\n\t\t\t\t\t'positional-class-name': {\n\t\t\t\t\t\tpattern: /(?:\\b|\\B\\.)[a-z_]\\w*(?:\\.[a-z_]\\w*)*(?=\\s+[a-z_]\\w*\\s*[=;])/i,\n\t\t\t\t\t\talias: 'class-name',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'annotation': {\n\t\t\t\t\t\tpattern: /(\\[\\s*)[a-z_]\\w*(?=\\s*=)/i,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/psl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'psl'>} */\nexport default {\n\tid: 'psl',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /#.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:\\\\.|[^\\\\\"])*\"/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'symbol': /\\\\[ntrbA-Z\"\\\\]/,\n\t\t\t},\n\t\t},\n\t\t'heredoc-string': {\n\t\t\tpattern: /<<<([a-zA-Z_]\\w*)[\\r\\n](?:.*[\\r\\n])*?\\1\\b/,\n\t\t\talias: 'string',\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\\b/,\n\t\t'constant':\n\t\t\t/\\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SEP_HORIZ|R_SEP_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|VOID|WARN)\\b/,\n\t\t'boolean': /\\b(?:FALSE|False|NO|No|TRUE|True|YES|Yes|false|no|true|yes)\\b/,\n\t\t'variable': /\\b(?:PslDebug|errno|exit_status)\\b/,\n\t\t'builtin': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|_snmp_debug|acos|add_diary|annotate|annotate_get|ascii_to_ebcdic|asctime|asin|atan|atexit|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|date|dcget_text|destroy|destroy_lock|dget_text|difference|dump_hist|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|file|floor|fmod|fopen|fseek|ftell|full_discovery|get|get_chan_info|get_ranges|get_text|get_vars|getenv|gethostinfo|getpid|getpname|grep|history|history_get_retention|in_transition|index|int|internal|intersection|is_var|isnumber|join|kill|length|lines|lock|lock_info|log|log10|loge|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|nthargf|nthline|nthlinef|num_bytes|num_consoles|pconfig|popen|poplines|pow|print|printf|proc_exists|process|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|snmp_agent_config|snmp_agent_start|snmp_agent_stop|snmp_close|snmp_config|snmp_get|snmp_get_next|snmp_h_get|snmp_h_get_next|snmp_h_set|snmp_open|snmp_set|snmp_trap_ignore|snmp_trap_listen|snmp_trap_raise_std_trap|snmp_trap_receive|snmp_trap_register_im|snmp_trap_send|snmp_walk|sopen|sort|splitline|sprintf|sqrt|srandom|str_repeat|strcasecmp|subset|substr|system|tail|tan|tanh|text_domain|time|tmpnam|tolower|toupper|trace_psl_process|trim|union|unique|unlock|unset|va_arg|va_start|write)\\b/,\n\t\t\talias: 'builtin-function',\n\t\t},\n\t\t'foreach-variable': {\n\t\t\tpattern: /(\\bforeach\\s+(?:(?:\\w+\\b|\"(?:\\\\.|[^\\\\\"])*\")\\s+){0,2})[_a-zA-Z]\\w*(?=\\s*\\()/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'function': /\\b[_a-z]\\w*\\b(?=\\s*\\()/i,\n\t\t'number': /\\b(?:0x[0-9a-f]+|\\d+(?:\\.\\d+)?)\\b/i,\n\t\t'operator': /--|\\+\\+|&&=?|\\|\\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\\.|[:?]/,\n\t\t'punctuation': /[(){}\\[\\];,]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/pug.js",
    "content": "import javascript from './javascript.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'pug'>} */\nexport default {\n\tid: 'pug',\n\trequire: [markup, javascript],\n\tgrammar () {\n\t\t// TODO:\n\t\t// - Add CSS highlighting inside <style> tags\n\t\t// - Add support for multi-line code blocks\n\t\t// - Add support for interpolation #{} and !{}\n\t\t// - Add support for tag interpolation #[]\n\t\t// - Add explicit support for plain text using |\n\t\t// - Add support for markup embedded in plain text\n\n\t\tconst filter_pattern =\n\t\t\t/(^([\\t ]*)):<filter_name>(?:(?:\\r?\\n|\\r(?!\\n))(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+/.source;\n\n\t\t// Non exhaustive list of available filters and associated languages\n\t\tconst filters = [\n\t\t\t{ filter: 'atpl', language: 'twig' },\n\t\t\t{ filter: 'coffee', language: 'coffeescript' },\n\t\t\t'ejs',\n\t\t\t'handlebars',\n\t\t\t'less',\n\t\t\t'livescript',\n\t\t\t'markdown',\n\t\t\t{ filter: 'sass', language: 'scss' },\n\t\t\t'stylus',\n\t\t];\n\n\t\tconst all_filters = /** @type {import('../types.d.ts').GrammarTokens} */ ({});\n\t\tfor (const filterItem of filters) {\n\t\t\tconst { filter, language } =\n\t\t\t\ttypeof filterItem === 'string'\n\t\t\t\t\t? { filter: filterItem, language: filterItem }\n\t\t\t\t\t: filterItem;\n\t\t\tall_filters['filter-' + filter] = {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\tfilter_pattern.replace('<filter_name>', () => filter),\n\t\t\t\t\t'm'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'filter-name': {\n\t\t\t\t\t\tpattern: /^:[\\w-]+/,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t\t'text': {\n\t\t\t\t\t\tpattern: /\\S[\\s\\S]*/,\n\t\t\t\t\t\talias: [language, 'language-' + language],\n\t\t\t\t\t\tinside: language,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\t// Multiline stuff should appear before the rest\n\n\t\t\t// This handles both single-line and multi-line comments\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^([\\t ]*))\\/\\/.*(?:(?:\\r?\\n|\\r)\\2[\\t ].+)*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t// All the tag-related part is in lookbehind\n\t\t\t// so that it can be highlighted by the \"tag\" pattern\n\t\t\t'multiline-script': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^([\\t ]*)script\\b.*\\.[\\t ]*)(?:(?:\\r?\\n|\\r(?!\\n))(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: 'javascript',\n\t\t\t},\n\n\t\t\t// See at the end of the file for known filters\n\t\t\t'filter': {\n\t\t\t\tpattern: /(^([\\t ]*)):.+(?:(?:\\r?\\n|\\r(?!\\n))(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'filter-name': {\n\t\t\t\t\t\tpattern: /^:[\\w-]+/,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t\t'text': /\\S[\\s\\S]*/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'multiline-plain-text': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^([\\t ]*)[\\w\\-#.]+\\.[\\t ]*)(?:(?:\\r?\\n|\\r(?!\\n))(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'markup': {\n\t\t\t\tpattern: /(^[\\t ]*)<.+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: 'markup',\n\t\t\t},\n\t\t\t'doctype': {\n\t\t\t\tpattern: /((?:^|\\n)[\\t ]*)doctype(?: .+)?/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t// This handle all conditional and loop keywords\n\t\t\t'flow-control': {\n\t\t\t\tpattern: /(^[\\t ]*)(?:case|default|each|else|if|unless|when|while)\\b(?: .+)?/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'each': {\n\t\t\t\t\t\tpattern: /^each .+? in\\b/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'keyword': /\\b(?:each|in)\\b/,\n\t\t\t\t\t\t\t'punctuation': /,/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'branch': {\n\t\t\t\t\t\tpattern: /^(?:case|default|else|if|unless|when|while)\\b/,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t$rest: 'javascript',\n\t\t\t\t},\n\t\t\t},\n\t\t\t'keyword': {\n\t\t\t\tpattern: /(^[\\t ]*)(?:append|block|extends|include|prepend)\\b.+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'mixin': [\n\t\t\t\t// Declaration\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^[\\t ]*)mixin .+/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'keyword': /^mixin/,\n\t\t\t\t\t\t'function': /\\w+(?=\\s*\\(|\\s*$)/,\n\t\t\t\t\t\t'punctuation': /[(),.]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// Usage\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^[\\t ]*)\\+.+/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'name': {\n\t\t\t\t\t\t\tpattern: /^\\+\\w+/,\n\t\t\t\t\t\t\talias: 'function',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t$rest: 'javascript',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'script': {\n\t\t\t\tpattern: /(^[\\t ]*script(?:(?:&[^(]+)?\\([^)]+\\))*[\\t ]).+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: 'javascript',\n\t\t\t},\n\n\t\t\t'plain-text': {\n\t\t\t\tpattern: /(^[\\t ]*(?!-)[\\w\\-#.]*[\\w\\-](?:(?:&[^(]+)?\\([^)]+\\))*\\/?[\\t ]).+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'tag': {\n\t\t\t\tpattern: /(^[\\t ]*)(?!-)[\\w\\-#.]*[\\w\\-](?:(?:&[^(]+)?\\([^)]+\\))*\\/?:?/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'attributes': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /&[^(]+\\([^)]+\\)/,\n\t\t\t\t\t\t\tinside: 'javascript',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /\\([^)]+\\)/,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'attr-value': {\n\t\t\t\t\t\t\t\t\tpattern: /(=\\s*(?!\\s))(?:\\{[^}]*\\}|[^,)\\r\\n]+)/,\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t\tinside: 'javascript',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'attr-name': /[\\w-]+(?=\\s*!?=|\\s*[,)])/,\n\t\t\t\t\t\t\t\t'punctuation': /[!=(),]+/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'punctuation': /:/,\n\t\t\t\t\t'attr-id': /#[\\w\\-]+/,\n\t\t\t\t\t'attr-class': /\\.[\\w\\-]+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'code': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^[\\t ]*(?:-|!?=)).+/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'javascript',\n\t\t\t\t},\n\t\t\t],\n\t\t\t'punctuation': /[.\\-!=|]+/,\n\t\t\t$insertBefore: {\n\t\t\t\t'filter': all_filters,\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/puppet.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'puppet'>} */\nexport default {\n\tid: 'puppet',\n\tgrammar () {\n\t\tconst interpolation = [\n\t\t\t{\n\t\t\t\t// Allow for one nested level of braces inside interpolation\n\t\t\t\tpattern: /(^|[^\\\\])\\$\\{(?:[^'\"{}]|\\{[^}]*\\}|([\"'])(?:(?!\\2)[^\\\\]|\\\\[\\s\\S])*\\2)+\\}/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'short-variable': {\n\t\t\t\t\t\t// Negative look-ahead prevent wrong highlighting of functions\n\t\t\t\t\t\tpattern: /(^\\$\\{)(?!\\w+\\()(?:::)?\\w+(?:::\\w+)*/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /::/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\tpattern: /^\\$/,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t\t$rest: 'puppet',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\\\])\\$(?:::)?\\w+(?:::\\w+)*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'variable',\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /::/,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\treturn {\n\t\t\t'heredoc': [\n\t\t\t\t// Matches the content of a quoted heredoc string (subject to interpolation)\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(@\\(\"([^\"\\r\\n\\/):]+)\"(?:\\/[nrts$uL]*)?\\).*(?:\\r?\\n|\\r))(?:.*(?:\\r?\\n|\\r(?!\\n)))*?[ \\t]*(?:\\|[ \\t]*)?(?:-[ \\t]*)?\\2/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'string',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t// Matches the end tag\n\t\t\t\t\t\t'punctuation': /(?=\\S).*\\S(?= *$)/,\n\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// Matches the content of an unquoted heredoc string (no interpolation)\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(@\\(([^\"\\r\\n\\/):]+)(?:\\/[nrts$uL]*)?\\).*(?:\\r?\\n|\\r))(?:.*(?:\\r?\\n|\\r(?!\\n)))*?[ \\t]*(?:\\|[ \\t]*)?(?:-[ \\t]*)?\\2/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'string',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t// Matches the end tag\n\t\t\t\t\t\t'punctuation': /(?=\\S).*\\S(?= *$)/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// Matches the start tag of heredoc strings\n\t\t\t\t{\n\t\t\t\t\tpattern: /@\\(\"?(?:[^\"\\r\\n\\/):]+)\"?(?:\\/[nrts$uL]*)?\\)/,\n\t\t\t\t\talias: 'string',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': {\n\t\t\t\t\t\t\tpattern: /(\\().+?(?=\\))/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'multiline-comment': {\n\t\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'comment',\n\t\t\t},\n\t\t\t'regex': {\n\t\t\t\t// Must be prefixed with the keyword \"node\" or a non-word char\n\t\t\t\tpattern:\n\t\t\t\t\t/((?:\\bnode\\s+|[~=\\(\\[\\{,]\\s*|[=+]>\\s*|^\\s*))\\/(?:[^\\/\\\\]|\\\\[\\s\\S])+\\/(?:[imx]+\\b|\\B)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t// Extended regexes must have the x flag. They can contain single-line comments.\n\t\t\t\t\t'extended-regex': {\n\t\t\t\t\t\tpattern: /^\\/(?:[^\\/\\\\]|\\\\[\\s\\S])+\\/[im]*x[im]*$/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'comment': /#.*/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^|[^\\\\])#.*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\t// Allow for one nested level of double quotes inside interpolation\n\t\t\t\tpattern:\n\t\t\t\t\t/([\"'])(?:\\$\\{(?:[^'\"}]|([\"'])(?:(?!\\2)[^\\\\]|\\\\[\\s\\S])*\\2)+\\}|\\$(?!\\{)|(?!\\1)[^\\\\$]|\\\\[\\s\\S])*\\1/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'double-quoted': {\n\t\t\t\t\t\tpattern: /^\"[\\s\\S]*\"$/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'variable': {\n\t\t\t\tpattern: /\\$(?:::)?\\w+(?:::\\w+)*/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /::/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'attr-name': /(?:\\b\\w+|\\*)(?=\\s*=>)/,\n\t\t\t'function': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\.)(?!\\d)\\w+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t/\\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\\b|\\b(?!\\d)\\w+(?=\\()/,\n\t\t\t],\n\t\t\t'number': /\\b(?:0x[a-f\\d]+|\\d+(?:\\.\\d+)?(?:e-?\\d+)?)\\b/i,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t// Includes words reserved for future use\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\\b/,\n\t\t\t'datatype': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\\b/,\n\t\t\t\talias: 'symbol',\n\t\t\t},\n\t\t\t'operator':\n\t\t\t\t/=[=~>]?|![=~]?|<(?:<\\|?|[=~|-])?|>[>=]?|->?|~>|\\|>?>?|[*\\/%+?]|\\b(?:and|in|or)\\b/,\n\t\t\t'punctuation': /[\\[\\]{}().,;]|:+/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/pure.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'pure'>} */\nexport default {\n\tid: 'pure',\n\tgrammar () {\n\t\t// https://agraef.github.io/pure-docs/pure.html#lexical-matters\n\n\t\tconst inlineLang = {\n\t\t\tpattern: /%<[\\s\\S]+?%>/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'lang': {\n\t\t\t\t\tpattern: /(^%< *)-\\*-.+?-\\*-/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'comment',\n\t\t\t\t},\n\t\t\t\t'delimiter': {\n\t\t\t\t\tpattern: /^%<.*|%>$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t\t// C is the default inline language\n\t\t\t\t$rest: 'c',\n\t\t\t},\n\t\t};\n\n\t\tconst inlineLanguages = ['c', { lang: 'c++', alias: 'cpp' }, 'fortran'];\n\t\tconst inlineLanguageRe = /%< *-\\*- *<lang>\\d* *-\\*-[\\s\\S]+?%>/.source;\n\n\t\tconst insertBeforeInlineLang = [];\n\t\tinlineLanguages.forEach(item => {\n\t\t\tlet alias;\n\t\t\tlet lang;\n\t\t\tif (typeof item === 'string') {\n\t\t\t\talias = lang = item;\n\t\t\t}\n\t\t\telse {\n\t\t\t\talias = item.alias;\n\t\t\t\tlang = item.lang;\n\t\t\t}\n\n\t\t\tinsertBeforeInlineLang.push([\n\t\t\t\t['inline-lang-' + alias],\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\tinlineLanguageRe.replace(\n\t\t\t\t\t\t\t'<lang>',\n\t\t\t\t\t\t\tlang.replace(/([.+*?\\/\\\\(){}\\[\\]])/g, '\\\\$1')\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'i'\n\t\t\t\t\t),\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t...inlineLang.inside,\n\t\t\t\t\t\t$rest: alias,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t/#!.+/,\n\t\t\t],\n\t\t\t'inline-lang': inlineLang,\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'number': {\n\t\t\t\t// The look-behind prevents wrong highlighting of the .. operator\n\t\t\t\tpattern:\n\t\t\t\t\t/((?:\\.\\.)?)(?:\\b(?:inf|nan)\\b|\\b0x[\\da-f]+|(?:\\b(?:0b)?\\d+(?:\\.\\d+)?|\\B\\.\\d+)(?:e[+-]?\\d+)?L?)/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\\b/,\n\t\t\t'function':\n\t\t\t\t/\\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\\b/,\n\t\t\t'special': {\n\t\t\t\tpattern: /\\b__[a-z]+__\\b/i,\n\t\t\t\talias: 'builtin',\n\t\t\t},\n\t\t\t// Any combination of operator chars can be an operator\n\t\t\t'operator':\n\t\t\t\t// eslint-disable-next-line no-misleading-character-class\n\t\t\t\t/(?:[!\"#$%&'*+,\\-.\\/:<=>?@\\\\^`|~\\u00a1-\\u00bf\\u00d7-\\u00f7\\u20d0-\\u2bff]|\\b_+\\b)+|\\b(?:and|div|mod|not|or)\\b/,\n\t\t\t// FIXME: How can we prevent | and , to be highlighted as operator when they are used alone?\n\t\t\t'punctuation': /[(){}\\[\\];,|]/,\n\t\t\t$insertBefore: {\n\t\t\t\t'inline-lang': Object.fromEntries(insertBeforeInlineLang),\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/purebasic.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'purebasic'>} */\nexport default {\n\tid: 'purebasic',\n\tbase: clike,\n\talias: 'pbfasm',\n\tgrammar () {\n\t\t/*\n\t\tOriginal Code by Bas Groothedde\n\t\t!!MANY THANKS!! I never would have made this, regex and me will never be best friends ;)\n\t\t==> https://codepen.io/ImagineProgramming/details/JYydBy/\n\t\tslightly changed to pass all tests\n\t\t*/\n\n\t\treturn {\n\t\t\t'comment': /;.*/,\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\\b/i,\n\t\t\t'function': /\\b\\w+(?:\\.\\w+)?\\s*(?=\\()/,\n\t\t\t'number': /(?:\\$[\\da-f]+|\\b-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:e[+-]?\\d+)?)\\b/i,\n\t\t\t'operator': /(?:@\\*?|\\?|\\*)\\w+\\$?|-[>-]?|\\+\\+?|!=?|<<?=?|>>?=?|==?|&&?|\\|?\\||[~^%?*/@]/,\n\n\t\t\t// PureBasic support, steal stuff from ansi-c\n\t\t\t$insert: {\n\t\t\t\t'tag': {\n\t\t\t\t\t$before: 'keyword',\n\t\t\t\t\tpattern: /#\\w+\\$?/,\n\t\t\t\t},\n\t\t\t\t'asm': {\n\t\t\t\t\t$before: 'keyword',\n\t\t\t\t\tpattern: /(^[\\t ]*)!.*/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'tag',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'comment': /;.*/,\n\t\t\t\t\t\t'string': {\n\t\t\t\t\t\t\tpattern: /([\"'`])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Anonymous label references, i.e.: jmp @b\n\t\t\t\t\t\t'label-reference-anonymous': {\n\t\t\t\t\t\t\tpattern: /(!\\s*j[a-z]+\\s+)@[fb]/i,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'fasm-label',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Named label reference, i.e.: jne label1\n\t\t\t\t\t\t'label-reference-addressed': {\n\t\t\t\t\t\t\tpattern: /(!\\s*j[a-z]+\\s+)[A-Z._?$@][\\w.?$@~#]*/i,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'fasm-label',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'keyword': [\n\t\t\t\t\t\t\t/\\b(?:extern|global)\\b[^;\\r\\n]*/i,\n\t\t\t\t\t\t\t/\\b(?:CPU|DEFAULT|FLOAT)\\b.*/,\n\t\t\t\t\t\t],\n\t\t\t\t\t\t'function': {\n\t\t\t\t\t\t\tpattern: /^([\\t ]*!\\s*)[\\da-z]+(?=\\s|$)/im,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'function-inline': {\n\t\t\t\t\t\t\tpattern: /(:\\s*)[\\da-z]+(?=\\s)/i,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'function',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'label': {\n\t\t\t\t\t\t\tpattern: /^([\\t ]*!\\s*)[A-Za-z._?$@][\\w.?$@~#]*(?=:)/m,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'fasm-label',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'register':\n\t\t\t\t\t\t\t/\\b(?:st\\d|[xyz]mm\\d\\d?|[cdt]r\\d|r\\d\\d?[bwd]?|[abcd][hl]|[er]?[abcd]x|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\\d+)\\b/i,\n\t\t\t\t\t\t'number':\n\t\t\t\t\t\t\t/(?:\\b|-|(?=\\$))(?:0[hx](?:[\\da-f]*\\.)?[\\da-f]+(?:p[+-]?\\d+)?|\\d[\\da-f]+[hx]|\\$\\d[\\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\\d+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:\\.?e[+-]?\\d+)?[dt]?)\\b/i,\n\t\t\t\t\t\t'operator': /[\\[\\]*+\\-/%<>=&|$!,.:]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t$delete: ['class-name', 'boolean'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/purescript.js",
    "content": "import haskell, { asciiOperator, infixOperator } from './haskell.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'purescript'>} */\nexport default {\n\tid: 'purescript',\n\tbase: haskell,\n\talias: 'purs',\n\tgrammar () {\n\t\treturn {\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\\b|∀/,\n\n\t\t\t'import-statement': {\n\t\t\t\t// The imported or hidden names are not included in this import\n\t\t\t\t// statement. This is because we want to highlight those exactly like\n\t\t\t\t// we do for the names in the program.\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[\\t ]*)import\\s+[A-Z][\\w']*(?:\\.[A-Z][\\w']*)*(?:\\s+as\\s+[A-Z][\\w']*(?:\\.[A-Z][\\w']*)*)?(?:\\s+hiding\\b)?/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'keyword': /\\b(?:as|hiding|import)\\b/,\n\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// These are builtin functions only. Constructors are highlighted later as a constant.\n\t\t\t'builtin':\n\t\t\t\t/\\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\\b/,\n\n\t\t\t'operator': [\n\t\t\t\tinfixOperator,\n\t\t\t\tasciiOperator,\n\t\t\t\t// All UTF16 Unicode operator symbols\n\t\t\t\t// This regex is equivalent to /(?=[\\x80-\\uFFFF])[\\p{gc=Math_Symbol}\\p{gc=Currency_Symbol}\\p{Modifier_Symbol}\\p{Other_Symbol}]/u\n\t\t\t\t// See https://github.com/PrismJS/prism/issues/3006 for more details.\n\t\t\t\t/[\\xa2-\\xa6\\xa8\\xa9\\xac\\xae-\\xb1\\xb4\\xb8\\xd7\\xf7\\u02c2-\\u02c5\\u02d2-\\u02df\\u02e5-\\u02eb\\u02ed\\u02ef-\\u02ff\\u0375\\u0384\\u0385\\u03f6\\u0482\\u058d-\\u058f\\u0606-\\u0608\\u060b\\u060e\\u060f\\u06de\\u06e9\\u06fd\\u06fe\\u07f6\\u07fe\\u07ff\\u09f2\\u09f3\\u09fa\\u09fb\\u0af1\\u0b70\\u0bf3-\\u0bfa\\u0c7f\\u0d4f\\u0d79\\u0e3f\\u0f01-\\u0f03\\u0f13\\u0f15-\\u0f17\\u0f1a-\\u0f1f\\u0f34\\u0f36\\u0f38\\u0fbe-\\u0fc5\\u0fc7-\\u0fcc\\u0fce\\u0fcf\\u0fd5-\\u0fd8\\u109e\\u109f\\u1390-\\u1399\\u166d\\u17db\\u1940\\u19de-\\u19ff\\u1b61-\\u1b6a\\u1b74-\\u1b7c\\u1fbd\\u1fbf-\\u1fc1\\u1fcd-\\u1fcf\\u1fdd-\\u1fdf\\u1fed-\\u1fef\\u1ffd\\u1ffe\\u2044\\u2052\\u207a-\\u207c\\u208a-\\u208c\\u20a0-\\u20bf\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211e-\\u2123\\u2125\\u2127\\u2129\\u212e\\u213a\\u213b\\u2140-\\u2144\\u214a-\\u214d\\u214f\\u218a\\u218b\\u2190-\\u2307\\u230c-\\u2328\\u232b-\\u2426\\u2440-\\u244a\\u249c-\\u24e9\\u2500-\\u2767\\u2794-\\u27c4\\u27c7-\\u27e5\\u27f0-\\u2982\\u2999-\\u29d7\\u29dc-\\u29fb\\u29fe-\\u2b73\\u2b76-\\u2b95\\u2b97-\\u2bff\\u2ce5-\\u2cea\\u2e50\\u2e51\\u2e80-\\u2e99\\u2e9b-\\u2ef3\\u2f00-\\u2fd5\\u2ff0-\\u2ffb\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303e\\u303f\\u309b\\u309c\\u3190\\u3191\\u3196-\\u319f\\u31c0-\\u31e3\\u3200-\\u321e\\u322a-\\u3247\\u3250\\u3260-\\u327f\\u328a-\\u32b0\\u32c0-\\u33ff\\u4dc0-\\u4dff\\ua490-\\ua4c6\\ua700-\\ua716\\ua720\\ua721\\ua789\\ua78a\\ua828-\\ua82b\\ua836-\\ua839\\uaa77-\\uaa79\\uab5b\\uab6a\\uab6b\\ufb29\\ufbb2-\\ufbc1\\ufdfc\\ufdfd\\ufe62\\ufe64-\\ufe66\\ufe69\\uff04\\uff0b\\uff1c-\\uff1e\\uff3e\\uff40\\uff5c\\uff5e\\uffe0-\\uffe6\\uffe8-\\uffee\\ufffc\\ufffd]/,\n\t\t\t],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/python.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'python'>} */\nexport default {\n\tid: 'python',\n\talias: 'py',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(^|[^\\\\])#.*/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string-interpolation': {\n\t\t\tpattern: /(?:f|fr|rf)(?:(\"\"\"|''')[\\s\\S]*?\\1|(\"|')(?:\\\\.|(?!\\2)[^\\\\\\r\\n])*\\2)/i,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation': {\n\t\t\t\t\t// \"{\" <expression> <optional \"!s\", \"!r\", or \"!a\"> <optional \":\" format specifier> \"}\"\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:^|[^{])(?:\\{\\{)*)\\{(?!\\{)(?:[^{}]|\\{(?!\\{)(?:[^{}]|\\{(?!\\{)(?:[^{}])+\\})+\\})+\\}/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'format-spec': {\n\t\t\t\t\t\t\tpattern: /(:)[^:(){}]+(?=\\}$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'conversion-option': {\n\t\t\t\t\t\t\tpattern: /![sra](?=[:}]$)/,\n\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t$rest: 'python',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t},\n\t\t},\n\t\t'triple-quoted-string': {\n\t\t\tpattern: /(?:[rub]|br|rb)?(\"\"\"|''')[\\s\\S]*?\\1/i,\n\t\t\tgreedy: true,\n\t\t\talias: 'string',\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /(?:[rub]|br|rb)?(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/i,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'function': {\n\t\t\tpattern: /((?:^|\\s)def[ \\t]+)[a-zA-Z_]\\w*(?=\\s*\\()/g,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'class-name': {\n\t\t\tpattern: /(\\bclass\\s+)\\w+/i,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'decorator': {\n\t\t\tpattern: /(^[\\t ]*)@\\w+(?:\\.\\w+)*/m,\n\t\t\tlookbehind: true,\n\t\t\talias: ['annotation', 'punctuation'],\n\t\t\tinside: {\n\t\t\t\t'punctuation': /\\./,\n\t\t\t},\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:_(?=\\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\\b/,\n\t\t'builtin':\n\t\t\t/\\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\\b/,\n\t\t'boolean': /\\b(?:False|None|True)\\b/,\n\t\t'number':\n\t\t\t/\\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\\b|(?:\\b\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\B\\.\\d+(?:_\\d+)*)(?:e[+-]?\\d+(?:_\\d+)*)?j?(?!\\w)/i,\n\t\t'operator': /[-+%=]=?|!=|:=|\\*\\*?=?|\\/\\/?=?|<[<=>]?|>[=>]?|[&|^~]/,\n\t\t'punctuation': /[{}[\\];(),.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/q.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'q'>} */\nexport default {\n\tid: 'q',\n\tgrammar: {\n\t\t'string': /\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,\n\t\t'comment': [\n\t\t\t// From http://code.kx.com/wiki/Reference/Slash:\n\t\t\t// When / is following a space (or a right parenthesis, bracket, or brace), it is ignored with the rest of the line.\n\t\t\t{\n\t\t\t\tpattern: /([\\t )\\]}])\\/.*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t// From http://code.kx.com/wiki/Reference/Slash:\n\t\t\t// A line which has / as its first character and contains at least one other non-whitespace character is a whole-line comment and is ignored entirely.\n\t\t\t// A / on a line by itself begins a multiline comment which is terminated by the next \\ on a line by itself.\n\t\t\t// If a / is not matched by a \\, the multiline comment is unterminated and continues to end of file.\n\t\t\t// The / and \\ must be the first char on the line, but may be followed by any amount of whitespace.\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|\\r?\\n|\\r)\\/[\\t ]*(?:(?:\\r?\\n|\\r)(?:.*(?:\\r?\\n|\\r(?!\\n)))*?(?:\\\\(?=[\\t ]*(?:\\r?\\n|\\r))|$)|\\S.*)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t// From http://code.kx.com/wiki/Reference/Slash:\n\t\t\t// A \\ on a line by itself with no preceding matching / will comment to end of file.\n\t\t\t{\n\t\t\t\tpattern: /^\\\\[\\t ]*(?:\\r?\\n|\\r)[\\s\\S]+/m,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /^#!.+/m,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\t\t'symbol': /`(?::\\S+|[\\w.]*)/,\n\t\t'datetime': {\n\t\t\tpattern:\n\t\t\t\t/0N[mdzuvt]|0W[dtz]|\\d{4}\\.\\d\\d(?:m|\\.\\d\\d(?:T(?:\\d\\d(?::\\d\\d(?::\\d\\d(?:[.:]\\d\\d\\d)?)?)?)?)?[dz]?)|\\d\\d:\\d\\d(?::\\d\\d(?:[.:]\\d\\d\\d)?)?[uvt]?/,\n\t\t\talias: 'number',\n\t\t},\n\t\t// The negative look-ahead prevents bad highlighting\n\t\t// of verbs 0: and 1:\n\t\t'number':\n\t\t\t/\\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\\da-fA-F]+|\\d+(?:\\.\\d*)?(?:e[+-]?\\d+)?[hjfeb]?)/,\n\t\t'keyword':\n\t\t\t/\\\\\\w+\\b|\\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\\b/,\n\t\t'adverb': {\n\t\t\tpattern: /['\\/\\\\]:?|\\beach\\b/,\n\t\t\talias: 'function',\n\t\t},\n\t\t'verb': {\n\t\t\tpattern: /(?:\\B\\.\\B|\\b[01]:|<[=>]?|>=?|[:+\\-*%,!?~=|$&#@^]):?|\\b_\\b:?/,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'punctuation': /[(){}\\[\\];.]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/qml.js",
    "content": "import javascript from './javascript.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'qml'>} */\nexport default {\n\tid: 'qml',\n\trequire: javascript,\n\tgrammar () {\n\t\tconst jsString = /\"(?:\\\\.|[^\\\\\"\\r\\n])*\"|'(?:\\\\.|[^\\\\'\\r\\n])*'/.source;\n\t\tconst jsComment = /\\/\\/.*(?!.)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\//.source;\n\n\t\tlet jsExpr =\n\t\t\t/(?:[^\\\\()[\\]{}\"'/]|<string>|\\/(?![*/])|<comment>|\\(<expr>*\\)|\\[<expr>*\\]|\\{<expr>*\\}|\\\\[\\s\\S])/.source\n\t\t\t\t.replace(/<string>/g, () => jsString)\n\t\t\t\t.replace(/<comment>/g, () => jsComment);\n\n\t\t// the pattern will blow up, so only a few iterations\n\t\tfor (let i = 0; i < 2; i++) {\n\t\t\tjsExpr = jsExpr.replace(/<expr>/g, () => jsExpr);\n\t\t}\n\t\tjsExpr = jsExpr.replace(/<expr>/g, '[^\\\\s\\\\S]');\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'javascript-function': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/((?:^|;)[ \\t]*)function\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*\\(<js>*\\)\\s*\\{<js>*\\}/.source.replace(\n\t\t\t\t\t\t/<js>/g,\n\t\t\t\t\t\t() => jsExpr\n\t\t\t\t\t),\n\t\t\t\t\t'm'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'language-javascript',\n\t\t\t\tinside: 'javascript',\n\t\t\t},\n\t\t\t'class-name': {\n\t\t\t\tpattern: /((?:^|[:;])[ \\t]*)(?!\\d)\\w+(?=[ \\t]*\\{|[ \\t]+on\\b)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'property': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /((?:^|[;{])[ \\t]*)(?!\\d)\\w+(?:\\.\\w+)*(?=[ \\t]*:)/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:^|[;{])[ \\t]*)property[ \\t]+(?!\\d)\\w+(?:\\.\\w+)*[ \\t]+(?!\\d)\\w+(?:\\.\\w+)*(?=[ \\t]*:)/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'keyword': /^property/,\n\t\t\t\t\t\t'property': /\\w+(?:\\.\\w+)*/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'javascript-expression': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/(:[ \\t]*)(?![\\s;}[])(?:(?!$|[;}])<js>)+/.source.replace(/<js>/g, () => jsExpr),\n\t\t\t\t\t'm'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'language-javascript',\n\t\t\t\tinside: 'javascript',\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:\\\\.|[^\\\\\"\\r\\n])*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'keyword': /\\b(?:as|import|on)\\b/,\n\t\t\t'punctuation': /[{}[\\]:;,]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/qore.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'qore'>} */\nexport default {\n\tid: 'qore',\n\tbase: clike,\n\tgrammar () {\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|(?:\\/\\/|#).*)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t// Overridden to allow unescaped multi-line strings\n\t\t\t'string': {\n\t\t\t\tpattern: /(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/i,\n\t\t\t'function': /\\$?\\b(?!\\d)\\w+(?=\\()/,\n\t\t\t'number':\n\t\t\t\t/\\b(?:0b[01]+|0x(?:[\\da-f]*\\.)?[\\da-fp\\-]+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:e\\d+)?[df]|(?:\\d+(?:\\.\\d+)?|\\.\\d+))\\b/i,\n\t\t\t'operator': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^.])(?:\\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\\|[|=]?|[*\\/%^]=?|[~?])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'variable': /\\$(?!\\d)\\w+\\b/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/qsharp.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'qsharp'>} */\nexport default {\n\tid: 'qsharp',\n\tbase: clike,\n\talias: 'qs',\n\tgrammar () {\n\t\t/**\n\t\t * Replaces all placeholders \"<<n>>\" of given pattern with the n-th replacement (zero based).\n\t\t *\n\t\t * Note: This is a simple text based replacement. Be careful when using backreferences!\n\t\t *\n\t\t * @param {string} pattern the given pattern.\n\t\t * @param {string[]} replacements a list of replacement which can be inserted into the given pattern.\n\t\t * @returns {string} the pattern with all placeholders replaced with their corresponding replacements.\n\t\t * @example replace(/a<<0>>a/.source, [/b+/.source]) === /a(?:b+)a/.source\n\t\t */\n\t\tfunction replace (pattern, replacements) {\n\t\t\treturn pattern.replace(/<<(\\d+)>>/g, (m, index) => {\n\t\t\t\treturn '(?:' + replacements[+index] + ')';\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * @param {string} pattern\n\t\t * @param {string[]} replacements\n\t\t * @param {string} [flags]\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction re (pattern, replacements, flags) {\n\t\t\treturn RegExp(replace(pattern, replacements), flags || '');\n\t\t}\n\n\t\t/**\n\t\t * Creates a nested pattern where all occurrences of the string `<<self>>` are replaced with the pattern itself.\n\t\t *\n\t\t * @param {string} pattern\n\t\t * @param {number} depthLog2\n\t\t * @returns {string}\n\t\t */\n\t\tfunction nested (pattern, depthLog2) {\n\t\t\tfor (let i = 0; i < depthLog2; i++) {\n\t\t\t\tpattern = pattern.replace(/<<self>>/g, () => '(?:' + pattern + ')');\n\t\t\t}\n\t\t\treturn pattern.replace(/<<self>>/g, '[^\\\\s\\\\S]');\n\t\t}\n\n\t\t// https://docs.microsoft.com/en-us/azure/quantum/user-guide/language/typesystem/\n\t\t// https://github.com/microsoft/qsharp-language/tree/main/Specifications/Language/5_Grammar\n\t\tconst keywordKinds = {\n\t\t\t// keywords which represent a return or variable type\n\t\t\ttype: 'Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero',\n\t\t\t// all other keywords\n\t\t\tother: 'Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within',\n\t\t};\n\t\t/**\n\t\t * keywords\n\t\t *\n\t\t * @param {string} words\n\t\t * @returns {string}\n\t\t */\n\t\tfunction keywordsToPattern (words) {\n\t\t\treturn '\\\\b(?:' + words.trim().replace(/ /g, '|') + ')\\\\b';\n\t\t}\n\t\tconst keywords = RegExp(keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.other));\n\n\t\t// types\n\t\tconst identifier = /\\b[A-Za-z_]\\w*\\b/.source;\n\t\tconst qualifiedName = replace(/<<0>>(?:\\s*\\.\\s*<<0>>)*/.source, [identifier]);\n\n\t\tconst typeInside = {\n\t\t\t'keyword': keywords,\n\t\t\t'punctuation': /[<>()?,.:[\\]]/,\n\t\t};\n\n\t\t// strings\n\t\tconst regularString = /\"(?:\\\\.|[^\\\\\"])*\"/.source;\n\n\t\t// single line\n\t\tconst interpolationExpr = nested(\n\t\t\treplace(/\\{(?:[^\"{}]|<<0>>|<<self>>)*\\}/.source, [regularString]),\n\t\t\t2\n\t\t);\n\n\t\treturn {\n\t\t\t'comment': /\\/\\/.*/,\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\tpattern: re(/(^|[^$\\\\])<<0>>/.source, [regularString]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\t// open Microsoft.Quantum.Canon;\n\t\t\t\t\t// open Microsoft.Quantum.Canon as CN;\n\t\t\t\t\tpattern: re(/(\\b(?:as|open)\\s+)<<0>>(?=\\s*(?:;|as\\b))/.source, [qualifiedName]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// namespace Quantum.App1;\n\t\t\t\t\tpattern: re(/(\\bnamespace\\s+)<<0>>(?=\\s*\\{)/.source, [qualifiedName]),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword': keywords,\n\t\t\t'number':\n\t\t\t\t/(?:\\b0(?:x[\\da-f]+|b[01]+|o[0-7]+)|(?:\\B\\.\\d+|\\b\\d+(?:\\.\\d*)?)(?:e[-+]?\\d+)?)l?\\b/i,\n\t\t\t'operator':\n\t\t\t\t/\\band=|\\bor=|\\band\\b|\\bnot\\b|\\bor\\b|<[-=]|[-=]>|>>>=?|<<<=?|\\^\\^\\^=?|\\|\\|\\|=?|&&&=?|w\\/=?|~~~|[*\\/+\\-^=!%]=?/,\n\t\t\t'punctuation': /::|[{}[\\];(),.:]/,\n\t\t\t$insert: {\n\t\t\t\t'range': {\n\t\t\t\t\t$before: 'number',\n\t\t\t\t\tpattern: /\\.\\./,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t\t'interpolation-string': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: re(/\\$\"(?:\\\\.|<<0>>|[^\\\\\"{])*\"/.source, [interpolationExpr]),\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\t\tpattern: re(/((?:^|[^\\\\])(?:\\\\\\\\)*)<<0>>/.source, [interpolationExpr]),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'punctuation': /^\\{|\\}$/,\n\t\t\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\t\talias: 'language-qsharp',\n\t\t\t\t\t\t\t\t\tinside: 'qsharp',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/r.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'r'>} */\nexport default {\n\tid: 'r',\n\tgrammar: {\n\t\t'comment': /#.*/,\n\t\t'string': {\n\t\t\tpattern: /(['\"])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'percent-operator': {\n\t\t\t// Includes user-defined operators\n\t\t\t// and %%, %*%, %/%, %in%, %o%, %x%\n\t\t\tpattern: /%[^%\\s]*%/,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'boolean': /\\b(?:FALSE|TRUE)\\b/,\n\t\t'ellipsis': /\\.\\.(?:\\.|\\d+)/,\n\t\t'number': [\n\t\t\t/\\b(?:Inf|NaN)\\b/,\n\t\t\t/(?:\\b0x[\\dA-Fa-f]+(?:\\.\\d*)?|\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[EePp][+-]?\\d+)?[iL]?/,\n\t\t],\n\t\t'keyword':\n\t\t\t/\\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\\b/,\n\t\t'operator': /->?>?|<(?:=|<?-)?|[>=!]=?|::?|&&?|\\|\\|?|[+*\\/^$@~]/,\n\t\t'punctuation': /[(){}\\[\\],;]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/racket.js",
    "content": "import scheme from './scheme.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'racket'>} */\nexport default {\n\tid: 'racket',\n\tbase: scheme,\n\talias: 'rkt',\n\tgrammar () {\n\t\treturn {\n\t\t\t'lambda-parameter': {\n\t\t\t\t// the racket lambda syntax is a lot more complex, so we won't even attempt to capture it.\n\t\t\t\t// this will just prevent false positives of the `function` pattern\n\t\t\t\tpattern: /([(\\[]lambda\\s+[(\\[])[^()\\[\\]'\\s]+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t$insert: {\n\t\t\t\t'lang': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: /^#lang.+/m,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/reason.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'reason'>} */\nexport default {\n\tid: 'reason',\n\tbase: clike,\n\tgrammar () {\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\\\\\\r\\n\"])*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t// 'class-name' must be matched *after* 'constructor' defined below\n\t\t\t'class-name': /\\b[A-Z]\\w*/,\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\\b/,\n\t\t\t'operator':\n\t\t\t\t/\\.{3}|:[:=]|\\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\\-*\\/]\\.?|\\b(?:asr|land|lor|lsl|lsr|lxor|mod)\\b/,\n\n\t\t\t// We can't match functions property, so let's not even try.\n\t\t\t$delete: ['function'],\n\n\t\t\t$insertBefore: {\n\t\t\t\t'class-name': {\n\t\t\t\t\t'char': {\n\t\t\t\t\t\tpattern: /'(?:\\\\x[\\da-f]{2}|\\\\o[0-3][0-7][0-7]|\\\\\\d{3}|\\\\.|[^'\\\\\\r\\n])'/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\t\t\t\t\t// Negative look-ahead prevents from matching things like String.capitalize\n\t\t\t\t\t'constructor': /\\b[A-Z]\\w*\\b(?!\\s*\\.)/,\n\t\t\t\t\t'label': {\n\t\t\t\t\t\tpattern: /\\b[a-z]\\w*(?=::)/,\n\t\t\t\t\t\talias: 'symbol',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/regex.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'regex'>} */\nexport default {\n\tid: 'regex',\n\tgrammar () {\n\t\tconst specialEscape = {\n\t\t\tpattern: /\\\\[\\\\(){}[\\]^$+*?|.]/,\n\t\t\talias: 'escape',\n\t\t};\n\t\tconst escape =\n\t\t\t/\\\\(?:x[\\da-fA-F]{2}|u[\\da-fA-F]{4}|u\\{[\\da-fA-F]+\\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/;\n\t\tconst charSet = {\n\t\t\tpattern: /\\.|\\\\[wsd]|\\\\p\\{[^{}]+\\}/i,\n\t\t\talias: 'class-name',\n\t\t};\n\t\tconst charSetWithoutDot = {\n\t\t\tpattern: /\\\\[wsd]|\\\\p\\{[^{}]+\\}/i,\n\t\t\talias: 'class-name',\n\t\t};\n\n\t\tconst rangeChar = '(?:[^\\\\\\\\-]|' + escape.source + ')';\n\t\tconst range = RegExp(rangeChar + '-' + rangeChar);\n\n\t\t// the name of a capturing group\n\t\tconst groupName = {\n\t\t\tpattern: /(<|')[^<>']+(?=[>']$)/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'variable',\n\t\t};\n\n\t\treturn {\n\t\t\t'char-class': {\n\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\\\\\)*)\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'char-class-negation': {\n\t\t\t\t\t\tpattern: /(^\\[)\\^/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'operator',\n\t\t\t\t\t},\n\t\t\t\t\t'char-class-punctuation': {\n\t\t\t\t\t\tpattern: /^\\[|\\]$/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t'range': {\n\t\t\t\t\t\tpattern: range,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'escape': escape,\n\t\t\t\t\t\t\t'range-punctuation': {\n\t\t\t\t\t\t\t\tpattern: /-/,\n\t\t\t\t\t\t\t\talias: 'operator',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'special-escape': specialEscape,\n\t\t\t\t\t'char-set': charSetWithoutDot,\n\t\t\t\t\t'escape': escape,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'special-escape': specialEscape,\n\t\t\t'char-set': charSet,\n\t\t\t'backreference': [\n\t\t\t\t{\n\t\t\t\t\t// a backreference which is not an octal escape\n\t\t\t\t\tpattern: /\\\\(?![123][0-7]{2})[1-9]/,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\\\k<[^<>']+>/,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'group-name': groupName,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'anchor': {\n\t\t\t\tpattern: /[$^]|\\\\[ABbGZz]/,\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'escape': escape,\n\t\t\t'group': [\n\t\t\t\t{\n\t\t\t\t\t// https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html\n\t\t\t\t\t// https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference?view=netframework-4.7.2#grouping-constructs\n\n\t\t\t\t\t// (), (?<name>), (?'name'), (?>), (?:), (?=), (?!), (?<=), (?<!), (?is-m), (?i-m:)\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\((?:\\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'group-name': groupName,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\)/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t],\n\t\t\t'quantifier': {\n\t\t\t\tpattern: /(?:[+*?]|\\{\\d+(?:,\\d*)?\\})[?+]?/,\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t\t'alternation': {\n\t\t\t\tpattern: /\\|/,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/rego.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'rego'>} */\nexport default {\n\tid: 'rego',\n\tgrammar () {\n\t\t// https://www.openpolicyagent.org/docs/latest/policy-reference/\n\n\t\treturn {\n\t\t\t'comment': /#.*/,\n\t\t\t'property': {\n\t\t\t\tpattern: /(^|[^\\\\.])(?:\"(?:\\\\.|[^\\\\\"\\r\\n])*\"|`[^`]*`|\\b[a-z_]\\w*\\b)(?=\\s*:(?!=))/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /(^|[^\\\\])\"(?:\\\\.|[^\\\\\"\\r\\n])*\"|`[^`]*`/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'keyword': /\\b(?:as|default|else|import|not|null|package|set(?=\\s*\\()|some|with)\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\n\t\t\t'function': {\n\t\t\t\tpattern: /\\b[a-z_]\\w*\\b(?:\\s*\\.\\s*\\b[a-z_]\\w*\\b)*(?=\\s*\\()/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'namespace': /\\b\\w+\\b(?=\\s*\\.)/,\n\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'number': /-?\\b\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?\\b/i,\n\t\t\t'operator': /[-+*/%|&]|[<>:=]=?|!=|\\b_\\b/,\n\t\t\t'punctuation': /[,;.\\[\\]{}()]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/renpy.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'renpy'>} */\nexport default {\n\tid: 'renpy',\n\talias: 'rpy',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(^|[^\\\\])#.+/,\n\t\t\tlookbehind: true,\n\t\t},\n\n\t\t'string': {\n\t\t\tpattern:\n\t\t\t\t/(\"\"\"|''')[\\s\\S]+?\\1|(\"|')(?:\\\\.|(?!\\2)[^\\\\])*\\2|(?:^#?(?:(?:[0-9a-fA-F]){3}|[0-9a-fA-F]{6})$)/m,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'function': /\\b[a-z_]\\w*(?=\\()/i,\n\n\t\t'property':\n\t\t\t/\\b(?:Update|UpdateVersion|action|activate_sound|adv_nvl_transition|after_load_transition|align|alpha|alt|anchor|antialias|area|auto|background|bar_invert|bar_resizing|bar_vertical|black_color|bold|bottom_bar|bottom_gutter|bottom_margin|bottom_padding|box_reverse|box_wrap|can_update|caret|child|color|crop|default_afm_enable|default_afm_time|default_fullscreen|default_text_cps|developer|directory_name|drag_handle|drag_joined|drag_name|drag_raise|draggable|dragged|drop_shadow|drop_shadow_color|droppable|dropped|easein|easeout|edgescroll|end_game_transition|end_splash_transition|enter_replay_transition|enter_sound|enter_transition|enter_yesno_transition|executable_name|exit_replay_transition|exit_sound|exit_transition|exit_yesno_transition|fadein|fadeout|first_indent|first_spacing|fit_first|focus|focus_mask|font|foreground|game_main_transition|get_installed_packages|google_play_key|google_play_salt|ground|has_music|has_sound|has_voice|height|help|hinting|hover|hover_background|hover_color|hover_sound|hovered|hyperlink_functions|idle|idle_color|image_style|include_update|insensitive|insensitive_background|insensitive_color|inside|intra_transition|italic|justify|kerning|keyboard_focus|language|layer_clipping|layers|layout|left_bar|left_gutter|left_margin|left_padding|length|line_leading|line_overlap_split|line_spacing|linear|main_game_transition|main_menu_music|maximum|min_width|minimum|minwidth|modal|mouse|mousewheel|name|narrator_menu|newline_indent|nvl_adv_transition|offset|order_reverse|outlines|overlay_functions|pos|position|prefix|radius|range|rest_indent|right_bar|right_gutter|right_margin|right_padding|rotate|rotate_pad|ruby_style|sample_sound|save_directory|say_attribute_transition|screen_height|screen_width|scrollbars|selected_hover|selected_hover_color|selected_idle|selected_idle_color|selected_insensitive|show_side_image|show_two_window|side_spacing|side_xpos|side_ypos|size|size_group|slow_cps|slow_cps_multiplier|spacing|strikethrough|subpixel|text_align|text_style|text_xpos|text_y_fudge|text_ypos|thumb|thumb_offset|thumb_shadow|thumbnail_height|thumbnail_width|time|top_bar|top_gutter|top_margin|top_padding|translations|underline|unscrollable|update|value|version|version_name|version_tuple|vertical|width|window_hide_transition|window_icon|window_left_padding|window_show_transition|window_title|windows_icon|xadjustment|xalign|xanchor|xanchoraround|xaround|xcenter|xfill|xinitial|xmargin|xmaximum|xminimum|xoffset|xofsset|xpadding|xpos|xsize|xzoom|yadjustment|yalign|yanchor|yanchoraround|yaround|ycenter|yfill|yinitial|ymargin|ymaximum|yminimum|yoffset|ypadding|ypos|ysize|ysizexysize|yzoom|zoom|zorder)\\b/,\n\n\t\t'tag': /\\b(?:bar|block|button|buttoscreenn|drag|draggroup|fixed|frame|grid|[hv]box|hotbar|hotspot|image|imagebutton|imagemap|input|key|label|menu|mm_menu_frame|mousearea|nvl|parallel|screen|self|side|tag|text|textbutton|timer|vbar|viewport|window)\\b|\\$/,\n\n\t\t'keyword':\n\t\t\t/\\b(?:None|add|adjustment|alignaround|allow|angle|animation|around|as|assert|behind|box_layout|break|build|cache|call|center|changed|child_size|choice|circles|class|clear|clicked|clipping|clockwise|config|contains|continue|corner1|corner2|counterclockwise|def|default|define|del|delay|disabled|disabled_text|dissolve|elif|else|event|except|exclude|exec|expression|fade|finally|for|from|function|global|gm_root|has|hide|id|if|import|in|init|is|jump|knot|lambda|left|less_rounded|mm_root|movie|music|null|on|onlayer|pass|pause|persistent|play|print|python|queue|raise|random|renpy|repeat|return|right|rounded_window|scene|scope|set|show|slow|slow_abortable|slow_done|sound|stop|store|style|style_group|substitute|suffix|theme|transform|transform_anchor|transpose|try|ui|unhovered|updater|use|voice|while|widget|widget_hover|widget_selected|widget_text|yield)\\b/,\n\n\t\t'boolean': /\\b(?:[Ff]alse|[Tt]rue)\\b/,\n\n\t\t'number': /(?:\\b(?:0[bo])?(?:(?:\\d|0x[\\da-f])[\\da-f]*(?:\\.\\d*)?)|\\B\\.\\d+)(?:e[+-]?\\d+)?j?/i,\n\n\t\t'operator': /[-+%=]=?|!=|\\*\\*?=?|\\/\\/?=?|<[<=>]?|>[=>]?|[&|^~]|\\b(?:and|at|not|or|with)\\b/,\n\n\t\t'punctuation': /[{}[\\];(),.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/rescript.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'rescript'>} */\nexport default {\n\tid: 'rescript',\n\talias: 'res',\n\tgrammar () {\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\/.*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'char': { pattern: /'(?:[^\\r\\n\\\\]|\\\\(?:.|\\w+))'/, greedy: true },\n\t\t\t'template-string': {\n\t\t\t\tpattern: /`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'template-punctuation': {\n\t\t\t\t\t\tpattern: /^`|`$/,\n\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t},\n\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\t\t\talias: 'tag',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t$rest: 'rescript',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\\\\\\r\\n\"])*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'class-name': /\\b[A-Z]\\w*|@[a-z.]*|#[A-Za-z]\\w*|#\\d/,\n\t\t\t'function': {\n\t\t\t\tpattern: /[a-zA-Z]\\w*(?=\\()|(\\.)[a-z]\\w*/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'number':\n\t\t\t\t/(?:\\b0x(?:[\\da-f]+(?:\\.[\\da-f]*)?|\\.[\\da-f]+)(?:p[+-]?\\d+)?|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)[ful]{0,4}/i,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'attr-value': /[A-Za-z]\\w*(?==)/,\n\t\t\t'constant': {\n\t\t\t\tpattern: /(\\btype\\s+)[a-z]\\w*/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'tag': {\n\t\t\t\tpattern: /(<)[a-z]\\w*|(?:<\\/)[a-z]\\w*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'operator': /<|>|\\//,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\\b/,\n\t\t\t'operator':\n\t\t\t\t/\\.{3}|:[:=]?|\\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\\-*\\/]\\.?|\\b(?:asr|land|lor|lsl|lsr|lxor|mod)\\b/,\n\t\t\t'punctuation': /[(){}[\\],;.]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/rest.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'rest'>} */\nexport default {\n\tid: 'rest',\n\tgrammar: {\n\t\t'table': [\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[\\t ]*)(?:\\+[=-]+)+\\+(?:\\r?\\n|\\r)(?:\\1[+|].+[+|](?:\\r?\\n|\\r))+\\1(?:\\+[=-]+)+\\+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /\\||(?:\\+[=-]+)+\\+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[\\t ]*)=+ [ =]*=(?:(?:\\r?\\n|\\r)\\1.+)+(?:\\r?\\n|\\r)\\1=+ [ =]*=(?=(?:\\r?\\n|\\r){2}|\\s*$)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /[=-]+/,\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\n\t\t// Directive-like patterns\n\n\t\t'substitution-def': {\n\t\t\tpattern: /(^[\\t ]*\\.\\. )\\|(?:[^|\\s](?:[^|]*[^|\\s])?)\\| [^:]+::/m,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'substitution': {\n\t\t\t\t\tpattern: /^\\|(?:[^|\\s]|[^|\\s][^|]*[^|\\s])\\|/,\n\t\t\t\t\talias: 'attr-value',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /^\\||\\|$/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'directive': {\n\t\t\t\t\tpattern: /( )(?! )[^:]+::/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'function',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /::$/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'link-target': [\n\t\t\t{\n\t\t\t\tpattern: /(^[\\t ]*\\.\\. )\\[[^\\]]+\\]/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'string',\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^\\[|\\]$/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^[\\t ]*\\.\\. )_(?:`[^`]+`|(?:[^:\\\\]|\\\\.)+):/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'string',\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^_|:$/,\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\t'directive': {\n\t\t\tpattern: /(^[\\t ]*\\.\\. )[^:]+::/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'function',\n\t\t\tinside: {\n\t\t\t\t'punctuation': /::$/,\n\t\t\t},\n\t\t},\n\t\t'comment': {\n\t\t\t// The two alternatives try to prevent highlighting of blank comments\n\t\t\tpattern: /(^[\\t ]*\\.\\.)(?:(?: .+)?(?:(?:\\r?\\n|\\r).+)+| .+)(?=(?:\\r?\\n|\\r){2}|$)/m,\n\t\t\tlookbehind: true,\n\t\t},\n\n\t\t'title': [\n\t\t\t// Overlined and underlined\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/^(([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\2+)(?:\\r?\\n|\\r).+(?:\\r?\\n|\\r)\\1$/m,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation':\n\t\t\t\t\t\t/^[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]+|[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]+$/,\n\t\t\t\t\t'important': /.+/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Underlined only\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|(?:\\r?\\n|\\r){2}).+(?:\\r?\\n|\\r)([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\2+(?=\\r?\\n|\\r|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]+$/,\n\t\t\t\t\t'important': /.+/,\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\t'hr': {\n\t\t\tpattern:\n\t\t\t\t/((?:\\r?\\n|\\r){2})([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\2{3,}(?=(?:\\r?\\n|\\r){2})/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'punctuation',\n\t\t},\n\t\t'field': {\n\t\t\tpattern: /(^[\\t ]*):[^:\\r\\n]+:(?= )/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'attr-name',\n\t\t},\n\t\t'command-line-option': {\n\t\t\tpattern:\n\t\t\t\t/(^[\\t ]*)(?:[+-][a-z\\d]|(?:--|\\/)[a-z\\d-]+)(?:[ =](?:[a-z][\\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\\d]|(?:--|\\/)[a-z\\d-]+)(?:[ =](?:[a-z][\\w-]*|<[^<>]+>))?)*(?=(?:\\r?\\n|\\r)? {2,}\\S)/im,\n\t\t\tlookbehind: true,\n\t\t\talias: 'symbol',\n\t\t},\n\t\t'literal-block': {\n\t\t\tpattern: /::(?:\\r?\\n|\\r){2}([ \\t]+)(?![ \\t]).+(?:(?:\\r?\\n|\\r)\\1.+)*/,\n\t\t\tinside: {\n\t\t\t\t'literal-block-punctuation': {\n\t\t\t\t\tpattern: /^::/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'quoted-literal-block': {\n\t\t\tpattern:\n\t\t\t\t/::(?:\\r?\\n|\\r){2}([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]).*(?:(?:\\r?\\n|\\r)\\1.*)*/,\n\t\t\tinside: {\n\t\t\t\t'literal-block-punctuation': {\n\t\t\t\t\tpattern: /^(?:::|([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\1*)/m,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'list-bullet': {\n\t\t\tpattern:\n\t\t\t\t/(^[\\t ]*)(?:[*+\\-•‣⁃]|\\(?(?:\\d+|[a-z]|[ivxdclm]+)\\)|(?:\\d+|[a-z]|[ivxdclm]+)\\.)(?= )/im,\n\t\t\tlookbehind: true,\n\t\t\talias: 'punctuation',\n\t\t},\n\t\t'doctest-block': {\n\t\t\tpattern: /(^[\\t ]*)>>> .+(?:(?:\\r?\\n|\\r).+)*/m,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /^>>>/,\n\t\t\t},\n\t\t},\n\n\t\t'inline': [\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[\\s\\-:\\/'\"<(\\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\\*\\*?|``?|\\|)(?!\\s)(?:(?!\\2).)*\\S\\2(?=[\\s\\-.,:;!?\\\\\\/'\")\\]}]|$))/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'bold': {\n\t\t\t\t\t\tpattern: /(^\\*\\*).+(?=\\*\\*$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'italic': {\n\t\t\t\t\t\tpattern: /(^\\*).+(?=\\*$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'inline-literal': {\n\t\t\t\t\t\tpattern: /(^``).+(?=``$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'symbol',\n\t\t\t\t\t},\n\t\t\t\t\t'role': {\n\t\t\t\t\t\tpattern: /^:[^:]+:|:[^:]+:$/,\n\t\t\t\t\t\talias: 'function',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /^:|:$/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'interpreted-text': {\n\t\t\t\t\t\tpattern: /(^`).+(?=`$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'attr-value',\n\t\t\t\t\t},\n\t\t\t\t\t'substitution': {\n\t\t\t\t\t\tpattern: /(^\\|).+(?=\\|$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'attr-value',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /\\*\\*?|``?|\\|/,\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\n\t\t'link': [\n\t\t\t{\n\t\t\t\tpattern: /\\[[^\\[\\]]+\\]_(?=[\\s\\-.,:;!?\\\\\\/'\")\\]}]|$)/,\n\t\t\t\talias: 'string',\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^\\[|\\]_$/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(?:\\b[a-z\\d]+(?:[_.:+][a-z\\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\\s\\-.,:;!?\\\\\\/'\")\\]}]|$)/i,\n\t\t\t\talias: 'string',\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^_?`|`$|`?_?_$/,\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\n\t\t// Line block start,\n\t\t// quote attribution,\n\t\t// explicit markup start,\n\t\t// and anonymous hyperlink target shortcut (__)\n\t\t'punctuation': {\n\t\t\tpattern: /(^[\\t ]*)(?:\\|(?= |$)|(?:---?|—|\\.\\.|__)(?= )|\\.\\.$)/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/rip.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'rip'>} */\nexport default {\n\tid: 'rip',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /#.*/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'char': {\n\t\t\tpattern: /\\B`[^\\s`'\",.:;#\\/\\\\()<>\\[\\]{}]\\b/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'regex': {\n\t\t\tpattern:\n\t\t\t\t/(^|[^/])\\/(?!\\/)(?:\\[[^\\n\\r\\]]*\\]|\\\\.|[^/\\\\\\r\\n\\[])+\\/(?=\\s*(?:$|[\\r\\n,.;})]))/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'keyword':\n\t\t\t/(?:=>|->)|\\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\\b/,\n\n\t\t'builtin': /@|\\bSystem\\b/,\n\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\n\t\t'date': /\\b\\d{4}-\\d{2}-\\d{2}\\b/,\n\t\t'time': /\\b\\d{2}:\\d{2}:\\d{2}\\b/,\n\t\t'datetime': /\\b\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\b/,\n\n\t\t'symbol': /:[^\\d\\s`'\",.:;#\\/\\\\()<>\\[\\]{}][^\\s`'\",.:;#\\/\\\\()<>\\[\\]{}]*/,\n\t\t'number': /[+-]?\\b(?:\\d+\\.\\d+|\\d+)\\b/,\n\n\t\t'punctuation': /(?:\\.{2,3})|[`,.:;=\\/\\\\()<>\\[\\]{}]/,\n\n\t\t'reference': /[^\\d\\s`'\",.:;#\\/\\\\()<>\\[\\]{}][^\\s`'\",.:;#\\/\\\\()<>\\[\\]{}]*/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/roboconf.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'roboconf'>} */\nexport default {\n\tid: 'roboconf',\n\tgrammar: {\n\t\t'comment': /#.*/,\n\t\t'keyword': {\n\t\t\t'pattern':\n\t\t\t\t/(^|\\s)(?:(?:external|import)\\b|(?:facet|instance of)(?=[ \\t]+[\\w-]+[ \\t]*\\{))/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'component': {\n\t\t\tpattern: /[\\w-]+(?=[ \\t]*\\{)/,\n\t\t\talias: 'variable',\n\t\t},\n\t\t'property': /[\\w.-]+(?=[ \\t]*:)/,\n\t\t'value': {\n\t\t\tpattern: /(=[ \\t]*(?![ \\t]))[^,;]+/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'attr-value',\n\t\t},\n\t\t'optional': {\n\t\t\tpattern: /\\(optional\\)/,\n\t\t\talias: 'builtin',\n\t\t},\n\t\t'wildcard': {\n\t\t\tpattern: /(\\.)\\*/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'punctuation': /[{},.;:=]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/robotframework.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'robotframework'>} */\nexport default {\n\tid: 'robotframework',\n\talias: 'robot',\n\tgrammar () {\n\t\tconst comment = {\n\t\t\tpattern: /(^[ \\t]*| {2}|\\t)#.*/m,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t};\n\n\t\tconst variable = {\n\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)[$@&%]\\{(?:[^{}\\r\\n]|\\{[^{}\\r\\n]*\\})*\\}/,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /^[$@&%]\\{|\\}$/,\n\t\t\t},\n\t\t};\n\n\t\t/**\n\t\t * @param {string} name\n\t\t * @param {GrammarTokens} [inside]\n\t\t * @returns {GrammarToken}\n\t\t */\n\t\tfunction createSection (name, inside) {\n\t\t\treturn {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/^ ?\\*{3}[ \\t]*<name>[ \\t]*\\*{3}(?:.|[\\r\\n](?!\\*{3}))*/.source.replace(\n\t\t\t\t\t\t/<name>/g,\n\t\t\t\t\t\t() => name\n\t\t\t\t\t),\n\t\t\t\t\t'im'\n\t\t\t\t),\n\t\t\t\talias: 'section',\n\t\t\t\tinside: {\n\t\t\t\t\t'section-header': {\n\t\t\t\t\t\tpattern: /^ ?\\*{3}.+?\\*{3}/,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t...inside,\n\t\t\t\t\t'tag': {\n\t\t\t\t\t\tpattern: /([\\r\\n](?: {2}|\\t)[ \\t]*)\\[[-\\w]+\\]/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /\\[|\\]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'variable': variable,\n\t\t\t\t\t'comment': comment,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst docTag = {\n\t\t\tpattern:\n\t\t\t\t/(\\[Documentation\\](?: {2}|\\t)[ \\t]*)(?![ \\t]|#)(?:.|(?:\\r\\n?|\\n)[ \\t]*\\.{3})+/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'string',\n\t\t};\n\n\t\tconst testNameLike = {\n\t\t\tpattern: /([\\r\\n] ?)(?!#)(?:\\S(?:[ \\t]\\S)*)+/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'function',\n\t\t\tinside: {\n\t\t\t\t'variable': variable,\n\t\t\t},\n\t\t};\n\n\t\tconst testPropertyLike = {\n\t\t\tpattern: /([\\r\\n](?: {2}|\\t)[ \\t]*)(?!\\[|\\.{3}|#)(?:\\S(?:[ \\t]\\S)*)+/,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'variable': variable,\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'settings': createSection('Settings', {\n\t\t\t\t'documentation': {\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/([\\r\\n] ?Documentation(?: {2}|\\t)[ \\t]*)(?![ \\t]|#)(?:.|(?:\\r\\n?|\\n)[ \\t]*\\.{3})+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'string',\n\t\t\t\t},\n\t\t\t\t'property': {\n\t\t\t\t\tpattern: /([\\r\\n] ?)(?!\\.{3}|#)(?:\\S(?:[ \\t]\\S)*)+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t}),\n\t\t\t'variables': createSection('Variables'),\n\t\t\t'test-cases': createSection('Test Cases', {\n\t\t\t\t'test-name': testNameLike,\n\t\t\t\t'documentation': docTag,\n\t\t\t\t'property': testPropertyLike,\n\t\t\t}),\n\t\t\t'keywords': createSection('Keywords', {\n\t\t\t\t'keyword-name': testNameLike,\n\t\t\t\t'documentation': docTag,\n\t\t\t\t'property': testPropertyLike,\n\t\t\t}),\n\t\t\t'tasks': createSection('Tasks', {\n\t\t\t\t'task-name': testNameLike,\n\t\t\t\t'documentation': docTag,\n\t\t\t\t'property': testPropertyLike,\n\t\t\t}),\n\t\t\t'comment': comment,\n\t\t};\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n * @typedef {import('../types.d.ts').GrammarTokens} GrammarTokens\n */\n"
  },
  {
    "path": "src/languages/ruby.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'ruby'>} */\nexport default {\n\tid: 'ruby',\n\tbase: clike,\n\talias: 'rb',\n\tgrammar () {\n\t\t/**\n\t\t * Original by Samuel Flores\n\t\t *\n\t\t * Adds the following new token classes:\n\t\t *     constant, builtin, variable, symbol, regex\n\t\t */\n\n\t\tconst interpolation = {\n\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)#\\{(?:[^{}]|\\{[^{}]*\\})*\\}/,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'content': {\n\t\t\t\t\tpattern: /^(#\\{)[\\s\\S]+(?=\\}$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'ruby',\n\t\t\t\t},\n\t\t\t\t'delimiter': {\n\t\t\t\t\tpattern: /^#\\{|\\}$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tconst percentExpression =\n\t\t\t'(?:' +\n\t\t\t[\n\t\t\t\t/([^a-zA-Z0-9\\s{(\\[<=])(?:(?!\\1)[^\\\\]|\\\\[\\s\\S])*\\1/.source,\n\t\t\t\t/\\((?:[^()\\\\]|\\\\[\\s\\S]|\\((?:[^()\\\\]|\\\\[\\s\\S])*\\))*\\)/.source,\n\t\t\t\t/\\{(?:[^{}\\\\]|\\\\[\\s\\S]|\\{(?:[^{}\\\\]|\\\\[\\s\\S])*\\})*\\}/.source,\n\t\t\t\t/\\[(?:[^\\[\\]\\\\]|\\\\[\\s\\S]|\\[(?:[^\\[\\]\\\\]|\\\\[\\s\\S])*\\])*\\]/.source,\n\t\t\t\t/<(?:[^<>\\\\]|\\\\[\\s\\S]|<(?:[^<>\\\\]|\\\\[\\s\\S])*>)*>/.source,\n\t\t\t].join('|') +\n\t\t\t')';\n\n\t\tconst symbolName = /(?:\"(?:\\\\.|[^\"\\\\\\r\\n])*\"|(?:\\b[a-zA-Z_]\\w*|[^\\s\\0-\\x7F]+)[?!]?|\\$.)/\n\t\t\t.source;\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /#.*|^=begin\\s[\\s\\S]*?^=end/m,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'class-name': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(\\b(?:class|module)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+|\\b[A-Z_]\\w*(?=\\s*\\.\\s*new\\b)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /[.\\\\]/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\\b/,\n\t\t\t'operator': /\\.{2,3}|&\\.|===|<?=>|[!=]?~|(?:&&|\\|\\||<<|>>|\\*\\*|[+\\-*/%<>!^&|=])=?|[?:]/,\n\t\t\t'punctuation': /[(){}[\\].,;]/,\n\t\t\t$insertBefore: {\n\t\t\t\t'operator': {\n\t\t\t\t\t'double-colon': {\n\t\t\t\t\t\tpattern: /::/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'keyword': {\n\t\t\t\t\t'regex-literal': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t\t/%r/.source + percentExpression + /[egimnosux]{0,6}/.source\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t\t\t'regex': /[\\s\\S]+/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/(^|[^/])\\/(?!\\/)(?:\\[[^\\r\\n\\]]+\\]|\\\\.|[^[/\\\\\\r\\n])+\\/[egimnosux]{0,6}(?=\\s*(?:$|[\\r\\n,.;})#]))/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t\t\t'regex': /[\\s\\S]+/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'variable': /[@$]+[a-zA-Z_]\\w*(?:[?!]|\\b)/,\n\t\t\t\t\t'symbol': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: RegExp(/(^|[^:]):/.source + symbolName),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t\t/([\\r\\n{(,][ \\t]*)/.source + symbolName + /(?=:(?!:))/.source\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'method-definition': {\n\t\t\t\t\t\tpattern: /(\\bdef\\s+)\\w+(?:\\s*\\.\\s*\\w+)?/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'function': /\\b\\w+$/,\n\t\t\t\t\t\t\t'keyword': /^self\\b/,\n\t\t\t\t\t\t\t'class-name': /^\\w+/,\n\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'string': {\n\t\t\t\t\t'string-literal': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: RegExp(/%[qQiIwWs]?/.source + percentExpression),\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/(\"|')(?:#\\{[^}]+\\}|#(?!\\{)|\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\#\\r\\n])*\\1/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /<<[-~]?([a-z_]\\w*)[\\r\\n](?:.*[\\r\\n])*?[\\t ]*\\1/i,\n\t\t\t\t\t\t\talias: 'heredoc-string',\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\t\t\t\tpattern: /^<<[-~]?[a-z_]\\w*|\\b[a-z_]\\w*$/i,\n\t\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t\t'symbol': /\\b\\w+/,\n\t\t\t\t\t\t\t\t\t\t'punctuation': /^<<[-~]?/,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /<<[-~]?'([a-z_]\\w*)'[\\r\\n](?:.*[\\r\\n])*?[\\t ]*\\1/i,\n\t\t\t\t\t\t\talias: 'heredoc-string',\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\t\t\t\tpattern: /^<<[-~]?'[a-z_]\\w*'|\\b[a-z_]\\w*$/i,\n\t\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t\t'symbol': /\\b\\w+/,\n\t\t\t\t\t\t\t\t\t\t'punctuation': /^<<[-~]?'|'$/,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'command-literal': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: RegExp(/%x/.source + percentExpression),\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t\t\t'command': {\n\t\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /`(?:#\\{[^}]+\\}|#(?!\\{)|\\\\(?:\\r\\n|[\\s\\S])|[^\\\\`#\\r\\n])*`/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation': interpolation,\n\t\t\t\t\t\t\t\t'command': {\n\t\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t'number': {\n\t\t\t\t\t'builtin':\n\t\t\t\t\t\t/\\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\\b/,\n\t\t\t\t\t'constant': /\\b[A-Z][A-Z0-9_]*(?:[?!]|\\b)/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t$delete: ['function', 'string'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/rust.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'rust'>} */\nexport default {\n\tid: 'rust',\n\tgrammar () {\n\t\tlet multilineComment = /\\/\\*(?:[^*/]|\\*(?!\\/)|\\/(?!\\*)|<self>)*\\*\\//.source;\n\t\tfor (let i = 0; i < 2; i++) {\n\t\t\t// support 4 levels of nested comments\n\t\t\tmultilineComment = multilineComment.replace(/<self>/g, () => multilineComment);\n\t\t}\n\t\tmultilineComment = multilineComment.replace(/<self>/g, () => /[^\\s\\S]/.source);\n\n\t\tconst string = {\n\t\t\tpattern: /b?\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"|b?r(#*)\"(?:[^\"]|\"(?!\\1))*\"\\1/,\n\t\t\tgreedy: true,\n\t\t};\n\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(/(^|[^\\\\])/.source + multilineComment),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'string': string,\n\t\t\t'char': {\n\t\t\t\tpattern: /b?'(?:\\\\(?:x[0-7][\\da-fA-F]|u\\{(?:[\\da-fA-F]_*){1,6}\\}|.)|[^\\\\\\r\\n\\t'])'/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'attribute': {\n\t\t\t\tpattern: /#!?\\[(?:[^\\[\\]\"]|\"(?:\\\\[\\s\\S]|[^\\\\\"])*\")*\\]/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'attr-name',\n\t\t\t\tinside: {\n\t\t\t\t\t'string': string,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Closure params should not be confused with bitwise OR |\n\t\t\t'closure-params': {\n\t\t\t\tpattern: /([=(,:]\\s*|\\bmove\\s*)\\|[^|]*\\||\\|[^|]*\\|(?=\\s*(?:\\{|->))/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'closure-punctuation': {\n\t\t\t\t\t\tpattern: /^\\||\\|$/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t$rest: 'rust',\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'lifetime-annotation': {\n\t\t\t\tpattern: /'\\w+/,\n\t\t\t\talias: 'symbol',\n\t\t\t},\n\n\t\t\t'fragment-specifier': {\n\t\t\t\tpattern: /(\\$\\w+:)[a-z]+/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'variable': /\\$\\w+/,\n\n\t\t\t'function-definition': {\n\t\t\t\tpattern: /(\\bfn\\s+)\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'type-definition': {\n\t\t\t\tpattern: /(\\b(?:enum|struct|trait|type|union)\\s+)\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'class-name',\n\t\t\t},\n\t\t\t'module-declaration': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\b(?:crate|mod)\\s+)[a-z][a-z_\\d]*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'namespace',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(\\b(?:crate|self|super)\\s*)::\\s*[a-z][a-z_\\d]*\\b(?:\\s*::(?:\\s*[a-z][a-z_\\d]*\\s*::)*)?/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'namespace',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /::/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword': [\n\t\t\t\t// https://github.com/rust-lang/reference/blob/master/src/keywords.md\n\t\t\t\t/\\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\\b/,\n\t\t\t\t// primitives and str\n\t\t\t\t// https://doc.rust-lang.org/stable/rust-by-example/primitives.html\n\t\t\t\t/\\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\\b/,\n\t\t\t],\n\n\t\t\t// functions can technically start with an upper-case letter, but this will introduce a lot of false positives\n\t\t\t// and Rust's naming conventions recommend snake_case anyway.\n\t\t\t// https://doc.rust-lang.org/1.0.0/style/style/naming/README.html\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\s*(?:::\\s*<|\\())/,\n\t\t\t'macro': {\n\t\t\t\tpattern: /\\b\\w+!/,\n\t\t\t\talias: 'property',\n\t\t\t},\n\t\t\t'constant': /\\b[A-Z_][A-Z_\\d]+\\b/,\n\t\t\t'class-name': /\\b[A-Z]\\w*\\b/,\n\n\t\t\t'namespace': {\n\t\t\t\tpattern: /(?:\\b[a-z][a-z_\\d]*\\s*::\\s*)*\\b[a-z][a-z_\\d]*\\s*::(?!\\s*<)/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /::/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Hex, oct, bin, dec numbers with visual separators and type suffix\n\t\t\t'number':\n\t\t\t\t/\\b(?:0x[\\dA-Fa-f](?:_?[\\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\\d(?:_?\\d)*)?\\.)?\\d(?:_?\\d)*(?:[Ee][+-]?\\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'punctuation': /->|\\.\\.=|\\.{1,3}|::|[{}[\\];(),:]/,\n\t\t\t'operator': /[-+*\\/%!^]=?|=[=>]?|&[&=]?|\\|[|=]?|<<?=?|>>?=?|[@?]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/sas.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'sas'>} */\nexport default {\n\tid: 'sas',\n\tgrammar () {\n\t\tconst stringPattern = /(?:\"(?:\"\"|[^\"])*\"(?!\")|'(?:''|[^'])*'(?!'))/.source;\n\n\t\tconst number = /\\b(?:\\d[\\da-f]*x|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)\\b/i;\n\t\tconst numericConstant = {\n\t\t\tpattern: RegExp(stringPattern + '[bx]'),\n\t\t\talias: 'number',\n\t\t};\n\n\t\tconst macroVariable = {\n\t\t\tpattern: /&[a-z_]\\w*/i,\n\t\t};\n\n\t\tconst macroKeyword = {\n\t\t\tpattern:\n\t\t\t\t/((?:^|\\s|=|\\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\\b/i,\n\t\t\tlookbehind: true,\n\t\t\talias: 'keyword',\n\t\t};\n\n\t\tconst step = {\n\t\t\tpattern: /(^|\\s)(?:proc\\s+\\w+|data(?!=)|quit|run)\\b/i,\n\t\t\talias: 'keyword',\n\t\t\tlookbehind: true,\n\t\t};\n\n\t\tconst comment = [\n\t\t\t/\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t{\n\t\t\t\tpattern: /(^[ \\t]*|;\\s*)\\*[^;]*;/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t];\n\n\t\tconst string = {\n\t\t\tpattern: RegExp(stringPattern),\n\t\t\tgreedy: true,\n\t\t};\n\n\t\tconst punctuation = /[$%@.(){}\\[\\];,\\\\]/;\n\n\t\tconst func = {\n\t\t\tpattern: /%?\\b\\w+(?=\\()/,\n\t\t\talias: 'keyword',\n\t\t};\n\n\t\tconst args = {\n\t\t\t'function': func,\n\t\t\t'arg-value': {\n\t\t\t\tpattern: /(=\\s*)[A-Z\\.]+/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'operator': /=/,\n\t\t\t'macro-variable': macroVariable,\n\t\t\t'arg': {\n\t\t\t\tpattern: /[A-Z]+/i,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'number': number,\n\t\t\t'numeric-constant': numericConstant,\n\t\t\t'punctuation': punctuation,\n\t\t\t'string': string,\n\t\t};\n\n\t\tconst format = {\n\t\t\tpattern: /\\b(?:format|put)\\b=?[\\w'$.]+/i,\n\t\t\tinside: {\n\t\t\t\t'keyword': /^(?:format|put)(?==)/i,\n\t\t\t\t'equals': /=/,\n\t\t\t\t'format': {\n\t\t\t\t\tpattern: /(?:\\w|\\$\\d)+\\.\\d?/,\n\t\t\t\t\talias: 'number',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tconst altformat = {\n\t\t\tpattern: /\\b(?:format|put)\\s+[\\w']+(?:\\s+[$.\\w]+)+(?=;)/i,\n\t\t\tinside: {\n\t\t\t\t'keyword': /^(?:format|put)/i,\n\t\t\t\t'format': {\n\t\t\t\t\tpattern: /[\\w$]+\\.\\d?/,\n\t\t\t\t\talias: 'number',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tconst globalStatements = {\n\t\t\tpattern:\n\t\t\t\t/((?:^|\\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\\d?)\\b/i,\n\t\t\tlookbehind: true,\n\t\t\talias: 'keyword',\n\t\t};\n\n\t\tconst submitStatement = {\n\t\t\tpattern: /(^|\\s)(?:submit(?:\\s+(?:load|norun|parseonly))?|endsubmit)\\b/i,\n\t\t\tlookbehind: true,\n\t\t\talias: 'keyword',\n\t\t};\n\n\t\tconst actionSets =\n\t\t\t/aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce/\n\t\t\t\t.source;\n\n\t\tconst casActions = {\n\t\t\tpattern: RegExp(\n\t\t\t\t/(^|\\s)(?:action\\s+)?(?:<act>)\\.[a-z]+\\b[^;]+/.source.replace(\n\t\t\t\t\t/<act>/g,\n\t\t\t\t\t() => actionSets\n\t\t\t\t),\n\t\t\t\t'i'\n\t\t\t),\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'keyword': RegExp(\n\t\t\t\t\t/(?:<act>)\\.[a-z]+\\b/.source.replace(/<act>/g, () => actionSets),\n\t\t\t\t\t'i'\n\t\t\t\t),\n\t\t\t\t'action': {\n\t\t\t\t\tpattern: /(?:action)/i,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t\t'comment': comment,\n\t\t\t\t'function': func,\n\t\t\t\t'arg-value': args['arg-value'],\n\t\t\t\t'operator': args.operator,\n\t\t\t\t'argument': args.arg,\n\t\t\t\t'number': number,\n\t\t\t\t'numeric-constant': numericConstant,\n\t\t\t\t'punctuation': punctuation,\n\t\t\t\t'string': string,\n\t\t\t},\n\t\t};\n\n\t\tconst keywords = {\n\t\t\tpattern:\n\t\t\t\t/((?:^|\\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|name|noobs|nowd|_?null_|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\\s+do|then|title\\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\\b/i,\n\t\t\tlookbehind: true,\n\t\t};\n\n\t\treturn {\n\t\t\t'datalines': {\n\t\t\t\tpattern: /^([ \\t]*)(?:cards|(?:data)?lines);[\\s\\S]+?^[ \\t]*;/im,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'string',\n\t\t\t\tinside: {\n\t\t\t\t\t'keyword': {\n\t\t\t\t\t\tpattern: /^(?:cards|(?:data)?lines)/i,\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /;/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'proc-sql': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^proc\\s+(?:fed)?sql(?:\\s+[\\w|=]+)?;)[\\s\\S]+?(?=^(?:proc\\s+\\w+|data|quit|run);|(?![\\s\\S]))/im,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'sql': {\n\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t/^[ \\t]*(?:select|alter\\s+table|(?:create|describe|drop)\\s+(?:index|table(?:\\s+constraints)?|view)|create\\s+unique\\s+index|insert\\s+into|update)(?:<str>|[^;\"'])+;/.source.replace(\n\t\t\t\t\t\t\t\t/<str>/g,\n\t\t\t\t\t\t\t\t() => stringPattern\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t'im'\n\t\t\t\t\t\t),\n\t\t\t\t\t\talias: 'language-sql',\n\t\t\t\t\t\tinside: 'sql',\n\t\t\t\t\t},\n\t\t\t\t\t'global-statements': globalStatements,\n\t\t\t\t\t'sql-statements': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/(^|\\s)(?:disconnect\\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\\b/i,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t'number': number,\n\t\t\t\t\t'numeric-constant': numericConstant,\n\t\t\t\t\t'punctuation': punctuation,\n\t\t\t\t\t'string': string,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'proc-groovy': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^proc\\s+groovy(?:\\s+[\\w|=]+)?;)[\\s\\S]+?(?=^(?:proc\\s+\\w+|data|quit|run);|(?![\\s\\S]))/im,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'comment': comment,\n\t\t\t\t\t'groovy': {\n\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t/(^[ \\t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:<str>|[^\"'])+?(?=endsubmit;)/.source.replace(\n\t\t\t\t\t\t\t\t/<str>/g,\n\t\t\t\t\t\t\t\t() => stringPattern\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t'im'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'language-groovy',\n\t\t\t\t\t\tinside: 'groovy',\n\t\t\t\t\t},\n\t\t\t\t\t'keyword': keywords,\n\t\t\t\t\t'submit-statement': submitStatement,\n\t\t\t\t\t'global-statements': globalStatements,\n\t\t\t\t\t'number': number,\n\t\t\t\t\t'numeric-constant': numericConstant,\n\t\t\t\t\t'punctuation': punctuation,\n\t\t\t\t\t'string': string,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'proc-lua': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^proc\\s+lua(?:\\s+[\\w|=]+)?;)[\\s\\S]+?(?=^(?:proc\\s+\\w+|data|quit|run);|(?![\\s\\S]))/im,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'comment': comment,\n\t\t\t\t\t'lua': {\n\t\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t\t/(^[ \\t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:<str>|[^\"'])+?(?=endsubmit;)/.source.replace(\n\t\t\t\t\t\t\t\t/<str>/g,\n\t\t\t\t\t\t\t\t() => stringPattern\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t'im'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'language-lua',\n\t\t\t\t\t\tinside: 'lua',\n\t\t\t\t\t},\n\t\t\t\t\t'keyword': keywords,\n\t\t\t\t\t'submit-statement': submitStatement,\n\t\t\t\t\t'global-statements': globalStatements,\n\t\t\t\t\t'number': number,\n\t\t\t\t\t'numeric-constant': numericConstant,\n\t\t\t\t\t'punctuation': punctuation,\n\t\t\t\t\t'string': string,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'proc-cas': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^proc\\s+cas(?:\\s+[\\w|=]+)?;)[\\s\\S]+?(?=^(?:proc\\s+\\w+|quit|data);|(?![\\s\\S]))/im,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'comment': comment,\n\t\t\t\t\t'statement-var': {\n\t\t\t\t\t\tpattern: /((?:^|\\s)=?)saveresult\\s[^;]+/im,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'statement': {\n\t\t\t\t\t\t\t\tpattern: /^saveresult\\s+\\S+/i,\n\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\tkeyword: /^(?:saveresult)/i,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t$rest: args,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'cas-actions': casActions,\n\t\t\t\t\t'statement': {\n\t\t\t\t\t\tpattern: /((?:^|\\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: args,\n\t\t\t\t\t},\n\t\t\t\t\t'step': step,\n\t\t\t\t\t'keyword': keywords,\n\t\t\t\t\t'function': func,\n\t\t\t\t\t'format': format,\n\t\t\t\t\t'altformat': altformat,\n\t\t\t\t\t'global-statements': globalStatements,\n\t\t\t\t\t'number': number,\n\t\t\t\t\t'numeric-constant': numericConstant,\n\t\t\t\t\t'punctuation': punctuation,\n\t\t\t\t\t'string': string,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'proc-args': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/(^proc\\s+\\w+\\s+)(?!\\s)(?:[^;\"']|<str>)+;/.source.replace(\n\t\t\t\t\t\t/<str>/g,\n\t\t\t\t\t\t() => stringPattern\n\t\t\t\t\t),\n\t\t\t\t\t'im'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: args,\n\t\t\t},\n\t\t\t/*Special keywords within macros*/\n\t\t\t'macro-keyword': macroKeyword,\n\t\t\t'macro-variable': macroVariable,\n\t\t\t'macro-string-functions': {\n\t\t\t\tpattern: /((?:^|\\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\\(.*?(?:[^%]\\))/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'function': {\n\t\t\t\t\t\tpattern: /%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t'macro-keyword': macroKeyword,\n\t\t\t\t\t'macro-variable': macroVariable,\n\t\t\t\t\t'escaped-char': {\n\t\t\t\t\t\tpattern: /%['\"()<>=¬^~;,#]/,\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': punctuation,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'macro-declaration': {\n\t\t\t\tpattern: /^%macro[^;]+(?=;)/im,\n\t\t\t\tinside: {\n\t\t\t\t\t'keyword': /%macro/i,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'macro-end': {\n\t\t\t\tpattern: /^%mend[^;]+(?=;)/im,\n\t\t\t\tinside: {\n\t\t\t\t\t'keyword': /%mend/i,\n\t\t\t\t},\n\t\t\t},\n\t\t\t/*%_zscore(headcir, _lhc, _mhc, _shc, headcz, headcpct, _Fheadcz); */\n\t\t\t'macro': {\n\t\t\t\tpattern: /%_\\w+(?=\\()/,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'input': {\n\t\t\t\tpattern: /\\binput\\s[-\\w\\s/*.$&]+;/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'input': {\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t\tpattern: /^input/i,\n\t\t\t\t\t},\n\t\t\t\t\t'comment': comment,\n\t\t\t\t\t'number': number,\n\t\t\t\t\t'numeric-constant': numericConstant,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'options-args': {\n\t\t\t\tpattern: /(^options)[-'\"|/\\\\<>*+=:()\\w\\s]*(?=;)/im,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: args,\n\t\t\t},\n\t\t\t'cas-actions': casActions,\n\t\t\t'comment': comment,\n\t\t\t'function': func,\n\t\t\t'format': format,\n\t\t\t'altformat': altformat,\n\t\t\t'numeric-constant': numericConstant,\n\t\t\t'datetime': {\n\t\t\t\t// '1jan2013'd, '9:25:19pm't, '18jan2003:9:27:05am'dt\n\t\t\t\tpattern: RegExp(stringPattern + '(?:dt?|t)'),\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t\t'string': string,\n\t\t\t'step': step,\n\t\t\t'keyword': keywords,\n\t\t\t// In SAS Studio syntax highlighting, these operators are styled like keywords\n\t\t\t'operator-keyword': {\n\t\t\t\tpattern: /\\b(?:eq|ge|gt|in|le|lt|ne|not)\\b/i,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\t\t\t// Decimal (1.2e23), hexadecimal (0c1x)\n\t\t\t'number': number,\n\t\t\t'operator': /\\*\\*?|\\|\\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\\/=&]|[~¬^]=?/,\n\t\t\t'punctuation': punctuation,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/sass.js",
    "content": "import css from './css.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'sass'>} */\nexport default {\n\tid: 'sass',\n\tbase: css,\n\tgrammar ({ base }) {\n\t\tconst variable = /\\$[-\\w]+|#\\{\\$[-\\w]+\\}/;\n\t\tconst operator = [\n\t\t\t/[+*\\/%]|[=!]=|<=?|>=?|\\b(?:and|not|or)\\b/,\n\t\t\t{\n\t\t\t\tpattern: /(\\s)-(?=\\s)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t];\n\n\t\treturn {\n\t\t\t// Sass comments don't need to be closed, only indented\n\t\t\t'comment': {\n\t\t\t\tpattern: /^([ \\t]*)\\/[\\/*].*(?:(?:\\r?\\n|\\r)\\1[ \\t].+)*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t$insert: {\n\t\t\t\t// We want to consume the whole line\n\t\t\t\t'atrule-line': {\n\t\t\t\t\t$before: 'atrule',\n\t\t\t\t\t// Includes support for = and + shortcuts\n\t\t\t\t\tpattern: /^(?:[ \\t]*)[@+=].+/m,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'atrule': /(?:@[\\w-]+|[+=])/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// We want to consume the whole line\n\t\t\t\t'variable-line': {\n\t\t\t\t\t$before: 'property',\n\t\t\t\t\tpattern: /^[ \\t]*\\$.+/m,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /:/,\n\t\t\t\t\t\t'variable': variable,\n\t\t\t\t\t\t'operator': operator,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// We want to consume the whole line\n\t\t\t\t'property-line': {\n\t\t\t\t\t$before: 'property',\n\t\t\t\t\tpattern: /^[ \\t]*(?:[^:\\s]+ *:.*|:[^:\\s].*)/m,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'property': [\n\t\t\t\t\t\t\t/[^:\\s]+(?=\\s*:)/,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpattern: /(:)[^:\\s]+/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\t'punctuation': /:/,\n\t\t\t\t\t\t'variable': variable,\n\t\t\t\t\t\t'operator': operator,\n\t\t\t\t\t\t'important': base.important,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// Now that whole lines for other patterns are consumed,\n\t\t\t\t// what's left should be selectors\n\t\t\t\t'selector': {\n\t\t\t\t\t$before: 'punctuation',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/^([ \\t]*)\\S(?:,[^,\\r\\n]+|[^,\\r\\n]*)(?:,[^,\\r\\n]+)*(?:,(?:\\r?\\n|\\r)\\1[ \\t]+\\S(?:,[^,\\r\\n]+|[^,\\r\\n]*)(?:,[^,\\r\\n]+)*)*/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\t$delete: ['atrule', 'property', 'important'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/scala.js",
    "content": "import java from './java.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'scala'>} */\nexport default {\n\tid: 'scala',\n\tbase: java,\n\tgrammar () {\n\t\treturn {\n\t\t\t'triple-quoted-string': {\n\t\t\t\tpattern: /\"\"\"[\\s\\S]*?\"\"\"/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'string',\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/<-|=>|\\b(?:abstract|case|catch|class|def|derives|do|else|enum|extends|extension|final|finally|for|forSome|given|if|implicit|import|infix|inline|lazy|match|new|null|object|opaque|open|override|package|private|protected|return|sealed|self|super|this|throw|trait|transparent|try|type|using|val|var|while|with|yield)\\b/,\n\t\t\t'number': /\\b0x(?:[\\da-f]*\\.)?[\\da-f]+|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e\\d+)?[dfl]?/i,\n\t\t\t'builtin':\n\t\t\t\t/\\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\\b/,\n\t\t\t'symbol': /'[^\\d\\s\\\\]\\w*/,\n\t\t\t$insert: {\n\t\t\t\t'string-interpolation': {\n\t\t\t\t\t$before: 'triple-quoted-string',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b[a-z]\\w*(?:\"\"\"(?:[^$]|\\$(?:[^{]|\\{(?:[^{}]|\\{[^{}]*\\})*\\}))*?\"\"\"|\"(?:[^$\"\\r\\n]|\\$(?:[^{]|\\{(?:[^{}]|\\{[^{}]*\\})*\\}))*\")/i,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'id': {\n\t\t\t\t\t\t\tpattern: /^\\w+/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\talias: 'function',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'escape': {\n\t\t\t\t\t\t\tpattern: /\\\\\\$\"|\\$[$\"]/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\talias: 'symbol',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\t\tpattern: /\\$(?:\\w+|\\{(?:[^{}]|\\{[^{}]*\\})*\\})/,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'punctuation': /^\\$\\{?|\\}$/,\n\t\t\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\t\tinside: 'scala',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t$delete: ['doc-comment', 'class-name', 'function', 'constant'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/scheme.js",
    "content": "/**\n * Given a topologically sorted BNF grammar, this will return the RegExp source of last rule of the grammar.\n *\n * @param {object} grammar\n * @returns {string}\n */\nfunction SortedBNF (grammar) {\n\tlet key;\n\tfor (key in grammar) {\n\t\tgrammar[key] = grammar[key].replace(/<[\\w\\s]+>/g, key => {\n\t\t\treturn '(?:' + grammar[key].trim() + ')';\n\t\t});\n\t}\n\tif (key === undefined) {\n\t\tthrow new Error('Empty grammar');\n\t}\n\t// return the last item\n\treturn grammar[key];\n}\n\n/** @type {import('../types.d.ts').LanguageProto<'scheme'>} */\nexport default {\n\tid: 'scheme',\n\tgrammar: {\n\t\t// this supports \"normal\" single-line comments:\n\t\t//   ; comment\n\t\t// and (potentially nested) multiline comments:\n\t\t//   #| comment #| nested |# still comment |#\n\t\t// (only 1 level of nesting is supported)\n\t\t'comment':\n\t\t\t/;.*|#;\\s*(?:\\((?:[^()]|\\([^()]*\\))*\\)|\\[(?:[^\\[\\]]|\\[[^\\[\\]]*\\])*\\])|#\\|(?:[^#|]|#(?!\\|)|\\|(?!#)|#\\|(?:[^#|]|#(?!\\|)|\\|(?!#))*\\|#)*\\|#/,\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"\\\\]|\\\\.)*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'symbol': {\n\t\t\tpattern: /'[^()\\[\\]#'\\s]+/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'char': {\n\t\t\tpattern: /#\\\\(?:[ux][a-fA-F\\d]+\\b|[-a-zA-Z]+\\b|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|\\S)/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'lambda-parameter': [\n\t\t\t// https://www.cs.cmu.edu/Groups/AI/html/r4rs/r4rs_6.html#SEC30\n\t\t\t{\n\t\t\t\tpattern: /((?:^|[^'`#])[(\\[]lambda\\s+)(?:[^|()\\[\\]'\\s]+|\\|(?:[^\\\\|]|\\\\.)*\\|)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /((?:^|[^'`#])[(\\[]lambda\\s+[(\\[])[^()\\[\\]']+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'keyword': {\n\t\t\tpattern:\n\t\t\t\t/((?:^|[^'`#])[(\\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\\*)?|let\\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\\[\\]\\s]|$)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'builtin': {\n\t\t\t// all functions of the base library of R7RS plus some of built-ins of R5Rs\n\t\t\tpattern:\n\t\t\t\t/((?:^|[^'`#])[(\\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\\?|boolean=?\\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\\?|\\?|<\\?|<=\\?|=\\?|>\\?|>=\\?)|close-(?:input-port|output-port|port)|complex\\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\\??|eq\\?|equal\\?|eqv\\?|error|error-object(?:-irritants|-message|\\?)|eval|even\\?|exact(?:-integer-sqrt|-integer\\?|\\?)?|expt|features|file-error\\?|floor(?:-quotient|-remainder|\\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\\??|input-port(?:-open\\?|\\?)|integer(?:->char|\\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\\?|newline|not|null\\?|number(?:->string|\\?)|numerator|odd\\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\\?|\\?)|pair\\?|peek-char|peek-u8|port\\?|positive\\?|procedure\\?|quotient|raise|raise-continuable|rational\\?|rationalize|read-(?:bytevector|bytevector!|char|error\\?|line|string|u8)|real\\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\\?|<\\?|<=\\?|=\\?|>\\?|>=\\?)?|substring|symbol(?:->string|\\?|=\\?)|syntax-error|textual-port\\?|truncate(?:-quotient|-remainder|\\/)?|u8-ready\\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\\?)(?=[()\\[\\]\\s]|$)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'operator': {\n\t\t\tpattern: /((?:^|[^'`#])[(\\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\\[\\]\\s]|$)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'number': {\n\t\t\t// The number pattern from [the R7RS spec](https://small.r7rs.org/attachment/r7rs.pdf).\n\t\t\t//\n\t\t\t// <number>      := <num 2>|<num 8>|<num 10>|<num 16>\n\t\t\t// <num R>       := <prefix R><complex R>\n\t\t\t// <complex R>   := <real R>(?:@<real R>|<imaginary R>)?|<imaginary R>\n\t\t\t// <imaginary R> := [+-](?:<ureal R>|(?:inf|nan)\\.0)?i\n\t\t\t// <real R>      := [+-]?<ureal R>|[+-](?:inf|nan)\\.0\n\t\t\t// <ureal R>     := <uint R>(?:\\/<uint R>)?\n\t\t\t//                | <decimal R>\n\t\t\t//\n\t\t\t// <decimal 10>  := (?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?\n\t\t\t// <uint R>      := <digit R>+\n\t\t\t// <prefix R>    := <radix R>(?:#[ei])?|(?:#[ei])?<radix R>\n\t\t\t// <radix 2>     := #b\n\t\t\t// <radix 8>     := #o\n\t\t\t// <radix 10>    := (?:#d)?\n\t\t\t// <radix 16>    := #x\n\t\t\t// <digit 2>     := [01]\n\t\t\t// <digit 8>     := [0-7]\n\t\t\t// <digit 10>    := \\d\n\t\t\t// <digit 16>    := [0-9a-f]\n\t\t\t//\n\t\t\t// The problem with this grammar is that the resulting regex is way to complex, so we simplify by grouping all\n\t\t\t// non-decimal bases together. This results in a decimal (dec) and combined binary, octal, and hexadecimal (box)\n\t\t\t// pattern:\n\t\t\tpattern: RegExp(\n\t\t\t\tSortedBNF({\n\t\t\t\t\t'<ureal dec>': /\\d+(?:\\/\\d+)|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[esfdl][+-]?\\d+)?/\n\t\t\t\t\t\t.source,\n\t\t\t\t\t'<real dec>': /[+-]?<ureal dec>|[+-](?:inf|nan)\\.0/.source,\n\t\t\t\t\t'<imaginary dec>': /[+-](?:<ureal dec>|(?:inf|nan)\\.0)?i/.source,\n\t\t\t\t\t'<complex dec>': /<real dec>(?:@<real dec>|<imaginary dec>)?|<imaginary dec>/\n\t\t\t\t\t\t.source,\n\t\t\t\t\t'<num dec>': /(?:#d(?:#[ei])?|#[ei](?:#d)?)?<complex dec>/.source,\n\n\t\t\t\t\t'<ureal box>': /[0-9a-f]+(?:\\/[0-9a-f]+)?/.source,\n\t\t\t\t\t'<real box>': /[+-]?<ureal box>|[+-](?:inf|nan)\\.0/.source,\n\t\t\t\t\t'<imaginary box>': /[+-](?:<ureal box>|(?:inf|nan)\\.0)?i/.source,\n\t\t\t\t\t'<complex box>': /<real box>(?:@<real box>|<imaginary box>)?|<imaginary box>/\n\t\t\t\t\t\t.source,\n\t\t\t\t\t'<num box>': /#[box](?:#[ei])?|(?:#[ei])?#[box]<complex box>/.source,\n\n\t\t\t\t\t'<number>': /(^|[()\\[\\]\\s])(?:<num dec>|<num box>)(?=[()\\[\\]\\s]|$)/.source,\n\t\t\t\t}),\n\t\t\t\t'i'\n\t\t\t),\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'boolean': {\n\t\t\tpattern: /(^|[()\\[\\]\\s])#(?:[ft]|false|true)(?=[()\\[\\]\\s]|$)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'function': {\n\t\t\tpattern: /((?:^|[^'`#])[(\\[])(?:[^|()\\[\\]'\\s]+|\\|(?:[^\\\\|]|\\\\.)*\\|)(?=[()\\[\\]\\s]|$)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'identifier': {\n\t\t\tpattern: /(^|[()\\[\\]\\s])\\|(?:[^\\\\|]|\\\\.)*\\|(?=[()\\[\\]\\s]|$)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'punctuation': /[()\\[\\]']/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/scss.js",
    "content": "import css from './css.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'scss'>} */\nexport default {\n\tid: 'scss',\n\tbase: css,\n\tgrammar () {\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'atrule': {\n\t\t\t\tpattern: /@[\\w-](?:\\([^()]+\\)|[^()\\s]|\\s+(?!\\s))*?(?=\\s+[{;])/,\n\t\t\t\tinside: {\n\t\t\t\t\t'rule': /@[\\w-]+/,\n\t\t\t\t\t$rest: 'scss',\n\t\t\t\t},\n\t\t\t},\n\t\t\t// url, compassified\n\t\t\t'url': /(?:[-a-z]+-)?url(?=\\()/i,\n\t\t\t// CSS selector regex is not appropriate for Sass\n\t\t\t// since there can be lot more things (var, @ directive, nesting..)\n\t\t\t// a selector must start at the end of a property or after a brace (end of other rules or nesting)\n\t\t\t// it can contain some characters that aren't used for defining rules or end of selector, & (parent selector), or interpolated variable\n\t\t\t// the end of a selector is found when there is no rules in it ( {} or {\\s}) or if there is a property (because an interpolated var\n\t\t\t// can \"pass\" as a selector- e.g: proper#{$erty})\n\t\t\t// this one was hard to do, so please be careful if you edit this one :)\n\t\t\t'selector': {\n\t\t\t\t// Initial look-ahead is used to prevent matching of blank selectors\n\t\t\t\tpattern:\n\t\t\t\t\t/(?=\\S)[^@;{}()]?(?:[^@;{}()\\s]|\\s+(?!\\s)|#\\{\\$[-\\w]+\\})+(?=\\s*\\{(?:\\}|\\s|[^}][^:{}]*[:{][^}]))/,\n\t\t\t\tinside: {\n\t\t\t\t\t'parent': {\n\t\t\t\t\t\tpattern: /&/,\n\t\t\t\t\t\talias: 'important',\n\t\t\t\t\t},\n\t\t\t\t\t'placeholder': /%[-\\w]+/,\n\t\t\t\t\t'variable': /\\$[-\\w]+|#\\{\\$[-\\w]+\\}/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'property': {\n\t\t\t\tpattern: /(?:[-\\w]|\\$[-\\w]|#\\{\\$[-\\w]+\\})+(?=\\s*:)/,\n\t\t\t\tinside: {\n\t\t\t\t\t'variable': /\\$[-\\w]+|#\\{\\$[-\\w]+\\}/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'atrule': {\n\t\t\t\t\t'keyword': [\n\t\t\t\t\t\t/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\\b/i,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /( )(?:from|through)(?= )/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t'important': {\n\t\t\t\t\t// var and interpolated vars\n\t\t\t\t\t'variable': /\\$[-\\w]+|#\\{\\$[-\\w]+\\}/,\n\t\t\t\t},\n\t\t\t\t'function': {\n\t\t\t\t\t'module-modifier': {\n\t\t\t\t\t\tpattern: /\\b(?:as|hide|show|with)\\b/i,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t'placeholder': {\n\t\t\t\t\t\tpattern: /%[-\\w]+/,\n\t\t\t\t\t\talias: 'selector',\n\t\t\t\t\t},\n\t\t\t\t\t'statement': {\n\t\t\t\t\t\tpattern: /\\B!(?:default|optional)\\b/i,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t\t\t'null': {\n\t\t\t\t\t\tpattern: /\\bnull\\b/,\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t\t'operator': {\n\t\t\t\t\t\tpattern: /(\\s)(?:[-+*\\/%]|[=!]=|<=?|>=?|and|not|or)(?=\\s)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/shell-session.js",
    "content": "import bash from './bash.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'shell-session'>} */\nexport default {\n\tid: 'shell-session',\n\trequire: bash,\n\talias: ['sh-session', 'shellsession'],\n\tgrammar () {\n\t\t// CAREFUL!\n\t\t// The following patterns are concatenated, so the group referenced by a back reference is non-obvious!\n\n\t\tconst strings = [\n\t\t\t// normal string\n\t\t\t/\"(?:\\\\[\\s\\S]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^\"\\\\`$])*\"/.source,\n\t\t\t/'[^']*'/.source,\n\t\t\t/\\$'(?:[^'\\\\]|\\\\[\\s\\S])*'/.source,\n\n\t\t\t// here doc\n\t\t\t// 2 capturing groups\n\t\t\t/<<-?\\s*([\"']?)(\\w+)\\1\\s[\\s\\S]*?[\\r\\n]\\2/.source,\n\t\t].join('|');\n\n\t\treturn {\n\t\t\t'command': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t// user info\n\t\t\t\t\t/^/.source +\n\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t// <user> \":\" ( <path> )?\n\t\t\t\t\t\t(/[^\\s@:$#%*!/\\\\]+@[^\\r\\n@:$#%*!/\\\\]+(?::[^\\0-\\x1F$#%*?\"<>:;|]+)?/.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// <path>\n\t\t\t\t\t\t\t// Since the path pattern is quite general, we will require it to start with a special character to\n\t\t\t\t\t\t\t// prevent false positives.\n\t\t\t\t\t\t\t/[/~.][^\\0-\\x1F$#%*?\"<>@:;|]*/.source) +\n\t\t\t\t\t\t')?' +\n\t\t\t\t\t\t// shell symbol\n\t\t\t\t\t\t/[$#%](?=\\s)/.source +\n\t\t\t\t\t\t// bash command\n\t\t\t\t\t\t/(?:[^\\\\\\r\\n \\t'\"<$]|[ \\t](?:(?!#)|#.*$)|\\\\(?:[^\\r]|\\r\\n?)|\\$(?!')|<(?!<)|<<str>>)+/.source.replace(\n\t\t\t\t\t\t\t/<<str>>/g,\n\t\t\t\t\t\t\t() => strings\n\t\t\t\t\t\t),\n\t\t\t\t\t'm'\n\t\t\t\t),\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'info': {\n\t\t\t\t\t\t// foo@bar:~/files$ exit\n\t\t\t\t\t\t// foo@bar$ exit\n\t\t\t\t\t\t// ~/files$ exit\n\t\t\t\t\t\tpattern: /^[^#$%]+/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'user': /^[^\\s@:$#%*!/\\\\]+@[^\\r\\n@:$#%*!/\\\\]+/,\n\t\t\t\t\t\t\t'punctuation': /:/,\n\t\t\t\t\t\t\t'path': /[\\s\\S]+/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'bash': {\n\t\t\t\t\t\tpattern: /(^[$#%]\\s*)\\S[\\s\\S]*/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'language-bash',\n\t\t\t\t\t\tinside: 'bash',\n\t\t\t\t\t},\n\t\t\t\t\t'shell-symbol': {\n\t\t\t\t\t\tpattern: /^[$#%]/,\n\t\t\t\t\t\talias: 'important',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'output': /.(?:.*(?:[\\r\\n]|.$))*/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/smali.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'smali'>} */\nexport default {\n\tid: 'smali',\n\tgrammar () {\n\t\t// Test files for the parser itself:\n\t\t// https://github.com/JesusFreke/smali/tree/master/smali/src/test/resources/LexerTest\n\n\t\treturn {\n\t\t\t'comment': /#.*/,\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:[^\\r\\n\\\\\"]|\\\\.)*\"|'(?:[^\\r\\n\\\\']|\\\\(?:.|u[\\da-fA-F]{4}))'/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'class-name': {\n\t\t\t\tpattern: /(^|[^L])L(?:(?:\\w+|`[^`\\r\\n]*`)\\/)*(?:[\\w$]+|`[^`\\r\\n]*`)(?=\\s*;)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'class-name': {\n\t\t\t\t\t\tpattern: /(^L|\\/)(?:[\\w$]+|`[^`\\r\\n]*`)$/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'namespace': {\n\t\t\t\t\t\tpattern: /^(L)(?:(?:\\w+|`[^`\\r\\n]*`)\\/)+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /\\//,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'builtin': /^L/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'builtin': [\n\t\t\t\t{\n\t\t\t\t\t// Reference: https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields#types\n\t\t\t\t\tpattern: /([();\\[])[BCDFIJSVZ]+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// e.g. .field mWifiOnUid:I\n\t\t\t\t\tpattern: /([\\w$>]:)[BCDFIJSVZ]/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\.end\\s+)[\\w-]+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\w.-])\\.(?!\\d)[\\w-]+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^|[^\\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\\w.-])/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'function': {\n\t\t\t\tpattern: /(^|[^\\w.-])(?:\\w+|<[\\w$-]+>)(?=\\()/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'field': {\n\t\t\t\tpattern: /[\\w$]+(?=:)/,\n\t\t\t\talias: 'variable',\n\t\t\t},\n\t\t\t'register': {\n\t\t\t\tpattern: /(^|[^\\w.-])[vp]\\d(?![\\w.-])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'variable',\n\t\t\t},\n\n\t\t\t'boolean': {\n\t\t\t\tpattern: /(^|[^\\w.-])(?:false|true)(?![\\w.-])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'number': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^/\\w.-])-?(?:NAN|INFINITY|0x(?:[\\dA-F]+(?:\\.[\\dA-F]*)?|\\.[\\dA-F]+)(?:p[+-]?[\\dA-F]+)?|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?)[dflst]?(?![\\w.-])/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'label': {\n\t\t\t\tpattern: /(:)\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'property',\n\t\t\t},\n\n\t\t\t'operator': /->|\\.\\.|[\\[=]/,\n\t\t\t'punctuation': /[{}(),;:]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/smalltalk.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'smalltalk'>} */\nexport default {\n\tid: 'smalltalk',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\"(?:\"\"|[^\"])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'char': {\n\t\t\tpattern: /\\$./,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /'(?:''|[^'])*'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'symbol': /#[\\da-z]+|#(?:-|([+\\/\\\\*~<>=@%|&?!])\\1?)|#(?=\\()/i,\n\t\t'block-arguments': {\n\t\t\tpattern: /(\\[\\s*):[^\\[|]*\\|/,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'variable': /:[\\da-z]+/i,\n\t\t\t\t'punctuation': /\\|/,\n\t\t\t},\n\t\t},\n\t\t'temporary-variables': {\n\t\t\tpattern: /\\|[^|]+\\|/,\n\t\t\tinside: {\n\t\t\t\t'variable': /[\\da-z]+/i,\n\t\t\t\t'punctuation': /\\|/,\n\t\t\t},\n\t\t},\n\t\t'keyword': /\\b(?:new|nil|self|super)\\b/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'number': [/\\d+r-?[\\dA-Z]+(?:\\.[\\dA-Z]+)?(?:e-?\\d+)?/, /\\b\\d+(?:\\.\\d+)?(?:e-?\\d+)?/],\n\t\t'operator': /[<=]=?|:=|~[~=]|\\/\\/?|\\\\\\\\|>[>=]?|[!^+\\-*&|,@]/,\n\t\t'punctuation': /[.;:?\\[\\](){}]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/smarty.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'smarty'>} */\nexport default {\n\tid: 'smarty',\n\trequire: markup,\n\tgrammar () {\n\t\tconst expression = {\n\t\t\tpattern: /[\\s\\S]+/,\n\t\t\tinside: /** @type {GrammarToken['inside']} */ (null),\n\t\t};\n\n\t\tconst smarty = {\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\t\tpattern: /\\{[^{}]*\\}|`[^`]*`/,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\t\t\tpattern: /^[{`]|[`}]$/,\n\t\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'expression': expression,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'variable': /\\$\\w+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /'(?:\\\\.|[^'\\\\\\r\\n])*'/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword': {\n\t\t\t\tpattern: /(^\\{\\/?)[a-z_]\\w*\\b(?!\\()/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'delimiter': {\n\t\t\t\tpattern: /^\\{\\/?|\\}$/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'number': /\\b0x[\\dA-Fa-f]+|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[Ee][-+]?\\d+)?/,\n\t\t\t'variable': [\n\t\t\t\t/\\$(?!\\d)\\w+/,\n\t\t\t\t/#(?!\\d)\\w+#/,\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\.|->|\\w\\s*=)(?!\\d)\\w+\\b(?!\\()/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\[)(?!\\d)\\w+(?=\\])/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'function': {\n\t\t\t\tpattern: /(\\|\\s*)@?[a-z_]\\w*|\\b[a-z_]\\w*(?=\\()/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'attr-name': /\\b[a-z_]\\w*(?=\\s*=)/i,\n\t\t\t'boolean': /\\b(?:false|no|off|on|true|yes)\\b/,\n\t\t\t'punctuation': /[\\[\\](){}.,:`]|->/,\n\t\t\t'operator': [\n\t\t\t\t/[+\\-*\\/%]|==?=?|[!<>]=?|&&|\\|\\|?/,\n\t\t\t\t/\\bis\\s+(?:not\\s+)?(?:div|even|odd)(?:\\s+by)?\\b/,\n\t\t\t\t/\\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\\b/,\n\t\t\t],\n\t\t};\n\n\t\texpression.inside = smarty;\n\n\t\tconst string = /\"(?:\\\\.|[^\"\\\\\\r\\n])*\"|'(?:\\\\.|[^'\\\\\\r\\n])*'/;\n\t\tconst smartyPattern = RegExp(\n\t\t\t/\\{(?:[^{}\"']|<str>|\\{(?:[^{}\"']|<str>|\\{(?:[^{}\"']|<str>)*\\})*\\})*\\}/.source.replace(\n\t\t\t\t/<str>/g,\n\t\t\t\t() => string.source\n\t\t\t)\n\t\t);\n\n\t\treturn {\n\t\t\t'ignore-literal': {\n\t\t\t\tpattern: /(\\{literal\\})[\\s\\S]*?(?=\\{\\/literal\\})/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'embedded-php': {\n\t\t\t\tpattern: /(\\{php\\})[\\s\\S]*?(?=\\{\\/php\\})/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: ['php', 'language-php'],\n\t\t\t\tinside: 'php',\n\t\t\t},\n\t\t\t'smarty-comment': {\n\t\t\t\tpattern: /\\{\\*[\\s\\S]*?\\*\\}/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'comment',\n\t\t\t},\n\t\t\t'smarty': {\n\t\t\t\tpattern: smartyPattern,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: smarty,\n\t\t\t},\n\t\t\t$tokenize: embeddedIn('markup'),\n\t\t};\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/sml.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'sml'>} */\nexport default {\n\tid: 'sml',\n\talias: 'smlnj',\n\tgrammar () {\n\t\t// https://smlfamily.github.io/sml97-defn.pdf\n\t\t// https://people.mpi-sws.org/~rossberg/sml.html\n\n\t\tconst keywords =\n\t\t\t/\\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\\b/i;\n\n\t\treturn {\n\t\t\t// allow one level of nesting\n\t\t\t'comment': /\\(\\*(?:[^*(]|\\*(?!\\))|\\((?!\\*)|\\(\\*(?:[^*(]|\\*(?!\\))|\\((?!\\*))*\\*\\))*\\*\\)/,\n\t\t\t'string': {\n\t\t\t\tpattern: /#?\"(?:[^\"\\\\]|\\\\.)*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\t// This is only an approximation since the real grammar is context-free\n\t\t\t\t\t//\n\t\t\t\t\t// Why the main loop so complex?\n\t\t\t\t\t// The main loop is approximately the same as /(?:\\s*(?:[*,]|->)\\s*<TERMINAL>)*/ which is, obviously, a lot\n\t\t\t\t\t// simpler. The difference is that if a comma is the last iteration of the loop, then the terminal must be\n\t\t\t\t\t// followed by a long identifier.\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/((?:^|[^:]):\\s*)<TERMINAL>(?:\\s*(?:(?:\\*|->)\\s*<TERMINAL>|,\\s*<TERMINAL>(?:(?=<NOT-LAST>)|(?!<NOT-LAST>)\\s+<LONG-ID>)))*/.source\n\t\t\t\t\t\t\t.replace(/<NOT-LAST>/g, () => /\\s*(?:[*,]|->)/.source)\n\t\t\t\t\t\t\t.replace(\n\t\t\t\t\t\t\t\t/<TERMINAL>/g,\n\t\t\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t\t\t/(?:'[\\w']*|<LONG-ID>|\\((?:[^()]|\\([^()]*\\))*\\)|\\{(?:[^{}]|\\{[^{}]*\\})*\\})(?:\\s+<LONG-ID>)*/\n\t\t\t\t\t\t\t\t\t\t.source\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.replace(/<LONG-ID>/g, () => /(?!<KEYWORD>)[a-z\\d_][\\w'.]*/.source)\n\t\t\t\t\t\t\t.replace(/<KEYWORD>/g, () => keywords.source),\n\t\t\t\t\t\t'i'\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: 'sml',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:^|[^\\w'])(?:datatype|exception|functor|signature|structure|type)\\s+)[a-z_][\\w'.]*/i,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'function': {\n\t\t\t\tpattern: /((?:^|[^\\w'])fun\\s+)[a-z_][\\w'.]*/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'keyword': keywords,\n\t\t\t'variable': {\n\t\t\t\tpattern: /(^|[^\\w'])'[\\w']*/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\n\t\t\t'number': /~?\\b(?:\\d+(?:\\.\\d+)?(?:e~?\\d+)?|0x[\\da-f]+)\\b/i,\n\t\t\t'word': {\n\t\t\t\tpattern: /\\b0w(?:\\d+|x[\\da-f]+)\\b/i,\n\t\t\t\talias: 'constant',\n\t\t\t},\n\n\t\t\t'boolean': /\\b(?:false|true)\\b/i,\n\t\t\t'operator': /\\.\\.\\.|:[>=:]|=>?|->|[<>]=?|[!+\\-*/^#|@~]/,\n\t\t\t'punctuation': /[(){}\\[\\].:,;]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/solidity.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'solidity'>} */\nexport default {\n\tid: 'solidity',\n\tbase: clike,\n\talias: 'sol',\n\tgrammar () {\n\t\treturn {\n\t\t\t'class-name': {\n\t\t\t\tpattern: /(\\b(?:contract|enum|interface|library|new|struct|using)\\s+)(?!\\d)[\\w$]+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\\b/,\n\t\t\t'operator': /=>|->|:=|=:|\\*\\*|\\+\\+|--|\\|\\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/,\n\t\t\t$insertBefore: {\n\t\t\t\t'keyword': {\n\t\t\t\t\t'builtin':\n\t\t\t\t\t\t/\\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\\d|3[0-2])?)\\b/,\n\t\t\t\t},\n\t\t\t\t'number': {\n\t\t\t\t\t'version': {\n\t\t\t\t\t\tpattern: /([<>]=?|\\^)\\d+\\.\\d+\\.\\d+\\b/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'number',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/solution-file.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'solution-file'>} */\nexport default {\n\tid: 'solution-file',\n\talias: 'sln',\n\tgrammar () {\n\t\tconst guid = {\n\t\t\t// https://en.wikipedia.org/wiki/Universally_unique_identifier#Format\n\t\t\tpattern: /\\{[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}\\}/i,\n\t\t\talias: 'constant',\n\t\t\tinside: {\n\t\t\t\t'punctuation': /[{}]/,\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /#.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"\\r\\n]*\"|'[^'\\r\\n]*'/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'guid': guid,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'object': {\n\t\t\t\t// Foo\n\t\t\t\t//   Bar(\"abs\") = 9\n\t\t\t\t//   EndBar\n\t\t\t\t//   Prop = TRUE\n\t\t\t\t// EndFoo\n\t\t\t\tpattern:\n\t\t\t\t\t/^([ \\t]*)(?:([A-Z]\\w*)\\b(?=.*(?:\\r\\n?|\\n)(?:\\1[ \\t].*(?:\\r\\n?|\\n))*\\1End\\2(?=[ \\t]*$))|End[A-Z]\\w*(?=[ \\t]*$))/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'property': {\n\t\t\t\tpattern: /^([ \\t]*)(?!\\s)[^\\r\\n\"#=()]*[^\\s\"#=()](?=\\s*=)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'guid': guid,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'guid': guid,\n\t\t\t'number': /\\b\\d+(?:\\.\\d+)*\\b/,\n\t\t\t'boolean': /\\b(?:FALSE|TRUE)\\b/,\n\t\t\t'operator': /=/,\n\t\t\t'punctuation': /[(),]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/soy.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'soy'>} */\nexport default {\n\tid: 'soy',\n\trequire: markup,\n\tgrammar () {\n\t\tconst stringPattern = /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/;\n\t\tconst numberPattern = /\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b|\\b0x[\\dA-F]+\\b/;\n\n\t\treturn {\n\t\t\t'ignore-literal': {\n\t\t\t\tpattern: /(\\{literal\\})[\\s\\S]*?(?=\\{\\/literal\\})/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'soy': {\n\t\t\t\tpattern: /\\{\\{.+?\\}\\}|\\{.+?\\}|\\s\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'comment': [\n\t\t\t\t\t\t/\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /(\\s)\\/\\/.*/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'command-arg': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/(\\{+\\/?\\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\\s+)\\.?[\\w.]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'parameter': {\n\t\t\t\t\t\tpattern: /(\\{+\\/?\\s*@?param\\??\\s+)\\.?[\\w.]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t},\n\t\t\t\t\t'keyword': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t\t/(\\{+\\/?[^\\S\\r\\n]*)(?:\\\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\\??|rb|sp|switch|template|xid)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t/\\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\\b/,\n\t\t\t\t\t],\n\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\tpattern: /^\\{+\\/?|\\/?\\}+$/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t'property': /\\w+(?==)/,\n\t\t\t\t\t'variable': {\n\t\t\t\t\t\tpattern: /\\$[^\\W\\d]\\w*(?:\\??(?:\\.\\w+|\\[[^\\]]+\\]))*/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'string': {\n\t\t\t\t\t\t\t\tpattern: stringPattern,\n\t\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'number': numberPattern,\n\t\t\t\t\t\t\t'punctuation': /[\\[\\].?]/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'string': {\n\t\t\t\t\t\tpattern: stringPattern,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\t\t\t\t\t'function': [\n\t\t\t\t\t\t/\\w+(?=\\()/,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /(\\|[^\\S\\r\\n]*)\\w+/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t\t\t'number': numberPattern,\n\t\t\t\t\t'operator': /\\?:?|<=?|>=?|==?|!=|[+*/%-]|\\b(?:and|not|or)\\b/,\n\t\t\t\t\t'punctuation': /[{}()\\[\\]|.,:]/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t$tokenize: embeddedIn('markup'),\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/sparql.js",
    "content": "import turtle from './turtle.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'sparql'>} */\nexport default {\n\tid: 'sparql',\n\tbase: turtle,\n\talias: 'rq',\n\tgrammar () {\n\t\treturn {\n\t\t\t'boolean': /\\b(?:false|true)\\b/i,\n\t\t\t'variable': {\n\t\t\t\tpattern: /[?$]\\w+/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'punctuation': {\n\t\t\t\t\t'keyword': [\n\t\t\t\t\t\t/\\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\\b/i,\n\t\t\t\t\t\t/\\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\\b(?=\\s*\\()/i,\n\t\t\t\t\t\t/\\b(?:BASE|GRAPH|PREFIX)\\b/i,\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/splunk-spl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'splunk-spl'>} */\nexport default {\n\tid: 'splunk-spl',\n\tgrammar: {\n\t\t'comment': /`comment\\(\"(?:\\\\.|[^\\\\\"])*\"\\)`/,\n\t\t'string': {\n\t\t\tpattern: /\"(?:\\\\.|[^\\\\\"])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t// https://docs.splunk.com/Documentation/Splunk/7.3.0/SearchReference/ListOfSearchCommands\n\t\t'keyword':\n\t\t\t/\\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\\b/i,\n\t\t'operator-word': {\n\t\t\tpattern: /\\b(?:and|as|by|not|or|xor)\\b/i,\n\t\t\talias: 'operator',\n\t\t},\n\t\t'function': /\\b\\w+(?=\\s*\\()/,\n\t\t'property': /\\b\\w+(?=\\s*=(?!=))/,\n\t\t'date': {\n\t\t\t// MM/DD/YYYY(:HH:MM:SS)?\n\t\t\tpattern: /\\b\\d{1,2}\\/\\d{1,2}\\/\\d{1,4}(?:(?::\\d{1,2}){3})?\\b/,\n\t\t\talias: 'number',\n\t\t},\n\t\t'number': /\\b\\d+(?:\\.\\d+)?\\b/,\n\t\t'boolean': /\\b(?:f|false|t|true)\\b/i,\n\t\t'operator': /[<>=]=?|[-+*/%|]/,\n\t\t'punctuation': /[()[\\],]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/sqf.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'sqf'>} */\nexport default {\n\tid: 'sqf',\n\tbase: clike,\n\tgrammar ({ base }) {\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\tpattern: /\"(?:(?:\"\")?[^\"])*\"(?!\")|'(?:[^'])*'/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\\b/i,\n\t\t\t'boolean': /\\b(?:false|true)\\b/i,\n\t\t\t'function':\n\t\t\t\t/\\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\\b/i,\n\t\t\t'number': /(?:\\$|\\b0x)[\\da-f]+\\b|(?:\\B\\.\\d+|\\b\\d+(?:\\.\\d+)?)(?:e[+-]?\\d+)?\\b/i,\n\t\t\t'operator': /##|>>|&&|\\|\\||[!=<>]=?|[-+*/%#^]|\\b(?:and|mod|not|or)\\b/i,\n\t\t\t'magic-variable': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\\b/i,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'constant': /\\bDIK(?:_[a-z\\d]+)+\\b/i,\n\t\t\t$insert: {\n\t\t\t\t'macro': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: /(^[ \\t]*)#[a-z](?:[^\\r\\n\\\\]|\\\\(?:\\r\\n|[\\s\\S]))*/im,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'property',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'directive': {\n\t\t\t\t\t\t\tpattern: /#[a-z]+\\b/i,\n\t\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'comment': base.comment,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t$delete: ['class-name'],\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/sql.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'sql'>} */\nexport default {\n\tid: 'sql',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|(?:--|\\/\\/|#).*)/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'variable': [\n\t\t\t{\n\t\t\t\tpattern: /@([\"'`])(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])+\\1/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t/@[\\w.$]+/,\n\t\t],\n\t\t'string': {\n\t\t\tpattern: /(^|[^@\\\\])(\"|')(?:\\\\[\\s\\S]|(?!\\2)[^\\\\]|\\2\\2)*\\2/,\n\t\t\tgreedy: true,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'identifier': {\n\t\t\tpattern: /(^|[^@\\\\])`(?:\\\\[\\s\\S]|[^`\\\\]|``)*`/,\n\t\t\tgreedy: true,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /^`|`$/,\n\t\t\t},\n\t\t},\n\t\t'function':\n\t\t\t/\\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\\s*\\()/i, // Should we highlight user defined functions too?\n\t\t'keyword':\n\t\t\t/\\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\\b/i,\n\t\t'boolean': /\\b(?:FALSE|NULL|TRUE)\\b/i,\n\t\t'number': /\\b0x[\\da-f]+\\b|\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+\\b/i,\n\t\t'operator':\n\t\t\t/[-+*\\/=%^~]|&&?|\\|\\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\\b/i,\n\t\t'punctuation': /[;[\\]()`,.]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/squirrel.js",
    "content": "import { toArray } from '../util/iterables.js';\nimport clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'squirrel'>} */\nexport default {\n\tid: 'squirrel',\n\tbase: clike,\n\tgrammar ({ base }) {\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t...toArray(/** @type {import('../types.d.ts').GrammarTokens} */ (base).comment),\n\t\t\t\t{\n\t\t\t\t\tpattern: /#.*/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'string': {\n\t\t\t\tpattern: /(^|[^\\\\\"'@])(?:@\"(?:[^\"]|\"\")*\"(?!\")|\"(?:[^\\\\\\r\\n\"]|\\\\.)*\")/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'class-name': {\n\t\t\t\tpattern: /(\\b(?:class|enum|extends|instanceof)\\s+)\\w+(?:\\.\\w+)*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:__FILE__|__LINE__|base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield)\\b/,\n\n\t\t\t'number': /\\b(?:0x[0-9a-fA-F]+|\\d+(?:\\.(?:\\d+|[eE][+-]?\\d+))?)\\b/,\n\t\t\t'operator': /\\+\\+|--|<=>|<[-<]|>>>?|&&?|\\|\\|?|[-+*/%!=<>]=?|[~^]|::?/,\n\t\t\t'punctuation': /[(){}\\[\\],;.]/,\n\t\t\t$insert: {\n\t\t\t\t'char': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: /(^|[^\\\\\"'])'(?:[^\\\\']|\\\\(?:[xuU][0-9a-fA-F]{0,8}|[\\s\\S]))'/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t'attribute-punctuation': {\n\t\t\t\t\t$before: 'operator',\n\t\t\t\t\tpattern: /<\\/|\\/>/,\n\t\t\t\t\talias: 'important',\n\t\t\t\t},\n\t\t\t\t'lambda': {\n\t\t\t\t\t$before: 'operator',\n\t\t\t\t\tpattern: /@(?=\\()/,\n\t\t\t\t\talias: 'operator',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/stan.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'stan'>} */\nexport default {\n\tid: 'stan',\n\tgrammar () {\n\t\t// https://mc-stan.org/docs/2_28/reference-manual/bnf-grammars.html\n\n\t\tconst higherOrderFunctions =\n\t\t\t/\\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\\b/;\n\n\t\treturn {\n\t\t\t'comment': /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\/|#(?!include).*/,\n\t\t\t'string': {\n\t\t\t\t// String literals can contain spaces and any printable ASCII characters except for \" and \\\n\t\t\t\t// https://mc-stan.org/docs/2_24/reference-manual/print-statements-section.html#string-literals\n\t\t\t\tpattern: /\"[\\x20\\x21\\x23-\\x5B\\x5D-\\x7E]*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'directive': {\n\t\t\t\tpattern: /^([ \\t]*)#include\\b.*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'property',\n\t\t\t},\n\n\t\t\t'function-arg': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t'(' +\n\t\t\t\t\t\thigherOrderFunctions.source +\n\t\t\t\t\t\t/\\s*\\(\\s*/.source +\n\t\t\t\t\t\t')' +\n\t\t\t\t\t\t/[a-zA-Z]\\w*/.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'constraint': {\n\t\t\t\tpattern: /(\\b(?:int|matrix|real|row_vector|vector)\\s*)<[^<>]*>/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'expression': {\n\t\t\t\t\t\tpattern: /(=\\s*)\\S(?:\\S|\\s+(?!\\s))*?(?=\\s*(?:>$|,\\s*\\w+\\s*=))/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: 'stan',\n\t\t\t\t\t},\n\t\t\t\t\t'property': /\\b[a-z]\\w*(?=\\s*=)/i,\n\t\t\t\t\t'operator': /=/,\n\t\t\t\t\t'punctuation': /^<|>$|,/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'keyword': [\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\bdata(?=\\s*\\{)|\\b(?:functions|generated|model|parameters|quantities|transformed)\\b/,\n\t\t\t\t\talias: 'program-block',\n\t\t\t\t},\n\t\t\t\t/\\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\\b/,\n\t\t\t\t// these are functions that are known to take another function as their first argument.\n\t\t\t\thigherOrderFunctions,\n\t\t\t],\n\t\t\t'function': /\\b[a-z]\\w*(?=\\s*\\()/i,\n\t\t\t'number':\n\t\t\t\t/(?:\\b\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\B\\.\\d+(?:_\\d+)*)(?:E[+-]?\\d+(?:_\\d+)*)?i?(?!\\w)/i,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\n\t\t\t'operator': /<-|\\.[*/]=?|\\|\\|?|&&|[!=<>+\\-*/]=?|['^%~?:]/,\n\t\t\t'punctuation': /[()\\[\\]{},;]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/stata.js",
    "content": "import java from './java.js';\nimport mata from './mata.js';\nimport python from './python.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'stata'>} */\nexport default {\n\tid: 'stata',\n\trequire: [mata, java, python],\n\tgrammar () {\n\t\t// https://www.stata.com/manuals/u.pdf\n\t\t// https://www.stata.com/manuals/p.pdf\n\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^[ \\t]*)\\*.*/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|\\s)\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'string-literal': {\n\t\t\t\tpattern: /\"[^\"\\r\\n]*\"|[‘`']\".*?\"[’`']/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\tpattern: /\\$\\{[^{}]*\\}|[‘`']\\w[^’`'\\r\\n]*[’`']/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /^\\$\\{|\\}$/,\n\t\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\tinside: 'stata',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'mata': {\n\t\t\t\tpattern: /(^[ \\t]*mata[ \\t]*:)[\\s\\S]+?(?=^end\\b)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'language-mata',\n\t\t\t\tinside: 'mata',\n\t\t\t},\n\t\t\t'java': {\n\t\t\t\tpattern: /(^[ \\t]*java[ \\t]*:)[\\s\\S]+?(?=^end\\b)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'language-java',\n\t\t\t\tinside: 'java',\n\t\t\t},\n\t\t\t'python': {\n\t\t\t\tpattern: /(^[ \\t]*python[ \\t]*:)[\\s\\S]+?(?=^end\\b)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'language-python',\n\t\t\t\tinside: 'python',\n\t\t\t},\n\n\t\t\t'command': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[ \\t]*(?:\\.[ \\t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\\b[^:\\r\\n]*:[ \\t]*|(?:capture|noisily|quietly|version)[ \\t]+)?)[a-zA-Z]\\w*/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'variable': /\\$\\w+|[‘`']\\w[^’`'\\r\\n]*[’`']/,\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \\t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\\b/,\n\n\t\t\t'boolean': /\\b(?:off|on)\\b/,\n\t\t\t'number': /\\b\\d+(?:\\.\\d+)?\\b|\\B\\.\\d+/,\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\()/i,\n\n\t\t\t'operator': /\\+\\+|--|##?|[<>!=~]=?|[+\\-*^&|/]/,\n\t\t\t'punctuation': /[(){}[\\],:]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/stylus.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'stylus'>} */\nexport default {\n\tid: 'stylus',\n\tgrammar () {\n\t\tconst unit = {\n\t\t\tpattern: /(\\b\\d+)(?:%|[a-z]+)/,\n\t\t\tlookbehind: true,\n\t\t};\n\t\t// 123 -123 .123 -.123 12.3 -12.3\n\t\tconst number = {\n\t\t\tpattern: /(^|[^\\w.-])-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)/,\n\t\t\tlookbehind: true,\n\t\t};\n\n\t\tconst inside = /** @type {Grammar} */ ({\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'url': {\n\t\t\t\tpattern: /\\burl\\(([\"']?).*?\\1\\)/i,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /(\"|')(?:(?!\\1)[^\\\\\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*\\1/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /\\{[^\\r\\n}:]+\\}/,\n\t\t\t\talias: 'variable',\n\t\t\t\tinside: {\n\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\tpattern: /^\\{|\\}$/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t$rest: null,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'func': {\n\t\t\t\tpattern: /[\\w-]+\\([^)]*\\).*/,\n\t\t\t\tinside: {\n\t\t\t\t\t'function': /^[^(]+/,\n\t\t\t\t\t$rest: null,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'important': /\\B!(?:important|optional)\\b/i,\n\t\t\t'keyword': {\n\t\t\t\tpattern: /(^|\\s+)(?:(?:else|for|if|return|unless)(?=\\s|$)|@[\\w-]+)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'hexcode': /#[\\da-f]{3,6}/i,\n\t\t\t'color': [\n\t\t\t\t/\\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\\b/i,\n\t\t\t\t{\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b(?:hsl|rgb)\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%?\\s*,\\s*\\d{1,3}%?\\s*\\)\\B|\\b(?:hsl|rgb)a\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%?\\s*,\\s*\\d{1,3}%?\\s*,\\s*(?:0|0?\\.\\d+|1)\\s*\\)\\B/i,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'unit': unit,\n\t\t\t\t\t\t'number': number,\n\t\t\t\t\t\t'function': /[\\w-]+(?=\\()/,\n\t\t\t\t\t\t'punctuation': /[(),]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'entity': /\\\\[\\da-f]{1,8}/i,\n\t\t\t'unit': unit,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'operator': [\n\t\t\t\t// We want non-word chars around \"-\" because it is\n\t\t\t\t// accepted in property names.\n\t\t\t\t/~|[+!\\/%<>?=]=?|[-:]=|\\*[*=]?|\\.{2,3}|&&|\\|\\||\\B-\\B|\\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\\b/,\n\t\t\t],\n\t\t\t'number': number,\n\t\t\t'punctuation': /[{}()\\[\\];:,]/,\n\t\t});\n\n\t\t/** @type {Grammar} */ (\n\t\t\t/** @type {GrammarToken} */ (inside['interpolation']).inside\n\t\t).$rest = inside;\n\t\t/** @type {Grammar} */ (/** @type {GrammarToken} */ (inside['func']).inside).$rest = inside;\n\n\t\treturn /** @type {Grammar} */ ({\n\t\t\t'atrule-declaration': {\n\t\t\t\tpattern: /(^[ \\t]*)@.+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'atrule': /^@[\\w-]+/,\n\t\t\t\t\t$rest: inside,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'variable-declaration': {\n\t\t\t\tpattern: /(^[ \\t]*)[\\w$-]+\\s*.?=[ \\t]*(?:\\{[^{}]*\\}|\\S.*|$)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'variable': /^\\S+/,\n\t\t\t\t\t$rest: inside,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'statement': {\n\t\t\t\tpattern: /(^[ \\t]*)(?:else|for|if|return|unless)[ \\t].+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'keyword': /^\\S+/,\n\t\t\t\t\t$rest: inside,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// A property/value pair cannot end with a comma or a brace\n\t\t\t// It cannot have indented content unless it ended with a semicolon\n\t\t\t'property-declaration': {\n\t\t\t\tpattern:\n\t\t\t\t\t/((?:^|\\{)([ \\t]*))(?:[\\w-]|\\{[^}\\r\\n]+\\})+(?:\\s*:\\s*|[ \\t]+)(?!\\s)[^{\\r\\n]*(?:;|[^{\\r\\n,]$(?!(?:\\r?\\n|\\r)(?:\\{|\\2[ \\t])))/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'property': {\n\t\t\t\t\t\tpattern: /^[^\\s:]+/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'interpolation': inside.interpolation,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t$rest: inside,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// A selector can contain parentheses only as part of a pseudo-element\n\t\t\t// It can span multiple lines.\n\t\t\t// It must end with a comma or an accolade or have indented content.\n\t\t\t'selector': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[ \\t]*)(?:(?=\\S)(?:[^{}\\r\\n:()]|::?[\\w-]+(?:\\([^)\\r\\n]*\\)|(?![\\w-]))|\\{[^}\\r\\n]+\\})+)(?:(?:\\r?\\n|\\r)(?:\\1(?:(?=\\S)(?:[^{}\\r\\n:()]|::?[\\w-]+(?:\\([^)\\r\\n]*\\)|(?![\\w-]))|\\{[^}\\r\\n]+\\})+)))*(?:,$|\\{|(?=(?:\\r?\\n|\\r)(?:\\{|\\1[ \\t])))/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation': inside.interpolation,\n\t\t\t\t\t'comment': inside.comment,\n\t\t\t\t\t'punctuation': /[{},]/,\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'func': inside.func,\n\t\t\t'string': inside.string,\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'interpolation': inside.interpolation,\n\t\t\t'punctuation': /[{}()\\[\\];:.]/,\n\t\t});\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/supercollider.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'supercollider'>} */\nexport default {\n\tid: 'supercollider',\n\talias: 'sclang',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\\/\\/.*|\\/\\*(?:[^*/]|\\*(?!\\/)|\\/(?!\\*)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*\\*\\//,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /(^|[^\\\\])\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'char': {\n\t\t\tpattern: /\\$(?:[^\\\\\\r\\n]|\\\\.)/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'symbol': {\n\t\t\tpattern: /(^|[^\\\\])'(?:[^'\\\\]|\\\\[\\s\\S])*'|\\\\\\w+/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\n\t\t'keyword': /\\b(?:_|arg|classvar|const|nil|var|while)\\b/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\n\t\t'label': {\n\t\t\tpattern: /\\b[a-z_]\\w*(?=\\s*:)/,\n\t\t\talias: 'property',\n\t\t},\n\n\t\t'number':\n\t\t\t/\\b(?:inf|pi|0x[0-9a-fA-F]+|\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?(?:pi)?|\\d+r[0-9a-zA-Z]+(?:\\.[0-9a-zA-Z]+)?|\\d+[sb]{1,4}\\d*)\\b/,\n\t\t'class-name': /\\b[A-Z]\\w*\\b/,\n\n\t\t'operator':\n\t\t\t/\\.{2,3}|#(?![[{])|&&|[!=]==?|\\+>>|\\+{1,3}|-[->]|=>|>>|\\?\\?|@\\|?@|\\|(?:@|[!=]=)?\\||!\\?|<[!=>]|\\*{1,2}|<{2,3}\\*?|[-!%&/<>?@|=`]/,\n\t\t'punctuation': /[{}()[\\].:,;]|#[[{]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/swift.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'swift'>} */\nexport default {\n\tid: 'swift',\n\tgrammar: {\n\t\t'comment': {\n\t\t\t// Nested comments are supported up to 2 levels\n\t\t\tpattern:\n\t\t\t\t/(^|[^\\\\:])(?:\\/\\/.*|\\/\\*(?:[^/*]|\\/(?!\\*)|\\*(?!\\/)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*\\*\\/)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string-literal': [\n\t\t\t// https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html\n\t\t\t{\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/(^|[^\"#])/.source +\n\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t// single-line string\n\t\t\t\t\t\t/\"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\\r\\n|[^(])|[^\\\\\\r\\n\"])*\"/.source +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t// multi-line string\n\t\t\t\t\t\t/\"\"\"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\\"]|\"(?!\"\"))*\"\"\"/.source +\n\t\t\t\t\t\t')' +\n\t\t\t\t\t\t/(?![\"#])/.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\tpattern: /(\\\\\\()(?:[^()]|\\([^()]*\\))*(?=\\))/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: 'swift',\n\t\t\t\t\t},\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\)|\\\\\\($/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /\\\\(?=[\\r\\n])/,\n\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/(^|[^\"#])(#+)/.source +\n\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t// single-line string\n\t\t\t\t\t\t/\"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\\r\\n|[^#])|[^\\\\\\r\\n])*?\"/.source +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t// multi-line string\n\t\t\t\t\t\t/\"\"\"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?\"\"\"/.source +\n\t\t\t\t\t\t')' +\n\t\t\t\t\t\t'\\\\2'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\tpattern: /(\\\\#+\\()(?:[^()]|\\([^()]*\\))*(?=\\))/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: 'swift',\n\t\t\t\t\t},\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\)|\\\\#+\\($/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\n\t\t'directive': {\n\t\t\t// directives with conditions\n\t\t\tpattern: RegExp(\n\t\t\t\t/#/.source +\n\t\t\t\t\t'(?:' +\n\t\t\t\t\t(/(?:elseif|if)\\b/.source +\n\t\t\t\t\t\t'(?:[ \\t]*' +\n\t\t\t\t\t\t// This regex is a little complex. It's equivalent to this:\n\t\t\t\t\t\t//   (?:![ \\t]*)?(?:\\b\\w+\\b(?:[ \\t]*<round>)?|<round>)(?:[ \\t]*(?:&&|\\|\\|))?\n\t\t\t\t\t\t// where <round> is a general parentheses expression.\n\t\t\t\t\t\t/(?:![ \\t]*)?(?:\\b\\w+\\b(?:[ \\t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \\t]*(?:&&|\\|\\|))?/\n\t\t\t\t\t\t\t.source +\n\t\t\t\t\t\t')+') +\n\t\t\t\t\t'|' +\n\t\t\t\t\t/(?:else|endif)\\b/.source +\n\t\t\t\t\t')'\n\t\t\t),\n\t\t\talias: 'property',\n\t\t\tinside: {\n\t\t\t\t'directive-name': /^#\\w+/,\n\t\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t\t'number': /\\b\\d+(?:\\.\\d+)*\\b/,\n\t\t\t\t'operator': /!|&&|\\|\\||[<>]=?/,\n\t\t\t\t'punctuation': /[(),]/,\n\t\t\t},\n\t\t},\n\t\t'literal': {\n\t\t\tpattern:\n\t\t\t\t/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\\b/,\n\t\t\talias: 'constant',\n\t\t},\n\t\t'other-directive': {\n\t\t\tpattern: /#\\w+\\b/,\n\t\t\talias: 'property',\n\t\t},\n\n\t\t'attribute': {\n\t\t\tpattern: /@\\w+/,\n\t\t\talias: 'atrule',\n\t\t},\n\n\t\t'function-definition': {\n\t\t\tpattern: /(\\bfunc\\s+)\\w+/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'function',\n\t\t},\n\t\t'label': {\n\t\t\t// https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html#ID141\n\t\t\tpattern: /\\b(break|continue)\\s+\\w+|\\b[a-zA-Z_]\\w*(?=\\s*:\\s*(?:for|repeat|while)\\b)/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'important',\n\t\t},\n\n\t\t'keyword':\n\t\t\t/\\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\\b/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'nil': {\n\t\t\tpattern: /\\bnil\\b/,\n\t\t\talias: 'constant',\n\t\t},\n\n\t\t'short-argument': /\\$\\d+\\b/,\n\t\t'omit': {\n\t\t\tpattern: /\\b_\\b/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'number': /\\b(?:[\\d_]+(?:\\.[\\de_]+)?|0x[a-f0-9_]+(?:\\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b/i,\n\n\t\t// A class name must start with an upper-case letter and be either 1 letter long or contain a lower-case letter.\n\t\t'class-name': /\\b[A-Z](?:[A-Z_\\d]*[a-z]\\w*)?\\b/,\n\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\t\t'constant': /\\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\\b/,\n\n\t\t// Operators are generic in Swift. Developers can even create new operators (e.g. +++).\n\t\t// https://docs.swift.org/swift-book/ReferenceManual/zzSummaryOfTheGrammar.html#ID481\n\t\t// This regex only supports ASCII operators.\n\t\t'operator': /[-+*/%=!<>&|^~?]+|\\.[.\\-+*/%=!<>&|^~?]+/,\n\t\t'punctuation': /[{}[\\]();,.:\\\\]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/systemd.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'systemd'>} */\nexport default {\n\tid: 'systemd',\n\tgrammar () {\n\t\t// https://www.freedesktop.org/software/systemd/man/systemd.syntax.html\n\n\t\tconst comment = {\n\t\t\tpattern: /^[;#].*/m,\n\t\t\tgreedy: true,\n\t\t};\n\n\t\tconst quotesSource = /\"(?:[^\\r\\n\"\\\\]|\\\\(?:[^\\r]|\\r\\n?))*\"(?!\\S)/.source;\n\n\t\treturn {\n\t\t\t'comment': comment,\n\n\t\t\t'section': {\n\t\t\t\tpattern: /^\\[[^\\n\\r\\[\\]]*\\](?=[ \\t]*$)/m,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^\\[|\\]$/,\n\t\t\t\t\t'section-name': {\n\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\talias: 'selector',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'key': {\n\t\t\t\tpattern: /^[^\\s=]+(?=[ \\t]*=)/m,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'attr-name',\n\t\t\t},\n\t\t\t'value': {\n\t\t\t\t// This pattern is quite complex because of two properties:\n\t\t\t\t//  1) Quotes (strings) must be preceded by a space. Since we can't use lookbehinds, we have to \"resolve\"\n\t\t\t\t//     the lookbehind. You will see this in the main loop where spaces are handled separately.\n\t\t\t\t//  2) Line continuations.\n\t\t\t\t//     After line continuations, empty lines and comments are ignored so we have to consume them.\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/(=[ \\t]*(?!\\s))/.source +\n\t\t\t\t\t\t// the value either starts with quotes or not\n\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\tquotesSource +\n\t\t\t\t\t\t'|(?=[^\"\\r\\n]))' +\n\t\t\t\t\t\t// main loop\n\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t(/[^\\s\\\\]/.source +\n\t\t\t\t\t\t\t// handle spaces separately because of quotes\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t'[ \\t]+(?:(?![ \\t\"])|' +\n\t\t\t\t\t\t\tquotesSource +\n\t\t\t\t\t\t\t')' +\n\t\t\t\t\t\t\t// line continuation\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t/\\\\[\\r\\n]+(?:[#;].*[\\r\\n]+)*(?![#;])/.source) +\n\t\t\t\t\t\t')*'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'attr-value',\n\t\t\t\tinside: {\n\t\t\t\t\t'comment': comment,\n\t\t\t\t\t'quoted': {\n\t\t\t\t\t\tpattern: RegExp(/(^|\\s)/.source + quotesSource),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /\\\\$/m,\n\n\t\t\t\t\t'boolean': {\n\t\t\t\t\t\tpattern: /^(?:false|no|off|on|true|yes)$/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t'punctuation': /=/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/t4-cs.js",
    "content": "import { createT4 } from '../shared/languages/t4-templating.js';\nimport csharp from './csharp.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'t4-cs'>} */\nexport default {\n\tid: 't4-cs',\n\trequire: csharp,\n\talias: 't4',\n\tgrammar () {\n\t\treturn createT4('csharp');\n\t},\n};\n"
  },
  {
    "path": "src/languages/t4-vb.js",
    "content": "import { createT4 } from '../shared/languages/t4-templating.js';\nimport vbnet from './vbnet.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'t4-vb'>} */\nexport default {\n\tid: 't4-vb',\n\trequire: vbnet,\n\tgrammar () {\n\t\treturn createT4('vbnet');\n\t},\n};\n"
  },
  {
    "path": "src/languages/tap.js",
    "content": "import yaml from './yaml.js';\n\n// https://en.wikipedia.org/wiki/Test_Anything_Protocol\n\n/** @type {import('../types.d.ts').LanguageProto<'tap'>} */\nexport default {\n\tid: 'tap',\n\trequire: yaml,\n\tgrammar: {\n\t\t'fail': /not ok[^#{\\n\\r]*/,\n\t\t'pass': /ok[^#{\\n\\r]*/,\n\t\t'pragma': /pragma [+-][a-z]+/,\n\t\t'bailout': /bail out!.*/i,\n\t\t'version': /TAP version \\d+/i,\n\t\t'plan': /\\b\\d+\\.\\.\\d+(?: +#.*)?/,\n\t\t'subtest': {\n\t\t\tpattern: /# Subtest(?:: .*)?/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'punctuation': /[{}]/,\n\t\t'directive': /#.*/,\n\t\t'yamlish': {\n\t\t\tpattern: /(^[ \\t]*)---[\\s\\S]*?[\\r\\n][ \\t]*\\.\\.\\.$/m,\n\t\t\tlookbehind: true,\n\t\t\tinside: 'yaml',\n\t\t\talias: 'language-yaml',\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/tcl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'tcl'>} */\nexport default {\n\tid: 'tcl',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(^|[^\\\\])#.*/,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"\\\\\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'variable': [\n\t\t\t{\n\t\t\t\tpattern: /(\\$)(?:::)?(?:[a-zA-Z0-9]+::)*\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(\\$)\\{[^}]+\\}/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^[\\t ]*set[ \\t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\\w+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t],\n\t\t'function': {\n\t\t\tpattern: /(^[\\t ]*proc[ \\t]+)\\S+/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'builtin': [\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(^[\\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\\b/m,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t/\\b(?:else|elseif)\\b/,\n\t\t],\n\t\t'scope': {\n\t\t\tpattern: /(^[\\t ]*)(?:global|upvar|variable)\\b/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'constant',\n\t\t},\n\t\t'keyword': {\n\t\t\tpattern:\n\t\t\t\t/(^[\\t ]*|\\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\\b/m,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'operator': /!=?|\\*\\*?|==|&&?|\\|\\|?|<[=<]?|>[=>]?|[-+~\\/%?^]|\\b(?:eq|in|ne|ni)\\b/,\n\t\t'punctuation': /[{}()\\[\\]]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/textile.js",
    "content": "import markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'textile'>} */\nexport default {\n\tid: 'textile',\n\tbase: markup,\n\tgrammar ({ base }) {\n\t\t// We don't allow for pipes inside parentheses\n\t\t// to not break table pattern |(. foo |). bar |\n\t\tconst modifierRegex = /\\([^|()\\n]+\\)|\\[[^\\]\\n]+\\]|\\{[^}\\n]+\\}/.source;\n\t\t// Opening and closing parentheses which are not a modifier\n\t\t// This pattern is necessary to prevent exponential backtracking\n\t\tconst parenthesesRegex = /\\)|\\((?![^|()\\n]+\\))/.source;\n\n\t\t/**\n\t\t *\n\t\t * @param {string} source\n\t\t * @param {string} [flags]\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction withModifier (source, flags) {\n\t\t\treturn RegExp(\n\t\t\t\tsource\n\t\t\t\t\t.replace(/<MOD>/g, () => '(?:' + modifierRegex + ')')\n\t\t\t\t\t.replace(/<PAR>/g, () => '(?:' + parenthesesRegex + ')'),\n\t\t\t\tflags || ''\n\t\t\t);\n\t\t}\n\n\t\tconst modifierTokens = {\n\t\t\t'css': {\n\t\t\t\tpattern: /\\{[^{}]+\\}/,\n\t\t\t\tinside: 'css',\n\t\t\t},\n\t\t\t'class-id': {\n\t\t\t\tpattern: /(\\()[^()]+(?=\\))/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'attr-value',\n\t\t\t},\n\t\t\t'lang': {\n\t\t\t\tpattern: /(\\[)[^\\[\\]]+(?=\\])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'attr-value',\n\t\t\t},\n\t\t\t// Anything else is punctuation (the first pattern is for row/col spans inside tables)\n\t\t\t'punctuation': /[\\\\\\/]\\d+|\\S/,\n\t\t};\n\n\t\tconst phrase = {\n\t\t\tpattern: /(^|\\r|\\n)\\S[\\s\\S]*?(?=$|\\r?\\n\\r?\\n|\\r\\r)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t// h1. Header 1\n\t\t\t\t'block-tag': {\n\t\t\t\t\tpattern: withModifier(/^[a-z]\\w*(?:<MOD>|<PAR>|[<>=])*\\./.source),\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'modifier': {\n\t\t\t\t\t\t\tpattern: withModifier(/(^[a-z]\\w*)(?:<MOD>|<PAR>|[<>=])+(?=\\.)/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: modifierTokens,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'tag': /^[a-z]\\w*/,\n\t\t\t\t\t\t'punctuation': /\\.$/,\n\t\t\t\t\t},\n\t\t\t\t},\n\n\t\t\t\t// # List item\n\t\t\t\t// * List item\n\t\t\t\t'list': {\n\t\t\t\t\tpattern: withModifier(/^[*#]+<MOD>*\\s+\\S.*/.source, 'm'),\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'modifier': {\n\t\t\t\t\t\t\tpattern: withModifier(/(^[*#]+)<MOD>+/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: modifierTokens,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /^[*#]+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\n\t\t\t\t// | cell | cell | cell |\n\t\t\t\t'table': {\n\t\t\t\t\t// Modifiers can be applied to the row: {color:red}.|1|2|3|\n\t\t\t\t\t// or the cell: |{color:red}.1|2|3|\n\t\t\t\t\tpattern: withModifier(\n\t\t\t\t\t\t/^(?:(?:<MOD>|<PAR>|[<>=^~])+\\.\\s*)?(?:\\|(?:(?:<MOD>|<PAR>|[<>=^~_]|[\\\\/]\\d+)+\\.|(?!(?:<MOD>|<PAR>|[<>=^~_]|[\\\\/]\\d+)+\\.))[^|]*)+\\|/\n\t\t\t\t\t\t\t.source,\n\t\t\t\t\t\t'm'\n\t\t\t\t\t),\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'modifier': {\n\t\t\t\t\t\t\t// Modifiers for rows after the first one are\n\t\t\t\t\t\t\t// preceded by a pipe and a line feed\n\t\t\t\t\t\t\tpattern: withModifier(\n\t\t\t\t\t\t\t\t/(^|\\|(?:\\r?\\n|\\r)?)(?:<MOD>|<PAR>|[<>=^~_]|[\\\\/]\\d+)+(?=\\.)/.source\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: modifierTokens,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /\\||^\\./,\n\t\t\t\t\t},\n\t\t\t\t},\n\n\t\t\t\t'inline': {\n\t\t\t\t\tpattern: withModifier(\n\t\t\t\t\t\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\t\t\t\t\t\t/(^|[^a-zA-Z\\d])(\\*\\*|__|\\?\\?|[*_%@+\\-^~])<MOD>*.+?\\2(?![a-zA-Z\\d])/.source\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t// Note: superscripts and subscripts are not handled specifically\n\n\t\t\t\t\t\t// *bold*, **bold**\n\t\t\t\t\t\t'bold': {\n\t\t\t\t\t\t\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\t\t\t\t\t\t\tpattern: withModifier(/(^(\\*\\*?)<MOD>*).+?(?=\\2)/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: /** @type {GrammarToken['inside']} */ (null),\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t// _italic_, __italic__\n\t\t\t\t\t\t'italic': {\n\t\t\t\t\t\t\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\t\t\t\t\t\t\tpattern: withModifier(/(^(__?)<MOD>*).+?(?=\\2)/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: /** @type {GrammarToken['inside']} */ (null),\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t// ??cite??\n\t\t\t\t\t\t'cite': {\n\t\t\t\t\t\t\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\t\t\t\t\t\t\tpattern: withModifier(/(^\\?\\?<MOD>*).+?(?=\\?\\?)/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'string',\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t// @code@\n\t\t\t\t\t\t'code': {\n\t\t\t\t\t\t\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\t\t\t\t\t\t\tpattern: withModifier(/(^@<MOD>*).+?(?=@)/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t// +inserted+\n\t\t\t\t\t\t'inserted': {\n\t\t\t\t\t\t\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\t\t\t\t\t\t\tpattern: withModifier(/(^\\+<MOD>*).+?(?=\\+)/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: /** @type {GrammarToken['inside']} */ (null),\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t// -deleted-\n\t\t\t\t\t\t'deleted': {\n\t\t\t\t\t\t\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\t\t\t\t\t\t\tpattern: withModifier(/(^-<MOD>*).+?(?=-)/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: /** @type {GrammarToken['inside']} */ (null),\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t// %span%\n\t\t\t\t\t\t'span': {\n\t\t\t\t\t\t\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\t\t\t\t\t\t\tpattern: withModifier(/(^%<MOD>*).+?(?=%)/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: /** @type {GrammarToken['inside']} */ (null),\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'modifier': {\n\t\t\t\t\t\t\tpattern: withModifier(/(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])<MOD>+/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: modifierTokens,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /[*_%?@+\\-^~]+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\n\t\t\t\t// [alias]http://example.com\n\t\t\t\t'link-ref': {\n\t\t\t\t\tpattern: /^\\[[^\\]]+\\]\\S+$/m,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'string': {\n\t\t\t\t\t\t\tpattern: /(^\\[)[^\\]]+(?=\\])/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'url': {\n\t\t\t\t\t\t\tpattern: /(^\\])\\S+$/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /[\\[\\]]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\n\t\t\t\t// \"text\":http://example.com\n\t\t\t\t// \"text\":link-ref\n\t\t\t\t'link': {\n\t\t\t\t\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\t\t\t\t\tpattern: withModifier(/\"<MOD>*[^\"]+\":.+?(?=[^\\w/]?(?:\\s|$))/.source),\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'text': {\n\t\t\t\t\t\t\t// eslint-disable-next-line regexp/no-super-linear-backtracking\n\t\t\t\t\t\t\tpattern: withModifier(/(^\"<MOD>*)[^\"]+(?=\")/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'modifier': {\n\t\t\t\t\t\t\tpattern: withModifier(/(^\")<MOD>+/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: modifierTokens,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'url': {\n\t\t\t\t\t\t\tpattern: /(:).+/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /[\":]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\n\t\t\t\t// !image.jpg!\n\t\t\t\t// !image.jpg(Title)!:http://example.com\n\t\t\t\t'image': {\n\t\t\t\t\tpattern: withModifier(\n\t\t\t\t\t\t/!(?:<MOD>|<PAR>|[<>=])*(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?/\n\t\t\t\t\t\t\t.source\n\t\t\t\t\t),\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'source': {\n\t\t\t\t\t\t\tpattern: withModifier(\n\t\t\t\t\t\t\t\t/(^!(?:<MOD>|<PAR>|[<>=])*)(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?(?=!)/\n\t\t\t\t\t\t\t\t\t.source\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'url',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'modifier': {\n\t\t\t\t\t\t\tpattern: withModifier(/(^!)(?:<MOD>|<PAR>|[<>=])+/.source),\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: modifierTokens,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'url': {\n\t\t\t\t\t\t\tpattern: /(:).+/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /[!:]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\n\t\t\t\t// Footnote[1]\n\t\t\t\t'footnote': {\n\t\t\t\t\tpattern: /\\b\\[\\d+\\]/,\n\t\t\t\t\talias: 'comment',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\[|\\]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\n\t\t\t\t// CSS(Cascading Style Sheet)\n\t\t\t\t'acronym': {\n\t\t\t\t\tpattern: /\\b[A-Z\\d]+\\([^)]+\\)/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'comment': {\n\t\t\t\t\t\t\tpattern: /(\\()[^()]+(?=\\))/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /[()]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\n\t\t\t\t// Prism(C)\n\t\t\t\t'mark': {\n\t\t\t\t\tpattern: /\\b\\((?:C|R|TM)\\)/,\n\t\t\t\t\talias: 'comment',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /[()]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tconst phraseInside = phrase.inside;\n\t\tconst nestedPatterns = {\n\t\t\t'inline': phraseInside['inline'],\n\t\t\t'link': phraseInside['link'],\n\t\t\t'image': phraseInside['image'],\n\t\t\t'footnote': phraseInside['footnote'],\n\t\t\t'acronym': phraseInside['acronym'],\n\t\t\t'mark': phraseInside['mark'],\n\t\t};\n\n\t\t// Allow some nesting\n\t\tconst phraseInlineInside = phraseInside['inline'].inside;\n\t\tphraseInlineInside['bold'].inside = nestedPatterns;\n\t\tphraseInlineInside['italic'].inside = nestedPatterns;\n\t\tphraseInlineInside['inserted'].inside = nestedPatterns;\n\t\tphraseInlineInside['deleted'].inside = nestedPatterns;\n\t\tphraseInlineInside['span'].inside = nestedPatterns;\n\n\t\t// Allow some styles inside table cells\n\t\tObject.assign(phraseInside['table'].inside, nestedPatterns);\n\n\t\t// Only allow alpha-numeric HTML tags, not XML tags\n\t\tconst tag = /** @type {GrammarToken} */ (base.tag);\n\t\ttag.pattern =\n\t\t\t/<\\/?(?!\\d)[a-z0-9]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/i;\n\n\t\treturn {\n\t\t\t'phrase': phrase,\n\t\t};\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/languages/toml.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'toml'>} */\nexport default {\n\tid: 'toml',\n\tgrammar () {\n\t\tconst key = /(?:[\\w-]+|'[^'\\n\\r]*'|\"(?:\\\\.|[^\\\\\"\\r\\n])*\")/.source;\n\n\t\t/**\n\t\t *\n\t\t * @param {string} pattern\n\t\t * @returns {string}\n\t\t */\n\t\tfunction insertKey (pattern) {\n\t\t\treturn pattern.replace(/__/g, () => key);\n\t\t}\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /#.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'table': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\tinsertKey(/(^[\\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])/.source),\n\t\t\t\t\t'm'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'class-name',\n\t\t\t},\n\t\t\t'key': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\tinsertKey(/(^[\\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)/.source),\n\t\t\t\t\t'm'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'property',\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\"\"\"(?:\\\\[\\s\\S]|[^\\\\])*?\"\"\"|'''[\\s\\S]*?'''|'[^'\\n\\r]*'|\"(?:\\\\.|[^\\\\\"\\r\\n])*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'date': [\n\t\t\t\t{\n\t\t\t\t\t// Offset Date-Time, Local Date-Time, Local Date\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b\\d{4}-\\d{2}-\\d{2}(?:[T\\s]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})?)?\\b/i,\n\t\t\t\t\talias: 'number',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Local Time\n\t\t\t\t\tpattern: /\\b\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?\\b/,\n\t\t\t\t\talias: 'number',\n\t\t\t\t},\n\t\t\t],\n\t\t\t'number':\n\t\t\t\t/(?:\\b0(?:x[\\da-zA-Z]+(?:_[\\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\\b|[-+]?\\b\\d+(?:_\\d+)*(?:\\.\\d+(?:_\\d+)*)?(?:[eE][+-]?\\d+(?:_\\d+)*)?\\b|[-+]?\\b(?:inf|nan)\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'punctuation': /[.,=[\\]{}]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/treeview.js",
    "content": "import { getTextContent } from '../core/classes/token.js';\nimport { withoutTokenize } from '../util/language-util.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'treeview'>} */\nexport default {\n\tid: 'treeview',\n\talias: 'tree-view',\n\tgrammar: {\n\t\t'treeview-part': {\n\t\t\tpattern: /^.+/m,\n\t\t\tinside: {\n\t\t\t\t'entry-line': [\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: /\\|-- |├── /,\n\t\t\t\t\t\talias: 'line-h',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: /\\| {3}|│ {3}/,\n\t\t\t\t\t\talias: 'line-v',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: /`-- |└── /,\n\t\t\t\t\t\talias: 'line-v-last',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: / {4}/,\n\t\t\t\t\t\talias: 'line-v-gap',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t'entry-name': {\n\t\t\t\t\tpattern: /\\S(?:.*\\S)?/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'directory-marker': {\n\t\t\t\t\t\t\tpattern: /(^|[^\\\\])\\/$/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'file-marker': {\n\t\t\t\t\t\t\tpattern: /(^|[^\\\\])[=*|]$/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'symlink': {\n\t\t\t\t\t\t\tpattern: / -> /,\n\t\t\t\t\t\t\talias: 'operator',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t/** @type {Grammar['$tokenize']} */\n\t\t\t\t$tokenize (code, grammar, Prism) {\n\t\t\t\t\tconst tokens = Prism.tokenize(code, withoutTokenize(grammar));\n\n\t\t\t\t\tfor (const token of tokens) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\ttypeof token === 'string' ||\n\t\t\t\t\t\t\ttoken.type !== 'entry-name' ||\n\t\t\t\t\t\t\ttypeof token.content === 'string'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\ttoken.content.some(t => typeof t !== 'string' && t.type === 'symlink')\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst text = getTextContent(token);\n\n\t\t\t\t\t\tconst folderPattern = /(?:^|[^\\\\])\\/$/;\n\t\t\t\t\t\tif (folderPattern.test(text)) {\n\t\t\t\t\t\t\t// folder\n\t\t\t\t\t\t\ttoken.addAlias('dir');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// file\n\n\t\t\t\t\t\t\tconst parts = text\n\t\t\t\t\t\t\t\t.replace(/(^|[^\\\\])[=*|]$/, '$1')\n\t\t\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t\t\t.replace(/\\s+/g, '')\n\t\t\t\t\t\t\t\t.split('.');\n\n\t\t\t\t\t\t\twhile (parts.length > 1) {\n\t\t\t\t\t\t\t\tparts.shift();\n\t\t\t\t\t\t\t\t// Ex. 'foo.min.js' would become '<span class=\"token keyword ext-min-js ext-js\">foo.min.js</span>'\n\t\t\t\t\t\t\t\ttoken.addAlias('ext-' + parts.join('-'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (text.startsWith('.')) {\n\t\t\t\t\t\t\ttoken.addAlias('dotfile');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn tokens;\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n */\n"
  },
  {
    "path": "src/languages/tremor.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'tremor'>} */\nexport default {\n\tid: 'tremor',\n\talias: ['trickle', 'troy'],\n\tgrammar () {\n\t\tconst interpolationPattern =\n\t\t\t/#\\{(?:[^\"{}]|\\{[^{}]*\\}|\"(?:[^\"\\\\\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*\")*\\}/.source;\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|(?:--|\\/\\/|#).*)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'interpolated-string': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/(^|[^\\\\])/.source +\n\t\t\t\t\t\t'(?:' +\n\t\t\t\t\t\t'\"\"\"(?:' +\n\t\t\t\t\t\t/[^\"\\\\#]|\\\\[\\s\\S]|\"(?!\"\")|#(?!\\{)/.source +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\tinterpolationPattern +\n\t\t\t\t\t\t')*\"\"\"' +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t'\"(?:' +\n\t\t\t\t\t\t/[^\"\\\\\\r\\n#]|\\\\(?:\\r\\n|[\\s\\S])|#(?!\\{)/.source +\n\t\t\t\t\t\t'|' +\n\t\t\t\t\t\tinterpolationPattern +\n\t\t\t\t\t\t')*\"' +\n\t\t\t\t\t\t')'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\tpattern: RegExp(interpolationPattern),\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /^#\\{|\\}$/,\n\t\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\tinside: 'tremor',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'extractor': {\n\t\t\t\tpattern: /\\b[a-z_]\\w*\\|(?:[^\\r\\n\\\\|]|\\\\(?:\\r\\n|[\\s\\S]))*\\|/i,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'regex': {\n\t\t\t\t\t\tpattern: /(^re)\\|[\\s\\S]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'function': /^\\w+/,\n\t\t\t\t\t'value': /\\|[\\s\\S]+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'identifier': {\n\t\t\t\tpattern: /`[^`]*`/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'function': /\\b[a-z_]\\w*(?=\\s*(?:::\\s*<|\\())\\b/,\n\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\\b/,\n\t\t\t'boolean': /\\b(?:false|null|true)\\b/i,\n\n\t\t\t'number':\n\t\t\t\t/\\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\\d[\\d_]*(?:\\.\\d[\\d_]*)?(?:[Ee][+-]?[\\d_]+)?)\\b/,\n\n\t\t\t'pattern-punctuation': {\n\t\t\t\tpattern: /%(?=[({[])/,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'operator':\n\t\t\t\t/[-+*\\/%~!^]=?|=[=>]?|&[&=]?|\\|[|=]?|<<?=?|>>?>?=?|(?:absent|and|not|or|present|xor)\\b/,\n\t\t\t'punctuation': /::|[;\\[\\]()\\{\\},.:]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/tsx.js",
    "content": "import jsx from './jsx.js';\nimport typescript from './typescript.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'tsx'>} */\nexport default {\n\tid: 'tsx',\n\trequire: [jsx, typescript],\n\tgrammar ({ extend }) {\n\t\tconst typescript = extend('typescript', {});\n\t\tconst tsx = extend('jsx', typescript);\n\n\t\t// doesn't work with TS because TS is too complex\n\t\tdelete tsx['parameter'];\n\t\tdelete tsx['literal-property'];\n\n\t\t// This will prevent collisions between TSX tags and TS generic types.\n\t\t// Idea by https://github.com/karlhorky\n\t\t// Discussion: https://github.com/PrismJS/prism/issues/2594#issuecomment-710666928\n\t\tconst tag = /** @type {import('../types.d.ts').GrammarToken} */ (tsx.tag);\n\t\ttag.pattern = RegExp(\n\t\t\t/(^|[^\\w$]|(?=<\\/))/.source + '(?:' + tag.pattern.source + ')',\n\t\t\ttag.pattern.flags\n\t\t);\n\t\ttag.lookbehind = true;\n\n\t\treturn tsx;\n\t},\n};\n"
  },
  {
    "path": "src/languages/tt2.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport { insertBefore } from '../util/language-util.js';\nimport clike from './clike.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'tt2'>} */\nexport default {\n\tid: 'tt2',\n\trequire: [clike, markup],\n\tgrammar ({ extend }) {\n\t\tconst tt2 = extend('clike', {\n\t\t\t'comment': /#.*|\\[%#[\\s\\S]*?%\\]/,\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\\b/,\n\t\t\t'punctuation': /[[\\]{},()]/,\n\t\t});\n\n\t\tinsertBefore(tt2, 'number', {\n\t\t\t'operator': /=[>=]?|!=?|<=?|>=?|&&|\\|\\|?|\\b(?:and|not|or)\\b/,\n\t\t\t'variable': {\n\t\t\t\tpattern: /\\b[a-z]\\w*(?:\\s*\\.\\s*(?:\\d+|\\$?[a-z]\\w*))*\\b/i,\n\t\t\t},\n\t\t});\n\n\t\tinsertBefore(tt2, 'keyword', {\n\t\t\t'delimiter': {\n\t\t\t\tpattern: /^(?:\\[%|%%)-?|-?%\\]$/,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t});\n\n\t\tinsertBefore(tt2, 'string', {\n\t\t\t'single-quoted-string': {\n\t\t\t\tpattern: /'[^\\\\']*(?:\\\\[\\s\\S][^\\\\']*)*'/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'string',\n\t\t\t},\n\t\t\t'double-quoted-string': {\n\t\t\t\tpattern: /\"[^\\\\\"]*(?:\\\\[\\s\\S][^\\\\\"]*)*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'string',\n\t\t\t\tinside: {\n\t\t\t\t\t'variable': {\n\t\t\t\t\t\tpattern: /\\$(?:[a-z]\\w*(?:\\.(?:\\d+|\\$?[a-z]\\w*))*)/i,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\t// The different types of TT2 strings \"replace\" the C-like standard string\n\t\tdelete tt2.string;\n\n\t\treturn {\n\t\t\t'tt2': {\n\t\t\t\tpattern: /\\[%[\\s\\S]+?%\\]/,\n\t\t\t\tinside: tt2,\n\t\t\t},\n\t\t\t$tokenize: embeddedIn('markup'),\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/turtle.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'turtle'>} */\nexport default {\n\tid: 'turtle',\n\talias: 'trig',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /#.*/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'multiline-string': {\n\t\t\tpattern: /\"\"\"(?:(?:\"\"?)?(?:[^\"\\\\]|\\\\.))*\"\"\"|'''(?:(?:''?)?(?:[^'\\\\]|\\\\.))*'''/,\n\t\t\tgreedy: true,\n\t\t\talias: 'string',\n\t\t\tinside: {\n\t\t\t\t'comment': /#.*/,\n\t\t\t},\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\\\\\"\\r\\n]|\\\\.)*\"|'(?:[^\\\\'\\r\\n]|\\\\.)*'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'url': {\n\t\t\tpattern: /<(?:[^\\x00-\\x20<>\"{}|^`\\\\]|\\\\(?:u[\\da-fA-F]{4}|U[\\da-fA-F]{8}))*>/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /[<>]/,\n\t\t\t},\n\t\t},\n\t\t'function': {\n\t\t\tpattern:\n\t\t\t\t/(?:(?![-.\\d\\xB7])[-.\\w\\xB7\\xC0-\\uFFFD]+)?:(?:(?![-.])(?:[-.:\\w\\xC0-\\uFFFD]|%[\\da-f]{2}|\\\\.)+)?/i,\n\t\t\tinside: {\n\t\t\t\t'local-name': {\n\t\t\t\t\tpattern: /([^:]*:)[\\s\\S]+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t'prefix': {\n\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /:/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'number': /[+-]?\\b\\d+(?:\\.\\d*)?(?:e[+-]?\\d+)?/i,\n\t\t'punctuation': /[{}.,;()[\\]]|\\^\\^/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'keyword': [/(?:\\ba|@prefix|@base)\\b|=/, /\\b(?:base|graph|prefix)\\b/i],\n\t\t'tag': {\n\t\t\tpattern: /@[a-z]+(?:-[a-z\\d]+)*/i,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /@/,\n\t\t\t},\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "src/languages/twig.js",
    "content": "import { embeddedIn } from '../shared/languages/templating.js';\nimport markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'twig'>} */\nexport default {\n\tid: 'twig',\n\trequire: markup,\n\tgrammar: {\n\t\t'twig-comment': {\n\t\t\tpattern: /\\{#[\\s\\S]*?#\\}/,\n\t\t\tgreedy: true,\n\t\t\talias: 'comment',\n\t\t},\n\t\t'twig': {\n\t\t\tpattern: /\\{(?:#[\\s\\S]*?#|%[\\s\\S]*?%|\\{[\\s\\S]*?\\})\\}/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'tag-name': {\n\t\t\t\t\tpattern: /(^\\{%-?\\s*)\\w+/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'keyword',\n\t\t\t\t},\n\t\t\t\t'delimiter': {\n\t\t\t\t\tpattern: /^\\{[{%]-?|-?[%}]\\}$/,\n\t\t\t\t\talias: 'punctuation',\n\t\t\t\t},\n\n\t\t\t\t'string': {\n\t\t\t\t\tpattern: /(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /^['\"]|['\"]$/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'keyword': /\\b(?:even|if|odd)\\b/,\n\t\t\t\t'boolean': /\\b(?:false|null|true)\\b/,\n\t\t\t\t'number': /\\b0x[\\dA-Fa-f]+|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[Ee][-+]?\\d+)?/,\n\t\t\t\t'operator': [\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/(\\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\\s)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t/[=<>]=?|!=|\\*\\*?|\\/\\/?|\\?:?|[-+~%|]/,\n\t\t\t\t],\n\t\t\t\t'punctuation': /[()\\[\\]{}:.,]/,\n\t\t\t},\n\t\t},\n\t\t$tokenize: embeddedIn('markup'),\n\t},\n};\n"
  },
  {
    "path": "src/languages/typescript.js",
    "content": "import { toArray } from '../util/iterables.js';\nimport { insertBefore } from '../util/language-util.js';\nimport javascript from './javascript.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'typescript'>} */\nexport default {\n\tid: 'typescript',\n\trequire: javascript,\n\talias: 'ts',\n\tgrammar ({ extend }) {\n\t\tconst typeInside = /** @type {import('../types.d.ts').Grammar} */ ({});\n\n\t\tconst typescript = extend('javascript', {\n\t\t\t'class-name': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(\\b(?:class|extends|implements|instanceof|interface|new|type)\\s+)(?!keyof\\b)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?:\\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: typeInside,\n\t\t\t},\n\t\t\t'builtin':\n\t\t\t\t/\\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\\b/,\n\t\t});\n\n\t\ttypescript.keyword = [\n\t\t\t...toArray(/** @type {import('../types.d.ts').GrammarTokens} */ (typescript).keyword),\n\n\t\t\t// The keywords TypeScript adds to JavaScript\n\t\t\t/\\b(?:abstract|declare|is|keyof|out|readonly|require|satisfies)\\b/,\n\t\t\t// keywords that have to be followed by an identifier\n\t\t\t/\\b(?:asserts|infer|interface|module|namespace|type)\\b(?=\\s*(?:[{_$a-zA-Z\\xA0-\\uFFFF]|$))/,\n\t\t\t// This is for `import type *, {}`\n\t\t\t/\\btype\\b(?=\\s*(?:[\\{*]|$))/,\n\t\t];\n\n\t\t// doesn't work with TS because TS is too complex\n\t\tdelete typescript['parameter'];\n\t\tdelete typescript['literal-property'];\n\n\t\t// a version of typescript specifically for highlighting types\n\t\tObject.assign(typeInside, typescript);\n\t\tdelete typeInside['class-name'];\n\n\t\tinsertBefore(typescript, 'function', {\n\t\t\t'decorator': {\n\t\t\t\tpattern: /@[$\\w\\xA0-\\uFFFF]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'at': {\n\t\t\t\t\t\tpattern: /^@/,\n\t\t\t\t\t\talias: 'operator',\n\t\t\t\t\t},\n\t\t\t\t\t'function': /^[\\s\\S]+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'generic-function': {\n\t\t\t\t// e.g. foo<T extends \"bar\" | \"baz\">( ...\n\t\t\t\tpattern:\n\t\t\t\t\t/#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\\s*\\()/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'function': /^#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*/,\n\t\t\t\t\t'generic': {\n\t\t\t\t\t\tpattern: /<[\\s\\S]+/, // everything after the first <\n\t\t\t\t\t\talias: 'class-name',\n\t\t\t\t\t\tinside: typeInside,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn typescript;\n\t},\n};\n"
  },
  {
    "path": "src/languages/typoscript.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'typoscript'>} */\nexport default {\n\tid: 'typoscript',\n\talias: 'tsconfig',\n\tgrammar () {\n\t\tconst keywords =\n\t\t\t/\\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\\b/;\n\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\t// multiline comments /* */\n\t\t\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// double-slash comments - ignored when backslashes or colon is found in front\n\t\t\t\t\t// also ignored whenever directly after an equal-sign, because it would probably be an url without protocol\n\t\t\t\t\tpattern: /(^|[^\\\\:= \\t]|(?:^|[^= \\t])[ \\t]+)\\/\\/.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// hash comments - ignored when leading quote is found for hex colors in strings\n\t\t\t\t\tpattern: /(^|[^\"'])#.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'function': [\n\t\t\t\t{\n\t\t\t\t\t// old include style\n\t\t\t\t\tpattern: /<INCLUDE_TYPOSCRIPT:\\s*source\\s*=\\s*(?:\"[^\"\\r\\n]*\"|'[^'\\r\\n]*')\\s*>/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'string': {\n\t\t\t\t\t\t\tpattern: /\"[^\"\\r\\n]*\"|'[^'\\r\\n]*'/,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'keyword': keywords,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'keyword': {\n\t\t\t\t\t\t\tpattern: /INCLUDE_TYPOSCRIPT/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// new include style\n\t\t\t\t\tpattern: /@import\\s*(?:\"[^\"\\r\\n]*\"|'[^'\\r\\n]*')/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'string': /\"[^\"\\r\\n]*\"|'[^'\\r\\n]*'/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'string': {\n\t\t\t\tpattern: /^([^=]*=[< ]?)(?:(?!\\]\\n).)*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'function': /\\{\\$.*\\}/, // constants include\n\t\t\t\t\t'keyword': keywords,\n\t\t\t\t\t'number': /^\\d+$/,\n\t\t\t\t\t'punctuation': /[,|:]/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'keyword': keywords,\n\t\t\t'number': {\n\t\t\t\t// special highlighting for indexes of arrays in tags\n\t\t\t\tpattern: /\\b\\d+\\s*[.{=]/,\n\t\t\t\tinside: {\n\t\t\t\t\t'operator': /[.{=]/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'tag': {\n\t\t\t\tpattern: /\\.?[-\\w\\\\]+\\.?/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'punctuation': /[{}[\\];(),.:|]/,\n\t\t\t'operator': /[<>]=?|[!=]=?=?|--?|\\+\\+?|&&?|\\|\\|?|[?*/~^%]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/unrealscript.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'unrealscript'>} */\nexport default {\n\tid: 'unrealscript',\n\talias: ['uscript', 'uc'],\n\tgrammar: {\n\t\t'comment': /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t'string': {\n\t\t\tpattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'category': {\n\t\t\tpattern: /(\\b(?:(?:autoexpand|hide|show)categories|var)\\s*\\()[^()]+(?=\\))/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\talias: 'property',\n\t\t},\n\t\t'metadata': {\n\t\t\tpattern: /(\\w\\s*)<\\s*\\w+\\s*=[^<>|=\\r\\n]+(?:\\|\\s*\\w+\\s*=[^<>|=\\r\\n]+)*>/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'property': /\\b\\w+(?=\\s*=)/,\n\t\t\t\t'operator': /=/,\n\t\t\t\t'punctuation': /[<>|]/,\n\t\t\t},\n\t\t},\n\t\t'macro': {\n\t\t\tpattern: /`\\w+/,\n\t\t\talias: 'property',\n\t\t},\n\t\t'class-name': {\n\t\t\tpattern: /(\\b(?:class|enum|extends|interface|state(?:\\(\\))?|struct|within)\\s+)\\w+/,\n\t\t\tlookbehind: true,\n\t\t},\n\n\t\t'keyword':\n\t\t\t/\\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\\b/,\n\t\t'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'number': /\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n\t\t// https://docs.unrealengine.com/udk/Three/UnrealScriptExpressions.html\n\t\t'operator':\n\t\t\t/>>|<<|--|\\+\\+|\\*\\*|[-+*/~!=<>$@]=?|&&?|\\|\\|?|\\^\\^?|[?:%]|\\b(?:ClockwiseFrom|Cross|Dot)\\b/,\n\t\t'punctuation': /[()[\\]{};,.]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/uorazor.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'uorazor'>} */\nexport default {\n\tid: 'uorazor',\n\tgrammar: {\n\t\t'comment-hash': {\n\t\t\tpattern: /#.*/,\n\t\t\talias: 'comment',\n\t\t\tgreedy: true,\n\t\t},\n\t\t'comment-slash': {\n\t\t\tpattern: /\\/\\/.*/,\n\t\t\talias: 'comment',\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /^['\"]|['\"]$/,\n\t\t\t},\n\t\t\tgreedy: true,\n\t\t},\n\t\t'source-layers': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:arms|backpack|blue|bracelet|cancel|clear|cloak|criminal|earrings|enemy|facialhair|friend|friendly|gloves|gray|grey|ground|hair|head|innerlegs|innertorso|innocent|lefthand|middletorso|murderer|neck|nonfriendly|onehandedsecondary|outerlegs|outertorso|pants|red|righthand|ring|self|shirt|shoes|talisman|waist)\\b/i,\n\t\t\talias: 'function',\n\t\t},\n\t\t'source-commands': {\n\t\t\tpattern:\n\t\t\t\t/\\b(?:alliance|attack|cast|clearall|clearignore|clearjournal|clearlist|clearsysmsg|createlist|createtimer|dclick|dclicktype|dclickvar|dress|dressconfig|drop|droprelloc|emote|getlabel|guild|gumpclose|gumpresponse|hotkey|ignore|lasttarget|lift|lifttype|menu|menuresponse|msg|org|organize|organizer|overhead|pause|poplist|potion|promptresponse|pushlist|removelist|removetimer|rename|restock|say|scav|scavenger|script|setability|setlasttarget|setskill|settimer|setvar|sysmsg|target|targetloc|targetrelloc|targettype|undress|unignore|unsetvar|useobject|useonce|useskill|usetype|virtue|wait|waitforgump|waitformenu|waitforprompt|waitforstat|waitforsysmsg|waitfortarget|walk|wfsysmsg|wft|whisper|yell)\\b/,\n\t\t\talias: 'function',\n\t\t},\n\t\t'tag-name': {\n\t\t\tpattern: /(^\\{%-?\\s*)\\w+/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'delimiter': {\n\t\t\tpattern: /^\\{[{%]-?|-?[%}]\\}$/,\n\t\t\talias: 'punctuation',\n\t\t},\n\t\t'function':\n\t\t\t/\\b(?:atlist|close|closest|count|counter|counttype|dead|dex|diffhits|diffmana|diffstam|diffweight|find|findbuff|finddebuff|findlayer|findtype|findtypelist|followers|gumpexists|hidden|hits|hp|hue|human|humanoid|ingump|inlist|insysmessage|insysmsg|int|invul|lhandempty|list|listexists|mana|maxhits|maxhp|maxmana|maxstam|maxweight|monster|mounted|name|next|noto|paralyzed|poisoned|position|prev|previous|queued|rand|random|rhandempty|skill|stam|str|targetexists|timer|timerexists|varexist|warmode|weight)\\b/,\n\t\t'keyword':\n\t\t\t/\\b(?:and|as|break|continue|else|elseif|endfor|endif|endwhile|for|if|loop|not|or|replay|stop|while)\\b/,\n\t\t'boolean': /\\b(?:false|null|true)\\b/,\n\t\t'number': /\\b0x[\\dA-Fa-f]+|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[Ee][-+]?\\d+)?/,\n\t\t'operator': [\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/(\\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\\s)/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t/[=<>]=?|!=|\\*\\*?|\\/\\/?|\\?:?|[-+~%|]/,\n\t\t],\n\t\t'punctuation': /[()\\[\\]{}:.,]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/uri.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'uri'>} */\nexport default {\n\tid: 'uri',\n\talias: 'url',\n\tgrammar () {\n\t\t// https://tools.ietf.org/html/rfc3986#appendix-A\n\n\t\treturn {\n\t\t\t'scheme': {\n\t\t\t\tpattern: /^[a-z][a-z0-9+.-]*:/im,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'scheme-delimiter': /:$/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'fragment': {\n\t\t\t\tpattern: /#[\\w\\-.~!$&'()*+,;=%:@/?]*/,\n\t\t\t\tinside: {\n\t\t\t\t\t'fragment-delimiter': /^#/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'query': {\n\t\t\t\tpattern: /\\?[\\w\\-.~!$&'()*+,;=%:@/?]*/,\n\t\t\t\tinside: {\n\t\t\t\t\t'query-delimiter': {\n\t\t\t\t\t\tpattern: /^\\?/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\t\t\t\t\t'pair-delimiter': /[&;]/,\n\t\t\t\t\t'pair': {\n\t\t\t\t\t\tpattern: /^[^=][\\s\\S]*/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'key': /^[^=]+/,\n\t\t\t\t\t\t\t'value': {\n\t\t\t\t\t\t\t\tpattern: /(^=)[\\s\\S]+/,\n\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'authority': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/^\\/\\//.source +\n\t\t\t\t\t\t// [ userinfo \"@\" ]\n\t\t\t\t\t\t/(?:[\\w\\-.~!$&'()*+,;=%:]*@)?/.source +\n\t\t\t\t\t\t// host\n\t\t\t\t\t\t('(?:' +\n\t\t\t\t\t\t\t// IP-literal\n\t\t\t\t\t\t\t/\\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\\.[\\w\\-.~!$&'()*+,;=]+)\\]/\n\t\t\t\t\t\t\t\t.source +\n\t\t\t\t\t\t\t'|' +\n\t\t\t\t\t\t\t// IPv4address or registered name\n\t\t\t\t\t\t\t/[\\w\\-.~!$&'()*+,;=%]*/.source +\n\t\t\t\t\t\t\t')') +\n\t\t\t\t\t\t// [ \":\" port ]\n\t\t\t\t\t\t/(?::\\d*)?/.source,\n\t\t\t\t\t'm'\n\t\t\t\t),\n\t\t\t\tinside: {\n\t\t\t\t\t'authority-delimiter': /^\\/\\//,\n\t\t\t\t\t'user-info-segment': {\n\t\t\t\t\t\tpattern: /^[\\w\\-.~!$&'()*+,;=%:]*@/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'user-info-delimiter': /@$/,\n\t\t\t\t\t\t\t'user-info': /^[\\w\\-.~!$&'()*+,;=%:]+/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'port-segment': {\n\t\t\t\t\t\tpattern: /:\\d*$/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'port-delimiter': /^:/,\n\t\t\t\t\t\t\t'port': /^\\d+/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'host': {\n\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'ip-literal': {\n\t\t\t\t\t\t\t\tpattern: /^\\[[\\s\\S]+\\]$/,\n\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t'ip-literal-delimiter': /^\\[|\\]$/,\n\t\t\t\t\t\t\t\t\t'ipv-future': /^v[\\s\\S]+/,\n\t\t\t\t\t\t\t\t\t'ipv6-address': /^[\\s\\S]+/,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'ipv4-address':\n\t\t\t\t\t\t\t\t/^(?:(?:[03-9]\\d?|[12]\\d{0,2})\\.){3}(?:[03-9]\\d?|[12]\\d{0,2})$/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'path': {\n\t\t\t\tpattern: /^[\\w\\-.~!$&'()*+,;=%:@/]+/m,\n\t\t\t\tinside: {\n\t\t\t\t\t'path-separator': /\\//,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/v.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'v'>} */\nexport default {\n\tid: 'v',\n\tbase: clike,\n\tgrammar () {\n\t\tconst genericInside = {\n\t\t\t'punctuation': /[<>]/,\n\t\t\t'class-name': /\\w+/,\n\t\t};\n\n\t\treturn {\n\t\t\t'string': {\n\t\t\t\tpattern: /r?([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\t\t\talias: 'quoted-string',\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/((?:^|[^\\\\])(?:\\\\{2})*)\\$(?:\\{[^{}]*\\}|\\w+(?:\\.\\w+(?:\\([^\\(\\)]*\\))?|\\[[^\\[\\]]+\\])*)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'interpolation-variable': {\n\t\t\t\t\t\t\t\tpattern: /^\\$\\w[\\s\\S]*$/,\n\t\t\t\t\t\t\t\talias: 'variable',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'interpolation-expression': {\n\t\t\t\t\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\t\t\t\t\tinside: 'v',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'class-name': {\n\t\t\t\tpattern: /(\\b(?:enum|interface|struct|type)\\s+)(?:C\\.)?\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/(?:\\b(?:__global|as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\\$(?:else|for|if)|#(?:flag|include))\\b/,\n\t\t\t'number':\n\t\t\t\t/\\b(?:0x[a-f\\d]+(?:_[a-f\\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\\d+(?:_\\d+)*(?:\\.\\d+(?:_\\d+)*)?)\\b/i,\n\t\t\t'operator':\n\t\t\t\t/~|\\?|[*\\/%^!=]=?|\\+[=+]?|-[=-]?|\\|[=|]?|&(?:=|&|\\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\\.\\.\\.?/,\n\t\t\t'builtin':\n\t\t\t\t/\\b(?:any(?:_float|_int)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|64|128|nt)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\\b/,\n\t\t\t$insert: {\n\t\t\t\t'char': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: /`(?:\\\\`|\\\\?[^`]{1,2})`/, // using {1,2} instead of `u` flag for compatibility\n\t\t\t\t\talias: 'rune',\n\t\t\t\t},\n\t\t\t\t'attribute': {\n\t\t\t\t\t$before: 'operator',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(^[\\t ]*)\\[(?:deprecated|direct_array_access|flag|inline|live|ref_only|typedef|unsafe_fn|windows_stdcall)\\]/m,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'annotation',\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /[\\[\\]]/,\n\t\t\t\t\t\t'keyword': /\\w+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'generic': {\n\t\t\t\t\t$before: 'operator',\n\t\t\t\t\tpattern: /<\\w+>(?=\\s*[\\)\\{])/,\n\t\t\t\t\tinside: genericInside,\n\t\t\t\t},\n\t\t\t\t'generic-function': {\n\t\t\t\t\t$before: 'function',\n\t\t\t\t\t// e.g. foo<T>( ...\n\t\t\t\t\tpattern: /\\b\\w+\\s*<\\w+>(?=\\()/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'function': /^\\w+/,\n\t\t\t\t\t\t'generic': {\n\t\t\t\t\t\t\tpattern: /<\\w+>/,\n\t\t\t\t\t\t\tinside: genericInside,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/vala.js",
    "content": "import clike from './clike.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'vala'>} */\nexport default {\n\tid: 'vala',\n\tbase: clike,\n\tgrammar () {\n\t\treturn {\n\t\t\t// Classes copied from csharp\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\t// (Foo bar, Bar baz)\n\t\t\t\t\tpattern: /\\b[A-Z]\\w*(?:\\.\\w+)*\\b(?=(?:\\?\\s+|\\*?\\s+\\*?)\\w)/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\tpunctuation: /\\./,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// [Foo]\n\t\t\t\t\tpattern: /(\\[)[A-Z]\\w*(?:\\.\\w+)*\\b/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\tpunctuation: /\\./,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// class Foo : Bar\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/(\\b(?:class|interface)\\s+[A-Z]\\w*(?:\\.\\w+)*\\s*:\\s*)[A-Z]\\w*(?:\\.\\w+)*\\b/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\tpunctuation: /\\./,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// class Foo\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/((?:\\b(?:class|enum|interface|new|struct)\\s+)|(?:catch\\s+\\())[A-Z]\\w*(?:\\.\\w+)*\\b/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\tpunctuation: /\\./,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t'keyword':\n\t\t\t\t/\\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\\b/i,\n\t\t\t'function': /\\b\\w+(?=\\s*\\()/,\n\t\t\t'number': /(?:\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)(?:f|u?l?)?/i,\n\t\t\t'operator': /\\+\\+|--|&&|\\|\\||<<=?|>>=?|=>|->|~|[+\\-*\\/%&^|=!<>]=?|\\?\\??|\\.\\.\\./,\n\t\t\t'punctuation': /[{}[\\];(),.:]/,\n\t\t\t'constant': /\\b[A-Z0-9_]+\\b/,\n\t\t\t$insert: {\n\t\t\t\t'raw-string': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: /\"\"\"[\\s\\S]*?\"\"\"/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\talias: 'string',\n\t\t\t\t},\n\t\t\t\t'template-string': {\n\t\t\t\t\t$before: 'string',\n\t\t\t\t\tpattern: /@\"[\\s\\S]*?\"/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'interpolation': {\n\t\t\t\t\t\t\tpattern: /\\$(?:\\([^)]*\\)|[a-zA-Z]\\w*)/,\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t'delimiter': {\n\t\t\t\t\t\t\t\t\tpattern: /^\\$\\(?|\\)$/,\n\t\t\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t$rest: 'vala',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'regex': {\n\t\t\t\t\t$before: 'keyword',\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[imsx]{0,4}(?=\\s*(?:$|[\\r\\n,.;})\\]]))/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'regex-source': {\n\t\t\t\t\t\t\tpattern: /^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: 'language-regex',\n\t\t\t\t\t\t\tinside: 'regex',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'regex-delimiter': /^\\//,\n\t\t\t\t\t\t'regex-flags': /^[a-z]+$/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/vbnet.js",
    "content": "import basic from './basic.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'vbnet'>} */\nexport default {\n\tid: 'vbnet',\n\tbase: basic,\n\toptional: 'xml-doc',\n\tgrammar ({ getOptionalLanguage }) {\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(?:!|REM\\b).+/i,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'keyword': /^REM/i,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\\\:])'.*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'string': {\n\t\t\t\tpattern: /(^|[^\"])\"(?:\"\"|[^\"])*\"(?!\")/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'keyword':\n\t\t\t\t/(?:\\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\\$|\\b)/i,\n\t\t\t'punctuation': /[,;:(){}]/,\n\t\t\t$insertBefore: {\n\t\t\t\t'comment': {\n\t\t\t\t\t'doc-comment': /** @type {import('../types.d.ts').GrammarTokens} */ (\n\t\t\t\t\t\tgetOptionalLanguage('xml-doc')\n\t\t\t\t\t)?.tick,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/velocity.js",
    "content": "import markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'velocity'>} */\nexport default {\n\tid: 'velocity',\n\tbase: markup,\n\tgrammar () {\n\t\tconst vel = {\n\t\t\t'variable': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\\\](?:\\\\\\\\)*)\\$!?(?:[a-z][\\w-]*(?:\\([^)]*\\))?(?:\\.[a-z][\\w-]*(?:\\([^)]*\\))?|\\[[^\\]]+\\])*|\\{[^}]+\\})/i,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {}, // See below\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"]*\"|'[^']*'/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'number': /\\b\\d+\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'operator': /[=!<>]=?|[+*/%-]|&&|\\|\\||\\.\\.|\\b(?:eq|g[et]|l[et]|n(?:e|ot))\\b/,\n\t\t\t'punctuation': /[(){}[\\]:,.]/,\n\t\t};\n\n\t\tvel.variable.inside = {\n\t\t\t'string': vel['string'],\n\t\t\t'function': {\n\t\t\t\tpattern: /([^\\w-])[a-z][\\w-]*(?=\\()/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'number': vel['number'],\n\t\t\t'boolean': vel['boolean'],\n\t\t\t'punctuation': vel['punctuation'],\n\t\t};\n\n\t\treturn {\n\t\t\t$merge: {\n\t\t\t\t'tag': {\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'attr-value': {\n\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t$rest: 'velocity',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t$insertBefore: {\n\t\t\t\t'comment': {\n\t\t\t\t\t'unparsed': {\n\t\t\t\t\t\tpattern: /(^|[^\\\\])#\\[\\[[\\s\\S]*?\\]\\]#/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /^#\\[\\[|\\]\\]#$/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'velocity-comment': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /(^|[^\\\\])#\\*[\\s\\S]*?\\*#/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\talias: 'comment',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /(^|[^\\\\])##.*/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\t\talias: 'comment',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t'directive': {\n\t\t\t\t\t\tpattern:\n\t\t\t\t\t\t\t/(^|[^\\\\](?:\\\\\\\\)*)#@?(?:[a-z][\\w-]*|\\{[a-z][\\w-]*\\})(?:\\s*\\((?:[^()]|\\([^()]*\\))*\\))?/i,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'keyword': {\n\t\t\t\t\t\t\t\tpattern: /^#@?(?:[a-z][\\w-]*|\\{[a-z][\\w-]*\\})|\\bin\\b/,\n\t\t\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t\t\t'punctuation': /[{}]/,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t$rest: vel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'variable': vel['variable'],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/verilog.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'verilog'>} */\nexport default {\n\tid: 'verilog',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'kernel-function': {\n\t\t\t// support for any kernel function (ex: $display())\n\t\t\tpattern: /\\B\\$\\w+\\b/,\n\t\t\talias: 'property',\n\t\t},\n\t\t// support for user defined constants (ex: `define)\n\t\t'constant': /\\B`\\w+\\b/,\n\t\t'function': /\\b\\w+(?=\\()/,\n\t\t// support for verilog and system verilog keywords\n\t\t'keyword':\n\t\t\t/\\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\\b/,\n\t\t// bold highlighting for all verilog and system verilog logic blocks\n\t\t'important': /\\b(?:always|always_comb|always_ff|always_latch)\\b(?: *@)?/,\n\t\t// support for time ticks, vectors, and real numbers\n\t\t'number': /\\B##?\\d+|(?:\\b\\d+)?'[odbh] ?[\\da-fzx_?]+|\\b(?:\\d*[._])?\\d+(?:e[-+]?\\d+)?/i,\n\t\t'operator': /[-+{}^~%*\\/?=!<>&|]+/,\n\t\t'punctuation': /[[\\];(),.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/vhdl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'vhdl'>} */\nexport default {\n\tid: 'vhdl',\n\tgrammar: {\n\t\t'comment': /--.+/,\n\t\t// support for all logic vectors\n\t\t'vhdl-vectors': {\n\t\t\t'pattern': /\\b[oxb]\"[\\da-f_]+\"|\"[01uxzwlh-]+\"/i,\n\t\t\t'alias': 'number',\n\t\t},\n\t\t// support for operator overloading included\n\t\t'quoted-function': {\n\t\t\tpattern: /\"\\S+?\"(?=\\()/,\n\t\t\talias: 'function',\n\t\t},\n\t\t'string': /\"(?:[^\\\\\"\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*\"/,\n\t\t'attribute': {\n\t\t\tpattern: /\\b'\\w+/,\n\t\t\talias: 'attr-name',\n\t\t},\n\t\t// support for predefined attributes included\n\t\t'keyword':\n\t\t\t/\\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\\b/i,\n\t\t'boolean': /\\b(?:false|true)\\b/i,\n\t\t'function': /\\w+(?=\\()/,\n\t\t// decimal, based, physical, and exponential numbers supported\n\t\t'number': /'[01uxzwlh-]'|\\b(?:\\d+#[\\da-f_.]+#|\\d[\\d_.]*)(?:e[-+]?\\d+)?/i,\n\t\t'operator':\n\t\t\t/[<>]=?|:=|[-+*/&=]|\\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\\b/i,\n\t\t'punctuation': /[{}[\\];(),.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/vim.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'vim'>} */\nexport default {\n\tid: 'vim',\n\tgrammar: {\n\t\t'string': /\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"|'(?:[^'\\r\\n]|'')*'/,\n\t\t'comment': /\".*/,\n\t\t'function': /\\b\\w+(?=\\()/,\n\t\t'keyword':\n\t\t\t/\\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\\b/,\n\t\t'builtin':\n\t\t\t/\\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\\b/,\n\t\t'number': /\\b(?:0x[\\da-f]+|\\d+(?:\\.\\d+)?)\\b/i,\n\t\t'operator': /\\|\\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\\/%?]|\\b(?:is(?:not)?)\\b/,\n\t\t'punctuation': /[{}[\\](),;:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/visual-basic.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'visual-basic'>} */\nexport default {\n\tid: 'visual-basic',\n\talias: ['vb', 'vba'],\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(?:['‘’]|REM\\b)(?:[^\\r\\n_]|_(?:\\r\\n?|\\n)?)*/i,\n\t\t\tinside: {\n\t\t\t\t'keyword': /^REM/i,\n\t\t\t},\n\t\t},\n\t\t'directive': {\n\t\t\tpattern:\n\t\t\t\t/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\\b_[ \\t]*(?:\\r\\n?|\\n)|.)+/i,\n\t\t\talias: 'property',\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\\$?[\"“”](?:[\"“”]{2}|[^\"“”])*[\"“”]C?/i,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'date': {\n\t\t\tpattern:\n\t\t\t\t/#[ \\t]*(?:\\d+([/-])\\d+\\1\\d+(?:[ \\t]+(?:\\d+[ \\t]*(?:AM|PM)|\\d+:\\d+(?::\\d+)?(?:[ \\t]*(?:AM|PM))?))?|\\d+[ \\t]*(?:AM|PM)|\\d+:\\d+(?::\\d+)?(?:[ \\t]*(?:AM|PM))?)[ \\t]*#/i,\n\t\t\talias: 'number',\n\t\t},\n\t\t'number': /(?:(?:\\b\\d+(?:\\.\\d+)?|\\.\\d+)(?:E[+-]?\\d+)?|&[HO][\\dA-F]+)(?:[FRD]|U?[ILS])?/i,\n\t\t'boolean': /\\b(?:False|Nothing|True)\\b/i,\n\t\t'keyword':\n\t\t\t/\\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\\b/i,\n\t\t'operator': /[+\\-*/\\\\^<=>&#@$%!]|\\b_(?=[ \\t]*[\\r\\n])/,\n\t\t'punctuation': /[{}().,:?]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/warpscript.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'warpscript'>} */\nexport default {\n\tid: 'warpscript',\n\tgrammar: {\n\t\t'comment': /#.*|\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"|'(?:[^'\\\\\\r\\n]|\\\\.)*'|<'(?:[^\\\\']|'(?!>)|\\\\.)*'>/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'variable': /\\$\\S+/,\n\t\t'macro': {\n\t\t\tpattern: /@\\S+/,\n\t\t\talias: 'property',\n\t\t},\n\t\t// WarpScript doesn't have any keywords, these are all functions under the control category\n\t\t// https://www.warp10.io/tags/control\n\t\t'keyword':\n\t\t\t/\\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\\b/,\n\t\t'number': /[+-]?\\b(?:NaN|Infinity|\\d+(?:\\.\\d*)?(?:[Ee][+-]?\\d+)?|0x[\\da-fA-F]+|0b[01]+)\\b/,\n\t\t'boolean': /\\b(?:F|T|false|true)\\b/,\n\t\t'punctuation': /<%|%>|[{}[\\]()]/,\n\t\t// Some operators from the \"operators\" category\n\t\t// https://www.warp10.io/tags/operators\n\t\t'operator': /==|&&?|\\|\\|?|\\*\\*?|>>>?|<<|[<>!~]=?|[-/%^]|\\+!?|\\b(?:AND|NOT|OR)\\b/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/wasm.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'wasm'>} */\nexport default {\n\tid: 'wasm',\n\tgrammar: {\n\t\t'comment': [\n\t\t\t/\\(;[\\s\\S]*?;\\)/,\n\t\t\t{\n\t\t\t\tpattern: /;;.*/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\t\t'string': {\n\t\t\tpattern: /\"(?:\\\\[\\s\\S]|[^\"\\\\])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword': [\n\t\t\t{\n\t\t\t\tpattern: /\\b(?:align|offset)=/,\n\t\t\t\tinside: {\n\t\t\t\t\t'operator': /=/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:(?:f32|f64|i32|i64)(?:\\.(?:abs|add|and|ceil|clz|const|convert_[su]\\/i(?:32|64)|copysign|ctz|demote\\/f64|div(?:_[su])?|eqz?|extend_[su]\\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\\/f32|reinterpret\\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\\/f(?:32|64))?|wrap\\/i64|xor))?|memory\\.(?:grow|size))\\b/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /\\./,\n\t\t\t\t},\n\t\t\t},\n\t\t\t/\\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\\b/,\n\t\t],\n\t\t'variable': /\\$[\\w!#$%&'*+\\-./:<=>?@\\\\^`|~]+/,\n\t\t'number':\n\t\t\t/[+-]?\\b(?:\\d(?:_?\\d)*(?:\\.\\d(?:_?\\d)*)?(?:[eE][+-]?\\d(?:_?\\d)*)?|0x[\\da-fA-F](?:_?[\\da-fA-F])*(?:\\.[\\da-fA-F](?:_?[\\da-fA-D])*)?(?:[pP][+-]?\\d(?:_?\\d)*)?)\\b|\\binf\\b|\\bnan(?::0x[\\da-fA-F](?:_?[\\da-fA-D])*)?\\b/,\n\t\t'punctuation': /[()]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/web-idl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'web-idl'>} */\nexport default {\n\tid: 'web-idl',\n\talias: 'webidl',\n\tgrammar () {\n\t\tconst id = /(?:\\B-|\\b_|\\b)[A-Za-z][\\w-]*(?![\\w-])/.source;\n\t\tconst type =\n\t\t\t'(?:' +\n\t\t\t/\\b(?:unsigned\\s+)?long\\s+long(?![\\w-])/.source +\n\t\t\t'|' +\n\t\t\t/\\b(?:unrestricted|unsigned)\\s+[a-z]+(?![\\w-])/.source +\n\t\t\t'|' +\n\t\t\t/(?!(?:unrestricted|unsigned)\\b)/.source +\n\t\t\tid +\n\t\t\t/(?:\\s*<(?:[^<>]|<[^<>]*>)*>)?/.source +\n\t\t\t')' +\n\t\t\t/(?:\\s*\\?)?/.source;\n\n\t\t/** @type {import('../types.d.ts').Grammar} */\n\t\tconst typeInside = {};\n\n\t\tconst webIdl = {\n\t\t\t'comment': {\n\t\t\t\tpattern: /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"]*\"/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\n\t\t\t'namespace': {\n\t\t\t\tpattern: RegExp(/(\\bnamespace\\s+)/.source + id),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'class-name': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /(^|[^\\w-])(?:iterable|maplike|setlike)\\s*<(?:[^<>]|<[^<>]*>)*>/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/(\\b(?:attribute|const|deleter|getter|optional|setter)\\s+)/.source + type\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// callback return type\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t'(' + /\\bcallback\\s+/.source + id + /\\s*=\\s*/.source + ')' + type\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// typedef\n\t\t\t\t\tpattern: RegExp(/(\\btypedef\\b\\s*)/.source + type),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/(\\b(?:callback|dictionary|enum|interface(?:\\s+mixin)?)\\s+)(?!(?:interface|mixin)\\b)/\n\t\t\t\t\t\t\t.source + id\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// inheritance\n\t\t\t\t\tpattern: RegExp(/(:\\s*)/.source + id),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\n\t\t\t\t// includes and implements\n\t\t\t\tRegExp(id + /(?=\\s+(?:implements|includes)\\b)/.source),\n\t\t\t\t{\n\t\t\t\t\tpattern: RegExp(/(\\b(?:implements|includes)\\s+)/.source + id),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\t// function return type, parameter types, and dictionary members\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\ttype + '(?=' + /\\s*(?:\\.{3}\\s*)?/.source + id + /\\s*[(),;=]/.source + ')'\n\t\t\t\t\t),\n\t\t\t\t\tinside: typeInside,\n\t\t\t\t},\n\t\t\t],\n\n\t\t\t'builtin':\n\t\t\t\t/\\b(?:ArrayBuffer|BigInt64Array|BigUint64Array|ByteString|DOMString|DataView|Float32Array|Float64Array|FrozenArray|Int16Array|Int32Array|Int8Array|ObservableArray|Promise|USVString|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray)\\b/,\n\t\t\t'keyword': [\n\t\t\t\t/\\b(?:async|attribute|callback|const|constructor|deleter|dictionary|enum|getter|implements|includes|inherit|interface|mixin|namespace|null|optional|or|partial|readonly|required|setter|static|stringifier|typedef|unrestricted)\\b/,\n\t\t\t\t// type keywords\n\t\t\t\t/\\b(?:any|bigint|boolean|byte|double|float|iterable|long|maplike|object|octet|record|sequence|setlike|short|symbol|undefined|unsigned|void)\\b/,\n\t\t\t],\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\n\t\t\t'number': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\w-])-?(?:0x[0-9a-f]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|NaN|Infinity)(?![\\w-])/i,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'operator': /\\.{3}|[=:?<>-]/,\n\t\t\t'punctuation': /[(){}[\\].,;]/,\n\t\t};\n\n\t\tObject.assign(typeInside, webIdl);\n\t\tdelete typeInside['class-name'];\n\n\t\treturn webIdl;\n\t},\n};\n"
  },
  {
    "path": "src/languages/wgsl.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'wgsl'>} */\nexport default {\n\tid: 'wgsl',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /\\/\\/.*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'builtin-attribute': {\n\t\t\tpattern: /(@)builtin\\(.*?\\)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'attribute': {\n\t\t\t\t\tpattern: /^builtin/,\n\t\t\t\t\talias: 'attr-name',\n\t\t\t\t},\n\t\t\t\t'punctuation': /[(),]/,\n\t\t\t\t'built-in-values': {\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t/\\b(?:frag_depth|front_facing|global_invocation_id|instance_index|local_invocation_id|local_invocation_index|num_workgroups|position|sample_index|sample_mask|vertex_index|workgroup_id)\\b/,\n\t\t\t\t\talias: 'attr-value',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t'attributes': {\n\t\t\tpattern:\n\t\t\t\t/(@)(?:align|binding|compute|const|fragment|group|id|interpolate|invariant|location|size|vertex|workgroup_size)/i,\n\t\t\tlookbehind: true,\n\t\t\talias: 'attr-name',\n\t\t},\n\t\t'functions': {\n\t\t\tpattern: /\\b(fn\\s+)[_a-zA-Z]\\w*(?=[(<])/,\n\t\t\tlookbehind: true,\n\t\t\talias: 'function',\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:bitcast|break|case|const|continue|continuing|default|discard|else|enable|fallthrough|fn|for|function|if|let|loop|private|return|storage|struct|switch|type|uniform|var|while|workgroup)\\b/,\n\t\t'builtin':\n\t\t\t/\\b(?:abs|acos|acosh|all|any|array|asin|asinh|atan|atan2|atanh|atomic|atomicAdd|atomicAnd|atomicCompareExchangeWeak|atomicExchange|atomicLoad|atomicMax|atomicMin|atomicOr|atomicStore|atomicSub|atomicXor|bool|ceil|clamp|cos|cosh|countLeadingZeros|countOneBits|countTrailingZeros|cross|degrees|determinant|distance|dot|dpdx|dpdxCoarse|dpdxFine|dpdy|dpdyCoarse|dpdyFine|exp|exp2|extractBits|f32|f64|faceForward|firstLeadingBit|floor|fma|fract|frexp|fwidth|fwidthCoarse|fwidthFine|i32|i64|insertBits|inverseSqrt|ldexp|length|log|log2|mat[2-4]x[2-4]|max|min|mix|modf|normalize|override|pack2x16float|pack2x16snorm|pack2x16unorm|pack4x8snorm|pack4x8unorm|pow|ptr|quantizeToF16|radians|reflect|refract|reverseBits|round|sampler|sampler_comparison|select|shiftLeft|shiftRight|sign|sin|sinh|smoothstep|sqrt|staticAssert|step|storageBarrier|tan|tanh|textureDimensions|textureGather|textureGatherCompare|textureLoad|textureNumLayers|textureNumLevels|textureNumSamples|textureSample|textureSampleBias|textureSampleCompare|textureSampleCompareLevel|textureSampleGrad|textureSampleLevel|textureStore|texture_1d|texture_2d|texture_2d_array|texture_3d|texture_cube|texture_cube_array|texture_depth_2d|texture_depth_2d_array|texture_depth_cube|texture_depth_cube_array|texture_depth_multisampled_2d|texture_multisampled_2d|texture_storage_1d|texture_storage_2d|texture_storage_2d_array|texture_storage_3d|transpose|trunc|u32|u64|unpack2x16float|unpack2x16snorm|unpack2x16unorm|unpack4x8snorm|unpack4x8unorm|vec[2-4]|workgroupBarrier)\\b/,\n\t\t'function-calls': {\n\t\t\tpattern: /\\b[_a-z]\\w*(?=\\()/i,\n\t\t\talias: 'function',\n\t\t},\n\t\t'class-name': /\\b(?:[A-Z][A-Za-z0-9]*)\\b/,\n\t\t'bool-literal': {\n\t\t\tpattern: /\\b(?:false|true)\\b/,\n\t\t\talias: 'boolean',\n\t\t},\n\t\t'hex-int-literal': {\n\t\t\tpattern: /\\b0[xX][0-9a-fA-F]+[iu]?\\b(?![.pP])/,\n\t\t\talias: 'number',\n\t\t},\n\t\t'hex-float-literal': {\n\t\t\tpattern: /\\b0[xX][0-9a-fA-F]*(?:\\.[0-9a-fA-F]*)?(?:[pP][+-]?\\d+[fh]?)?/,\n\t\t\talias: 'number',\n\t\t},\n\t\t'decimal-float-literal': [\n\t\t\t{ pattern: /\\d*\\.\\d+(?:[eE](?:\\+|-)?\\d+)?[fh]?/, alias: 'number' },\n\t\t\t{ pattern: /\\d+\\.\\d*(?:[eE](?:\\+|-)?\\d+)?[fh]?/, alias: 'number' },\n\t\t\t{ pattern: /\\d+[eE](?:\\+|-)?\\d+[fh]?/, alias: 'number' },\n\t\t\t{ pattern: /\\b\\d+[fh]\\b/, alias: 'number' },\n\t\t],\n\t\t'int-literal': {\n\t\t\tpattern: /\\b\\d+[iu]?\\b/,\n\t\t\talias: 'number',\n\t\t},\n\t\t'operator': [\n\t\t\t{ pattern: /(?:\\^|~|\\|(?!\\|)|\\|\\||&&|<<|>>|!)(?!=)/ },\n\t\t\t{ pattern: /&(?![&=])/ },\n\t\t\t{ pattern: /(?:\\+=|-=|\\*=|\\/=|%=|\\^=|&=|\\|=|<<=|>>=)/ },\n\t\t\t{ pattern: /(^|[^<>=!])=(?![=>])/, lookbehind: true },\n\t\t\t{ pattern: /(?:==|!=|<=|\\+\\+|--|(^|[^=])>=)/, lookbehind: true },\n\t\t\t{ pattern: /(?:(?:[+%]|(?:\\*(?!\\w)))(?!=))|(?:-(?!>))|(?:\\/(?!\\/))/ },\n\t\t\t{ pattern: /->/ },\n\t\t],\n\t\t'punctuation': /[@(){}[\\],;<>:.]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/wiki.js",
    "content": "import markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'wiki'>} */\nexport default {\n\tid: 'wiki',\n\tbase: markup,\n\tgrammar ({ base }) {\n\t\tconst tag = /** @type {import('../types.d.ts').GrammarToken} */ (base['tag']);\n\n\t\treturn {\n\t\t\t'block-comment': {\n\t\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?\\*\\//,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'comment',\n\t\t\t},\n\t\t\t'heading': {\n\t\t\t\tpattern: /^(=+)[^=\\r\\n].*?\\1/m,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^=+|=+$/,\n\t\t\t\t\t'important': /.+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'emphasis': {\n\t\t\t\t// TODO Multi-line\n\t\t\t\tpattern: /('{2,5}).+?\\1/,\n\t\t\t\tinside: {\n\t\t\t\t\t'bold-italic': {\n\t\t\t\t\t\tpattern: /(''''').+?(?=\\1)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: ['bold', 'italic'],\n\t\t\t\t\t},\n\t\t\t\t\t'bold': {\n\t\t\t\t\t\tpattern: /(''')[^'](?:.*?[^'])?(?=\\1)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'italic': {\n\t\t\t\t\t\tpattern: /('')[^'](?:.*?[^'])?(?=\\1)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /^''+|''+$/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'hr': {\n\t\t\t\tpattern: /^-{4,}/m,\n\t\t\t\talias: 'punctuation',\n\t\t\t},\n\t\t\t'url': [\n\t\t\t\t/ISBN +(?:97[89][ -]?)?(?:\\d[ -]?){9}[\\dx]\\b|(?:PMID|RFC) +\\d+/i,\n\t\t\t\t/\\[\\[.+?\\]\\]|\\[.+?\\]/,\n\t\t\t],\n\t\t\t'variable': [\n\t\t\t\t/__[A-Z]+__/,\n\t\t\t\t// FIXME Nested structures should be handled\n\t\t\t\t// {{formatnum:{{#expr:{{{3}}}}}}}\n\t\t\t\t/\\{{3}.+?\\}{3}/,\n\t\t\t\t/\\{\\{.+?\\}\\}/,\n\t\t\t],\n\t\t\t'symbol': [/^#redirect/im, /~{3,5}/],\n\t\t\t// Handle table attrs:\n\t\t\t// {|\n\t\t\t// ! style=\"text-align:left;\"| Item\n\t\t\t// |}\n\t\t\t'table-tag': {\n\t\t\t\tpattern: /((?:^|[|!])[|!])[^|\\r\\n]+\\|(?!\\|)/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'table-bar': {\n\t\t\t\t\t\tpattern: /\\|$/,\n\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t},\n\t\t\t\t\t$rest: tag.inside,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'punctuation': /^(?:\\{\\||\\|\\}|\\|-|[*#:;!|])|\\|\\||!!/m,\n\t\t\t$insert: {\n\t\t\t\t// Prevent highlighting inside <nowiki>, <source> and <pre> tags\n\t\t\t\t'nowiki': {\n\t\t\t\t\t$before: 'tag',\n\t\t\t\t\tpattern: /<(nowiki|pre|source)\\b[^>]*>[\\s\\S]*?<\\/\\1>/i,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'tag': {\n\t\t\t\t\t\t\tpattern: /<(?:nowiki|pre|source)\\b[^>]*>|<\\/(?:nowiki|pre|source)>/i,\n\t\t\t\t\t\t\tinside: tag.inside,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/wolfram.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'wolfram'>} */\nexport default {\n\tid: 'wolfram',\n\talias: ['mathematica', 'nb', 'wl'],\n\tgrammar: {\n\t\t// Allow one level of nesting - note: regex taken from applescipt\n\t\t'comment': /\\(\\*(?:\\(\\*(?:[^*]|\\*(?!\\)))*\\*\\)|(?!\\(\\*)[\\s\\S])*?\\*\\)/,\n\t\t'string': {\n\t\t\tpattern: /\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\\b/,\n\t\t'context': {\n\t\t\tpattern: /\\b\\w+`+\\w*/,\n\t\t\talias: 'class-name',\n\t\t},\n\t\t'blank': {\n\t\t\tpattern: /\\b\\w+_\\b/,\n\t\t\talias: 'regex',\n\t\t},\n\t\t'global-variable': {\n\t\t\tpattern: /\\$\\w+/,\n\t\t\talias: 'variable',\n\t\t},\n\t\t'boolean': /\\b(?:False|True)\\b/,\n\t\t'number':\n\t\t\t/(?:\\b(?=\\d)|\\B(?=\\.))(?:0[bo])?(?:(?:\\d|0x[\\da-f])[\\da-f]*(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?j?\\b/i,\n\t\t'operator':\n\t\t\t/\\/\\.|;|=\\.|\\^=|\\^:=|:=|<<|>>|<\\||\\|>|:>|\\|->|->|<-|@@@|@@|@|\\/@|=!=|===|==|=|\\+|-|\\[\\/-+%=\\]=?|!=|\\*\\*?=?|\\/\\/?=?|<[<=>]?|>[=>]?|[&|^~]/,\n\t\t'punctuation': /[{}[\\];(),.:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/wren.js",
    "content": "// https://wren.io/\n\n/** @type {import('../types.d.ts').LanguageProto<'wren'>} */\nexport default {\n\tid: 'wren',\n\tgrammar: {\n\t\t// Multiline comments in Wren can have nested multiline comments\n\t\t// Comments: // and /* */\n\t\t'comment': [\n\t\t\t{\n\t\t\t\t// support 3 levels of nesting\n\t\t\t\t// regex: \\/\\*(?:[^*/]|\\*(?!\\/)|\\/(?!\\*)|<self>)*\\*\\/\n\t\t\t\tpattern:\n\t\t\t\t\t/\\/\\*(?:[^*/]|\\*(?!\\/)|\\/(?!\\*)|\\/\\*(?:[^*/]|\\*(?!\\/)|\\/(?!\\*)|\\/\\*(?:[^*/]|\\*(?!\\/)|\\/(?!\\*))*\\*\\/)*\\*\\/)*\\*\\//,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t],\n\n\t\t// Triple quoted strings are multiline but cannot have interpolation (raw strings)\n\t\t// Based on python.js\n\t\t'triple-quoted-string': {\n\t\t\tpattern: /\"\"\"[\\s\\S]*?\"\"\"/,\n\t\t\tgreedy: true,\n\t\t\talias: 'string',\n\t\t},\n\n\t\t// A single quote string is multiline and can have interpolation (similar to JS backticks ``)\n\t\t'string-literal': {\n\t\t\tpattern:\n\t\t\t\t/(^|[^\\\\\"])\"(?:[^\\\\\"%]|\\\\[\\s\\S]|%(?!\\()|%\\((?:[^()]|\\((?:[^()]|\\([^)]*\\))*\\))*\\))*\"/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'interpolation': {\n\t\t\t\t\t// \"%(interpolation)\"\n\t\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)%\\((?:[^()]|\\((?:[^()]|\\([^)]*\\))*\\))*\\)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'expression': {\n\t\t\t\t\t\t\tpattern: /^(%\\()[\\s\\S]+(?=\\)$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\tinside: 'wren',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\t\tpattern: /^%\\(|\\)$/,\n\t\t\t\t\t\t\talias: 'punctuation',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'string': /[\\s\\S]+/,\n\t\t\t},\n\t\t},\n\n\t\t// #!/usr/bin/env wren on the first line\n\t\t'hashbang': {\n\t\t\tpattern: /^#!\\/.+/,\n\t\t\tgreedy: true,\n\t\t\talias: 'comment',\n\t\t},\n\n\t\t// Attributes are special keywords to add meta data to classes\n\t\t'attribute': {\n\t\t\t// #! attributes are stored in class properties\n\t\t\t// #!myvar = true\n\t\t\t// #attributes are not stored and dismissed at compilation\n\t\t\tpattern: /#!?[ \\t\\u3000]*\\w+/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'class-name': [\n\t\t\t{\n\t\t\t\t// class definition\n\t\t\t\t// class Meta {}\n\t\t\t\tpattern: /(\\bclass\\s+)\\w+/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t// A class must always start with an uppercase.\n\t\t\t// File.read\n\t\t\t/\\b[A-Z][a-z\\d_]*\\b/,\n\t\t],\n\n\t\t// A constant can be a variable, class, property or method. Just named in all uppercase letters\n\t\t'constant': /\\b[A-Z][A-Z\\d_]*\\b/,\n\n\t\t'null': {\n\t\t\tpattern: /\\bnull\\b/,\n\t\t\talias: 'keyword',\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:as|break|class|construct|continue|else|for|foreign|if|import|in|is|return|static|super|this|var|while)\\b/,\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'number': /\\b(?:0x[\\da-f]+|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)\\b/i,\n\n\t\t// Functions can be Class.method()\n\t\t'function': /\\b[a-z_]\\w*(?=\\s*[({])/i,\n\n\t\t'operator': /<<|>>|[=!<>]=?|&&|\\|\\||[-+*/%~^&|?:]|\\.{2,3}/,\n\t\t'punctuation': /[\\[\\](){}.,;]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/xeora.js",
    "content": "import markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'xeora'>} */\nexport default {\n\tid: 'xeora',\n\tbase: markup,\n\talias: 'xeoracube',\n\tgrammar () {\n\t\tconst functionVariable = {\n\t\t\tpattern: /(?:[,|])@?(?:#+|[-+*~=^])?[\\w.]+/,\n\t\t\tinside: {\n\t\t\t\t'punctuation': {\n\t\t\t\t\tpattern: /[,.|]/,\n\t\t\t\t},\n\t\t\t\t'operator': {\n\t\t\t\t\tpattern: /#+|[-+*~=^@]/,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\t'constant': {\n\t\t\t\tpattern: /\\$(?:DomainContents|PageRenderDuration)\\$/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': {\n\t\t\t\t\t\tpattern: /\\$/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'variable': {\n\t\t\t\tpattern: /\\$@?(?:#+|[-+*~=^])?[\\w.]+\\$/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': {\n\t\t\t\t\t\tpattern: /[$.]/,\n\t\t\t\t\t},\n\t\t\t\t\t'operator': {\n\t\t\t\t\t\tpattern: /#+|[-+*~=^@]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'function-inline': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\$F:[-\\w.]+\\?[-\\w.]+(?:,(?:(?:@[-#]*\\w+\\.[\\w+.]\\.*)*\\|)*(?:(?:[\\w+]|[-#*.~^]+[\\w+]|=\\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\\w+\\.[\\w+.]\\.*)+(?:(?:[\\w+]|[-#*~^][-#*.~^]*[\\w+]|=\\S)(?:[^$=]|=+[^=])*=*)?)?)?\\$/,\n\t\t\t\tinside: {\n\t\t\t\t\t'variable': functionVariable,\n\t\t\t\t\t'punctuation': {\n\t\t\t\t\t\tpattern: /\\$\\w:|[$:?.,|]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'function-block': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\$XF:\\{[-\\w.]+\\?[-\\w.]+(?:,(?:(?:@[-#]*\\w+\\.[\\w+.]\\.*)*\\|)*(?:(?:[\\w+]|[-#*.~^]+[\\w+]|=\\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\\w+\\.[\\w+.]\\.*)+(?:(?:[\\w+]|[-#*~^][-#*.~^]*[\\w+]|=\\S)(?:[^$=]|=+[^=])*=*)?)?)?\\}:XF\\$/,\n\t\t\t\tinside: {\n\t\t\t\t\t'variable': functionVariable,\n\t\t\t\t\t'punctuation': {\n\t\t\t\t\t\tpattern: /[$:{}?.,|]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'directive-inline': {\n\t\t\t\tpattern: /\\$\\w(?:#\\d+\\+?)?(?:\\[[-\\w.]+\\])?:[-\\/\\w.]+\\$/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': {\n\t\t\t\t\t\tpattern: /\\$(?:\\w:|C(?:\\[|#\\d))?|[:{[\\]]/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'tag': {\n\t\t\t\t\t\t\t\tpattern: /#\\d/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'directive-block-open': {\n\t\t\t\tpattern: /\\$\\w+:\\{|\\$\\w(?:#\\d+\\+?)?(?:\\[[-\\w.]+\\])?:[-\\w.]+:\\{(?:![A-Z]+)?/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': {\n\t\t\t\t\t\tpattern: /\\$(?:\\w:|C(?:\\[|#\\d))?|[:{[\\]]/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'tag': {\n\t\t\t\t\t\t\t\tpattern: /#\\d/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'attribute': {\n\t\t\t\t\t\tpattern: /![A-Z]+$/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': {\n\t\t\t\t\t\t\t\tpattern: /!/,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\talias: 'keyword',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'directive-block-separator': {\n\t\t\t\tpattern: /\\}:[-\\w.]+:\\{/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': {\n\t\t\t\t\t\tpattern: /[:{}]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t\t'directive-block-close': {\n\t\t\t\tpattern: /\\}:[-\\w.]+\\$/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': {\n\t\t\t\t\t\tpattern: /[:{}$]/,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\talias: 'function',\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/xml-doc.js",
    "content": "import markup from './markup.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'xml-doc'>} */\nexport default {\n\tid: 'xml-doc',\n\trequire: markup,\n\tgrammar ({ languages }) {\n\t\tconst tag = languages.markup.tag;\n\n\t\treturn {\n\t\t\t'slash': {\n\t\t\t\tpattern: /\\/\\/\\/.*/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'comment',\n\t\t\t\tinside: {\n\t\t\t\t\t'tag': tag,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'tick': {\n\t\t\t\tpattern: /'''.*/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'comment',\n\t\t\t\tinside: {\n\t\t\t\t\t'tag': tag,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/xml.js",
    "content": "import { MARKUP_TAG } from '../shared/languages/patterns.js';\n\n/** @type {import('../types.d.ts').LanguageProto<'xml'>} */\nexport default {\n\tid: 'xml',\n\talias: ['ssml', 'atom', 'rss'],\n\tgrammar () {\n\t\tconst entity = [\n\t\t\t{\n\t\t\t\tpattern: /&[\\da-z]{1,8};/i,\n\t\t\t\talias: 'named-entity',\n\t\t\t},\n\t\t\t/&#x?[\\da-f]{1,8};/i,\n\t\t];\n\n\t\treturn {\n\t\t\t'comment': {\n\t\t\t\tpattern: /<!--(?:(?!<!--)[\\s\\S])*?-->/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'prolog': {\n\t\t\t\tpattern: /<\\?[\\s\\S]+?\\?>/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'doctype': {\n\t\t\t\t// https://www.w3.org/TR/xml/#NT-doctypedecl\n\t\t\t\tpattern:\n\t\t\t\t\t/<!DOCTYPE(?:[^>\"'[\\]]|\"[^\"]*\"|'[^']*')+(?:\\[(?:[^<\"'\\]]|\"[^\"]*\"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\\]\\s*)?>/i,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'internal-subset': {\n\t\t\t\t\t\tpattern: /(^[^\\[]*\\[)[\\s\\S]+(?=\\]>$)/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t\tinside: 'xml',\n\t\t\t\t\t},\n\t\t\t\t\t'string': {\n\t\t\t\t\t\tpattern: /\"[^\"]*\"|'[^']*'/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /^<!|>$|[[\\]]/,\n\t\t\t\t\t'doctype-tag': /^DOCTYPE/i,\n\t\t\t\t\t'name': /[^\\s<>'\"]+/,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'cdata': {\n\t\t\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'tag': {\n\t\t\t\tpattern: MARKUP_TAG,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'tag': {\n\t\t\t\t\t\tpattern: /^(<\\/?)[^\\s>\\/]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'attr-value': {\n\t\t\t\t\t\tpattern: /=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+)/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\t\t\talias: 'attr-equals',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpattern: /^(\\s*)[\"']|[\"']$/,\n\t\t\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t'entity': entity,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /^<\\/?|\\/?>$/,\n\t\t\t\t\t'attr-name': {\n\t\t\t\t\t\tpattern: /[^\\s>\\/]+/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'entity': entity,\n\t\t};\n\t},\n\teffect (Prism) {\n\t\t// Plugin to make entity title show the real entity, idea by Roman Komarov\n\t\treturn Prism.hooks.add('wrap', env => {\n\t\t\tif (env.type === 'entity') {\n\t\t\t\tenv.attributes['title'] = env.content.replace(/&amp;/, '&');\n\t\t\t}\n\t\t});\n\t},\n};\n"
  },
  {
    "path": "src/languages/xojo.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'xojo'>} */\nexport default {\n\tid: 'xojo',\n\tgrammar: {\n\t\t'comment': {\n\t\t\tpattern: /(?:'|\\/\\/|Rem\\b).+/i,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'string': {\n\t\t\tpattern: /\"(?:\"\"|[^\"])*\"/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'number': [/(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:E[+-]?\\d+)?/i, /&[bchou][a-z\\d]+/i],\n\t\t'directive': {\n\t\t\tpattern: /#(?:Else|ElseIf|Endif|If|Pragma)\\b/i,\n\t\t\talias: 'property',\n\t\t},\n\t\t'keyword':\n\t\t\t/\\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\\b/i,\n\t\t'operator':\n\t\t\t/<[=>]?|>=?|[+\\-*\\/\\\\^=]|\\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\\b/i,\n\t\t'punctuation': /[.,;:()]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/xquery.js",
    "content": "import { getTextContent, Token } from '../core/classes/token.js';\nimport { withoutTokenize } from '../util/language-util.js';\nimport markup from './markup.js';\n\n/**\n * @param {TokenStream} tokens\n */\nfunction walkTokens (tokens) {\n\tconst openedTags = [];\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tconst token = tokens[i];\n\t\tconst isToken = typeof token !== 'string';\n\t\tlet notTagNorBrace = false;\n\n\t\tif (isToken) {\n\t\t\tconst nestedTag = token.content[1];\n\t\t\tif (token.type === 'tag' && typeof nestedTag === 'object' && nestedTag.type === 'tag') {\n\t\t\t\t// We found a tag, now find its kind\n\n\t\t\t\tconst firstChild = token.content[0];\n\t\t\t\tif (typeof firstChild === 'object' && firstChild.content === '</') {\n\t\t\t\t\t// Closing tag\n\t\t\t\t\tif (\n\t\t\t\t\t\topenedTags.length > 0 &&\n\t\t\t\t\t\topenedTags[openedTags.length - 1].tagName === getTextContent(nestedTag)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Pop matching opening tag\n\t\t\t\t\t\topenedTags.pop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconst lastChild = token.content[token.content.length - 1];\n\t\t\t\t\tif (typeof lastChild === 'object' && lastChild.content === '/>') {\n\t\t\t\t\t\t// Autoclosed tag, ignore\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Opening tag\n\t\t\t\t\t\topenedTags.push({\n\t\t\t\t\t\t\ttagName: getTextContent(nestedTag),\n\t\t\t\t\t\t\topenedBraces: 0,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst next = tokens[i + 1];\n\t\t\t\tconst prev = tokens[i - 1];\n\t\t\t\tif (\n\t\t\t\t\topenedTags.length > 0 &&\n\t\t\t\t\ttoken.type === 'punctuation' &&\n\t\t\t\t\ttoken.content === '{' &&\n\t\t\t\t\t// Ignore `{{`\n\t\t\t\t\t(typeof next !== 'object' ||\n\t\t\t\t\t\tnext.type !== 'punctuation' ||\n\t\t\t\t\t\tnext.content !== '{') &&\n\t\t\t\t\t(typeof prev !== 'object' || prev.type !== 'plain-text' || prev.content !== '{')\n\t\t\t\t) {\n\t\t\t\t\t// Here we might have entered an XQuery expression inside a tag\n\t\t\t\t\topenedTags[openedTags.length - 1].openedBraces++;\n\t\t\t\t}\n\t\t\t\telse if (\n\t\t\t\t\topenedTags.length > 0 &&\n\t\t\t\t\topenedTags[openedTags.length - 1].openedBraces > 0 &&\n\t\t\t\t\ttoken.type === 'punctuation' &&\n\t\t\t\t\ttoken.content === '}'\n\t\t\t\t) {\n\t\t\t\t\t// Here we might have left an XQuery expression inside a tag\n\t\t\t\t\topenedTags[openedTags.length - 1].openedBraces--;\n\t\t\t\t}\n\t\t\t\telse if (token.type !== 'comment') {\n\t\t\t\t\tnotTagNorBrace = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (notTagNorBrace || !isToken) {\n\t\t\tif (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces === 0) {\n\t\t\t\t// Here we are inside a tag, and not inside an XQuery expression.\n\t\t\t\t// That's plain text: drop any tokens matched.\n\t\t\t\tlet plainText = getTextContent(token);\n\n\t\t\t\t// And merge text with adjacent text\n\t\t\t\tconst next = tokens[i + 1];\n\t\t\t\tif (next && (typeof next === 'string' || next.type === 'plain-text')) {\n\t\t\t\t\tplainText += getTextContent(next);\n\t\t\t\t\ttokens.splice(i + 1, 1);\n\t\t\t\t}\n\t\t\t\tconst prev = tokens[i - 1];\n\t\t\t\tif (prev && (typeof prev === 'string' || prev.type === 'plain-text')) {\n\t\t\t\t\tplainText = getTextContent(prev) + plainText;\n\t\t\t\t\ttokens.splice(i - 1, 1);\n\t\t\t\t\ti--;\n\t\t\t\t}\n\n\t\t\t\tif (/^\\s+$/.test(plainText)) {\n\t\t\t\t\ttokens[i] = plainText;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttokens[i] = new Token('plain-text', plainText, undefined, plainText);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isToken && typeof token.content !== 'string') {\n\t\t\twalkTokens(token.content);\n\t\t}\n\t}\n}\n\n/** @type {import('../types.d.ts').LanguageProto<'xquery'>} */\nexport default {\n\tid: 'xquery',\n\tbase: markup,\n\tgrammar ({ base }) {\n\t\tconst tag = /** @type {GrammarToken} */ (base['tag']);\n\t\ttag.pattern =\n\t\t\t/<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\[\\s\\S]|\\{(?!\\{)(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])+\\}|(?!\\1)[^\\\\])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/;\n\n\t\tconst attrValue = /** @type {GrammarToken} */ (\n\t\t\t/** @type {Grammar} */ (tag.inside)['attr-value']\n\t\t);\n\t\tattrValue.pattern =\n\t\t\t/=(?:(\"|')(?:\\\\[\\s\\S]|\\{(?!\\{)(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])+\\}|(?!\\1)[^\\\\])*\\1|[^\\s'\">=]+)/;\n\t\tconst attrValueInside = /** @type {Grammar} */ (attrValue.inside);\n\t\tattrValueInside['punctuation'] = /^=\"|\"$/;\n\t\tattrValueInside['expression'] = {\n\t\t\t// Allow for two levels of nesting\n\t\t\tpattern: /\\{(?!\\{)(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])+\\}/,\n\t\t\talias: 'language-xquery',\n\t\t\tinside: 'xquery',\n\t\t};\n\n\t\tbase.$tokenize = (code, grammar, Prism) => {\n\t\t\tconst tokens = Prism.tokenize(code, withoutTokenize(grammar));\n\t\t\twalkTokens(tokens);\n\t\t\treturn tokens;\n\t\t};\n\n\t\treturn {\n\t\t\t'xquery-comment': {\n\t\t\t\tpattern: /\\(:[\\s\\S]*?:\\)/,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'comment',\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /([\"'])(?:\\1\\1|(?!\\1)[\\s\\S])*\\1/,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'extension': {\n\t\t\t\tpattern: /\\(#.+?#\\)/,\n\t\t\t\talias: 'symbol',\n\t\t\t},\n\t\t\t'variable': /\\$[-\\w:]+/,\n\t\t\t'axis': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\t\t\t'keyword-operator': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^:-])\\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\\b(?=$|[^:-])/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'operator',\n\t\t\t},\n\t\t\t'keyword': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^:-])\\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\\b(?=$|[^:-])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'function': /[\\w-]+(?::[\\w-]+)*(?=\\s*\\()/,\n\t\t\t'xquery-element': {\n\t\t\t\tpattern: /(element\\s+)[\\w-]+(?::[\\w-]+)*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'tag',\n\t\t\t},\n\t\t\t'xquery-attribute': {\n\t\t\t\tpattern: /(attribute\\s+)[\\w-]+(?::[\\w-]+)*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'attr-name',\n\t\t\t},\n\t\t\t'builtin': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^:-])\\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\\b(?=$|[^:-])/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'number': /\\b\\d+(?:\\.\\d+)?(?:E[+-]?\\d+)?/,\n\t\t\t'operator': [\n\t\t\t\t/[+*=?|@]|\\.\\.?|:=|!=|<[=<]?|>[=>]?/,\n\t\t\t\t{\n\t\t\t\t\tpattern: /(\\s)-(?=\\s)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'punctuation': /[[\\](){},;:/]/,\n\t\t};\n\t},\n};\n\n/**\n * @typedef {import('../types.d.ts').TokenStream} TokenStream\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n * @typedef {import('../types.d.ts').Grammar} Grammar\n */\n"
  },
  {
    "path": "src/languages/yaml.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'yaml'>} */\nexport default {\n\tid: 'yaml',\n\talias: 'yml',\n\tgrammar () {\n\t\t// https://yaml.org/spec/1.2/spec.html#c-ns-anchor-property\n\t\t// https://yaml.org/spec/1.2/spec.html#c-ns-alias-node\n\t\tconst anchorOrAlias = /[*&][^\\s[\\]{},]+/;\n\t\t// https://yaml.org/spec/1.2/spec.html#c-ns-tag-property\n\t\tconst tag =\n\t\t\t/!(?:<[\\w\\-%#;/?:@&=+$,.!~*'()[\\]]+>|(?:[a-zA-Z\\d-]*!)?[\\w\\-%#;/?:@&=+$.~*'()]+)?/;\n\t\t// https://yaml.org/spec/1.2/spec.html#c-ns-properties(n,c)\n\t\tconst properties =\n\t\t\t'(?:' +\n\t\t\ttag.source +\n\t\t\t'(?:[ \\t]+' +\n\t\t\tanchorOrAlias.source +\n\t\t\t')?|' +\n\t\t\tanchorOrAlias.source +\n\t\t\t'(?:[ \\t]+' +\n\t\t\ttag.source +\n\t\t\t')?)';\n\t\t// https://yaml.org/spec/1.2/spec.html#ns-plain(n,c)\n\t\t// This is a simplified version that doesn't support \"#\" and multiline keys\n\t\t// All these long scarry character classes are simplified versions of YAML's characters\n\t\tconst plainKey =\n\t\t\t/(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-]<PLAIN>)(?:[ \\t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(\n\t\t\t\t/<PLAIN>/g,\n\t\t\t\t() =>\n\t\t\t\t\t/[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]/\n\t\t\t\t\t\t.source\n\t\t\t);\n\t\tconst string = /\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"|'(?:[^'\\\\\\r\\n]|\\\\.)*'/.source;\n\n\t\t/**\n\t\t * @param {string} value\n\t\t * @param {string} [flags]\n\t\t * @returns {RegExp}\n\t\t */\n\t\tfunction createValuePattern (value, flags) {\n\t\t\tflags = (flags || '').replace(/m/g, '') + 'm'; // add m flag\n\t\t\tconst pattern =\n\t\t\t\t/([:\\-,[{]\\s*(?:\\s<<prop>>[ \\t]+)?)(?:<<value>>)(?=[ \\t]*(?:$|,|\\]|\\}|(?:[\\r\\n]\\s*)?#))/.source\n\t\t\t\t\t.replace(/<<prop>>/g, () => properties)\n\t\t\t\t\t.replace(/<<value>>/g, () => value);\n\t\t\treturn RegExp(pattern, flags);\n\t\t}\n\n\t\treturn {\n\t\t\t'scalar': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/([\\-:]\\s*(?:\\s<<prop>>[ \\t]+)?[|>])[ \\t]*(?:((?:\\r?\\n|\\r)[ \\t]+)\\S[^\\r\\n]*(?:\\2[^\\r\\n]+)*)/.source.replace(\n\t\t\t\t\t\t/<<prop>>/g,\n\t\t\t\t\t\t() => properties\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'string',\n\t\t\t},\n\t\t\t'comment': /#.*/,\n\t\t\t'key': {\n\t\t\t\tpattern: RegExp(\n\t\t\t\t\t/((?:^|[:\\-,[{\\r\\n?])[ \\t]*(?:<<prop>>[ \\t]+)?)<<key>>(?=\\s*:\\s)/.source\n\t\t\t\t\t\t.replace(/<<prop>>/g, () => properties)\n\t\t\t\t\t\t.replace(/<<key>>/g, () => '(?:' + plainKey + '|' + string + ')')\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\talias: 'atrule',\n\t\t\t},\n\t\t\t'directive': {\n\t\t\t\tpattern: /(^[ \\t]*)%.+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'important',\n\t\t\t},\n\t\t\t'datetime': {\n\t\t\t\tpattern: createValuePattern(\n\t\t\t\t\t/\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \\t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \\t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?/\n\t\t\t\t\t\t.source\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'number',\n\t\t\t},\n\t\t\t'boolean': {\n\t\t\t\tpattern: createValuePattern(/false|true/.source, 'i'),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'important',\n\t\t\t},\n\t\t\t'null': {\n\t\t\t\tpattern: createValuePattern(/null|~/.source, 'i'),\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'important',\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: createValuePattern(string),\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'number': {\n\t\t\t\tpattern: createValuePattern(\n\t\t\t\t\t/[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)/\n\t\t\t\t\t\t.source,\n\t\t\t\t\t'i'\n\t\t\t\t),\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'tag': tag,\n\t\t\t'important': anchorOrAlias,\n\t\t\t'punctuation': /---|[:[\\]{}\\-,|>?]|\\.\\.\\./,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/languages/yang.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'yang'>} */\nexport default {\n\tid: 'yang',\n\tgrammar: {\n\t\t// https://tools.ietf.org/html/rfc6020#page-34\n\t\t// http://www.yang-central.org/twiki/bin/view/Main/YangExamples\n\t\t'comment': /\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*/,\n\t\t'string': {\n\t\t\tpattern: /\"(?:[^\\\\\"]|\\\\.)*\"|'[^']*'/,\n\t\t\tgreedy: true,\n\t\t},\n\t\t'keyword': {\n\t\t\tpattern: /(^|[{};\\r\\n][ \\t]*)[a-z_][\\w.-]*/i,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'namespace': {\n\t\t\tpattern: /(\\s)[a-z_][\\w.-]*(?=:)/i,\n\t\t\tlookbehind: true,\n\t\t},\n\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t'operator': /\\+/,\n\t\t'punctuation': /[{};:]/,\n\t},\n};\n"
  },
  {
    "path": "src/languages/zig.js",
    "content": "/** @type {import('../types.d.ts').LanguageProto<'zig'>} */\nexport default {\n\tid: 'zig',\n\tgrammar () {\n\t\t/**\n\t\t *\n\t\t * @param {string} str\n\t\t * @returns {function():string}\n\t\t */\n\t\tfunction literal (str) {\n\t\t\treturn function () {\n\t\t\t\treturn str;\n\t\t\t};\n\t\t}\n\n\t\tconst keyword =\n\t\t\t/\\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\\b/;\n\n\t\tconst IDENTIFIER = '\\\\b(?!' + keyword.source + ')(?!\\\\d)\\\\w+\\\\b';\n\t\tconst ALIGN = /align\\s*\\((?:[^()]|\\([^()]*\\))*\\)/.source;\n\t\tconst PREFIX_TYPE_OP =\n\t\t\t/(?:\\?|\\bpromise->|(?:\\[[^[\\]]*\\]|\\*(?!\\*)|\\*\\*)(?:\\s*<ALIGN>|\\s*const\\b|\\s*volatile\\b|\\s*allowzero\\b)*)/.source.replace(\n\t\t\t\t/<ALIGN>/g,\n\t\t\t\tliteral(ALIGN)\n\t\t\t);\n\t\tconst SUFFIX_EXPR =\n\t\t\t/(?:\\bpromise\\b|(?:\\berror\\.)?<ID>(?:\\.<ID>)*(?!\\s+<ID>))/.source.replace(\n\t\t\t\t/<ID>/g,\n\t\t\t\tliteral(IDENTIFIER)\n\t\t\t);\n\t\tconst TYPE = '(?!\\\\s)(?:!?\\\\s*(?:' + PREFIX_TYPE_OP + '\\\\s*)*' + SUFFIX_EXPR + ')+';\n\n\t\t/*\n\t\t * A simplified grammar for Zig compile time type literals:\n\t\t *\n\t\t * TypeExpr = ( \"!\"? PREFIX_TYPE_OP* SUFFIX_EXPR )+\n\t\t *\n\t\t * SUFFIX_EXPR = ( \\b \"promise\" \\b | ( \\b \"error\" \".\" )? IDENTIFIER ( \".\" IDENTIFIER )* (?! \\s+ IDENTIFIER ) )\n\t\t *\n\t\t * PREFIX_TYPE_OP = \"?\"\n\t\t *                | \\b \"promise\" \"->\"\n\t\t *                | ( \"[\" [^\\[\\]]* \"]\" | \"*\" | \"**\" ) ( ALIGN | \"const\" \\b | \"volatile\" \\b | \"allowzero\" \\b )*\n\t\t *\n\t\t * ALIGN = \"align\" \"(\" ( [^()] | \"(\" [^()]* \")\" )* \")\"\n\t\t *\n\t\t * IDENTIFIER = \\b (?! KEYWORD ) [a-zA-Z_] \\w* \\b\n\t\t *\n\t\t */\n\n\t\treturn {\n\t\t\t'comment': [\n\t\t\t\t{\n\t\t\t\t\tpattern: /\\/\\/[/!].*/,\n\t\t\t\t\talias: 'doc-comment',\n\t\t\t\t},\n\t\t\t\t/\\/{2}.*/,\n\t\t\t],\n\t\t\t'string': [\n\t\t\t\t{\n\t\t\t\t\t// \"string\" and c\"string\"\n\t\t\t\t\tpattern: /(^|[^\\\\@])c?\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// multiline strings and c-strings\n\t\t\t\t\tpattern: /([\\r\\n])([ \\t]+c?\\\\{2}).*(?:(?:\\r\\n?|\\n)\\2.*)*/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'char': {\n\t\t\t\t// characters 'a', '\\n', '\\xFF', '\\u{10FFFF}'\n\t\t\t\tpattern:\n\t\t\t\t\t/(^|[^\\\\])'(?:[^'\\\\\\r\\n]|[\\uD800-\\uDFFF]{2}|\\\\(?:.|x[a-fA-F\\d]{2}|u\\{[a-fA-F\\d]{1,6}\\}))'/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t},\n\t\t\t'builtin': /\\B@(?!\\d)\\w+(?=\\s*\\()/,\n\t\t\t'label': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(\\b(?:break|continue)\\s*:\\s*)\\w+\\b|\\b(?!\\d)\\w+\\b(?=\\s*:\\s*(?:\\{|while\\b))/,\n\t\t\t\tlookbehind: true,\n\t\t\t},\n\t\t\t'class-name': [\n\t\t\t\t// const Foo = struct {};\n\t\t\t\t/\\b(?!\\d)\\w+(?=\\s*=\\s*(?:(?:extern|packed)\\s+)?(?:enum|struct|union)\\s*[({])/,\n\t\t\t\t{\n\t\t\t\t\t// const x: i32 = 9;\n\t\t\t\t\t// var x: Bar;\n\t\t\t\t\t// fn foo(x: bool, y: f32) void {}\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/(:\\s*)<TYPE>(?=\\s*(?:<ALIGN>\\s*)?[=;,)])|<TYPE>(?=\\s*(?:<ALIGN>\\s*)?\\{)/.source\n\t\t\t\t\t\t\t.replace(/<TYPE>/g, literal(TYPE))\n\t\t\t\t\t\t\t.replace(/<ALIGN>/g, literal(ALIGN))\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'zig',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// extern fn foo(x: f64) f64; (optional alignment)\n\t\t\t\t\tpattern: RegExp(\n\t\t\t\t\t\t/(\\)\\s*)<TYPE>(?=\\s*(?:<ALIGN>\\s*)?;)/.source\n\t\t\t\t\t\t\t.replace(/<TYPE>/g, literal(TYPE))\n\t\t\t\t\t\t\t.replace(/<ALIGN>/g, literal(ALIGN))\n\t\t\t\t\t),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: 'zig',\n\t\t\t\t},\n\t\t\t],\n\t\t\t'builtin-type': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\\b/,\n\t\t\t\talias: 'keyword',\n\t\t\t},\n\t\t\t'keyword': keyword,\n\t\t\t'function': /\\b(?!\\d)\\w+(?=\\s*\\()/,\n\t\t\t'number':\n\t\t\t\t/\\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\\d]+(?:\\.[a-fA-F\\d]*)?(?:[pP][+-]?[a-fA-F\\d]+)?|\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)\\b/,\n\t\t\t'boolean': /\\b(?:false|true)\\b/,\n\t\t\t'operator':\n\t\t\t\t/\\.[*?]|\\.{2,3}|[-=]>|\\*\\*|\\+\\+|\\|\\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,\n\t\t\t'punctuation': /[.:,;(){}[\\]]/,\n\t\t};\n\t},\n};\n"
  },
  {
    "path": "src/load-languages.js",
    "content": "import { resolveAlias } from './shared/meta/alias-data.js';\nimport { knownLanguages } from './shared/meta/all-languages-data.js';\nimport { toArray } from './util/iterables.js';\n\n/**\n * @param {string} dir\n * @param {string} file\n * @returns {string}\n */\nfunction pathJoin (dir, file) {\n\treturn dir.replace(/\\/$/, '') + '/' + file;\n}\n\n/** @type {Map<string, Promise>} */\nconst importCache = new Map();\n\n/**\n * @template T\n * @param {string} file\n * @returns {Promise<T>}\n */\nfunction importFile (file) {\n\tlet promise = importCache.get(file);\n\tif (promise === undefined) {\n\t\tpromise = import(file);\n\t\timportCache.set(file, promise);\n\t}\n\treturn promise;\n}\n\n/**\n * Loads the given languages and adds them to the given Prism instance.\n *\n * If no languages are provided, __all__ Prism languages will be loaded.\n *\n * @param {Prism} Prism\n * @param {string | string[]} [languages] Defaults to all known languages.\n * @param {string} [srcPath='.']\n * @returns {Promise}\n */\nexport async function loadLanguages (Prism, languages = knownLanguages, srcPath = '.') {\n\tlanguages = toArray(languages)\n\t\t.map(resolveAlias)\n\t\t.filter(id => !Prism.languageRegistry.has(id));\n\n\tawait Promise.all(\n\t\tlanguages.map(async id => {\n\t\t\ttry {\n\t\t\t\tconst path = pathJoin(srcPath, `languages/${id}.js`);\n\t\t\t\t/** @type {{ default: ComponentProto }} */\n\t\t\t\tconst exports = await importFile(path);\n\t\t\t\t// @ts-ignore\n\t\t\t\tPrism.languageRegistry.add(exports.default);\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\tif (!loadLanguages.silent) {\n\t\t\t\t\tconsole.warn(`Unable to load language ${id}: ${String(error)}`);\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t);\n}\n\n/**\n * Set this to `true` to prevent all warning messages `loadLanguages` logs.\n */\nloadLanguages.silent = false;\n\n/**\n * @import { Prism } from './core.js';\n * @import { ComponentProto } from './types.d.ts';\n */\n"
  },
  {
    "path": "src/plugins/autolinker/README.md",
    "content": "---\ntitle: Autolinker\ndescription: Converts URLs and emails in code to clickable links. Parses Markdown links in comments.\nowner: LeaVerou\n---\n\n<section>\n\n# How to use\n\nURLs and emails will be linked automatically, you don’t need to do anything. To link some text inside a comment to a certain URL, you may use the Markdown syntax:\n\n```markdown\n[Text you want to see](https://url-goes-here.com)\n```\n</section>\n\n<section>\n\n# Examples\n\n## JavaScript\n\n```js\n/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n * MIT license https://www.opensource.org/licenses/mit-license.php/\n * @author Lea Verou https://lea.verou.me\n * Reach Lea at fake@email.com (no, not really)\n * And this is [a Markdown link](https://prismjs.com). Sweet, huh?\n */\nlet foo = 5;\n// And a single line comment https://google.com\n```\n\n## CSS\n\n```css\n@font-face {\n\tsrc: url(https://lea.verou.me/logo.otf);\n\tfont-family: 'LeaVerou';\n}\n```\n\n## HTML\n\n```html\n<!-- Links in HTML, woo!\nLea Verou https://lea.verou.me or, with Markdown, [Lea Verou](https://lea.verou.me) -->\n<img src=\"https://prismjs.com/assets/img/spectrum.png\" alt=\"In attributes too!\" />\n<p>Autolinking in raw text: https://prismjs.com</p>\n```\n</section>\n"
  },
  {
    "path": "src/plugins/autolinker/autolinker.css",
    "content": ".token a {\n\tcolor: inherit;\n}\n"
  },
  {
    "path": "src/plugins/autolinker/autolinker.js",
    "content": "import prism from '../../global.js';\nimport { tokenizeStrings } from '../../shared/tokenize-strings.js';\n\n/** @type {import('../../types.d.ts').PluginProto<'autolinker'>} */\nconst Self = {\n\tid: 'autolinker',\n\toptional: 'diff-highlight',\n\teffect (Prism) {\n\t\t/**\n\t\t * @param {string} chars\n\t\t * @returns {string}\n\t\t */\n\t\tfunction balanced (chars) {\n\t\t\treturn String.raw`(?:${chars}|\\((?:${chars})*\\))`;\n\t\t}\n\n\t\tconst url = RegExp(\n\t\t\t/\\b(?:[a-z]{3,7}:\\/\\/|tel:)/.source +\n\t\t\t\t`${balanced(/[\\w\\-+%~/.:=&!$'*,;@]/.source)}+` +\n\t\t\t\t`(?:\\\\?${balanced(/[\\w\\-+%~/.:=&!$'*,;@?]/.source)}*)?` +\n\t\t\t\t`(?:#${balanced(/[\\w\\-+%~/.:=&!$'*,;@?#]/.source)}*)?`\n\t\t);\n\t\tconst email = /\\b\\S+@[\\w.]+[a-z]{2}/;\n\n\t\tconst links = {\n\t\t\t'url-link': url,\n\t\t\t'email-link': email,\n\t\t};\n\n\t\treturn Prism.hooks.add({\n\t\t\t'after-tokenize': env => {\n\t\t\t\ttokenizeStrings(env.tokens, code => Prism.tokenize(code, links));\n\t\t\t},\n\t\t\t'wrap': env => {\n\t\t\t\tif (env.type.endsWith('-link')) {\n\t\t\t\t\tlet href = env.content;\n\n\t\t\t\t\tif (env.type === 'email-link' && !href.startsWith('mailto:')) {\n\t\t\t\t\t\thref = 'mailto:' + href;\n\t\t\t\t\t}\n\n\t\t\t\t\tenv.tag = 'a';\n\t\t\t\t\tenv.attributes.href = href;\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/plugins/autoloader/README.md",
    "content": "---\ntitle: Autoloader\ndescription: Automatically loads the needed languages to highlight the code blocks.\nowner: Golmote\nnoCSS: true\nresources:\n  - https://dev.prismjs.com/components.js\n  - https://prismjs.com/assets/vendor/jszip.min.js\n  - https://prismjs.com/assets/vendor/FileSaver.min.js\n  - ./demo.js\n---\n\n<style>\n\t.download-grammars {\n\t\tfont: inherit;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\tbackground: none;\n\t\ttext-decoration: underline;\n\t\tcursor: pointer;\n\n\t\t&.loading:after {\n\t\t\tcontent: \" [Generating... \" attr(data-progress) \"%]\";\n\t\t}\n\t}\n</style>\n\n<section class=\"language-javascript\">\n\n# How to use\n\nThe plugin will automatically handle missing grammars and load them for you. To do this, you need to provide a URL to a directory of all the grammars you want. This can be the path to a local directory with all grammars or a CDN URL.\n\nYou can download all the available grammars by clicking on the following link: <button class=\"download-grammars\" type=\"button\">download all grammars</button>.<br />\nAlternatively, you can also clone the GitHub repo and take the `components` folder from there. Read our [usage section](https://prismjs.com/index.html#basic-usage-cdn) to use a CDN.\n\nYou can then download Prism core and any plugins from the [Download](https://prismjs.com/download.html) page, without checking any languages (or just check the languages you want to load by default, e.g. if you're using a language a lot, then you probably want to save the extra HTTP request).\n\nA couple of additional options are available through the configuration object `Prism.plugins.autoloader`.\n\n## Specifying the grammars path\n\nBy default, the plugin will look for the missing grammars in the `components` folder. If your files are in a different location, you can specify it using the `languages_path` option:\n\n```\nPrism.plugins.autoloader.languages_path = 'path/to/grammars/';\n```\n\n_Note:_ Autoloader is pretty good at guessing this path. You most likely won't have to change this path.\n\n## Using development versions\n\nBy default, the plugin uses the minified versions of the grammars. If you wish to use the development versions instead, you can set the `use_minified` option to false:\n\n```\nPrism.plugins.autoloader.use_minified = false;\n```\n\n## Specifying additional dependencies\n\nAll default dependencies are already included in the plugin. However, there are some cases where you might want to load an additional dependency for a specific code block. To do so, just add a `data-dependencies` attribute on you `<code>` or `<pre>` tags, containing a list of comma-separated language aliases.\n\n```markup\n<pre><code class=\"language-pug\" data-dependencies=\"less\">\n:less\n\tfoo {\n\t\tcolor: @red;\n\t}\n</code><pre>\n```\n\n## Force to reload a grammar\n\nThe plugin usually doesn't reload a grammar if it already exists. In some very specific cases, you might however want to do so. If you add an exclamation mark after an alias in the `data-dependencies` attribute, this language will be reloaded.\n\n```html\n<pre class=\"language-markup\" data-dependencies=\"markup,css!\"><code>\n```\n\n</section>\n\n<section>\n\n# Examples\n\nNote that no languages are loaded on this page by default.\n\nBasic usage with some Perl code:\n\n```perl\nmy ($class, $filename) = @_;\n```\n\nAlias support with TypeScript's `ts`:\n\n```ts\nconst a: number = 0;\n```\n\nThe Less filter used in Pug:\n\n```pug\n:less\n\tfoo {\n\t\tcolor: @red;\n\t}\n```\n\n# Markdown\n\nMarkdown will use the Autoloader to automatically load missing languages.\n\n````markdown\nThe C# code will be highlighted __after__ the rest of this document.\n\n```csharp\npublic class Foo : IBar<int> {\n\tpublic string Baz { get; set; } = \"foo\";\n}\n```\n\nThe CSS code will be highlighted with this document because CSS has already been loaded.\n\n```css\na:hover {\n\tcolor: green !important;\n}\n```\n````\n\n</section>\n"
  },
  {
    "path": "src/plugins/autoloader/autoloader.js",
    "content": "import prism from '../../global.js';\nimport { getParentPre } from '../../shared/dom-util.js';\nimport { resolveAlias } from '../../shared/meta/alias-data.js';\nimport { toArray } from '../../util/iterables.js';\n\nfunction getDefaultSrcPath () {\n\tif (typeof document !== 'undefined') {\n\t\tconst script = /** @type {HTMLScriptElement | null} */ (document.currentScript);\n\t\tif (script) {\n\t\t\tconst autoloaderFile =\n\t\t\t\t/\\bplugins\\/autoloader\\/autoloader\\.(?:min\\.)?js(?:\\?[^\\r\\n/]*)?$/i;\n\t\t\tconst prismFile = /(^|\\/)[\\w-]+\\.(?:min\\.)?m?js(?:\\?[^\\r\\n/]*)?$/i;\n\n\t\t\tconst autoloaderPath = script.getAttribute('data-autoloader-path');\n\t\t\tif (autoloaderPath != null) {\n\t\t\t\t// data-autoloader-path is set, so just use it\n\t\t\t\treturn autoloaderPath.trim().replace(/\\/?$/, '/');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst src = script.src;\n\t\t\t\tif (autoloaderFile.test(src)) {\n\t\t\t\t\t// the script is the original autoloader script in the usual Prism project structure\n\t\t\t\t\treturn src.replace(autoloaderFile, '/');\n\t\t\t\t}\n\t\t\t\telse if (prismFile.test(src)) {\n\t\t\t\t\t// the script is part of a bundle like a custom prism.js from the download page\n\t\t\t\t\treturn src.replace(prismFile, '$1/');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn './';\n}\n\n/**\n * @param {string} dir\n * @param {string} file\n * @returns {string}\n */\nfunction pathJoin (dir, file) {\n\treturn dir.replace(/\\/$/, '') + '/' + file;\n}\n\n/** @type {Set<string>} */\nconst ignoredLanguages = new Set(['none']);\n\n/**\n * @param {Prism} Prism The Prism instance\n * @param {string} name The name of the language\n */\nfunction isLoaded (Prism, name) {\n\t// resolve alias\n\tconst id = Prism.languageRegistry.resolveRef(name).id;\n\treturn Prism.languageRegistry.has(id) || ignoredLanguages.has(id);\n}\n\nexport class Autoloader {\n\tsrcPath = getDefaultSrcPath();\n\n\t/**\n\t * @type {Map<string, Promise<any>>}\n\t */\n\t_importCache = new Map();\n\n\t/**\n\t * @type {Prism}\n\t */\n\tPrism;\n\n\t/**\n\t * @param {Prism} Prism\n\t */\n\tconstructor (Prism) {\n\t\tthis.Prism = Prism;\n\t}\n\n\t/**\n\t * Loads all given languages concurrently.\n\t *\n\t * @param {string | string[]} languages\n\t * @returns {Promise<void>}\n\t */\n\tasync loadLanguages (languages) {\n\t\tconst toLoad = toArray(languages)\n\t\t\t.map(resolveAlias)\n\t\t\t.filter(id => !isLoaded(this.Prism, id));\n\n\t\tawait Promise.all(\n\t\t\ttoLoad.map(id => {\n\t\t\t\tconst path = pathJoin(this.srcPath, `languages/${id}.js`);\n\n\t\t\t\tlet promise = this._importCache.get(path);\n\t\t\t\tif (promise === undefined) {\n\t\t\t\t\tpromise = import(path).then(exports => {\n\t\t\t\t\t\t/** @type {import('../../types.d.ts').LanguageProto} */\n\t\t\t\t\t\tconst proto = exports.default;\n\t\t\t\t\t\tthis.Prism.languageRegistry.add(proto);\n\t\t\t\t\t});\n\t\t\t\t\tthis._importCache.set(path, promise);\n\t\t\t\t}\n\t\t\t\treturn promise;\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Loads all given languages concurrently.\n\t *\n\t * This function simply invokes {@link Autoloader#loadLanguages} and logs errors to `console.error`.\n\t *\n\t * @param {string | string[]} languages\n\t * @returns {void}\n\t */\n\tpreloadLanguages (languages) {\n\t\tthis.loadLanguages(languages).catch(reason => {\n\t\t\tconsole.error(\n\t\t\t\t`Failed to preload languages (${toArray(languages).join(', ')}): ${String(reason)}`\n\t\t\t);\n\t\t});\n\t}\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'autoloader'>} */\nconst Self = {\n\tid: 'autoloader',\n\tplugin (Prism) {\n\t\treturn new Autoloader(Prism);\n\t},\n\teffect (Prism) {\n\t\t/**\n\t\t * Returns all additional dependencies of the given element defined by the `data-dependencies` attribute.\n\t\t *\n\t\t * @param {Element} element\n\t\t * @returns {string[]}\n\t\t */\n\t\tfunction getDependencies (element) {\n\t\t\tlet deps = element.getAttribute('data-dependencies')?.trim();\n\t\t\tif (!deps) {\n\t\t\t\tconst parent = getParentPre(element);\n\t\t\t\tif (parent) {\n\t\t\t\t\tdeps = parent.getAttribute('data-dependencies')?.trim();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn deps ? deps.split(/\\s*,\\s*/) : [];\n\t\t}\n\n\t\t/**\n\t\t * Maps the given name to a list of components that have to be loaded.\n\t\t *\n\t\t * @param {string} name\n\t\t * @returns {string[]}\n\t\t */\n\t\tfunction mapDependency (name) {\n\t\t\tif (!name || ignoredLanguages.has(name)) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\telse if (/^diff-./i.test(name)) {\n\t\t\t\t// the \"diff-xxxx\" format is used by the Diff Highlight plugin\n\t\t\t\treturn ['diff', name.slice('diff-'.length)];\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [name];\n\t\t\t}\n\t\t}\n\n\t\treturn Prism.hooks.add('complete', ({ element, language }) => {\n\t\t\tif (!language || ignoredLanguages.has(language)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet deps = mapDependency(language);\n\t\t\tfor (const name of getDependencies(element)) {\n\t\t\t\tdeps.push(...mapDependency(name));\n\t\t\t}\n\n\t\t\tdeps = deps.filter(name => !isLoaded(Prism, name));\n\t\t\tif (deps.length === 0) {\n\t\t\t\t// all dependencies are already loaded\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t/** @type {Autoloader} */\n\t\t\tconst autoloader = Prism.pluginRegistry.peek(Self)?.plugin;\n\t\t\tautoloader.loadLanguages(deps).then(\n\t\t\t\t() => Prism.highlightElement(element),\n\t\t\t\treason => {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`Failed to load languages (${deps.join(', ')}): ${String(reason)}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @typedef {import('../../core.js').Prism} Prism\n */\n"
  },
  {
    "path": "src/plugins/autoloader/demo.js",
    "content": "async function getZip (files, elt) {\n\tlet process = async () => {\n\t\telt.setAttribute('data-progress', Math.round((i / l) * 100));\n\t\tif (i < l) {\n\t\t\tawait addFile(zip, files[i][0], files[i][1]);\n\t\t\ti++;\n\t\t\tawait process();\n\t\t}\n\t};\n\n\tlet zip = new JSZip();\n\tlet l = files.length;\n\tlet i = 0;\n\n\tawait process();\n\n\treturn zip;\n}\n\nasync function addFile (zip, filename, filepath) {\n\tlet contents = await getFileContents(filepath);\n\tzip.file(filename, contents);\n}\n\nasync function getFileContents (filepath) {\n\tlet response = await fetch(filepath);\n\tif (!response.ok) {\n\t\tthrow new Error(`HTTP error! status: ${response.status}`);\n\t}\n\treturn response.text();\n}\n\ndocument.querySelector('.download-grammars').addEventListener('click', async ({ target }) => {\n\tlet btn = target;\n\tif (btn.classList.contains('loading')) {\n\t\treturn;\n\t}\n\tbtn.classList.add('loading');\n\tbtn.setAttribute('data-progress', 0);\n\n\tlet files = [];\n\tfor (let id in components.languages) {\n\t\tif (id === 'meta') {\n\t\t\tcontinue;\n\t\t}\n\t\tlet basepath =\n\t\t\t'https://dev.prismjs.com/' + components.languages.meta.path.replace(/\\{id}/g, id);\n\t\tlet basename = basepath.substring(basepath.lastIndexOf('/') + 1);\n\t\tfiles.push([basename + '.js', basepath + '.js']);\n\t\tfiles.push([basename + '.min.js', basepath + '.min.js']);\n\t}\n\n\tlet zip = await getZip(files, btn);\n\tbtn.classList.remove('loading');\n\n\tlet blob = await zip.generateAsync({ type: 'blob' });\n\tsaveAs(blob, 'prism-components.zip');\n});\n"
  },
  {
    "path": "src/plugins/command-line/README.md",
    "content": "---\ntitle: Command Line\ndescription: Display a command line with a prompt and, optionally, the output/response from the commands.\nowner: chriswells0\nresources:\n  - /languages/bash.js { type=\"module\" }\n  - /languages/powershell.js { type=\"module\" }\n  - /languages/sql.js { type=\"module\" }\n---\n\n<section class=\"language-markup\">\n\n# How to use\n\nThis is intended for code blocks (`<pre><code>`) and not for inline code.\n\nAdd class **command-line** to your `<pre>`. For a server command line, specify the user and host names using the `data-user` and `data-host` attributes. The resulting prompt displays a **#** for the root user and **$** for all other users. For any other command line, such as a Windows prompt, you may specify the entire prompt using the `data-prompt` attribute.\n\n## Optional: Command output (positional)\n\nYou may specify the lines to be presented as output (no prompt and no highlighting) through the `data-output` attribute on the `<pre>` element in the following simple format:\n\n- A single number refers to the line with that number\n- Ranges are denoted by two numbers, separated with a hyphen (-)\n- Multiple line numbers or ranges are separated by commas.\n- Whitespace is allowed anywhere and will be stripped off.\n\nExamples:\n\n5\n\n: The 5th line\n\n1-5\n\n: Lines 1 through 5\n\n1,4\n\n: Line 1 and line 4\n\n1-2, 5, 9-20\n\n: Lines 1 through 2, line 5, lines 9 through 20\n\n## Optional: Command output (prefix)\n\nTo automatically present some lines as output, you can prefix those lines with any string and specify the prefix using the `data-filter-output` attribute on the `<pre>` element. For example, `data-filter-output=\"(out)\"` will treat lines beginning with `(out)` as output and remove the prefix.\n\nA blank line will render as an empty line with a prompt. If you want an empty line without a prompt then you can use a line containing just the output prefix, e.g. `(out)`. See the blank lines in the examples below.\n\nOutput lines are user selectable by default, so if you select the whole content of the code block, it will select the shell commands and any output lines. This may not be desirable if you want to copy/paste just the commands and not the output. If you want to make the output not user selectable then add the following to your CSS:\n\n```css\n.command-line span.token.output {\n\tuser-select: none;\n}\n```\n\n## Optional: Multi-line commands\n\nYou can configure the plugin to handle multi-line commands. This can be done in two ways; setting a line continuation string (as in Bash); or explicitly marking continuation lines with a prefix for languages that do not have a continuation string/character, e.g. SQL, Scala, etc..\n\n\n`data-continuation-str`\n\n: Set this attribute to the line continuation string/character, e.g. for bash `data-continuation-str=\"\\\"`\n\n`data-filter-continuation`\n\n: This works in a similar way to `data-filter-output`. Prefix all continuation lines with the value of `data-filter-continuation` and they will be displayed with the prompt set in `data-continuation-prompt`. For example, `data-filter-continuation=\"(con)\"` will treat lines beginning with `(con)` as continuation lines and remove the prefix.\n\n`data-continuation-prompt`\n\n: Set this attribute to define the prompt to be displayed when the command has continued beyond the first line (whether using line continuation or command termination), e.g. for MySQL `data-continuation-prompt=\"->\"`. If this attribute is not set then a default of `>` will be used.\n\n</section>\n\n<section>\n\n# Examples\n\n## Default Use Without Output\n\n```html\n<pre class=\"command-line\">\n```\n\n```bash { .command-line }\ncd ~/.vim\n\nvim vimrc\n```\n\n## Root User Without Output\n\n```html\n<pre class=\"command-line\"\n     data-user=\"root\"\n     data-host=\"localhost\">\n```\n\n```bash { .command-line data-user=\"root\" data-host=\"localhost\" }\ncd /usr/local/etc\ncp php.ini php.ini.bak\nvi php.ini\n```\n\n## Non-Root User With Output\n\n```html\n<pre class=\"command-line\"\n     data-user=\"chris\"\n     data-host=\"remotehost\"\n     data-output=\"2, 4-8\">\n```\n\n```bash { .command-line data-user=\"chris\" data-host=\"remotehost\" data-output=\"2, 4-8\" }\npwd\n/usr/home/chris/bin\nls -la\ntotal 2\ndrwxr-xr-x   2 chris  chris     11 Jan 10 16:48 .\ndrwxr--r-x  45 chris  chris     92 Feb 14 11:10 ..\n-rwxr-xr-x   1 chris  chris    444 Aug 25  2013 backup\n-rwxr-xr-x   1 chris  chris    642 Jan 17 14:42 deploy\n```\n\n## Windows PowerShell With Output\n\n```html\n<pre class=\"command-line\"\n     data-prompt=\"PS C:\\Users\\Chris>\"\n     data-output=\"2-19\">\n```\n\n```powershell { .command-line data-prompt=\"PS C:\\Users\\Chris>\" data-output=\"2-19\" }\ndir\n\n\n    Directory: C:\\Users\\Chris\n\n\nMode                LastWriteTime     Length Name\n----                -------------     ------ ----\nd-r--        10/14/2015   5:06 PM            Contacts\nd-r--        12/12/2015   1:47 PM            Desktop\nd-r--         11/4/2015   7:59 PM            Documents\nd-r--        10/14/2015   5:06 PM            Downloads\nd-r--        10/14/2015   5:06 PM            Favorites\nd-r--        10/14/2015   5:06 PM            Links\nd-r--        10/14/2015   5:06 PM            Music\nd-r--        10/14/2015   5:06 PM            Pictures\nd-r--        10/14/2015   5:06 PM            Saved Games\nd-r--        10/14/2015   5:06 PM            Searches\nd-r--        10/14/2015   5:06 PM            Videos\n```\n\n## Line continuation with Output (bash)\n\n```html\n<pre class=\"command-line\"\n     data-filter-output=\"(out)\"\n     data-continuation-str=\"\\\" >\n```\n\n```bash { .command-line data-filter-output=\"(out)\" data-continuation-str=\"\\\" }\nexport MY_VAR=123\necho \"hello\"\n(out)hello\necho one \\\ntwo \\\nthree\n(out)one two three\n(out)\necho \"goodbye\"\n(out)goodbye\n```\n\n## Line continuation with Output (PowerShell)\n\n```html\n<pre class=\"command-line\"\n     data-prompt=\"ps c:\\users\\chris>\"\n     data-continuation-prompt=\">>\"\n     data-filter-output=\"(out)\"\n     data-continuation-str=\" `\">\n```\n\n<pre class=\"command-line\" data-prompt=\"ps c:\\users\\chris>\" data-continuation-prompt=\">>\" data-filter-output=\"(out)\" data-continuation-str=\" `\"><code class=\"language-powershell\">Write-Host `\n'Hello' `\n'from' `\n'PowerShell!'\n(out)Hello from PowerShell!\nWrite-Host 'Goodbye from PowerShell!'\n(out)Goodbye from PowerShell!</code></pre>\n\n## Line continuation using prefix (MySQL/SQL)\n\n```html\n<pre class=\"command-line\"\n     data-prompt=\"mysql>\"\n     data-continuation-prompt=\"->\"\n     data-filter-output=\"(out)\"\n     data-filter-continuation=\"(con)\">\n```\n\n```sql { .command-line data-prompt=\"mysql>\" data-continuation-prompt=\"->\" data-filter-output=\"(out)\" data-filter-continuation=\"(con)\" }\nset @my_var = 'foo';\nset @my_other_var = 'bar';\n(out)\nCREATE TABLE people (\n(con)first_name VARCHAR(30) NOT NULL,\n(con)last_name VARCHAR(30) NOT NULL\n(con));\n(out)Query OK, 0 rows affected (0.09 sec)\n(out)\ninsert into people\n(con)values ('John', 'Doe');\n(out)Query OK, 1 row affected (0.02 sec)\n(out)\nselect *\n(con)from people\n(con)order by last_name;\n(out)+------------+-----------+\n(out)| first_name | last_name |\n(out)+------------+-----------+\n(out)| John       | Doe       |\n(out)+------------+-----------+\n(out)1 row in set (0.00 sec)\n```\n\n</section>\n"
  },
  {
    "path": "src/plugins/command-line/command-line.css",
    "content": ".command-line-prompt {\n\tborder-right: 1px solid #999;\n\tdisplay: block;\n\tfloat: left;\n\tfont-size: 100%;\n\tletter-spacing: -1px;\n\tmargin-right: 1em;\n\tpointer-events: none;\n\ttext-align: right;\n\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.command-line-prompt > span:before {\n\topacity: 0.7;\n\tcontent: \" \";\n\tdisplay: block;\n\tpadding-right: 0.8em;\n}\n\n.command-line-prompt > span[data-user]:before {\n\tcontent: \"[\" attr(data-user) \"@\" attr(data-host) \"] $\";\n}\n\n.command-line-prompt > span[data-user=\"root\"]:before {\n\tcontent: \"[\" attr(data-user) \"@\" attr(data-host) \"] #\";\n}\n\n.command-line-prompt > span[data-prompt]:before {\n\tcontent: attr(data-prompt);\n}\n\n.command-line-prompt > span[data-continuation-prompt]:before {\n\tcontent: attr(data-continuation-prompt);\n}\n\n.command-line span.token.output {\n\t/* Make shell output lines a bit lighter to distinguish them from shell commands */\n\topacity: 0.7;\n}\n"
  },
  {
    "path": "src/plugins/command-line/command-line.js",
    "content": "import prism from '../../global.js';\nimport { getParentPre } from '../../shared/dom-util.js';\nimport { htmlEncode } from '../../shared/util.js';\n\nconst CLASS_PATTERN = /(?:^|\\s)command-line(?:\\s|$)/;\nconst PROMPT_CLASS = 'command-line-prompt';\n\n/** @type {import('../../types.d.ts').PluginProto<'command-line'>} */\nconst Self = {\n\tid: 'command-line',\n\teffect (Prism) {\n\t\treturn Prism.hooks.add({\n\t\t\t'before-highlight': env => {\n\t\t\t\tconst commandLine = (env.commandLine ??= {});\n\n\t\t\t\tif (commandLine.complete || !env.code) {\n\t\t\t\t\tcommandLine.complete = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Works only for <code> wrapped inside <pre> (not inline).\n\t\t\t\tconst pre = getParentPre(env.element);\n\t\t\t\tif (\n\t\t\t\t\t!pre || // Abort only if neither the <pre> nor the <code> have the class\n\t\t\t\t\t(!CLASS_PATTERN.test(pre.className) &&\n\t\t\t\t\t\t!CLASS_PATTERN.test(env.element.className))\n\t\t\t\t) {\n\t\t\t\t\tcommandLine.complete = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// The element might be highlighted multiple times, so we just remove the previous prompt\n\t\t\t\tconst existingPrompt = env.element.querySelector('.' + PROMPT_CLASS);\n\t\t\t\tif (existingPrompt) {\n\t\t\t\t\texistingPrompt.remove();\n\t\t\t\t}\n\n\t\t\t\tconst codeLines = env.code.split('\\n');\n\n\t\t\t\tcommandLine.numberOfLines = codeLines.length;\n\t\t\t\tconst outputLines = (commandLine.outputLines = []);\n\n\t\t\t\tconst outputSections = pre.getAttribute('data-output');\n\t\t\t\tconst outputFilter = pre.getAttribute('data-filter-output');\n\t\t\t\tif (outputSections !== null) {\n\t\t\t\t\t// The user specified the output lines. -- cwells\n\t\t\t\t\toutputSections.split(',').forEach(section => {\n\t\t\t\t\t\tconst range = section.split('-');\n\t\t\t\t\t\tlet outputStart = parseInt(range[0], 10);\n\t\t\t\t\t\tlet outputEnd = range.length === 2 ? parseInt(range[1], 10) : outputStart;\n\n\t\t\t\t\t\tif (!isNaN(outputStart) && !isNaN(outputEnd)) {\n\t\t\t\t\t\t\tif (outputStart < 1) {\n\t\t\t\t\t\t\t\toutputStart = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (outputEnd > codeLines.length) {\n\t\t\t\t\t\t\t\toutputEnd = codeLines.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Convert start and end to 0-based to simplify the arrays. -- cwells\n\t\t\t\t\t\t\toutputStart--;\n\t\t\t\t\t\t\toutputEnd--;\n\t\t\t\t\t\t\t// Save the output line in an array and clear it in the code so it's not highlighted. -- cwells\n\t\t\t\t\t\t\tfor (let j = outputStart; j <= outputEnd; j++) {\n\t\t\t\t\t\t\t\toutputLines[j] = codeLines[j];\n\t\t\t\t\t\t\t\tcodeLines[j] = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (outputFilter) {\n\t\t\t\t\t// Treat lines beginning with this string as output. -- cwells\n\t\t\t\t\tfor (let i = 0; i < codeLines.length; i++) {\n\t\t\t\t\t\tif (codeLines[i].startsWith(outputFilter)) {\n\t\t\t\t\t\t\t// This line is output. -- cwells\n\t\t\t\t\t\t\toutputLines[i] = codeLines[i].slice(outputFilter.length);\n\t\t\t\t\t\t\tcodeLines[i] = '';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst continuationLineIndicies = (commandLine.continuationLineIndicies = new Set());\n\t\t\t\tconst lineContinuationStr = pre.getAttribute('data-continuation-str');\n\t\t\t\tconst continuationFilter = pre.getAttribute('data-filter-continuation');\n\n\t\t\t\t// Identify code lines where the command has continued onto subsequent\n\t\t\t\t// lines and thus need a different prompt. Need to do this after the output\n\t\t\t\t// lines have been removed to ensure we don't pick up a continuation string\n\t\t\t\t// in an output line.\n\t\t\t\tfor (let j = 0; j < codeLines.length; j++) {\n\t\t\t\t\tconst line = codeLines[j];\n\t\t\t\t\tif (!line) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Record the next line as a continuation if this one ends in a continuation str.\n\t\t\t\t\tif (lineContinuationStr && line.endsWith(lineContinuationStr)) {\n\t\t\t\t\t\tcontinuationLineIndicies.add(j + 1);\n\t\t\t\t\t}\n\t\t\t\t\t// Record this line as a continuation if marked with a continuation prefix\n\t\t\t\t\t// (that we will remove).\n\t\t\t\t\tif (j > 0 && continuationFilter && line.startsWith(continuationFilter)) {\n\t\t\t\t\t\tcodeLines[j] = line.slice(continuationFilter.length);\n\t\t\t\t\t\tcontinuationLineIndicies.add(j);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tenv.code = codeLines.join('\\n');\n\t\t\t},\n\t\t\t'before-insert': env => {\n\t\t\t\tconst commandLine = (env.commandLine ??= {});\n\t\t\t\tif (commandLine.complete) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Reinsert the output lines into the highlighted code. -- cwells\n\t\t\t\tconst codeLines = env.highlightedCode.split('\\n');\n\t\t\t\tconst outputLines = commandLine.outputLines || [];\n\t\t\t\tfor (let i = 0, l = codeLines.length; i < l; i++) {\n\t\t\t\t\t// Add spans to allow distinction of input/output text for styling\n\t\t\t\t\tif (outputLines.hasOwnProperty(i)) {\n\t\t\t\t\t\t// outputLines were removed from codeLines so missed out on escaping\n\t\t\t\t\t\t// of markup so do it here.\n\t\t\t\t\t\tcodeLines[i] =\n\t\t\t\t\t\t\t'<span class=\"token output\">' + htmlEncode(outputLines[i]) + '</span>';\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcodeLines[i] = '<span class=\"token command\">' + codeLines[i] + '</span>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tenv.highlightedCode = codeLines.join('\\n');\n\t\t\t},\n\t\t\t'complete': env => {\n\t\t\t\tconst commandLine = (env.commandLine ??= {});\n\t\t\t\tif (commandLine.complete) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst pre = getParentPre(env.element);\n\t\t\t\tif (!pre) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (CLASS_PATTERN.test(env.element.className)) {\n\t\t\t\t\t// Remove the class \"command-line\" from the <code>\n\t\t\t\t\tenv.element.className = env.element.className.replace(CLASS_PATTERN, ' ');\n\t\t\t\t}\n\t\t\t\tif (!CLASS_PATTERN.test(pre.className)) {\n\t\t\t\t\t// Add the class \"command-line\" to the <pre>\n\t\t\t\t\tpre.className += ' command-line';\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * @param {string} key\n\t\t\t\t * @param {string} defaultValue\n\t\t\t\t * @returns {string}\n\t\t\t\t */\n\t\t\t\tconst getAttribute = (key, defaultValue) => {\n\t\t\t\t\treturn (pre.getAttribute(key) || defaultValue).replace(/\"/g, '&quot');\n\t\t\t\t};\n\n\t\t\t\t// Create the \"rows\" that will become the command-line prompts. -- cwells\n\t\t\t\tlet promptLines = '';\n\t\t\t\tconst rowCount = commandLine.numberOfLines || 0;\n\t\t\t\tconst promptText = getAttribute('data-prompt', '');\n\t\t\t\tlet promptLine;\n\t\t\t\tif (promptText !== '') {\n\t\t\t\t\tpromptLine = '<span data-prompt=\"' + promptText + '\"></span>';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconst user = getAttribute('data-user', 'user');\n\t\t\t\t\tconst host = getAttribute('data-host', 'localhost');\n\t\t\t\t\tpromptLine = '<span data-user=\"' + user + '\" data-host=\"' + host + '\"></span>';\n\t\t\t\t}\n\n\t\t\t\tconst continuationLineIndicies = commandLine.continuationLineIndicies || new Set();\n\t\t\t\tconst continuationPromptText = getAttribute('data-continuation-prompt', '>');\n\t\t\t\tconst continuationPromptLine =\n\t\t\t\t\t'<span data-continuation-prompt=\"' + continuationPromptText + '\"></span>';\n\n\t\t\t\t// Assemble all the appropriate prompt/continuation lines\n\t\t\t\tfor (let j = 0; j < rowCount; j++) {\n\t\t\t\t\tif (continuationLineIndicies.has(j)) {\n\t\t\t\t\t\tpromptLines += continuationPromptLine;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tpromptLines += promptLine;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Create the wrapper element. -- cwells\n\t\t\t\tconst prompt = document.createElement('span');\n\t\t\t\tprompt.className = PROMPT_CLASS;\n\t\t\t\tprompt.innerHTML = promptLines;\n\n\t\t\t\t// Remove the prompt from the output lines. -- cwells\n\t\t\t\tconst outputLines = commandLine.outputLines || [];\n\t\t\t\tfor (let i = 0, l = outputLines.length; i < l; i++) {\n\t\t\t\t\tif (outputLines.hasOwnProperty(i)) {\n\t\t\t\t\t\tconst node = prompt.children[i];\n\t\t\t\t\t\tnode.removeAttribute('data-user');\n\t\t\t\t\t\tnode.removeAttribute('data-host');\n\t\t\t\t\t\tnode.removeAttribute('data-prompt');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tenv.element.insertBefore(prompt, env.element.firstChild);\n\t\t\t\tcommandLine.complete = true;\n\t\t\t},\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @typedef {object} CommandLineInfo\n * @property {boolean} [complete]\n * @property {number} [numberOfLines]\n * @property {string[]} [outputLines]\n * @property {Set<number>} [continuationLineIndicies]\n */\n"
  },
  {
    "path": "src/plugins/copy-to-clipboard/README.md",
    "content": "---\ntitle: Copy to Clipboard\ndescription: Add a button that copies the code block to the clipboard when clicked.\nowner: mAAdhaTTah\nrequire: toolbar\nnoCSS: true\nbody_classes: language-text\nresources:\n  - /plugins/autoloader.js { type=\"module\" }\n  - /plugins/toolbar.css\n  - /plugins/toolbar.js { type=\"module\" }\n---\n\n<section>\n\n# How to use\n\nThe plugin depends on the Prism [Toolbar](../toolbar) plugin. In addition to including the plugin file with your PrismJS build, ensure it is loaded before the plugin.\n\n</section>\n\n<section>\n\n# Settings\n\nBy default, the plugin shows messages in English and sets a 5-second timeout after a click. You can use the following HTML5 data attributes to override the default settings:\n\n- `data-prismjs-copy`{ .token .attr-name } — default message displayed by Copy to Clipboard;\n- `data-prismjs-copy-error`{ .token .attr-name } — a message displayed after failing copying, prompting the user to press <kbd>Ctrl</kbd>+<kbd>C</kbd>;\n- `data-prismjs-copy-success`{ .token .attr-name } — a message displayed after a successful copying;\n- `data-prismjs-copy-timeout`{ .token .attr-name } — a timeout (in milliseconds) after copying. Once the timeout passed, the success or error message will revert back to the default message. The value should be a non-negative integer.\n\nThe plugin traverses up the DOM tree to find each of these attributes. The search starts at every `pre code`{ .token .tag } element and stops at the closest ancestor element that has a desired attribute or at the worst case, at the `html`{ .token .tag } element.\n\n**Warning!** Although possible, you definitely shouldn't add these attributes to the `html`{ .token .tag } element, because a human-readable text should be placed _after_ the character encoding declaration (`<meta charset=\"...\">`), and the latter [must be](https://html.spec.whatwg.org/multipage/semantics.html#charset) serialized completely within the first 512 (in older browsers) or 1024 bytes of the document. Consider using the `body`{ .token .tag } element or one of its descendants.\n\n</section>\n\n<section>\n\n# Styling\n\nThis plugin supports customizing the style of the copy button. To understand how this is done, let's look at the HTML structure of the copy button:\n\n```html\n<button class=\"copy-to-clipboard-button\" type=\"button\" data-copy-state=\"copy\">\n\t<span>Copy</span>\n</button>\n```\n\nThe `copy-to-clipboard-button` class can be used to select the button. The `data-copy-state` attribute indicates the current state of the plugin with the 3 possible states being:\n\n- `data-copy-state=\"copy\"` — default state;\n- `data-copy-state=\"copy-error\"` — the state after failing copying;\n- `data-copy-state=\"copy-success\"` — the state after successful copying;\n\nThese 3 states should be conveyed to the user either by different styling or displaying the button text.\n\n</section>\n\n<section>\n\n# Examples\n\n## Sharing\n\nThe following code blocks show modified messages and both use a half-second timeout. The other settings are set to default.\n\nSource code:\n\n```html\n<body data-prismjs-copy-timeout=\"500\">\n\t<pre><code class=\"language-js\" data-prismjs-copy=\"Copy the JavaScript snippet!\">console.log('Hello, world!');</code></pre>\n\n\t<pre><code class=\"language-c\" data-prismjs-copy=\"Copy the C snippet!\">int main() {\n\treturn 0;\n}</code></pre>\n</body>\n```\n\nOutput:\n\n<div data-prismjs-copy-timeout=\"500\">\n\n```js { data-prismjs-copy=\"Copy the JavaScript snippet!\" }\nconsole.log('Hello, world!');\n```\n\n```c { data-prismjs-copy=\"Copy the C snippet!\" }\nint main() {\n\treturn 0;\n}\n```\n\n</div>\n\n## Inheritance\n\nThe plugin always use the closest ancestor element that has a desired attribute, so it's possible to override any setting on any descendant. In the following example, the `baz`{ .token .attr-value } message is used. The other settings are set to default.\n\nSource code:\n\n```html\n<body data-prismjs-copy=\"foo\">\n\t<main data-prismjs-copy=\"bar\">\n\t\t<pre><code class=\"language-c\" data-prismjs-copy=\"baz\">int main() {\n\treturn 0;\n}</code></pre>\n\t</main>\n</body>\n```\n\nOutput:\n\n<div data-prismjs-copy=\"foo\">\n\t<div data-prismjs-copy=\"bar\">\n\n```c { data-prismjs-copy=\"baz\" }\nint main() {\n\treturn 0;\n}\n```\n\n\t</div>\n</div>\n\n## i18n\n\nYou can use the data attributes for internationalization.\n\nThe following code blocks use shared messages in Russian and the default 5-second timeout.\n\nSource code:\n\n```html\n<!DOCTYPE html>\n<html lang=\"ru\">\n<!-- The head is omitted. -->\n<body\n\tdata-prismjs-copy=\"Скопировать\"\n\tdata-prismjs-copy-error=\"Нажмите Ctrl+C, чтобы скопировать\"\n\tdata-prismjs-copy-success=\"Скопировано!\"\n>\n\t<pre><code class=\"language-c\">int main() {\n\treturn 0;\n}</code></pre>\n\n\t<pre><code class=\"language-js\">console.log('Hello, world!');</code></pre>\n</body>\n</html>\n```\n\nOutput:\n\n<div\n\tdata-prismjs-copy=\"Скопировать\"\n\tdata-prismjs-copy-error=\"Нажмите Ctrl+C, чтобы скопировать\"\n\tdata-prismjs-copy-success=\"Скопировано!\"\n>\n\n```c\nint main() {\n\treturn 0;\n}\n```\n\n```js\nconsole.log('Hello, world!');\n```\n\n</div>\n\nThe next HTML document is in English, but some code blocks show messages in Russian and simplified Mainland Chinese. The other settings are set to default.\n\nSource code:\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\"><!-- The head is omitted. -->\n<body>\n\t<pre><code class=\"language-js\">console.log('Hello, world!');</code></pre>\n\n\t<pre\n\t\tlang=\"ru\"\n\t\tdata-prismjs-copy=\"Скопировать\"\n\t\tdata-prismjs-copy-error=\"Нажмите Ctrl+C, чтобы скопировать\"\n\t\tdata-prismjs-copy-success=\"Скопировано!\"\n\t><code class=\"language-js\">console.log('Привет, мир!');</code></pre>\n\n\t<pre\n\t\tlang=\"zh-Hans-CN\"\n\t\tdata-prismjs-copy=\"复制文本\"\n\t\tdata-prismjs-copy-error=\"按Ctrl+C复制\"\n\t\tdata-prismjs-copy-success=\"文本已复制！\"\n\t><code class=\"language-js\">console.log('你好，世界！');</code></pre>\n</body>\n</html>\n```\n\nOutput:\n\n```js\nconsole.log('Hello, world!');\n```\n\n```js { lang=\"ru\" data-prismjs-copy=\"Скопировать\" data-prismjs-copy-error=\"Нажмите Ctrl+C, чтобы скопировать\" data-prismjs-copy-success=\"Скопировано!\" }\nconsole.log('Привет, мир!');\n```\n\n```js { lang=\"zh-Hans-CN\" data-prismjs-copy=\"复制文本\" data-prismjs-copy-error=\"按Ctrl+C复制\" data-prismjs-copy-success=\"文本已复制！\" }\nconsole.log('你好，世界！');\n```\n\n</section>\n"
  },
  {
    "path": "src/plugins/copy-to-clipboard/copy-to-clipboard.js",
    "content": "import prism from '../../global.js';\nimport toolbar from '../toolbar/toolbar.js';\n\n/**\n * When the given elements is clicked by the user, the given text will be copied to clipboard.\n *\n * @param {Element} element\n * @param {CopyInfo} copyInfo\n */\nfunction registerClipboard (element, copyInfo) {\n\telement.addEventListener('click', () => {\n\t\tcopyTextToClipboard(copyInfo);\n\t});\n}\n\n// https://stackoverflow.com/a/30810322/7595472\n\n/**\n * @param {CopyInfo} copyInfo\n */\nfunction fallbackCopyTextToClipboard (copyInfo) {\n\tconst textArea = document.createElement('textarea');\n\ttextArea.value = copyInfo.getText();\n\n\t// Avoid scrolling to bottom\n\ttextArea.style.top = '0';\n\ttextArea.style.left = '0';\n\ttextArea.style.position = 'fixed';\n\n\tdocument.body.appendChild(textArea);\n\ttextArea.focus();\n\ttextArea.select();\n\n\ttry {\n\t\tconst successful = document.execCommand('copy');\n\t\tsetTimeout(() => {\n\t\t\tif (successful) {\n\t\t\t\tcopyInfo.success();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcopyInfo.error(undefined);\n\t\t\t}\n\t\t}, 1);\n\t}\n\tcatch (err) {\n\t\tsetTimeout(() => {\n\t\t\tcopyInfo.error(err);\n\t\t}, 1);\n\t}\n\n\tdocument.body.removeChild(textArea);\n}\n\n/**\n * @param {CopyInfo} copyInfo\n */\nfunction copyTextToClipboard (copyInfo) {\n\tif (navigator.clipboard) {\n\t\tnavigator.clipboard.writeText(copyInfo.getText()).then(copyInfo.success, () => {\n\t\t\t// try the fallback in case `writeText` didn't work\n\t\t\tfallbackCopyTextToClipboard(copyInfo);\n\t\t});\n\t}\n\telse {\n\t\tfallbackCopyTextToClipboard(copyInfo);\n\t}\n}\n\n/**\n * Selects the text content of the given element.\n *\n * @param {Element} element\n */\nfunction selectElementText (element) {\n\t// https://stackoverflow.com/a/20079910/7595472\n\twindow.getSelection()?.selectAllChildren(element);\n}\n\n/**\n * @param {Element} element\n * @param {string} attribute\n * @returns {string | null}\n */\nfunction getInheritedAttribute (element, attribute) {\n\t/** @type {Element | null} */\n\tlet e = element;\n\tfor (; e; e = e.parentElement) {\n\t\tconst value = e.getAttribute(attribute);\n\t\tif (value !== null) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * Traverses up the DOM tree to find data attributes that override the default plugin settings.\n *\n * @param {Element} startElement An element to start from.\n * @returns {Settings} The plugin settings.\n */\nfunction getSettings (startElement) {\n\t/** @type {Settings} */\n\tconst settings = {\n\t\t'copy': 'Copy',\n\t\t'copy-error': 'Press Ctrl+C to copy',\n\t\t'copy-success': 'Copied!',\n\t\t'copy-timeout': 5000,\n\t};\n\n\tfor (const k in settings) {\n\t\tconst key = k;\n\t\tconst value = getInheritedAttribute(startElement, 'data-prismjs-' + key);\n\t\tif (value) {\n\t\t\tif (key === 'copy-timeout') {\n\t\t\t\tconst n = Number(value);\n\t\t\t\tif (!Number.isNaN(n)) {\n\t\t\t\t\tsettings[key] = n;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsettings[key] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn settings;\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'copy-to-clipboard'>} */\nconst Self = {\n\tid: 'copy-to-clipboard',\n\trequire: toolbar,\n\teffect (Prism) {\n\t\t/** @type {import('../toolbar/toolbar.js').Toolbar} */\n\t\tconst toolbar = Prism.pluginRegistry.peek('toolbar')?.plugin;\n\n\t\treturn toolbar.registerButton('copy-to-clipboard', env => {\n\t\t\tconst element = env.element;\n\n\t\t\tconst settings = getSettings(element);\n\n\t\t\tconst linkCopy = document.createElement('button');\n\t\t\tlinkCopy.className = 'copy-to-clipboard-button';\n\t\t\tlinkCopy.setAttribute('type', 'button');\n\t\t\tconst linkSpan = document.createElement('span');\n\t\t\tlinkCopy.appendChild(linkSpan);\n\n\t\t\tsetState('copy');\n\n\t\t\tregisterClipboard(linkCopy, {\n\t\t\t\tgetText () {\n\t\t\t\t\treturn element.textContent || '';\n\t\t\t\t},\n\t\t\t\tsuccess () {\n\t\t\t\t\tsetState('copy-success');\n\n\t\t\t\t\tresetText();\n\t\t\t\t},\n\t\t\t\terror () {\n\t\t\t\t\tsetState('copy-error');\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tselectElementText(element);\n\t\t\t\t\t}, 1);\n\n\t\t\t\t\tresetText();\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn linkCopy;\n\n\t\t\tfunction resetText () {\n\t\t\t\tsetTimeout(() => setState('copy'), settings['copy-timeout']);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * @param {'copy' | 'copy-error' | 'copy-success'} state\n\t\t\t */\n\t\t\tfunction setState (state) {\n\t\t\t\tlinkSpan.textContent = settings[state];\n\t\t\t\tlinkCopy.setAttribute('data-copy-state', state);\n\t\t\t}\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @typedef {object} CopyInfo\n * @property {function(): string} getText\n * @property {function(): void} success\n * @property {(reason: any) => void} error\n */\n\n/**\n * @typedef {object} Settings\n * @property {string} copy\n * @property {string} copy-error\n * @property {string} copy-success\n * @property {number} copy-timeout\n */\n"
  },
  {
    "path": "src/plugins/custom-class/README.md",
    "content": "---\ntitle: Custom Class\ndescription: This plugin allows you to prefix Prism's default classes (`.comment` can become `.namespace--comment`) or replace them with your defined ones (like `.editor__comment`). You can even add new classes.\nowner: dvkndn\nnoCSS: true\nbody_classes: language-javascript\n---\n\n<section>\n\n# Motivation\n\nPrism default classes are sensible but fixed and too generic. This plugin provide some ways to customize those classes to suit your needs. Example usages:\n\n- You want to add namespace for all of them (like `.prism--comment`) to avoid conflict with your existing classes.\n- You use a naming convention (like [BEM](https://en.bem.info/method)). You want to write classes like `.editor__comment`.\n- You use [CSS Modules](https://github.com/css-modules/css-modules). You want to use your hashed classes, like `.comment_7sh3a`.\n- You need more granular control about the classes of certain tokens. You can define functions which will add new classes to tokens, so selectively change the highlighting of certain parts of your code.\n\n</section>\n\n<section>\n\n# How to use\n\n## Prefix all Prism classes\n\n```\nPrism.plugins.customClass.prefix('prism--')\n```\n\n## Replace some Prism classes with ones you defined\n\n```js\nPrism.plugins.customClass.map({\n\tkeyword: 'special-keyword',\n\tstring: 'string_ch29s',\n\tcomment: 'comment_93jsa'\n});\n```\n\nObject's keys are the classes you want to replace (eg: `comment`), with their values being the classes you want to use (eg: `my-comment`). Classes which are not specified will stay as they are.\n\nAlternatively you can also pass a function that takes the original class and returns the mapped class. This function can also be used implement language specific mapped classes.  \nExample:\n\n```js\nPrism.plugins.customClass.map((className, language) => {\n\tif (language === 'css') {\n\t\treturn cssSpecificMap[className] || className;\n\t} else {\n\t\treturn className;\n\t}\n});\n```\n\n## Add new classes\n\nYou can add new classes with per-token and per-language precision.\n\n```js\nPrism.plugins.customClass.add(({content, type, language}) => {\n\tif (content === 'content' && type === 'property' && language === 'css') {\n\t\treturn 'content-property';\n\t}\n});\n```\n\n**Note:** The given `content` is the inner HTML of the current token. All `<` and `&` characters are escaped and it might contain the HTML code of nested tokens.\n\n</section>\n\n<section>\n\n# Notes\n\n- Feature functions must be called **AFTER** Prism and this plugin. For example:\n  \n  ```html\n  <!-- 1. load prism -->\n  <script src=\"https://dev.prismjs.com/prism.js\"></script>\n  <!-- 2. load the plugin if you don't include it inside prism when download -->\n  <script src=\"custom-class/custom-class.js\"></script>\n  <!-- 3. call the feature you want to use -->\n  <script>\n  \tPrism.plugins.customClass.map(myClassMap);\n  \tPrism.plugins.customClass.prefix(myPrefixString);\n  </script>\n  ```\n  \n- In most cases, using 1 feature is enough. However, it is possible to use both of them together if you want (Result will be like `.my-namespace--comment_93jsa`).\n\n## CSS Modules Usage\n\nThe initial purpose of this plugin is to be used with CSS Modules. It works perfectly with the class map object returned by CSS Modules. For example:\n\n```js\nimport Prism from 'prismjs';\nimport classMap from 'styles/editor-class-map.css';\nPrism.plugins.customClass.map(classMap)\n```\n\n**Note:** This plugin only affects generated token elements (usually of the form `span.token`). The classes of `code` and `pre` elements as well as all elements generated by other plugins (e.g. [Toolbar](../toolbar) elements and [line number](../line-numbers) elements) will not be changed.\n\n</section>\n\n<section>\n\n# Example\n\n## Prefix and map classes\n\nInput\n\n```html\n<pre class=\"language-javascript\"><code>\n\tvar foo = 'bar';\n</code></pre>\n```\n\nOptions\n\n```js\nPrism.plugins.customClass.map({\n\tkeyword: 'special-keyword',\n\tstring: 'my-string'\n});\nPrism.plugins.customClass.prefix('pr-');\n```\n\nOutput\n\n```html\n<pre class=\"language-javascript\"><code class=\"language-markup\">\n\t<span class=\"pr-token pr-special-keyword\">var</span>\n\tfoo\n\t<span class=\"pr-token pr-operator\">=</span>\n\t<span class=\"pr-token pr-my-string\">'bar'</span>\n\t<span class=\"pr-token pr-punctuation\">;</span>\n</code></pre>\n```\n\nNote that this plugin only affects tokens. The classes of the `code` and `pre` elements won't be prefixed.\n\n## Add new classes\n\nInput\n\n```html\n<pre class=\"language-css\"><code>\na::after {\n\tcontent: '\\2b00 ';\n\topacity: .7;\n}\n</code></pre>\n```\n\nOptions\n\n```js\nPrism.plugins.customClass.add(({language, type, content}) => {\n\tif (content === 'content' && type === 'property' && language === 'css') {\n\t\treturn 'content-property';\n\t}\n});\n```\n\nOutput\n\n```html\n<pre class=\" language-css\"><code class=\" language-css\">\n<span class=\"token selector\">a::after</span>\n<span class=\"token punctuation\">{</span>\n\t<span class=\"token property content-property\">content</span>\n\t<span class=\"token punctuation\">:</span>\n\t<span class=\"token string\">'\\2b00 '</span>\n\t<span class=\"token punctuation\">;</span>\n\t<span class=\"token property\">opacity</span>\n\t<span class=\"token punctuation\">:</span>\n\t .7\n\t<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n```\n\n</section>\n"
  },
  {
    "path": "src/plugins/custom-class/custom-class.js",
    "content": "import prism from '../../global.js';\n\nexport class CustomClass {\n\t/**\n\t * @type {ClassAdder | undefined}\n\t */\n\tadder;\n\n\t/**\n\t * @type {ClassMapper | undefined}\n\t */\n\tmapper;\n\n\t/**\n\t * A prefix to add to all class names.\n\t *\n\t * @type {string}\n\t * @default ''\n\t */\n\tprefix = '';\n\n\t/**\n\t * Sets the function which can be used to add custom aliases to any token.\n\t *\n\t * @param {ClassAdder} classAdder\n\t */\n\tadd (classAdder) {\n\t\tthis.adder = classAdder;\n\t}\n\n\t/**\n\t * Maps all class names using the given object or map function.\n\t *\n\t * This does not affect the prefix.\n\t *\n\t * @param {object | ClassMapper} classMapper\n\t */\n\tmap (classMapper) {\n\t\tif (typeof classMapper === 'function') {\n\t\t\tthis.mapper = classMapper;\n\t\t}\n\t\telse {\n\t\t\tthis.mapper = className => classMapper[className] || className;\n\t\t}\n\t}\n\n\t/**\n\t * Applies the current mapping and prefix to the given class name.\n\t *\n\t * @param {string} className A single class name.\n\t * @returns {string}\n\t */\n\tapply (className) {\n\t\treturn this.prefix + (this.mapper ? this.mapper(className) : className);\n\t}\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'custom-class'>} */\nconst Self = {\n\tid: 'custom-class',\n\tplugin () {\n\t\treturn new CustomClass();\n\t},\n\teffect (Prism) {\n\t\t/** @type {CustomClass} */\n\t\tconst customClass = Prism.pluginRegistry.peek(Self)?.plugin;\n\n\t\treturn Prism.hooks.add('wrap', env => {\n\t\t\tif (customClass['adder']) {\n\t\t\t\tconst result = customClass['adder']({\n\t\t\t\t\tcontent: env.content,\n\t\t\t\t\ttype: env.type,\n\t\t\t\t\tlanguage: env.language,\n\t\t\t\t});\n\n\t\t\t\tif (Array.isArray(result)) {\n\t\t\t\t\tenv.classes.push(...result);\n\t\t\t\t}\n\t\t\t\telse if (result) {\n\t\t\t\t\tenv.classes.push(result);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!customClass['mapper'] && !customClass.prefix) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tenv.classes = env.classes.map(c => customClass.apply(c));\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @callback ClassMapper\n * @param {string} className\n * @returns {string}\n */\n\n/**\n * @callback ClassAdder\n * @param {ClassAdderEnvironment} env\n * @returns {undefined | string | string[]}\n */\n\n/**\n * @typedef {object} ClassAdderEnvironment\n * @property {string} language\n * @property {string} type\n * @property {string} content\n */\n"
  },
  {
    "path": "src/plugins/data-uri-highlight/README.md",
    "content": "---\ntitle: Data URI Highlight\ndescription: Highlights data-URI contents.\nowner: Golmote\nnoCSS: true\nresources: /plugins/autolinker.css\n---\n\n<section>\n\n# How to use\n\nData-URIs will be highlighted automatically, provided the needed grammar is loaded. The grammar to use is guessed using the MIME type information.\n\n</section>\n\n<section>\n\n# Example\n\n```css\ndiv {\n    border: 40px solid transparent;\n    border-image: 33.334% url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\"> \\\n                          <circle cx=\"5\" cy=\"5\" r=\"5\" fill=\"%23ab4\"/><circle cx=\"15\" cy=\"5\" r=\"5\" fill=\"%23655\"/> \\\n                          <circle cx=\"25\" cy=\"5\" r=\"5\" fill=\"%23e07\"/><circle cx=\"5\" cy=\"15\" r=\"5\" fill=\"%23655\"/> \\\n                          <circle cx=\"15\" cy=\"15\" r=\"5\" fill=\"hsl(15, 25%, 75%)\"/> \\\n                          <circle cx=\"25\" cy=\"15\" r=\"5\" fill=\"%23655\"/><circle cx=\"5\" cy=\"25\" r=\"5\" fill=\"%23fb3\"/> \\\n                          <circle cx=\"15\" cy=\"25\" r=\"5\" fill=\"%23655\"/><circle cx=\"25\" cy=\"25\" r=\"5\" fill=\"%2358a\"/></svg>');\n    padding: 1em;\n    max-width: 20em;\n    font: 130%/1.6 Baskerville, Palatino, serif;\n}\n```\n\n</section>\n"
  },
  {
    "path": "src/plugins/data-uri-highlight/data-uri-highlight.js",
    "content": "import prism from '../../global.js';\nimport { tokenizeStrings } from '../../shared/tokenize-strings.js';\n\n/** @type {import('../../types.d.ts').PluginProto<'data-uri-highlight'>} */\nconst Self = {\n\tid: 'data-uri-highlight',\n\toptional: 'diff-highlight',\n\teffect (Prism) {\n\t\tconst uri = {\n\t\t\t'data-uri': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(['\"])data:[^,\\/]+\\/[^,]+,(?:(?!\\1)[\\s\\S]|\\\\\\1)+(?=\\1)|^data:[^,\\/]+\\/[^,]+,[\\s\\S]+$/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'language-css': {\n\t\t\t\t\t\tpattern: /(data:[^,\\/]+\\/(?:[^+,]+\\+)?css,)[\\s\\S]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: 'css',\n\t\t\t\t\t},\n\t\t\t\t\t'language-javascript': {\n\t\t\t\t\t\tpattern: /(data:[^,\\/]+\\/(?:[^+,]+\\+)?javascript,)[\\s\\S]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: 'javascript',\n\t\t\t\t\t},\n\t\t\t\t\t'language-json': {\n\t\t\t\t\t\tpattern: /(data:[^,\\/]+\\/(?:[^+,]+\\+)?json,)[\\s\\S]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: 'json',\n\t\t\t\t\t},\n\t\t\t\t\t'language-markup': {\n\t\t\t\t\t\tpattern: /(data:[^,\\/]+\\/(?:[^+,]+\\+)?(?:html|xml),)[\\s\\S]+/,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: 'markup',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\treturn Prism.hooks.add('after-tokenize', env => {\n\t\t\ttokenizeStrings(env.tokens, code => Prism.tokenize(code, uri));\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/plugins/diff-highlight/README.md",
    "content": "---\ntitle: Diff Highlight\ndescription: Highlight the code inside diff blocks.\nowner: RunDevelopment\nrequire: diff\nresources: /plugins/autoloader.js { type=\"module\" }\n---\n\n<section class=\"language-none\">\n\n# How to use\n\nReplace the `language-diff` of your code block with a `language-diff-xxxx` class to enable syntax highlighting for diff blocks.\n\nOptional:  \nYou can add the `diff-highlight` class to your code block to indicate changes using the background color of a line rather than the color of the text.\n\n## Autoloader\n\nThe [Autoloader plugin](../autoloader) understands the `language-diff-xxxx` format and will ensure that the language definitions for both Diff and the code language are loaded.\n\n</section>\n\n<section class=\"language-none\">\n\n# Example\n\nUsing `class=\"language-diff\"`:\n\n```diff\n@@ -4,6 +4,5 @@\n-    let foo = bar.baz([1, 2, 3]);\n-    foo = foo + 1;\n+    const foo = bar.baz([1, 2, 3]) + 1;\n     console.log(`foo: ${foo}`);\n```\n\nUsing `class=\"language-diff diff-highlight\"`:\n\n```diff { .diff-highlight }\n@@ -4,6 +4,5 @@\n-    let foo = bar.baz([1, 2, 3]);\n-    foo = foo + 1;\n+    const foo = bar.baz([1, 2, 3]) + 1;\n     console.log(`foo: ${foo}`);\n```\n\nUsing `class=\"language-diff-javascript\"`:\n\n```diff-javascript\n@@ -4,6 +4,5 @@\n-    let foo = bar.baz([1, 2, 3]);\n-    foo = foo + 1;\n+    const foo = bar.baz([1, 2, 3]) + 1;\n     console.log(`foo: ${foo}`);\n```\n\nUsing `class=\"language-diff-javascript diff-highlight\"`:\n\n```diff-javascript { .diff-highlight }\n@@ -4,6 +4,5 @@\n-    let foo = bar.baz([1, 2, 3]);\n-    foo = foo + 1;\n+    const foo = bar.baz([1, 2, 3]) + 1;\n     console.log(`foo: ${foo}`);\n```\n\nUsing `class=\"language-diff-rust diff-highlight\"`:  \n(Autoloader is used to load the Rust language definition.)\n\n```diff-rust { .diff-highlight }\n@@ -111,6 +114,9 @@\n         nasty_btree_map.insert(i, MyLeafNode(i));\n     }\n\n+    let mut zst_btree_map: BTreeMap<(), ()> = BTreeMap::new();\n+    zst_btree_map.insert((), ());\n+\n     // VecDeque\n     let mut vec_deque = VecDeque::new();\n     vec_deque.push_back(5);\n```\n\n</section>\n"
  },
  {
    "path": "src/plugins/diff-highlight/diff-highlight.css",
    "content": "pre.diff-highlight > code .token.deleted:not(.prefix),\npre > code.diff-highlight .token.deleted:not(.prefix) {\n\tbackground-color: rgba(255, 0, 0, 0.1);\n\tcolor: inherit;\n\tdisplay: block;\n}\n\npre.diff-highlight > code .token.inserted:not(.prefix),\npre > code.diff-highlight .token.inserted:not(.prefix) {\n\tbackground-color: rgba(0, 255, 128, 0.1);\n\tcolor: inherit;\n\tdisplay: block;\n}\n"
  },
  {
    "path": "src/plugins/diff-highlight/diff-highlight.js",
    "content": "import { getTextContent, Token } from '../../core/classes/token.js';\nimport prism from '../../global.js';\nimport diff, { PREFIXES } from '../../languages/diff.js';\n\n/** @type {import('../../types.d.ts').PluginProto<'diff-highlight'>} */\nconst Self = {\n\tid: 'diff-highlight',\n\trequire: diff,\n\teffect (Prism) {\n\t\tconst LANGUAGE_REGEX = /^diff-([\\w-]+)/i;\n\n\t\t/** @param {HookEnv} env */\n\t\tconst setMissingGrammar = env => {\n\t\t\tconst lang = env.language;\n\t\t\tif (LANGUAGE_REGEX.test(lang) && !env.grammar) {\n\t\t\t\tenv.grammar = Prism.languageRegistry.getLanguage('diff')?.resolvedGrammar;\n\t\t\t}\n\t\t};\n\n\t\treturn Prism.hooks.add({\n\t\t\t'before-sanity-check': setMissingGrammar,\n\t\t\t'before-tokenize': setMissingGrammar,\n\t\t\t'after-tokenize': env => {\n\t\t\t\tconst langMatch = LANGUAGE_REGEX.exec(env.language);\n\t\t\t\tif (!langMatch) {\n\t\t\t\t\treturn; // not a language specific diff\n\t\t\t\t}\n\n\t\t\t\tconst diffLanguage = langMatch[1];\n\t\t\t\tconst diffGrammar =\n\t\t\t\t\tPrism.languageRegistry.getLanguage(diffLanguage)?.resolvedGrammar;\n\t\t\t\tif (!diffGrammar) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfor (const token of env.tokens) {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof token === 'string' ||\n\t\t\t\t\t\t!(token.type in PREFIXES) ||\n\t\t\t\t\t\t!Array.isArray(token.content)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst type = token.type;\n\t\t\t\t\tlet insertedPrefixes = 0;\n\t\t\t\t\tconst getPrefixToken = () => {\n\t\t\t\t\t\tinsertedPrefixes++;\n\t\t\t\t\t\treturn new Token('prefix', PREFIXES[type], /\\w+/.exec(type)?.[0]);\n\t\t\t\t\t};\n\n\t\t\t\t\tconst withoutPrefixes = token.content.filter(\n\t\t\t\t\t\tt => typeof t === 'string' || t.type !== 'prefix'\n\t\t\t\t\t);\n\t\t\t\t\tconst prefixCount = token.content.length - withoutPrefixes.length;\n\n\t\t\t\t\tconst diffTokens = Prism.tokenize(getTextContent(withoutPrefixes), diffGrammar);\n\n\t\t\t\t\t// re-insert prefixes\n\n\t\t\t\t\t// always add a prefix at the start\n\t\t\t\t\tdiffTokens.unshift(getPrefixToken());\n\n\t\t\t\t\tconst LINE_BREAK = /\\r\\n|\\n/g;\n\t\t\t\t\t/**\n\t\t\t\t\t *\n\t\t\t\t\t * @param {string} text\n\t\t\t\t\t */\n\t\t\t\t\tconst insertAfterLineBreakString = text => {\n\t\t\t\t\t\t/** @type {TokenStream} */\n\t\t\t\t\t\tconst result = [];\n\t\t\t\t\t\tLINE_BREAK.lastIndex = 0;\n\t\t\t\t\t\tlet last = 0;\n\t\t\t\t\t\tlet m;\n\t\t\t\t\t\twhile (insertedPrefixes < prefixCount && (m = LINE_BREAK.exec(text))) {\n\t\t\t\t\t\t\tconst end = m.index + m[0].length;\n\t\t\t\t\t\t\tresult.push(text.slice(last, end));\n\t\t\t\t\t\t\tlast = end;\n\t\t\t\t\t\t\tresult.push(getPrefixToken());\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (result.length === 0) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (last < text.length) {\n\t\t\t\t\t\t\tresult.push(text.slice(last));\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t};\n\n\t\t\t\t\t/**\n\t\t\t\t\t *\n\t\t\t\t\t * @param {TokenStream} tokens\n\t\t\t\t\t */\n\t\t\t\t\tconst insertAfterLineBreak = tokens => {\n\t\t\t\t\t\tfor (let i = 0; i < tokens.length && insertedPrefixes < prefixCount; i++) {\n\t\t\t\t\t\t\tconst token = tokens[i];\n\n\t\t\t\t\t\t\tif (typeof token === 'string') {\n\t\t\t\t\t\t\t\tconst inserted = insertAfterLineBreakString(token);\n\t\t\t\t\t\t\t\tif (inserted) {\n\t\t\t\t\t\t\t\t\ttokens.splice(i, 1, ...inserted);\n\t\t\t\t\t\t\t\t\ti += inserted.length - 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (typeof token.content === 'string') {\n\t\t\t\t\t\t\t\tconst inserted = insertAfterLineBreakString(token.content);\n\t\t\t\t\t\t\t\tif (inserted) {\n\t\t\t\t\t\t\t\t\ttoken.content = inserted;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tinsertAfterLineBreak(token.content);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tinsertAfterLineBreak(diffTokens);\n\n\t\t\t\t\tif (insertedPrefixes < prefixCount) {\n\t\t\t\t\t\t// we are missing the last prefix\n\t\t\t\t\t\tdiffTokens.push(getPrefixToken());\n\t\t\t\t\t}\n\n\t\t\t\t\ttoken.content = diffTokens;\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @typedef {import('../../types.d.ts').HookEnv} HookEnv\n * @typedef {import('../../types.d.ts').TokenStream} TokenStream\n */\n"
  },
  {
    "path": "src/plugins/download-button/README.md",
    "content": "---\ntitle: Download Button\ndescription: A button in the toolbar of a code block adding a convenient way to download a code file.\nowner: Golmote\nrequire: toolbar\nnoCSS: true\nresources:\n  - /plugins/toolbar.css\n  - /plugins/toolbar.js { type=\"module\" }\n---\n\n<section class=\"language-markup\">\n\n# How to use\n\nUse the `data-src` and `data-download-link` attribute on a `<pre>` elements similar to [Autoloader](../autoloader), like so:\n\n```html\n<pre data-src=\"myfile.js\" data-download-link></pre>\n```\n\nOptionally, the text of the button can also be customized by using a `data-download-link-label` attribute.\n\n```html\n<pre data-src=\"myfile.js\" data-download-link data-download-link-label=\"Download this file\"></pre>\n```\n\n</section>\n\n<section>\n\n# Examples\n\nThe plugin’s JS code:\n<pre data-src=\"./download-button.js\" data-download-link data-download-link-label=\"Download the code!\"></pre>\n\nThis page:\n<pre data-src=\"./index.html\" data-download-link></pre>\n</section>\n"
  },
  {
    "path": "src/plugins/download-button/download-button.js",
    "content": "import prism from '../../global.js';\nimport { getParentPre } from '../../shared/dom-util.js';\nimport toolbar from '../toolbar/toolbar.js';\n\n/** @type {import('../../types.d.ts').PluginProto<'download-button'>} */\nconst Self = {\n\tid: 'download-button',\n\trequire: toolbar,\n\teffect (Prism) {\n\t\t/** @type {import('../toolbar/toolbar.js').Toolbar} */\n\t\tconst toolbar = Prism.pluginRegistry.peek('toolbar')?.plugin;\n\n\t\treturn toolbar.registerButton('download-file', env => {\n\t\t\tconst pre = getParentPre(env.element);\n\t\t\tif (!pre) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst src = pre.getAttribute('data-src') || pre.getAttribute('data-download-link');\n\t\t\tif (!src) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst a = document.createElement('a');\n\t\t\ta.textContent = pre.getAttribute('data-download-link-label') || 'Download';\n\t\t\ta.setAttribute('download', '');\n\t\t\ta.href = src;\n\t\t\treturn a;\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/plugins/file-highlight/README.md",
    "content": "---\ntitle: File Highlight\ndescription: Fetch external files and highlight them with Prism. Used on the Prism website itself.\nowner: LeaVerou\nnoCSS: true\nresources:\n  - /plugins/line-numbers.css\n  - /plugins/line-numbers.js { type=\"module\" }\n---\n\n<section class=\"language-markup\">\n\n# How to use\n\nUse the `data-src` attribute on empty `<pre>` elements, like so:\n\n```\n<pre data-src=\"myfile.js\"></pre>\n```\n\nYou don’t need to specify the language, it’s automatically determined by the file extension. If, however, the language cannot be determined from the file extension or the file extension is incorrect, you may specify a language as well (with the usual class name way).\n\nUse the `data-range` attribute to display only a selected range of lines from the file, like so:\n\n```\n<pre data-src=\"myfile.js\" data-range=\"1,5\"></pre>\n```\n\nLines start at 1, so `\"1,5\"` will display line 1 up to and including line 5. It's also possible to specify just a single line (e.g. `\"5\"` for just line 5) and open ranges (e.g. `\"3,\"` for all lines starting at line 3). Negative integers can be used to specify the n-th last line, e.g. `-2` for the second last line.\n\nWhen `data-range` is used in conjunction with the [Line Numbers plugin](../line-numbers), this plugin will add the proper `data-start` according to the specified range. This behavior can be overridden by setting the `data-start` attribute manually.\n\nPlease note that the files are fetched with XMLHttpRequest. This means that if the file is on a different origin, fetching it will fail, unless CORS is enabled on that website.\n\n</section>\n\n<section>\n\n# Examples\n\nThe plugin’s JS code:\n\n<pre data-src=\"./file-highlight.js\"></pre>\n\nThis page:\n\n<pre data-src=\"./index.html\"></pre>\n\nFile that doesn’t exist:\n\n<pre data-src=\"foobar.js\"></pre>\n\nWith line numbers, and `data-range=\"12,111\"`:\n\n<pre data-src=\"./file-highlight.js\" data-range=\"12,111\" class=\"line-numbers\"></pre>\n\nFor more examples, browse around the Prism website. Most large code samples are actually files fetched with this plugin.\n\n</section>\n"
  },
  {
    "path": "src/plugins/file-highlight/file-highlight.js",
    "content": "import prism from '../../global.js';\nimport { setLanguage } from '../../shared/dom-util.js';\n\n/**\n *\n * @param {number} status\n * @param {string} message\n * @returns {string}\n */\nconst FAILURE_MESSAGE = (status, message) => {\n\treturn `✖ Error ${status} while fetching file: ${message}`;\n};\nconst LOADING_MESSAGE = 'Loading…';\nconst FAILURE_EMPTY_MESSAGE = '✖ Error: File does not exist or is empty';\n\n/**\n * Loads the given file.\n *\n * @param {string} src The URL or path of the source file to load.\n * @param {(result: string) => void} success\n * @param {(reason: string) => void} error\n */\nfunction loadFile (src, success, error) {\n\tconst xhr = new XMLHttpRequest();\n\txhr.open('GET', src, true);\n\txhr.onreadystatechange = function () {\n\t\tif (xhr.readyState === 4) {\n\t\t\tif (xhr.status < 400 && xhr.responseText) {\n\t\t\t\tsuccess(xhr.responseText);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (xhr.status >= 400) {\n\t\t\t\t\terror(FAILURE_MESSAGE(xhr.status, xhr.statusText));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\terror(FAILURE_EMPTY_MESSAGE);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\txhr.send(null);\n}\n\nconst EXTENSIONS = {\n\t'js': 'javascript',\n\t'py': 'python',\n\t'rb': 'ruby',\n\t'ps1': 'powershell',\n\t'psm1': 'powershell',\n\t'sh': 'bash',\n\t'bat': 'batch',\n\t'h': 'c',\n\t'tex': 'latex',\n};\n\nconst STATUS_ATTR = 'data-src-status';\nconst STATUS_LOADING = 'loading';\nconst STATUS_LOADED = 'loaded';\nconst STATUS_FAILED = 'failed';\n\nconst SELECTOR =\n\t'pre[data-src]:not([' +\n\tSTATUS_ATTR +\n\t'=\"' +\n\tSTATUS_LOADED +\n\t'\"])' +\n\t':not([' +\n\tSTATUS_ATTR +\n\t'=\"' +\n\tSTATUS_LOADING +\n\t'\"])';\n\nexport class FileHighlight {\n\t/**\n\t * @param {Prism} Prism\n\t */\n\tPrism;\n\n\t/**\n\t * @package\n\t * @param {Prism} Prism\n\t */\n\tconstructor (Prism) {\n\t\tthis.Prism = Prism;\n\t}\n\n\t/**\n\t * Executes the File Highlight plugin for all matching `pre` elements under the given container.\n\t *\n\t * Note: Elements which are already loaded or currently loading will not be touched by this method.\n\t *\n\t * @param {ParentNode} [container=document] Defaults to `document`.\n\t */\n\thighlight (container = document) {\n\t\tconst elements = container.querySelectorAll(SELECTOR);\n\n\t\tfor (const element of elements) {\n\t\t\tthis.Prism.highlightElement(element);\n\t\t}\n\t}\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'file-highlight'>} */\nconst Self = {\n\tid: 'file-highlight',\n\tplugin (Prism) {\n\t\treturn new FileHighlight(Prism);\n\t},\n\teffect (Prism) {\n\t\t/**\n\t\t * Parses the given range.\n\t\t *\n\t\t * This returns a range with inclusive ends.\n\t\t *\n\t\t * @param {string | null | undefined} range\n\t\t * @returns {Array | undefined}\n\t\t */\n\t\tfunction parseRange (range) {\n\t\t\tconst m = /^\\s*(\\d+)\\s*(?:(,)\\s*(?:(\\d+)\\s*)?)?$/.exec(range || '');\n\t\t\tif (m) {\n\t\t\t\tconst start = Number(m[1]);\n\t\t\t\tconst comma = m[2];\n\t\t\t\tconst end = m[3];\n\n\t\t\t\tif (!comma) {\n\t\t\t\t\treturn [start, start];\n\t\t\t\t}\n\t\t\t\tif (!end) {\n\t\t\t\t\treturn [start, undefined];\n\t\t\t\t}\n\t\t\t\treturn [start, Number(end)];\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn Prism.hooks.add({\n\t\t\t'before-highlightall': env => {\n\t\t\t\tenv.selector += ', ' + SELECTOR;\n\t\t\t},\n\t\t\t'before-sanity-check': env => {\n\t\t\t\t/** @type {HTMLPreElement} */\n\t\t\t\tconst pre = env.element;\n\n\t\t\t\tif (!pre.matches(SELECTOR)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst src = pre.getAttribute('data-src');\n\t\t\t\tif (!src) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tenv.code = ''; // fast-path the whole thing and go to complete\n\n\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADING); // mark as loading\n\n\t\t\t\t// add code element with loading message\n\t\t\t\tconst code = pre.appendChild(document.createElement('CODE'));\n\t\t\t\tcode.textContent = LOADING_MESSAGE;\n\n\t\t\t\tlet language = env.language;\n\t\t\t\tif (language === 'none') {\n\t\t\t\t\t// the language might be 'none' because there is no language set;\n\t\t\t\t\t// in this case, we want to use the extension as the language\n\t\t\t\t\tconst extension = /\\.(\\w+)$/.exec(src)?.[1] || 'none';\n\t\t\t\t\tlanguage = EXTENSIONS[extension] || extension;\n\t\t\t\t}\n\n\t\t\t\t// set language classes\n\t\t\t\tsetLanguage(code, language);\n\t\t\t\tsetLanguage(pre, language);\n\n\t\t\t\t// preload the language\n\t\t\t\t/** @type {import('../autoloader/autoloader.js').Autoloader} */\n\t\t\t\tconst autoloader = Prism.pluginRegistry.peek('autoloader')?.plugin;\n\t\t\t\tif (autoloader) {\n\t\t\t\t\tautoloader.preloadLanguages(language);\n\t\t\t\t}\n\n\t\t\t\t// load file\n\t\t\t\tloadFile(\n\t\t\t\t\tsrc,\n\t\t\t\t\ttext => {\n\t\t\t\t\t\t// mark as loaded\n\t\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADED);\n\n\t\t\t\t\t\t// handle data-range\n\t\t\t\t\t\tconst range = parseRange(pre.getAttribute('data-range'));\n\t\t\t\t\t\tif (range) {\n\t\t\t\t\t\t\tconst lines = text.split(/\\r\\n?|\\n/);\n\n\t\t\t\t\t\t\t// the range is one-based and inclusive on both ends\n\t\t\t\t\t\t\tlet start = range[0];\n\t\t\t\t\t\t\tlet end = range[1] == null ? lines.length : range[1];\n\n\t\t\t\t\t\t\tif (start < 0) {\n\t\t\t\t\t\t\t\tstart += lines.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstart = Math.max(0, Math.min(start - 1, lines.length));\n\t\t\t\t\t\t\tif (end < 0) {\n\t\t\t\t\t\t\t\tend += lines.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tend = Math.max(0, Math.min(end, lines.length));\n\n\t\t\t\t\t\t\ttext = lines.slice(start, end).join('\\n');\n\n\t\t\t\t\t\t\t// add data-start for line numbers\n\t\t\t\t\t\t\tif (!pre.hasAttribute('data-start')) {\n\t\t\t\t\t\t\t\tpre.setAttribute('data-start', String(start + 1));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// highlight code\n\t\t\t\t\t\tcode.textContent = text;\n\t\t\t\t\t\tPrism.highlightElement(code);\n\t\t\t\t\t},\n\t\t\t\t\terror => {\n\t\t\t\t\t\t// mark as failed\n\t\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_FAILED);\n\n\t\t\t\t\t\tcode.textContent = error;\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @typedef {import('../../core.js').Prism} Prism\n */\n"
  },
  {
    "path": "src/plugins/filter-highlight-all/README.md",
    "content": "---\ntitle: Filter highlightAll\ndescription: Filters the elements the `highlightAll` and `highlightAllUnder` methods actually highlight.\nowner: RunDevelopment\nnoCSS: true\nresources:\n  - /languages/typescript.js { type=\"module\" }\n  - ./demo.js { defer }\n---\n\n<style>\n\tdt { font-size: 100%; }\n</style>\n\n<section class=\"language-typescript\">\n\n# How to use\n\nFilter highlightAll provides you with ways to filter the element the `highlightAll` and `highlightAllUnder` methods actually highlight. This can be very useful when you use Prism's automatic highlighting when loading the page but want to exclude certain code blocks.\n\n</section>\n\n<section class=\"language-typescript\">\n\n# API\n\nIn `Prism.plugins.filterHighlightAll` you can find the following:\n\n`add(condition: (value: { element, language: string }) => boolean): void`\n\n: Adds a new filter which will only allow an element to be highlighted if the given function returns `true` for that element.  \nThis can be used to define a custom language filter.\n\n`addSelector(selector: string): void`\n\n: Adds a new filter which will only allow an element to be highlighted if the element matches the given CSS selector.\n\n`reject.add(condition: (value: { element, language: string }) => boolean): void`\n\n: Same as `add`, but only elements which do **not** fulfill the condition will be highlighted.\n\n`reject.addSelector(selector: string): void`\n\n: Same as `addSelector`, but only elements which do **not** match the selector will be highlighted.\n\n`filterKnown: boolean = false`\n\n: Set this to `true` to only allow known languages. Code blocks without a set language or an unknown language will not be highlighted.\n\nAn element will only be highlighted by the `highlightAll` and `highlightAllUnder` methods if all of the above accept the element.\n\n## Attributes\n\nYou can also add the following `data-*`{ .language-none } attributes to the script which contains the Filter highlightAll plugin.\n\n`<script src=\"...\" data-filter-selector=\"<css selector>\">`{ .language-markup }\n\n: This attribute is a shorthand for `Prism.plugins.filterHighlightAll.addSelector`. The value of the attribute will be passed as is to the `addSelector` function.\n\n`<script src=\"...\" data-reject-selector=\"<css selector>\">`{ .language-markup }\n\n: This attribute is a shorthand for `Prism.plugins.filterHighlightAll.reject.addSelector`. The value of the attribute will be passed as is to the `rejectSelector` function.\n\n`<script src=\"...\" data-filter-known>`{ .language-markup }\n\n: This attribute can be used to set the value of `Prism.plugins.filterHighlightAll.filterKnown`. `filterKnown` will be set to `true` if the attribute is present, `false` otherwise.\n\n</section>\n\n<section>\n\n# Examples\n\nThe following code is used to define a filter on this page.\n\n```js\n// <code> elements with a .no-highlight class will be ignored\nPrism.plugins.filterHighlightAll.reject.addSelector('code.no-highlight');\nPrism.plugins.filterHighlightAll.reject.addSelector('pre.no-highlight > code');\n\n// don't highlight CSS code\nPrism.plugins.filterHighlightAll.add(function (env) {\n\treturn env.language !== 'css';\n});\n```\n\nThe results:\n\n```js { .language-javascript .no-highlight }\nlet foo = \"I'm not being highlighted\";\n```\n\n```css { .language-css }\na.link::after {\n\tcontent: 'also not being highlighted';\n\tcolor: #F00;\n}\n```\n\nPrism will ignore these blocks, so you can even define your own static highlighting which Prism would normally remove.\n\n<pre class=\"language-css\"><code class=\"language-css\">a.link::before {\n\tcont<span class=\"token selector\">ent: 'I just do my o</span>wn highlighting';\n\tcolor: <span class=\"token constant\">#F00</span>;\n}</code></pre>\n\n</section>\n"
  },
  {
    "path": "src/plugins/filter-highlight-all/demo.js",
    "content": "// elements with a .no-highlight class will be ignored\nPrism.plugins.filterHighlightAll.reject.addSelector('code.no-highlight');\nPrism.plugins.filterHighlightAll.reject.addSelector('pre.no-highlight > code');\n\n// don't highlight CSS code\nPrism.plugins.filterHighlightAll.add(env => {\n\treturn env.language !== 'css';\n});\n"
  },
  {
    "path": "src/plugins/filter-highlight-all/filter-highlight-all.js",
    "content": "import prism from '../../global.js';\nimport { getLanguage } from '../../shared/dom-util.js';\n\nexport class FilterHighlightAll {\n\t/**\n\t * @type {((element: Element) => boolean)[]}\n\t */\n\tfilters = [];\n\t/**\n\t * Filters the elements of `highlightAll` and `highlightAllUnder` such that only elements with a known language\n\t * will be highlighted. All elements with an unset or unknown language will be ignored.\n\t *\n\t * __Note:__ This will effectively disable the AutoLoader plugin.\n\t *\n\t * @default false\n\t */\n\tfilterKnown = false;\n\n\t/**\n\t * Adds a new filter for the elements of `highlightAll` and `highlightAllUnder` such that only elements for\n\t * which the given function returns `true` will be highlighted.\n\t *\n\t * @param {Condition} condition\n\t */\n\tadd (condition) {\n\t\tthis.filters.push(element => {\n\t\t\treturn condition({\n\t\t\t\telement,\n\t\t\t\tlanguage: getLanguage(element),\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Adds a new filter for the elements of `highlightAll` and `highlightAllUnder` such that only elements that\n\t * match the given CSS selection will be highlighted.\n\t *\n\t * @param {string} selector\n\t */\n\taddSelector (selector) {\n\t\tthis.filters.push(element => {\n\t\t\treturn element.matches(selector);\n\t\t});\n\t}\n\n\treject = {\n\t\t/**\n\t\t * Adds a new filter for the elements of `highlightAll` and `highlightAllUnder` such that only elements for\n\t\t * which the given function returns `false` will be highlighted.\n\t\t *\n\t\t * @param {Condition} condition\n\t\t */\n\t\tadd: condition => {\n\t\t\tthis.add(value => !condition(value));\n\t\t},\n\n\t\t/**\n\t\t * Adds a new filter for the elements of `highlightAll` and `highlightAllUnder` such that only elements that do\n\t\t * not match the given CSS selection will be highlighted.\n\t\t *\n\t\t * @param {string} selector\n\t\t */\n\t\taddSelector: selector => {\n\t\t\tthis.filters.push(element => {\n\t\t\t\treturn !element.matches(selector);\n\t\t\t});\n\t\t},\n\t};\n\n\t/**\n\t * Applies all filters to the given element and returns `true` if and only if every filter returned `true` on the\n\t * given element.\n\t *\n\t * @param {Element} element\n\t * @returns {boolean}\n\t */\n\teveryFilter (element) {\n\t\tfor (const filter of this.filters) {\n\t\t\tif (!filter(element)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'filter-highlight-all'>} */\nconst Self = {\n\tid: 'filter-highlight-all',\n\tplugin (Prism) {\n\t\tconst config = new FilterHighlightAll();\n\n\t\tconfig.add(env => {\n\t\t\treturn !config.filterKnown || Prism.languageRegistry.has(env.language);\n\t\t});\n\n\t\tif (typeof document !== 'undefined') {\n\t\t\tconst script = document.currentScript;\n\t\t\tif (script) {\n\t\t\t\tconfig.filterKnown = script.hasAttribute('data-filter-known');\n\n\t\t\t\tlet attr;\n\t\t\t\tattr = script.getAttribute('data-filter-selector');\n\t\t\t\tif (attr) {\n\t\t\t\t\tconfig.addSelector(attr);\n\t\t\t\t}\n\t\t\t\tattr = script.getAttribute('data-reject-selector');\n\t\t\t\tif (attr) {\n\t\t\t\t\tconfig.reject.addSelector(attr);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn config;\n\t},\n\teffect (Prism) {\n\t\t/** @type {FilterHighlightAll} */\n\t\tconst config = Prism.pluginRegistry.peek(Self)?.plugin;\n\n\t\treturn Prism.hooks.add('before-all-elements-highlight', env => {\n\t\t\tenv.elements = env.elements.filter(e => config.everyFilter(e));\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @callback Condition\n * @param {{ element: Element, language: string }} value\n * @returns {boolean}\n */\n"
  },
  {
    "path": "src/plugins/highlight-keywords/README.md",
    "content": "---\ntitle: Highlight Keywords\ndescription: Adds special CSS classes for each keyword for fine-grained highlighting.\nowner: vkbansal\nnoCSS: true\n---\n\n<style>\n\t/*\n\t * Custom keyword styles\n\t */\n\t.token.keyword.keyword-return, .token.keyword.keyword-if {\n\t\t/* Set the color to a nice red. */\n\t\tcolor: #f92672;\n\t}\n</style>\n\n<section class=\"language-none\">\n\n# How to use\n\nThis plugin adds a special class for every keyword, so keyword-specific styles can be applied. These special classes allow for fine-grained control over the appearance of keywords using your own CSS rules.\n\nFor example, the keyword `if` will have the class `keyword-if` added. A CSS rule used to apply special highlighting could look like this:\n\n```css\n.token.keyword.keyword-if { /* styles for 'if' */ }\n```\n\n**Note:** This plugin does not come with CSS styles. You have to define the keyword-specific CSS rules yourself.\n\n</section>\n\n<section class=\"language-none\">\n\n# Examples\n\nThis example shows the plugin in action. The keywords `if` and `return` will be highlighted in red. The color of all other keywords will be determined by the current theme. The CSS rules used to implement the keyword-specific highlighting can be seen in the HTML file below.\n\n## JavaScript\n\n<pre data-src=\"./highlight-keywords.js\"></pre>\n\n## HTML (Markup)\n\n<pre data-src=\"./index.html\"></pre>\n\n</section>\n"
  },
  {
    "path": "src/plugins/highlight-keywords/highlight-keywords.js",
    "content": "import prism from '../../global.js';\n\n/** @type {import('../../types.d.ts').PluginProto<'highlight-keywords'>} */\nconst Self = {\n\tid: 'highlight-keywords',\n\teffect (Prism) {\n\t\treturn Prism.hooks.add('wrap', env => {\n\t\t\tif (env.type !== 'keyword') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tenv.classes.push('keyword-' + env.content);\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/plugins/inline-color/README.md",
    "content": "---\ntitle: Inline Color\ndescription: Adds a small inline preview for colors in style sheets.\nowner: RunDevelopment\nrequire: css-extras\nresources: /languages/css-extras.js { type=\"module\" }\n---\n\n<section>\n\n# Examples\n\n## CSS\n\n```css\nspan.foo {\n\tbackground-color: navy;\n\tcolor: #BFD;\n}\n\nspan.bar {\n\tbackground: rgba(105, 0, 12, .38);\n\tcolor: hsl(30, 100%, 50%);\n\tborder-color: transparent;\n}\n```\n\n<pre data-src=\"https://dev.prismjs.com/themes/prism.css\"></pre>\n\n## HTML (Markup)\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\n<meta charset=\"utf-8\" />\n<title>Example</title>\n<style>\n\t/* Also works here */\n\ta.not-a-class {\n\t\tcolor: red;\n\t}\n</style>\n<body style=\"color: black\">\n\n</body>\n</html>\n```\n\n</section>\n"
  },
  {
    "path": "src/plugins/inline-color/inline-color.css",
    "content": "span.inline-color-wrapper {\n\t/*\n\t * The background image is the following SVG inline in base 64:\n\t *\n\t * <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 2 2\">\n\t *     <path fill=\"gray\" d=\"M0 0h2v2H0z\"/>\n\t *     <path fill=\"white\" d=\"M0 0h1v1H0zM1 1h1v1H1z\"/>\n\t * </svg>\n\t *\n\t * SVG-inlining explained:\n\t * https://stackoverflow.com/a/21626701/7595472\n\t */\n\tbackground: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyIDIiPjxwYXRoIGZpbGw9ImdyYXkiIGQ9Ik0wIDBoMnYySDB6Ii8+PHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0wIDBoMXYxSDB6TTEgMWgxdjFIMXoiLz48L3N2Zz4=\");\n\t/* This is to prevent visual glitches where one pixel from the repeating pattern could be seen. */\n\tbackground-position: center;\n\tbackground-size: 110%;\n\n\tdisplay: inline-block;\n\theight: 1.333ch;\n\twidth: 1.333ch;\n\tmargin: 0 0.333ch;\n\tbox-sizing: border-box;\n\tborder: 1px solid white;\n\toutline: 1px solid rgba(0, 0, 0, 0.5);\n\toverflow: hidden;\n}\n\nspan.inline-color {\n\tdisplay: block;\n\t/* To prevent visual glitches again */\n\theight: 120%;\n\twidth: 120%;\n}\n"
  },
  {
    "path": "src/plugins/inline-color/inline-color.js",
    "content": "import prism from '../../global.js';\nimport cssExtras from '../../languages/css-extras.js';\nimport { MARKUP_TAG } from '../../shared/languages/patterns.js';\n\nconst HTML_TAG = RegExp(MARKUP_TAG, 'g');\n\n// a regex to validate hexadecimal colors\nconst HEX_COLOR = /^#?((?:[\\da-f]){3,4}|(?:[\\da-f]{2}){3,4})$/i;\n\n/**\n * Parses the given hexadecimal representation and returns the parsed RGBA color.\n *\n * If the format of the given string is invalid, `undefined` will be returned.\n * Valid formats are: `RGB`, `RGBA`, `RRGGBB`, and `RRGGBBAA`.\n *\n * Hexadecimal colors are parsed because they are not fully supported by older browsers, so converting them to\n * `rgba` functions improves browser compatibility.\n *\n * @param {string} hex\n * @returns {string | undefined}\n */\nfunction parseHexColor (hex) {\n\tconst match = HEX_COLOR.exec(hex);\n\tif (!match) {\n\t\treturn undefined;\n\t}\n\thex = match[1]; // removes the leading \"#\"\n\n\t// the width and number of channels\n\tconst channelWidth = hex.length >= 6 ? 2 : 1;\n\tconst channelCount = hex.length / channelWidth;\n\n\t// the scale used to normalize 4bit and 8bit values\n\tconst scale = channelWidth === 1 ? 1 / 15 : 1 / 255;\n\n\t// normalized RGBA channels\n\tconst channels = [];\n\tfor (let i = 0; i < channelCount; i++) {\n\t\tconst int = parseInt(hex.substr(i * channelWidth, channelWidth), 16);\n\t\tchannels.push(int * scale);\n\t}\n\tif (channelCount === 3) {\n\t\tchannels.push(1); // add alpha of 100%\n\t}\n\n\t// output\n\tconst rgb = channels\n\t\t.slice(0, 3)\n\t\t.map(x => {\n\t\t\treturn String(Math.round(x * 255));\n\t\t})\n\t\t.join(',');\n\tconst alpha = String(Number(channels[3].toFixed(3))); // easy way to round 3 decimal places\n\n\treturn 'rgba(' + rgb + ',' + alpha + ')';\n}\n\n/**\n * Validates the given Color using the current browser's internal implementation.\n *\n * @param {string} color\n * @returns {string | undefined}\n */\nfunction validateColor (color) {\n\tif (typeof document === 'undefined') {\n\t\treturn undefined;\n\t}\n\n\tconst s = new Option().style;\n\ts.color = color;\n\treturn s.color ? color : undefined;\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'inline-color'>} */\nconst Self = {\n\tid: 'inline-color',\n\trequire: cssExtras,\n\teffect (Prism) {\n\t\t/**\n\t\t * An array of function which parse a given string representation of a color.\n\t\t *\n\t\t * These parser serve as validators and as a layer of compatibility to support color formats which the browser\n\t\t * might not support natively.\n\t\t */\n\t\tconst parsers = [parseHexColor, validateColor];\n\n\t\treturn Prism.hooks.add('wrap', env => {\n\t\t\tif (env.type === 'color' || env.classes.includes('color')) {\n\t\t\t\tconst content = env.content;\n\n\t\t\t\t// remove all HTML tags inside\n\t\t\t\tconst rawText = content.split(HTML_TAG).join('');\n\n\t\t\t\tlet color;\n\t\t\t\tfor (let i = 0, l = parsers.length; i < l && !color; i++) {\n\t\t\t\t\tcolor = parsers[i](rawText);\n\t\t\t\t}\n\n\t\t\t\tif (!color) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst previewElement =\n\t\t\t\t\t'<span class=\"inline-color-wrapper\"><span class=\"inline-color\" style=\"background-color:' +\n\t\t\t\t\tcolor +\n\t\t\t\t\t';\"></span></span>';\n\t\t\t\tenv.content = previewElement + content;\n\t\t\t}\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/plugins/jsonp-highlight/README.md",
    "content": "---\ntitle: JSONP Highlight\ndescription: Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).\nowner: nauzilus\nnoCSS: true\nresources: ./demo.js { defer }\n---\n\n<section class=\"language-markup\">\n\n# How to use\n\nUse the `data-jsonp` attribute on `<pre>` elements, like so:\n\n```html\n<pre\n\tclass=\"language-javascript\"\n\tdata-jsonp=\"https://api.github.com/repos/PrismJS/prism/contents/prism.js\">\n</pre>\n```\n\nDon't specify the `callback` query parameter in the URL; this will be added automatically. If the API expects a different callback parameter name however, use the `data-callback` parameter to specify the name:\n\n```html\n<pre class=\"…\" data-jsonp=\"…\" data-callback=\"cb\"></pre>\n```\n\nThe next trick is of course actually extracting something from the JSONP response worth highlighting, which means processing the response to extract the interesting data.\n\nThe following JSONP APIs are automatically detected and parsed:\n\n- [GitHub](https://developer.github.com/v3/repos/contents/#get-contents)\n- [GitHub Gists](https://developer.github.com/v3/gists/#get-a-single-gist)\n- [Bitbucket](https://confluence.atlassian.com/display/BITBUCKET/src+Resources#srcResources-GETrawcontentofanindividualfile)\n\nIf you need to do your own parsing, you can hook your your own data adapters in two ways:\n\n1. Supply the `data-adapter` parameter on the `<pre>` element. This must be the name of a globally defined function. The plugin will use _only_ this adapter to parse the response.\n2. Register your adapter function by calling `Prism.plugins.jsonphighlight.registerAdapter(rsp => { … })`{ .language-javascript }. It will be added to the list of inbuilt adapters and used if no other registered adapter (e.g. GitHub/Bitbucket) can parse the response.\n\nIn either case, the function must accept at least a single parameter (the JSONP response) and returns a string of the content to highlight. If your adapter cannot parse the response, you must return `null`{ .language-javascript }. The DOM node that will contain the highlighted code will also be passed in as the second argument, incase you need to use it to query any extra information (maybe you wish to inspect the `class` or `data-jsonp` attributes to assist in parsing the response).\n\nThe following example demonstrates both methods of using a custom adapter, to simply return the stringified JSONP response (i.e highlight the entire JSONP data):\n\n```html\n<!-- perhaps this is in a .js file elsewhere -->\n<script>\n\tfunction dump_json (rsp) {\n\t\treturn \"using dump_json: \" + JSON.stringify(rsp, null, 2);\n\t}\n</script>\n\n<!-- … include prism.js … -->\n<script>\n\tPrism.plugins.jsonphighlight.registerAdapter(rsp => {\n\t\treturn \"using registerAdapter: \" + JSON.stringify(rsp, null, 2);\n\t})\n</script>\n```\n\nAnd later in your HTML:\n\n```html\n<!-- using the data-adapter attribute -->\n<pre class=\"language-javascript\" data-jsonp=\"…\" data-adapter=\"dump_json\"></pre>\n\n<!-- using whatever data adapters are available -->\n<pre class=\"language-javascript\" data-jsonp=\"…\"></pre>\n```\n\nFinally, unlike like the [File Highlight](../file-highlight) plugin, you _do_ need to supply the appropriate `class` with the language to highlight. This could have been auto-detected, but since you're not actually linking to a file it's not always possible (see below in the example using GitHub status). Furthermore, if you're linking to files with a `.xaml` extension for example, this plugin then needs to somehow map that to highlight as `markup`, which just means more bloat. You know what you're trying to highlight, just say so. 🙂\n\n## Caveat for Gists\n\nThere's a bit of a catch with gists, as they can actually contain multiple files. There are two options to handle this:\n\n1. If your gist only contains one file, you don't need to to anything; the one and only file will automatically be chosen and highlighted\n2. If your file contains multiple files, the first one will be chosen by default. However, you can supply the filename in the `data-filename` attribute, and this file will be highlighted instead:\n\n```html\n<pre class=\"…\" data-jsonp=\"…\" data-filename=\"mydemo.js\"></pre>\n```\n\n</section>\n\n<section>\n\n# Examples\n\nThe plugin’s JS code (from GitHub):\n\n<pre class=\"lang-javascript\" data-jsonp=\"https://api.github.com/repos/PrismJS/plugins/contents/jsonp-highlight/prism-jsonp-highlight.js\"></pre>\n\nGitHub Gist (gist contains a single file, automatically selected):\n\n<pre class=\"lang-css\" data-jsonp=\"https://api.github.com/gists/599a04c05a22f48a292d\"></pre>\n\nGitHub Gist (gist contains a multiple files, file to load specified):\n\n<pre class=\"lang-markup\" data-jsonp=\"https://api.github.com/gists/599a04c05a22f48a292d\" data-filename=\"dabblet.html\"></pre>\n\nBitbucket API:\n\n<pre class=\"lang-css\" data-jsonp=\"https://bitbucket.org/!api/1.0/repositories/nauzilus/stylish/src/master/whirlpool/style.css\"></pre>\n\nCustom adapter (JSON.stringify showing the GitHub REST API for [Prism's repository](https://api.github.com/repos/PrismJS/prism)):\n\n<pre class=\"lang-javascript\" data-jsonp=\"https://api.github.com/repos/PrismJS/prism\" data-adapter=\"dump_json\"></pre>\n\nRegistered adapter (as above, but without explicitly declaring the `data-adapter` attribute):\n\n<pre class=\"lang-javascript\" data-jsonp=\"https://api.github.com/repos/PrismJS/prism\"></pre>\n\n</section>\n"
  },
  {
    "path": "src/plugins/jsonp-highlight/demo.js",
    "content": "function dump_json (x) {\n\treturn `using dump_json: ${JSON.stringify(x, null, 2)}`;\n}\n\nPrism.plugins.jsonphighlight.registerAdapter(\n\tx => `using registerAdapter: ${JSON.stringify(x, null, 2)}`\n);\n"
  },
  {
    "path": "src/plugins/jsonp-highlight/jsonp-highlight.js",
    "content": "import prism from '../../global.js';\n\nfunction getGlobal () {\n\treturn typeof window === 'object' ? window : {};\n}\n\nlet jsonpCallbackCounter = 0;\n\n/**\n * Makes a JSONP request.\n *\n * @param {string} src The URL of the resource to request.\n * @param {string | undefined | null} callbackParameter The name of the callback parameter. If falsy, `\"callback\"` will be used.\n * @param {number} timeout\n * @param {(data: any) => void} onSuccess\n * @param {(reason: 'timeout' | 'network') => void} onError\n * @returns {void}\n */\nfunction jsonp (src, callbackParameter, timeout, onSuccess, onError) {\n\tconst callbackName = `prismjsonp${jsonpCallbackCounter++}`;\n\n\tconst uri = document.createElement('a');\n\turi.href = src;\n\turi.href += (uri.search ? '&' : '?') + (callbackParameter || 'callback') + '=' + callbackName;\n\n\tconst script = document.createElement('script');\n\tscript.src = uri.href;\n\tscript.onerror = function () {\n\t\tcleanup();\n\t\tonError('network');\n\t};\n\n\tconst timeoutId = setTimeout(() => {\n\t\tcleanup();\n\t\tonError('timeout');\n\t}, timeout);\n\n\tconst global = getGlobal();\n\n\tfunction cleanup () {\n\t\tclearTimeout(timeoutId);\n\t\tdocument.head.removeChild(script);\n\t\tdelete global[callbackName];\n\t}\n\n\t/**\n\t * The JSONP callback function\n\t */\n\tglobal[callbackName] = response => {\n\t\tcleanup();\n\t\tonSuccess(response);\n\t};\n\n\tdocument.head.appendChild(script);\n}\n\nconst STATUS_ATTR = 'data-jsonp-status';\nconst STATUS_LOADING = 'loading';\nconst STATUS_LOADED = 'loaded';\nconst STATUS_FAILED = 'failed';\n\nconst SELECTOR =\n\t'pre[data-jsonp]:not([' +\n\tSTATUS_ATTR +\n\t'=\"' +\n\tSTATUS_LOADED +\n\t'\"])' +\n\t':not([' +\n\tSTATUS_ATTR +\n\t'=\"' +\n\tSTATUS_LOADING +\n\t'\"])';\n\nexport class JsonpHighlight {\n\t/**\n\t * The timeout after which an error message will be displayed.\n\t *\n\t * __Note:__ If the request succeeds after the timeout, it will still be processed and will override any\n\t * displayed error messages.\n\t */\n\ttimeout = 5000;\n\n\t/**\n\t * @type {Prism}\n\t */\n\tPrism;\n\n\t/**\n\t * The list of adapter which will be used if `data-adapter` is not specified.\n\t *\n\t * @type {{ adapter: Adapter, name: string }[]}\n\t */\n\tadapters = [];\n\n\t/**\n\t * @param {Prism} Prism\n\t */\n\tconstructor (Prism) {\n\t\tthis.Prism = Prism;\n\t}\n\n\t/**\n\t * Returns the given adapter itself, if registered, or a registered adapter with the given name.\n\t *\n\t * If no fitting adapter is registered, `null` will be returned.\n\t *\n\t * @param {string | Adapter} adapter The adapter itself or the name of an adapter.\n\t */\n\tgetAdapter (adapter) {\n\t\tif (typeof adapter === 'function') {\n\t\t\tfor (const item of this.adapters) {\n\t\t\t\tif (item.adapter.valueOf() === adapter.valueOf()) {\n\t\t\t\t\treturn item.adapter;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (typeof adapter === 'string') {\n\t\t\tfor (const item of this.adapters) {\n\t\t\t\tif (item.name === adapter) {\n\t\t\t\t\treturn item.adapter;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Adds a new function to the list of adapters.\n\t *\n\t * If the given adapter is already registered or not a function or there is an adapter with the given name already,\n\t * nothing will happen.\n\t *\n\t * @param {string} name The name of the adapter.\n\t * @param {Adapter} adapter The adapter to be registered.\n\t */\n\tregisterAdapter (name, adapter) {\n\t\tif (typeof adapter === 'function' && !this.getAdapter(adapter) && !this.getAdapter(name)) {\n\t\t\tthis.adapters.push({ adapter, name });\n\t\t}\n\t}\n\n\t/**\n\t * Remove the given adapter or the first registered adapter with the given name from the list of\n\t * registered adapters.\n\t *\n\t * @param {string | Adapter} adapter The adapter itself or the name of an adapter.\n\t */\n\tremoveAdapter (adapter) {\n\t\tconst resolvedAdapter = typeof adapter === 'string' ? this.getAdapter(adapter) : adapter;\n\t\tif (resolvedAdapter) {\n\t\t\tconst index = this.adapters.findIndex(item => item.adapter === resolvedAdapter);\n\t\t\tif (index >= 0) {\n\t\t\t\tthis.adapters.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Runs all registered adapters in the order they were registered using\n\t * the given arguments. The result of the first adapter that returns a\n\t * string will be returned and iteration will be stopped.\n\t *\n\t * @param {Parameters<Adapter>} args\n\t */\n\trunAdapters (...args) {\n\t\tfor (const adapter of this.adapters) {\n\t\t\tconst data = adapter.adapter(...args);\n\t\t\tif (data !== null) {\n\t\t\t\treturn data;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Highlights all `pre` elements under the given container with a `data-jsonp` attribute by requesting the\n\t * specified JSON and using the specified adapter or a registered adapter to extract the code to highlight\n\t * from the response. The highlighted code will be inserted into the `pre` element.\n\t *\n\t * Note: Elements which are already loaded or currently loading will not be touched by this method.\n\t *\n\t * @param {Element | Document} [container=document] Defaults to `document`.\n\t */\n\thighlight (container = document) {\n\t\tconst elements = container.querySelectorAll(SELECTOR);\n\n\t\tfor (const element of elements) {\n\t\t\tthis.Prism.highlightElement(element);\n\t\t}\n\t}\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'jsonp-highlight'>} */\nconst Self = {\n\tid: 'jsonp-highlight',\n\tplugin (Prism) {\n\t\tconst config = new JsonpHighlight(Prism);\n\n\t\tconfig.registerAdapter('github', rsp => {\n\t\t\tif (rsp && rsp.meta && rsp.data) {\n\t\t\t\tif (rsp.meta.status && rsp.meta.status >= 400) {\n\t\t\t\t\treturn `Error: ${rsp.data.message || rsp.meta.status}`;\n\t\t\t\t}\n\t\t\t\telse if (typeof rsp.data.content === 'string') {\n\t\t\t\t\treturn typeof atob === 'function'\n\t\t\t\t\t\t? atob(rsp.data.content.replace(/\\s/g, ''))\n\t\t\t\t\t\t: 'Your browser cannot decode base64';\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t});\n\t\tconfig.registerAdapter('gist', (rsp, el) => {\n\t\t\tif (rsp && rsp.meta && rsp.data && rsp.data.files) {\n\t\t\t\tif (rsp.meta.status && rsp.meta.status >= 400) {\n\t\t\t\t\treturn `Error: ${rsp.data.message || rsp.meta.status}`;\n\t\t\t\t}\n\n\t\t\t\tconst files = rsp.data.files;\n\t\t\t\tlet filename = el.getAttribute('data-filename');\n\t\t\t\tif (filename == null) {\n\t\t\t\t\t// Maybe in the future we can somehow render all files\n\t\t\t\t\t// But the standard <script> include for gists does that nicely already,\n\t\t\t\t\t// so that might be getting beyond the scope of this plugin\n\t\t\t\t\tfor (const key in files) {\n\t\t\t\t\t\tif (files.hasOwnProperty(key)) {\n\t\t\t\t\t\t\tfilename = key;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (filename && files[filename] !== undefined) {\n\t\t\t\t\treturn String(files[filename].content);\n\t\t\t\t}\n\t\t\t\treturn `Error: unknown or missing gist file ${filename}`;\n\t\t\t}\n\t\t\treturn null;\n\t\t});\n\t\tconfig.registerAdapter('bitbucket', rsp => {\n\t\t\tif (rsp && rsp.node && typeof rsp.data === 'string') {\n\t\t\t\treturn String(rsp.data);\n\t\t\t}\n\t\t\treturn null;\n\t\t});\n\n\t\treturn config;\n\t},\n\teffect (Prism) {\n\t\t/** @type {JsonpHighlight} */\n\t\tconst config = Prism.pluginRegistry.peek(Self)?.plugin;\n\n\t\tconst LOADING_MESSAGE = 'Loading…';\n\t\t/** @param {string} name */\n\t\tconst MISSING_ADAPTER_MESSAGE = name => {\n\t\t\treturn '✖ Error: JSONP adapter function \"' + name + '\" doesn\\'t exist';\n\t\t};\n\t\t/** @param {string} url */\n\t\tconst TIMEOUT_MESSAGE = url => {\n\t\t\treturn '✖ Error: Timeout loading ' + url;\n\t\t};\n\t\tconst UNKNOWN_FAILURE_MESSAGE =\n\t\t\t'✖ Error: Cannot parse response (perhaps you need an adapter function?)';\n\n\t\treturn Prism.hooks.add({\n\t\t\t'before-highlightall': env => {\n\t\t\t\tenv.selector += ', ' + SELECTOR;\n\t\t\t},\n\t\t\t'before-sanity-check': env => {\n\t\t\t\t/** @type {HTMLPreElement} */\n\t\t\t\tconst pre = env.element;\n\t\t\t\tif (!pre.matches(SELECTOR)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst src = pre.getAttribute('data-jsonp');\n\t\t\t\tif (!src) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tenv.code = ''; // fast-path the whole thing and go to complete\n\n\t\t\t\t// mark as loading\n\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADING);\n\n\t\t\t\t// add code element with loading message\n\t\t\t\tconst code = pre.appendChild(document.createElement('CODE'));\n\t\t\t\tcode.textContent = LOADING_MESSAGE;\n\n\t\t\t\t// set language\n\t\t\t\tconst language = env.language;\n\t\t\t\tcode.className = 'language-' + language;\n\n\t\t\t\t// preload the language\n\t\t\t\t/** @type {import('../autoloader/autoloader.js').Autoloader} */\n\t\t\t\tconst autoloader = Prism.pluginRegistry.peek('autoloader')?.plugin;\n\t\t\t\tif (autoloader) {\n\t\t\t\t\tautoloader.preloadLanguages(language);\n\t\t\t\t}\n\n\t\t\t\tconst adapterName = pre.getAttribute('data-adapter');\n\t\t\t\t/** @type {Adapter | null} */\n\t\t\t\tlet adapter = null;\n\t\t\t\tif (adapterName) {\n\t\t\t\t\tconst global = getGlobal();\n\t\t\t\t\tif (typeof global[adapterName] === 'function') {\n\t\t\t\t\t\t/** @type {Adapter} */\n\t\t\t\t\t\tadapter = global[adapterName];\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// mark as failed\n\t\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_FAILED);\n\n\t\t\t\t\t\tcode.textContent = MISSING_ADAPTER_MESSAGE(adapterName);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tjsonp(\n\t\t\t\t\tsrc,\n\t\t\t\t\tpre.getAttribute('data-callback'),\n\t\t\t\t\tconfig.timeout,\n\t\t\t\t\tresponse => {\n\t\t\t\t\t\t// interpret the received data using the adapter(s)\n\t\t\t\t\t\tlet data;\n\t\t\t\t\t\tif (adapter) {\n\t\t\t\t\t\t\tdata = adapter(response, pre);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tdata = config.runAdapters(response, pre);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (data === null) {\n\t\t\t\t\t\t\t// mark as failed\n\t\t\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_FAILED);\n\n\t\t\t\t\t\t\tcode.textContent = UNKNOWN_FAILURE_MESSAGE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// mark as loaded\n\t\t\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADED);\n\n\t\t\t\t\t\t\tcode.textContent = data;\n\t\t\t\t\t\t\tPrism.highlightElement(code);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t() => {\n\t\t\t\t\t\t// mark as failed\n\t\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_FAILED);\n\n\t\t\t\t\t\tcode.textContent = TIMEOUT_MESSAGE(src);\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @callback Adapter\n * @param {any} response\n * @param {HTMLPreElement} pre\n * @returns {string | null}\n */\n\n/**\n * @typedef {import('../../core.js').Prism} Prism\n */\n"
  },
  {
    "path": "src/plugins/keep-markup/README.md",
    "content": "---\ntitle: Keep Markup\ndescription: Prevents custom markup from being dropped out during highlighting.\nowner: Golmote\noptional: normalize-whitespace\nnoCSS: true\n---\n\n<style>\n\t:where(pre, code)[class*=\"language-\"] mark {\n\t\tdisplay: inline-block;\n\t\tcolor: inherit;\n\t\tborder: 1px solid #000;\n\t\tbox-shadow: 0 0 2px #fff;\n\t\tpadding: 1px;\n\t\tbackground: rgb(0 0 0 / .2);\n\t}\n</style>\n\n<section class=\"language-none\">\n\n# How to use\n\nYou have nothing to do. The plugin is active by default. With this plugin loaded, all markup inside code will be kept.\n\nHowever, you can deactivate the plugin for certain code element by adding the `no-keep-markup` class to it. You can also deactivate the plugin for the whole page by adding the `no-keep-markup` class to the body of the page and then selectively activate it again by adding the `keep-markup` class to code elements.\n\n## Double highlighting\n\nSome plugins (e.g. [Autoloader](../autoloader)) need to re-highlight code blocks. This is a problem for Keep Markup because it will keep the markup of the first highlighting pass resulting in a lot of unnecessary DOM nodes and causing problems for themes and other plugins.\n\nThis problem can be fixed by adding a `drop-tokens` class to a code block or any of its ancestors. If `drop-tokens` is present, Keep Markup will ignore all `span.token`{ .language-css } elements created by Prism.\n\n</section>\n\n<section class=\"language-none\">\n\n# Examples\n\nThe following source code\n\n```html\n<pre><code class=\"language-css\">\n@media <mark>screen</mark> {\n\tdiv {\n\t\t<mark>text</mark>-decoration: <mark><mark>under</mark>line</mark>;\n\t\tback<mark>ground: url</mark>('foo.png');\n\t}\n}</code></pre>\n```\n\nwould render like this:\n\n<pre><code class=\"language-css\">\n@media <mark>screen</mark> {\n\tdiv {\n\t\t<mark>text</mark>-decoration: <mark><mark>under</mark>line</mark>;\n\t\tback<mark>ground: url</mark>('foo.png');\n\t}\n}</code></pre>\n\n<p>\n\tIt also works for inline code:\n\t<code class=\"language-javascript\">v<mark>ar b</mark>ar = <mark>func</mark>tion () { <mark>/*</mark> foo <mark>*</mark>/ };</code>\n</p>\n\n</section>\n"
  },
  {
    "path": "src/plugins/keep-markup/keep-markup.js",
    "content": "import prism from '../../global.js';\nimport { isActive } from '../../shared/dom-util.js';\n\n/**\n *\n * @param {ChildNode} child\n * @returns {child is Element}\n */\nfunction isElement (child) {\n\treturn child.nodeType === 1;\n}\n\n/**\n *\n * @param {ChildNode} child\n * @returns {child is Text}\n */\nfunction isText (child) {\n\treturn child.nodeType === 3;\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'keep-markup'>} */\nconst Self = {\n\tid: 'keep-markup',\n\toptional: 'normalize-whitespace',\n\teffect (Prism) {\n\t\treturn Prism.hooks.add({\n\t\t\t'before-highlight': env => {\n\t\t\t\tif (!env.element.children.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!isActive(env.element, 'keep-markup', true)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst dropTokens = isActive(env.element, 'drop-tokens', false);\n\t\t\t\t/**\n\t\t\t\t * Returns whether the given element should be kept.\n\t\t\t\t *\n\t\t\t\t * @param {Element} element\n\t\t\t\t * @returns {boolean}\n\t\t\t\t */\n\t\t\t\tfunction shouldKeep (element) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tdropTokens &&\n\t\t\t\t\t\telement.nodeName.toLowerCase() === 'span' &&\n\t\t\t\t\t\telement.classList.contains('token')\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tlet pos = 0;\n\t\t\t\t/** @type {NodeData[]} */\n\t\t\t\tconst data = [];\n\n\t\t\t\t/**\n\t\t\t\t * @param {Element} element\n\t\t\t\t */\n\t\t\t\tfunction processElement (element) {\n\t\t\t\t\tif (!shouldKeep(element)) {\n\t\t\t\t\t\t// don't keep this element and just process its children\n\t\t\t\t\t\tprocessChildren(element);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t/** @type {NodeData} */\n\t\t\t\t\tconst o = {\n\t\t\t\t\t\t// Store original element so we can restore it after highlighting\n\t\t\t\t\t\telement,\n\t\t\t\t\t\tposOpen: pos,\n\t\t\t\t\t\tposClose: NaN,\n\t\t\t\t\t};\n\t\t\t\t\tdata.push(o);\n\n\t\t\t\t\tprocessChildren(element);\n\n\t\t\t\t\to.posClose = pos;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * @param {Element} element\n\t\t\t\t */\n\t\t\t\tfunction processChildren (element) {\n\t\t\t\t\tfor (let i = 0, l = element.childNodes.length; i < l; i++) {\n\t\t\t\t\t\tconst child = element.childNodes[i];\n\t\t\t\t\t\tif (isElement(child)) {\n\t\t\t\t\t\t\tprocessElement(child);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (isText(child)) {\n\t\t\t\t\t\t\tpos += child.data.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tprocessChildren(env.element);\n\n\t\t\t\tif (data.length) {\n\t\t\t\t\t// data is an array of all existing tags\n\t\t\t\t\tenv.markupData = data;\n\t\t\t\t}\n\t\t\t},\n\t\t\t'after-highlight': env => {\n\t\t\t\t/** @type {NodeData[]} */\n\t\t\t\tconst data = env.markupData ?? [];\n\t\t\t\tif (data.length) {\n\t\t\t\t\t/**\n\t\t\t\t\t * @param {Element} elt\n\t\t\t\t\t * @param {NodeState} nodeState\n\t\t\t\t\t */\n\t\t\t\t\tconst walk = (elt, nodeState) => {\n\t\t\t\t\t\tfor (let i = 0, l = elt.childNodes.length; i < l; i++) {\n\t\t\t\t\t\t\tconst child = elt.childNodes[i];\n\n\t\t\t\t\t\t\tif (isElement(child)) {\n\t\t\t\t\t\t\t\tif (!walk(child, nodeState)) {\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (isText(child)) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!nodeState.start &&\n\t\t\t\t\t\t\t\t\tnodeState.pos + child.data.length > nodeState.node.posOpen\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// We found the start position\n\t\t\t\t\t\t\t\t\tnodeState.start = [\n\t\t\t\t\t\t\t\t\t\tchild,\n\t\t\t\t\t\t\t\t\t\tnodeState.node.posOpen - nodeState.pos,\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tnodeState.start &&\n\t\t\t\t\t\t\t\t\tnodeState.pos + child.data.length >= nodeState.node.posClose\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// We found the end position\n\t\t\t\t\t\t\t\t\tnodeState.end = [\n\t\t\t\t\t\t\t\t\t\tchild,\n\t\t\t\t\t\t\t\t\t\tnodeState.node.posClose - nodeState.pos,\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tnodeState.pos += child.data.length;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (nodeState.start && nodeState.end) {\n\t\t\t\t\t\t\t\t// Select the range and wrap it with the element\n\t\t\t\t\t\t\t\tconst range = document.createRange();\n\t\t\t\t\t\t\t\trange.setStart(...nodeState.start);\n\t\t\t\t\t\t\t\trange.setEnd(...nodeState.end);\n\t\t\t\t\t\t\t\tnodeState.node.element.innerHTML = '';\n\t\t\t\t\t\t\t\tnodeState.node.element.appendChild(range.extractContents());\n\t\t\t\t\t\t\t\trange.insertNode(nodeState.node.element);\n\t\t\t\t\t\t\t\trange.detach();\n\n\t\t\t\t\t\t\t\t// Process is over\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t};\n\n\t\t\t\t\t// For each tag, we walk the DOM to reinsert it\n\t\t\t\t\tdata.forEach(node => {\n\t\t\t\t\t\twalk(env.element, { node, pos: 0 });\n\t\t\t\t\t});\n\t\t\t\t\t// Store new highlightedCode for later hooks calls\n\t\t\t\t\tenv.highlightedCode = env.element.innerHTML;\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @typedef {object} NodeData\n * @property {Element} element\n * @property {number} posOpen\n * @property {number} posClose\n */\n\n/**\n * @typedef {[node: Text, pos: number]} End\n */\n\n/**\n * @typedef {object} NodeState\n * @property {NodeData} node\n * @property {number} pos\n * @property {End} [start]\n * @property {End} [end]\n */\n"
  },
  {
    "path": "src/plugins/line-highlight/README.md",
    "content": "---\ntitle: Line Highlight\ndescription: Highlights specific lines and/or line ranges.\nowner: LeaVerou\nresources:\n  - /plugins/line-numbers.css\n  - /plugins/line-numbers.js { type=\"module\" }\n---\n\n<section class=\"language-markup\">\n\n# How to use\n\nObviously, this only works on code blocks (`<pre><code>`) and not for inline code.\n\nYou specify the lines to be highlighted through the `data-line` attribute on the `<pre>` element, in the following simple format:\n\n- A single number refers to the line with that number\n- Ranges are denoted by two numbers, separated with a hyphen (-)\n- Multiple line numbers or ranges are separated by commas.\n- Whitespace is allowed anywhere and will be stripped off.\n\nExamples:\n\n5\n\n: The 5th line\n\n1-5\n\n: Lines 1 through 5\n\n1,4\n\n: Line 1 and line 4\n\n1-2, 5, 9-20\n\n: Lines 1 through 2, line 5, lines 9 through 20\n\nIn case you want the line numbering to be offset by a certain number (for example, you want the 1st line to be number 41 instead of 1, which is an offset of 40), you can additionally use the `data-line-offset` attribute.\n\nYou can also link to specific lines on any code snippet, by using the following as a url hash: `#{element-id}.{lines}` where `{element-id}` is the id of the `<pre>` element and `{lines}` is one or more lines or line ranges that follow the format outlined above. For example, if there is an element with `id=\"play\"` on the page, you can link to lines 5-6 by linking to [#play.5-6](#play.5-6)\n\nIf line numbers are also enabled for a code block and the `<pre>` element has an id, you can add the `linkable-line-numbers` class to the `<pre>` element. This will make all line numbers clickable and when clicking any line number, it will change the hash of the current page to link to that specific line.\n\n</section>\n\n<section>\n\n# Examples\n\n## Line 2\n\n<pre data-line=\"2\" data-src=\"./line-highlight.js\" id=\"play\"></pre>\n\n## Lines 15-25\n\n<pre data-line=\"15-25\" data-src=\"./line-highlight.js\"></pre>\n\n## Line 1 and lines 3-4 and line 42\n\n<pre data-line=\"1,3-4,42\" data-src=\"./line-highlight.js\"></pre>\n\n## Line 43, starting from line 41\n\n<pre data-line=\"43\" data-line-offset=\"40\" data-src=\"./line-highlight.js\"></pre>\n\n[Linking example](#play.50-55,60)\n\n## Compatible with [Line numbers](../line-numbers)\n\n<pre class=\"line-numbers\" data-src=\"../line-numbers/index.html\" data-line=\"1\" data-start=\"-5\" style=\"white-space: pre-wrap\"></pre>\n\nEven with some extra content before the `code` element.\n\n<pre class=\"line-numbers\" data-line=\"7\"><div style=\"padding: .25em\">Some content</div><hr/><code class=\"language-markup\" id=\"foo\"></code></pre>\n<script>document.querySelector(\"#foo\").textContent = document.documentElement.innerHTML;</script>\n\n## With linkable line numbers\n\n<pre id=\"linkable\" class=\"line-numbers linkable-line-numbers\" data-start=\"20\" data-src=\"./line-highlight.js\"></pre>\n\n</section>\n"
  },
  {
    "path": "src/plugins/line-highlight/line-highlight.css",
    "content": "pre[data-line] {\n\tposition: relative;\n\tpadding: 1em 0 1em 3em;\n}\n\n.line-highlight {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\tpadding: inherit 0;\n\tmargin-top: 1em; /* Same as .prism’s padding-top */\n\n\tbackground: hsla(24, 20%, 50%, 0.08);\n\tbackground: linear-gradient(to right, hsla(24, 20%, 50%, 0.1) 70%, hsla(24, 20%, 50%, 0));\n\n\tpointer-events: none;\n\n\tline-height: inherit;\n\twhite-space: pre;\n}\n\n@media print {\n\t.line-highlight {\n\t\t/*\n\t\t * This will prevent browsers from replacing the background color with white.\n\t\t * It's necessary because the element is layered on top of the displayed code.\n\t\t */\n\t\t-webkit-print-color-adjust: exact;\n\t\tcolor-adjust: exact;\n\t}\n}\n\n.line-highlight:before,\n.line-highlight[data-end]:after {\n\tcontent: attr(data-start);\n\tposition: absolute;\n\ttop: 0.4em;\n\tleft: 0.6em;\n\tmin-width: 1em;\n\tpadding: 0 0.5em;\n\tbackground-color: hsla(24, 20%, 50%, 0.4);\n\tcolor: hsl(24, 20%, 95%);\n\tfont: bold 65%/1.5 sans-serif;\n\ttext-align: center;\n\tvertical-align: 0.3em;\n\tborder-radius: 999px;\n\ttext-shadow: none;\n\tbox-shadow: 0 1px white;\n}\n\n.line-highlight[data-end]:after {\n\tcontent: attr(data-end);\n\ttop: auto;\n\tbottom: 0.4em;\n}\n\n.line-numbers .line-highlight:before,\n.line-numbers .line-highlight:after {\n\tcontent: none;\n}\n\npre[id].linkable-line-numbers span.line-numbers-rows {\n\tpointer-events: all;\n}\npre[id].linkable-line-numbers span.line-numbers-rows > span:before {\n\tcursor: pointer;\n}\npre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before {\n\tbackground-color: rgba(128, 128, 128, 0.2);\n}\n"
  },
  {
    "path": "src/plugins/line-highlight/line-highlight.js",
    "content": "import prism from '../../global.js';\nimport { isActive } from '../../shared/dom-util.js';\nimport { lazy, noop } from '../../shared/util.js';\nimport { combineCallbacks } from '../../util/combine-callbacks.js';\n\nconst LINE_NUMBERS_CLASS = 'line-numbers';\nconst LINKABLE_LINE_NUMBERS_CLASS = 'linkable-line-numbers';\nconst NEW_LINE_EXP = /\\n(?!$)/g;\n\n/**\n *\n * @param {string} selector\n * @param {ParentNode} [container=document]\n * @returns {Element[]}\n */\nfunction $$ (selector, container = document) {\n\treturn [...container.querySelectorAll(selector)];\n}\n\n/**\n * Returns the top offset of the content box of the given parent and the content box of one of its children.\n *\n * @param {HTMLElement} parent\n * @param {HTMLElement} child\n * @returns {number}\n */\nfunction getContentBoxTopOffset (parent, child) {\n\tconst parentStyle = getComputedStyle(parent);\n\tconst childStyle = getComputedStyle(child);\n\n\t/**\n\t * Returns the numeric value of the given pixel value.\n\t *\n\t * @param {string} px\n\t * @returns {number}\n\t */\n\tfunction pxToNumber (px) {\n\t\treturn +px.substr(0, px.length - 2);\n\t}\n\n\treturn (\n\t\tchild.offsetTop +\n\t\tpxToNumber(childStyle.borderTopWidth) +\n\t\tpxToNumber(childStyle.paddingTop) -\n\t\tpxToNumber(parentStyle.paddingTop)\n\t);\n}\n\n/**\n * Returns whether the given element has the given class.\n *\n * @param {Element} element\n * @param {string} className\n * @returns {boolean}\n */\nfunction hasClass (element, className) {\n\treturn element.classList.contains(className);\n}\n\n/**\n * Calls the given function.\n *\n * @param {() => void} func\n * @returns {void}\n */\nfunction callFunction (func) {\n\tfunc();\n}\n\n// Some browsers round the line-height, others don't.\n// We need to test for it to position the elements properly.\nconst isLineHeightRounded = lazy(() => {\n\tconst d = document.createElement('div');\n\td.style.fontSize = '13px';\n\td.style.lineHeight = '1.5';\n\td.style.padding = '0';\n\td.style.border = '0';\n\td.innerHTML = '&nbsp;<br />&nbsp;';\n\tdocument.body.appendChild(d);\n\t// Browsers that round the line-height should have offsetHeight === 38\n\t// The others should have 39.\n\tconst result = d.offsetHeight === 38;\n\tdocument.body.removeChild(d);\n\treturn result;\n});\n\nexport class LineHighlight {\n\t/**\n\t * @package\n\t */\n\tscrollIntoView = true;\n\t/** @type {Prism} */\n\tPrism;\n\n\t/**\n\t * @param {Prism} Prism\n\t */\n\tconstructor (Prism) {\n\t\tthis.Prism = Prism;\n\t}\n\t/**\n\t * Highlights the lines of the given pre.\n\t *\n\t * This function is split into a DOM measuring and mutate phase to improve performance.\n\t * The returned function mutates the DOM when called.\n\t *\n\t * @param {HTMLElement} pre\n\t * @param {string | null} [lines]\n\t * @param {string} [classes='']\n\t */\n\thighlightLines (pre, lines, classes = '') {\n\t\tlines = typeof lines === 'string' ? lines : pre.getAttribute('data-line') || '';\n\n\t\tconst ranges = lines.replace(/\\s+/g, '').split(',').filter(Boolean);\n\t\tconst offset = Number(pre.getAttribute('data-line-offset')) || 0;\n\n\t\tconst parseMethod = isLineHeightRounded() ? parseInt : parseFloat;\n\t\tconst lineHeight = parseMethod(getComputedStyle(pre).lineHeight);\n\t\tconst hasLineNumbers = isActive(pre, LINE_NUMBERS_CLASS);\n\t\tconst codeElement = pre.querySelector('code');\n\t\tconst parentElement = hasLineNumbers ? pre : codeElement || pre;\n\t\t/** @type {(function():void)[]} */\n\t\tconst mutateActions = [];\n\t\tconst lineBreakMatch = codeElement?.textContent?.match(NEW_LINE_EXP);\n\t\tconst numberOfLines = lineBreakMatch ? lineBreakMatch.length + 1 : 1;\n\t\t/**\n\t\t * The top offset between the content box of the <code> element and the content box of the parent element of\n\t\t * the line highlight element (either `<pre>` or `<code>`).\n\t\t *\n\t\t * This offset might not be zero for some themes where the <code> element has a top margin. Some plugins\n\t\t * (or users) might also add element above the <code> element. Because the line highlight is aligned relative\n\t\t * to the <pre> element, we have to take this into account.\n\t\t *\n\t\t * This offset will be 0 if the parent element of the line highlight element is the `<code>` element.\n\t\t */\n\t\tconst codePreOffset =\n\t\t\t!codeElement || parentElement === codeElement\n\t\t\t\t? 0\n\t\t\t\t: getContentBoxTopOffset(pre, codeElement);\n\n\t\tranges.forEach(currentRange => {\n\t\t\tconst range = currentRange.split('-');\n\n\t\t\tconst start = +range[0];\n\t\t\tlet end = +range[1] || start;\n\t\t\tend = Math.min(numberOfLines + offset, end);\n\n\t\t\tif (end < start) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t/** @type {HTMLElement} */\n\t\t\tconst line =\n\t\t\t\tpre.querySelector('.line-highlight[data-range=\"' + currentRange + '\"]') ||\n\t\t\t\tdocument.createElement('div');\n\n\t\t\tmutateActions.push(() => {\n\t\t\t\tline.setAttribute('aria-hidden', 'true');\n\t\t\t\tline.setAttribute('data-range', currentRange);\n\t\t\t\tline.className = classes + ' line-highlight';\n\t\t\t});\n\n\t\t\t// if the line-numbers plugin is enabled, then there is no reason for this plugin to display the line numbers\n\t\t\tif (hasLineNumbers && this.Prism.pluginRegistry.peek('line-numbers')?.plugin) {\n\t\t\t\t/** @type {LineNumbers} */\n\t\t\t\tconst lineNumbers = this.Prism.pluginRegistry.peek('line-numbers')?.plugin;\n\t\t\t\tconst startNode = lineNumbers.getLine(pre, start);\n\t\t\t\tconst endNode = lineNumbers.getLine(pre, end);\n\n\t\t\t\tif (startNode) {\n\t\t\t\t\tconst top = `${startNode.offsetTop + codePreOffset}px`;\n\t\t\t\t\tmutateActions.push(() => {\n\t\t\t\t\t\tline.style.top = top;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (startNode && endNode) {\n\t\t\t\t\tconst height = `${endNode.offsetTop - startNode.offsetTop + endNode.offsetHeight}px`;\n\t\t\t\t\tmutateActions.push(() => {\n\t\t\t\t\t\tline.style.height = height;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmutateActions.push(() => {\n\t\t\t\t\tline.setAttribute('data-start', String(start));\n\n\t\t\t\t\tif (end > start) {\n\t\t\t\t\t\tline.setAttribute('data-end', String(end));\n\t\t\t\t\t}\n\n\t\t\t\t\tline.style.top = `${(start - offset - 1) * lineHeight + codePreOffset}px`;\n\n\t\t\t\t\tline.textContent = new Array(end - start + 2).join(' \\n');\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tmutateActions.push(() => {\n\t\t\t\tline.style.width = `${pre.scrollWidth}px`;\n\t\t\t});\n\n\t\t\tmutateActions.push(() => {\n\t\t\t\t// allow this to play nicely with the line-numbers plugin\n\t\t\t\t// need to attack to pre as when line-numbers is enabled, the code tag is relatively which screws up the positioning\n\t\t\t\tparentElement.appendChild(line);\n\t\t\t});\n\t\t});\n\n\t\tconst id = pre.id;\n\t\tif (\n\t\t\thasLineNumbers &&\n\t\t\tthis.Prism.pluginRegistry.peek('line-numbers')?.plugin &&\n\t\t\tisActive(pre, LINKABLE_LINE_NUMBERS_CLASS) &&\n\t\t\tid\n\t\t) {\n\t\t\t// This implements linkable line numbers. Linkable line numbers use Line Highlight to create a link to a\n\t\t\t// specific line. For this to work, the pre element has to:\n\t\t\t//  1) have line numbers,\n\t\t\t//  2) have the `linkable-line-numbers` class or an ascendant that has that class, and\n\t\t\t//  3) have an id.\n\n\t\t\tif (!hasClass(pre, LINKABLE_LINE_NUMBERS_CLASS)) {\n\t\t\t\t// add class to pre\n\t\t\t\tmutateActions.push(() => {\n\t\t\t\t\tpre.classList.add(LINKABLE_LINE_NUMBERS_CLASS);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst start = parseInt(pre.getAttribute('data-start') || '1');\n\n\t\t\t// iterate all line number spans\n\t\t\t/** @type {LineNumbers} */\n\t\t\tconst lineNumbers = this.Prism.pluginRegistry.peek('line-numbers')?.plugin;\n\t\t\tlineNumbers.getLines(pre)?.forEach((lineSpan, i) => {\n\t\t\t\tconst lineNumber = i + start;\n\t\t\t\tlineSpan.onclick = () => {\n\t\t\t\t\tconst hash = `${id}.${lineNumber}`;\n\n\t\t\t\t\t// this will prevent scrolling since the span is obviously in view\n\t\t\t\t\tthis.scrollIntoView = false;\n\t\t\t\t\tlocation.hash = hash;\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.scrollIntoView = true;\n\t\t\t\t\t}, 1);\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\n\t\treturn function () {\n\t\t\tmutateActions.forEach(callFunction);\n\t\t};\n\t}\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'line-highlight'>} */\nconst Self = {\n\tid: 'line-highlight',\n\toptional: 'line-numbers',\n\tplugin (Prism) {\n\t\treturn new LineHighlight(Prism);\n\t},\n\teffect (Prism) {\n\t\tif (typeof document === 'undefined') {\n\t\t\treturn noop;\n\t\t}\n\n\t\t/**\n\t\t * Returns whether the Line Highlight plugin is active for the given element.\n\t\t *\n\t\t * If this function returns `false`, do not call `highlightLines` for the given element.\n\t\t *\n\t\t * @param {Element | null | undefined} pre\n\t\t * @returns {pre is HTMLPreElement}\n\t\t */\n\t\tfunction isActiveFor (pre) {\n\t\t\tif (!pre || !/pre/i.test(pre.nodeName)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (pre.hasAttribute('data-line')) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (pre.id && isActive(pre, LINKABLE_LINE_NUMBERS_CLASS)) {\n\t\t\t\t// Technically, the line numbers plugin is also necessary but this plugin doesn't control the classes of\n\t\t\t\t// the line numbers plugin, so we can't assume that they are present.\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tconst applyHash = () => {\n\t\t\tconst hash = location.hash.slice(1);\n\n\t\t\t// Remove pre-existing temporary lines\n\t\t\t$$('.temporary.line-highlight').forEach(line => {\n\t\t\t\tline.remove();\n\t\t\t});\n\n\t\t\tconst range = (hash.match(/\\.([\\d,-]+)$/) || [, ''])[1];\n\n\t\t\tif (!range || document.getElementById(hash)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst id = hash.slice(0, hash.lastIndexOf('.'));\n\t\t\tconst pre = document.getElementById(id);\n\n\t\t\tif (!pre) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!pre.hasAttribute('data-line')) {\n\t\t\t\tpre.setAttribute('data-line', '');\n\t\t\t}\n\n\t\t\t/** @type {LineHighlight} */\n\t\t\tconst lineHighlight = Prism.pluginRegistry.peek(Self)?.plugin;\n\t\t\tconst mutateDom = lineHighlight.highlightLines(pre, range, 'temporary ');\n\t\t\tmutateDom();\n\n\t\t\tif (lineHighlight.scrollIntoView) {\n\t\t\t\tdocument.querySelector('.temporary.line-highlight')?.scrollIntoView();\n\t\t\t}\n\t\t};\n\t\tconst onResize = () => {\n\t\t\t$$('pre')\n\t\t\t\t.filter(isActiveFor)\n\t\t\t\t.map(pre => {\n\t\t\t\t\t/** @type {LineHighlight} */\n\t\t\t\t\tconst lineHighlight = Prism.pluginRegistry.peek(Self)?.plugin;\n\t\t\t\t\treturn lineHighlight.highlightLines(pre);\n\t\t\t\t})\n\t\t\t\t.forEach(callFunction);\n\t\t};\n\n\t\twindow.addEventListener('hashchange', applyHash);\n\t\twindow.addEventListener('resize', onResize);\n\n\t\tconst removeEventListeners = () => {\n\t\t\twindow.removeEventListener('hashchange', applyHash);\n\t\t\twindow.removeEventListener('resize', onResize);\n\t\t};\n\n\t\t/** @type {number | NodeJS.Timeout | undefined} */\n\t\tlet fakeTimer = undefined; // Hack to limit the number of times applyHash() runs\n\n\t\tconst beforeSanityHook = Prism.hooks.add('before-sanity-check', env => {\n\t\t\tconst pre = env.element.parentElement;\n\t\t\tif (!isActiveFor(pre)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Cleanup for other plugins (e.g. autoloader).\n\t\t\t *\n\t\t\t * Sometimes <code> blocks are highlighted multiple times. It is necessary\n\t\t\t * to cleanup any left-over tags, because the whitespace inside of the <div>\n\t\t\t * tags change the content of the <code> tag.\n\t\t\t */\n\t\t\tlet num = 0;\n\t\t\t$$('.line-highlight', pre).forEach(line => {\n\t\t\t\tnum += (line.textContent || '').length;\n\t\t\t\tline.remove();\n\t\t\t});\n\t\t\t// Remove extra whitespace\n\t\t\tif (num && /^(?: \\n)+$/.test(env.code.slice(-num))) {\n\t\t\t\tenv.code = env.code.slice(0, -num);\n\t\t\t}\n\t\t});\n\n\t\tconst completeHook = Prism.hooks.add('complete', env => {\n\t\t\tconst pre = env.element.parentElement;\n\t\t\tif (!isActiveFor(pre)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (fakeTimer !== undefined) {\n\t\t\t\tclearTimeout(fakeTimer);\n\t\t\t}\n\n\t\t\t/** @type {LineHighlight} */\n\t\t\tconst lineHighlight = Prism.pluginRegistry.peek(Self)?.plugin;\n\t\t\tconst mutateDom = lineHighlight.highlightLines(pre);\n\t\t\tmutateDom();\n\t\t\tfakeTimer = setTimeout(applyHash, 1);\n\t\t});\n\n\t\treturn combineCallbacks(removeEventListeners, beforeSanityHook, completeHook);\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @typedef {import('../../core.js').Prism} Prism\n * @typedef {import('../line-numbers/line-numbers.js').LineNumbers} LineNumbers\n */\n"
  },
  {
    "path": "src/plugins/line-numbers/README.md",
    "content": "---\ntitle: Line Numbers\ndescription: Line number at the beginning of code lines.\nowner: kuba-kubula\n---\n\n<section class=\"language-markup\">\n\n# How to use\n\nObviously, this is supposed to work only for code blocks (`<pre><code>`) and not for inline code.\n\nAdd the `line-numbers` class to your desired `<pre>` or any of its ancestors, and the Line Numbers plugin will take care of the rest. To give all code blocks line numbers, add the `line-numbers` class to the `<body>` of the page. This is part of a general activation mechanism where adding the `line-numbers` (or `no-line-numbers`) class to any element will enable (or disable) the Line Numbers plugin for all code blocks in that element.  \nExample:\n\n```html\n<body class=\"line-numbers\"> <!-- enabled for the whole page -->\n\n\t<!-- with line numbers -->\n\t<pre><code>...</code></pre>\n\t<!-- disabled for a specific element - without line numbers -->\n\t<pre class=\"no-line-numbers\"><code>...</code></pre>\n\n\t<div class=\"no-line-numbers\"> <!-- disabled for this subtree -->\n\n\t\t<!-- without line numbers -->\n\t\t<pre><code>...</code></pre>\n\t\t<!-- enabled for a specific element - with line numbers -->\n\t\t<pre class=\"line-numbers\"><code>...</code></pre>\n\n\t</div>\n</body>\n```\n\nOptional: You can specify the `data-start` (Number) attribute on the `<pre>` element. It will shift the line counter.\n\nOptional: To support multiline line numbers using soft wrap, apply the CSS `white-space: pre-line;` or `white-space: pre-wrap;` to your desired `<pre>`.\n\n</section>\n\n<section class=\"line-numbers language-none\">\n\n# Examples\n\n## JavaScript\n\n<pre class=\"line-numbers\" data-src=\"./line-numbers.js\"></pre>\n\n## CSS\n\nPlease note that this `<pre>` does not have the `line-numbers` class but its parent does.\n\n<pre data-src=\"./line-numbers.css\"></pre>\n\n## HTML\n\nPlease note the `data-start=\"-5\"` in the code below.\n\n<pre class=\"line-numbers\" data-src=\"./index.html\" data-start=\"-5\"></pre>\n\n## Unknown languages\n\n```{ .language-none .line-numbers }\nThis raw text\nis not highlighted\nbut it still has\nline numbers\n```\n\n## Soft wrap support\n\nPlease note the `style=\"white-space: pre-wrap;\"` in the code below.\n\n<pre class=\"line-numbers\" data-src=\"./index.html\" data-start=\"-5\" style=\"white-space: pre-wrap;\"></pre>\n\n</section>\n"
  },
  {
    "path": "src/plugins/line-numbers/line-numbers.css",
    "content": "pre[class*=\"language-\"].line-numbers {\n\tposition: relative;\n\tpadding-left: 3.8em;\n\tcounter-reset: linenumber;\n}\n\npre[class*=\"language-\"].line-numbers > code {\n\tposition: relative;\n\twhite-space: inherit;\n}\n\n.line-numbers .line-numbers-rows {\n\tposition: absolute;\n\tpointer-events: none;\n\ttop: 0;\n\tfont-size: 100%;\n\tleft: -3.8em;\n\twidth: 3em; /* works for line-numbers below 1000 lines */\n\tletter-spacing: -1px;\n\tborder-right: 1px solid #999;\n\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.line-numbers-rows > span {\n\tdisplay: block;\n\tcounter-increment: linenumber;\n}\n\n.line-numbers-rows > span:before {\n\tcontent: counter(linenumber);\n\tcolor: #999;\n\tdisplay: block;\n\tpadding-right: 0.8em;\n\ttext-align: right;\n}\n"
  },
  {
    "path": "src/plugins/line-numbers/line-numbers.js",
    "content": "import prism from '../../global.js';\nimport { getParentPre, isActive } from '../../shared/dom-util.js';\nimport { isNonNull, noop } from '../../shared/util.js';\nimport { combineCallbacks } from '../../util/combine-callbacks.js';\n\n/**\n * Plugin name which is used as a class name for <pre> which is activating the plugin\n */\nconst PLUGIN_NAME = 'line-numbers';\n\n/**\n * Regular expression used for determining line breaks\n */\nconst NEW_LINE_EXP = /\\n(?!$)/g;\n\n/**\n * Queries for the `line-numbers-rows` element.\n *\n * @param {Element} element\n * @returns {HTMLElement | null}\n */\nfunction getLineNumbersRows (element) {\n\treturn element.querySelector('.line-numbers-rows');\n}\n\n/**\n * Resizes the given elements.\n *\n * @param {Element[]} elements\n */\nfunction resizeElements (elements) {\n\telements = elements.filter(e => {\n\t\tconst codeStyles = getComputedStyle(e);\n\t\tconst whiteSpace = codeStyles.whiteSpace;\n\t\treturn whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line';\n\t});\n\n\tif (elements.length === 0) {\n\t\treturn;\n\t}\n\n\tconst infos = /** @type {Info[]} */ (\n\t\telements\n\t\t\t.map(element => {\n\t\t\t\tconst codeElement = element.querySelector('code');\n\t\t\t\tconst lineNumbersWrapper = getLineNumbersRows(element);\n\t\t\t\tif (!codeElement || !lineNumbersWrapper) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\t/** @type {HTMLElement | null} */\n\t\t\t\tlet lineNumberSizer = element.querySelector('.line-numbers-sizer');\n\t\t\t\t// @ts-expect-error - codeElement.textContent is not null\n\t\t\t\tconst codeLines = codeElement.textContent.split(NEW_LINE_EXP);\n\n\t\t\t\tif (!lineNumberSizer) {\n\t\t\t\t\tlineNumberSizer = document.createElement('span');\n\t\t\t\t\tlineNumberSizer.className = 'line-numbers-sizer';\n\n\t\t\t\t\tcodeElement.appendChild(lineNumberSizer);\n\t\t\t\t}\n\n\t\t\t\tlineNumberSizer.innerHTML = '0';\n\t\t\t\tlineNumberSizer.style.display = 'block';\n\n\t\t\t\tconst oneLinerHeight = lineNumberSizer.getBoundingClientRect().height;\n\t\t\t\tlineNumberSizer.innerHTML = '';\n\n\t\t\t\treturn {\n\t\t\t\t\telement,\n\t\t\t\t\tlines: codeLines,\n\t\t\t\t\tlineHeights: [],\n\t\t\t\t\toneLinerHeight,\n\t\t\t\t\tsizer: lineNumberSizer,\n\t\t\t\t\twrapper: lineNumbersWrapper,\n\t\t\t\t};\n\t\t\t})\n\t\t\t.filter(isNonNull)\n\t);\n\n\tinfos.forEach(info => {\n\t\tconst lineNumberSizer = info.sizer;\n\t\tconst lines = info.lines;\n\t\tconst lineHeights = info.lineHeights;\n\t\tconst oneLinerHeight = info.oneLinerHeight;\n\n\t\tlineHeights[lines.length - 1] = undefined;\n\t\tlines.forEach((line, index) => {\n\t\t\tif (line && line.length > 1) {\n\t\t\t\tconst e = lineNumberSizer.appendChild(document.createElement('span'));\n\t\t\t\te.style.display = 'block';\n\t\t\t\te.textContent = line;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlineHeights[index] = oneLinerHeight;\n\t\t\t}\n\t\t});\n\t});\n\n\tinfos.forEach(info => {\n\t\tconst lineNumberSizer = info.sizer;\n\t\tconst lineHeights = info.lineHeights;\n\n\t\tlet childIndex = 0;\n\t\tfor (let i = 0; i < lineHeights.length; i++) {\n\t\t\tif (lineHeights[i] === undefined) {\n\t\t\t\tlineHeights[i] =\n\t\t\t\t\tlineNumberSizer.children[childIndex++].getBoundingClientRect().height;\n\t\t\t}\n\t\t}\n\t});\n\n\tinfos.forEach(info => {\n\t\tconst lineNumberSizer = info.sizer;\n\n\t\tlineNumberSizer.style.display = 'none';\n\t\tlineNumberSizer.innerHTML = '';\n\n\t\tinfo.lineHeights.forEach((height, lineNumber) => {\n\t\t\tif (height !== undefined) {\n\t\t\t\tconst child = /** @type {HTMLElement} */ (info.wrapper.children[lineNumber]);\n\t\t\t\tchild.style.height = `${height}px`;\n\t\t\t}\n\t\t});\n\t});\n}\n\nexport class LineNumbers {\n\t/**\n\t * Whether the plugin can assume that the units font sizes and margins are not depended on the size of\n\t * the current viewport.\n\t *\n\t * Setting this to `true` will allow the plugin to do certain optimizations for better performance.\n\t *\n\t * Set this to `false` if you use any of the following CSS units: `vh`, `vw`, `vmin`, `vmax`.\n\t */\n\tassumeViewportIndependence = true;\n\n\t/**\n\t * Get node for provided line number\n\t *\n\t * @param {Element} element pre element\n\t * @param {number} number number\n\t * @returns {HTMLElement | undefined}\n\t */\n\tgetLine (element, number) {\n\t\tif (element.tagName !== 'PRE' || !element.classList.contains(PLUGIN_NAME)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lineNumberRows = getLineNumbersRows(element);\n\t\tif (!lineNumberRows) {\n\t\t\treturn;\n\t\t}\n\t\tconst lineNumberStart = parseInt(String(element.getAttribute('data-start')), 10) || 1;\n\t\tconst lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);\n\n\t\tif (number < lineNumberStart) {\n\t\t\tnumber = lineNumberStart;\n\t\t}\n\t\tif (number > lineNumberEnd) {\n\t\t\tnumber = lineNumberEnd;\n\t\t}\n\n\t\tconst lineIndex = number - lineNumberStart;\n\n\t\treturn /** @type {HTMLElement} */ (lineNumberRows.children[lineIndex]);\n\t}\n\n\t/**\n\t * Returns the nodes of all line numbers.\n\t *\n\t * @param {Element} element pre element\n\t * @returns {HTMLElement[] | undefined}\n\t */\n\tgetLines (element) {\n\t\tif (element.tagName !== 'PRE' || !element.classList.contains(PLUGIN_NAME)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lineNumberRows = getLineNumbersRows(element);\n\t\tif (!lineNumberRows) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn /** @type {HTMLElement[]} */ ([...lineNumberRows.children]);\n\t}\n\n\t/**\n\t * Resizes the line numbers of the given element.\n\t *\n\t * This function will not add line numbers. It will only resize existing ones.\n\t *\n\t * @param {Element} element A `<pre>` element with line numbers.\n\t * @returns {void}\n\t */\n\tresize (element) {\n\t\tresizeElements([element]);\n\t}\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'line-numbers'>} */\nconst Self = {\n\tid: 'line-numbers',\n\tplugin () {\n\t\treturn new LineNumbers();\n\t},\n\teffect (Prism) {\n\t\tif (typeof document === 'undefined') {\n\t\t\treturn noop;\n\t\t}\n\n\t\tlet lastWidth = NaN;\n\t\tconst listener = () => {\n\t\t\t/** @type {LineNumbers} */\n\t\t\tconst lineNumbers = Prism.pluginRegistry.peek(Self)?.plugin;\n\t\t\tif (lineNumbers.assumeViewportIndependence && lastWidth === window.innerWidth) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastWidth = window.innerWidth;\n\n\t\t\tresizeElements([...document.querySelectorAll('pre.' + PLUGIN_NAME)]);\n\t\t};\n\t\twindow.addEventListener('resize', listener);\n\t\tconst removeListener = () => {\n\t\t\twindow.removeEventListener('resize', listener);\n\t\t};\n\n\t\tconst completeHook = Prism.hooks.add('complete', env => {\n\t\t\tif (!env.code) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst code = env.element;\n\t\t\tconst pre = getParentPre(code);\n\n\t\t\t// works only for <code> wrapped inside <pre> (not inline)\n\t\t\tif (!pre) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Abort if line numbers already exists\n\t\t\tif (getLineNumbersRows(code)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// only add line numbers if <code> or one of its ancestors has the `line-numbers` class\n\t\t\tif (!isActive(code, PLUGIN_NAME)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Remove the class 'line-numbers' from the <code>\n\t\t\tcode.classList.remove(PLUGIN_NAME);\n\t\t\t// Add the class 'line-numbers' to the <pre>\n\t\t\tpre.classList.add(PLUGIN_NAME);\n\n\t\t\tconst match = env.code.match(NEW_LINE_EXP);\n\t\t\tconst linesNum = match ? match.length + 1 : 1;\n\n\t\t\tconst lineNumbersWrapper = document.createElement('span');\n\t\t\tlineNumbersWrapper.setAttribute('aria-hidden', 'true');\n\t\t\tlineNumbersWrapper.className = 'line-numbers-rows';\n\t\t\tlineNumbersWrapper.innerHTML = '<span></span>'.repeat(linesNum);\n\n\t\t\tif (pre.hasAttribute('data-start')) {\n\t\t\t\tpre.style.counterReset = `linenumber ${parseInt(String(pre.getAttribute('data-start')), 10) - 1}`;\n\t\t\t}\n\n\t\t\tenv.element.appendChild(lineNumbersWrapper);\n\n\t\t\tresizeElements([pre]);\n\t\t});\n\n\t\treturn combineCallbacks(removeListener, completeHook);\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @typedef {object} Info\n * @property {Element} element\n * @property {string[]} lines\n * @property {(number | undefined)[]} lineHeights\n * @property {number} oneLinerHeight\n * @property {HTMLElement} sizer\n * @property {HTMLElement} wrapper\n */\n"
  },
  {
    "path": "src/plugins/match-braces/README.md",
    "content": "---\ntitle: Match braces\ndescription: Highlights matching braces.\nowner: RunDevelopment\nresources: /plugins/autoloader.js { type=\"module\" }\n---\n\n<section class=\"language-markup\">\n\n# How to use\n\nTo enable this plugin add the `match-braces` class to a code block:\n\n```html\n<pre><code class=\"language-xxxx match-braces\">...</pre></code>\n```\n\nJust like `language-xxxx`, the `match-braces` class is inherited, so you can add the class to the `<body>` to enable the plugin for the whole page.\n\nThe plugin will highlight brace pairs when the cursor hovers over one of the braces. The highlighting effect will disappear as soon as the cursor leaves the brace pair.  \nThe hover effect can be disabled by adding the `no-brace-hover` to the code block. This class can also be inherited.\n\nYou can also click on a brace to select the brace pair. To deselect the pair, click anywhere within the code block or select another pair.  \nThe selection effect can be disabled by adding the `no-brace-select` to the code block. This class can also be inherited.\n\n## Rainbow braces 🌈\n\nTo enable rainbow braces, simply add the `rainbow-braces` class to a code block. This class can also get inherited.\n\n</section>\n\n<section class=\"match-braces language-none\">\n\n# Examples\n\n## JavaScript\n\n<pre data-src=\"./match-braces.js\"></pre>\n\n```js\nconst func = (a, b) => {\n\treturn `${a}:${b}`;\n}\n```\n\n## Lisp\n\n```lisp\n(defun factorial (n)\n\t(if (= n 0) 1\n\t\t(* n (factorial (- n 1)))))\n```\n\n## Lisp with rainbow braces 🌈 but without hover\n\n```lisp { .rainbow-braces .no-brace-hover }\n(defun factorial (n)\n\t(if (= n 0) 1\n\t\t(* n (factorial (- n 1)))))\n```\n\n</section>\n"
  },
  {
    "path": "src/plugins/match-braces/match-braces.css",
    "content": ".token.punctuation.brace-hover,\n.token.punctuation.brace-selected {\n\toutline: solid 1px;\n}\n\n.rainbow-braces .token.punctuation.brace-level-1,\n.rainbow-braces .token.punctuation.brace-level-5,\n.rainbow-braces .token.punctuation.brace-level-9 {\n\tcolor: #e50;\n\topacity: 1;\n}\n.rainbow-braces .token.punctuation.brace-level-2,\n.rainbow-braces .token.punctuation.brace-level-6,\n.rainbow-braces .token.punctuation.brace-level-10 {\n\tcolor: #0b3;\n\topacity: 1;\n}\n.rainbow-braces .token.punctuation.brace-level-3,\n.rainbow-braces .token.punctuation.brace-level-7,\n.rainbow-braces .token.punctuation.brace-level-11 {\n\tcolor: #26f;\n\topacity: 1;\n}\n.rainbow-braces .token.punctuation.brace-level-4,\n.rainbow-braces .token.punctuation.brace-level-8,\n.rainbow-braces .token.punctuation.brace-level-12 {\n\tcolor: #e0e;\n\topacity: 1;\n}\n"
  },
  {
    "path": "src/plugins/match-braces/match-braces.js",
    "content": "import prism from '../../global.js';\nimport { getParentPre, isActive } from '../../shared/dom-util.js';\n\n/** @type {import('../../types.d.ts').PluginProto<'match-braces'>} */\nconst Self = {\n\tid: 'match-braces',\n\teffect (Prism) {\n\t\t/**\n\t\t * @param {string} name\n\t\t */\n\t\tfunction mapClassName (name) {\n\t\t\t/** @type {import('../custom-class/custom-class.js').CustomClass} */\n\t\t\tconst customClass = Prism.pluginRegistry.peek('custom-class')?.plugin;\n\t\t\tif (customClass) {\n\t\t\t\treturn customClass.apply(name);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn name;\n\t\t\t}\n\t\t}\n\n\t\tconst PARTNER = {\n\t\t\t'(': ')',\n\t\t\t'[': ']',\n\t\t\t'{': '}',\n\t\t};\n\n\t\t// The names for brace types.\n\t\t// These names have two purposes: 1) they can be used for styling and 2) they are used to pair braces. Only braces\n\t\t// of the same type are paired.\n\t\tconst NAMES = {\n\t\t\t'(': 'brace-round',\n\t\t\t'[': 'brace-square',\n\t\t\t'{': 'brace-curly',\n\t\t};\n\n\t\t// A map for brace aliases.\n\t\t// This is useful for when some braces have a prefix/suffix as part of the punctuation token.\n\t\tconst BRACE_ALIAS_MAP = {\n\t\t\t'${': '{', // JS template punctuation (e.g. `foo ${bar + 1}`)\n\t\t};\n\n\t\tconst LEVEL_WARP = 12;\n\n\t\tlet pairIdCounter = 0;\n\n\t\tconst BRACE_ID_PATTERN = /^(pair-\\d+-)(close|open)$/;\n\n\t\t/**\n\t\t * Returns the brace partner given one brace of a brace pair.\n\t\t *\n\t\t * @param {Element} brace\n\t\t */\n\t\tfunction getPartnerBrace (brace) {\n\t\t\tconst match = BRACE_ID_PATTERN.exec(brace.id);\n\t\t\tif (!match) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn document.querySelector(\n\t\t\t\t'#' + match[1] + (match[2] === 'open' ? 'close' : 'open')\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * @this {Element}\n\t\t */\n\t\tfunction hoverBrace () {\n\t\t\tif (!isActive(this, 'brace-hover', true)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst partner = getPartnerBrace(this);\n\t\t\tif (!partner) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t[this, partner].forEach(e => {\n\t\t\t\te.classList.add(mapClassName('brace-hover'));\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * @this {Element}\n\t\t */\n\t\tfunction leaveBrace () {\n\t\t\tconst partner = getPartnerBrace(this);\n\t\t\tif (!partner) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t[this, partner].forEach(e => {\n\t\t\t\te.classList.remove(mapClassName('brace-hover'));\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * @this {Element}\n\t\t */\n\t\tfunction clickBrace () {\n\t\t\tif (!isActive(this, 'brace-select', true)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst partner = getPartnerBrace(this);\n\t\t\tif (!partner) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t[this, partner].forEach(e => {\n\t\t\t\te.classList.add(mapClassName('brace-selected'));\n\t\t\t});\n\t\t}\n\n\t\t/** @type {WeakSet<Element>} */\n\t\tconst withEventListener = new WeakSet();\n\n\t\treturn Prism.hooks.add('complete', env => {\n\t\t\tconst code = env.element;\n\n\t\t\tconst pre = getParentPre(code);\n\t\t\tif (!pre) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// find the braces to match\n\t\t\tconst toMatch = [];\n\t\t\tif (isActive(code, 'match-braces')) {\n\t\t\t\ttoMatch.push('(', '[', '{');\n\t\t\t}\n\n\t\t\tif (toMatch.length === 0) {\n\t\t\t\t// nothing to match\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!withEventListener.has(pre)) {\n\t\t\t\t// code blocks might be highlighted more than once\n\t\t\t\twithEventListener.add(pre);\n\t\t\t\tpre.addEventListener('mousedown', () => {\n\t\t\t\t\t// the code element might have been replaced\n\t\t\t\t\tconst code = pre.querySelector('code');\n\t\t\t\t\tconst className = mapClassName('brace-selected');\n\t\t\t\t\tcode?.querySelectorAll('.' + className).forEach(e => {\n\t\t\t\t\t\te.classList.remove(className);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst punctuation = [\n\t\t\t\t...code.querySelectorAll(\n\t\t\t\t\t'span.' + mapClassName('token') + '.' + mapClassName('punctuation')\n\t\t\t\t),\n\t\t\t];\n\n\t\t\t/** @type {{ index: number, open: boolean, element: Element }[]} */\n\t\t\tconst allBraces = [];\n\n\t\t\ttoMatch.forEach(open => {\n\t\t\t\tconst close = PARTNER[open];\n\t\t\t\tconst name = mapClassName(NAMES[open]);\n\n\t\t\t\tconst pairs = [];\n\t\t\t\t/** @type {number[]} */\n\t\t\t\tconst openStack = [];\n\n\t\t\t\tfor (let i = 0; i < punctuation.length; i++) {\n\t\t\t\t\tconst element = punctuation[i];\n\t\t\t\t\tif (element.childElementCount === 0) {\n\t\t\t\t\t\tlet text = element.textContent || '';\n\t\t\t\t\t\ttext = BRACE_ALIAS_MAP[text] || text;\n\t\t\t\t\t\tif (text === open) {\n\t\t\t\t\t\t\tallBraces.push({ index: i, open: true, element });\n\t\t\t\t\t\t\telement.classList.add(name);\n\t\t\t\t\t\t\telement.classList.add(mapClassName('brace-open'));\n\t\t\t\t\t\t\topenStack.push(i);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (text === close) {\n\t\t\t\t\t\t\tallBraces.push({ index: i, open: false, element });\n\t\t\t\t\t\t\telement.classList.add(name);\n\t\t\t\t\t\t\telement.classList.add(mapClassName('brace-close'));\n\t\t\t\t\t\t\tconst popped = openStack.pop();\n\t\t\t\t\t\t\tif (popped !== undefined) {\n\t\t\t\t\t\t\t\tpairs.push([i, popped]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpairs.forEach(pair => {\n\t\t\t\t\tconst pairId = `pair-${pairIdCounter++}-`;\n\n\t\t\t\t\tconst opening = punctuation[pair[0]];\n\t\t\t\t\tconst closing = punctuation[pair[1]];\n\n\t\t\t\t\topening.id = pairId + 'open';\n\t\t\t\t\tclosing.id = pairId + 'close';\n\n\t\t\t\t\t[opening, closing].forEach(e => {\n\t\t\t\t\t\te.addEventListener('mouseenter', hoverBrace);\n\t\t\t\t\t\te.addEventListener('mouseleave', leaveBrace);\n\t\t\t\t\t\te.addEventListener('click', clickBrace);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tlet level = 0;\n\t\t\tallBraces.sort((a, b) => a.index - b.index);\n\t\t\tallBraces.forEach(brace => {\n\t\t\t\tif (brace.open) {\n\t\t\t\t\tbrace.element.classList.add(\n\t\t\t\t\t\tmapClassName(`brace-level-${(level % LEVEL_WARP) + 1}`)\n\t\t\t\t\t);\n\t\t\t\t\tlevel++;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlevel = Math.max(0, level - 1);\n\t\t\t\t\tbrace.element.classList.add(\n\t\t\t\t\t\tmapClassName(`brace-level-${(level % LEVEL_WARP) + 1}`)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/plugins/normalize-whitespace/README.md",
    "content": "---\ntitle: Normalize Whitespace\ndescription: Supports multiple operations to normalize whitespace in code blocks.\nowner: zeitgeist87\noptional: unescaped-markup\nnoCSS: true\nbody_classes: language-markup\nresources: /plugins/keep-markup.js { type=\"module\" }\n---\n\n<style type=\"text/css\">\n\t:where(pre, code)[class*=\"language-\"] mark {\n\t\tdisplay: inline-block;\n\t\tcolor: inherit;\n\t\tbackground: none;\n\t\tborder: 1px solid #000;\n\t\tbox-shadow: 0 0 2px #fff;\n\t\tpadding: 1px;\n\t\tbackground: rgb(0 0 0 / 0.2);\n\t}\n</style>\n\n<section>\n\n# How to use\n\nObviously, this is supposed to work only for code blocks (`<pre><code>`) and not for inline code.\n\nBy default the plugin trims all leading and trailing whitespace of every code block. It also removes extra indents and trailing whitespace on every line.\n\nThe plugin can be disabled for a particular code block by adding the class `no-whitespace-normalization` to either the `<pre>` or `<code>` tag.\n\nThe default settings can be overridden with the `setDefaults()`{ .language-javascript } method like so:\n\n```js\nPrism.plugins.NormalizeWhitespace.setDefaults({\n\t\"remove-trailing\": true,\n\t\"remove-indent\": true,\n\t\"left-trim\": true,\n\t\"right-trim\": true,\n\t/*\"break-lines\": 80,\n\t\"indent\": 2,\n\t\"remove-initial-line-feed\": false,\n\t\"tabs-to-spaces\": 4,\n\t\"spaces-to-tabs\": 4*/\n});\n```\n\nThe following settings are available and can be set via the `data-[setting]` attribute on the `<pre>` element:\n\n`remove-trailing`\n\n: Removes trailing whitespace on all lines.\n\n`remove-indent`\n\n: If the whole code block is indented too much it removes the extra indent.\n\n`left-trim`\n\n: Removes all whitespace from the top of the code block.\n\n`right-trim`\n\n: Removes all whitespace from the bottom of the code block.\n\n`break-lines`\n\n: Simple way of breaking long lines at a certain length (default is 80 characters).\n\n`indent`\n\n: Adds a certain number of tabs to every line.\n\n`remove-initial-line-feed`\n\n: Less aggressive version of left-trim. It only removes a single line feed from the top of the code block.\n\n`tabs-to-spaces`\n\n: Converts all tabs to a certain number of spaces (default is 4 spaces).\n\n`spaces-to-tabs`\n\n: Converts a certain number of spaces to a tab (default is 4 spaces).\n\n</section>\n\n<section>\n\n# Examples\n\nThe following example demonstrates the use of this plugin:\n\n<pre data-src=\"./demo.html\"></pre>\n\nThe result looks like this:\n\n<pre class=\"language-javascript\">\n\n\t<code>\n\n\n\t\tlet example = {\n\t\t\tfoo: true,\n\n\t\t\tbar: false\n\t\t};\n\n\n\t\tlet\n\t\tthere_is_a_very_very_very_very_long_line_it_can_break_it_for_you\n\t\t = true;\n\t\t\n\t\tif \n\t\t(there_is_a_very_very_very_very_long_line_it_can_break_it_for_you\n\t\t === true) {\n\t\t};\n\n\n\t</code>\n\n</pre>\n\nIt is also compatible with the [keep-markup](../keep-markup) plugin:\n\n<pre><code class=\"language-css\">\n\n\n@media <mark>screen</mark> {\n\tdiv {\n\t\t<mark>text</mark>-decoration: <mark><mark>under</mark>line</mark>;\n\t\tback<mark>ground: url</mark>('foo.png');\n\t}\n}</code></pre>\n\nThis plugin can also be used on the server or on the command line with Node.js:\n\n```js\nlet Prism = require(\"prismjs\");\nlet Normalizer = require(\"prismjs/plugins/normalize-whitespace/normalize-whitespace\");\n// Create a new Normalizer object\nlet nw = new Normalizer({\n\t\"remove-trailing\": true,\n\t\"remove-indent\": true,\n\t\"left-trim\": true,\n\t\"right-trim\": true,\n\t/*\"break-lines\": 80,\n\t\"indent\": 2,\n\t\"remove-initial-line-feed\": false,\n\t\"tabs-to-spaces\": 4,\n\t\"spaces-to-tabs\": 4*/\n});\n\n// ..or use the default object from Prism\nnw = Prism.plugins.NormalizeWhitespace;\n\n// The code snippet you want to highlight, as a string\nlet code = \"\\t\\t\\tlet data = 1;    \";\n\n// Removes leading and trailing whitespace\n// and then indents by 1 tab\ncode = nw.normalize(code, {\n\t// Extra settings\n\tindent: 1\n});\n\n// Returns a highlighted HTML string\nlet html = Prism.highlight(code, Prism.languages.javascript);\n```\n\n</section>\n"
  },
  {
    "path": "src/plugins/normalize-whitespace/demo.md",
    "content": "---\nlayout: null\neleventyExcludeFromCollections: true\n---\n\n<body>\n<section id=\"main\" class=\"language-javascript\">\n\n<pre>\n\n\t<code>\n\n\n\t\tlet example = {\n\t\t\tfoo: true,\n\n\t\t\tbar: false\n\t\t};\n\n\n\t</code>\n\n</pre>\n\n<pre data-break-lines=\"50\">\n\n\t<code>\n\n\n\t\tlet there_is_a_very_very_very_very_long_line_it_can_break_it_for_you = true;\n\n\t\tif (there_is_a_very_very_very_very_long_line_it_can_break_it_for_you === true) {\n\t\t};\n\n\n\t</code>\n\n</pre>\n\n</section>\n\n<script src=\"https://dev.prismjs.com/prism.js\"></script>\n<script src=\"./normalize-whitespace.js\"></script>\n<script>\n// Optional\nPrism.plugins.NormalizeWhitespace.setDefaults({\n\t\"remove-trailing\": true,\n\t\"remove-indent\": true,\n\t\"left-trim\": true,\n\t\"right-trim\": true,\n});\n</script>\n</body>\n"
  },
  {
    "path": "src/plugins/normalize-whitespace/normalize-whitespace.js",
    "content": "import prism from '../../global.js';\nimport { getParentPre, isActive } from '../../shared/dom-util.js';\n\n/**\n * @param {string} str\n * @returns {number}\n */\nfunction tabLength (str) {\n\tlet res = 0;\n\tfor (let i = 0; i < str.length; ++i) {\n\t\tif (str.charCodeAt(i) === '\\t'.charCodeAt(0)) {\n\t\t\tres += 3;\n\t\t}\n\t}\n\treturn str.length + res;\n}\n\n/** @type {(keyof NormalizeWhitespaceDefaults)[]} */\nconst normalizationOrder = [\n\t'remove-trailing',\n\t'remove-indent',\n\t'left-trim',\n\t'right-trim',\n\t'break-lines',\n\t'indent',\n\t'remove-initial-line-feed',\n\t'tabs-to-spaces',\n\t'spaces-to-tabs',\n];\n\nconst settingsConfig = {\n\t'remove-trailing': 'boolean',\n\t'remove-indent': 'boolean',\n\t'left-trim': 'boolean',\n\t'right-trim': 'boolean',\n\t'break-lines': 'number',\n\t'indent': 'number',\n\t'remove-initial-line-feed': 'boolean',\n\t'tabs-to-spaces': 'number',\n\t'spaces-to-tabs': 'number',\n};\n\n/**\n * Reads normalizations settings from the given elements's `data-*` attributes.\n *\n * @param {Element} element\n */\nfunction readSetting (element) {\n\tconst settings = {};\n\tfor (const key of normalizationOrder) {\n\t\tconst attr = element.getAttribute('data-' + key);\n\t\tconst type = settingsConfig[key];\n\t\tif (attr !== null) {\n\t\t\ttry {\n\t\t\t\tconst value = JSON.parse(attr || 'true');\n\t\t\t\tif (typeof value === type) {\n\t\t\t\t\tsettings[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch {\n\t\t\t\t// ignore error\n\t\t\t}\n\t\t}\n\t}\n\treturn settings;\n}\n\nconst normalizationMethods = {\n\t'left-trim': input => input.replace(/^\\s+/, ''),\n\t'right-trim': input => input.replace(/(^|\\S)\\s+$/, '$1'),\n\t'tabs-to-spaces': (input, spaces) => input.replace(/\\t/g, ' '.repeat(spaces)),\n\t'spaces-to-tabs': (input, spaces) => input.replace(RegExp(` {${spaces}}`, 'g'), '\\t'),\n\t'remove-trailing': input => input.replace(/\\s*?$/gm, ''),\n\t'remove-initial-line-feed': input => input.replace(/^(?:\\r?\\n|\\r)/, ''),\n\t'remove-indent': input => {\n\t\tconst indents = input.match(/^[^\\S\\n\\r]*(?=\\S)/gm);\n\n\t\tif (!indents || !indents[0].length) {\n\t\t\treturn input;\n\t\t}\n\n\t\tindents.sort((a, b) => a.length - b.length);\n\n\t\tif (!indents[0].length) {\n\t\t\treturn input;\n\t\t}\n\n\t\treturn input.replace(RegExp('^' + indents[0], 'gm'), '');\n\t},\n\t'indent': (input, tabs) => input.replace(/^[^\\S\\n\\r]*(?=\\S)/gm, '\\t'.repeat(tabs) + '$&'),\n\t'break-lines': (input, characters) => {\n\t\tconst lines = input.split('\\n');\n\t\tfor (let i = 0; i < lines.length; ++i) {\n\t\t\tif (tabLength(lines[i]) <= characters) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst line = lines[i].split(/(\\s+)/);\n\t\t\tlet len = 0;\n\n\t\t\tfor (let j = 0; j < line.length; ++j) {\n\t\t\t\tconst tl = tabLength(line[j]);\n\t\t\t\tlen += tl;\n\t\t\t\tif (len > characters) {\n\t\t\t\t\tline[j] = '\\n' + line[j];\n\t\t\t\t\tlen = tl;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlines[i] = line.join('');\n\t\t}\n\t\treturn lines.join('\\n');\n\t},\n};\n\nexport class NormalizeWhitespace {\n\tdefaults;\n\tconstructor (defaults) {\n\t\tthis.defaults = { ...defaults };\n\t}\n\n\tsetDefaults (defaults) {\n\t\tObject.assign(this.defaults, defaults);\n\t}\n\n\t/**\n\t * @param {string} input\n\t * @param {object} [settings]\n\t * @returns {string}\n\t */\n\tnormalize (input, settings) {\n\t\tsettings = { ...this.defaults, ...settings };\n\n\t\tfor (const name of normalizationOrder) {\n\t\t\tconst value = settings[name];\n\t\t\tif (value !== undefined && value !== false) {\n\t\t\t\tinput = normalizationMethods[name](input, value);\n\t\t\t}\n\t\t}\n\n\t\treturn input;\n\t}\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'normalize-whitespace'>} */\nconst Self = {\n\tid: 'normalize-whitespace',\n\toptional: 'unescaped-markup',\n\tplugin () {\n\t\treturn new NormalizeWhitespace({\n\t\t\t'remove-trailing': true,\n\t\t\t'remove-indent': true,\n\t\t\t'left-trim': true,\n\t\t\t'right-trim': true,\n\t\t\t/*'break-lines': 80,\n\t\t\t\t'indent': 2,\n\t\t\t\t'remove-initial-line-feed': false,\n\t\t\t\t'tabs-to-spaces': 4,\n\t\t\t\t'spaces-to-tabs': 4*/\n\t\t});\n\t},\n\teffect (Prism) {\n\t\t/** @type {NormalizeWhitespace} */\n\t\tconst Normalizer = Prism.pluginRegistry.peek(Self)?.plugin;\n\n\t\treturn Prism.hooks.add('before-sanity-check', env => {\n\t\t\tif (!env.code) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check classes\n\t\t\tif (!isActive(env.element, 'whitespace-normalization', true)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Simple mode if there is no env.element\n\t\t\tif (!env.element.parentNode) {\n\t\t\t\tenv.code = Normalizer.normalize(env.code);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Normal mode\n\t\t\tconst pre = getParentPre(env.element);\n\t\t\tif (!pre) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst settings = readSetting(pre);\n\n\t\t\tconst children = pre.childNodes;\n\t\t\tlet before = '';\n\t\t\tlet after = '';\n\t\t\tlet codeFound = false;\n\n\t\t\t// Move surrounding whitespace from the <pre> tag into the <code> tag\n\t\t\tfor (let i = 0; i < children.length; ++i) {\n\t\t\t\tconst node = children[i];\n\n\t\t\t\tif (node === env.element) {\n\t\t\t\t\tcodeFound = true;\n\t\t\t\t}\n\t\t\t\telse if (node.nodeName === '#text') {\n\t\t\t\t\tif (codeFound) {\n\t\t\t\t\t\tafter += node.nodeValue;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbefore += node.nodeValue;\n\t\t\t\t\t}\n\n\t\t\t\t\tpre.removeChild(node);\n\t\t\t\t\t--i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!env.element.children.length || !Prism.pluginRegistry.has('keep-markup')) {\n\t\t\t\tenv.code = before + env.code + after;\n\t\t\t\tenv.code = Normalizer.normalize(env.code, settings);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Preserve markup for keep-markup plugin\n\t\t\t\tconst html = before + env.element.innerHTML + after;\n\t\t\t\tenv.element.innerHTML = Normalizer.normalize(html, settings);\n\t\t\t\tenv.code = env.element.textContent || '';\n\t\t\t}\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @typedef {object} NormalizeWhitespaceDefaults\n * @property {number} break-lines\n * @property {number} indent\n * @property {boolean} left-trim\n * @property {boolean} remove-indent\n * @property {boolean} remove-initial-line-feed\n * @property {boolean} remove-trailing\n * @property {boolean} right-trim\n * @property {number} spaces-to-tabs\n * @property {number} tabs-to-spaces\n */\n"
  },
  {
    "path": "src/plugins/previewers/README.md",
    "content": "---\ntitle: Previewers\ndescription: Previewers for angles, colors, gradients, easing and time.\nowner: Golmote\nrequire: css-extras\nresources:\n  - /languages/css-extras.js { type=\"module\" }\n  - /languages/less.js { type=\"module\" }\n  - /languages/sass.js { type=\"module\" }\n  - /languages/scss.js { type=\"module\" }\n  - /languages/stylus.js { type=\"module\" }\n---\n\n<section class=\"language-markup\">\n\n# How to use\n\nYou don't need to do anything. With this plugin loaded, a previewer will appear on hovering some values in code blocks. The following previewers are supported:\n\n- `angle` for angles\n- `color` for colors\n- `gradient` for gradients\n- `easing` for easing functions\n- `time` for durations\n\nThis plugin is compatible with CSS, Less, Markup attributes, Sass, Scss and Stylus.\n\n</section>\n\n<section>\n\n# Examples\n\n## CSS\n\n```css\n.example-gradient {\n\tbackground: -webkit-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* Chrome10+, Safari5.1+ */\n\tbackground:    -moz-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* FF3.6+ */\n\tbackground:     -ms-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* IE10+ */\n\tbackground:      -o-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* Opera 11.10+ */\n\tbackground:         linear-gradient(to right, #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* W3C */\n}\n.example-angle {\n\ttransform: rotate(10deg);\n}\n.example-color {\n\tcolor: rgba(255, 0, 0, 0.2);\n\tbackground: purple;\n\tborder: 1px solid hsl(100, 70%, 40%);\n}\n.example-easing {\n\ttransition-timing-function: linear;\n}\n.example-time {\n\ttransition-duration: 3s;\n}\n```\n\n## Markup attributes\n\n```html\n<table bgcolor=\"#6E5494\">\n<tr style=\"background: lightblue;\">\n```\n\n## Less\n\n```less\n@gradient: linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%);\n.example-gradient {\n\tbackground: -webkit-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* Chrome10+, Safari5.1+ */\n\tbackground:    -moz-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* FF3.6+ */\n\tbackground:     -ms-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* IE10+ */\n\tbackground:      -o-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* Opera 11.10+ */\n\tbackground:         linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* W3C */\n}\n@angle: 3rad;\n.example-angle {\n\ttransform: rotate(.4turn)\n}\n@nice-blue: #5B83AD;\n.example-color {\n\tcolor: hsla(102, 53%, 42%, 0.4);\n}\n@easing: cubic-bezier(0.1, 0.3, 1, .4);\n.example-easing {\n\ttransition-timing-function: ease;\n}\n@time: 1s;\n.example-time {\n\ttransition-duration: 2s;\n}\n```\n\n## Sass\n\n```sass\n$gradient: linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%)\n@mixin example-gradient\n\tbackground: -moz-radial-gradient(center, ellipse cover, #f2f6f8 0%, #d8e1e7 50%, #b5c6d0 51%, #e0eff9 100%)\n\tbackground: radial-gradient(ellipse at center, #f2f6f8 0%, #d8e1e7 50%, #b5c6d0 51%, #e0eff9 100%)\n$angle: 380grad\n@mixin example-angle\n\ttransform: rotate(-120deg)\n.example-angle\n\ttransform: rotate(18rad)\n$color: blue\n@mixin example-color\n\tcolor: rgba(147, 32, 34, 0.8)\n.example-color\n\tcolor: pink\n$easing: ease-out\n.example-easing\n\ttransition-timing-function: ease-in-out\n$time: 3s\n@mixin example-time\n\ttransition-duration: 800ms\n.example-time\n\ttransition-duration: 0.8s\n```\n\n## Scss\n\n```scss\n$gradient: linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%);\n$attr: background;\n.example-gradient {\n\t#{$attr}-image: repeating-linear-gradient(10deg, rgba(255, 0, 0, 0), rgba(255, 0, 0, 1) 10px, rgba(255, 0, 0, 0) 20px);\n}\n$angle: 1.8turn;\n.example-angle {\n\ttransform: rotate(-3rad)\n}\n$color: blue;\n.example-color {\n\t#{$attr}-color: rgba(255, 255, 0, 0.75);\n}\n$easing: linear;\n.example-easing {\n\ttransition-timing-function: cubic-bezier(0.9, 0.1, .2, .4);\n}\n$time: 1s;\n.example-time {\n\ttransition-duration: 10s\n}\n```\n\n## Stylus\n\n```stylus\ngradient = linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%)\n.example-gradient\n\tbackground-image: repeating-radial-gradient(circle, rgba(255, 0, 0, 0), rgba(255, 0, 0, 1) 10px, rgba(255, 0, 0, 0) 20px)\nangle = 357deg\n.example-angle\n\ttransform: rotate(100grad)\ncolor = olive\n.example-color\n\tcolor: #000\neasing = ease-in\n.example-easing\n\ttransition-timing-function: ease-out\ntime = 3s\n.example-time\n\ttransition-duration: 0.5s\n```\n\n</section>\n\n<section>\n\n# Disabling a previewer\n\nAll previewers are enabled by default. To enable only a subset of them, a `data-previewers` attribute can be added on a code block or any ancestor. Its value should be a space-separated list of previewers representing the subset.\n\nFor example:\n\n```html\n<pre class=\"language-css\" data-previewers=\"color time\"><code>div {\n\t/* Only the previewer for color and time are enabled */\n\tcolor: red;\n\ttransition-duration: 1s;\n\t/* The previewer for angles is not enabled. */\n\ttransform: rotate(10deg);\n}</code></pre>\n```\n\nwill give the following result:\n\n```css { data-previewers=\"color time\" }\ndiv {\n\t/* Only the previewers for color and time are enabled */\n\tcolor: red;\n\ttransition-duration: 1s;\n\t/* The previewer for angles is not enabled. */\n\ttransform: rotate(10deg);\n}\n```\n\n</section>\n\n<section class=\"language-javascript\">\n\n# API\n\nThis plugins provides a constructor that can be accessed through `Prism.plugins.Previewer`.\n\nOnce a previewer has been instantiated, an HTML element is appended to the document body. This element will appear when specific tokens are hovered.\n\n## `new Prism.plugins.Previewer(type, updater, supportedLanguages)`\n\n- `type`: the token type this previewer is associated to. The previewer will be shown when hovering tokens of this type.\n\n- `updater`: the function that will be called each time an associated token is hovered. This function takes the text content of the token as its only parameter. The previewer HTML element can be accessed through the keyword `this`. This function must return `true` for the previewer to be shown.\n\n- `supportedLanguages`: an optional array of supported languages. The previewer will be available only for those. Defaults to `'*'`, which means every languages.\n\n- `initializer`: an optional function. This function will be called when the previewer is initialized, right after the HTML element has been appended to the document body.\n\n</section>\n"
  },
  {
    "path": "src/plugins/previewers/previewers.css",
    "content": ".prism-previewer,\n.prism-previewer:before,\n.prism-previewer:after {\n\tposition: absolute;\n\tpointer-events: none;\n}\n.prism-previewer,\n.prism-previewer:after {\n\tleft: 50%;\n}\n.prism-previewer {\n\tmargin-top: -48px;\n\twidth: 32px;\n\theight: 32px;\n\tmargin-left: -16px;\n\tz-index: 10;\n\n\topacity: 0;\n\t-webkit-transition: opacity 0.25s;\n\t-o-transition: opacity 0.25s;\n\ttransition: opacity 0.25s;\n}\n.prism-previewer.flipped {\n\tmargin-top: 0;\n\tmargin-bottom: -48px;\n}\n.prism-previewer:before,\n.prism-previewer:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tpointer-events: none;\n}\n.prism-previewer:before {\n\ttop: -5px;\n\tright: -5px;\n\tleft: -5px;\n\tbottom: -5px;\n\tborder-radius: 10px;\n\tborder: 5px solid #fff;\n\tbox-shadow:\n\t\t0 0 3px rgba(0, 0, 0, 0.5) inset,\n\t\t0 0 10px rgba(0, 0, 0, 0.75);\n}\n.prism-previewer:after {\n\ttop: 100%;\n\twidth: 0;\n\theight: 0;\n\tmargin: 5px 0 0 -7px;\n\tborder: 7px solid transparent;\n\tborder-color: rgba(255, 0, 0, 0);\n\tborder-top-color: #fff;\n}\n.prism-previewer.flipped:after {\n\ttop: auto;\n\tbottom: 100%;\n\tmargin-top: 0;\n\tmargin-bottom: 5px;\n\tborder-top-color: rgba(255, 0, 0, 0);\n\tborder-bottom-color: #fff;\n}\n.prism-previewer.active {\n\topacity: 1;\n}\n\n.prism-previewer-angle:before {\n\tborder-radius: 50%;\n\tbackground: #fff;\n}\n.prism-previewer-angle:after {\n\tmargin-top: 4px;\n}\n.prism-previewer-angle svg {\n\twidth: 32px;\n\theight: 32px;\n\t-webkit-transform: rotate(-90deg);\n\t-moz-transform: rotate(-90deg);\n\t-ms-transform: rotate(-90deg);\n\t-o-transform: rotate(-90deg);\n\ttransform: rotate(-90deg);\n}\n.prism-previewer-angle[data-negative] svg {\n\t-webkit-transform: scaleX(-1) rotate(-90deg);\n\t-moz-transform: scaleX(-1) rotate(-90deg);\n\t-ms-transform: scaleX(-1) rotate(-90deg);\n\t-o-transform: scaleX(-1) rotate(-90deg);\n\ttransform: scaleX(-1) rotate(-90deg);\n}\n.prism-previewer-angle circle {\n\tfill: transparent;\n\tstroke: hsl(200, 10%, 20%);\n\tstroke-opacity: 0.9;\n\tstroke-width: 32;\n\tstroke-dasharray: 0, 500;\n}\n\n.prism-previewer-gradient {\n\tbackground-image:\n\t\tlinear-gradient(45deg, #bbb 25%, transparent 25%, transparent 75%, #bbb 75%, #bbb),\n\t\tlinear-gradient(45deg, #bbb 25%, #eee 25%, #eee 75%, #bbb 75%, #bbb);\n\tbackground-size: 10px 10px;\n\tbackground-position:\n\t\t0 0,\n\t\t5px 5px;\n\n\twidth: 64px;\n\tmargin-left: -32px;\n}\n.prism-previewer-gradient:before {\n\tcontent: none;\n}\n.prism-previewer-gradient div {\n\tposition: absolute;\n\ttop: -5px;\n\tleft: -5px;\n\tright: -5px;\n\tbottom: -5px;\n\tborder-radius: 10px;\n\tborder: 5px solid #fff;\n\tbox-shadow:\n\t\t0 0 3px rgba(0, 0, 0, 0.5) inset,\n\t\t0 0 10px rgba(0, 0, 0, 0.75);\n}\n\n.prism-previewer-color {\n\tbackground-image:\n\t\tlinear-gradient(45deg, #bbb 25%, transparent 25%, transparent 75%, #bbb 75%, #bbb),\n\t\tlinear-gradient(45deg, #bbb 25%, #eee 25%, #eee 75%, #bbb 75%, #bbb);\n\tbackground-size: 10px 10px;\n\tbackground-position:\n\t\t0 0,\n\t\t5px 5px;\n}\n.prism-previewer-color:before {\n\tbackground-color: inherit;\n\tbackground-clip: padding-box;\n}\n\n.prism-previewer-easing {\n\tmargin-top: -76px;\n\tmargin-left: -30px;\n\twidth: 60px;\n\theight: 60px;\n\tbackground: #333;\n}\n.prism-previewer-easing.flipped {\n\tmargin-bottom: -116px;\n}\n.prism-previewer-easing svg {\n\twidth: 60px;\n\theight: 60px;\n}\n.prism-previewer-easing circle {\n\tfill: hsl(200, 10%, 20%);\n\tstroke: white;\n}\n.prism-previewer-easing path {\n\tfill: none;\n\tstroke: white;\n\tstroke-linecap: round;\n\tstroke-width: 4;\n}\n.prism-previewer-easing line {\n\tstroke: white;\n\tstroke-opacity: 0.5;\n\tstroke-width: 2;\n}\n\n@-webkit-keyframes prism-previewer-time {\n\t0% {\n\t\tstroke-dasharray: 0, 500;\n\t\tstroke-dashoffset: 0;\n\t}\n\t50% {\n\t\tstroke-dasharray: 100, 500;\n\t\tstroke-dashoffset: 0;\n\t}\n\t100% {\n\t\tstroke-dasharray: 0, 500;\n\t\tstroke-dashoffset: -100;\n\t}\n}\n\n@-o-keyframes prism-previewer-time {\n\t0% {\n\t\tstroke-dasharray: 0, 500;\n\t\tstroke-dashoffset: 0;\n\t}\n\t50% {\n\t\tstroke-dasharray: 100, 500;\n\t\tstroke-dashoffset: 0;\n\t}\n\t100% {\n\t\tstroke-dasharray: 0, 500;\n\t\tstroke-dashoffset: -100;\n\t}\n}\n\n@-moz-keyframes prism-previewer-time {\n\t0% {\n\t\tstroke-dasharray: 0, 500;\n\t\tstroke-dashoffset: 0;\n\t}\n\t50% {\n\t\tstroke-dasharray: 100, 500;\n\t\tstroke-dashoffset: 0;\n\t}\n\t100% {\n\t\tstroke-dasharray: 0, 500;\n\t\tstroke-dashoffset: -100;\n\t}\n}\n\n@keyframes prism-previewer-time {\n\t0% {\n\t\tstroke-dasharray: 0, 500;\n\t\tstroke-dashoffset: 0;\n\t}\n\t50% {\n\t\tstroke-dasharray: 100, 500;\n\t\tstroke-dashoffset: 0;\n\t}\n\t100% {\n\t\tstroke-dasharray: 0, 500;\n\t\tstroke-dashoffset: -100;\n\t}\n}\n\n.prism-previewer-time:before {\n\tborder-radius: 50%;\n\tbackground: #fff;\n}\n.prism-previewer-time:after {\n\tmargin-top: 4px;\n}\n.prism-previewer-time svg {\n\twidth: 32px;\n\theight: 32px;\n\t-webkit-transform: rotate(-90deg);\n\t-moz-transform: rotate(-90deg);\n\t-ms-transform: rotate(-90deg);\n\t-o-transform: rotate(-90deg);\n\ttransform: rotate(-90deg);\n}\n.prism-previewer-time circle {\n\tfill: transparent;\n\tstroke: hsl(200, 10%, 20%);\n\tstroke-opacity: 0.9;\n\tstroke-width: 32;\n\tstroke-dasharray: 0, 500;\n\tstroke-dashoffset: 0;\n\t-webkit-animation: prism-previewer-time linear infinite 3s;\n\t-moz-animation: prism-previewer-time linear infinite 3s;\n\t-o-animation: prism-previewer-time linear infinite 3s;\n\tanimation: prism-previewer-time linear infinite 3s;\n}\n"
  },
  {
    "path": "src/plugins/previewers/previewers.js",
    "content": "import prism from '../../global.js';\nimport cssExtras from '../../languages/css-extras.js';\nimport { forEach } from '../../util/iterables.js';\n\n/**\n * Returns the absolute X, Y offsets for an element.\n *\n * @param {Element} element\n * @returns {{ top: number, right: number, bottom: number, left: number, width: number, height: number }}\n */\nconst getOffset = element => {\n\tconst elementBounds = element.getBoundingClientRect();\n\tlet left = elementBounds.left;\n\tlet top = elementBounds.top;\n\tconst documentBounds = document.documentElement.getBoundingClientRect();\n\tleft -= documentBounds.left;\n\ttop -= documentBounds.top;\n\n\treturn {\n\t\ttop,\n\t\tright: innerWidth - left - elementBounds.width,\n\t\tbottom: innerHeight - top - elementBounds.height,\n\t\tleft,\n\t\twidth: elementBounds.width,\n\t\theight: elementBounds.height,\n\t};\n};\n\nconst TOKEN_CLASS = 'token';\nconst ACTIVE_CLASS = 'active';\nconst FLIPPED_CLASS = 'flipped';\n\n/**\n * @callback Updater\n * @this {HTMLDivElement}\n * @param {string} value\n * @returns {boolean}\n */\n\n/**\n * @typedef {Previewer & { _elt: HTMLDivElement }} PreviewerE\n */\n\n/**\n * @callback Initializer\n * @this {PreviewerE}\n * @returns {void}\n */\n\nclass Previewer {\n\t/** @type {string} */\n\ttype;\n\t/** @type {string | string[]} */\n\tsupportedLanguages;\n\t/** @type {Updater} */\n\tupdater;\n\t/** @type {Initializer | undefined} */\n\tinitializer;\n\n\t/**\n\t * @type {HTMLDivElement | null}\n\t */\n\t_elt = null;\n\n\t/**\n\t * @type {Element | null}\n\t */\n\t_token = null;\n\n\t/**\n\t * Previewer constructor\n\t *\n\t * @param {string} type Unique previewer type\n\t * @param {Updater} updater Function that will be called on mouseover.\n\t * @param {string[] | string} [supportedLanguages='*'] Aliases of the languages this previewer must be enabled for. Defaults to \"*\", all languages.\n\t * @param {Initializer} [initializer] Function that will be called on initialization.\n\t */\n\tconstructor (type, updater, supportedLanguages = '*', initializer) {\n\t\tthis.type = type;\n\t\tthis.supportedLanguages = supportedLanguages;\n\t\tthis.updater = updater;\n\t\tthis.initializer = initializer;\n\t}\n\t/**\n\t * Creates the HTML element for the previewer.\n\t *\n\t * @returns {asserts this is PreviewerE}\n\t */\n\tinit () {\n\t\tif (this._elt) {\n\t\t\treturn;\n\t\t}\n\t\tthis._elt = document.createElement('div');\n\t\tthis._elt.className = 'prism-previewer prism-previewer-' + this.type;\n\t\tdocument.body.appendChild(this._elt);\n\t\tif (this.initializer) {\n\t\t\tthis.initializer.call(/** @type {PreviewerE} */ (this));\n\t\t}\n\t}\n\n\t/**\n\t * @param {Element} token\n\t * @returns {boolean}\n\t */\n\tisDisabled (token) {\n\t\tconst previewers = token.closest('[data-previewers]')?.getAttribute('data-previewers');\n\t\tconst parts = (previewers || '').split(/\\s+/);\n\t\treturn !parts.includes(this.type);\n\t}\n\t/**\n\t * Checks the class name of each hovered element.\n\t *\n\t * @param {Element} token\n\t * @returns {void}\n\t */\n\ttryShow (token) {\n\t\tif (token.classList.contains(TOKEN_CLASS) && this.isDisabled(token)) {\n\t\t\treturn;\n\t\t}\n\t\tconst target = token.closest(`.${TOKEN_CLASS}.${this.type}`);\n\t\tif (target && target !== this._token) {\n\t\t\tthis._token = target;\n\t\t\tthis.show();\n\t\t}\n\t}\n\t/**\n\t * Called on mouseout\n\t */\n\tmouseout = () => {\n\t\tthis._token?.removeEventListener('mouseout', this.mouseout, false);\n\t\tthis._token = null;\n\t\tthis.hide();\n\t};\n\t/**\n\t * Shows the previewer positioned properly for the current token.\n\t */\n\tshow () {\n\t\tthis.init();\n\n\t\tif (!this._token) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.updater.call(this._elt, this._token.textContent || '')) {\n\t\t\tthis._token.addEventListener('mouseout', this.mouseout, false);\n\n\t\t\tconst offset = getOffset(this._token);\n\t\t\tthis._elt.classList.add(ACTIVE_CLASS);\n\n\t\t\tif (offset.top - this._elt.offsetHeight > 0) {\n\t\t\t\tthis._elt.classList.remove(FLIPPED_CLASS);\n\t\t\t\tthis._elt.style.top = `${offset.top}px`;\n\t\t\t\tthis._elt.style.bottom = '';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._elt.classList.add(FLIPPED_CLASS);\n\t\t\t\tthis._elt.style.bottom = `${offset.bottom}px`;\n\t\t\t\tthis._elt.style.top = '';\n\t\t\t}\n\n\t\t\tthis._elt.style.left = `${offset.left + Math.min(200, offset.width / 2)}px`;\n\t\t}\n\t\telse {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\t/**\n\t * Hides the previewer.\n\t */\n\thide () {\n\t\tthis._elt?.classList.remove(ACTIVE_CLASS);\n\t}\n}\n\nexport class PreviewerCollection {\n\t/**\n\t * Map of all registered previewers by language.\n\t *\n\t * @type {Map<string, Previewer[]>}\n\t */\n\tbyLanguages = new Map();\n\t/**\n\t * Map of all registered previewers by type.\n\t *\n\t * @type {Map<string, Previewer>}\n\t */\n\tbyType = new Map();\n\n\t/**\n\t * @param {Previewer} previewer\n\t */\n\tadd (previewer) {\n\t\tforEach(previewer.supportedLanguages, lang => {\n\t\t\tlet list = this.byLanguages.get(lang);\n\t\t\tif (list === undefined) {\n\t\t\t\tlist = [];\n\t\t\t\tthis.byLanguages.set(lang, list);\n\t\t\t}\n\t\t\tif (!list.includes(previewer)) {\n\t\t\t\tlist.push(previewer);\n\t\t\t}\n\t\t});\n\n\t\tthis.byType.set(previewer.type, previewer);\n\t}\n\n\t/**\n\t * Initializes the mouseover event on the code block.\n\t *\n\t * @param {Element} elt The code block (`env.element`)\n\t * @param {string} lang The language (`env.language`)\n\t */\n\tinitEvents (elt, lang) {\n\t\t/** @type {Previewer[]} */\n\t\tconst previewers = [];\n\t\tpreviewers.push(...(this.byLanguages.get(lang) ?? []));\n\t\tpreviewers.push(...(this.byLanguages.get('*') ?? []));\n\t\tif (previewers.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\telt.addEventListener(\n\t\t\t'mouseover',\n\t\t\te => {\n\t\t\t\tconst target = e.target;\n\t\t\t\tif (target) {\n\t\t\t\t\tpreviewers.forEach(previewer => {\n\t\t\t\t\t\tpreviewer.tryShow(/** @type {Element} */ (target));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tfalse\n\t\t);\n\t}\n}\n\n// TODO: Filthy hack to be able to load this script\nconst Prism = { languages: {} };\n\nconst previewers = {\n\t// gradient must be defined before color and angle\n\t'gradient': {\n\t\tcreate () {\n\t\t\t/**\n\t\t\t * Stores already processed gradients so that we don't\n\t\t\t * make the conversion every time the previewer is shown\n\t\t\t */\n\t\t\tconst cache = {};\n\n\t\t\t/**\n\t\t\t * Returns a W3C-valid linear gradient\n\t\t\t *\n\t\t\t * @param {string} prefix Vendor prefix if any (\"-moz-\", \"-webkit-\", etc.)\n\t\t\t * @param {string} func Gradient function name (\"linear-gradient\")\n\t\t\t * @param {string[]} values Array of the gradient function parameters ([\"0deg\", \"red 0%\", \"blue 100%\"])\n\t\t\t */\n\t\t\tfunction convertToW3CLinearGradient (prefix, func, values) {\n\t\t\t\t// Default value for angle\n\t\t\t\tlet angle = '180deg';\n\n\t\t\t\tconst first = values[0];\n\t\t\t\tif (\n\t\t\t\t\tfirst &&\n\t\t\t\t\t/^(?:-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:deg|rad)|bottom|left|right|to\\b|top)/.test(\n\t\t\t\t\t\tfirst\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tangle = first;\n\t\t\t\t\tvalues.shift();\n\t\t\t\t\tif (!angle.includes('to ')) {\n\t\t\t\t\t\t// Angle uses old keywords\n\t\t\t\t\t\t// W3C syntax uses \"to\" + opposite keywords\n\t\t\t\t\t\tif (angle.includes('top')) {\n\t\t\t\t\t\t\tif (angle.includes('left')) {\n\t\t\t\t\t\t\t\tangle = 'to bottom right';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (angle.includes('right')) {\n\t\t\t\t\t\t\t\tangle = 'to bottom left';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tangle = 'to bottom';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (angle.includes('bottom')) {\n\t\t\t\t\t\t\tif (angle.includes('left')) {\n\t\t\t\t\t\t\t\tangle = 'to top right';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (angle.includes('right')) {\n\t\t\t\t\t\t\t\tangle = 'to top left';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tangle = 'to top';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (angle.includes('left')) {\n\t\t\t\t\t\t\tangle = 'to right';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (angle.includes('right')) {\n\t\t\t\t\t\t\tangle = 'to left';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (prefix) {\n\t\t\t\t\t\t\t// Angle is shifted by 90deg in prefixed gradients\n\t\t\t\t\t\t\tif (angle.includes('deg')) {\n\t\t\t\t\t\t\t\tangle = `${90 - parseFloat(angle)}deg`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (angle.includes('rad')) {\n\t\t\t\t\t\t\t\tangle = `${Math.PI / 2 - parseFloat(angle)}rad`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn func + '(' + angle + ',' + values.join(',') + ')';\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Returns a W3C-valid radial gradient\n\t\t\t *\n\t\t\t * @param {string} prefix Vendor prefix if any (\"-moz-\", \"-webkit-\", etc.)\n\t\t\t * @param {string} func Gradient function name (\"linear-gradient\")\n\t\t\t * @param {string[]} values Array of the gradient function parameters ([\"0deg\", \"red 0%\", \"blue 100%\"])\n\t\t\t */\n\t\t\tfunction convertToW3CRadialGradient (prefix, func, values) {\n\t\t\t\tif (!values[0].includes('at')) {\n\t\t\t\t\t// Looks like old syntax\n\n\t\t\t\t\t// Default values\n\t\t\t\t\tlet position = 'center';\n\t\t\t\t\tlet shape = 'ellipse';\n\t\t\t\t\tlet size = 'farthest-corner';\n\n\t\t\t\t\tif (/\\b(?:bottom|center|left|right|top)\\b|^\\d+/.test(values[0])) {\n\t\t\t\t\t\t// Found a position\n\t\t\t\t\t\t// Remove angle value, if any\n\t\t\t\t\t\tposition = /** @type {string} */ (values.shift()).replace(\n\t\t\t\t\t\t\t/\\s*-?\\d+(?:deg|rad)\\s*/,\n\t\t\t\t\t\t\t''\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (/\\b(?:circle|closest|contain|cover|ellipse|farthest)\\b/.test(values[0])) {\n\t\t\t\t\t\t// Found a shape and/or size\n\t\t\t\t\t\tconst shapeSizeParts = /** @type {string} */ (values.shift()).split(/\\s+/);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tshapeSizeParts[0] &&\n\t\t\t\t\t\t\t(shapeSizeParts[0] === 'circle' || shapeSizeParts[0] === 'ellipse')\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tshape = /** @type {string} */ (shapeSizeParts.shift());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (shapeSizeParts[0]) {\n\t\t\t\t\t\t\tsize = /** @type {string} */ (shapeSizeParts.shift());\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Old keywords are converted to their synonyms\n\t\t\t\t\t\tif (size === 'cover') {\n\t\t\t\t\t\t\tsize = 'farthest-corner';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (size === 'contain') {\n\t\t\t\t\t\t\tsize = 'clothest-side';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\tfunc +\n\t\t\t\t\t\t'(' +\n\t\t\t\t\t\tshape +\n\t\t\t\t\t\t' ' +\n\t\t\t\t\t\tsize +\n\t\t\t\t\t\t' at ' +\n\t\t\t\t\t\tposition +\n\t\t\t\t\t\t',' +\n\t\t\t\t\t\tvalues.join(',') +\n\t\t\t\t\t\t')'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn func + '(' + values.join(',') + ')';\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Converts a gradient to a W3C-valid one\n\t\t\t * Does not support old webkit syntax (-webkit-gradient(linear...) and -webkit-gradient(radial...))\n\t\t\t *\n\t\t\t * @param {string} gradient The CSS gradient\n\t\t\t */\n\t\t\tfunction convertToW3CGradient (gradient) {\n\t\t\t\tif (cache[gradient]) {\n\t\t\t\t\treturn cache[gradient];\n\t\t\t\t}\n\n\t\t\t\tconst values = gradient\n\t\t\t\t\t.replace(\n\t\t\t\t\t\t/^(?:\\b|\\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\\(|\\)$/g,\n\t\t\t\t\t\t''\n\t\t\t\t\t)\n\t\t\t\t\t.split(/\\s*,\\s*/);\n\t\t\t\tconst parts = gradient.match(\n\t\t\t\t\t/^(\\b|\\B-[a-z]{1,10}-)((?:repeating-)?(?:linear|radial)-gradient)/\n\t\t\t\t);\n\n\t\t\t\tif (!parts) {\n\t\t\t\t\treturn (cache[gradient] = '');\n\t\t\t\t}\n\n\t\t\t\t// \"\", \"-moz-\", etc.\n\t\t\t\tconst prefix = parts[1];\n\t\t\t\t// \"linear-gradient\", \"radial-gradient\", etc.\n\t\t\t\tconst func = parts[2];\n\n\t\t\t\tif (func.includes('linear')) {\n\t\t\t\t\treturn (cache[gradient] = convertToW3CLinearGradient(prefix, func, values));\n\t\t\t\t}\n\t\t\t\telse if (func.includes('radial')) {\n\t\t\t\t\treturn (cache[gradient] = convertToW3CRadialGradient(prefix, func, values));\n\t\t\t\t}\n\t\t\t\treturn (cache[gradient] = func + '(' + values.join(',') + ')');\n\t\t\t}\n\n\t\t\treturn new Previewer(\n\t\t\t\t'gradient',\n\t\t\t\tfunction (value) {\n\t\t\t\t\tconst first = /** @type {HTMLElement | null} */ (this.firstChild);\n\t\t\t\t\tif (!first) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tfirst.style.backgroundImage = '';\n\t\t\t\t\tfirst.style.backgroundImage = convertToW3CGradient(value);\n\t\t\t\t\treturn !!first.style.backgroundImage;\n\t\t\t\t},\n\t\t\t\t'*',\n\t\t\t\tfunction () {\n\t\t\t\t\tthis._elt.innerHTML = '<div></div>';\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\ttokens: {\n\t\t\t'gradient': {\n\t\t\t\tpattern:\n\t\t\t\t\t/(?:\\b|\\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\\((?:(?:hsl|rgb)a?\\(.+?\\)|[^\\)])+\\)/gi,\n\t\t\t\tinside: {\n\t\t\t\t\t'function': /[\\w-]+(?=\\()/,\n\t\t\t\t\t'punctuation': /[(),]/,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlanguages: {\n\t\t\t'css': true,\n\t\t\t'less': true,\n\t\t\t'sass': [\n\t\t\t\t{\n\t\t\t\t\tlang: 'sass',\n\t\t\t\t\tbefore: 'punctuation',\n\t\t\t\t\tinside: 'inside',\n\t\t\t\t\troot: Prism.languages.sass && Prism.languages.sass['variable-line'],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlang: 'sass',\n\t\t\t\t\tbefore: 'punctuation',\n\t\t\t\t\tinside: 'inside',\n\t\t\t\t\troot: Prism.languages.sass && Prism.languages.sass['property-line'],\n\t\t\t\t},\n\t\t\t],\n\t\t\t'scss': true,\n\t\t\t'stylus': [\n\t\t\t\t{\n\t\t\t\t\tlang: 'stylus',\n\t\t\t\t\tbefore: 'func',\n\t\t\t\t\tinside: 'rest',\n\t\t\t\t\troot:\n\t\t\t\t\t\tPrism.languages.stylus &&\n\t\t\t\t\t\tPrism.languages.stylus['property-declaration'].inside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlang: 'stylus',\n\t\t\t\t\tbefore: 'func',\n\t\t\t\t\tinside: 'rest',\n\t\t\t\t\troot:\n\t\t\t\t\t\tPrism.languages.stylus &&\n\t\t\t\t\t\tPrism.languages.stylus['variable-declaration'].inside,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\t'angle': {\n\t\tcreate () {\n\t\t\treturn new Previewer(\n\t\t\t\t'angle',\n\t\t\t\tfunction (value) {\n\t\t\t\t\tconst num = parseFloat(value);\n\t\t\t\t\tconst unit = value.match(/[a-z]+$/i);\n\t\t\t\t\tlet max = 1;\n\t\t\t\t\tif (!num || !unit) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch (unit[0]) {\n\t\t\t\t\t\tcase 'deg':\n\t\t\t\t\t\t\tmax = 360;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'grad':\n\t\t\t\t\t\t\tmax = 400;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'rad':\n\t\t\t\t\t\t\tmax = 2 * Math.PI;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'turn':\n\t\t\t\t\t\t\tmax = 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst percentage = ((100 * num) / max) % 100;\n\t\t\t\t\tthis[`${num < 0 ? 'set' : 'remove'}Attribute`]('data-negative', '');\n\t\t\t\t\tconst circle = this.querySelector('circle');\n\t\t\t\t\tif (circle) {\n\t\t\t\t\t\tcircle.style.strokeDasharray = `${Math.abs(percentage)},500`;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\t'*',\n\t\t\t\tfunction () {\n\t\t\t\t\tthis._elt.innerHTML =\n\t\t\t\t\t\t'<svg viewBox=\"0 0 64 64\">' +\n\t\t\t\t\t\t'<circle r=\"16\" cy=\"32\" cx=\"32\"></circle>' +\n\t\t\t\t\t\t'</svg>';\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\ttokens: {\n\t\t\t'angle': /(?:\\b|\\B-|(?=\\B\\.))(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:deg|g?rad|turn)\\b/i,\n\t\t},\n\t\tlanguages: {\n\t\t\t'css': true,\n\t\t\t'less': true,\n\t\t\t'markup': {\n\t\t\t\tlang: 'markup',\n\t\t\t\tbefore: 'punctuation',\n\t\t\t\tinside: 'inside',\n\t\t\t\troot: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value'],\n\t\t\t},\n\t\t\t'sass': [\n\t\t\t\t{\n\t\t\t\t\tlang: 'sass',\n\t\t\t\t\tinside: 'inside',\n\t\t\t\t\troot: Prism.languages.sass && Prism.languages.sass['property-line'],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlang: 'sass',\n\t\t\t\t\tbefore: 'operator',\n\t\t\t\t\tinside: 'inside',\n\t\t\t\t\troot: Prism.languages.sass && Prism.languages.sass['variable-line'],\n\t\t\t\t},\n\t\t\t],\n\t\t\t'scss': true,\n\t\t\t'stylus': [\n\t\t\t\t{\n\t\t\t\t\tlang: 'stylus',\n\t\t\t\t\tbefore: 'func',\n\t\t\t\t\tinside: 'rest',\n\t\t\t\t\troot:\n\t\t\t\t\t\tPrism.languages.stylus &&\n\t\t\t\t\t\tPrism.languages.stylus['property-declaration'].inside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlang: 'stylus',\n\t\t\t\t\tbefore: 'func',\n\t\t\t\t\tinside: 'rest',\n\t\t\t\t\troot:\n\t\t\t\t\t\tPrism.languages.stylus &&\n\t\t\t\t\t\tPrism.languages.stylus['variable-declaration'].inside,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\t'color': {\n\t\tcreate () {\n\t\t\treturn new Previewer('color', function (value) {\n\t\t\t\tthis.style.backgroundColor = '';\n\t\t\t\tthis.style.backgroundColor = value;\n\t\t\t\treturn !!this.style.backgroundColor;\n\t\t\t});\n\t\t},\n\t\ttokens: {\n\t\t\t'color': [Prism.languages.css?.['hexcode']].concat(Prism.languages.css?.['color']),\n\t\t},\n\t\tlanguages: {\n\t\t\t// CSS extras is required, so css and scss are not necessary\n\t\t\t'css': false,\n\t\t\t'less': true,\n\t\t\t'markup': {\n\t\t\t\tlang: 'markup',\n\t\t\t\tbefore: 'punctuation',\n\t\t\t\tinside: 'inside',\n\t\t\t\troot: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value'],\n\t\t\t},\n\t\t\t'sass': [\n\t\t\t\t{\n\t\t\t\t\tlang: 'sass',\n\t\t\t\t\tbefore: 'punctuation',\n\t\t\t\t\tinside: 'inside',\n\t\t\t\t\troot: Prism.languages.sass && Prism.languages.sass['variable-line'],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlang: 'sass',\n\t\t\t\t\tinside: 'inside',\n\t\t\t\t\troot: Prism.languages.sass && Prism.languages.sass['property-line'],\n\t\t\t\t},\n\t\t\t],\n\t\t\t'scss': false,\n\t\t\t'stylus': [\n\t\t\t\t{\n\t\t\t\t\tlang: 'stylus',\n\t\t\t\t\tbefore: 'hexcode',\n\t\t\t\t\tinside: 'rest',\n\t\t\t\t\troot:\n\t\t\t\t\t\tPrism.languages.stylus &&\n\t\t\t\t\t\tPrism.languages.stylus['property-declaration'].inside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlang: 'stylus',\n\t\t\t\t\tbefore: 'hexcode',\n\t\t\t\t\tinside: 'rest',\n\t\t\t\t\troot:\n\t\t\t\t\t\tPrism.languages.stylus &&\n\t\t\t\t\t\tPrism.languages.stylus['variable-declaration'].inside,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\t'easing': {\n\t\tcreate () {\n\t\t\tconst identifierMap = {\n\t\t\t\t'linear': '0,0,1,1',\n\t\t\t\t'ease': '.25,.1,.25,1',\n\t\t\t\t'ease-in': '.42,0,1,1',\n\t\t\t\t'ease-out': '0,0,.58,1',\n\t\t\t\t'ease-in-out': '.42,0,.58,1',\n\t\t\t};\n\t\t\treturn new Previewer(\n\t\t\t\t'easing',\n\t\t\t\tfunction (value) {\n\t\t\t\t\tvalue = identifierMap[value] || value;\n\n\t\t\t\t\tconst p = value.match(/-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)/g);\n\n\t\t\t\t\tif (p && p.length === 4) {\n\t\t\t\t\t\tconst values = p\n\t\t\t\t\t\t\t.map(Number)\n\t\t\t\t\t\t\t.map((p, i) => (i % 2 ? 1 - p : p) * 100)\n\t\t\t\t\t\t\t.map(String);\n\n\t\t\t\t\t\tthis.querySelector('path')?.setAttribute(\n\t\t\t\t\t\t\t'd',\n\t\t\t\t\t\t\t'M0,100 C' +\n\t\t\t\t\t\t\t\tvalues[0] +\n\t\t\t\t\t\t\t\t',' +\n\t\t\t\t\t\t\t\tvalues[1] +\n\t\t\t\t\t\t\t\t', ' +\n\t\t\t\t\t\t\t\tvalues[2] +\n\t\t\t\t\t\t\t\t',' +\n\t\t\t\t\t\t\t\tvalues[3] +\n\t\t\t\t\t\t\t\t', 100,0'\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst lines = this.querySelectorAll('line');\n\t\t\t\t\t\tlines[0].setAttribute('x2', values[0]);\n\t\t\t\t\t\tlines[0].setAttribute('y2', values[1]);\n\t\t\t\t\t\tlines[1].setAttribute('x2', values[2]);\n\t\t\t\t\t\tlines[1].setAttribute('y2', values[3]);\n\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\t'*',\n\t\t\t\tfunction () {\n\t\t\t\t\tthis._elt.innerHTML =\n\t\t\t\t\t\t'<svg viewBox=\"-20 -20 140 140\" width=\"100\" height=\"100\">' +\n\t\t\t\t\t\t'<defs>' +\n\t\t\t\t\t\t'<marker id=\"prism-previewer-easing-marker\" viewBox=\"0 0 4 4\" refX=\"2\" refY=\"2\" markerUnits=\"strokeWidth\">' +\n\t\t\t\t\t\t'<circle cx=\"2\" cy=\"2\" r=\"1.5\" />' +\n\t\t\t\t\t\t'</marker>' +\n\t\t\t\t\t\t'</defs>' +\n\t\t\t\t\t\t'<path d=\"M0,100 C20,50, 40,30, 100,0\" />' +\n\t\t\t\t\t\t'<line x1=\"0\" y1=\"100\" x2=\"20\" y2=\"50\" marker-start=\"url(#prism-previewer-easing-marker)\" marker-end=\"url(#prism-previewer-easing-marker)\" />' +\n\t\t\t\t\t\t'<line x1=\"100\" y1=\"0\" x2=\"40\" y2=\"30\" marker-start=\"url(#prism-previewer-easing-marker)\" marker-end=\"url(#prism-previewer-easing-marker)\" />' +\n\t\t\t\t\t\t'</svg>';\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\ttokens: {\n\t\t\t'easing': {\n\t\t\t\tpattern:\n\t\t\t\t\t/\\bcubic-bezier\\((?:-?(?:\\d+(?:\\.\\d+)?|\\.\\d+),\\s*){3}-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)\\)\\B|\\b(?:ease(?:-in)?(?:-out)?|linear)(?=\\s|[;}]|$)/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'function': /[\\w-]+(?=\\()/,\n\t\t\t\t\t'punctuation': /[(),]/,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlanguages: {\n\t\t\t'css': true,\n\t\t\t'less': true,\n\t\t\t'sass': [\n\t\t\t\t{\n\t\t\t\t\tlang: 'sass',\n\t\t\t\t\tinside: 'inside',\n\t\t\t\t\tbefore: 'punctuation',\n\t\t\t\t\troot: Prism.languages.sass && Prism.languages.sass['variable-line'],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlang: 'sass',\n\t\t\t\t\tinside: 'inside',\n\t\t\t\t\troot: Prism.languages.sass && Prism.languages.sass['property-line'],\n\t\t\t\t},\n\t\t\t],\n\t\t\t'scss': true,\n\t\t\t'stylus': [\n\t\t\t\t{\n\t\t\t\t\tlang: 'stylus',\n\t\t\t\t\tbefore: 'hexcode',\n\t\t\t\t\tinside: 'rest',\n\t\t\t\t\troot:\n\t\t\t\t\t\tPrism.languages.stylus &&\n\t\t\t\t\t\tPrism.languages.stylus['property-declaration'].inside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlang: 'stylus',\n\t\t\t\t\tbefore: 'hexcode',\n\t\t\t\t\tinside: 'rest',\n\t\t\t\t\troot:\n\t\t\t\t\t\tPrism.languages.stylus &&\n\t\t\t\t\t\tPrism.languages.stylus['variable-declaration'].inside,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\n\t'time': {\n\t\tcreate () {\n\t\t\treturn new Previewer(\n\t\t\t\t'time',\n\t\t\t\tfunction (value) {\n\t\t\t\t\tconst num = parseFloat(value);\n\t\t\t\t\tconst unit = value.match(/[a-z]+$/i);\n\t\t\t\t\tif (!num || !unit) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tconst u = unit[0];\n\t\t\t\t\tconst circle = this.querySelector('circle');\n\t\t\t\t\tif (circle) {\n\t\t\t\t\t\tcircle.style.animationDuration = `${2 * num}${u}`;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\t'*',\n\t\t\t\tfunction () {\n\t\t\t\t\tthis._elt.innerHTML =\n\t\t\t\t\t\t'<svg viewBox=\"0 0 64 64\">' +\n\t\t\t\t\t\t'<circle r=\"16\" cy=\"32\" cx=\"32\"></circle>' +\n\t\t\t\t\t\t'</svg>';\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\ttokens: {\n\t\t\t'time': /(?:\\b|\\B-|(?=\\B\\.))(?:\\d+(?:\\.\\d+)?|\\.\\d+)m?s\\b/i,\n\t\t},\n\t\tlanguages: {\n\t\t\t'css': true,\n\t\t\t'less': true,\n\t\t\t'markup': {\n\t\t\t\tlang: 'markup',\n\t\t\t\tbefore: 'punctuation',\n\t\t\t\tinside: 'inside',\n\t\t\t\troot: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value'],\n\t\t\t},\n\t\t\t'sass': [\n\t\t\t\t{\n\t\t\t\t\tlang: 'sass',\n\t\t\t\t\tinside: 'inside',\n\t\t\t\t\troot: Prism.languages.sass && Prism.languages.sass['property-line'],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlang: 'sass',\n\t\t\t\t\tbefore: 'operator',\n\t\t\t\t\tinside: 'inside',\n\t\t\t\t\troot: Prism.languages.sass && Prism.languages.sass['variable-line'],\n\t\t\t\t},\n\t\t\t],\n\t\t\t'scss': true,\n\t\t\t'stylus': [\n\t\t\t\t{\n\t\t\t\t\tlang: 'stylus',\n\t\t\t\t\tbefore: 'hexcode',\n\t\t\t\t\tinside: 'rest',\n\t\t\t\t\troot:\n\t\t\t\t\t\tPrism.languages.stylus &&\n\t\t\t\t\t\tPrism.languages.stylus['property-declaration'].inside,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlang: 'stylus',\n\t\t\t\t\tbefore: 'hexcode',\n\t\t\t\t\tinside: 'rest',\n\t\t\t\t\troot:\n\t\t\t\t\t\tPrism.languages.stylus &&\n\t\t\t\t\t\tPrism.languages.stylus['variable-declaration'].inside,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n};\n\n/** @type {import('../../types.d.ts').PluginProto<'previewers'>} */\nconst Self = {\n\tid: 'previewers',\n\trequire: cssExtras,\n\tplugin () {\n\t\tconst collection = new PreviewerCollection();\n\n\t\tif (typeof document !== 'undefined') {\n\t\t\tfor (const previewer of Object.values(previewers)) {\n\t\t\t\tcollection.add(previewer.create());\n\t\t\t}\n\t\t}\n\n\t\treturn collection;\n\t},\n\teffect (Prism) {\n\t\t/*\n\t\tPrism.hooks.add('before-highlight', (env) => {\n\t\t\tfor (const previewer of Object.values(previewers)) {\n\t\t\t\tconst languages = previewer.languages;\n\t\t\t\tif (languages[env.language] && !languages[env.language].initialized) {\n\t\t\t\t\tlet lang = languages[env.language];\n\t\t\t\t\tif (!Array.isArray(lang)) {\n\t\t\t\t\t\tlang = [lang];\n\t\t\t\t\t}\n\t\t\t\t\tlang.forEach((lang) => {\n\t\t\t\t\t\tlet before; let inside; let root; let skip;\n\t\t\t\t\t\tif (lang === true) {\n\t\t\t\t\t\t\tbefore = 'important';\n\t\t\t\t\t\t\tinside = env.language;\n\t\t\t\t\t\t\tlang = env.language;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbefore = lang.before || 'important';\n\t\t\t\t\t\t\tinside = lang.inside || lang.lang;\n\t\t\t\t\t\t\troot = lang.root || Prism.languages;\n\t\t\t\t\t\t\tskip = lang.skip;\n\t\t\t\t\t\t\tlang = env.language;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!skip && Prism.languages[lang]) {\n\t\t\t\t\t\t\tPrism.languages.insertBefore(inside, before, previewer.tokens, root);\n\t\t\t\t\t\t\tenv.grammar = Prism.languages[lang];\n\n\t\t\t\t\t\t\tlanguages[env.language] = { initialized: true };\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t*/\n\n\t\treturn Prism.hooks.add('after-highlight', env => {\n\t\t\t/** @type {PreviewerCollection} */\n\t\t\tconst previewers = Prism.pluginRegistry.peek(Self)?.plugin;\n\t\t\tpreviewers.initEvents(env.element, env.language);\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/plugins/show-invisibles/README.md",
    "content": "---\ntitle: Show Invisibles\ndescription: Show hidden characters such as tabs and line breaks.\nowner: LeaVerou\noptional:\n  - autolinker\n  - data-uri-highlight\n---\n\n<section>\n\n# Examples\n\n<pre data-src=\"./show-invisibles.js\"></pre>\n\n<pre data-src=\"./show-invisibles.css\"></pre>\n\n<pre data-src=\"./index.html\"></pre>\n\n</section>\n"
  },
  {
    "path": "src/plugins/show-invisibles/show-invisibles.css",
    "content": ".token.tab:not(:empty),\n.token.cr,\n.token.lf,\n.token.space {\n\tposition: relative;\n}\n\n.token.tab:not(:empty):before,\n.token.cr:before,\n.token.lf:before,\n.token.space:before {\n\tcolor: #808080;\n\topacity: 0.6;\n\tposition: absolute;\n}\n\n.token.tab:not(:empty):before {\n\tcontent: \"\\21E5\";\n}\n\n.token.cr:before {\n\tcontent: \"\\240D\";\n}\n\n.token.crlf:before {\n\tcontent: \"\\240D\\240A\";\n}\n.token.lf:before {\n\tcontent: \"\\240A\";\n}\n\n.token.space:before {\n\tcontent: \"\\00B7\";\n}\n"
  },
  {
    "path": "src/plugins/show-invisibles/show-invisibles.js",
    "content": "import prism from '../../global.js';\nimport { tokenizeStrings } from '../../shared/tokenize-strings.js';\n\n/** @type {import('../../types.d.ts').PluginProto<'show-invisibles'>} */\nconst Self = {\n\tid: 'show-invisibles',\n\toptional: ['autolinker', 'data-uri-highlight', 'diff-highlight'],\n\teffect (Prism) {\n\t\tconst invisibles = {\n\t\t\t'tab': /\\t/,\n\t\t\t'crlf': /\\r\\n/,\n\t\t\t'lf': /\\n/,\n\t\t\t'cr': /\\r/,\n\t\t\t'space': / /,\n\t\t};\n\n\t\treturn Prism.hooks.add('after-tokenize', env => {\n\t\t\ttokenizeStrings(env.tokens, code => Prism.tokenize(code, invisibles));\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/plugins/show-language/README.md",
    "content": "---\ntitle: Show Language\ndescription: Display the highlighted language in code blocks (inline code does not show the label).\nowner: nauzilus\nrequire: toolbar\nnoCSS: true\nresources:\n  - /plugins/toolbar.css\n  - /plugins/toolbar.js { type=\"module\" }\n---\n\n<section>\n\n# Examples\n\n## JavaScript\n\n<pre data-src=\"./show-language.js\"></pre>\n\n## CSS\n\n<pre data-src=\"../toolbar/toolbar.css\"></pre>\n\n## HTML (Markup)\n\n<pre data-src=\"./index.html\"></pre>\n\n## SVG\n\nThe `data-language`{ .language-markup } attribute can be used to display a specific label whether it has been defined as a language or not.\n\n<pre data-language=\"SVG v1.1\" data-src=\"https://prismjs.com/assets/logo.svg\"></pre>\n\n## Plain text\n\n```none\nJust some text (aka. not code).\n```\n\n</section>\n"
  },
  {
    "path": "src/plugins/show-language/show-language.js",
    "content": "import prism from '../../global.js';\nimport { getParentPre } from '../../shared/dom-util.js';\nimport { getTitle } from '../../shared/meta/title-data.js';\nimport toolbar from '../toolbar/toolbar.js';\n\n/** @type {import('../../types.d.ts').PluginProto<'show-language'>} */\nconst Self = {\n\tid: 'show-language',\n\trequire: toolbar,\n\teffect (Prism) {\n\t\t/** @type {import('../toolbar/toolbar.js').Toolbar} */\n\t\tconst toolbar = Prism.pluginRegistry.peek('toolbar')?.plugin;\n\n\t\treturn toolbar.registerButton('show-language', env => {\n\t\t\tconst pre = getParentPre(env.element);\n\t\t\tif (!pre) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst title = pre.getAttribute('data-language') || getTitle(env.language);\n\t\t\tif (!title) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst element = document.createElement('span');\n\t\t\telement.textContent = title;\n\t\t\treturn element;\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/plugins/toolbar/README.md",
    "content": "---\ntitle: Toolbar\ndescription: Attach a toolbar for plugins to easily register buttons on the top of a code block.\nowner: mAAdhaTTah\nbody_classes: language-markup\nresources: ./demo.js { defer }\n---\n\n<section data-toolbar-order=\"select-code,hello-world,label\">\n\n# How to use\n\nThe Toolbar plugin allows for several methods to register your button, using the `Prism.plugins.toolbar.registerButton` function.\n\nThe simplest method is through the HTML API. Add a `data-label` attribute to the `pre` element, and the Toolbar plugin will read the value of that attribute and append a label to the code snippet.\n\n```html { data-label=\"Hello World!\" }\n<pre data-src=\"./toolbar.js\" data-label=\"Hello World!\"></pre>\n```\n\nIf you want to provide arbitrary HTML to the label, create a `template` element with the HTML you want in the label, and provide the `template` element's `id` to `data-label`. The Toolbar plugin will use the template's content for the button. You can also use to declare your event handlers inline:\n\n```html { data-label=\"my-label-button\" }\n<pre data-src=\"./toolbar.js\" data-label=\"my-label-button\"></pre>\n```\n\n```html\n<template id=\"my-label-button\"><button onclick=\"console.log('This is an inline-handler');\">My button</button></template>\n```\n\n## Registering buttons\n\nFor more flexibility, the Toolbar exposes a JavaScript function that can be used to register new buttons or labels to the Toolbar, `Prism.plugins.toolbar.registerButton`.\n\nThe function accepts a key for the button and an object with a `text` property string and an optional `onClick` function or a `url` string. The `onClick` function will be called when the button is clicked, while the `url` property will be set to the anchor tag's `href`.\n\n```js\nPrism.plugins.toolbar.registerButton('hello-world', {\n\ttext: 'Hello World!', // required\n\tonClick: function (env) {\n\t\t// optional\n\t\talert(`This code snippet is written in ${env.language}.`);\n\t},\n});\n```\n\nSee how the above code registers the `Hello World!` button? You can use this in your plugins to register your own buttons with the toolbar.\n\nIf you need more control, you can provide a function to `registerButton` that returns either a `span`, `a`, or `button` element.\n\n```js\nPrism.plugins.toolbar.registerButton('select-code', env => {\n\tlet button = document.createElement('button');\n\tbutton.innerHTML = 'Select Code';\n\n\tbutton.addEventListener('click', () => {\n\t\t// Source: http://stackoverflow.com/a/11128179/2757940\n\t\tif (document.body.createTextRange) {\n\t\t\t// ms\n\t\t\tlet range = document.body.createTextRange();\n\t\t\trange.moveToElementText(env.element);\n\t\t\trange.select();\n\t\t} else if (window.getSelection) {\n\t\t\t// moz, opera, webkit\n\t\t\tlet selection = window.getSelection();\n\t\t\tlet range = document.createRange();\n\t\t\trange.selectNodeContents(env.element);\n\t\t\tselection.removeAllRanges();\n\t\t\tselection.addRange(range);\n\t\t}\n\t});\n\n\treturn button;\n});\n```\n\nThe above function creates the Select Code button you see, and when you click it, the code gets highlighted.\n\n## Ordering buttons\n\nBy default, the buttons will be added to the code snippet in the order they were registered. If more control over the order is needed, the `data-toolbar-order` attribute can be used. Given a comma-separated list of button names, it will ensure that these buttons will be displayed in the given order.  \nButtons not listed will not be displayed. This means that buttons can be disabled using this technique.\n\nExample: The \"Hello World!\" button will appear before the \"Select Code\" button and the custom label button will not be displayed.\n\n```html { data-toolbar-order=\"hello-world,select-code\" data-label=\"Hello World!\" }\n<pre data-toolbar-order=\"hello-world,select-code\" data-label=\"Hello World!\"><code></code></pre>\n```\n\nThe `data-toolbar-order` attribute is inherited, so you can define the button order for the whole document by adding the attribute to the `body` of the page.\n\n```html\n<body data-toolbar-order=\"select-code,hello-world,label\">\n```\n\n</section>\n\n<template id=\"my-label-button\"><button onclick=\"console.log('This is an inline-handler');\">My button</button></template>\n"
  },
  {
    "path": "src/plugins/toolbar/demo.js",
    "content": "Prism.plugins.toolbar.registerButton('hello-world', {\n\ttext: 'Hello World!', // required\n\tonClick: function (env) {\n\t\t// optional\n\t\talert(`This code snippet is written in ${env.language}.`);\n\t},\n});\n\nPrism.plugins.toolbar.registerButton('select-code', env => {\n\tlet button = document.createElement('button');\n\tbutton.innerHTML = 'Select Code';\n\n\tbutton.addEventListener('click', () => {\n\t\t// Source: http://stackoverflow.com/a/11128179/2757940\n\t\tif (document.body.createTextRange) {\n\t\t\t// ms\n\t\t\tlet range = document.body.createTextRange();\n\t\t\trange.moveToElementText(env.element);\n\t\t\trange.select();\n\t\t}\n\t\telse if (window.getSelection) {\n\t\t\t// moz, opera, webkit\n\t\t\tlet selection = window.getSelection();\n\t\t\tlet range = document.createRange();\n\t\t\trange.selectNodeContents(env.element);\n\t\t\tselection.removeAllRanges();\n\t\t\tselection.addRange(range);\n\t\t}\n\t});\n\n\treturn button;\n});\n"
  },
  {
    "path": "src/plugins/toolbar/toolbar.css",
    "content": "div.code-toolbar {\n\tposition: relative;\n}\n\ndiv.code-toolbar > .toolbar {\n\tposition: absolute;\n\tz-index: 10;\n\ttop: 0.3em;\n\tright: 0.2em;\n\ttransition: opacity 0.3s ease-in-out;\n\topacity: 0;\n}\n\ndiv.code-toolbar:hover > .toolbar {\n\topacity: 1;\n}\n\n/* Separate line b/c rules are thrown out if selector is invalid.\n   IE11 and old Edge versions don't support :focus-within. */\ndiv.code-toolbar:focus-within > .toolbar {\n\topacity: 1;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item {\n\tdisplay: inline-block;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a {\n\tcursor: pointer;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > button {\n\tbackground: none;\n\tborder: 0;\n\tcolor: inherit;\n\tfont: inherit;\n\tline-height: normal;\n\toverflow: visible;\n\tpadding: 0;\n\t-webkit-user-select: none; /* for button */\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a,\ndiv.code-toolbar > .toolbar > .toolbar-item > button,\ndiv.code-toolbar > .toolbar > .toolbar-item > span {\n\tcolor: #bbb;\n\tfont-size: 0.8em;\n\tpadding: 0 0.5em;\n\tbackground: #f5f2f0;\n\tbackground: rgba(224, 224, 224, 0.2);\n\tbox-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2);\n\tborder-radius: 0.5em;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > a:focus,\ndiv.code-toolbar > .toolbar > .toolbar-item > button:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > button:focus,\ndiv.code-toolbar > .toolbar > .toolbar-item > span:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > span:focus {\n\tcolor: inherit;\n\ttext-decoration: none;\n}\n"
  },
  {
    "path": "src/plugins/toolbar/toolbar.js",
    "content": "import prism from '../../global.js';\nimport { getParentPre } from '../../shared/dom-util.js';\nimport { noop } from '../../shared/util.js';\n\n/**\n * Returns the callback order of the given element.\n *\n * @param {Element} element\n */\nfunction getOrder (element) {\n\t/** @type {Element | null} */\n\tlet e = element;\n\tfor (; e; e = e.parentElement) {\n\t\tlet order = e.getAttribute('data-toolbar-order');\n\t\tif (order != null) {\n\t\t\torder = order.trim();\n\t\t\tif (order.length) {\n\t\t\t\treturn order.split(/\\s*,\\s*/);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport class Toolbar {\n\t/**\n\t * @type {ButtonFactory[]}\n\t */\n\tcallbacks = [];\n\n\t/**\n\t * @type {Map<string, ButtonFactory>}\n\t */\n\tmap = new Map();\n\n\t/**\n\t * Register a button callback with the toolbar.\n\t *\n\t * The returned function will remove the added callback again when called.\n\t *\n\t * @param {string} key\n\t * @param {ButtonOptions | ButtonFactory} opts\n\t * @returns {function():void}\n\t */\n\tregisterButton (key, opts) {\n\t\t/** @type {ButtonFactory} */\n\t\tlet callback;\n\n\t\tif (typeof opts === 'function') {\n\t\t\tcallback = opts;\n\t\t}\n\t\telse {\n\t\t\tcallback = function (env) {\n\t\t\t\tconst { text, url, onClick, className } = opts;\n\n\t\t\t\tlet element;\n\t\t\t\tif (typeof onClick === 'function') {\n\t\t\t\t\telement = document.createElement('button');\n\t\t\t\t\telement.type = 'button';\n\t\t\t\t\telement.addEventListener('click', function () {\n\t\t\t\t\t\tonClick.call(this, env);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (typeof url === 'string') {\n\t\t\t\t\telement = document.createElement('a');\n\t\t\t\t\telement.href = url;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\telement = document.createElement('span');\n\t\t\t\t}\n\n\t\t\t\tif (className) {\n\t\t\t\t\telement.classList.add(className);\n\t\t\t\t}\n\n\t\t\t\telement.textContent = text;\n\n\t\t\t\treturn element;\n\t\t\t};\n\t\t}\n\n\t\tif (this.map.has(key)) {\n\t\t\tconsole.warn('There is a button with the key \"' + key + '\" registered already.');\n\t\t\treturn noop;\n\t\t}\n\n\t\tthis.map.set(key, callback);\n\t\tthis.callbacks.push(callback);\n\n\t\treturn () => {\n\t\t\tthis.map.delete(key);\n\t\t\tconst index = this.callbacks.indexOf(callback);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.callbacks.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * @type {HookCallback}\n\t */\n\thook = env => {\n\t\t// Check if inline or actual code block (credit to line-numbers plugin)\n\t\tconst pre = getParentPre(env.element);\n\t\tif (!pre) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst container = pre.parentElement;\n\t\tif (!container) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Autoloader rehighlights, so only do this once.\n\t\tif (container.classList.contains('code-toolbar')) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Create wrapper for <pre> to prevent scrolling toolbar with content\n\t\tconst wrapper = document.createElement('div');\n\t\twrapper.classList.add('code-toolbar');\n\t\tcontainer.insertBefore(wrapper, pre);\n\t\twrapper.appendChild(pre);\n\n\t\t// Setup the toolbar\n\t\tconst toolbar = document.createElement('div');\n\t\ttoolbar.classList.add('toolbar');\n\n\t\t// order callbacks\n\t\tlet elementCallbacks = this.callbacks;\n\t\tconst order = getOrder(env.element);\n\t\tif (order) {\n\t\t\telementCallbacks = /** @type {ButtonFactory[]} */ (\n\t\t\t\torder.map(key => this.map.get(key) || noop)\n\t\t\t);\n\t\t}\n\n\t\telementCallbacks.forEach(callback => {\n\t\t\tconst element = callback(env);\n\n\t\t\tif (!element) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item = document.createElement('div');\n\t\t\titem.classList.add('toolbar-item');\n\n\t\t\titem.appendChild(element);\n\t\t\ttoolbar.appendChild(item);\n\t\t});\n\n\t\t// Add our toolbar to the currently created wrapper of <pre> tag\n\t\twrapper.appendChild(toolbar);\n\t};\n}\n\n/** @type {ButtonFactory} */\nconst label = env => {\n\tconst pre = getParentPre(env.element);\n\tif (!pre) {\n\t\treturn;\n\t}\n\n\tif (!pre.hasAttribute('data-label')) {\n\t\treturn;\n\t}\n\n\tlet element;\n\tlet template;\n\tconst text = pre.getAttribute('data-label');\n\ttry {\n\t\t// Any normal text will blow up this selector.\n\t\tif (text) {\n\t\t\ttemplate = document.querySelector('template#' + text);\n\t\t}\n\t}\n\tcatch {\n\t\t/* noop */\n\t}\n\n\tif (template) {\n\t\telement = /** @type {HTMLTemplateElement} */ (template).content;\n\t}\n\telse {\n\t\tconst url = pre.getAttribute('data-url');\n\t\tif (url) {\n\t\t\telement = document.createElement('a');\n\t\t\telement.href = url;\n\t\t}\n\t\telse {\n\t\t\telement = document.createElement('span');\n\t\t}\n\n\t\telement.textContent = text;\n\t}\n\n\treturn element;\n};\n\n/** @type {import('../../types.d.ts').PluginProto<'toolbar'>} */\nconst Self = {\n\tid: 'toolbar',\n\tplugin () {\n\t\tconst toolbar = new Toolbar();\n\t\ttoolbar.registerButton('label', label);\n\t\treturn toolbar;\n\t},\n\teffect (Prism) {\n\t\t/** @type {Toolbar} */\n\t\tconst toolbar = Prism.pluginRegistry.peek(Self)?.plugin;\n\t\treturn Prism.hooks.add('complete', toolbar.hook);\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n\n/**\n * @typedef {import('../../types.d.ts').HookEnv} HookEnv\n * @typedef {import('../../types.d.ts').HookCallback} HookCallback\n */\n\n/**\n * @typedef {object} ButtonOptions\n * @property {string} text The text displayed.\n * @property {string} [url] The URL of the link which will be created.\n * @property {(env: HookEnv) => void} [onClick] The event listener for the `click` event of the created button.\n * @property {string} [className] The class attribute to include with the element.\n */\n\n/**\n * @callback ButtonFactory\n * @param {HookEnv} env\n * @returns {Node | undefined}\n */\n"
  },
  {
    "path": "src/plugins/treeview-icons/README.md",
    "content": "---\ntitle: Treeview\ndescription: A language with special styles to highlight file system tree structures.\nowner: Golmote\n---\n\n<section class=\"language-none\">\n\n# How to use\n\nYou may use `tree -F` to get a compatible text structure.\n\n```treeview\nroot_folder/\n|-- a first folder/\n|   |-- holidays.mov\n|   |-- javascript-file.js\n|   `-- some_picture.jpg\n|-- documents/\n|   |-- spreadsheet.xls\n|   |-- manual.pdf\n|   |-- document.docx\n|   `-- presentation.ppt\n|       `-- test\n|-- empty_folder/\n|-- going deeper/\n|   |-- going deeper/\n|   |   `-- going deeper/\n|   |        `-- going deeper/\n|   |            `-- .secret_file\n|   |-- style.css\n|   `-- index.html\n|-- music and movies/\n|   |-- great-song.mp3\n|   |-- S01E02.new.episode.avi\n|   |-- S01E02.new.episode.nfo\n|   `-- track 1.cda\n|-- .gitignore\n|-- .htaccess\n|-- .npmignore\n|-- archive 1.zip\n|-- archive 2.tar.gz\n|-- logo.svg\n`-- README.md\n```\n\nYou can also use the following box-drawing characters to represent the tree:\n\n```treeview\nroot_folder/\n├── a first folder/\n|   ├── holidays.mov\n|   ├── javascript-file.js\n|   └── some_picture.jpg\n├── documents/\n|   ├── spreadsheet.xls\n|   ├── manual.pdf\n|   ├── document.docx\n|   └── presentation.ppt\n└── etc.\n```\n\n</section>\n"
  },
  {
    "path": "src/plugins/treeview-icons/treeview-icons.css",
    "content": ".token.treeview-part .entry-line {\n\tposition: relative;\n\ttext-indent: -99em;\n\tdisplay: inline-block;\n\tvertical-align: top;\n\twidth: 1.2em;\n}\n.token.treeview-part .entry-line:before,\n.token.treeview-part .line-h:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tleft: 50%;\n\twidth: 50%;\n\theight: 100%;\n}\n.token.treeview-part .line-h:before,\n.token.treeview-part .line-v:before {\n\tborder-left: 1px solid #ccc;\n}\n.token.treeview-part .line-v-last:before {\n\theight: 50%;\n\tborder-left: 1px solid #ccc;\n\tborder-bottom: 1px solid #ccc;\n}\n.token.treeview-part .line-h:after {\n\theight: 50%;\n\tborder-bottom: 1px solid #ccc;\n}\n.token.treeview-part .entry-name {\n\tposition: relative;\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n.token.treeview-part .entry-name.dotfile {\n\topacity: 0.5;\n}\n\n/* @GENERATED-FONT */\n@font-face {\n\tfont-family: \"PrismTreeview\";\n\t/**\n\t * This font is generated from the .svg files in the `icons` folder. See the `treeviewIconFont` function in\n\t * `scripts/build.js` for more information.\n\t *\n\t * Use the following escape sequences to refer to a specific icon:\n\t *\n\t * - \\ea01 file\n\t * - \\ea02 folder\n\t * - \\ea03 image\n\t * - \\ea04 audio\n\t * - \\ea05 video\n\t * - \\ea06 text\n\t * - \\ea07 code\n\t * - \\ea08 archive\n\t * - \\ea09 pdf\n\t * - \\ea0a excel\n\t * - \\ea0b powerpoint\n\t * - \\ea0c word\n\t */\n\tsrc: url(\"data:application/font-woff;base64,d09GRgABAAAAAAmEAAsAAAAAEzwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAAMUAAAE2JkkqGE9TLzIAAAHQAAAAQQAAAGBLtUI0Y21hcAAAAhQAAAEfAAADPGXJZIpnbHlmAAADNAAAA+MAAAlACm1VqmhlYWQAAAcYAAAAKgAAADZfxj5jaGhlYQAAB0QAAAAYAAAAJAFbANRobXR4AAAHXAAAABAAAACACGQAAGxvY2EAAAdsAAAAJQAAAEI7NDjibWF4cAAAB5QAAAAfAAAAIAEzAHZuYW1lAAAHtAAAATcAAAJSfUrk+HBvc3QAAAjsAAAAlQAAANURv2OieJxNjksSwVAQRU9IEOTnG4nPFowMjZSRoTI3UqpSRgaWYAVWYDFWYD1uOlR5Vf3S5/W9N40DtFmyprbZ7vaExfF6IcOlOuX8v3eK8+lI60eaufZtqd74pKzYcuDGnQdPXtRoMLA7IaJHTN98oSi2ro4nxZDRl9vijFwUmW+k9KZcOVO5Ur27UoyVFSrTMfLUl9kVN1SxMiZGTVVi0zJtSkd/SJjbJjN1IQspfe3RIzBH1xx9saP3QIpY+6VS5XLMPw6UD6QAAAB4nGNgYXBmnMDAysDAUMhQCyQloXQoAweDHgMDEwMrMwNWEJDmmsJwgCHxFQ/DZiBXgOEwAyOQZkRRxAUAq90IcAAAAHicvdLbboJAEAbgf0XxBKiI4AEh6WXTlzL2ZNKDMbb1AZo+UK/6TPsS9h9mkt72pl3yOZlBmM0yADoAArqiNuC+4CDrk1XX1AMMmnobH8wT9NBCiA122OOAk4/OZ9Y32OKB+dG7Jv9Zjs8kWOKC1yXzGVZIMUaMHCXvjJChxgRrTLFAgTkq/tuxS8CeHfbqsmefuxgi4utC/P3iHtNxnJcJMMrqSbO1Yl4t/6H1r1YkP+7dshpy/mpGW7Oia5PSjRnTrYnpzuR0b0raGZ4Cv60a0aPJ6MnIHp7NhPZmTQczpaNZ0Isp6NXM6c1UdDI8eu+UzKVvKUgMlMyxbyuZZd9RMuM+VJDYVZDYU5DYV5A4UDL7fqggMVKIvgF69jrmAHiclVXNbttGEN6Z/dOSXEoK/2LLkg0xIN3EdWxRJGMktR0HENo0BdoaLer2EqBAip5zywP0llMvTU699QX6fums7DSNEhoqJc7uzg535/tmdpZxxt68Ya/Z3yximyxnrJ3AGGJ1B6bFZzBv7sMszXRSFXehyOrcKfPkdy6U+E0oJS6Ex8MCYBtv3Rbyq5fciOdO/6eQgquC08Qfz5T45BWjB51gf9EvY3u0Uz0vrrZxraJtU9quaZP3tx9DNUtfK7FwC+8IKcULoQJrXhhrzY5nHxl7sJxTTjwl8Xjhpp46wS1jcgXjbVath7NN8rrNWj0t5s0sjVUn7ufPIltUPd8f+H43B5/uRJEtrTMa+MSEWvHrHvuC/bimZ8RKrPPpXcjfWrVNNmubebkPIWRprNUEyqWimKp4qYjTTgCHiAAwtCTRDmGPo7UoBaDnIYgI0RhQAqVE0Y3vG8CGFhggxIBDWPDBLvW5wmAnQMX7aDYNCokqVLT2h3Gp2MM10buk+K+NG+Z6Wpd1e1B1gjyVvZ4spdbyB4KLoxF2Y7nQZHlpDnjEAUZmxD4Ss4o9Yudrev02nS/t6ux9FNXquBPHBuICCMEC8fFV+06D14D63oVXOUFx0e4DEpsIyn2mAD+Cr2Vfsp/WxNfMtiGN+y77cq0oN4u2SvvgetN53ZYP4ASaWUbH6QSOocomkOhY5Z04c/JQAty4ASDJ1wzgF8QUOEiIIhIcdgHBggMAIcI10aQkJrONm8AFLe+QbwMIDjc3YDn1hMM5OGJc4+Js/uWBM8181l/WjZZO6LeucuUJwR7DZZusw07u7LKUahuFfn4CdZVQWdOzZu7OZ3pqNy39zzu4sLZ66EOf2AxsD0VIqen1ei/tu6fsAh8Erz7POVJx6iHfDQJ+SAbCnb/eSqy/Zt9RrH9mv65bg7JZNctSfRhPi1JplU/zsjh2hShp2qbdh+V3iU5ineqmDaFVWTsvqVs6+6zIqd53Rv+JkEqFHDGwKhv2DSAHV4ZAKk1a7l4aHEijdIkuEcI+70kuH3Bfy2tOwX3kErkQHBXlvvYoI8D4YWD6RggQgR4cYijMhTBU+84kR+0bXyFnYoWvk3VvkarO2yx3TdmSSCpdLptMd6KfbGmK9ERHkXY9PaZeN6TM8+LY87a2PC+KPG80/qC2Nuz0f3hbV7P2GOb7cAeSKmndeHmDdLo73jGhlqpHVN0ym0EguVL8Wn+HwO0gEN69rRHyIXeHbpXfdW8DIrI6gcNtqK7YTXK6F5eyqjtd9vRwYAHsYKAnxgMIgz6AZ64pIt5ZjaI687w9LY6OhN7z2D+hNgTCAHicY2BkYGAAYv3Xf7Li+W2+MnAzbGbAAP//Myxn2AJkcDAwgfgA+ZUIQwAAeJxjYGRgYNjMwAAnlzMwMqACBQA0BQIweJxjYACCzSRiKgIAUCEIZXicY2AAAjOGIoZ9jHaMM5g4mHqY/jFPY37D4saygDgIABq6EnkAAAB4nGNgZGBgUGDIYuBkAAEmIOYCQgaG/2A+AwAW0wGqAHicfZFNbsIwEIVf+KsKaoXUqouu3E03lRJgVw4AW4QQ+wB2CEri1DEg9j1HT9BzcI6eouu+pN6kEvVI42/evJmFDaCPMzyUx8NNlcvTwBWrX26S7h23yE+O2+jBd9yh/uq4ixdMHPdwhzdu8FrXVB7x7riBW3w4blL/dNwinx238YAvxx3q3467WHp9xz08e2pm4iJdGCkPsTzOZbRPQlPTasVSmiLWmRj6g5o+lZk0oZUbsTqJ4hCNrFVCGZ2Kic6sTBItcqN3cm39rbX5OAiU0/21TjGDQYwCKRYkyTiwljhizhxhjwQhO5d9lztLZsNODI0MAkO+++Af/5Q5q2ZCWN4bzqxwYi7oiTCiaqFYK3o0Nwj+WLm7dCcMTSWvejsqa+o+ttVUjjEChvrj9+niph8pXG9DAHicbcHJDoIwFEDRXm3FeZ5H/DRCX7UJWtIg8Pku3HqO6qgf1H8pHbpoDD0S+gwYMmLMhCkz5ixYsmLNhi079hw4cuLMhSs3Uu5KO19Iz4XCSjT+lT3EZB/rg6m9laAraSudBytJFvOnr6VbWmekzaUYlqGRWAb/rnQTosXhKRAClsiLjAcfaipacp6UNLyV+gLQNSS+AAAA\")\n\t\tformat(\"woff\");\n}\n\n.token.treeview-part .entry-name:before {\n\tcontent: \"\\ea01\";\n\tfont-family: \"PrismTreeview\";\n\tfont-size: inherit;\n\tfont-style: normal;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\twidth: 2.5ex;\n\tdisplay: inline-block;\n}\n\n.token.treeview-part .entry-name.dir:before {\n\tcontent: \"\\ea02\";\n}\n.token.treeview-part .entry-name.ext-bmp:before,\n.token.treeview-part .entry-name.ext-eps:before,\n.token.treeview-part .entry-name.ext-gif:before,\n.token.treeview-part .entry-name.ext-jpe:before,\n.token.treeview-part .entry-name.ext-jpg:before,\n.token.treeview-part .entry-name.ext-jpeg:before,\n.token.treeview-part .entry-name.ext-png:before,\n.token.treeview-part .entry-name.ext-svg:before,\n.token.treeview-part .entry-name.ext-tiff:before {\n\tcontent: \"\\ea03\";\n}\n.token.treeview-part .entry-name.ext-cfg:before,\n.token.treeview-part .entry-name.ext-conf:before,\n.token.treeview-part .entry-name.ext-config:before,\n.token.treeview-part .entry-name.ext-csv:before,\n.token.treeview-part .entry-name.ext-ini:before,\n.token.treeview-part .entry-name.ext-log:before,\n.token.treeview-part .entry-name.ext-md:before,\n.token.treeview-part .entry-name.ext-nfo:before,\n.token.treeview-part .entry-name.ext-txt:before {\n\tcontent: \"\\ea06\";\n}\n.token.treeview-part .entry-name.ext-asp:before,\n.token.treeview-part .entry-name.ext-aspx:before,\n.token.treeview-part .entry-name.ext-c:before,\n.token.treeview-part .entry-name.ext-cc:before,\n.token.treeview-part .entry-name.ext-cpp:before,\n.token.treeview-part .entry-name.ext-cs:before,\n.token.treeview-part .entry-name.ext-css:before,\n.token.treeview-part .entry-name.ext-h:before,\n.token.treeview-part .entry-name.ext-hh:before,\n.token.treeview-part .entry-name.ext-htm:before,\n.token.treeview-part .entry-name.ext-html:before,\n.token.treeview-part .entry-name.ext-jav:before,\n.token.treeview-part .entry-name.ext-java:before,\n.token.treeview-part .entry-name.ext-js:before,\n.token.treeview-part .entry-name.ext-php:before,\n.token.treeview-part .entry-name.ext-rb:before,\n.token.treeview-part .entry-name.ext-xml:before {\n\tcontent: \"\\ea07\";\n}\n.token.treeview-part .entry-name.ext-7z:before,\n.token.treeview-part .entry-name.ext-bz:before,\n.token.treeview-part .entry-name.ext-bz2:before,\n.token.treeview-part .entry-name.ext-gz:before,\n.token.treeview-part .entry-name.ext-rar:before,\n.token.treeview-part .entry-name.ext-tar:before,\n.token.treeview-part .entry-name.ext-tgz:before,\n.token.treeview-part .entry-name.ext-zip:before {\n\tcontent: \"\\ea08\";\n}\n.token.treeview-part .entry-name.ext-aac:before,\n.token.treeview-part .entry-name.ext-au:before,\n.token.treeview-part .entry-name.ext-cda:before,\n.token.treeview-part .entry-name.ext-flac:before,\n.token.treeview-part .entry-name.ext-mp3:before,\n.token.treeview-part .entry-name.ext-oga:before,\n.token.treeview-part .entry-name.ext-ogg:before,\n.token.treeview-part .entry-name.ext-wav:before,\n.token.treeview-part .entry-name.ext-wma:before {\n\tcontent: \"\\ea04\";\n}\n.token.treeview-part .entry-name.ext-avi:before,\n.token.treeview-part .entry-name.ext-flv:before,\n.token.treeview-part .entry-name.ext-mkv:before,\n.token.treeview-part .entry-name.ext-mov:before,\n.token.treeview-part .entry-name.ext-mp4:before,\n.token.treeview-part .entry-name.ext-mpeg:before,\n.token.treeview-part .entry-name.ext-mpg:before,\n.token.treeview-part .entry-name.ext-ogv:before,\n.token.treeview-part .entry-name.ext-webm:before {\n\tcontent: \"\\ea05\";\n}\n.token.treeview-part .entry-name.ext-pdf:before {\n\tcontent: \"\\ea09\";\n}\n.token.treeview-part .entry-name.ext-xls:before,\n.token.treeview-part .entry-name.ext-xlsx:before {\n\tcontent: \"\\ea0a\";\n}\n.token.treeview-part .entry-name.ext-doc:before,\n.token.treeview-part .entry-name.ext-docm:before,\n.token.treeview-part .entry-name.ext-docx:before {\n\tcontent: \"\\ea0c\";\n}\n.token.treeview-part .entry-name.ext-pps:before,\n.token.treeview-part .entry-name.ext-ppt:before,\n.token.treeview-part .entry-name.ext-pptx:before {\n\tcontent: \"\\ea0b\";\n}\n"
  },
  {
    "path": "src/plugins/treeview-icons/treeview-icons.js",
    "content": "import prism from '../../global.js';\nimport treeview from '../../languages/treeview.js';\n\n/** @type {import('../../types.d.ts').PluginProto<'treeview-icons'>} */\nconst Self = {\n\tid: 'treeview-icons',\n\trequire: treeview,\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/plugins/unescaped-markup/README.md",
    "content": "---\ntitle: Unescaped Markup\ndescription: Write markup without having to escape anything.\nowner: LeaVerou\n---\n\n<section class=\"language-markup\">\n\n# How to use\n\nThis plugin provides several methods of achieving the same thing:\n\n- Instead of using `<pre><code>` elements, use `<script type=\"text/plain\">`:\n\n```html\n<script type=\"text/plain\" class=\"language-markup\">\n<p>Example</p>\n</script>\n```\n\n- Use an HTML-comment to escape your code:\n\n```html\n<pre class=\"language-markup\"><code><!--\n<p>Example</p>\n--></code></pre>\n```\n\nThis will only work if the `code` element contains exactly one comment and nothing else (not even spaces). E.g. `<code> <!-- some text --></code>` and `<code>text<!-- more text --></code>` will not work.\n\n</section>\n\n<section class=\"language-markup\">\n\n# Examples\n\nView source to see that the following didn’t need escaping (except for <code>&lt;/script></code>, that does):\n\n<script type=\"text/plain\"><!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\n\t<meta charset=\"utf-8\" />\n\t<link rel=\"icon\" href=\"https://prismjs.com/assets/favicon.png\" />\n\t<title>Keep markup ▲ Prism plugins</title>\n\t<base href=\"..\" />\n\t<link rel=\"stylesheet\" href=\"https://prismjs.com/assets/style.css\" />\n\t<link rel=\"stylesheet\" href=\"https://dev.prismjs.com/themes/prism.css\" />\n\n</head>\n<body class=\"language-markup\">\n\n<header>\n\t<h2>Unescaped markup</h2>\n\t<p>Write markup without having to escape anything.</p>\n</header>\n\n<section>\n\t<h1>How to use</h1>\n\t<p>Instead of using <code>&lt;pre>&lt;code></code> elements, use <code>&lt;script type=\"text/plain\"></code>:</p>\n</section>\n\n<section>\n\t<h1>FAQ</h1>\n\n\t<p>Why not use the HTML <code>&lt;template></code> tag?</p>\n\n\t<p>Because it is a PITA to get its <code>textContent</code> and needs to be pointlessly cloned.\n\t\tFeel free to implement it yourself and send a pull request though, if you are so inclined.</p>\n\n\t<p>Can I use this inline?</p>\n\n\t<p>Not out of the box, because I figured it’s more of a hassle to type <code>&lt;script type=\"text/plain\"></code> than escape the 1-2 <code>&lt;</code> characters you need to escape in inline code.\n\tAlso inline code is not as frequently copy-pasted, which was the major source of annoyance that got me to write this plugin.</p>\n</section>\n\n<section>\n\t<h1>Examples</h1>\n\n\t<p>With <code>&lt;script type=\"text/plain\"></code>:</p>\n\n\t<script type=\"text/plain\"><div><span>Foo</span></div>&lt;/script>\n</section>\n\n<script src=\"https://dev.prismjs.com/prism.js\">&lt;/script>\n<script src=\"unescaped-markup/unescaped-markup.js\">&lt;/script>\n\n</body>\n</html></script>\n\n<p>The next example uses the HTML-comment method:</p>\n\n<pre><code><!--<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\n\t<meta charset=\"utf-8\" />\n\t<link rel=\"icon\" href=\"https://prismjs.com/assets/favicon.png\" />\n\t<title>Keep markup ▲ Prism plugins</title>\n\t<base href=\"..\" />\n\t<link rel=\"stylesheet\" href=\"https://prismjs.com/assets/style.css\" />\n\t<link rel=\"stylesheet\" href=\"https://dev.prismjs.com/themes/prism.css\" />\n\n</head>\n<body class=\"language-markup\">\n\n<header>\n\t<h2>Unescaped markup</h2>\n\t<p>Write markup without having to escape anything.</p>\n</header>\n\n<section>\n\t<h1>How to use</h1>\n\t<p>Instead of using <code>&lt;pre>&lt;code></code> elements, use <code>&lt;script type=\"text/plain\"></code>:</p>\n</section>\n\n<section>\n\t<h1>FAQ</h1>\n\n\t<p>Why not use the HTML <code>&lt;template></code> tag?</p>\n\n\t<p>Because it is a PITA to get its <code>textContent</code> and needs to be pointlessly cloned.\n\t\tFeel free to implement it yourself and send a pull request though, if you are so inclined.</p>\n\n\t<p>Can I use this inline?</p>\n\n\t<p>Not out of the box, because I figured it’s more of a hassle to type <code>&lt;script type=\"text/plain\"></code> than escape the 1-2 <code>&lt;</code> characters you need to escape in inline code.\n\tAlso inline code is not as frequently copy-pasted, which was the major source of annoyance that got me to write this plugin.</p>\n</section>\n\n<section>\n\t<h1>Examples</h1>\n\n\t<p>With <code>&lt;script type=\"text/plain\"></code>:</p>\n\n\t<script type=\"text/plain\"><div><span>Foo</span></div></script>\n</section>\n\n<script src=\"https://dev.prismjs.com/prism.js\"></script>\n<script src=\"unescaped-markup/unescaped-markup.js\"></script>\n\n</body>\n</html>--></code></pre>\n\n</section>\n\n<section class=\"language-markup\">\n\n# FAQ\n\nWhy not use the HTML `<template>` tag?\n\nBecause it is a PITA to get its `textContent` and needs to be pointlessly cloned. Feel free to implement it yourself and send a pull request though, if you are so inclined.\n\nCan I use this inline?\n\nNot out of the box, because I figured it’s more of a hassle to type `<script type=\"text/plain\">` than escape the 1-2 `<` characters you need to escape in inline code. Also inline code is not as frequently copy-pasted, which was the major source of annoyance that got me to write this plugin.\n\n</section>\n"
  },
  {
    "path": "src/plugins/unescaped-markup/unescaped-markup.css",
    "content": "/* Fallback, in case JS does not run, to ensure the code is at least visible */\n[class*=\"lang-\"] script[type=\"text/plain\"],\n[class*=\"language-\"] script[type=\"text/plain\"],\nscript[type=\"text/plain\"][class*=\"lang-\"],\nscript[type=\"text/plain\"][class*=\"language-\"] {\n\tdisplay: block;\n\tfont:\n\t\t100% Consolas,\n\t\tMonaco,\n\t\tmonospace;\n\twhite-space: pre;\n\toverflow: auto;\n}\n"
  },
  {
    "path": "src/plugins/unescaped-markup/unescaped-markup.js",
    "content": "import prism from '../../global.js';\n\n/** @type {import('../../types.d.ts').PluginProto<'unescaped-markup'>} */\nconst Self = {\n\tid: 'unescaped-markup',\n\teffect (Prism) {\n\t\treturn Prism.hooks.add({\n\t\t\t'before-highlightall': env => {\n\t\t\t\tenv.selector +=\n\t\t\t\t\t', [class*=\"lang-\"] script[type=\"text/plain\"]' +\n\t\t\t\t\t', [class*=\"language-\"] script[type=\"text/plain\"]' +\n\t\t\t\t\t', script[type=\"text/plain\"][class*=\"lang-\"]' +\n\t\t\t\t\t', script[type=\"text/plain\"][class*=\"language-\"]';\n\t\t\t},\n\t\t\t'before-sanity-check': env => {\n\t\t\t\t/** @type {HTMLElement} */\n\t\t\t\tconst element = env.element;\n\n\t\t\t\tif (element.matches('script[type=\"text/plain\"]')) {\n\t\t\t\t\t// found a <script type=\"text/plain\" ...> element\n\t\t\t\t\t// we convert this element to a regular <pre><code> code block\n\n\t\t\t\t\tconst code = document.createElement('code');\n\t\t\t\t\tconst pre = document.createElement('pre');\n\n\t\t\t\t\t// copy class name\n\t\t\t\t\tpre.className = code.className = element.className;\n\n\t\t\t\t\t// copy all \"data-\" attributes\n\t\t\t\t\tconst dataset = element.dataset;\n\t\t\t\t\tObject.keys(dataset || {}).forEach(key => {\n\t\t\t\t\t\tif (Object.prototype.hasOwnProperty.call(dataset, key)) {\n\t\t\t\t\t\t\tpre.dataset[key] = dataset[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tcode.textContent = env.code = env.code.replace(\n\t\t\t\t\t\t/&lt;\\/script(?:>|&gt;)/gi,\n\t\t\t\t\t\t'</scri' + 'pt>'\n\t\t\t\t\t);\n\n\t\t\t\t\t// change DOM\n\t\t\t\t\tpre.appendChild(code);\n\t\t\t\t\telement.replaceWith(pre);\n\t\t\t\t\tenv.element = code;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!env.code) {\n\t\t\t\t\t// no code\n\t\t\t\t\tconst childNodes = element.childNodes;\n\t\t\t\t\tif (childNodes.length === 1 && childNodes[0].nodeName === '#comment') {\n\t\t\t\t\t\t// the only child is a comment -> use the comment's text\n\t\t\t\t\t\telement.textContent = env.code = childNodes[0].textContent || '';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/plugins/wpd/README.md",
    "content": "---\ntitle: WebPlatform Docs\ndescription: Makes tokens link to [WebPlatform.org documentation](https://webplatform.github.io/docs/). The links open in a new tab.\nowner: LeaVerou\n---\n\n<section class=\"language-markup\">\n\n# How to use\n\nNo setup required, just include the plugin in your [download](https://prismjs.com/download.html) and you’re good to go!\n\nTokens that currently link to documentation:\n\n- HTML, MathML and SVG tags\n- HTML, MathML and SVG non-namespaced attributes\n- (Non-prefixed) CSS properties\n- (Non-prefixed) CSS @rules\n- (Non-prefixed) CSS pseudo-classes\n- (Non-prefixed) CSS pseudo-elements (starting with `::`)\n\n**Beta:** This plugin is still in beta. Please help make it better: Test it and report any false positives etc!\n\n</section>\n\n<section>\n\n# Examples\n\n## CSS\n\n<pre data-src=\"https://prismjs.com/assets/style.css\"></pre>\n<pre data-src=\"https://dev.prismjs.com/themes/prism.css\"></pre>\n\n## HTML\n\n<pre data-src=\"index.html\" class=\"language-markup\"></pre>\n\n## SVG\n\n<pre data-src=\"https://prismjs.com/assets/logo.svg\" class=\"language-markup\"></pre>\n\n</section>\n"
  },
  {
    "path": "src/plugins/wpd/wpd.css",
    "content": "code[class*=\"language-\"] a[href],\npre[class*=\"language-\"] a[href] {\n\tcursor: help;\n\ttext-decoration: none;\n}\n\ncode[class*=\"language-\"] a[href]:hover,\npre[class*=\"language-\"] a[href]:hover {\n\tcursor: help;\n\ttext-decoration: underline;\n}\n"
  },
  {
    "path": "src/plugins/wpd/wpd.js",
    "content": "import prism from '../../global.js';\nimport cssSelector from '../../languages/css-selector.js';\n\nconst htmlTags = new Set([\n\t'a',\n\t'abbr',\n\t'acronym',\n\t'b',\n\t'basefont',\n\t'bdo',\n\t'big',\n\t'blink',\n\t'cite',\n\t'code',\n\t'dfn',\n\t'em',\n\t'kbd',\n\t'i',\n\t'rp',\n\t'rt',\n\t'ruby',\n\t's',\n\t'samp',\n\t'small',\n\t'spacer',\n\t'strike',\n\t'strong',\n\t'sub',\n\t'sup',\n\t'time',\n\t'tt',\n\t'u',\n\t'var',\n\t'wbr',\n\t'noframes',\n\t'summary',\n\t'command',\n\t'dt',\n\t'dd',\n\t'figure',\n\t'figcaption',\n\t'center',\n\t'section',\n\t'nav',\n\t'article',\n\t'aside',\n\t'hgroup',\n\t'header',\n\t'footer',\n\t'address',\n\t'noscript',\n\t'isIndex',\n\t'main',\n\t'mark',\n\t'marquee',\n\t'meter',\n\t'menu',\n]);\nconst svgTags = new Set([\n\t'animateColor',\n\t'animateMotion',\n\t'animateTransform',\n\t'glyph',\n\t'feBlend',\n\t'feColorMatrix',\n\t'feComponentTransfer',\n\t'feFuncR',\n\t'feFuncG',\n\t'feFuncB',\n\t'feFuncA',\n\t'feComposite',\n\t'feConvolveMatrix',\n\t'feDiffuseLighting',\n\t'feDisplacementMap',\n\t'feFlood',\n\t'feGaussianBlur',\n\t'feImage',\n\t'feMerge',\n\t'feMergeNode',\n\t'feMorphology',\n\t'feOffset',\n\t'feSpecularLighting',\n\t'feTile',\n\t'feTurbulence',\n\t'feDistantLight',\n\t'fePointLight',\n\t'feSpotLight',\n\t'linearGradient',\n\t'radialGradient',\n\t'altGlyph',\n\t'textPath',\n\t'tref',\n\t'altglyph',\n\t'textpath',\n\t'altglyphdef',\n\t'altglyphitem',\n\t'clipPath',\n\t'color-profile',\n\t'cursor',\n\t'font-face',\n\t'font-face-format',\n\t'font-face-name',\n\t'font-face-src',\n\t'font-face-uri',\n\t'foreignObject',\n\t'glyphRef',\n\t'hkern',\n\t'vkern',\n]);\nconst mathmlTags = new Set();\n\n/**\n * @param {string} tag\n * @returns {string | null}\n */\nfunction getLanguage (tag) {\n\tconst tagL = tag.toLowerCase();\n\n\tif (htmlTags.has(tagL)) {\n\t\treturn 'html';\n\t}\n\telse if (svgTags.has(tag)) {\n\t\treturn 'svg';\n\t}\n\telse if (mathmlTags.has(tag)) {\n\t\treturn 'mathml';\n\t}\n\n\t// Not in dictionary, perform check\n\n\tif (typeof document !== 'undefined') {\n\t\tconst htmlInterface = (document\n\t\t\t.createElement(tag)\n\t\t\t.toString()\n\t\t\t.match(/\\[object HTML(.+)Element\\]/) || [])[1];\n\t\tif (htmlInterface && htmlInterface !== 'Unknown') {\n\t\t\thtmlTags.add(tagL);\n\t\t\treturn 'html';\n\t\t}\n\n\t\tconst svgInterface = (document\n\t\t\t.createElementNS('http://www.w3.org/2000/svg', tag)\n\t\t\t.toString()\n\t\t\t.match(/\\[object SVG(.+)Element\\]/) || [])[1];\n\t\tif (svgInterface && svgInterface !== 'Unknown') {\n\t\t\tsvgTags.add(tag);\n\t\t\treturn 'svg';\n\t\t}\n\t}\n\n\t// Lame way to detect MathML, but browsers don't expose interface names there :(\n\tif (tag.startsWith('m')) {\n\t\tmathmlTags.add(tag);\n\t\treturn 'mathml';\n\t}\n\n\treturn null;\n}\n\n/** @type {import('../../types.d.ts').PluginProto<'wpd'>} */\nconst Self = {\n\tid: 'wpd',\n\trequire: cssSelector,\n\teffect (Prism) {\n\t\treturn Prism.hooks.add('wrap', env => {\n\t\t\tlet href = 'https://webplatform.github.io/docs/';\n\t\t\tlet content = env.content;\n\n\t\t\tif (/[<&]/.test(content)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lang = Prism.languageRegistry.resolveRef(env.language).id;\n\t\t\tif (lang === 'css' || lang === 'scss') {\n\t\t\t\thref += 'css/';\n\n\t\t\t\tif (env.type === 'property' && !content.startsWith('-')) {\n\t\t\t\t\thref += 'properties/';\n\t\t\t\t}\n\t\t\t\telse if (env.type === 'rule' && !content.startsWith('@-')) {\n\t\t\t\t\thref += 'atrules/';\n\t\t\t\t\tcontent = content.substring(1);\n\t\t\t\t}\n\t\t\t\telse if (env.type === 'pseudo-class' && !content.startsWith(':-')) {\n\t\t\t\t\thref += 'selectors/pseudo-classes/';\n\t\t\t\t\tcontent = content.substring(1);\n\t\t\t\t}\n\t\t\t\telse if (env.type === 'pseudo-element' && !content.startsWith('::-')) {\n\t\t\t\t\thref += 'selectors/pseudo-elements/';\n\t\t\t\t\tcontent = content.substring(2);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (lang === 'markup') {\n\t\t\t\tif (env.type === 'tag' && /^[\\w-]+$/.test(content)) {\n\t\t\t\t\t// Check language\n\t\t\t\t\tconst language = getLanguage(content);\n\n\t\t\t\t\tif (language) {\n\t\t\t\t\t\thref += language + '/elements/';\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treturn; // Abort\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thref += content;\n\t\t\tenv.tag = 'a';\n\t\t\tenv.attributes.href = href;\n\t\t\tenv.attributes.target = '_blank';\n\t\t});\n\t},\n};\n\nexport default Self;\n\nprism.pluginRegistry.add(Self);\n"
  },
  {
    "path": "src/prism.global.js",
    "content": "const currentScript = /** @type {HTMLScriptElement | null} */ (globalThis.document?.currentScript);\nif (currentScript) {\n\t// In browser and imported via non-ESM\n\tconst url = new URL('./index.js', currentScript.src);\n\n\timport(url.toString()).then(({ default: prism }) => (globalThis.Prism = prism));\n}\n"
  },
  {
    "path": "src/shared/dom-util.js",
    "content": "const lang = /(?:^|\\s)lang(?:uage)?-([\\w-]+)(?=\\s|$)/i;\n\n/**\n * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class.\n *\n * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned.\n *\n * @param {Element} element\n * @returns {string}\n */\nexport function getLanguage (element) {\n\t/** @type {Element | null} */\n\tlet e = element;\n\tfor (; e; e = e.parentElement) {\n\t\tconst m = lang.exec(e.className);\n\t\tif (m) {\n\t\t\treturn m[1].toLowerCase();\n\t\t}\n\t}\n\treturn 'none';\n}\n\n/**\n * Sets the Prism `language-xxxx` class of the given element.\n *\n * @param {Element} element\n * @param {string} language\n * @returns {void}\n */\nexport function setLanguage (element, language) {\n\t// remove all `language-xxxx` classes\n\t// (this might leave behind a leading space)\n\telement.className = element.className.replace(RegExp(lang, 'gi'), '');\n\n\t// add the new `language-xxxx` class\n\t// (using `classList` will automatically clean up spaces for us)\n\telement.classList.add('language-' + language);\n}\n\n/**\n * Returns whether a given class is active for `element`.\n *\n * The class can be activated if `element` or one of its ancestors has the given class and it can be deactivated\n * if `element` or one of its ancestors has the negated version of the given class. The _negated version_ of the\n * given class is just the given class with a `no-` prefix.\n *\n * Whether the class is active is determined by the closest ancestor of `element` (where `element` itself is\n * closest ancestor) that has the given class or the negated version of it. If neither `element` nor any of its\n * ancestors have the given class or the negated version of it, then the default activation will be returned.\n *\n * In the paradoxical situation where the closest ancestor contains __both__ the given class and the negated\n * version of it, the class is considered active.\n *\n * @param {Element | null} element\n * @param {string} className\n * @param {boolean} [defaultActivation=false] Defaults to `false`.\n * @returns {boolean}\n */\nexport function isActive (element, className, defaultActivation = false) {\n\treturn (\n\t\telement?.closest(`.${className}, .no-${className}`)?.classList?.contains(className) ??\n\t\tdefaultActivation\n\t);\n}\n\n/**\n * If the parent element of the given element is a `<pre>` element, then it\n * will be returned. Otherwise, `undefined` will be returned.\n *\n * @param {Element} element\n * @returns {HTMLPreElement | undefined}\n */\nexport function getParentPre (element) {\n\tconst pre = element.parentElement;\n\tif (pre && /pre/i.test(pre.nodeName)) {\n\t\treturn /** @type {HTMLPreElement} */ (pre);\n\t}\n\treturn undefined;\n}\n"
  },
  {
    "path": "src/shared/languages/patterns.js",
    "content": "export const MARKUP_TAG =\n\t/<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s(?:\\s*[^\\s>\\/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?\\s*\\/?>/;\n\nexport const JS_TEMPLATE_INTERPOLATION = /\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})+\\}/;\nexport const JS_TEMPLATE = RegExp(\n\t/`(?:\\\\[\\s\\S]|<i>|[^\\\\`$]|\\$(?!\\{))*`/.source.replace(\n\t\t'<i>',\n\t\t() => JS_TEMPLATE_INTERPOLATION.source\n\t)\n);\n"
  },
  {
    "path": "src/shared/languages/t4-templating.js",
    "content": "/**\n * @param {string} prefix\n * @param {string | Grammar} insideLang\n * @returns {GrammarToken}\n */\nfunction createBlock (prefix, insideLang) {\n\treturn {\n\t\tpattern: RegExp('<#' + prefix + '[\\\\s\\\\S]*?#>'),\n\t\talias: 'block',\n\t\tinside: {\n\t\t\t'delimiter': {\n\t\t\t\tpattern: RegExp('^<#' + prefix + '|#>$'),\n\t\t\t\talias: 'important',\n\t\t\t},\n\t\t\t'content': {\n\t\t\t\tpattern: /[\\s\\S]+/,\n\t\t\t\tinside: insideLang,\n\t\t\t\talias: typeof insideLang === 'string' ? 'language-' + insideLang : undefined,\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * @param {string} insideLang\n * @returns {Grammar}\n */\nexport function createT4 (insideLang) {\n\treturn {\n\t\t'block': {\n\t\t\tpattern: /<#[\\s\\S]+?#>/,\n\t\t\tinside: {\n\t\t\t\t'directive': createBlock('@', {\n\t\t\t\t\t'attr-value': {\n\t\t\t\t\t\tpattern: /=(?:(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|[^\\s'\">=]+)/,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t'punctuation': /^=|^[\"']|[\"']$/,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'keyword': /\\b\\w+(?=\\s)/,\n\t\t\t\t\t'attr-name': /\\b\\w+/,\n\t\t\t\t}),\n\t\t\t\t'expression': createBlock('=', insideLang),\n\t\t\t\t'class-feature': createBlock('\\\\+', insideLang),\n\t\t\t\t'standard': createBlock('', insideLang),\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * @typedef {import('../../types.d.ts').Grammar} Grammar\n */\n\n/**\n * @typedef {import('../../types.d.ts').GrammarToken} GrammarToken\n */\n"
  },
  {
    "path": "src/shared/languages/templating.js",
    "content": "import { getTextContent } from '../../core/classes/token.js';\nimport { resolve } from '../../core/tokenize/util.js';\nimport { withoutTokenize } from '../../util/language-util.js';\n\nconst placeholderPattern = /___PH\\d+___/;\n\n/**\n * @param {number} id\n * @returns {string}\n */\nfunction getPlaceholder (id) {\n\treturn `___PH${id}___`;\n}\n\n/**\n * @param {string} code\n * @param {Grammar | undefined} grammar\n * @param {Prism} Prism\n * @returns {{ hostCode: string, tokenStack: TokenStack }}\n */\nfunction buildPlaceholders (code, grammar, Prism) {\n\tif (!grammar) {\n\t\treturn { hostCode: code, tokenStack: [] };\n\t}\n\n\tconst templateTokens = Prism.tokenize(code, grammar);\n\tconst hasPlaceholderLike = placeholderPattern.test(code);\n\n\tlet hostCode = '';\n\n\t/** @type {TokenStack} */\n\tconst tokenStack = [];\n\n\tlet id = 0;\n\tfor (const token of templateTokens) {\n\t\tif (typeof token === 'string') {\n\t\t\thostCode += token;\n\t\t}\n\t\telse if (token.type.startsWith('ignore')) {\n\t\t\thostCode += getTextContent(token.content);\n\t\t}\n\t\telse {\n\t\t\tif (hasPlaceholderLike) {\n\t\t\t\twhile (code.includes(getPlaceholder(id))) {\n\t\t\t\t\tid++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttokenStack.push([id, token]);\n\t\t\thostCode += getPlaceholder(id);\n\t\t\tid++;\n\t\t}\n\t}\n\n\treturn { hostCode, tokenStack };\n}\n\n/**\n * @param {TokenStream} hostTokens\n * @param {TokenStack} tokenStack\n */\nfunction insertIntoHostToken (hostTokens, tokenStack) {\n\tlet j = 0;\n\n\t/**\n\t * @param {TokenStream} tokens\n\t * @returns {TokenStream}\n\t */\n\tconst walkTokens = tokens => {\n\t\tfor (let i = 0; i < tokens.length; i++) {\n\t\t\t// all placeholders are replaced already\n\t\t\tif (j >= tokenStack.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst token = tokens[i];\n\t\t\tif (typeof token === 'string' || typeof token.content === 'string') {\n\t\t\t\tconst [id, t] = tokenStack[j];\n\t\t\t\tconst s = typeof token === 'string' ? token : /** @type {string} */ (token.content);\n\t\t\t\tconst placeholder = getPlaceholder(id);\n\n\t\t\t\tconst index = s.indexOf(placeholder);\n\t\t\t\tif (index > -1) {\n\t\t\t\t\t++j;\n\n\t\t\t\t\tconst before = s.substring(0, index);\n\t\t\t\t\tconst middle = t;\n\t\t\t\t\tconst after = s.substring(index + placeholder.length);\n\n\t\t\t\t\t/** @type {TokenStream} */\n\t\t\t\t\tconst replacement = [];\n\t\t\t\t\tif (before) {\n\t\t\t\t\t\treplacement.push(before);\n\t\t\t\t\t}\n\t\t\t\t\treplacement.push(middle);\n\t\t\t\t\tif (after) {\n\t\t\t\t\t\treplacement.push(...walkTokens([after]));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof token === 'string') {\n\t\t\t\t\t\ttokens.splice(i, 1, ...replacement);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ttoken.content = replacement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\twalkTokens(token.content);\n\t\t\t}\n\t\t}\n\n\t\treturn tokens;\n\t};\n\n\twalkTokens(hostTokens);\n}\n\n/**\n * @param {string} code\n * @param {GrammarRef} hostGrammar\n * @param {GrammarRef} templateGrammar\n * @param {Prism} Prism\n * @returns {TokenStream}\n */\nexport function templating (code, hostGrammar, templateGrammar, Prism) {\n\thostGrammar = resolve.call(Prism, hostGrammar);\n\ttemplateGrammar = resolve.call(Prism, templateGrammar);\n\n\tconst { hostCode, tokenStack } = buildPlaceholders(code, templateGrammar, Prism);\n\n\tconst tokens = hostGrammar ? Prism.tokenize(hostCode, hostGrammar) : [hostCode];\n\tinsertIntoHostToken(tokens, tokenStack);\n\treturn tokens;\n}\n\n/**\n * @param {GrammarRef} hostGrammar\n * @returns {(code: string, grammar: Grammar, Prism: Prism) => TokenStream}\n */\nexport function embeddedIn (hostGrammar) {\n\treturn (code, templateGrammar, Prism) => {\n\t\treturn templating(code, hostGrammar, withoutTokenize(templateGrammar), Prism);\n\t};\n}\n\n/**\n * @import { Prism, Token } from '../../core.js';\n * @import { TokenStream, TokenStack, Grammar, LanguageRegistry} from '../../types.d.ts';\n */\n\n/**\n * @typedef {Grammar | string | undefined | null} GrammarRef\n */\n"
  },
  {
    "path": "src/shared/meta/alias-data.js",
    "content": "/**\n * A record mapping the aliases of all known components to their respective ids.\n *\n * Note: This record is automatically generated by the build process.\n */\nconst knownAliases = /* aliases_placeholder[ */ {}; /* ] */\n\n/**\n * @param {string} name\n * @returns {string}\n */\nexport function resolveAlias (name) {\n\treturn knownAliases[name] || name;\n}\n"
  },
  {
    "path": "src/shared/meta/all-languages-data.js",
    "content": "/**\n * A list of the ids of all known languages.\n *\n * Note: This list is automatically generated by the build process.\n *\n * @type {string[]}\n */\nexport const knownLanguages = /* all_languages_placeholder[ */ []; /* ] */\n"
  },
  {
    "path": "src/shared/meta/title-data.js",
    "content": "/**\n * A record mapping the id or alias of a given language to the title of that id or alias.\n *\n * Note: This record is automatically generated by the build process.\n */\nexport const knownTitles = /* title_placeholder[ */ {}; /* ] */\n\n/**\n * Tries to guess the name of a language given its id.\n *\n * @param {string} name The language id.\n * @returns {string}\n */\nfunction guessTitle (name) {\n\treturn (name.substring(0, 1).toUpperCase() + name.substring(1)).replace(/s(?=cript)/, 'S');\n}\n\n/**\n * Returns the title of a known language id or alias.\n *\n * If the given name is not a known language, then a guessed title will be returned.\n *\n * @param {string} name\n * @returns {string}\n */\nexport function getTitle (name) {\n\treturn knownTitles[name] || guessTitle(name);\n}\n"
  },
  {
    "path": "src/shared/tokenize-strings.js",
    "content": "/**\n * Given a token stream and a tokenization function, this will tokenize all\n * strings in the given token stream.\n *\n * The token stream returned by `tokenize` must have the same text content as\n * the given text.\n *\n * @param {TokenStream} tokens\n * @param {(code: string) => TokenStream} tokenize\n */\nexport function tokenizeStrings (tokens, tokenize) {\n\t/**\n\t * @param {string} code\n\t */\n\tconst wrappedTokenize = code => {\n\t\tconst tokens = tokenize(code);\n\t\tif (tokens.length === 1) {\n\t\t\tconst single = tokens[0];\n\t\t\tif (typeof single === 'string') {\n\t\t\t\treturn single;\n\t\t\t}\n\t\t}\n\t\treturn tokens;\n\t};\n\n\t/**\n\t * @param {TokenStream} tokens\n\t */\n\tconst walkTokens = tokens => {\n\t\tfor (let i = 0; i < tokens.length; i++) {\n\t\t\tconst token = tokens[i];\n\n\t\t\tif (typeof token === 'string') {\n\t\t\t\tconst result = wrappedTokenize(token);\n\t\t\t\tif (typeof result === 'string') {\n\t\t\t\t\ttokens[i] = result;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttokens.splice(i, 1, ...result);\n\t\t\t\t\ti += result.length - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (typeof token.content === 'string') {\n\t\t\t\ttoken.content = wrappedTokenize(token.content);\n\t\t\t}\n\t\t\telse {\n\t\t\t\twalkTokens(token.content);\n\t\t\t}\n\t\t}\n\t};\n\n\twalkTokens(tokens);\n}\n\n/**\n * @typedef {import('../types.d.ts').TokenStream} TokenStream\n */\n"
  },
  {
    "path": "src/shared/util.js",
    "content": "/**\n * Returns a function that caches the result of the given supplier.\n *\n * @template T\n * @param {() => T} supplier\n * @returns {() => T}\n */\nexport function lazy (supplier) {\n\t/** @type {T} */\n\tlet value;\n\tlet hasValue = false;\n\treturn () => {\n\t\tif (hasValue) {\n\t\t\treturn value;\n\t\t}\n\n\t\tvalue = supplier();\n\t\thasValue = true;\n\t\treturn value;\n\t};\n}\n\n/**\n * @param {string} text\n * @returns {string}\n */\nexport function htmlEncode (text) {\n\treturn text\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/\\u00a0/g, ' ');\n}\n\n/**\n * A function that does nothing.\n *\n * @type {() => void | undefined}\n */\nexport const noop = () => {\n\t/* noop */\n};\n\n/**\n * @param {any} value\n * @returns {value is T & {}}\n */\nexport function isNonNull (value) {\n\treturn value != null;\n}\n\n/**\n * Escapes all special regex characters in the given string.\n *\n * @param {string} string\n * @returns {string}\n */\nexport function regexEscape (string) {\n\treturn string.replace(/([\\\\[\\](){}+*?|^$.])/g, '\\\\$1');\n}\n\n/**\n * @param {string} string\n * @returns {string}\n */\nexport function capitalize (string) {\n\treturn string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * Converts the given kebab case identifier to a camel case identifier.\n *\n * @param {string} kebab\n * @returns {string}\n */\nexport function kebabToCamelCase (kebab) {\n\tconst [first, ...others] = kebab.split(/-/);\n\treturn first + others.map(capitalize).join('');\n}\n"
  },
  {
    "path": "src/shared.js",
    "content": "/**\n * This file defines the public API of Prism shared functionality.\n */\n\nexport { getLanguage, setLanguage, isActive } from './shared/dom-util.js';\nexport { extend, insertBefore } from './util/language-util.js';\nexport { templating, embeddedIn } from './shared/languages/templating.js';\n"
  },
  {
    "path": "src/themes/coy.css",
    "content": "/**\n * Coy\n *\n * prism.js Coy theme for JavaScript, CoffeeScript, CSS and HTML\n * Based on https://github.com/tshedor/workshop-wp-theme.\n *\n * @author Tim Shedor (tshedor)\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: black;\n\tbackground: none;\n\tfont-family: Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tposition: relative;\n\tmargin: 0.5em 0;\n\toverflow: visible;\n\tpadding: 1px;\n}\n\npre[class*=\"language-\"] > code {\n\tposition: relative;\n\tz-index: 1;\n\tborder-left: 10px solid #358ccb;\n\tbox-shadow:\n\t\t-1px 0px 0px 0px #358ccb,\n\t\t0px 0px 0px 1px #dfdfdf;\n\tbackground-color: #fdfdfd;\n\tbackground-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%);\n\tbackground-size: 3em 3em;\n\tbackground-origin: content-box;\n\tbackground-attachment: local;\n}\n\ncode[class*=\"language-\"] {\n\tmax-height: inherit;\n\theight: inherit;\n\tpadding: 0 1em;\n\tdisplay: block;\n\toverflow: auto;\n}\n\n/* Margin bottom to accommodate shadow */\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground-color: #fdfdfd;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin-bottom: 1em;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tposition: relative;\n\tpadding: 0.2em;\n\tborder-radius: 0.3em;\n\tcolor: #c92c2c;\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\tdisplay: inline;\n\twhite-space: normal;\n}\n\npre[class*=\"language-\"]:before,\npre[class*=\"language-\"]:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\tbottom: 0.75em;\n\tleft: 0.18em;\n\twidth: 40%;\n\theight: 20%;\n\tmax-height: 13em;\n\tbox-shadow: 0px 13px 8px #979797;\n\t-webkit-transform: rotate(-2deg);\n\t-moz-transform: rotate(-2deg);\n\t-ms-transform: rotate(-2deg);\n\t-o-transform: rotate(-2deg);\n\ttransform: rotate(-2deg);\n}\n\npre[class*=\"language-\"]:after {\n\tright: 0.75em;\n\tleft: auto;\n\t-webkit-transform: rotate(2deg);\n\t-moz-transform: rotate(2deg);\n\t-ms-transform: rotate(2deg);\n\t-o-transform: rotate(2deg);\n\ttransform: rotate(2deg);\n}\n\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #7d8b99;\n}\n\n.token.punctuation {\n\tcolor: #5f6364;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.function-name,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #c92c2c;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.function,\n.token.builtin,\n.token.inserted {\n\tcolor: #2f9c0a;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.token.variable {\n\tcolor: #a67f59;\n\tbackground: rgba(255, 255, 255, 0.5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword,\n.token.class-name {\n\tcolor: #1990b8;\n}\n\n.token.regex,\n.token.important {\n\tcolor: #e90;\n}\n\n.language-css .token.string,\n.style .token.string {\n\tcolor: #a67f59;\n\tbackground: rgba(255, 255, 255, 0.5);\n}\n\n.token.important {\n\tfont-weight: normal;\n}\n\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.token.namespace {\n\topacity: 0.7;\n}\n\n@media screen and (max-width: 767px) {\n\tpre[class*=\"language-\"]:before,\n\tpre[class*=\"language-\"]:after {\n\t\tbottom: 14px;\n\t\tbox-shadow: none;\n\t}\n}\n\n/* Plugin styles: Line Numbers */\npre[class*=\"language-\"].line-numbers.line-numbers {\n\tpadding-left: 0;\n}\n\npre[class*=\"language-\"].line-numbers.line-numbers code {\n\tpadding-left: 3.8em;\n}\n\npre[class*=\"language-\"].line-numbers.line-numbers .line-numbers-rows {\n\tleft: 0;\n}\n\n/* Plugin styles: Line Highlight */\npre[class*=\"language-\"][data-line] {\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\tpadding-left: 0;\n}\npre[data-line] code {\n\tposition: relative;\n\tpadding-left: 4em;\n}\npre .line-highlight {\n\tmargin-top: 0;\n}\n"
  },
  {
    "path": "src/themes/dark.css",
    "content": "/**\n * Dark\n *\n * prism.js Dark theme for JavaScript, CSS and HTML\n * Based on the slides of the talk [“/Reg(exp){2}lained/”](https://regexplained.com/slides.html).\n *\n * @author Lea Verou (LeaVerou)\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: white;\n\tbackground: none;\n\ttext-shadow: 0 -0.1em 0.2em black;\n\tfont-family: Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n@media print {\n\tcode[class*=\"language-\"],\n\tpre[class*=\"language-\"] {\n\t\ttext-shadow: none;\n\t}\n}\n\npre[class*=\"language-\"],\n:not(pre) > code[class*=\"language-\"] {\n\tbackground: hsl(30, 20%, 25%);\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: 0.5em 0;\n\toverflow: auto;\n\tborder: 0.3em solid hsl(30, 20%, 40%);\n\tborder-radius: 0.5em;\n\tbox-shadow: 1px 1px 0.5em black inset;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: 0.15em 0.2em 0.05em;\n\tborder-radius: 0.3em;\n\tborder: 0.13em solid hsl(30, 20%, 40%);\n\tbox-shadow: 1px 1px 0.3em -0.1em black inset;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: hsl(30, 20%, 50%);\n}\n\n.token.punctuation {\n\topacity: 0.7;\n}\n\n.token.namespace {\n\topacity: 0.7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol {\n\tcolor: hsl(350, 40%, 70%);\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: hsl(75, 70%, 60%);\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string,\n.token.variable {\n\tcolor: hsl(40, 90%, 60%);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: hsl(350, 40%, 70%);\n}\n\n.token.regex,\n.token.important {\n\tcolor: #e90;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.token.deleted {\n\tcolor: red;\n}\n"
  },
  {
    "path": "src/themes/funky.css",
    "content": "/**\n * Funky\n *\n * prism.js Funky theme\n * Based on [“Polyfilling the gaps”](https://talks.verou.me/polyfilling-the-gaps/) talk slides.\n *\n * @author Lea Verou (LeaVerou)\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tfont-family: Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 0.4em 0.8em;\n\tmargin: 0.5em 0;\n\toverflow: auto;\n\tbackground: url('data:image/svg+xml;charset=utf-8,<svg%20version%3D\"1.1\"%20xmlns%3D\"http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg\"%20width%3D\"100\"%20height%3D\"100\"%20fill%3D\"rgba(0%2C0%2C0%2C.2)\">%0D%0A<polygon%20points%3D\"0%2C50%2050%2C0%200%2C0\"%20%2F>%0D%0A<polygon%20points%3D\"0%2C100%2050%2C100%20100%2C50%20100%2C0\"%20%2F>%0D%0A<%2Fsvg>');\n\tbackground-size: 1em 1em;\n}\n\ncode[class*=\"language-\"] {\n\tbackground: black;\n\tcolor: white;\n\tbox-shadow:\n\t\t-0.3em 0 0 0.3em black,\n\t\t0.3em 0 0 0.3em black;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: 0.2em;\n\tborder-radius: 0.3em;\n\tbox-shadow: none;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #aaa;\n}\n\n.token.punctuation {\n\tcolor: #999;\n}\n\n.token.namespace {\n\topacity: 0.7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol {\n\tcolor: #0cf;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin {\n\tcolor: yellow;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.token.variable,\n.token.inserted {\n\tcolor: yellowgreen;\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: deeppink;\n}\n\n.token.regex,\n.token.important {\n\tcolor: orange;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.token.deleted {\n\tcolor: red;\n}\n\n/* Plugin styles: Diff Highlight */\npre.diff-highlight.diff-highlight > code .token.deleted:not(.prefix),\npre > code.diff-highlight.diff-highlight .token.deleted:not(.prefix) {\n\tbackground-color: rgba(255, 0, 0, 0.3);\n\tdisplay: inline;\n}\n\npre.diff-highlight.diff-highlight > code .token.inserted:not(.prefix),\npre > code.diff-highlight.diff-highlight .token.inserted:not(.prefix) {\n\tbackground-color: rgba(0, 255, 128, 0.3);\n\tdisplay: inline;\n}\n"
  },
  {
    "path": "src/themes/okaidia.css",
    "content": "/**\n * Okaidia\n *\n * prism.js Okaidia theme for JavaScript, CSS and HTML\n * Loosely based on Monokai textmate theme by https://monokai.com/.\n *\n * @author Paul Livingstone (ocodia)\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #f8f8f2;\n\tbackground: none;\n\ttext-shadow: 0 1px rgba(0, 0, 0, 0.3);\n\tfont-family: Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: 0.5em 0;\n\toverflow: auto;\n\tborder-radius: 0.3em;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #272822;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: 0.1em;\n\tborder-radius: 0.3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #8292a2;\n}\n\n.token.punctuation {\n\tcolor: #f8f8f2;\n}\n\n.token.namespace {\n\topacity: 0.7;\n}\n\n.token.property,\n.token.tag,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #f92672;\n}\n\n.token.boolean,\n.token.number {\n\tcolor: #ae81ff;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: #a6e22e;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string,\n.token.variable {\n\tcolor: #f8f8f2;\n}\n\n.token.atrule,\n.token.attr-value,\n.token.function,\n.token.class-name {\n\tcolor: #e6db74;\n}\n\n.token.keyword {\n\tcolor: #66d9ef;\n}\n\n.token.regex,\n.token.important {\n\tcolor: #fd971f;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n"
  },
  {
    "path": "src/themes/prism.css",
    "content": "/**\n * Default\n *\n * prism.js default theme for JavaScript, CSS and HTML\n * Based on [dabblet](https://dabblet.com).\n *\n * @author Lea Verou (LeaVerou)\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: black;\n\tbackground: none;\n\ttext-shadow: 0 1px white;\n\tfont-family: Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"]::-moz-selection,\npre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection,\ncode[class*=\"language-\"] ::-moz-selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\npre[class*=\"language-\"]::selection,\npre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection,\ncode[class*=\"language-\"] ::selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\n@media print {\n\tcode[class*=\"language-\"],\n\tpre[class*=\"language-\"] {\n\t\ttext-shadow: none;\n\t}\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: 0.5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #f5f2f0;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: 0.1em;\n\tborder-radius: 0.3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: slategray;\n}\n\n.token.punctuation {\n\tcolor: #999;\n}\n\n.token.namespace {\n\topacity: 0.7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #905;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: #690;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n\tcolor: #9a6e3a;\n\t/* This background color was intended by the author of this theme. */\n\tbackground: hsla(0, 0%, 100%, 0.5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: #07a;\n}\n\n.token.function,\n.token.class-name {\n\tcolor: #dd4a68;\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n\tcolor: #e90;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n"
  },
  {
    "path": "src/themes/solarizedlight.css",
    "content": "/**\n * Solarized Light\n *\n * prism.js Solarized Light theme\n * Based on [Solarized Color Schemes](https://ethanschoonover.com/solarized) by Ethan Schoonover.\n *\n * @author Hector Matos (hectormatos2011)\n*/\n\n/*\nSOLARIZED HEX\n--------- -------\nbase03    #002b36\nbase02    #073642\nbase01    #586e75\nbase00    #657b83\nbase0     #839496\nbase1     #93a1a1\nbase2     #eee8d5\nbase3     #fdf6e3\nyellow    #b58900\norange    #cb4b16\nred       #dc322f\nmagenta   #d33682\nviolet    #6c71c4\nblue      #268bd2\ncyan      #2aa198\ngreen     #859900\n*/\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #657b83; /* base00 */\n\tfont-family: Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"]::-moz-selection,\npre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection,\ncode[class*=\"language-\"] ::-moz-selection {\n\tbackground: #073642; /* base02 */\n}\n\npre[class*=\"language-\"]::selection,\npre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection,\ncode[class*=\"language-\"] ::selection {\n\tbackground: #073642; /* base02 */\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: 0.5em 0;\n\toverflow: auto;\n\tborder-radius: 0.3em;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground-color: #fdf6e3; /* base3 */\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: 0.1em;\n\tborder-radius: 0.3em;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #93a1a1; /* base1 */\n}\n\n.token.punctuation {\n\tcolor: #586e75; /* base01 */\n}\n\n.token.namespace {\n\topacity: 0.7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #268bd2; /* blue */\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.url,\n.token.inserted {\n\tcolor: #2aa198; /* cyan */\n}\n\n.token.entity {\n\tcolor: #657b83; /* base00 */\n\tbackground: #eee8d5; /* base2 */\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: #859900; /* green */\n}\n\n.token.function,\n.token.class-name {\n\tcolor: #b58900; /* yellow */\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n\tcolor: #cb4b16; /* orange */\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n"
  },
  {
    "path": "src/themes/tomorrow.css",
    "content": "/**\n * Tomorrow Night\n *\n * prism.js Tomorrow Night theme for JavaScript, CoffeeScript, CSS and HTML\n * Based on https://github.com/chriskempson/tomorrow-theme.\n *\n * @author Rose Robertson (Rosey)\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #ccc;\n\tbackground: none;\n\tfont-family: Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: 0.5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #2d2d2d;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: 0.1em;\n\tborder-radius: 0.3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #999;\n}\n\n.token.punctuation {\n\tcolor: #ccc;\n}\n\n.token.tag,\n.token.attr-name,\n.token.namespace,\n.token.deleted {\n\tcolor: #e2777a;\n}\n\n.token.function-name {\n\tcolor: #6196cc;\n}\n\n.token.boolean,\n.token.number,\n.token.function {\n\tcolor: #f08d49;\n}\n\n.token.property,\n.token.class-name,\n.token.constant,\n.token.symbol {\n\tcolor: #f8c555;\n}\n\n.token.selector,\n.token.important,\n.token.atrule,\n.token.keyword,\n.token.builtin {\n\tcolor: #cc99cd;\n}\n\n.token.string,\n.token.char,\n.token.attr-value,\n.token.regex,\n.token.variable {\n\tcolor: #7ec699;\n}\n\n.token.operator,\n.token.entity,\n.token.url {\n\tcolor: #67cdcc;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.token.inserted {\n\tcolor: green;\n}\n"
  },
  {
    "path": "src/themes/twilight.css",
    "content": "/**\n * Twilight\n *\n * prism.js Twilight theme\n * Based (more or less) on the Twilight theme originally of Textmate fame.\n *\n * @author Rémy Bach (remybach)\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: white;\n\tbackground: none;\n\tfont-family: Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\ttext-shadow: 0 -0.1em 0.2em black;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"],\n:not(pre) > code[class*=\"language-\"] {\n\tbackground: hsl(0, 0%, 8%); /* #141414 */\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tborder-radius: 0.5em;\n\tborder: 0.3em solid hsl(0, 0%, 33%); /* #282A2B */\n\tbox-shadow: 1px 1px 0.5em black inset;\n\tmargin: 0.5em 0;\n\toverflow: auto;\n\tpadding: 1em;\n}\n\npre[class*=\"language-\"]::-moz-selection {\n\t/* Firefox */\n\tbackground: hsl(200, 4%, 16%); /* #282A2B */\n}\n\npre[class*=\"language-\"]::selection {\n\t/* Safari */\n\tbackground: hsl(200, 4%, 16%); /* #282A2B */\n}\n\n/* Text Selection colour */\npre[class*=\"language-\"]::-moz-selection,\npre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection,\ncode[class*=\"language-\"] ::-moz-selection {\n\ttext-shadow: none;\n\tbackground: hsla(0, 0%, 93%, 0.15); /* #EDEDED */\n}\n\npre[class*=\"language-\"]::selection,\npre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection,\ncode[class*=\"language-\"] ::selection {\n\ttext-shadow: none;\n\tbackground: hsla(0, 0%, 93%, 0.15); /* #EDEDED */\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tborder-radius: 0.3em;\n\tborder: 0.13em solid hsl(0, 0%, 33%); /* #545454 */\n\tbox-shadow: 1px 1px 0.3em -0.1em black inset;\n\tpadding: 0.15em 0.2em 0.05em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: hsl(0, 0%, 47%); /* #777777 */\n}\n\n.token.punctuation {\n\topacity: 0.7;\n}\n\n.token.namespace {\n\topacity: 0.7;\n}\n\n.token.tag,\n.token.boolean,\n.token.number,\n.token.deleted {\n\tcolor: hsl(14, 58%, 55%); /* #CF6A4C */\n}\n\n.token.keyword,\n.token.property,\n.token.selector,\n.token.constant,\n.token.symbol,\n.token.builtin {\n\tcolor: hsl(53, 89%, 79%); /* #F9EE98 */\n}\n\n.token.attr-name,\n.token.attr-value,\n.token.string,\n.token.char,\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string,\n.token.variable,\n.token.inserted {\n\tcolor: hsl(76, 21%, 52%); /* #8F9D6A */\n}\n\n.token.atrule {\n\tcolor: hsl(218, 22%, 55%); /* #7587A6 */\n}\n\n.token.regex,\n.token.important {\n\tcolor: hsl(42, 75%, 65%); /* #E9C062 */\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n/* Markup */\n.language-markup .token.tag,\n.language-markup .token.attr-name,\n.language-markup .token.punctuation {\n\tcolor: hsl(33, 33%, 52%); /* #AC885B */\n}\n\n/* Make the tokens sit above the line highlight so the colours don't look faded. */\n.token {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.line-highlight.line-highlight {\n\tbackground: hsla(0, 0%, 33%, 0.25); /* #545454 */\n\tbackground: linear-gradient(\n\t\tto right,\n\t\thsla(0, 0%, 33%, 0.1) 70%,\n\t\thsla(0, 0%, 33%, 0)\n\t); /* #545454 */\n\tborder-bottom: 1px dashed hsl(0, 0%, 33%); /* #545454 */\n\tborder-top: 1px dashed hsl(0, 0%, 33%); /* #545454 */\n\tmargin-top: 0.75em; /* Same as .prism’s padding-top */\n\tz-index: 0;\n}\n\n.line-highlight.line-highlight:before,\n.line-highlight.line-highlight[data-end]:after {\n\tbackground-color: hsl(215, 15%, 59%); /* #8794A6 */\n\tcolor: hsl(24, 20%, 95%); /* #F5F2F0 */\n}\n"
  },
  {
    "path": "src/types.d.ts",
    "content": "import type { Language } from './core/classes/language.js';\nimport type { Plugin } from './core/classes/plugin.js';\nimport type { Token } from './core/classes/token.js';\nimport type { Prism } from './core/prism.js';\n\nexport type { LanguageRegistry } from './core/language-registry.js';\n\nexport type { Language };\nexport type Languages = Record<string, Language>;\nexport type LanguageGrammars = Record<string, Grammar>;\n\nexport type { PluginRegistry } from './core/plugin-registry.js';\n\nexport type { Plugin };\nexport type Plugins = Record<string, Plugin>;\n\nexport interface PrismConfig {\n\tmanual?: boolean;\n\tsilent?: boolean;\n\terrorHandler?: (reason: any) => PromiseLike<never>;\n\tplugins?: string[];\n\tlanguages?: string[];\n\tpluginPath?: string;\n\tlanguagePath?: string;\n}\n\nexport type GlobalConfig = Record<string, PrismConfig[keyof PrismConfig] | null>;\n\nexport interface BaseHookEnv {\n\tcontext?: object;\n}\n\nexport interface HookEnv extends BaseHookEnv, Record<string, any> {}\n\nexport type HookCallback<T extends keyof HookEnv = string> = (env: HookEnv[T]) => void;\n\nexport type MultipleHooks<T extends keyof HookEnv> = { [K in T]?: HookCallback<K> };\n\nexport type HooksAll = Record<keyof HookEnv, HookCallback[]>;\n\nexport type HooksAdd = <Name extends keyof HookEnv>(\n\tname: Name | Name[] | MultipleHooks<Name>,\n\tcallback?: Name extends MultipleHooks<Name> ? never : HookCallback<Name>\n) => () => void;\n\nexport type HooksRemove = <Name extends keyof HookEnv>(\n\tname: Name | Name[] | MultipleHooks<Name>,\n\tcallback?: Name extends MultipleHooks<Name> ? never : HookCallback<Name>\n) => void;\n\nexport type HooksRun = <Name extends keyof HookEnv>(name: Name, env: HookEnv[Name]) => void;\n\nexport interface GrammarOptions {\n\treadonly getOptionalLanguage: (id: string) => Grammar | undefined;\n\treadonly extend: (id: string, ref: GrammarTokens) => Grammar;\n}\n\nexport interface ComponentProtoBase<Id extends string = string> {\n\tid: Id;\n\trequire?: ComponentProto | readonly ComponentProto[];\n\toptional?: string | readonly string[];\n\talias?: string | readonly string[];\n\teffect?: (Prism: Prism & { plugins: Record<KebabToCamelCase<Id>, {}> }) => () => void;\n}\n\nexport type LanguageProto<Id extends string = string> =\n\t| LanguageProtoPlain<Id>\n\t| LanguageProtoWithBase<Id>\n\t| LanguageProtoWithRequire<Id>\n\t| LanguageProtoWithBaseAndRequire<Id>;\n\ninterface LanguageProtoPlain<Id extends string = string> extends ComponentProtoBase<Id> {\n\tgrammar: Grammar | ((options: GrammarOptions) => Grammar);\n\tplugin?: undefined;\n\tbase?: never; // Explicitly no base allowed\n\trequire?: never; // Explicitly no require allowed\n}\n\ninterface LanguageProtoWithBase<Id extends string = string> extends ComponentProtoBase<Id> {\n\tgrammar: Grammar | ((options: GrammarOptions & { readonly base: Grammar }) => Grammar);\n\tplugin?: undefined;\n\tbase: LanguageProto; // Required base\n\trequire?: never; // Explicitly no require allowed\n}\n\ninterface LanguageProtoWithRequire<Id extends string = string> extends ComponentProtoBase<Id> {\n\tgrammar:\n\t\t| Grammar\n\t\t| ((options: GrammarOptions & { readonly languages: Record<string, Grammar> }) => Grammar);\n\tplugin?: undefined;\n\tbase?: never; // Explicitly no base allowed\n\trequire: ComponentProto | readonly ComponentProto[]; // Required require\n}\n\ninterface LanguageProtoWithBaseAndRequire<Id extends string = string>\n\textends ComponentProtoBase<Id> {\n\tgrammar:\n\t\t| Grammar\n\t\t| ((\n\t\t\t\toptions: GrammarOptions & {\n\t\t\t\t\treadonly base: Grammar;\n\t\t\t\t\treadonly languages: Record<string, Grammar>;\n\t\t\t\t}\n\t\t  ) => Grammar);\n\tplugin?: undefined;\n\tbase: LanguageProto; // Required base\n\trequire: ComponentProto | readonly ComponentProto[]; // Required require\n}\n\ntype PluginType<Name extends string> = unknown;\nexport interface PluginProto<Id extends string = string> extends ComponentProtoBase<Id> {\n\tgrammar?: undefined;\n\tplugin?: (\n\t\tPrism: Prism & { plugins: Record<KebabToCamelCase<Id>, undefined> }\n\t) => PluginType<KebabToCamelCase<Id>> & {};\n}\nexport type ComponentProto = LanguageProto | PluginProto;\n\nexport type StandardTokenName =\n\t| 'atrule'\n\t| 'attr-name'\n\t| 'attr-value'\n\t| 'bold'\n\t| 'boolean'\n\t| 'builtin'\n\t| 'cdata'\n\t| 'char'\n\t| 'class-name'\n\t| 'comment'\n\t| 'constant'\n\t| 'deleted'\n\t| 'doctype'\n\t| 'entity'\n\t| 'function'\n\t| 'important'\n\t| 'inserted'\n\t| 'italic'\n\t| 'keyword'\n\t| 'namespace'\n\t| 'number'\n\t| 'operator'\n\t| 'prolog'\n\t| 'property'\n\t| 'punctuation'\n\t| 'regex'\n\t| 'selector'\n\t| 'string'\n\t| 'symbol'\n\t| 'tag'\n\t| 'url';\n\nexport type TokenName = (string & {}) | StandardTokenName;\n\n/**\n * A token stream is an array of strings and {@link Token Token} objects.\n *\n * Token streams have to fulfill a few properties that are assumed by most functions (mostly internal ones) that process\n * them.\n *\n * 1. No adjacent strings.\n * 2. No empty strings.\n *\n * The only exception here is the token stream that only contains the empty string and nothing else.\n */\nexport type TokenStream = (string | Token)[];\n\nexport type TokenStack = [number, Token][];\n\nexport type RegExpLike = RegExp & { readonly pattern?: never };\n\n/**\n * The expansion of a simple `RegExp` literal to support additional properties.\n */\nexport interface GrammarToken {\n\t/**\n\t * The regular expression of the token.\n\t */\n\tpattern: RegExpLike;\n\t/**\n\t * If `true`, then the first capturing group of `pattern` will (effectively) behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token.\n\t *\n\t * @default false\n\t */\n\tlookbehind?: boolean;\n\t/**\n\t * Whether the token is greedy.\n\t *\n\t * @default false\n\t */\n\tgreedy?: boolean;\n\t/**\n\t * An optional alias or list of aliases.\n\t */\n\talias?: TokenName | TokenName[];\n\t/**\n\t * The nested grammar of this token.\n\t *\n\t * The `inside` grammar will be used to tokenize the text value of each token of this kind.\n\t *\n\t * This can be used to make nested and even recursive language definitions.\n\t *\n\t * Note: This can cause infinite recursion. Be careful when you embed different languages or even the same language into\n\t * each another.\n\t */\n\tinside?: string | Grammar | null;\n}\n\nexport type GrammarTokens = Partial<\n\tRecord<TokenName, RegExpLike | GrammarToken | (RegExpLike | GrammarToken)[]>\n>;\n\nexport type GrammarSpecial = {\n\t/**\n\t * An optional grammar object that will be appended to this grammar.\n\t */\n\t$rest?: Grammar | string | null;\n\t$tokenize?: (code: string, grammar: Grammar, Prism: Prism) => TokenStream;\n};\n\n/**\n * Tokens within $insert\n */\nexport type InsertableToken = (RegExpLike | GrammarToken | (RegExpLike | GrammarToken)[]) & {\n\t$before?: TokenName | TokenName[];\n\t$after?: TokenName | TokenName[];\n};\n\n/**\n * A grammar that is defined as its delta from another grammar.\n */\nexport type GrammarPatch = {\n\t$insert?: Partial<Record<TokenName, InsertableToken>>;\n\t$insertBefore?: Partial<Record<TokenName, GrammarTokens>>;\n\t$insertAfter?: Partial<Record<TokenName, GrammarTokens>>;\n\t$delete?: TokenName[];\n\t$merge?: Partial<\n\t\tRecord<TokenName, Partial<Omit<GrammarToken, 'pattern'>> & { pattern?: RegExpLike }>\n\t>;\n};\n\nexport interface Grammar extends GrammarSpecial, GrammarPatch {\n\t[token: string]:\n\t\t| RegExpLike\n\t\t| GrammarToken\n\t\t| (RegExpLike | GrammarToken)[]\n\t\t| GrammarSpecial[keyof GrammarSpecial]\n\t\t| GrammarPatch[keyof GrammarPatch];\n}\n\nexport interface PlainObject {\n\t[key: string]: unknown;\n}\n\nexport type KebabToCamelCase<S extends string> = S extends `${infer T}-${infer U}`\n\t? `${T}${Capitalize<KebabToCamelCase<U>>}`\n\t: S;\n"
  },
  {
    "path": "src/util/async.js",
    "content": "/**\n * @param {Document} [document=globalThis.document]\n * @returns {Promise<any>}\n */\nexport function documentReady (document = globalThis.document) {\n\tif (!document) {\n\t\treturn Promise.reject();\n\t}\n\n\tconst script = /** @type {HTMLScriptElement | null} */ (document.currentScript);\n\n\t// If the document state is \"loading\", then we'll use DOMContentLoaded.\n\t// If the document state is \"interactive\" and the prism.js script is deferred, then we'll also use the\n\t// DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they\n\t// might take longer one animation frame to execute which can create a race condition where only some plugins have\n\t// been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded.\n\t// See https://github.com/PrismJS/prism/issues/2102\n\t// See https://github.com/PrismJS/prism/issues/3535\n\tconst readyState = document.readyState;\n\tif (\n\t\treadyState === 'loading' ||\n\t\t(readyState === 'interactive' && script && script.defer && !script.async)\n\t) {\n\t\treturn new Promise(resolve => {\n\t\t\tdocument.addEventListener('DOMContentLoaded', resolve, { once: true });\n\t\t});\n\t}\n\n\treturn Promise.resolve();\n}\n\nexport function nextTick () {\n\treturn new Promise(resolve => {\n\t\tif (typeof requestAnimationFrame === 'function') {\n\t\t\trequestAnimationFrame(resolve);\n\t\t}\n\t\telse if (typeof setImmediate === 'function') {\n\t\t\tsetImmediate(resolve);\n\t\t}\n\t\telse {\n\t\t\tsetTimeout(resolve, 0);\n\t\t}\n\t});\n}\n\n/**\n * In addition to waiting for all promises to settle, handle post-hoc additions/removals.\n *\n * @template T\n * @param {Promise<T>[]} promises\n * @returns {Promise<(T | null)[]>}\n */\nexport async function allSettled (promises) {\n\treturn Promise.allSettled(promises).then(outcomes => {\n\t\tif (promises.length > 0 && promises.length !== outcomes.length) {\n\t\t\t// The list of promises changed. Return a new Promise.\n\t\t\t// The original promise won't resolve until the new one does.\n\t\t\treturn allSettled(promises);\n\t\t}\n\n\t\t// The list of promises either empty or stayed the same.\n\t\t// Return results immediately.\n\t\treturn outcomes.map(o => (o.status === 'fulfilled' ? o.value : null));\n\t});\n}\n\n/**\n * @template T\n * @typedef {Promise<T> & {resolve: (value: T) => void, reject: (reason?: any) => void}} DeferredPromise<T>\n *\n */\n\n/**\n * @template T\n * @returns {DeferredPromise<T>}\n */\nexport function defer () {\n\t/**\n\t * @type {DeferredPromise<T>['resolve']}\n\t */\n\tlet res;\n\n\t/**\n\t * @type {DeferredPromise<T>['reject']}\n\t */\n\tlet rej;\n\n\tconst promise = /** @type {DeferredPromise<T>} */ (\n\t\tnew Promise((resolve, reject) => {\n\t\t\tres = resolve;\n\t\t\trej = reject;\n\t\t})\n\t);\n\n\t// @ts-ignore\n\tpromise.resolve = res;\n\t// @ts-ignore\n\tpromise.reject = rej;\n\n\treturn promise;\n}\n"
  },
  {
    "path": "src/util/combine-callbacks.js",
    "content": "/**\n * Returns a single function that calls all the given functions.\n *\n * @param {...() => void} callbacks\n * @returns {() => void}\n */\nexport function combineCallbacks (...callbacks) {\n\treturn () => {\n\t\tfor (const callback of callbacks) {\n\t\t\tcallback();\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "src/util/extend.js",
    "content": "import { betterAssign, deepClone } from './objects.js';\n\n/**\n * Creates a deep copy of the language with the given id and appends the given tokens.\n *\n * If a token in `reDef` also appears in the copied language, then the existing token in the copied language\n * will be overwritten at its original position.\n *\n * ## Best practices\n *\n * Since the position of overwriting tokens (token in `reDef` that overwrite tokens in the copied language)\n * doesn't matter, they can technically be in any order. However, this can be confusing to others that trying to\n * understand the language definition because, normally, the order of tokens matters in Prism grammars.\n *\n * Therefore, it is encouraged to order overwriting tokens according to the positions of the overwritten tokens.\n * Furthermore, all non-overwriting tokens should be placed after the overwriting ones.\n *\n * @param {Grammar} base The grammar of the language to extend.\n * @param {Grammar} grammar The new tokens to append.\n * @returns {Grammar} The new language created.\n * @example\n * Prism.languages['css-with-colors'] = Prism.languages.extend('css', {\n *     // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token\n *     // at its original position\n *     'comment': { ... },\n *     // CSS doesn't have a 'color' token, so this token will be appended\n *     'color': /\\b(?:red|green|blue)\\b/\n * });\n */\nexport function extend (base, grammar) {\n\tconst lang = deepClone(base);\n\n\tfor (const key in grammar) {\n\t\tif (typeof key !== 'string' || key.startsWith('$')) {\n\t\t\t// ignore special keys\n\t\t\tcontinue;\n\t\t}\n\n\t\tlang[key] = grammar[key];\n\t}\n\n\tif (grammar.$insertBefore) {\n\t\tlang.$insertBefore = betterAssign(lang.$insertBefore ?? {}, grammar.$insertBefore);\n\t}\n\n\tif (grammar.$insertAfter) {\n\t\tlang.$insertAfter = betterAssign(lang.$insertAfter ?? {}, grammar.$insertAfter);\n\t}\n\n\tif (grammar.$insert) {\n\t\t// Syntactic sugar for $insertBefore/$insertAfter\n\t\tfor (const tokenName in grammar.$insert) {\n\t\t\tconst def = grammar.$insert[tokenName];\n\t\t\tconst { $before, $after, ...token } = def;\n\t\t\tconst relToken = $before || $after;\n\t\t\tconst all = $before ? '$insertBefore' : '$insertAfter';\n\t\t\tlang[all] ??= {};\n\n\t\t\tif (Array.isArray(relToken)) {\n\t\t\t\t// Insert in multiple places\n\t\t\t\tfor (const t of relToken) {\n\t\t\t\t\tlang[all][t][tokenName] = token;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (relToken) {\n\t\t\t\t(lang[all][relToken] ??= {})[tokenName] = token;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlang[tokenName] = token;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (grammar.$delete) {\n\t\tif (lang.$delete) {\n\t\t\t// base also had $delete\n\t\t\tlang.$delete.push(...grammar.$delete);\n\t\t}\n\t\telse {\n\t\t\tlang.$delete = [...grammar.$delete];\n\t\t}\n\t}\n\n\tif (grammar.$merge) {\n\t\tlang.$merge = betterAssign(lang.$merge ?? {}, grammar.$merge);\n\t}\n\n\treturn lang;\n}\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n */\n"
  },
  {
    "path": "src/util/grammar-patch.js",
    "content": "import { insertAfter, insertBefore } from './insert.js';\nimport { deepMerge } from './objects.js';\n\n/**\n * Apply a patch to a grammar to modify it.\n * The patch and the grammar may be the same object.\n *\n * @param {Grammar} grammar\n * @param {Grammar} [patch=grammar]\n * @returns {Grammar}\n */\nexport function grammarPatch (grammar, patch = grammar) {\n\tif (patch.$insertBefore) {\n\t\tfor (const key in patch.$insertBefore) {\n\t\t\tconst tokens = patch.$insertBefore[key];\n\n\t\t\tif (key?.includes('/')) {\n\t\t\t\t// Deep key\n\t\t\t\tlet path = key.split('/');\n\t\t\t\tconst lastKey = path.pop();\n\t\t\t\tpath = path.flatMap(key => [key, 'inside']); // add `inside` after each key\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst obj = path.reduce((acc, key) => acc?.[key], grammar);\n\n\t\t\t\tif (obj) {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tinsertBefore(obj, lastKey, tokens);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (tokens) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tinsertBefore(grammar, key, tokens);\n\t\t\t}\n\t\t}\n\t\tdelete grammar.$insertBefore;\n\t}\n\n\tif (patch.$insertAfter) {\n\t\tfor (const key in patch.$insertAfter) {\n\t\t\tconst tokens = patch.$insertAfter[key];\n\n\t\t\tif (key?.includes('/')) {\n\t\t\t\t// Deep key\n\t\t\t\tlet path = key.split('/');\n\t\t\t\tconst lastKey = path.pop();\n\t\t\t\tpath = path.flatMap(key => [key, 'inside']); // add `inside` after each key\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst obj = path.reduce((acc, key) => acc?.[key], grammar);\n\n\t\t\t\tif (obj) {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tinsertAfter(obj, lastKey, tokens);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (tokens) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tinsertAfter(grammar, key, tokens);\n\t\t\t}\n\t\t}\n\t\tdelete grammar.$insertAfter;\n\t}\n\n\tif (patch.$delete) {\n\t\t// @ts-ignore\n\t\tfor (const key of patch.$delete) {\n\t\t\t// TODO support deep keys\n\t\t\tdelete grammar[key];\n\t\t}\n\t\tdelete grammar.$delete;\n\t}\n\n\tif (patch.$merge) {\n\t\tfor (const key in patch.$merge) {\n\t\t\tconst tokens = patch.$merge[key];\n\n\t\t\tif (grammar[key]) {\n\t\t\t\tdeepMerge(grammar[key], tokens);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tgrammar[key] = /** @type {GrammarTokens} */ (tokens);\n\t\t\t}\n\t\t}\n\n\t\tdelete grammar.$merge;\n\t}\n\n\treturn grammar;\n}\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n * @typedef {import('../types.d.ts').GrammarTokens} GrammarTokens\n */\n"
  },
  {
    "path": "src/util/insert.js",
    "content": "import { betterAssign } from './objects.js';\n\n/**\n * Inserts tokens _before_ another token in the given grammar.\n *\n * ## Usage\n *\n * This helper method makes it easy to modify existing grammars. For example, the CSS language definition\n * not only defines CSS highlighting for CSS documents, but also needs to define highlighting for CSS embedded\n * in HTML through `<style>` elements. To do this, it needs to modify `Prism.languages.markup` and add the\n * appropriate tokens. However, `Prism.languages.markup` is a regular JavaScript object literal, so if you do\n * this:\n *\n * ```js\n * markup.style = {\n *     // token\n * };\n * ```\n *\n * then the `style` token will be added (and processed) at the end. `insertBefore` allows you to insert tokens\n * before existing tokens. For the CSS example above, you would use it like this:\n *\n * ```js\n * insertBefore(markup, 'cdata', {\n *     'style': {\n *         // token\n *     }\n * });\n * ```\n *\n * @param {Grammar} grammar The grammar to be modified.\n * @param {string} beforeKey The key to insert before.\n * @param {GrammarTokens} tokens An object containing the key-value pairs to be inserted.\n */\nexport function insertBefore (grammar, beforeKey, tokens) {\n\tinsert(grammar, beforeKey, tokens, 'before');\n}\n\n/**\n *\n * @param {Grammar} grammar\n * @param {string} afterKey\n * @param {GrammarTokens} tokens\n */\nexport function insertAfter (grammar, afterKey, tokens) {\n\tinsert(grammar, afterKey, tokens);\n}\n\n/**\n *\n * @param {Grammar} grammar\n * @param {string} atKey\n * @param {GrammarTokens} insert\n * @param {'before' | 'after'} [position='after']\n */\nexport function insert (grammar, atKey, insert, position = 'after') {\n\tif (!(atKey in grammar)) {\n\t\t// TODO support deep keys\n\t\tthrow new Error(`\"${atKey}\" has to be a key of grammar.`);\n\t}\n\n\tconst descriptors = Object.getOwnPropertyDescriptors(grammar);\n\n\t// delete all keys in `grammar`\n\tfor (const key in descriptors) {\n\t\tif (Object.hasOwn(descriptors, key)) {\n\t\t\tdelete grammar[key];\n\t\t}\n\t}\n\n\t// insert keys again\n\tfor (const key in descriptors) {\n\t\tif (position === 'before' && key === atKey) {\n\t\t\tbetterAssign(grammar, insert);\n\t\t}\n\n\t\t// Do not insert tokens which also occur in `insert`. See #1525\n\t\tif (!Object.hasOwn(insert, key)) {\n\t\t\tObject.defineProperty(grammar, key, descriptors[key]);\n\t\t}\n\n\t\tif (position === 'after' && key === atKey) {\n\t\t\tbetterAssign(grammar, insert);\n\t\t}\n\t}\n}\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n * @typedef {import('../types.d.ts').GrammarToken} GrammarToken\n * @typedef {import('../types.d.ts').GrammarTokens} GrammarTokens\n */\n"
  },
  {
    "path": "src/util/iterables.js",
    "content": "/**\n * Converts the given value to an array.\n *\n * If the given value is already an error, it will be returned as is.\n *\n * @template {{}} T\n * @param {T | T[] | undefined | null} value\n * @returns {T[]}\n */\nexport function toArray (value) {\n\tif (Array.isArray(value)) {\n\t\treturn value;\n\t}\n\telse if (value == null) {\n\t\treturn [];\n\t}\n\telse {\n\t\treturn [value];\n\t}\n}\n\n/**\n * Invokes the given callback for all elements of the given value.\n *\n * If the given value is an array, the callback will be invokes for all elements. If the given value is `null` or\n * `undefined`, the callback will not be invoked. In all other cases, the callback will be invoked with the given\n * value as parameter.\n *\n * @template {{}} T\n * @param {T | T[] | null | undefined} value\n * @param {(value: T, index: number) => void} callbackFn\n * @returns {void}\n */\nexport function forEach (value, callbackFn) {\n\tif (Array.isArray(value)) {\n\t\tvalue.forEach(callbackFn);\n\t}\n\telse if (value != null) {\n\t\tcallbackFn(value, 0);\n\t}\n}\n\n/**\n * Checks whether the given value is iterable.\n *\n * @param {any} value\n * @returns {value is Iterable<any>}\n */\nexport function isIterable (value) {\n\treturn typeof value === 'object' && Symbol.iterator in Object(value);\n}\n\n/**\n * Converts the given value to an iterable.\n *\n * If the given value is already iterable, it will be returned as is.\n * Otherwise, it will be converted to an array.\n *\n * @template T\n * @param {any} value\n * @returns {Iterable<T>}\n */\nexport function toIterable (value) {\n\tif (isIterable(value)) {\n\t\treturn value;\n\t}\n\n\treturn toArray(value);\n}\n"
  },
  {
    "path": "src/util/language-util.js",
    "content": "export { extend } from './extend.js';\nexport { insertBefore } from './insert.js';\nexport { withoutTokenize } from './without-tokenize.js';\n"
  },
  {
    "path": "src/util/objects.js",
    "content": "import { toArray } from './iterables.js';\n\n/**\n * @template {Record<string, any>} T\n * @template {keyof T} K\n * @param {T} obj\n * @param {K} key\n * @param {() => T[K]} getter\n * @param {any} [waitFor]\n * @returns {Promise<void>}\n */\nexport async function defineLazyProperty (obj, key, getter, waitFor) {\n\tif (waitFor) {\n\t\tawait waitFor;\n\t}\n\n\tObject.defineProperty(obj, key, {\n\t\tenumerable: true,\n\t\tconfigurable: true,\n\t\tget () {\n\t\t\tconst value = getter.call(this);\n\t\t\t// Replace the getter with a writable property\n\t\t\tdefineSimpleProperty(this, key, value);\n\t\t\treturn value;\n\t\t},\n\t\tset (value) {\n\t\t\tdefineSimpleProperty(this, key, value);\n\t\t},\n\t});\n}\n\n/**\n * @template {Record<string, any>} T\n * @template {keyof T} K\n * @param {T} obj\n * @param {K} key\n * @param {T[K]} value\n * @returns {void}\n */\nexport function defineSimpleProperty (obj, key, value) {\n\tObject.defineProperty(obj, key, {\n\t\tvalue,\n\t\twritable: true,\n\t\tenumerable: true,\n\t\tconfigurable: false,\n\t});\n}\n\n/**\n *\n * @param {any} obj\n * @param {string} type\n * @returns {boolean}\n */\nexport function isObject (obj, type) {\n\tif (!obj || typeof obj !== 'object') {\n\t\treturn false;\n\t}\n\n\tconst proto = Object.getPrototypeOf(obj);\n\treturn proto.constructor?.name === type;\n}\n\n/**\n * @param {any} obj\n * @returns {boolean}\n */\nexport function isPlainObject (obj) {\n\treturn isObject(obj, 'Object');\n}\n\n/**\n * @typedef {object} MergeOptions\n * @property {any[]} [emptyValues]\n * @property {string[]} [containers]\n * @property {(value: any, key?: Property, parent?: any) => boolean} [isContainer]\n * @property {boolean} [mergeArrays]\n */\n\n/** @typedef {string | number | symbol} Property */\n\n/**\n *\n * @param {any} target\n * @param {any} source\n * @param {MergeOptions} [options={}]\n * @returns\n */\nexport function deepMerge (target, source, options = {}) {\n\tconst {\n\t\temptyValues = [undefined],\n\t\tcontainers = ['Object', 'EventTarget'],\n\t\tisContainer = value => containers.some(type => isObject(value, type)),\n\t\tmergeArrays = false,\n\t} = options;\n\n\tif (mergeArrays && (Array.isArray(target) || Array.isArray(source))) {\n\t\ttarget = toArray(target);\n\t\tsource = toArray(source);\n\t\treturn target.concat(source);\n\t}\n\n\tif (isContainer(target) && isContainer(source)) {\n\t\tfor (const key in source) {\n\t\t\ttarget[key] = deepMerge(target[key], source[key], options);\n\t\t}\n\n\t\treturn target;\n\t}\n\n\tif (emptyValues.includes(target)) {\n\t\treturn source;\n\t}\n\n\treturn source ?? target;\n}\n\n/**\n * @typedef {object} CloneOptions\n *\n * Used internally to store clones of objects,\n * both for performance but mainly to avoid getting tripped up in circular references\n * @property {WeakMap<any, any>} [_clones]\n */\n\n/**\n * @param {any} obj\n * @param {CloneOptions} options\n */\nexport function deepClone (obj, options = {}) {\n\tif (!obj || typeof obj !== 'object') {\n\t\treturn obj;\n\t}\n\n\toptions._clones ??= new WeakMap();\n\tconst { _clones } = options;\n\n\tif (_clones.has(obj)) {\n\t\treturn _clones.get(obj);\n\t}\n\n\tlet ret = obj;\n\n\tif (Array.isArray(obj)) {\n\t\tret = [];\n\t\t_clones.set(obj, ret);\n\n\t\tfor (const item of obj) {\n\t\t\tret.push(deepClone(item, options));\n\t\t}\n\t}\n\telse if (isPlainObject(obj)) {\n\t\tret = { ...obj };\n\t\t_clones.set(obj, ret);\n\n\t\tfor (const key in obj) {\n\t\t\tret[key] = deepClone(obj[key], options);\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n/**\n * Like Object.assign() but preserves accessors.\n *\n * @param {Record<string, any>} target\n * @param {Record<string, any>[]} sources\n */\nexport function betterAssign (target, ...sources) {\n\tfor (const source of sources) {\n\t\tconst descriptors = Object.getOwnPropertyDescriptors(source);\n\t\tfor (const key in descriptors) {\n\t\t\tif (Object.hasOwn(target, key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst descriptor = descriptors[key];\n\t\t\tObject.defineProperty(target, key, descriptor);\n\t\t}\n\t}\n\n\treturn target;\n}\n"
  },
  {
    "path": "src/util/without-tokenize.js",
    "content": "/**\n * @param {Grammar} grammar\n * @returns {Grammar}\n */\nexport function withoutTokenize (grammar) {\n\tif (!grammar.$tokenize) {\n\t\treturn grammar;\n\t}\n\n\tconst copy = { ...grammar };\n\tdelete copy.$tokenize;\n\treturn copy;\n}\n\n/**\n * @typedef {import('../types.d.ts').Grammar} Grammar\n */\n"
  },
  {
    "path": "tests/components-test.js",
    "content": "import { readFileSync } from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { assert } from 'chai';\nimport { noop } from '../src/shared/util.js';\nimport { forEach, toArray } from '../src/util/iterables.js';\nimport { getComponent, getComponentIds, getLanguageIds } from './helper/prism-loader.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ndescribe('Components', () => {\n\tit('- should not have redundant optional dependencies', async function () {\n\t\tthis.timeout(10_000);\n\n\t\tfor (const id of getComponentIds()) {\n\t\t\tconst proto = await getComponent(id).catch(noop);\n\t\t\tconst require = new Set(toArray(/** @type any */ (proto)?.require).map(p => p.id));\n\n\t\t\tforEach(/** @type any */ (proto?.optional), opt => {\n\t\t\t\tif (require.has(opt)) {\n\t\t\t\t\tassert.fail(\n\t\t\t\t\t\t`The optional dependency ${opt} is redundant because ${id} already requires it. Remove the optional dependency.`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tit('- should have unique aliases', async function () {\n\t\tthis.timeout(10_000);\n\n\t\t/** @type {Map<string, string>} */\n\t\tconst seen = new Map();\n\n\t\t/**\n\t\t * @param {string} id\n\t\t * @param {string} desc\n\t\t */\n\t\tconst add = (id, desc) => {\n\t\t\tconst already = seen.get(id);\n\t\t\tif (already) {\n\t\t\t\tassert.fail(`Expected ${id} to be ${desc} but it is already ${already}`);\n\t\t\t}\n\t\t\tseen.set(id, desc);\n\t\t};\n\n\t\tfor (const id of getComponentIds()) {\n\t\t\tconst proto = await getComponent(id).catch(noop);\n\t\t\tadd(id, 'a component id');\n\t\t\tforEach(/** @type {string | string[] | null | undefined} */ (proto?.alias), a =>\n\t\t\t\tadd(a, `an alias of ${id}`));\n\t\t}\n\t});\n});\n\n/** @type {Components} */\nconst components = JSON.parse(\n\treadFileSync(path.join(__dirname, '../src/components.json'), 'utf-8')\n);\n\ndescribe('components.json', () => {\n\t/**\n\t * @param {(entry: ComponentEntry, id: string, entries: Record<string, ComponentEntry>) => void} consumeFn\n\t */\n\tfunction forEachEntry (consumeFn) {\n\t\tconst entries = {};\n\n\t\tfor (const category in components) {\n\t\t\tfor (const id in components[category]) {\n\t\t\t\tconst entry = components[category][id];\n\t\t\t\tif (id !== 'meta' && entry && typeof entry === 'object') {\n\t\t\t\t\tentries[id] = entry;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const id in entries) {\n\t\t\tconsumeFn(entries[id], id, /** @type {Record<string, ComponentEntry>} */ (entries));\n\t\t}\n\t}\n\n\tdescribe('- should have valid alias titles', () => {\n\t\tfor (const lang of getLanguageIds()) {\n\t\t\tit(`- ${lang} should have all alias titles registered as alias`, async () => {\n\t\t\t\tconst aliases = new Set(\n\t\t\t\t\ttoArray(\n\t\t\t\t\t\t/** @type {string | string[] | null | undefined} */ (\n\t\t\t\t\t\t\t(await getComponent(lang)).alias\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tconst aliasTitles =\n\t\t\t\t\t/** @type {ComponentEntry} */ (components.languages[lang])?.aliasTitles ?? {};\n\n\t\t\t\tObject.keys(aliasTitles).forEach(id => {\n\t\t\t\t\tif (!aliases.has(id)) {\n\t\t\t\t\t\tconst titleJson = JSON.stringify(aliasTitles[id]);\n\t\t\t\t\t\tassert.fail(\n\t\t\t\t\t\t\t`The alias '${id}' with the title ${titleJson} is not registered as an alias.`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t});\n\n\tit('- should have a sorted language list', () => {\n\t\tconst ignore = new Set(['meta', 'xml', 'markup', 'css', 'clike', 'javascript', 'plain']);\n\t\tconst languages = Object.keys(components.languages)\n\t\t\t.filter(key => !ignore.has(key))\n\t\t\t.map(key => {\n\t\t\t\treturn {\n\t\t\t\t\tid: key,\n\t\t\t\t\ttitle: /** @type {ComponentEntry} */ (components.languages[key]).title,\n\t\t\t\t};\n\t\t\t});\n\n\t\t/**\n\t\t * Transforms the given title into an intermediate representation to allowed for sensible comparisons\n\t\t * between titles.\n\t\t *\n\t\t * @param {string} title\n\t\t * @returns {string}\n\t\t */\n\t\tfunction transformTitle (title) {\n\t\t\treturn title.replace(/\\W+/g, '').replace(/^\\d+/, '').toLowerCase();\n\t\t}\n\n\t\tconst sorted = [...languages].sort((a, b) => {\n\t\t\tconst comp = transformTitle(/** @type {string} */ (a.title)).localeCompare(\n\t\t\t\ttransformTitle(/** @type {string} */ (b.title))\n\t\t\t);\n\t\t\tif (comp !== 0) {\n\t\t\t\treturn comp;\n\t\t\t}\n\t\t\t// a and b have the same intermediate form (e.g. \"C\" => \"C\", \"C++\" => \"C\", \"C#\" => \"C\").\n\t\t\treturn /** @type {string} */ (a.title)\n\t\t\t\t.toLowerCase()\n\t\t\t\t.localeCompare(/** @type {string} */ (b.title).toLowerCase());\n\t\t});\n\n\t\tassert.sameOrderedMembers(languages, sorted);\n\t});\n\n\tit('- should not have unknown properties', () => {\n\t\tconst knownProperties = new Set([\n\t\t\t'title',\n\t\t\t'description',\n\t\t\t'aliasTitles',\n\t\t\t'owner',\n\n\t\t\t'noCSS',\n\t\t\t'option',\n\t\t]);\n\n\t\tforEachEntry((entry, id) => {\n\t\t\tfor (const prop in entry) {\n\t\t\t\tif (!knownProperties.has(prop)) {\n\t\t\t\t\tassert.fail(\n\t\t\t\t\t\t`Component \"${id}\":` +\n\t\t\t\t\t\t\t` The property ${JSON.stringify(prop)} is not supported by Prism.`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n});\n\n/** @typedef {Record<string, ComponentCategory>} Components */\n\n/** @typedef {Record<string, ComponentEntry | string>} ComponentCategory */\n\n/**\n * @typedef {object} ComponentEntry\n * @property {string} [title] - The title of the component.\n * @property {string} [owner] - The GitHub user name of the owner.\n * @property {boolean} [noCSS] - Whether the component doesn't have style sheets which should also be loaded.\n * @property {object} [aliasTitles] -  An optional map from an alias to its title. Aliases which are not in this map will the get title of the component.\n */\n"
  },
  {
    "path": "tests/core/greedy.js",
    "content": "import { assert } from 'chai';\nimport { Prism } from '../../src/core/prism.js';\nimport { simplify } from '../helper/token-stream-transformer.js';\n\n/**\n * @param {object} options\n * @param {Grammar} options.grammar\n * @param {string} options.code\n * @param {any} options.expected\n */\nfunction testTokens ({ grammar, code, expected }) {\n\tconst instance = new Prism();\n\tinstance.languageRegistry.add({ id: 'test', grammar });\n\n\tconst simpleTokens = simplify(instance.tokenize(code, grammar));\n\n\tassert.deepStrictEqual(simpleTokens, expected);\n}\n\ndescribe('Greedy matching', () => {\n\tit('should correctly handle tokens with the same name', () => {\n\t\ttestTokens({\n\t\t\tgrammar: {\n\t\t\t\t'comment': [\n\t\t\t\t\t/\\/\\/.*/,\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\t\t\tgreedy: true,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\tcode: '// /*\\n/* comment */',\n\t\t\texpected: [\n\t\t\t\t['comment', '// /*'],\n\t\t\t\t['comment', '/* comment */'],\n\t\t\t],\n\t\t});\n\t});\n\n\tit('should support patterns with top-level alternatives that do not contain the lookbehind group', () => {\n\t\ttestTokens({\n\t\t\tgrammar: {\n\t\t\t\t'a': /'[^']*'/,\n\t\t\t\t'b': {\n\t\t\t\t\t// This pattern has 2 top-level alternatives:  foo  and  (^|[^\\\\])\"[^\"]*\"\n\t\t\t\t\tpattern: /foo|(^|[^\\\\])\"[^\"]*\"/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tcode: 'foo \"bar\" \\'baz\\'',\n\t\t\texpected: [\n\t\t\t\t['b', 'foo'],\n\t\t\t\t['b', '\"bar\"'],\n\t\t\t\t['a', \"'baz'\"],\n\t\t\t],\n\t\t});\n\t});\n\n\tit('should correctly rematch tokens', () => {\n\t\ttestTokens({\n\t\t\tgrammar: {\n\t\t\t\t'a': {\n\t\t\t\t\tpattern: /'[^'\\r\\n]*'/,\n\t\t\t\t},\n\t\t\t\t'b': {\n\t\t\t\t\tpattern: /\"[^\"\\r\\n]*\"/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t\t'c': {\n\t\t\t\t\tpattern: /<[^>\\r\\n]*>/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tcode: `<'> '' ''\\n<\"> \"\" \"\"`,\n\t\t\texpected: [\n\t\t\t\t['c', \"<'>\"],\n\t\t\t\t\" '\",\n\t\t\t\t['a', \"' '\"],\n\t\t\t\t\"'\\n\",\n\n\t\t\t\t['c', '<\">'],\n\t\t\t\t['b', '\"\"'],\n\t\t\t\t['b', '\"\"'],\n\t\t\t],\n\t\t});\n\t});\n\n\tit('should always match tokens against the whole text', () => {\n\t\t// this is to test for a bug where greedy tokens where matched like non-greedy ones if the token stream ended on\n\t\t// a string\n\t\ttestTokens({\n\t\t\tgrammar: {\n\t\t\t\t'a': /a/,\n\t\t\t\t'b': {\n\t\t\t\t\tpattern: /^b/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tcode: 'bab',\n\t\t\texpected: [['b', 'b'], ['a', 'a'], 'b'],\n\t\t});\n\t});\n\n\tit('issue3052', () => {\n\t\t// If a greedy pattern creates an empty token at the end of the string, then this token should be discarded\n\t\ttestTokens({\n\t\t\tgrammar: {\n\t\t\t\t'oh-no': {\n\t\t\t\t\tpattern: /$/,\n\t\t\t\t\tgreedy: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tcode: 'foo',\n\t\t\texpected: ['foo'],\n\t\t});\n\t});\n});\n\n/** @import { Grammar } from '../../src/types.d.ts'; */\n"
  },
  {
    "path": "tests/core/registry.js",
    "content": "import { assert } from 'chai';\nimport { Prism } from '../../src/core/prism.js';\n\ndescribe('Registry', () => {\n\tit('should resolve aliases', () => {\n\t\tconst { languageRegistry } = new Prism();\n\n\t\tconst grammar = /** @type {Grammar} */ ({ 'keyword': 'foo' });\n\t\tlanguageRegistry.add({ id: 'a', alias: 'b', grammar });\n\n\t\tassert.isTrue(languageRegistry.has('a'));\n\n\t\tassert.strictEqual(languageRegistry.resolveRef('a').id, 'a');\n\t\tassert.strictEqual(languageRegistry.resolveRef('b').id, 'a');\n\n\t\tassert.deepStrictEqual(languageRegistry.getLanguage('a')?.resolvedGrammar, grammar);\n\t\tassert.deepStrictEqual(languageRegistry.getLanguage('b')?.resolvedGrammar, grammar);\n\t});\n\n\tit('should resolve aliases in optional dependencies', () => {\n\t\tconst { languageRegistry } = new Prism();\n\n\t\tconst grammar = /** @type {Grammar} */ ({ 'keyword': 'foo' });\n\t\tlanguageRegistry.add({ id: 'a', alias: 'b', grammar });\n\t\tlanguageRegistry.add({\n\t\t\tid: 'c',\n\t\t\toptional: 'b',\n\t\t\t/**\n\t\t\t * @param {GrammarOptions} options\n\t\t\t */\n\t\t\tgrammar ({ getOptionalLanguage }) {\n\t\t\t\treturn getOptionalLanguage('b') ?? { 'keyword': 'bar' };\n\t\t\t},\n\t\t});\n\n\t\tassert.deepStrictEqual(languageRegistry.getLanguage('c')?.resolvedGrammar, grammar);\n\t});\n\n\tit.skip('should throw on circular dependencies', () => {\n\t\tassert.throws(() => {\n\t\t\tconst { languageRegistry } = new Prism();\n\n\t\t\tlanguageRegistry.add({ id: 'a', optional: 'b', grammar: {} });\n\t\t\tlanguageRegistry.add({ id: 'b', optional: 'a', grammar: {} });\n\t\t}, /Circular dependency a -> b -> a not allowed/);\n\n\t\tassert.throws(() => {\n\t\t\tconst { languageRegistry } = new Prism();\n\n\t\t\tlanguageRegistry.add({ id: 'a', optional: 'b', grammar: {} });\n\t\t\tlanguageRegistry.add({ id: 'b', optional: 'a', grammar: {} });\n\t\t}, /Circular dependency a -> b -> a not allowed/);\n\n\t\tassert.throws(() => {\n\t\t\tconst { languageRegistry } = new Prism();\n\n\t\t\tlanguageRegistry.add({ id: 'a', optional: 'a', grammar: {} });\n\t\t}, /Circular dependency a -> a not allowed/);\n\t});\n});\n\n/**\n * @import { Grammar, GrammarOptions } from '../../src/types.d.ts';\n */\n"
  },
  {
    "path": "tests/coverage.js",
    "content": "import { assert } from 'chai';\nimport { toArray } from '../src/util/iterables.js';\nimport * as PrismLoader from './helper/prism-loader.js';\nimport { runTestCase } from './helper/test-case.js';\nimport { loadAllTests } from './helper/test-discovery.js';\nimport { BFS, BFSPathToPrismTokenPath, isRegExp } from './helper/util.js';\n\ndescribe('Pattern test coverage', () => {\n\t/** @type {Map<string, PatternData>} */\n\tconst patterns = new Map();\n\n\t/**\n\t * @param {string | string[]} languages\n\t * @returns {Promise<Prism>}\n\t */\n\tasync function createInstance (languages) {\n\t\tconst Prism = await PrismLoader.createInstance(languages);\n\n\t\tconst root = Object.fromEntries(\n\t\t\ttoArray(languages).map(id => [\n\t\t\t\tid,\n\t\t\t\tPrism.languageRegistry.getLanguage(id)?.resolvedGrammar,\n\t\t\t])\n\t\t);\n\n\t\tBFS(root, (path, object) => {\n\t\t\tconst { key, value } = path[path.length - 1];\n\t\t\tconst tokenPath = BFSPathToPrismTokenPath(path);\n\n\t\t\tif (key && isRegExp(value)) {\n\t\t\t\tconst regex = makeGlobal(value);\n\t\t\t\tobject[key] = regex;\n\n\t\t\t\tconst patternKey = String(regex);\n\t\t\t\tlet data = patterns.get(patternKey);\n\t\t\t\tif (!data) {\n\t\t\t\t\tdata = {\n\t\t\t\t\t\tpattern: regex,\n\t\t\t\t\t\tlanguage: path[1].key ?? '',\n\t\t\t\t\t\tfrom: new Set(),\n\t\t\t\t\t\tmatches: [],\n\t\t\t\t\t};\n\t\t\t\t\tpatterns.set(patternKey, data);\n\t\t\t\t}\n\t\t\t\tdata.from.add(tokenPath);\n\t\t\t\tconst { matches } = data;\n\n\t\t\t\tregex.exec = string => {\n\t\t\t\t\tconst match = RegExp.prototype.exec.call(regex, string);\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tmatches.push(match);\n\t\t\t\t\t}\n\t\t\t\t\treturn match;\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\treturn Prism;\n\t}\n\n\tdescribe('Register all patterns', () => {\n\t\tit('all', async function () {\n\t\t\tthis.slow(10 * 1000);\n\t\t\t// This will cause ALL regexes of Prism to be registered in the patterns map.\n\t\t\t// (Languages that don't have any tests can't be caught otherwise.)\n\t\t\tawait createInstance(PrismLoader.getLanguageIds());\n\t\t});\n\t});\n\n\tdescribe('Run all language tests', () => {\n\t\t// define tests for all tests in all languages in the test suite\n\t\tfor (const [languageIdentifier, files] of loadAllTests()) {\n\t\t\tit(languageIdentifier, async function () {\n\t\t\t\tthis.timeout(10 * 1000);\n\n\t\t\t\tfor (const filePath of files) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait runTestCase(languageIdentifier, filePath, 'none', createInstance);\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\t// we don't case about whether the test succeeds,\n\t\t\t\t\t\t// we just want to gather usage data\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe('Coverage', () => {\n\t\tfor (const language of PrismLoader.getLanguageIds()) {\n\t\t\tdescribe(language, () => {\n\t\t\t\tit(`- should cover all patterns`, () => {\n\t\t\t\t\tconst untested = getAllOf(language).filter(d => d.matches.length === 0);\n\t\t\t\t\tif (untested.length === 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst problems = untested.map(data => {\n\t\t\t\t\t\treturn formatProblem(data, [\n\t\t\t\t\t\t\t'This pattern is completely untested. Add test files that match this pattern.',\n\t\t\t\t\t\t]);\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.fail(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t`${problems.length} pattern(s) are untested:\\n` +\n\t\t\t\t\t\t\t\t'You can learn more about writing tests at https://prismjs.com/test-suite.html#writing-tests',\n\t\t\t\t\t\t\t...problems,\n\t\t\t\t\t\t].join('\\n\\n')\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(`- should exhaustively cover all keywords in keyword lists`, () => {\n\t\t\t\t\tconst problems = [];\n\n\t\t\t\t\tfor (const data of getAllOf(language)) {\n\t\t\t\t\t\tif (data.matches.length === 0) {\n\t\t\t\t\t\t\t// don't report the same pattern twice\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst keywords = getKeywordList(data.pattern);\n\t\t\t\t\t\tif (!keywords) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst keywordCount = keywords.size;\n\n\t\t\t\t\t\tdata.matches.forEach(([m]) => {\n\t\t\t\t\t\t\tif (data.pattern.ignoreCase) {\n\t\t\t\t\t\t\t\tm = m.toUpperCase();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tkeywords.delete(m);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (keywords.size > 0) {\n\t\t\t\t\t\t\tproblems.push(\n\t\t\t\t\t\t\t\tformatProblem(data, [\n\t\t\t\t\t\t\t\t\t`Add test files to test all keywords. The following keywords (${keywords.size}/${keywordCount}) are untested:`,\n\t\t\t\t\t\t\t\t\t...[...keywords].map(k => `    ${k}`),\n\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (problems.length === 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tassert.fail(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t`${problems.length} keyword list(s) are not exhaustively tested:\\n` +\n\t\t\t\t\t\t\t\t'You can learn more about writing tests at https://prismjs.com/test-suite.html#writing-tests',\n\t\t\t\t\t\t\t...problems,\n\t\t\t\t\t\t].join('\\n\\n')\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t});\n\n\t/**\n\t * @param {string} language\n\t * @returns {PatternData[]}\n\t */\n\tfunction getAllOf (language) {\n\t\treturn [...patterns.values()].filter(d => d.language === language);\n\t}\n\n\t/**\n\t * @param {string} string\n\t * @param {number} maxLength\n\t * @returns {string}\n\t */\n\tfunction short (string, maxLength) {\n\t\tif (string.length > maxLength) {\n\t\t\treturn string.slice(0, maxLength - 1) + '…';\n\t\t}\n\t\telse {\n\t\t\treturn string;\n\t\t}\n\t}\n\n\t/**\n\t * If the given pattern string describes a keyword list, all keyword will be returned. Otherwise, `null` will be\n\t * returned.\n\t *\n\t * @param {RegExp} pattern\n\t * @returns {Set<string> | null}\n\t */\n\tfunction getKeywordList (pattern) {\n\t\t// Right now, only keyword lists of the form /\\b(?:foo|bar)\\b/ are supported.\n\t\t// In the future, we might want to convert these regexes to NFAs and iterate all words to cover more complex\n\t\t// keyword lists and even operator and punctuation lists.\n\n\t\tlet source = pattern.source.replace(/^\\\\b|\\\\b$/g, '');\n\t\tif (source.startsWith('(?:') && source.endsWith(')')) {\n\t\t\tsource = source.slice('(?:'.length, source.length - ')'.length);\n\t\t}\n\n\t\tif (/^\\w+(?:\\|\\w+)*$/.test(source)) {\n\t\t\tif (pattern.ignoreCase) {\n\t\t\t\tsource = source.toUpperCase();\n\t\t\t}\n\t\t\treturn new Set(source.split(/\\|/));\n\t\t}\n\t\telse {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * @param {Iterable<string>} occurrences\n\t * @returns {{ origin: string; otherOccurrences: string[] }}\n\t */\n\tfunction splitOccurrences (occurrences) {\n\t\tconst all = [...occurrences];\n\t\treturn {\n\t\t\torigin: all[0],\n\t\t\totherOccurrences: all.slice(1),\n\t\t};\n\t}\n\n\t/**\n\t * @param {PatternData} data\n\t * @param {string[]} messageLines\n\t * @returns {string}\n\t */\n\tfunction formatProblem (data, messageLines) {\n\t\tconst { origin, otherOccurrences } = splitOccurrences(data.from);\n\n\t\tconst lines = [`${origin}:`, short(String(data.pattern), 100), '', ...messageLines];\n\n\t\tif (otherOccurrences.length) {\n\t\t\tlines.push(\n\t\t\t\t'',\n\t\t\t\t'Other occurrences of this pattern:',\n\t\t\t\t...otherOccurrences.map(o => `- ${o}`)\n\t\t\t);\n\t\t}\n\n\t\treturn lines.join('\\n    ');\n\t}\n});\n\n/**\n * @param {RegExp} regex\n * @returns {RegExp}\n */\nfunction makeGlobal (regex) {\n\tif (regex.global) {\n\t\treturn regex;\n\t}\n\telse {\n\t\treturn RegExp(regex.source, regex.flags + 'g');\n\t}\n}\n\n/**\n * @typedef {object} PatternData\n * @property {RegExp} pattern\n * @property {string} language\n * @property {Set<string>} from\n * @property {RegExpExecArray[]} matches\n */\n"
  },
  {
    "path": "tests/helper/args.js",
    "content": "import yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nconst args = /** @type {Args} */ (yargs(hideBin(process.argv)).argv);\n\nexport const language = args.language;\nexport const update = !!args.update;\n\n/**\n * @typedef {object} Args\n * @property {string|string[]} [language]\n * @property {boolean} [update]\n */\n"
  },
  {
    "path": "tests/helper/prism-dom-util.js",
    "content": "import { createPrismDOM } from './prism-loader.js';\nimport { assertEqual, useSnapshot } from './snapshot.js';\nimport { formatHtml } from './util.js';\n\n/**\n * @param {PrismWindow<{}>} window\n */\nexport function createUtil (window) {\n\tconst { Prism, document } = window;\n\n\treturn {\n\t\tassert: {\n\t\t\t/** @param {AssertOptions} options */\n\t\t\thighlight ({ language = 'none', code, format = true, expected = useSnapshot }) {\n\t\t\t\tlet actual = Prism.highlight(code, language);\n\t\t\t\tif (format) {\n\t\t\t\t\tactual = formatHtml(actual);\n\t\t\t\t}\n\t\t\t\tassertEqual(actual, expected);\n\t\t\t},\n\t\t\t/** @param {AssertOptions} options */\n\t\t\thighlightElement ({ language = 'none', code, format = true, expected = useSnapshot }) {\n\t\t\t\tconst element = document.createElement('code');\n\t\t\t\telement.classList.add('language-' + language);\n\t\t\t\telement.textContent = code;\n\n\t\t\t\tPrism.highlightElement(element);\n\n\t\t\t\tlet actual = element.innerHTML;\n\t\t\t\tif (format) {\n\t\t\t\t\tactual = formatHtml(actual);\n\t\t\t\t}\n\t\t\t\tassertEqual(actual, expected);\n\t\t\t},\n\t\t\t/** @param {AssertOptions & { attributes?: Record<string, string> }} options */\n\t\t\thighlightPreElement ({\n\t\t\t\tlanguage = 'none',\n\t\t\t\tattributes = {},\n\t\t\t\tcode,\n\t\t\t\tformat = false,\n\t\t\t\texpected = useSnapshot,\n\t\t\t}) {\n\t\t\t\tconst preElement = document.createElement('pre');\n\t\t\t\tfor (const key in attributes) {\n\t\t\t\t\tconst value = attributes[key];\n\t\t\t\t\tpreElement.setAttribute(key, value);\n\t\t\t\t}\n\t\t\t\tpreElement.classList.add('language-' + language);\n\n\t\t\t\tconst codeElement = document.createElement('code');\n\t\t\t\tcodeElement.textContent = code;\n\t\t\t\tpreElement.appendChild(codeElement);\n\n\t\t\t\tPrism.highlightElement(codeElement);\n\n\t\t\t\tlet actual = preElement.outerHTML;\n\t\t\t\tif (format) {\n\t\t\t\t\tactual = formatHtml(actual);\n\t\t\t\t}\n\t\t\t\tassertEqual(actual, expected);\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * @template T\n * @param {object} options\n * @param {string | string[]} [options.languages]\n * @param {T | T[]} [options.plugins]\n * @returns {{ it: (title: string, fn: (dom: TestSuiteDom<T>) => void) => void }}\n */\nexport function createTestSuite (options) {\n\treturn {\n\t\tit: (title, fn) => {\n\t\t\tit(title, async () => {\n\t\t\t\tconst dom = createPrismDOM();\n\n\t\t\t\ttry {\n\t\t\t\t\tif (options.languages) {\n\t\t\t\t\t\tawait dom.loadLanguages(options.languages);\n\t\t\t\t\t}\n\t\t\t\t\tif (options.plugins) {\n\t\t\t\t\t\tawait dom.loadPlugins(/** @type {string | string[]} */ (options.plugins));\n\t\t\t\t\t}\n\n\t\t\t\t\tdom.withGlobals(() => {\n\t\t\t\t\t\tfn({ ...dom, util: createUtil(dom.window) });\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tfinally {\n\t\t\t\t\tdom.window.close();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t};\n}\n\n/**\n * @typedef {import('../types.d.ts').AssertOptions} AssertOptions\n */\n\n/**\n * @template {string} T\n * @typedef {import('../types.d.ts').TestSuiteDom<T>} TestSuiteDom\n */\n\n/**\n * @template T\n * @typedef {import('../types.d.ts').PrismWindow<T>} PrismWindow\n */\n"
  },
  {
    "path": "tests/helper/prism-loader.js",
    "content": "import { readdirSync } from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { JSDOM } from 'jsdom';\nimport { Prism } from '../../src/core/prism.js';\nimport { isNonNull, lazy, noop } from '../../src/shared/util.js';\nimport { toArray } from '../../src/util/iterables.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst SRC_DIR = path.join(__dirname, '../../src');\n\nexport const getLanguageIds = lazy(() => {\n\tconst files = readdirSync(path.join(SRC_DIR, 'languages'));\n\treturn files\n\t\t.map(f => {\n\t\t\tconst match = /^([\\w-]+)\\.[jt]s$/.exec(f);\n\t\t\tif (!match) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst [, id] = match;\n\t\t\treturn id;\n\t\t})\n\t\t.filter(isNonNull);\n});\nexport const getPluginIds = lazy(() => {\n\treturn readdirSync(path.join(SRC_DIR, 'plugins'));\n});\nexport const getComponentIds = lazy(() => [...getLanguageIds(), ...getPluginIds()]);\n\n/**\n * @param {string} id\n * @returns {Promise<ComponentProto>}\n */\nasync function getComponentUncached (id) {\n\tif (getPluginIds().includes(id)) {\n\t\tconst file = path.join(SRC_DIR, 'plugins', id, `${id}.js`);\n\t\tconst exports = await import(file);\n\t\treturn exports.default;\n\t}\n\telse {\n\t\tconst file = path.join(SRC_DIR, 'languages', `${id}.js`);\n\t\tconst exports = await import(file);\n\t\treturn exports.default;\n\t}\n}\n\n/** @type {Map<string, Promise<ComponentProto>>} */\nconst componentCache = new Map();\n\n/**\n * @param {string} id\n * @returns {Promise<ComponentProto>}\n */\nexport function getComponent (id) {\n\tlet promise = componentCache.get(id);\n\tif (promise === undefined) {\n\t\tpromise = getComponentUncached(id);\n\t\tcomponentCache.set(id, promise);\n\t}\n\treturn promise;\n}\n\n// preload all components\ngetComponentIds().forEach(getComponent);\n\n/**\n * Creates a new Prism instance with the given language loaded.\n *\n * @param {string|string[]} [languages]\n */\nexport async function createInstance (languages) {\n\tconst instance = new Prism();\n\n\tconst protos = await Promise.all(toArray(languages).map(getComponent));\n\tprotos.forEach(proto => instance.languageRegistry.add(/** @type { LanguageProto }*/ (proto)));\n\n\treturn instance;\n}\n\n/**\n * @param {object} target\n * @param {object} source\n */\nfunction overwriteProps (target, source) {\n\tconst oldProps = [];\n\n\tfor (const [key, value] of Object.entries(source)) {\n\t\toldProps.push([key, target[key]]);\n\t\ttarget[key] = value;\n\t}\n\n\treturn () => {\n\t\tfor (const [key, value] of oldProps) {\n\t\t\ttarget[key] = value;\n\t\t}\n\t};\n}\n\n/**\n * Creates a new JavaScript DOM instance with Prism being loaded.\n *\n * @returns {PrismDOM<{}>}\n */\nexport function createPrismDOM () {\n\tconst dom = new JSDOM(``, {\n\t\trunScripts: 'outside-only',\n\t\turl: 'https://example.com/test.html',\n\t});\n\tconst window = dom.window;\n\n\tconst instance = new Prism();\n\twindow.Prism = instance;\n\n\t/**\n\t * @param {function(): void} fn\n\t */\n\tconst withGlobals = fn => {\n\t\tconst g = global;\n\t\tlet undo;\n\t\ttry {\n\t\t\tconst globals = {\n\t\t\t\twindow,\n\t\t\t\tdocument: window.document,\n\t\t\t\tlocation: window.location,\n\t\t\t\tgetComputedStyle: window.getComputedStyle,\n\t\t\t\tsetTimeout: noop,\n\t\t\t};\n\n\t\t\t// Set up navigator separately to make it writable (it's read-only in Node.js)\n\t\t\tObject.defineProperty(g, 'navigator', {\n\t\t\t\tvalue: window.navigator,\n\t\t\t\tconfigurable: true,\n\t\t\t\twritable: true,\n\t\t\t});\n\n\t\t\tundo = overwriteProps(g, globals);\n\t\t\tfn();\n\t\t}\n\t\tfinally {\n\t\t\tundo?.();\n\t\t\t// Clean up navigator property\n\t\t\tdelete (/** @type {Partial<typeof global>} */ (g).navigator);\n\t\t}\n\t};\n\n\t/**\n\t * @param {string|string[]} languages\n\t */\n\tconst loadLanguages = async languages => {\n\t\tconst protos = await Promise.all(toArray(languages).map(getComponent));\n\t\twithGlobals(() => {\n\t\t\tprotos.forEach(proto =>\n\t\t\t\tinstance.languageRegistry.add(/** @type { LanguageProto }*/ (proto)));\n\t\t});\n\t};\n\n\t/**\n\t * @param {string|string[]} plugins\n\t */\n\tconst loadPlugins = async plugins => {\n\t\tconst protos = await Promise.all(toArray(plugins).map(getComponent));\n\t\twithGlobals(() => {\n\t\t\tprotos.forEach(proto =>\n\t\t\t\tinstance.pluginRegistry.add(/** @type {PluginProto} */ (proto)));\n\t\t});\n\t};\n\n\treturn {\n\t\tdom,\n\t\twindow,\n\t\tdocument: window.document,\n\t\tPrism: window.Prism,\n\t\tloadLanguages,\n\t\tloadPlugins,\n\t\twithGlobals,\n\t};\n}\n\n/** @typedef {import('jsdom').DOMWindow} DOMWindow */\n\n/**\n * @template T\n * @typedef {import('../types.d.ts').PrismDOM<T>} PrismDOM\n */\n\n/** @import {ComponentProto, PluginProto, LanguageProto} from '../../src/types.d.ts'; */\n"
  },
  {
    "path": "tests/helper/snapshot.js",
    "content": "import { assert, expect, use } from 'chai';\nimport { jestSnapshotPlugin } from 'mocha-chai-jest-snapshot';\n\nuse(jestSnapshotPlugin());\n\nexport const useSnapshot = Symbol();\n\n/**\n * @template T\n * @param {T} actual\n * @param {T | symbol} expected\n */\nexport function assertEqual (actual, expected) {\n\tif (expected === useSnapshot) {\n\t\texpect(actual).toMatchSnapshot();\n\t}\n\telse {\n\t\tassert.strictEqual(actual, expected);\n\t}\n}\n"
  },
  {
    "path": "tests/helper/test-case.js",
    "content": "import fs from 'fs';\nimport { assert } from 'chai';\nimport { createInstance } from './prism-loader.js';\nimport * as TokenStreamTransformer from './token-stream-transformer.js';\nimport { formatHtml, getLeadingSpaces } from './util.js';\n\nconst defaultCreateInstance = createInstance;\n\n/** @typedef {'\\n' | '\\r\\n'} Eol */\n\n/**\n * Handles parsing and printing of a test case file.\n *\n * A test case file consists of at most three parts, separated by a line of at least 10 dashes.\n * This separation line must start at the beginning of the line and consist of at least three dashes.\n *\n *     {code: the source code of the test case}\n *     ----------\n *     {expected: the expected value of the test case}\n *     ----------\n *     {description: explaining the test case}\n *\n * All parts are optional.\n *\n * If the file contains more than three parts, the remaining parts are part of the description.\n */\nexport class TestCaseFile {\n\t/**\n\t * @type {string}\n\t */\n\tcode;\n\t/**\n\t * @type {string}\n\t */\n\texpected;\n\t/**\n\t * @type {string}\n\t */\n\tdescription;\n\t/**\n\t * The end of line sequence used when printed.\n\t *\n\t * @type {Eol}\n\t */\n\teol = '\\n';\n\t/**\n\t * The number of the first line of `code`.\n\t *\n\t * @type {number}\n\t */\n\tcodeLineStart = NaN;\n\t/**\n\t * The number of the first line of `expected`.\n\t *\n\t * @type {number}\n\t */\n\texpectedLineStart = NaN;\n\t/**\n\t * The number of the first line of `description`.\n\t *\n\t * @type {number}\n\t */\n\tdescriptionLineStart = NaN;\n\n\t/**\n\t * @param {string} code\n\t * @param {string} [expected]\n\t * @param {string} [description]\n\t */\n\tconstructor (code, expected, description) {\n\t\tthis.code = code;\n\t\tthis.expected = expected || '';\n\t\tthis.description = description || '';\n\t}\n\n\t/**\n\t * Returns the file content of the given test file.\n\t *\n\t * @returns {string}\n\t */\n\tprint () {\n\t\tconst code = this.code.trim();\n\t\tconst expected = (this.expected || '').trim();\n\t\tconst description = (this.description || '').trim();\n\n\t\tconst parts = [code];\n\t\tif (description) {\n\t\t\tparts.push(expected, description);\n\t\t}\n\t\telse if (expected) {\n\t\t\tparts.push(expected);\n\t\t}\n\n\t\t// join all parts together and normalize line ends to LF\n\t\tconst content = parts\n\t\t\t.join('\\n\\n----------------------------------------------------\\n\\n')\n\t\t\t.replace(/\\r\\n?|\\n/g, this.eol);\n\n\t\treturn content + this.eol;\n\t}\n\n\t/**\n\t * Writes the given test case file to disk.\n\t *\n\t * @param {string} filePath\n\t */\n\twriteToFile (filePath) {\n\t\tfs.writeFileSync(filePath, this.print(), 'utf-8');\n\t}\n\n\t/**\n\t * Parses the given file contents into a test file.\n\t *\n\t * The line ends of the code, expected value, and description are all normalized to CRLF.\n\t *\n\t * @param {string} content\n\t * @returns {TestCaseFile}\n\t */\n\tstatic parse (content) {\n\t\tconst eol = (/\\r\\n|\\n/.exec(content) || ['\\n'])[0];\n\n\t\t// normalize line ends to CRLF\n\t\tcontent = content.replace(/\\r\\n?|\\n/g, '\\r\\n');\n\n\t\tconst parts = content.split(/^-{10,}[ \\t]*$/m, 3);\n\t\tconst code = parts[0] || '';\n\t\tconst expected = parts[1] || '';\n\t\tconst description = parts[2] || '';\n\n\t\tconst file = new TestCaseFile(code.trim(), expected.trim(), description.trim());\n\t\tfile.eol = /** @type {Eol} */ (eol);\n\n\t\tconst codeStartSpaces = getLeadingSpaces(code);\n\t\tconst expectedStartSpaces = getLeadingSpaces(expected);\n\t\tconst descriptionStartSpaces = getLeadingSpaces(description);\n\n\t\tconst codeLineCount = code.split(/\\r\\n/).length;\n\t\tconst expectedLineCount = expected.split(/\\r\\n/).length;\n\n\t\tfile.codeLineStart = codeStartSpaces.split(/\\r\\n/).length;\n\t\tfile.expectedLineStart = codeLineCount + expectedStartSpaces.split(/\\r\\n/).length;\n\t\tfile.descriptionLineStart =\n\t\t\tcodeLineCount + expectedLineCount + descriptionStartSpaces.split(/\\r\\n/).length;\n\n\t\treturn file;\n\t}\n\n\t/**\n\t * Reads the given test case file from disk.\n\t *\n\t * @param {string} filePath\n\t * @returns {TestCaseFile}\n\t */\n\tstatic readFromFile (filePath) {\n\t\treturn TestCaseFile.parse(fs.readFileSync(filePath, 'utf8'));\n\t}\n}\n\n/**\n * @template T\n * @typedef Runner\n * @property {(Prism: Prism, code: string, language: string) => T} run\n * @property {(actual: T) => string} print\n * @property {(actual: T, expected: string) => boolean} isEqual\n * @property {(actual: T, expected: string, message: (firstDifference: number) => string) => void} assertEqual\n */\n\n/** @type {Runner<TokenStream>} */\nconst jsonRunner = {\n\trun (Prism, code, language) {\n\t\tconst grammar = Prism.languageRegistry.getLanguage(language)?.resolvedGrammar;\n\t\treturn Prism.tokenize(code, grammar ?? {});\n\t},\n\tprint (actual) {\n\t\treturn TokenStreamTransformer.prettyprint(actual, '\\t');\n\t},\n\tisEqual (actual, expected) {\n\t\tconst simplifiedActual = TokenStreamTransformer.simplify(actual);\n\t\tlet simplifiedExpected;\n\t\ttry {\n\t\t\tsimplifiedExpected = JSON.parse(expected);\n\t\t}\n\t\tcatch {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn JSON.stringify(simplifiedActual) === JSON.stringify(simplifiedExpected);\n\t},\n\tassertEqual (actual, expected, message) {\n\t\tconst simplifiedActual = TokenStreamTransformer.simplify(actual);\n\t\tconst simplifiedExpected = JSON.parse(expected);\n\n\t\tconst actualString = JSON.stringify(simplifiedActual);\n\t\tconst expectedString = JSON.stringify(simplifiedExpected);\n\n\t\tconst difference = firstDiff(expectedString, actualString);\n\t\tif (difference === undefined) {\n\t\t\t// both are equal\n\t\t\treturn;\n\t\t}\n\n\t\t// The index of the first difference between the expected token stream and the actual token stream.\n\t\t// The index is in the raw expected token stream JSON of the test case.\n\t\tconst diffIndex = translateIndexIgnoreSpaces(expected, expectedString, difference);\n\n\t\tassert.deepEqual(simplifiedActual, simplifiedExpected, message(diffIndex ?? 0));\n\t},\n};\n/**\n * Normalizes the given HTML by removing all leading spaces and trailing spaces. Line breaks will also be normalized\n * to enable good diffing.\n *\n * @param {string} html\n * @returns {string}\n */\nfunction normalizeHtml (html) {\n\treturn html\n\t\t.replace(/</g, '\\n<')\n\t\t.replace(/>/g, '>\\n')\n\t\t.replace(/[ \\t]*[\\r\\n]\\s*/g, '\\n')\n\t\t.trim();\n}\n/** @type {Runner<string>} */\nconst htmlRunner = {\n\trun (Prism, code, language) {\n\t\treturn Prism.highlight(code, language);\n\t},\n\tprint (actual) {\n\t\treturn formatHtml(actual);\n\t},\n\tisEqual (actual, expected) {\n\t\treturn normalizeHtml(actual) === normalizeHtml(expected);\n\t},\n\tassertEqual (actual, expected, message) {\n\t\t// We don't calculate the index of the first difference because it's difficult.\n\t\tassert.deepEqual(normalizeHtml(actual), normalizeHtml(expected), message(0));\n\t},\n};\n\n/** @typedef {'none' | 'insert' | 'update'} UpdateMethod */\n\n/**\n * Runs the given test case file and asserts the result\n *\n * The passed language identifier can either be a language like \"css\" or a composed language\n * identifier like \"css+markup\". Composed identifiers can be used for testing language inclusion.\n *\n * When testing language inclusion, the first given language is the main language which will be passed\n * to Prism for highlighting (\"css+markup\" will result in a call to Prism to highlight with the \"css\" grammar).\n * But it will be ensured, that the additional passed languages will be loaded too.\n *\n * The languages will be loaded in the order they were provided.\n *\n * @param {string} languageIdentifier\n * @param {string} filePath\n * @param {UpdateMethod} updateMode\n * @param {(languages: string[]) => Promise<Prism>} [createInstance]\n */\nexport async function runTestCase (\n\tlanguageIdentifier,\n\tfilePath,\n\tupdateMode,\n\tcreateInstance = defaultCreateInstance\n) {\n\tif (/\\.html\\.test$/i.test(filePath)) {\n\t\tawait runTestCaseWithRunner(\n\t\t\tlanguageIdentifier,\n\t\t\tfilePath,\n\t\t\tupdateMode,\n\t\t\thtmlRunner,\n\t\t\tcreateInstance\n\t\t);\n\t}\n\telse {\n\t\tawait runTestCaseWithRunner(\n\t\t\tlanguageIdentifier,\n\t\t\tfilePath,\n\t\t\tupdateMode,\n\t\t\tjsonRunner,\n\t\t\tcreateInstance\n\t\t);\n\t}\n}\n\n/**\n * @template T\n * @param {string} languageIdentifier\n * @param {string} filePath\n * @param {UpdateMethod} updateMode\n * @param {Runner<T>} runner\n * @param {(languages: string[]) => Promise<Prism>} createInstance\n */\nexport async function runTestCaseWithRunner (\n\tlanguageIdentifier,\n\tfilePath,\n\tupdateMode,\n\trunner,\n\tcreateInstance\n) {\n\tconst testCase = TestCaseFile.readFromFile(filePath);\n\tconst usedLanguages = parseLanguageNames(languageIdentifier);\n\n\tconst Prism = await createInstance(usedLanguages.languages);\n\n\t// the first language is the main language to highlight\n\tconst actualValue = runner.run(Prism, testCase.code, usedLanguages.mainLanguage);\n\n\tfunction updateFile () {\n\t\t// change the file\n\t\ttestCase.expected = runner.print(actualValue);\n\t\ttestCase.writeToFile(filePath);\n\t}\n\n\tif (!testCase.expected) {\n\t\t// the test case doesn't have an expected value\n\n\t\tif (updateMode === 'none') {\n\t\t\tthrow new Error(\n\t\t\t\t\"This test case doesn't have an expected token stream.\" +\n\t\t\t\t\t' Either add the JSON of a token stream or run \\`npm run test:languages -- --insert\\`' +\n\t\t\t\t\t' to automatically add the current token stream.'\n\t\t\t);\n\t\t}\n\n\t\tupdateFile();\n\t}\n\telse {\n\t\t// there is an expected value\n\n\t\tif (runner.isEqual(actualValue, testCase.expected)) {\n\t\t\t// no difference\n\t\t\treturn;\n\t\t}\n\n\t\tif (updateMode === 'update') {\n\t\t\tupdateFile();\n\t\t\treturn;\n\t\t}\n\n\t\trunner.assertEqual(actualValue, testCase.expected, diffIndex => {\n\t\t\tconst expectedLines = testCase.expected.substr(0, diffIndex).split(/\\r\\n?|\\n/);\n\t\t\tconst columnNumber = (expectedLines.pop() || '').length + 1;\n\t\t\tconst lineNumber = testCase.expectedLineStart + expectedLines.length;\n\n\t\t\treturn (\n\t\t\t\ttestCase.description +\n\t\t\t\t`\\nThe expected token stream differs from the actual token stream.` +\n\t\t\t\t` Either change the ${usedLanguages.mainLanguage} language or update the expected token stream.` +\n\t\t\t\t` Run \\`npm run test:languages -- --update\\` to update all missing or incorrect expected token streams.` +\n\t\t\t\t`\\n\\n\\nActual Token Stream:` +\n\t\t\t\t`\\n-----------------------------------------\\n` +\n\t\t\t\trunner.print(actualValue) +\n\t\t\t\t`\\n-----------------------------------------\\n` +\n\t\t\t\t`File: ${filePath}:${lineNumber}:${columnNumber}\\n\\n`\n\t\t\t);\n\t\t});\n\t}\n}\n\n/**\n * Parses the language names and finds the main language.\n *\n * It is either the last language or the language followed by a exclamation mark \"!\".\n * There should only be one language with an exclamation mark.\n *\n * @param {string} languageIdentifier\n * @returns {{ languages: string[], mainLanguage: string }}\n */\nexport function parseLanguageNames (languageIdentifier) {\n\tlet languages = languageIdentifier.split('+');\n\t/** @type {string | null} */\n\tlet mainLanguage = null;\n\n\tlanguages = languages.map(language => {\n\t\tif (language.includes('!')) {\n\t\t\tif (mainLanguage) {\n\t\t\t\tthrow 'There are multiple main languages defined.';\n\t\t\t}\n\n\t\t\tmainLanguage = language.replace('!', '');\n\t\t\treturn mainLanguage;\n\t\t}\n\n\t\treturn language;\n\t});\n\n\tif (!mainLanguage) {\n\t\tmainLanguage = languages[languages.length - 1];\n\t}\n\n\treturn { languages, mainLanguage };\n}\n\n/**\n * Returns the index at which the given expected string differs from the given actual string.\n *\n * This will returns `undefined` if the strings are equal.\n *\n * @param {string} expected\n * @param {string} actual\n * @returns {number | undefined}\n */\nfunction firstDiff (expected, actual) {\n\tlet i = 0;\n\tlet j = 0;\n\twhile (i < expected.length && j < actual.length) {\n\t\tif (expected[i] !== actual[j]) {\n\t\t\treturn i;\n\t\t}\n\t\ti++;\n\t\tj++;\n\t}\n\n\tif (i === expected.length && j === actual.length) {\n\t\treturn undefined;\n\t}\n\treturn i;\n}\n\n/**\n * Translates an index within a string (`withoutSpaces`) to the index of another string (`spacey`) where the only\n * difference between the two strings is that the other string can have any number of additional white spaces at any\n * position.\n *\n * In out use case, the `withoutSpaces` string is an unformatted JSON string and the `spacey` string is a formatted JSON\n * string.\n *\n * @param {string} spacey\n * @param {string} withoutSpaces\n * @param {number} withoutSpaceIndex\n * @returns {number | undefined}\n */\nfunction translateIndexIgnoreSpaces (spacey, withoutSpaces, withoutSpaceIndex) {\n\tlet i = 0;\n\tlet j = 0;\n\twhile (i < spacey.length && j < withoutSpaces.length) {\n\t\twhile (spacey[i] !== withoutSpaces[j]) {\n\t\t\ti++;\n\t\t}\n\t\tif (j === withoutSpaceIndex) {\n\t\t\treturn i;\n\t\t}\n\t\ti++;\n\t\tj++;\n\t}\n\treturn undefined;\n}\n\n/**\n * @import { Prism } from '../../src/core.js';\n * @import { TokenStream } from '../../src/types.d.ts';\n */\n"
  },
  {
    "path": "tests/helper/test-discovery.js",
    "content": "import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst LANGUAGES_DIR = path.join(__dirname, '..', 'languages');\n\n/**\n * Loads the list of all available tests.\n *\n * @param {string} [rootDir=LANGUAGES_DIR]\n * @returns {Map<string, string[]>}\n */\nexport function loadAllTests (rootDir = LANGUAGES_DIR) {\n\treturn new Map(\n\t\tgetAllDirectories(rootDir).map(language => {\n\t\t\treturn [language, getAllFiles(path.join(rootDir, language))];\n\t\t})\n\t);\n}\n\n/**\n * Loads the list of available tests that match the given languages.\n *\n * @param {string | string[]} languages\n * @param {string} [rootDir=LANGUAGES_DIR]\n * @returns {Map<string, string[]>}\n */\nexport function loadSomeTests (languages, rootDir = LANGUAGES_DIR) {\n\treturn new Map(\n\t\tgetSomeDirectories(rootDir, languages).map(language => {\n\t\t\treturn [language, getAllFiles(path.join(rootDir, language))];\n\t\t})\n\t);\n}\n\n/**\n * Returns a list of all (sub)directories (just the directory names, not full paths)\n * in the given src directory.\n *\n * @param {string} src\n * @returns {string[]}\n */\nexport function getAllDirectories (src) {\n\treturn fs.readdirSync(src).filter(file => {\n\t\treturn fs.statSync(path.join(src, file)).isDirectory();\n\t});\n}\n\n/**\n * Returns a list of all (sub)directories (just the directory names, not full paths)\n * in the given src directory, matching the given languages.\n *\n * @param {string} src\n * @param {string | string[]} languages\n * @returns {string[]}\n */\nexport function getSomeDirectories (src, languages) {\n\treturn fs.readdirSync(src).filter(file => {\n\t\treturn fs.statSync(path.join(src, file)).isDirectory() && directoryMatches(file, languages);\n\t});\n}\n\n/**\n * Returns whether a directory matches one of the given languages.\n *\n * @param {string} directory\n * @param {string | string[]} languages\n * @returns {boolean}\n */\nexport function directoryMatches (directory, languages) {\n\tif (!Array.isArray(languages)) {\n\t\tlanguages = [languages];\n\t}\n\tconst dirLanguages = directory.split(/!?\\+!?/);\n\treturn dirLanguages.some(lang => languages.includes(lang));\n}\n\n/**\n * Returns a list of all full file paths to all files in the given src directory.\n *\n * @param {string} src\n * @returns {string[]}\n */\nfunction getAllFiles (src) {\n\treturn fs\n\t\t.readdirSync(src)\n\t\t.filter(fileName => {\n\t\t\treturn (\n\t\t\t\tpath.extname(fileName) === '.test' && fs.statSync(path.join(src, fileName)).isFile()\n\t\t\t);\n\t\t})\n\t\t.map(fileName => {\n\t\t\treturn path.join(src, fileName);\n\t\t});\n}\n"
  },
  {
    "path": "tests/helper/token-stream-transformer.js",
    "content": "import { getLeadingSpaces, getTrailingSpaces } from './util.js';\n\n/**\n * Simplifies the token stream to ease the matching with the expected token stream.\n *\n * * Strings are kept as-is\n * * In arrays each value is transformed individually\n * * Values that are empty (empty arrays or strings only containing whitespace)\n *\n * @param {TokenStream} tokenStream\n * @returns {SimplifiedTokenStream}\n */\nexport function simplify (tokenStream) {\n\treturn tokenStream\n\t\t.map(innerSimple)\n\t\t.filter(value => !(typeof value === 'string' && isBlank(value)));\n\n\t/**\n\t *\n\t * @param {string | TokenStreamItem} value\n\t * @returns {string | [string, string | SimplifiedTokenStream]}\n\t */\n\tfunction innerSimple (value) {\n\t\tif (typeof value === 'object') {\n\t\t\tif (Array.isArray(value.content)) {\n\t\t\t\treturn [value.type, simplify(value.content)];\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [value.type, value.content];\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\treturn value;\n\t\t}\n\t}\n}\n\n/**\n * @param {TokenStream} tokenStream\n * @param {string} [indentation]\n * @returns {string}\n */\nexport function prettyprint (tokenStream, indentation) {\n\treturn printPrettyTokenStream(toPrettyTokenStream(tokenStream), undefined, indentation);\n}\n\n/**\n * This item indicates that one or multiple line breaks are present between the preceding and following items in the\n * source token stream.\n *\n * Only if an item is enabled will it appear in the pretty-printed token stream.\n */\nclass LineBreakItem {\n\t/** @type {number} */\n\tsourceCount;\n\n\tenabled = false;\n\n\t/**\n\t * @param {number} sourceCount\n\t */\n\tconstructor (sourceCount) {\n\t\tthis.sourceCount = sourceCount;\n\t\tthis.enabled = false;\n\t}\n}\n/**\n * This item indicates the the preceding and following items are to be printed on the same line in the pretty-printed\n * token stream.\n */\nclass GlueItem {}\n\n/**\n *\n * @param {TokenStream} tokenStream\n * @param {number} [level=0]\n * @returns {PrettyTokenStream}\n */\nfunction toPrettyTokenStream (tokenStream, level = 0) {\n\t/** @type {PrettyTokenStream} */\n\tconst prettyStream = [];\n\tfor (const token of tokenStream) {\n\t\tif (typeof token === 'string') {\n\t\t\tif (isBlank(token)) {\n\t\t\t\t// blank string\n\t\t\t\tconst lineBreaks = countLineBreaks(token);\n\t\t\t\tif (lineBreaks > 0) {\n\t\t\t\t\tprettyStream.push(new LineBreakItem(lineBreaks));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// might start with line breaks\n\t\t\t\tconst startLineBreaks = countLineBreaks(getLeadingSpaces(token));\n\t\t\t\tif (startLineBreaks > 0) {\n\t\t\t\t\tprettyStream.push(new LineBreakItem(startLineBreaks));\n\t\t\t\t}\n\n\t\t\t\tprettyStream.push(token);\n\n\t\t\t\tconst endLineBreaks = countLineBreaks(getTrailingSpaces(token));\n\t\t\t\tif (endLineBreaks > 0) {\n\t\t\t\t\tprettyStream.push(new LineBreakItem(endLineBreaks));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tprettyStream.push(innerSimple(token));\n\t\t}\n\t}\n\n\t/**\n\t * @param {TokenStreamItem} value\n\t * @returns {[string, string | PrettyTokenStream]}\n\t */\n\tfunction innerSimple (value) {\n\t\tif (Array.isArray(value.content)) {\n\t\t\treturn [value.type, toPrettyTokenStream(value.content, level + 1)];\n\t\t}\n\t\telse {\n\t\t\treturn [value.type, value.content];\n\t\t}\n\t}\n\n\tprettyFormat(prettyStream, (level + 1) * 4);\n\treturn prettyStream;\n}\n\n/**\n *\n * @param {PrettyTokenStream} prettyStream\n * @param {number} indentationWidth\n * @returns {void}\n */\nfunction prettyFormat (prettyStream, indentationWidth) {\n\t// The maximum number of (glued) tokens per line\n\tconst MAX_TOKEN_PER_LINE = 5;\n\t// The maximum number of characters per line\n\t// (this is based on an estimation. The actual output might be longer.)\n\tconst MAX_PRINT_WIDTH = 80 - indentationWidth;\n\n\tprettyTrimLineBreaks(prettyStream);\n\t// enable all line breaks with >=2 breaks in the source token stream\n\tprettyEnableLineBreaks(prettyStream, br => br.sourceCount >= 2);\n\n\tconst ranges = prettySplit(prettyStream, br => br instanceof LineBreakItem && br.enabled);\n\tfor (const group of ranges) {\n\t\tif (prettySomeLineBreak(group, true, br => br.enabled)) {\n\t\t\t// Since we just split by enabled line break, only nested line breaks can be enabled. This usually\n\t\t\t// indicates complex token streams, so let's just enable all line breaks and call it a day.\n\t\t\tprettyEnableLineBreaks(group, () => true);\n\t\t}\n\t\telse {\n\t\t\t// try to optimize for the pattern /<token>{1,MAX_TOKEN_PER_LINE}(\\n<token>{1,MAX_TOKEN_PER_LINE})*/\n\t\t\tconst lines = prettySplit(group, i => i instanceof LineBreakItem);\n\n\t\t\t/**\n\t\t\t * Returns whether lines can generally be glued together (no line breaks within lines and don't glue with\n\t\t\t * nested tokens).\n\t\t\t */\n\t\t\tconst glueable = () => {\n\t\t\t\treturn lines.every(g => {\n\t\t\t\t\tif (g.length > 1) {\n\t\t\t\t\t\tif (prettyContainsNonTriviallyNested(g)) {\n\t\t\t\t\t\t\t// the token with nested tokens might be glued together with other tokens and we can't allow\n\t\t\t\t\t\t\t// that to happen\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// we can safely ignore all tokens that are on their own line\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t\tconst tokensPerLine = () => {\n\t\t\t\treturn lines.map(g => prettyCountTokens(g, true));\n\t\t\t};\n\t\t\t/**\n\t\t\t * Returns an estimate for the output length each line will have\n\t\t\t */\n\t\t\tconst widthPerLine = () => {\n\t\t\t\treturn lines.map(g => {\n\t\t\t\t\tif (g.length > 1) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tg\n\t\t\t\t\t\t\t\t.map(item => {\n\t\t\t\t\t\t\t\t\tif (isToken(item)) {\n\t\t\t\t\t\t\t\t\t\tif (typeof item === 'string') {\n\t\t\t\t\t\t\t\t\t\t\treturn ', '.length + JSON.stringify(item).length;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t', '.length +\n\t\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(item).length +\n\t\t\t\t\t\t\t\t\t\t\t\t' '.length\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.reduce((a, b) => a + b, 0) - ', '.length\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// we don't really care about the print width of a single-token line\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst glueTokens =\n\t\t\t\tglueable() &&\n\t\t\t\t// at most this many tokens per line\n\t\t\t\tMath.max(...tokensPerLine()) <= MAX_TOKEN_PER_LINE &&\n\t\t\t\t// the output of each line can be at most this many characters long\n\t\t\t\tMath.max(...widthPerLine()) <= MAX_PRINT_WIDTH &&\n\t\t\t\t// We need to have at least 2 lines in this group OR this group isn't the only group in the stream.\n\t\t\t\t// This will prevent all tokens of a really short token stream to be glued together.\n\t\t\t\t(lines.length > 1 || ranges.length > 1);\n\n\t\t\tif (glueTokens) {\n\t\t\t\tprettyGlueTogetherAll(prettyStream, group);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst flatTokenCount = prettyCountTokens(group, false);\n\t\t\t\tconst deepTokenCount = prettyCountTokens(group, true);\n\t\t\t\tif (\n\t\t\t\t\t// prevent a one-token-per-line situation\n\t\t\t\t\tflatTokenCount > lines.length &&\n\t\t\t\t\t// require at least 2 tokens per line on average\n\t\t\t\t\tdeepTokenCount >= lines.length * 2\n\t\t\t\t) {\n\t\t\t\t\tprettyEnableLineBreaks(group, () => true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * @param {PrettyTokenStream} prettyStream\n * @param {number} [indentationLevel=1]\n * @param {string} [indentationChar='    ']\n * @returns {string}\n */\nfunction printPrettyTokenStream (prettyStream, indentationLevel = 1, indentationChar = '    ') {\n\t// can't use tabs because the console will convert one tab to four spaces\n\tconst indentation = new Array(indentationLevel + 1).join(indentationChar);\n\n\tlet out = '';\n\tout += '[\\n';\n\n\tlet glued = false;\n\tprettyStream.forEach((item, i) => {\n\t\tif (item instanceof LineBreakItem) {\n\t\t\tif (item.enabled) {\n\t\t\t\tout += '\\n';\n\t\t\t}\n\t\t}\n\t\telse if (item instanceof GlueItem) {\n\t\t\tout = out.trimEnd();\n\t\t\tif (out[out.length - 1] === ',') {\n\t\t\t\tout += ' ';\n\t\t\t}\n\t\t\tglued = true;\n\t\t}\n\t\telse {\n\t\t\tif (glued) {\n\t\t\t\tglued = false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tout += indentation;\n\t\t\t}\n\n\t\t\tif (typeof item === 'string') {\n\t\t\t\tout += JSON.stringify(item);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst name = item[0];\n\t\t\t\tconst content = item[1];\n\n\t\t\t\tout += '[' + JSON.stringify(name) + ', ';\n\n\t\t\t\tif (typeof content === 'string') {\n\t\t\t\t\t// simple string literal\n\t\t\t\t\tout += JSON.stringify(content);\n\t\t\t\t}\n\t\t\t\telse if (content.length === 1 && typeof content[0] === 'string') {\n\t\t\t\t\t// token stream that only contains a single string literal\n\t\t\t\t\tout += JSON.stringify(content);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// token stream\n\t\t\t\t\tout += printPrettyTokenStream(content, indentationLevel + 1, indentationChar);\n\t\t\t\t}\n\n\t\t\t\tout += ']';\n\t\t\t}\n\n\t\t\tconst lineEnd = i === prettyStream.length - 1 ? '\\n' : ',\\n';\n\t\t\tout += lineEnd;\n\t\t}\n\t});\n\tout += indentation.substr(indentationChar.length) + ']';\n\treturn out;\n}\n\n/**\n * Returns whether the given string is empty or contains only whitespace characters.\n *\n * @param {string} str\n * @returns {boolean}\n */\nfunction isBlank (str) {\n\treturn /^\\s*$/.test(str);\n}\n\n/**\n * @param {string} str\n * @returns {number}\n */\nfunction countLineBreaks (str) {\n\treturn str.split(/\\r\\n?|\\n/).length - 1;\n}\n\n/**\n * Trim all line breaks at the start and at the end of the pretty stream.\n *\n * @param {PrettyTokenStream} prettyStream\n */\nfunction prettyTrimLineBreaks (prettyStream) {\n\tlet value;\n\twhile ((value = prettyStream[0])) {\n\t\tif (value instanceof LineBreakItem) {\n\t\t\tprettyStream.shift();\n\t\t}\n\t\telse {\n\t\t\tbreak;\n\t\t}\n\t}\n\twhile ((value = prettyStream[prettyStream.length - 1])) {\n\t\tif (value instanceof LineBreakItem) {\n\t\t\tprettyStream.pop();\n\t\t}\n\t\telse {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Enables all line breaks in the pretty token stream (but not in nested token stream) that contain at least some\n * number of line breaks in the source token stream.\n *\n * @param {PrettyTokenStream} prettyStream\n * @param {(item: LineBreakItem) => boolean} cond\n */\nfunction prettyEnableLineBreaks (prettyStream, cond) {\n\tprettyStream.forEach(token => {\n\t\tif (token instanceof LineBreakItem && cond(token)) {\n\t\t\ttoken.enabled = true;\n\t\t}\n\t});\n}\n\n/**\n * Splits the given pretty stream on all items for which `cond` return `true`. The items for which `cond` returns\n * `true` will not be part of any of the created streams. No empty streams will be returned.\n *\n * @param {PrettyTokenStream} prettyStream\n * @param {(item: PrettyTokenStreamItem) => boolean} cond\n * @returns {PrettyTokenStream[]}\n */\nfunction prettySplit (prettyStream, cond) {\n\t/** @type {PrettyTokenStream[]} */\n\tconst result = [];\n\n\t/** @type {PrettyTokenStream} */\n\tlet current = [];\n\tfor (const item of prettyStream) {\n\t\tif (cond(item)) {\n\t\t\tif (current.length > 0) {\n\t\t\t\tresult.push(current);\n\t\t\t\tcurrent = [];\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tcurrent.push(item);\n\t\t}\n\t}\n\tif (current.length > 0) {\n\t\tresult.push(current);\n\t\tcurrent = [];\n\t}\n\treturn result;\n}\n\n/**\n * @param {PrettyTokenStream} prettyStream\n * @param {boolean} recursive\n * @param {(item: LineBreakItem) => boolean} cond\n * @returns {boolean}\n */\nfunction prettySomeLineBreak (prettyStream, recursive, cond) {\n\tfor (const item of prettyStream) {\n\t\tif (item instanceof LineBreakItem && cond(item)) {\n\t\t\treturn true;\n\t\t}\n\t\telse if (recursive && isNested(item) && prettySomeLineBreak(item[1], true, cond)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n *\n * @param {PrettyTokenStream} prettyStream\n * @returns {boolean}\n */\nfunction prettyContainsNonTriviallyNested (prettyStream) {\n\tfor (const item of prettyStream) {\n\t\tif (isNested(item) && !isTriviallyNested(item)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n *\n * @param {PrettyTokenStream} prettyStream\n * @param {boolean} recursive\n * @returns {number}\n */\nfunction prettyCountTokens (prettyStream, recursive) {\n\tlet count = 0;\n\tfor (const item of prettyStream) {\n\t\tif (isToken(item)) {\n\t\t\tcount++;\n\t\t\tif (recursive && isNested(item) && !isTriviallyNested(item)) {\n\t\t\t\tcount += prettyCountTokens(item[1], true);\n\t\t\t}\n\t\t}\n\t}\n\treturn count;\n}\n\n/**\n * Adds glue between the given tokens in the given stream.\n *\n * @param {PrettyTokenStream} prettyStream\n * @param {SimplifiedToken} prev\n * @param {SimplifiedToken} next\n */\nfunction prettyGlueTogether (prettyStream, prev, next) {\n\t// strings may appear more than once in the stream, so we have to search for tokens.\n\tif (typeof prev !== 'string') {\n\t\tconst index = prettyStream.indexOf(prev);\n\t\tif (index === -1 || prettyStream[index + 1] !== next) {\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot glue: At least one of the tokens is not part of the given token stream.'\n\t\t\t);\n\t\t}\n\t\tprettyStream.splice(index + 1, 0, new GlueItem());\n\t}\n\telse {\n\t\tconst index = prettyStream.indexOf(next);\n\t\tif (index === -1 || prettyStream[index - 1] !== prev) {\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot glue: At least one of the tokens is not part of the given token stream.'\n\t\t\t);\n\t\t}\n\t\tprettyStream.splice(index, 0, new GlueItem());\n\t}\n}\n/**\n * Glues together all token in the given slice of the given token stream.\n *\n * @param {PrettyTokenStream} prettyStream\n * @param {PrettyTokenStream} slice\n */\nfunction prettyGlueTogetherAll (prettyStream, slice) {\n\tfor (let i = 1, l = slice.length; i < l; i++) {\n\t\tconst prev = slice[i - 1];\n\t\tconst next = slice[i];\n\t\tif (isToken(prev) && isToken(next)) {\n\t\t\tprettyGlueTogether(prettyStream, prev, next);\n\t\t}\n\t}\n}\n\n/**\n *\n * @param {PrettyTokenStreamItem} item\n * @returns {item is SimplifiedToken}\n */\nfunction isToken (item) {\n\treturn typeof item === 'string' || Array.isArray(item);\n}\n/**\n *\n * @param {PrettyTokenStreamItem} item\n * @returns {item is [string, SimplifiedToken[]]}\n */\nfunction isNested (item) {\n\treturn Array.isArray(item) && Array.isArray(item[1]);\n}\n\n/**\n *\n * @param {PrettyTokenStreamItem} item\n * @returns {item is [string, [string]]}\n */\nfunction isTriviallyNested (item) {\n\treturn isNested(item) && item[1].length === 1 && typeof item[1][0] === 'string';\n}\n\n/**\n * @typedef {object} TokenStreamItem\n * @property {string} type\n * @property {string | (string | TokenStreamItem)[]} content\n */\n\n/**\n * @typedef {(string | TokenStreamItem)[]} TokenStream\n * @typedef {string | [string, string | SimplifiedTokenStream]} SimplifiedToken\n * @typedef {SimplifiedToken[]} SimplifiedTokenStream\n * @typedef {string | LineBreakItem | GlueItem | [string, string | PrettyTokenStream]} PrettyTokenStreamItem\n * @typedef {PrettyTokenStreamItem[]} PrettyTokenStream\n */\n"
  },
  {
    "path": "tests/helper/util.js",
    "content": "import synchronizedPrettier from '@prettier/sync';\nimport { RegExpParser } from 'regexpp';\n\nconst parser = new RegExpParser();\n\n/** @type {Map<string, LiteralAST>} */\nconst astCache = new Map();\n\n/**\n * Performs a breadth-first search on the given start element.\n *\n * @param {any} start\n * @param {(path: PathItem[], obj: Record<string, any>) => void} callback\n */\nexport function BFS (start, callback) {\n\tconst visited = new Set();\n\t/** @type {PathItem[][]} */\n\tlet toVisit = [[{ key: null, value: start }]];\n\n\twhile (toVisit.length > 0) {\n\t\t/** @type {PathItem[][]} */\n\t\tconst newToVisit = [];\n\n\t\tfor (const path of toVisit) {\n\t\t\tconst obj = path[path.length - 1].value;\n\t\t\tif (!visited.has(obj)) {\n\t\t\t\tvisited.add(obj);\n\n\t\t\t\tfor (const key in obj) {\n\t\t\t\t\tconst value = obj[key];\n\n\t\t\t\t\tpath.push({ key, value });\n\t\t\t\t\tcallback(path, obj);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tArray.isArray(value) ||\n\t\t\t\t\t\tObject.prototype.toString.call(value) === '[object Object]'\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewToVisit.push([...path]);\n\t\t\t\t\t}\n\n\t\t\t\t\tpath.pop();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttoVisit = newToVisit;\n\t}\n}\n\n/**\n * Given the `BFS` path given to `BFS` callbacks, this will return the Prism language token path of the current\n * value (e.g. `Prism.languages.xml.tag.pattern`).\n *\n * @param {PathItem[]} path\n * @param {string} [root='Prism.languages']\n * @returns {string}\n */\nexport function BFSPathToPrismTokenPath (path, root = 'Prism.languages') {\n\tlet tokenPath = root;\n\tfor (const { key } of path) {\n\t\tif (!key) {\n\t\t\t// do nothing\n\t\t}\n\t\telse if (/^\\d+$/.test(key)) {\n\t\t\ttokenPath += `[${key}]`;\n\t\t}\n\t\telse if (/^[a-z]\\w*$/i.test(key)) {\n\t\t\ttokenPath += `.${key}`;\n\t\t}\n\t\telse {\n\t\t\ttokenPath += `[${JSON.stringify(key)}]`;\n\t\t}\n\t}\n\treturn tokenPath;\n}\n\n/**\n * Returns the AST of a given pattern.\n *\n * @param {RegExp} regex\n * @returns {LiteralAST}\n */\nexport function parseRegex (regex) {\n\tconst key = regex.toString();\n\tlet literal = astCache.get(key);\n\tif (literal === undefined) {\n\t\tconst flags = parser.parseFlags(regex.flags, undefined);\n\t\tconst pattern = parser.parsePattern(regex.source, undefined, undefined, flags.unicode);\n\t\tliteral = { pattern, flags };\n\t\tastCache.set(key, literal);\n\t}\n\treturn literal;\n}\n\n/**\n * @param {string} string\n * @returns {string}\n */\nexport function getLeadingSpaces (string) {\n\treturn /^\\s*/.exec(string)?.[0] ?? '';\n}\n\n/**\n *\n * @param {string} string\n * @returns {string}\n */\nexport function getTrailingSpaces (string) {\n\treturn /\\s*$/.exec(string)?.[0] ?? '';\n}\n\n/**\n *\n * @param {string} html\n * @returns {string}\n */\nexport function formatHtml (html) {\n\treturn synchronizedPrettier.format(html, {\n\t\t...synchronizedPrettier.resolveConfig('./prettierrc'),\n\t\tparser: 'html',\n\t\thtmlWhitespaceSensitivity: 'ignore',\n\t});\n}\n\n/**\n *\n * @param {*} value\n * @returns {boolean}\n */\nexport function isRegExp (value) {\n\treturn Object.prototype.toString.call(value) === '[object RegExp]';\n}\n\n/** @typedef {import('regexpp/ast').Flags} Flags */\n\n/** @typedef {import('regexpp/ast').Pattern} Pattern */\n\n/**\n * @typedef {object} LiteralAST\n * @property {Pattern} pattern\n * @property {Flags} flags\n */\n\n/**\n * @typedef {object} PathItem\n * @property {string | null} key\n * @property {any} value\n */\n"
  },
  {
    "path": "tests/identifier-test.js",
    "content": "import { assert } from 'chai';\nimport { toArray } from '../src/util/iterables.js';\nimport { createInstance, getComponent, getLanguageIds } from './helper/prism-loader.js';\nimport { prettyprint } from './helper/token-stream-transformer.js';\n\n// This is where you can exclude a language from the identifier test.\n//\n// To exclude a language to the `testOptions` variable and add your language and the identifier types it should\n// excluded from. All languages opt-in for all identifier types by default, so you have to explicitly disable each type\n// you want to disable by setting it to `false`.\n// Also add a small comment explaining why the language was excluded.\n//\n// The actual identifiers for all identifier types are defined in the `identifiers` variable.\n\nconst testOptions = {\n\t// all of these have a special syntax for tokens of the form __something__\n\t'asciidoc': {\n\t\ttemplate: false,\n\t},\n\t'markdown': {\n\t\ttemplate: false,\n\t},\n\t'textile': {\n\t\ttemplate: false,\n\t},\n\n\t'false': {\n\t\tword: false,\n\t\ttemplate: false,\n\t},\n\t// Hoon uses _ in its keywords\n\t'hoon': {\n\t\tword: false,\n\t\ttemplate: false,\n\t},\n\n\t// LilyPond doesn't tokenize based on words\n\t'lilypond': {\n\t\tword: false,\n\t\tnumber: false,\n\t\ttemplate: false,\n\t},\n\n\t// Nevod uses underscore symbol as operator and allows hyphen to be part of identifier\n\t'nevod': {\n\t\tword: false,\n\t\ttemplate: false,\n\t},\n\n\t// METAFONT has a special scheme for variable names with tags, suffixes and subscripts\n\t'metafont': {\n\t\tword: false,\n\t\ttemplate: false,\n\t},\n};\n\nconst identifiers = {\n\tword: ['abc', 'word', 'foo1', 'foo123', 'foo123bar', 'foo_123', 'foo_123_bar'],\n\tnumber: ['0', '1', '9', '123', '123456789'],\n\ttemplate: [\n\t\t'__PHP0__',\n\t\t'__LANG0__',\n\t\t'__LANG123__',\n\t\t'___PLACEHOLDER_0___',\n\t\t'___PLACEHOLDER_123___',\n\t],\n};\n\n// Below is the implementation of the test.\n// If you only came here to exclude a language, you won't find anything below.\n\nfor (const lang of getLanguageIds()) {\n\tdescribe(`Test '${lang}'`, () => {\n\t\tconst getPrism = createInstance(lang);\n\t\ttestLiterals(getPrism, lang);\n\t});\n\n\tdescribe(`Patterns of '${lang}' with optional dependencies`, () => {\n\t\tconst getPrism = async () => {\n\t\t\tconst component = await getComponent(lang);\n\t\t\tconst optional = toArray(\n\t\t\t\t/** @type {string | string[] | null | undefined} */ (component.optional)\n\t\t\t);\n\t\t\tconst Prism = await createInstance([lang, ...optional]);\n\t\t\treturn Prism;\n\t\t};\n\t\ttestLiterals(getPrism(), lang);\n\t});\n}\n\n/**\n * @param {string} lang\n * @returns {IdentifierTestOptions}\n */\nfunction getOptions (lang) {\n\treturn testOptions[lang] || {};\n}\n\n/**\n * @param {string | Token | TokenStream} token\n * @returns {boolean}\n */\nfunction isNotBroken (token) {\n\tif (typeof token === 'string') {\n\t\treturn true;\n\t}\n\telse if (Array.isArray(token)) {\n\t\treturn token.length === 1 && isNotBroken(token[0]);\n\t}\n\telse {\n\t\treturn isNotBroken(token.content);\n\t}\n}\n\n/**\n * Tests all patterns in the given Prism instance.\n *\n * @param {Promise<Prism>} getPrism\n * @param {string} lang\n */\nfunction testLiterals (getPrism, lang) {\n\t/**\n\t * @param {string[]} identifierElements\n\t * @param {string} identifierType\n\t */\n\tasync function matchNotBroken (identifierElements, identifierType) {\n\t\tconst Prism = await getPrism;\n\t\tfor (const id of Object.keys(Prism.languages)) {\n\t\t\tconst grammar = Prism.languageRegistry.getLanguage(id)?.resolvedGrammar;\n\t\t\tif (!grammar) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst options = getOptions(id);\n\t\t\tif (options[identifierType] === false) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const ident of identifierElements) {\n\t\t\t\tconst tokens = Prism.tokenize(ident, grammar);\n\n\t\t\t\tif (!isNotBroken(tokens)) {\n\t\t\t\t\tassert.fail(\n\t\t\t\t\t\t`${id}: Failed to tokenize the ${identifierType} '${ident}' as one or no token.\\n` +\n\t\t\t\t\t\t\t'Actual token stream:\\n\\n' +\n\t\t\t\t\t\t\tprettyprint(tokens) +\n\t\t\t\t\t\t\t'\\n\\n' +\n\t\t\t\t\t\t\t'How to fix this:\\n' +\n\t\t\t\t\t\t\t'If your language failed any of the identifier tests then some patterns in your language can break identifiers. ' +\n\t\t\t\t\t\t\t\"An identifier is broken if it is split into two different token (e.g. the identifier 'foo123' (this could be a variable name) but '123' is tokenized as a number). \" +\n\t\t\t\t\t\t\t'This is usually a bug and means that some patterns need more boundary checking.\\n' +\n\t\t\t\t\t\t\t'This test defines an identifier as /[A-Za-z_][A-Za-z_0-9]*/ so you can use \\\\b boundary assertions.\\n\\n' +\n\t\t\t\t\t\t\t'If the syntactic concept of an identifier is not applicable to your language, you can exclude your language from this test (or parts of it). ' +\n\t\t\t\t\t\t\t\"Open '\" +\n\t\t\t\t\t\t\t__filename +\n\t\t\t\t\t\t\t\"' and follow the instructions to exclude a language. \" +\n\t\t\t\t\t\t\t'(This is usually not what you should do. Only very few language do not have the concept of identifiers.)'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst options = getOptions(lang);\n\tfor (const key in identifiers) {\n\t\tconst identifierType = key;\n\t\tconst element = identifiers[identifierType];\n\t\tif (options[identifierType] !== false) {\n\t\t\tit(`- should not break ${identifierType} identifiers`, async () => {\n\t\t\t\tawait matchNotBroken(element, identifierType);\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * @typedef {import('../src/core.js').Prism} Prism\n * @typedef {import('../src/core.js').Token} Token\n * @typedef {import('../src/types.d.ts').TokenStream} TokenStream\n */\n\n/**\n * @typedef {object} IdentifierTestOptions\n * @property {boolean} [word=true]\n * @property {boolean} [number=true]\n * @property {boolean} [template=true]\n */\n"
  },
  {
    "path": "tests/languages/abap/comment_feature.test",
    "content": "*\r\n* Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"*\"],\r\n\t[\"comment\", \"* Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/abap/eol-comment_feature.test",
    "content": "\"\r\n\" foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"eol-comment\", \"\\\"\"],\r\n\t[\"eol-comment\", \"\\\" foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for EOL comments."
  },
  {
    "path": "tests/languages/abap/keyword_feature.test",
    "content": "SCIENTIFIC_WITH_LEADING_ZERO\r\nSCALE_PRESERVING_SCIENTIFIC\r\nRMC_COMMUNICATION_FAILURE\r\nEND-ENHANCEMENT-SECTION\r\nMULTIPLY-CORRESPONDING\r\nSUBTRACT-CORRESPONDING\r\nVERIFICATION-MESSAGE\r\nDIVIDE-CORRESPONDING\r\nENHANCEMENT-SECTION\r\nCURRENCY_CONVERSION\r\nRMC_SYSTEM_FAILURE\r\nSTART-OF-SELECTION\r\nMOVE-CORRESPONDING\r\nRMC_INVALID_STATUS\r\nCUSTOMER-FUNCTION\r\nEND-OF-DEFINITION\r\nENHANCEMENT-POINT\r\nSYSTEM-EXCEPTIONS\r\nADD-CORRESPONDING\r\nSCALE_PRESERVING\r\nSELECTION-SCREEN\r\nCURSOR-SELECTION\r\nEND-OF-SELECTION\r\nLOAD-OF-PROGRAM\r\nSCROLL-BOUNDARY\r\nSELECTION-TABLE\r\nEXCEPTION-TABLE\r\nIMPLEMENTATIONS\r\nPARAMETER-TABLE\r\nRIGHT-JUSTIFIED\r\nUNIT_CONVERSION\r\nAUTHORITY-CHECK\r\nLIST-PROCESSING\r\nSIGN_AS_POSTFIX\r\nCOL_BACKGROUND\r\nIMPLEMENTATION\r\nINTERFACE-POOL\r\nTRANSFORMATION\r\nIDENTIFICATION\r\nENDENHANCEMENT\r\nLINE-SELECTION\r\nINITIALIZATION\r\nLEFT-JUSTIFIED\r\nSELECT-OPTIONS\r\nSELECTION-SETS\r\nCOMMUNICATION\r\nCORRESPONDING\r\nDECIMAL_SHIFT\r\nPRINT-CONTROL\r\nVALUE-REQUEST\r\nCHAIN-REQUEST\r\nFUNCTION-POOL\r\nFIELD-SYMBOLS\r\nFUNCTIONALITY\r\nINVERTED-DATE\r\nSELECTION-SET\r\nCLASS-METHODS\r\nOUTPUT-LENGTH\r\nCLASS-CODING\r\nCOL_NEGATIVE\r\nERRORMESSAGE\r\nFIELD-GROUPS\r\nHELP-REQUEST\r\nNO-EXTENSION\r\nNO-TOPOFPAGE\r\nREDEFINITION\r\nDISPLAY-MODE\r\nENDINTERFACE\r\nEXIT-COMMAND\r\nFIELD-SYMBOL\r\nNO-SCROLLING\r\nSHORTDUMP-ID\r\nACCESSPOLICY\r\nCLASS-EVENTS\r\nCOL_POSITIVE\r\nDECLARATIONS\r\nENHANCEMENTS\r\nFILTER-TABLE\r\nSWITCHSTATES\r\nSYNTAX-CHECK\r\nTRANSPORTING\r\nASYNCHRONOUS\r\nSYNTAX-TRACE\r\nTOKENIZATION\r\nUSER-COMMAND\r\nWITH-HEADING\r\nABAP-SOURCE\r\nBREAK-POINT\r\nCHAIN-INPUT\r\nCOMPRESSION\r\nFIXED-POINT\r\nNEW-SECTION\r\nNON-UNICODE\r\nOCCURRENCES\r\nRESPONSIBLE\r\nSYSTEM-CALL\r\nTRACE-TABLE\r\nABBREVIATED\r\nCHAR-TO-HEX\r\nEND-OF-FILE\r\nENDFUNCTION\r\nENVIRONMENT\r\nASSOCIATION\r\nCOL_HEADING\r\nEDITOR-CALL\r\nEND-OF-PAGE\r\nENGINEERING\r\nIMPLEMENTED\r\nINTENSIFIED\r\nRADIOBUTTON\r\nSYSTEM-EXIT\r\nTOP-OF-PAGE\r\nTRANSACTION\r\nAPPLICATION\r\nCONCATENATE\r\nDESTINATION\r\nENHANCEMENT\r\nIMMEDIATELY\r\nNO-GROUPING\r\nPRECOMPILED\r\nREPLACEMENT\r\nTITLE-LINES\r\nACTIVATION\r\nBYTE-ORDER\r\nCLASS-POOL\r\nCONNECTION\r\nCONVERSION\r\nDEFINITION\r\nDEPARTMENT\r\nEXPIRATION\r\nINHERITING\r\nMESSAGE-ID\r\nNO-HEADING\r\nPERFORMING\r\nQUEUE-ONLY\r\nRIGHTSPACE\r\nSCIENTIFIC\r\nSTATUSINFO\r\nSTRUCTURES\r\nSYNCPOINTS\r\nWITH-TITLE\r\nATTRIBUTES\r\nBOUNDARIES\r\nCLASS-DATA\r\nCOL_NORMAL\r\nDD/MM/YYYY\r\nDESCENDING\r\nINTERFACES\r\nLINE-COUNT\r\nMM/DD/YYYY\r\nNON-UNIQUE\r\nPRESERVING\r\nSELECTIONS\r\nSTATEMENTS\r\nSUBROUTINE\r\nTRUNCATION\r\nTYPE-POOLS\r\nARITHMETIC\r\nBACKGROUND\r\nENDPROVIDE\r\nEXCEPTIONS\r\nIDENTIFIER\r\nINDEX-LINE\r\nOBLIGATORY\r\nPARAMETERS\r\nPERCENTAGE\r\nPUSHBUTTON\r\nRESOLUTION\r\nCOMPONENTS\r\nDEALLOCATE\r\nDISCONNECT\r\nDUPLICATES\r\nFIRST-LINE\r\nHEAD-LINES\r\nNO-DISPLAY\r\nOCCURRENCE\r\nRESPECTING\r\nRETURNCODE\r\nSUBMATCHES\r\nTRACE-FILE\r\nASCENDING\r\nBYPASSING\r\nENDMODULE\r\nEXCEPTION\r\nEXCLUDING\r\nEXPORTING\r\nINCREMENT\r\nMATCHCODE\r\nPARAMETER\r\nPARTIALLY\r\nPREFERRED\r\nREFERENCE\r\nREPLACING\r\nRETURNING\r\nSELECTION\r\nSEPARATED\r\nSPECIFIED\r\nSTATEMENT\r\nTIMESTAMP\r\nTYPE-POOL\r\nACCEPTING\r\nAPPENDAGE\r\nASSIGNING\r\nCOL_GROUP\r\nCOMPARING\r\nCONSTANTS\r\nDANGEROUS\r\nIMPORTING\r\nINSTANCES\r\nLEFTSPACE\r\nLOG-POINT\r\nQUICKINFO\r\nREAD-ONLY\r\nSCROLLING\r\nSQLSCRIPT\r\nSTEP-LOOP\r\nTOP-LINES\r\nTRANSLATE\r\nAPPENDING\r\nAUTHORITY\r\nCHARACTER\r\nCOMPONENT\r\nCONDITION\r\nDIRECTORY\r\nDUPLICATE\r\nMESSAGING\r\nRECEIVING\r\nSUBSCREEN\r\nACCORDING\r\nCOL_TOTAL\r\nEND-LINES\r\nENDMETHOD\r\nENDSELECT\r\nEXPANDING\r\nEXTENSION\r\nINCLUDING\r\nINFOTYPES\r\nINTERFACE\r\nINTERVALS\r\nLINE-SIZE\r\nPF-STATUS\r\nPROCEDURE\r\nPROTECTED\r\nREQUESTED\r\nRESUMABLE\r\nRIGHTPLUS\r\nSAP-SPOOL\r\nSECONDARY\r\nSTRUCTURE\r\nSUBSTRING\r\nTABLEVIEW\r\nNUMOFCHAR\r\nADJACENT\r\nANALYSIS\r\nASSIGNED\r\nBACKWARD\r\nCHANNELS\r\nCHECKBOX\r\nCONTINUE\r\nCRITICAL\r\nDATAINFO\r\nDD/MM/YY\r\nDURATION\r\nENCODING\r\nENDCLASS\r\nFUNCTION\r\nLEFTPLUS\r\nLINEFEED\r\nMM/DD/YY\r\nOVERFLOW\r\nRECEIVED\r\nSKIPPING\r\nSORTABLE\r\nSTANDARD\r\nSUBTRACT\r\nSUPPRESS\r\nTABSTRIP\r\nTITLEBAR\r\nTRUNCATE\r\nUNASSIGN\r\nWHENEVER\r\nANALYZER\r\nCOALESCE\r\nCOMMENTS\r\nCONDENSE\r\nDECIMALS\r\nDEFERRED\r\nENDWHILE\r\nEXPLICIT\r\nKEYWORDS\r\nMESSAGES\r\nPOSITION\r\nPRIORITY\r\nRECEIVER\r\nRENAMING\r\nTIMEZONE\r\nTRAILING\r\nALLOCATE\r\nCENTERED\r\nCIRCULAR\r\nCONTROLS\r\nCURRENCY\r\nDELETING\r\nDESCRIBE\r\nDISTANCE\r\nENDCATCH\r\nEXPONENT\r\nEXTENDED\r\nGENERATE\r\nIGNORING\r\nINCLUDES\r\nINTERNAL\r\nMAJOR-ID\r\nMODIFIER\r\nNEW-LINE\r\nOPTIONAL\r\nPROPERTY\r\nROLLBACK\r\nSTARTING\r\nSUPPLIED\r\nABSTRACT\r\nCHANGING\r\nCONTEXTS\r\nCREATING\r\nCUSTOMER\r\nDATABASE\r\nDAYLIGHT\r\nDEFINING\r\nDISTINCT\r\nDIVISION\r\nENABLING\r\nENDCHAIN\r\nESCAPING\r\nHARMLESS\r\nIMPLICIT\r\nINACTIVE\r\nLANGUAGE\r\nMINOR-ID\r\nMULTIPLY\r\nNEW-PAGE\r\nNO-TITLE\r\nPOS_HIGH\r\nSEPARATE\r\nTEXTPOOL\r\nTRANSFER\r\nSELECTOR\r\nDBMAXLEN\r\nITERATOR\r\nSELECTOR\r\nARCHIVE\r\nBIT-XOR\r\nBYTE-CO\r\nCOLLECT\r\nCOMMENT\r\nCURRENT\r\nDEFAULT\r\nDISPLAY\r\nENDFORM\r\nEXTRACT\r\nLEADING\r\nLISTBOX\r\nLOCATOR\r\nMEMBERS\r\nMETHODS\r\nNESTING\r\nPOS_LOW\r\nPROCESS\r\nPROVIDE\r\nRAISING\r\nRESERVE\r\nSECONDS\r\nSUMMARY\r\nVISIBLE\r\nBETWEEN\r\nBIT-AND\r\nBYTE-CS\r\nCLEANUP\r\nCOMPUTE\r\nCONTROL\r\nCONVERT\r\nDATASET\r\nENDCASE\r\nFORWARD\r\nHEADERS\r\nHOTSPOT\r\nINCLUDE\r\nINVERSE\r\nKEEPING\r\nNO-ZERO\r\nOBJECTS\r\nOVERLAY\r\nPADDING\r\nPATTERN\r\nPROGRAM\r\nREFRESH\r\nSECTION\r\nSUMMING\r\nTESTING\r\nVERSION\r\nWINDOWS\r\nWITHOUT\r\nBIT-NOT\r\nBYTE-CA\r\nBYTE-NA\r\nCASTING\r\nCONTEXT\r\nCOUNTRY\r\nDYNAMIC\r\nENABLED\r\nENDLOOP\r\nEXECUTE\r\nFRIENDS\r\nHANDLER\r\nHEADING\r\nINITIAL\r\n *-INPUT\r\nLOGFILE\r\nMAXIMUM\r\nMINIMUM\r\nNO-GAPS\r\nNO-SIGN\r\nPRAGMAS\r\nPRIMARY\r\nPRIVATE\r\nREDUCED\r\nREPLACE\r\nREQUEST\r\nRESULTS\r\nUNICODE\r\nWARNING\r\nALIASES\r\nBYTE-CN\r\nBYTE-NS\r\nCALLING\r\nCOL_KEY\r\nCOLUMNS\r\nCONNECT\r\nENDEXEC\r\nENTRIES\r\nEXCLUDE\r\nFILTERS\r\nFURTHER\r\nHELP-ID\r\nLOGICAL\r\nMAPPING\r\nMESSAGE\r\nNAMETAB\r\nOPTIONS\r\nPACKAGE\r\nPERFORM\r\nRECEIVE\r\nSTATICS\r\nVARYING\r\nBINDING\r\nCHARLEN\r\nGREATER\r\nXSTRLEN\r\nACCEPT\r\nAPPEND\r\nDETAIL\r\nELSEIF\r\nENDING\r\nENDTRY\r\nFORMAT\r\nFRAMES\r\nGIVING\r\nHASHED\r\nHEADER\r\nIMPORT\r\nINSERT\r\nMARGIN\r\nMODULE\r\nNATIVE\r\nOBJECT\r\nOFFSET\r\nREMOTE\r\nRESUME\r\nSAVING\r\nSIMPLE\r\nSUBMIT\r\nTABBED\r\nTOKENS\r\nUNIQUE\r\nUNPACK\r\nUPDATE\r\nWINDOW\r\nYELLOW\r\nACTUAL\r\nASPECT\r\nCENTER\r\nCURSOR\r\nDELETE\r\nDIALOG\r\nDIVIDE\r\nDURING\r\nERRORS\r\nEVENTS\r\nEXTEND\r\nFILTER\r\nHANDLE\r\nHAVING\r\nIGNORE\r\nLITTLE\r\nMEMORY\r\nNO-GAP\r\nOCCURS\r\nOPTION\r\nPERSON\r\nPLACES\r\nPUBLIC\r\nREDUCE\r\nREPORT\r\nRESULT\r\nSINGLE\r\nSORTED\r\nSWITCH\r\nSYNTAX\r\nTARGET\r\nVALUES\r\nWRITER\r\nASSERT\r\nBLOCKS\r\nBOUNDS\r\nBUFFER\r\nCHANGE\r\nCOLUMN\r\nCOMMIT\r\nCONCAT\r\nCOPIES\r\nCREATE\r\nDDMMYY\r\nDEFINE\r\nENDIAN\r\nESCAPE\r\nEXPAND\r\nKERNEL\r\nLAYOUT\r\nLEGACY\r\nLEVELS\r\nMMDDYY\r\nNUMBER\r\nOUTPUT\r\nRANGES\r\nREADER\r\nRETURN\r\nSCREEN\r\nSEARCH\r\nSELECT\r\nSHARED\r\nSOURCE\r\nSTABLE\r\nSTATIC\r\nSUBKEY\r\nSUFFIX\r\nTABLES\r\nUNWIND\r\nYYMMDD\r\nASSIGN\r\nBACKUP\r\nBEFORE\r\nBINARY\r\nBIT-OR\r\nBLANKS\r\nCLIENT\r\nCODING\r\nCOMMON\r\nDEMAND\r\nDYNPRO\r\nEXCEPT\r\nEXISTS\r\nEXPORT\r\nFIELDS\r\nGLOBAL\r\nGROUPS\r\nLENGTH\r\nLOCALE\r\nMEDIUM\r\nMETHOD\r\nMODIFY\r\nNESTED\r\nOTHERS\r\nREJECT\r\nSCROLL\r\nSUPPLY\r\nSYMBOL\r\nENDFOR\r\nSTRLEN\r\nALIGN\r\nBEGIN\r\nBOUND\r\nENDAT\r\nENTRY\r\nEVENT\r\nFINAL\r\nFLUSH\r\nGRANT\r\nINNER\r\nSHORT\r\nUSING\r\nWRITE\r\nAFTER\r\nBLACK\r\nBLOCK\r\nCLOCK\r\nCOLOR\r\nCOUNT\r\nDUMMY\r\nEMPTY\r\nENDDO\r\nENDON\r\nGREEN\r\nINDEX\r\nINOUT\r\nLEAVE\r\nLEVEL\r\nLINES\r\nMODIF\r\nORDER\r\nOUTER\r\nRANGE\r\nRESET\r\nRETRY\r\nRIGHT\r\nSMART\r\nSPLIT\r\nSTYLE\r\nTABLE\r\nTHROW\r\nUNDER\r\nUNTIL\r\nUPPER\r\nUTF-8\r\nWHERE\r\nALIAS\r\nBLANK\r\nCLEAR\r\nCLOSE\r\nEXACT\r\nFETCH\r\nFIRST\r\nFOUND\r\nGROUP\r\nLLANG\r\nLOCAL\r\nOTHER\r\nREGEX\r\nSPOOL\r\nTITLE\r\nTYPES\r\nVALID\r\nWHILE\r\nALPHA\r\nBOXED\r\nCATCH\r\nCHAIN\r\nCHECK\r\nCLASS\r\nCOVER\r\nENDIF\r\nEQUIV\r\nFIELD\r\nFLOOR\r\nFRAME\r\nINPUT\r\nLOWER\r\nMATCH\r\nNODES\r\nPAGES\r\nPRINT\r\nRAISE\r\nROUND\r\nSHIFT\r\nSPACE\r\nSPOTS\r\nSTAMP\r\nSTATE\r\nTASKS\r\nTIMES\r\nTRMAC\r\nULINE\r\nUNION\r\nVALUE\r\nWIDTH\r\nEQUAL\r\nLOG10\r\nTRUNC\r\nBLOB\r\nCASE\r\nCEIL\r\nCLOB\r\nCOND\r\nEXIT\r\nFILE\r\nGAPS\r\nHOLD\r\nINCL\r\nINTO\r\nKEEP\r\nKEYS\r\nLAST\r\nLINE\r\nLONG\r\nLPAD\r\nMAIL\r\nMODE\r\nOPEN\r\nPINK\r\nREAD\r\nROWS\r\nTEST\r\nTHEN\r\nZERO\r\nAREA\r\nBACK\r\nBADI\r\nBYTE\r\nCAST\r\nEDIT\r\nEXEC\r\nFAIL\r\nFIND\r\nFKEQ\r\nFONT\r\nFREE\r\nGKEQ\r\nHIDE\r\nINIT\r\nITNO\r\nLATE\r\nLOOP\r\nMAIN\r\nMARK\r\nMOVE\r\nNEXT\r\nNULL\r\nRISK\r\nROLE\r\nUNIT\r\nWAIT\r\nZONE\r\nBASE\r\nCALL\r\nCODE\r\nDATA\r\nDATE\r\nFKGE\r\nGKGE\r\nHIGH\r\nKIND\r\nLEFT\r\nLIST\r\nMASK\r\nMESH\r\nNAME\r\nNODE\r\nPACK\r\nPAGE\r\nPOOL\r\nSEND\r\nSIGN\r\nSIZE\r\nSOME\r\nSTOP\r\nTASK\r\nTEXT\r\nTIME\r\nUSER\r\nVARY\r\nWITH\r\nWORD\r\nBLUE\r\nCONV\r\nCOPY\r\nDEEP\r\nELSE\r\nFORM\r\nFROM\r\nHINT\r\nICON\r\nJOIN\r\nLIKE\r\nLOAD\r\nONLY\r\nPART\r\nSCAN\r\nSKIP\r\nSORT\r\nTYPE\r\nUNIX\r\nVIEW\r\nWHEN\r\nWORK\r\nACOS\r\nASIN\r\nATAN\r\nCOSH\r\nEACH\r\nFRAC\r\nLESS\r\nRTTI\r\nSINH\r\nSQRT\r\nTANH\r\nAVG\r\nBIT\r\nDIV\r\nISO\r\nLET\r\nOUT\r\nPAD\r\nSQL\r\nALL\r\nCI_\r\nCPI\r\nEND\r\nLOB\r\nLPI\r\nMAX\r\nMIN\r\nNEW\r\nOLE\r\nRUN\r\nSET\r\n?TO\r\nYES\r\nABS\r\nADD\r\nAND\r\nBIG\r\nFOR\r\nHDB\r\nJOB\r\nLOW\r\nNOT\r\nSAP\r\nTRY\r\nVIA\r\nXML\r\nANY\r\nGET\r\nIDS\r\nKEY\r\nMOD\r\nOFF\r\nPUT\r\nRAW\r\nRED\r\nREF\r\nSUM\r\nTAB\r\nXSD\r\nCNT\r\nCOS\r\nEXP\r\nLOG\r\nSIN\r\nTAN\r\nXOR\r\nAT\r\nCO\r\nCP\r\nDO\r\nGT\r\nID\r\nIF\r\nNS\r\nOR\r\nBT\r\nCA\r\nCS\r\nGE\r\nNA\r\nNB\r\nEQ\r\nIN\r\nLT\r\nNE\r\nNO\r\nOF\r\nON\r\nPF\r\nTO\r\nAS\r\nBY\r\nCN\r\nIS\r\nLE\r\nNP\r\nUP\r\nE\r\nI\r\nM\r\nO\r\nZ\r\nC\r\nX\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"SCIENTIFIC_WITH_LEADING_ZERO\"],\r\n\t[\"keyword\", \"SCALE_PRESERVING_SCIENTIFIC\"],\r\n\t[\"keyword\", \"RMC_COMMUNICATION_FAILURE\"],\r\n\t[\"keyword\", \"END-ENHANCEMENT-SECTION\"],\r\n\t[\"keyword\", \"MULTIPLY-CORRESPONDING\"],\r\n\t[\"keyword\", \"SUBTRACT-CORRESPONDING\"],\r\n\t[\"keyword\", \"VERIFICATION-MESSAGE\"],\r\n\t[\"keyword\", \"DIVIDE-CORRESPONDING\"],\r\n\t[\"keyword\", \"ENHANCEMENT-SECTION\"],\r\n\t[\"keyword\", \"CURRENCY_CONVERSION\"],\r\n\t[\"keyword\", \"RMC_SYSTEM_FAILURE\"],\r\n\t[\"keyword\", \"START-OF-SELECTION\"],\r\n\t[\"keyword\", \"MOVE-CORRESPONDING\"],\r\n\t[\"keyword\", \"RMC_INVALID_STATUS\"],\r\n\t[\"keyword\", \"CUSTOMER-FUNCTION\"],\r\n\t[\"keyword\", \"END-OF-DEFINITION\"],\r\n\t[\"keyword\", \"ENHANCEMENT-POINT\"],\r\n\t[\"keyword\", \"SYSTEM-EXCEPTIONS\"],\r\n\t[\"keyword\", \"ADD-CORRESPONDING\"],\r\n\t[\"keyword\", \"SCALE_PRESERVING\"],\r\n\t[\"keyword\", \"SELECTION-SCREEN\"],\r\n\t[\"keyword\", \"CURSOR-SELECTION\"],\r\n\t[\"keyword\", \"END-OF-SELECTION\"],\r\n\t[\"keyword\", \"LOAD-OF-PROGRAM\"],\r\n\t[\"keyword\", \"SCROLL-BOUNDARY\"],\r\n\t[\"keyword\", \"SELECTION-TABLE\"],\r\n\t[\"keyword\", \"EXCEPTION-TABLE\"],\r\n\t[\"keyword\", \"IMPLEMENTATIONS\"],\r\n\t[\"keyword\", \"PARAMETER-TABLE\"],\r\n\t[\"keyword\", \"RIGHT-JUSTIFIED\"],\r\n\t[\"keyword\", \"UNIT_CONVERSION\"],\r\n\t[\"keyword\", \"AUTHORITY-CHECK\"],\r\n\t[\"keyword\", \"LIST-PROCESSING\"],\r\n\t[\"keyword\", \"SIGN_AS_POSTFIX\"],\r\n\t[\"keyword\", \"COL_BACKGROUND\"],\r\n\t[\"keyword\", \"IMPLEMENTATION\"],\r\n\t[\"keyword\", \"INTERFACE-POOL\"],\r\n\t[\"keyword\", \"TRANSFORMATION\"],\r\n\t[\"keyword\", \"IDENTIFICATION\"],\r\n\t[\"keyword\", \"ENDENHANCEMENT\"],\r\n\t[\"keyword\", \"LINE-SELECTION\"],\r\n\t[\"keyword\", \"INITIALIZATION\"],\r\n\t[\"keyword\", \"LEFT-JUSTIFIED\"],\r\n\t[\"keyword\", \"SELECT-OPTIONS\"],\r\n\t[\"keyword\", \"SELECTION-SETS\"],\r\n\t[\"keyword\", \"COMMUNICATION\"],\r\n\t[\"keyword\", \"CORRESPONDING\"],\r\n\t[\"keyword\", \"DECIMAL_SHIFT\"],\r\n\t[\"keyword\", \"PRINT-CONTROL\"],\r\n\t[\"keyword\", \"VALUE-REQUEST\"],\r\n\t[\"keyword\", \"CHAIN-REQUEST\"],\r\n\t[\"keyword\", \"FUNCTION-POOL\"],\r\n\t[\"keyword\", \"FIELD-SYMBOLS\"],\r\n\t[\"keyword\", \"FUNCTIONALITY\"],\r\n\t[\"keyword\", \"INVERTED-DATE\"],\r\n\t[\"keyword\", \"SELECTION-SET\"],\r\n\t[\"keyword\", \"CLASS-METHODS\"],\r\n\t[\"keyword\", \"OUTPUT-LENGTH\"],\r\n\t[\"keyword\", \"CLASS-CODING\"],\r\n\t[\"keyword\", \"COL_NEGATIVE\"],\r\n\t[\"keyword\", \"ERRORMESSAGE\"],\r\n\t[\"keyword\", \"FIELD-GROUPS\"],\r\n\t[\"keyword\", \"HELP-REQUEST\"],\r\n\t[\"keyword\", \"NO-EXTENSION\"],\r\n\t[\"keyword\", \"NO-TOPOFPAGE\"],\r\n\t[\"keyword\", \"REDEFINITION\"],\r\n\t[\"keyword\", \"DISPLAY-MODE\"],\r\n\t[\"keyword\", \"ENDINTERFACE\"],\r\n\t[\"keyword\", \"EXIT-COMMAND\"],\r\n\t[\"keyword\", \"FIELD-SYMBOL\"],\r\n\t[\"keyword\", \"NO-SCROLLING\"],\r\n\t[\"keyword\", \"SHORTDUMP-ID\"],\r\n\t[\"keyword\", \"ACCESSPOLICY\"],\r\n\t[\"keyword\", \"CLASS-EVENTS\"],\r\n\t[\"keyword\", \"COL_POSITIVE\"],\r\n\t[\"keyword\", \"DECLARATIONS\"],\r\n\t[\"keyword\", \"ENHANCEMENTS\"],\r\n\t[\"keyword\", \"FILTER-TABLE\"],\r\n\t[\"keyword\", \"SWITCHSTATES\"],\r\n\t[\"keyword\", \"SYNTAX-CHECK\"],\r\n\t[\"keyword\", \"TRANSPORTING\"],\r\n\t[\"keyword\", \"ASYNCHRONOUS\"],\r\n\t[\"keyword\", \"SYNTAX-TRACE\"],\r\n\t[\"keyword\", \"TOKENIZATION\"],\r\n\t[\"keyword\", \"USER-COMMAND\"],\r\n\t[\"keyword\", \"WITH-HEADING\"],\r\n\t[\"keyword\", \"ABAP-SOURCE\"],\r\n\t[\"keyword\", \"BREAK-POINT\"],\r\n\t[\"keyword\", \"CHAIN-INPUT\"],\r\n\t[\"keyword\", \"COMPRESSION\"],\r\n\t[\"keyword\", \"FIXED-POINT\"],\r\n\t[\"keyword\", \"NEW-SECTION\"],\r\n\t[\"keyword\", \"NON-UNICODE\"],\r\n\t[\"keyword\", \"OCCURRENCES\"],\r\n\t[\"keyword\", \"RESPONSIBLE\"],\r\n\t[\"keyword\", \"SYSTEM-CALL\"],\r\n\t[\"keyword\", \"TRACE-TABLE\"],\r\n\t[\"keyword\", \"ABBREVIATED\"],\r\n\t[\"keyword\", \"CHAR-TO-HEX\"],\r\n\t[\"keyword\", \"END-OF-FILE\"],\r\n\t[\"keyword\", \"ENDFUNCTION\"],\r\n\t[\"keyword\", \"ENVIRONMENT\"],\r\n\t[\"keyword\", \"ASSOCIATION\"],\r\n\t[\"keyword\", \"COL_HEADING\"],\r\n\t[\"keyword\", \"EDITOR-CALL\"],\r\n\t[\"keyword\", \"END-OF-PAGE\"],\r\n\t[\"keyword\", \"ENGINEERING\"],\r\n\t[\"keyword\", \"IMPLEMENTED\"],\r\n\t[\"keyword\", \"INTENSIFIED\"],\r\n\t[\"keyword\", \"RADIOBUTTON\"],\r\n\t[\"keyword\", \"SYSTEM-EXIT\"],\r\n\t[\"keyword\", \"TOP-OF-PAGE\"],\r\n\t[\"keyword\", \"TRANSACTION\"],\r\n\t[\"keyword\", \"APPLICATION\"],\r\n\t[\"keyword\", \"CONCATENATE\"],\r\n\t[\"keyword\", \"DESTINATION\"],\r\n\t[\"keyword\", \"ENHANCEMENT\"],\r\n\t[\"keyword\", \"IMMEDIATELY\"],\r\n\t[\"keyword\", \"NO-GROUPING\"],\r\n\t[\"keyword\", \"PRECOMPILED\"],\r\n\t[\"keyword\", \"REPLACEMENT\"],\r\n\t[\"keyword\", \"TITLE-LINES\"],\r\n\t[\"keyword\", \"ACTIVATION\"],\r\n\t[\"keyword\", \"BYTE-ORDER\"],\r\n\t[\"keyword\", \"CLASS-POOL\"],\r\n\t[\"keyword\", \"CONNECTION\"],\r\n\t[\"keyword\", \"CONVERSION\"],\r\n\t[\"keyword\", \"DEFINITION\"],\r\n\t[\"keyword\", \"DEPARTMENT\"],\r\n\t[\"keyword\", \"EXPIRATION\"],\r\n\t[\"keyword\", \"INHERITING\"],\r\n\t[\"keyword\", \"MESSAGE-ID\"],\r\n\t[\"keyword\", \"NO-HEADING\"],\r\n\t[\"keyword\", \"PERFORMING\"],\r\n\t[\"keyword\", \"QUEUE-ONLY\"],\r\n\t[\"keyword\", \"RIGHTSPACE\"],\r\n\t[\"keyword\", \"SCIENTIFIC\"],\r\n\t[\"keyword\", \"STATUSINFO\"],\r\n\t[\"keyword\", \"STRUCTURES\"],\r\n\t[\"keyword\", \"SYNCPOINTS\"],\r\n\t[\"keyword\", \"WITH-TITLE\"],\r\n\t[\"keyword\", \"ATTRIBUTES\"],\r\n\t[\"keyword\", \"BOUNDARIES\"],\r\n\t[\"keyword\", \"CLASS-DATA\"],\r\n\t[\"keyword\", \"COL_NORMAL\"],\r\n\t[\"keyword\", \"DD/MM/YYYY\"],\r\n\t[\"keyword\", \"DESCENDING\"],\r\n\t[\"keyword\", \"INTERFACES\"],\r\n\t[\"keyword\", \"LINE-COUNT\"],\r\n\t[\"keyword\", \"MM/DD/YYYY\"],\r\n\t[\"keyword\", \"NON-UNIQUE\"],\r\n\t[\"keyword\", \"PRESERVING\"],\r\n\t[\"keyword\", \"SELECTIONS\"],\r\n\t[\"keyword\", \"STATEMENTS\"],\r\n\t[\"keyword\", \"SUBROUTINE\"],\r\n\t[\"keyword\", \"TRUNCATION\"],\r\n\t[\"keyword\", \"TYPE-POOLS\"],\r\n\t[\"keyword\", \"ARITHMETIC\"],\r\n\t[\"keyword\", \"BACKGROUND\"],\r\n\t[\"keyword\", \"ENDPROVIDE\"],\r\n\t[\"keyword\", \"EXCEPTIONS\"],\r\n\t[\"keyword\", \"IDENTIFIER\"],\r\n\t[\"keyword\", \"INDEX-LINE\"],\r\n\t[\"keyword\", \"OBLIGATORY\"],\r\n\t[\"keyword\", \"PARAMETERS\"],\r\n\t[\"keyword\", \"PERCENTAGE\"],\r\n\t[\"keyword\", \"PUSHBUTTON\"],\r\n\t[\"keyword\", \"RESOLUTION\"],\r\n\t[\"keyword\", \"COMPONENTS\"],\r\n\t[\"keyword\", \"DEALLOCATE\"],\r\n\t[\"keyword\", \"DISCONNECT\"],\r\n\t[\"keyword\", \"DUPLICATES\"],\r\n\t[\"keyword\", \"FIRST-LINE\"],\r\n\t[\"keyword\", \"HEAD-LINES\"],\r\n\t[\"keyword\", \"NO-DISPLAY\"],\r\n\t[\"keyword\", \"OCCURRENCE\"],\r\n\t[\"keyword\", \"RESPECTING\"],\r\n\t[\"keyword\", \"RETURNCODE\"],\r\n\t[\"keyword\", \"SUBMATCHES\"],\r\n\t[\"keyword\", \"TRACE-FILE\"],\r\n\t[\"keyword\", \"ASCENDING\"],\r\n\t[\"keyword\", \"BYPASSING\"],\r\n\t[\"keyword\", \"ENDMODULE\"],\r\n\t[\"keyword\", \"EXCEPTION\"],\r\n\t[\"keyword\", \"EXCLUDING\"],\r\n\t[\"keyword\", \"EXPORTING\"],\r\n\t[\"keyword\", \"INCREMENT\"],\r\n\t[\"keyword\", \"MATCHCODE\"],\r\n\t[\"keyword\", \"PARAMETER\"],\r\n\t[\"keyword\", \"PARTIALLY\"],\r\n\t[\"keyword\", \"PREFERRED\"],\r\n\t[\"keyword\", \"REFERENCE\"],\r\n\t[\"keyword\", \"REPLACING\"],\r\n\t[\"keyword\", \"RETURNING\"],\r\n\t[\"keyword\", \"SELECTION\"],\r\n\t[\"keyword\", \"SEPARATED\"],\r\n\t[\"keyword\", \"SPECIFIED\"],\r\n\t[\"keyword\", \"STATEMENT\"],\r\n\t[\"keyword\", \"TIMESTAMP\"],\r\n\t[\"keyword\", \"TYPE-POOL\"],\r\n\t[\"keyword\", \"ACCEPTING\"],\r\n\t[\"keyword\", \"APPENDAGE\"],\r\n\t[\"keyword\", \"ASSIGNING\"],\r\n\t[\"keyword\", \"COL_GROUP\"],\r\n\t[\"keyword\", \"COMPARING\"],\r\n\t[\"keyword\", \"CONSTANTS\"],\r\n\t[\"keyword\", \"DANGEROUS\"],\r\n\t[\"keyword\", \"IMPORTING\"],\r\n\t[\"keyword\", \"INSTANCES\"],\r\n\t[\"keyword\", \"LEFTSPACE\"],\r\n\t[\"keyword\", \"LOG-POINT\"],\r\n\t[\"keyword\", \"QUICKINFO\"],\r\n\t[\"keyword\", \"READ-ONLY\"],\r\n\t[\"keyword\", \"SCROLLING\"],\r\n\t[\"keyword\", \"SQLSCRIPT\"],\r\n\t[\"keyword\", \"STEP-LOOP\"],\r\n\t[\"keyword\", \"TOP-LINES\"],\r\n\t[\"keyword\", \"TRANSLATE\"],\r\n\t[\"keyword\", \"APPENDING\"],\r\n\t[\"keyword\", \"AUTHORITY\"],\r\n\t[\"keyword\", \"CHARACTER\"],\r\n\t[\"keyword\", \"COMPONENT\"],\r\n\t[\"keyword\", \"CONDITION\"],\r\n\t[\"keyword\", \"DIRECTORY\"],\r\n\t[\"keyword\", \"DUPLICATE\"],\r\n\t[\"keyword\", \"MESSAGING\"],\r\n\t[\"keyword\", \"RECEIVING\"],\r\n\t[\"keyword\", \"SUBSCREEN\"],\r\n\t[\"keyword\", \"ACCORDING\"],\r\n\t[\"keyword\", \"COL_TOTAL\"],\r\n\t[\"keyword\", \"END-LINES\"],\r\n\t[\"keyword\", \"ENDMETHOD\"],\r\n\t[\"keyword\", \"ENDSELECT\"],\r\n\t[\"keyword\", \"EXPANDING\"],\r\n\t[\"keyword\", \"EXTENSION\"],\r\n\t[\"keyword\", \"INCLUDING\"],\r\n\t[\"keyword\", \"INFOTYPES\"],\r\n\t[\"keyword\", \"INTERFACE\"],\r\n\t[\"keyword\", \"INTERVALS\"],\r\n\t[\"keyword\", \"LINE-SIZE\"],\r\n\t[\"keyword\", \"PF-STATUS\"],\r\n\t[\"keyword\", \"PROCEDURE\"],\r\n\t[\"keyword\", \"PROTECTED\"],\r\n\t[\"keyword\", \"REQUESTED\"],\r\n\t[\"keyword\", \"RESUMABLE\"],\r\n\t[\"keyword\", \"RIGHTPLUS\"],\r\n\t[\"keyword\", \"SAP-SPOOL\"],\r\n\t[\"keyword\", \"SECONDARY\"],\r\n\t[\"keyword\", \"STRUCTURE\"],\r\n\t[\"keyword\", \"SUBSTRING\"],\r\n\t[\"keyword\", \"TABLEVIEW\"],\r\n\t[\"keyword\", \"NUMOFCHAR\"],\r\n\t[\"keyword\", \"ADJACENT\"],\r\n\t[\"keyword\", \"ANALYSIS\"],\r\n\t[\"keyword\", \"ASSIGNED\"],\r\n\t[\"keyword\", \"BACKWARD\"],\r\n\t[\"keyword\", \"CHANNELS\"],\r\n\t[\"keyword\", \"CHECKBOX\"],\r\n\t[\"keyword\", \"CONTINUE\"],\r\n\t[\"keyword\", \"CRITICAL\"],\r\n\t[\"keyword\", \"DATAINFO\"],\r\n\t[\"keyword\", \"DD/MM/YY\"],\r\n\t[\"keyword\", \"DURATION\"],\r\n\t[\"keyword\", \"ENCODING\"],\r\n\t[\"keyword\", \"ENDCLASS\"],\r\n\t[\"keyword\", \"FUNCTION\"],\r\n\t[\"keyword\", \"LEFTPLUS\"],\r\n\t[\"keyword\", \"LINEFEED\"],\r\n\t[\"keyword\", \"MM/DD/YY\"],\r\n\t[\"keyword\", \"OVERFLOW\"],\r\n\t[\"keyword\", \"RECEIVED\"],\r\n\t[\"keyword\", \"SKIPPING\"],\r\n\t[\"keyword\", \"SORTABLE\"],\r\n\t[\"keyword\", \"STANDARD\"],\r\n\t[\"keyword\", \"SUBTRACT\"],\r\n\t[\"keyword\", \"SUPPRESS\"],\r\n\t[\"keyword\", \"TABSTRIP\"],\r\n\t[\"keyword\", \"TITLEBAR\"],\r\n\t[\"keyword\", \"TRUNCATE\"],\r\n\t[\"keyword\", \"UNASSIGN\"],\r\n\t[\"keyword\", \"WHENEVER\"],\r\n\t[\"keyword\", \"ANALYZER\"],\r\n\t[\"keyword\", \"COALESCE\"],\r\n\t[\"keyword\", \"COMMENTS\"],\r\n\t[\"keyword\", \"CONDENSE\"],\r\n\t[\"keyword\", \"DECIMALS\"],\r\n\t[\"keyword\", \"DEFERRED\"],\r\n\t[\"keyword\", \"ENDWHILE\"],\r\n\t[\"keyword\", \"EXPLICIT\"],\r\n\t[\"keyword\", \"KEYWORDS\"],\r\n\t[\"keyword\", \"MESSAGES\"],\r\n\t[\"keyword\", \"POSITION\"],\r\n\t[\"keyword\", \"PRIORITY\"],\r\n\t[\"keyword\", \"RECEIVER\"],\r\n\t[\"keyword\", \"RENAMING\"],\r\n\t[\"keyword\", \"TIMEZONE\"],\r\n\t[\"keyword\", \"TRAILING\"],\r\n\t[\"keyword\", \"ALLOCATE\"],\r\n\t[\"keyword\", \"CENTERED\"],\r\n\t[\"keyword\", \"CIRCULAR\"],\r\n\t[\"keyword\", \"CONTROLS\"],\r\n\t[\"keyword\", \"CURRENCY\"],\r\n\t[\"keyword\", \"DELETING\"],\r\n\t[\"keyword\", \"DESCRIBE\"],\r\n\t[\"keyword\", \"DISTANCE\"],\r\n\t[\"keyword\", \"ENDCATCH\"],\r\n\t[\"keyword\", \"EXPONENT\"],\r\n\t[\"keyword\", \"EXTENDED\"],\r\n\t[\"keyword\", \"GENERATE\"],\r\n\t[\"keyword\", \"IGNORING\"],\r\n\t[\"keyword\", \"INCLUDES\"],\r\n\t[\"keyword\", \"INTERNAL\"],\r\n\t[\"keyword\", \"MAJOR-ID\"],\r\n\t[\"keyword\", \"MODIFIER\"],\r\n\t[\"keyword\", \"NEW-LINE\"],\r\n\t[\"keyword\", \"OPTIONAL\"],\r\n\t[\"keyword\", \"PROPERTY\"],\r\n\t[\"keyword\", \"ROLLBACK\"],\r\n\t[\"keyword\", \"STARTING\"],\r\n\t[\"keyword\", \"SUPPLIED\"],\r\n\t[\"keyword\", \"ABSTRACT\"],\r\n\t[\"keyword\", \"CHANGING\"],\r\n\t[\"keyword\", \"CONTEXTS\"],\r\n\t[\"keyword\", \"CREATING\"],\r\n\t[\"keyword\", \"CUSTOMER\"],\r\n\t[\"keyword\", \"DATABASE\"],\r\n\t[\"keyword\", \"DAYLIGHT\"],\r\n\t[\"keyword\", \"DEFINING\"],\r\n\t[\"keyword\", \"DISTINCT\"],\r\n\t[\"keyword\", \"DIVISION\"],\r\n\t[\"keyword\", \"ENABLING\"],\r\n\t[\"keyword\", \"ENDCHAIN\"],\r\n\t[\"keyword\", \"ESCAPING\"],\r\n\t[\"keyword\", \"HARMLESS\"],\r\n\t[\"keyword\", \"IMPLICIT\"],\r\n\t[\"keyword\", \"INACTIVE\"],\r\n\t[\"keyword\", \"LANGUAGE\"],\r\n\t[\"keyword\", \"MINOR-ID\"],\r\n\t[\"keyword\", \"MULTIPLY\"],\r\n\t[\"keyword\", \"NEW-PAGE\"],\r\n\t[\"keyword\", \"NO-TITLE\"],\r\n\t[\"keyword\", \"POS_HIGH\"],\r\n\t[\"keyword\", \"SEPARATE\"],\r\n\t[\"keyword\", \"TEXTPOOL\"],\r\n\t[\"keyword\", \"TRANSFER\"],\r\n\t[\"keyword\", \"SELECTOR\"],\r\n\t[\"keyword\", \"DBMAXLEN\"],\r\n\t[\"keyword\", \"ITERATOR\"],\r\n\t[\"keyword\", \"SELECTOR\"],\r\n\t[\"keyword\", \"ARCHIVE\"],\r\n\t[\"keyword\", \"BIT-XOR\"],\r\n\t[\"keyword\", \"BYTE-CO\"],\r\n\t[\"keyword\", \"COLLECT\"],\r\n\t[\"keyword\", \"COMMENT\"],\r\n\t[\"keyword\", \"CURRENT\"],\r\n\t[\"keyword\", \"DEFAULT\"],\r\n\t[\"keyword\", \"DISPLAY\"],\r\n\t[\"keyword\", \"ENDFORM\"],\r\n\t[\"keyword\", \"EXTRACT\"],\r\n\t[\"keyword\", \"LEADING\"],\r\n\t[\"keyword\", \"LISTBOX\"],\r\n\t[\"keyword\", \"LOCATOR\"],\r\n\t[\"keyword\", \"MEMBERS\"],\r\n\t[\"keyword\", \"METHODS\"],\r\n\t[\"keyword\", \"NESTING\"],\r\n\t[\"keyword\", \"POS_LOW\"],\r\n\t[\"keyword\", \"PROCESS\"],\r\n\t[\"keyword\", \"PROVIDE\"],\r\n\t[\"keyword\", \"RAISING\"],\r\n\t[\"keyword\", \"RESERVE\"],\r\n\t[\"keyword\", \"SECONDS\"],\r\n\t[\"keyword\", \"SUMMARY\"],\r\n\t[\"keyword\", \"VISIBLE\"],\r\n\t[\"keyword\", \"BETWEEN\"],\r\n\t[\"keyword\", \"BIT-AND\"],\r\n\t[\"keyword\", \"BYTE-CS\"],\r\n\t[\"keyword\", \"CLEANUP\"],\r\n\t[\"keyword\", \"COMPUTE\"],\r\n\t[\"keyword\", \"CONTROL\"],\r\n\t[\"keyword\", \"CONVERT\"],\r\n\t[\"keyword\", \"DATASET\"],\r\n\t[\"keyword\", \"ENDCASE\"],\r\n\t[\"keyword\", \"FORWARD\"],\r\n\t[\"keyword\", \"HEADERS\"],\r\n\t[\"keyword\", \"HOTSPOT\"],\r\n\t[\"keyword\", \"INCLUDE\"],\r\n\t[\"keyword\", \"INVERSE\"],\r\n\t[\"keyword\", \"KEEPING\"],\r\n\t[\"keyword\", \"NO-ZERO\"],\r\n\t[\"keyword\", \"OBJECTS\"],\r\n\t[\"keyword\", \"OVERLAY\"],\r\n\t[\"keyword\", \"PADDING\"],\r\n\t[\"keyword\", \"PATTERN\"],\r\n\t[\"keyword\", \"PROGRAM\"],\r\n\t[\"keyword\", \"REFRESH\"],\r\n\t[\"keyword\", \"SECTION\"],\r\n\t[\"keyword\", \"SUMMING\"],\r\n\t[\"keyword\", \"TESTING\"],\r\n\t[\"keyword\", \"VERSION\"],\r\n\t[\"keyword\", \"WINDOWS\"],\r\n\t[\"keyword\", \"WITHOUT\"],\r\n\t[\"keyword\", \"BIT-NOT\"],\r\n\t[\"keyword\", \"BYTE-CA\"],\r\n\t[\"keyword\", \"BYTE-NA\"],\r\n\t[\"keyword\", \"CASTING\"],\r\n\t[\"keyword\", \"CONTEXT\"],\r\n\t[\"keyword\", \"COUNTRY\"],\r\n\t[\"keyword\", \"DYNAMIC\"],\r\n\t[\"keyword\", \"ENABLED\"],\r\n\t[\"keyword\", \"ENDLOOP\"],\r\n\t[\"keyword\", \"EXECUTE\"],\r\n\t[\"keyword\", \"FRIENDS\"],\r\n\t[\"keyword\", \"HANDLER\"],\r\n\t[\"keyword\", \"HEADING\"],\r\n\t[\"keyword\", \"INITIAL\"],\r\n\t[\"keyword\", \"*-INPUT\"],\r\n\t[\"keyword\", \"LOGFILE\"],\r\n\t[\"keyword\", \"MAXIMUM\"],\r\n\t[\"keyword\", \"MINIMUM\"],\r\n\t[\"keyword\", \"NO-GAPS\"],\r\n\t[\"keyword\", \"NO-SIGN\"],\r\n\t[\"keyword\", \"PRAGMAS\"],\r\n\t[\"keyword\", \"PRIMARY\"],\r\n\t[\"keyword\", \"PRIVATE\"],\r\n\t[\"keyword\", \"REDUCED\"],\r\n\t[\"keyword\", \"REPLACE\"],\r\n\t[\"keyword\", \"REQUEST\"],\r\n\t[\"keyword\", \"RESULTS\"],\r\n\t[\"keyword\", \"UNICODE\"],\r\n\t[\"keyword\", \"WARNING\"],\r\n\t[\"keyword\", \"ALIASES\"],\r\n\t[\"keyword\", \"BYTE-CN\"],\r\n\t[\"keyword\", \"BYTE-NS\"],\r\n\t[\"keyword\", \"CALLING\"],\r\n\t[\"keyword\", \"COL_KEY\"],\r\n\t[\"keyword\", \"COLUMNS\"],\r\n\t[\"keyword\", \"CONNECT\"],\r\n\t[\"keyword\", \"ENDEXEC\"],\r\n\t[\"keyword\", \"ENTRIES\"],\r\n\t[\"keyword\", \"EXCLUDE\"],\r\n\t[\"keyword\", \"FILTERS\"],\r\n\t[\"keyword\", \"FURTHER\"],\r\n\t[\"keyword\", \"HELP-ID\"],\r\n\t[\"keyword\", \"LOGICAL\"],\r\n\t[\"keyword\", \"MAPPING\"],\r\n\t[\"keyword\", \"MESSAGE\"],\r\n\t[\"keyword\", \"NAMETAB\"],\r\n\t[\"keyword\", \"OPTIONS\"],\r\n\t[\"keyword\", \"PACKAGE\"],\r\n\t[\"keyword\", \"PERFORM\"],\r\n\t[\"keyword\", \"RECEIVE\"],\r\n\t[\"keyword\", \"STATICS\"],\r\n\t[\"keyword\", \"VARYING\"],\r\n\t[\"keyword\", \"BINDING\"],\r\n\t[\"keyword\", \"CHARLEN\"],\r\n\t[\"keyword\", \"GREATER\"],\r\n\t[\"keyword\", \"XSTRLEN\"],\r\n\t[\"keyword\", \"ACCEPT\"],\r\n\t[\"keyword\", \"APPEND\"],\r\n\t[\"keyword\", \"DETAIL\"],\r\n\t[\"keyword\", \"ELSEIF\"],\r\n\t[\"keyword\", \"ENDING\"],\r\n\t[\"keyword\", \"ENDTRY\"],\r\n\t[\"keyword\", \"FORMAT\"],\r\n\t[\"keyword\", \"FRAMES\"],\r\n\t[\"keyword\", \"GIVING\"],\r\n\t[\"keyword\", \"HASHED\"],\r\n\t[\"keyword\", \"HEADER\"],\r\n\t[\"keyword\", \"IMPORT\"],\r\n\t[\"keyword\", \"INSERT\"],\r\n\t[\"keyword\", \"MARGIN\"],\r\n\t[\"keyword\", \"MODULE\"],\r\n\t[\"keyword\", \"NATIVE\"],\r\n\t[\"keyword\", \"OBJECT\"],\r\n\t[\"keyword\", \"OFFSET\"],\r\n\t[\"keyword\", \"REMOTE\"],\r\n\t[\"keyword\", \"RESUME\"],\r\n\t[\"keyword\", \"SAVING\"],\r\n\t[\"keyword\", \"SIMPLE\"],\r\n\t[\"keyword\", \"SUBMIT\"],\r\n\t[\"keyword\", \"TABBED\"],\r\n\t[\"keyword\", \"TOKENS\"],\r\n\t[\"keyword\", \"UNIQUE\"],\r\n\t[\"keyword\", \"UNPACK\"],\r\n\t[\"keyword\", \"UPDATE\"],\r\n\t[\"keyword\", \"WINDOW\"],\r\n\t[\"keyword\", \"YELLOW\"],\r\n\t[\"keyword\", \"ACTUAL\"],\r\n\t[\"keyword\", \"ASPECT\"],\r\n\t[\"keyword\", \"CENTER\"],\r\n\t[\"keyword\", \"CURSOR\"],\r\n\t[\"keyword\", \"DELETE\"],\r\n\t[\"keyword\", \"DIALOG\"],\r\n\t[\"keyword\", \"DIVIDE\"],\r\n\t[\"keyword\", \"DURING\"],\r\n\t[\"keyword\", \"ERRORS\"],\r\n\t[\"keyword\", \"EVENTS\"],\r\n\t[\"keyword\", \"EXTEND\"],\r\n\t[\"keyword\", \"FILTER\"],\r\n\t[\"keyword\", \"HANDLE\"],\r\n\t[\"keyword\", \"HAVING\"],\r\n\t[\"keyword\", \"IGNORE\"],\r\n\t[\"keyword\", \"LITTLE\"],\r\n\t[\"keyword\", \"MEMORY\"],\r\n\t[\"keyword\", \"NO-GAP\"],\r\n\t[\"keyword\", \"OCCURS\"],\r\n\t[\"keyword\", \"OPTION\"],\r\n\t[\"keyword\", \"PERSON\"],\r\n\t[\"keyword\", \"PLACES\"],\r\n\t[\"keyword\", \"PUBLIC\"],\r\n\t[\"keyword\", \"REDUCE\"],\r\n\t[\"keyword\", \"REPORT\"],\r\n\t[\"keyword\", \"RESULT\"],\r\n\t[\"keyword\", \"SINGLE\"],\r\n\t[\"keyword\", \"SORTED\"],\r\n\t[\"keyword\", \"SWITCH\"],\r\n\t[\"keyword\", \"SYNTAX\"],\r\n\t[\"keyword\", \"TARGET\"],\r\n\t[\"keyword\", \"VALUES\"],\r\n\t[\"keyword\", \"WRITER\"],\r\n\t[\"keyword\", \"ASSERT\"],\r\n\t[\"keyword\", \"BLOCKS\"],\r\n\t[\"keyword\", \"BOUNDS\"],\r\n\t[\"keyword\", \"BUFFER\"],\r\n\t[\"keyword\", \"CHANGE\"],\r\n\t[\"keyword\", \"COLUMN\"],\r\n\t[\"keyword\", \"COMMIT\"],\r\n\t[\"keyword\", \"CONCAT\"],\r\n\t[\"keyword\", \"COPIES\"],\r\n\t[\"keyword\", \"CREATE\"],\r\n\t[\"keyword\", \"DDMMYY\"],\r\n\t[\"keyword\", \"DEFINE\"],\r\n\t[\"keyword\", \"ENDIAN\"],\r\n\t[\"keyword\", \"ESCAPE\"],\r\n\t[\"keyword\", \"EXPAND\"],\r\n\t[\"keyword\", \"KERNEL\"],\r\n\t[\"keyword\", \"LAYOUT\"],\r\n\t[\"keyword\", \"LEGACY\"],\r\n\t[\"keyword\", \"LEVELS\"],\r\n\t[\"keyword\", \"MMDDYY\"],\r\n\t[\"keyword\", \"NUMBER\"],\r\n\t[\"keyword\", \"OUTPUT\"],\r\n\t[\"keyword\", \"RANGES\"],\r\n\t[\"keyword\", \"READER\"],\r\n\t[\"keyword\", \"RETURN\"],\r\n\t[\"keyword\", \"SCREEN\"],\r\n\t[\"keyword\", \"SEARCH\"],\r\n\t[\"keyword\", \"SELECT\"],\r\n\t[\"keyword\", \"SHARED\"],\r\n\t[\"keyword\", \"SOURCE\"],\r\n\t[\"keyword\", \"STABLE\"],\r\n\t[\"keyword\", \"STATIC\"],\r\n\t[\"keyword\", \"SUBKEY\"],\r\n\t[\"keyword\", \"SUFFIX\"],\r\n\t[\"keyword\", \"TABLES\"],\r\n\t[\"keyword\", \"UNWIND\"],\r\n\t[\"keyword\", \"YYMMDD\"],\r\n\t[\"keyword\", \"ASSIGN\"],\r\n\t[\"keyword\", \"BACKUP\"],\r\n\t[\"keyword\", \"BEFORE\"],\r\n\t[\"keyword\", \"BINARY\"],\r\n\t[\"keyword\", \"BIT-OR\"],\r\n\t[\"keyword\", \"BLANKS\"],\r\n\t[\"keyword\", \"CLIENT\"],\r\n\t[\"keyword\", \"CODING\"],\r\n\t[\"keyword\", \"COMMON\"],\r\n\t[\"keyword\", \"DEMAND\"],\r\n\t[\"keyword\", \"DYNPRO\"],\r\n\t[\"keyword\", \"EXCEPT\"],\r\n\t[\"keyword\", \"EXISTS\"],\r\n\t[\"keyword\", \"EXPORT\"],\r\n\t[\"keyword\", \"FIELDS\"],\r\n\t[\"keyword\", \"GLOBAL\"],\r\n\t[\"keyword\", \"GROUPS\"],\r\n\t[\"keyword\", \"LENGTH\"],\r\n\t[\"keyword\", \"LOCALE\"],\r\n\t[\"keyword\", \"MEDIUM\"],\r\n\t[\"keyword\", \"METHOD\"],\r\n\t[\"keyword\", \"MODIFY\"],\r\n\t[\"keyword\", \"NESTED\"],\r\n\t[\"keyword\", \"OTHERS\"],\r\n\t[\"keyword\", \"REJECT\"],\r\n\t[\"keyword\", \"SCROLL\"],\r\n\t[\"keyword\", \"SUPPLY\"],\r\n\t[\"keyword\", \"SYMBOL\"],\r\n\t[\"keyword\", \"ENDFOR\"],\r\n\t[\"keyword\", \"STRLEN\"],\r\n\t[\"keyword\", \"ALIGN\"],\r\n\t[\"keyword\", \"BEGIN\"],\r\n\t[\"keyword\", \"BOUND\"],\r\n\t[\"keyword\", \"ENDAT\"],\r\n\t[\"keyword\", \"ENTRY\"],\r\n\t[\"keyword\", \"EVENT\"],\r\n\t[\"keyword\", \"FINAL\"],\r\n\t[\"keyword\", \"FLUSH\"],\r\n\t[\"keyword\", \"GRANT\"],\r\n\t[\"keyword\", \"INNER\"],\r\n\t[\"keyword\", \"SHORT\"],\r\n\t[\"keyword\", \"USING\"],\r\n\t[\"keyword\", \"WRITE\"],\r\n\t[\"keyword\", \"AFTER\"],\r\n\t[\"keyword\", \"BLACK\"],\r\n\t[\"keyword\", \"BLOCK\"],\r\n\t[\"keyword\", \"CLOCK\"],\r\n\t[\"keyword\", \"COLOR\"],\r\n\t[\"keyword\", \"COUNT\"],\r\n\t[\"keyword\", \"DUMMY\"],\r\n\t[\"keyword\", \"EMPTY\"],\r\n\t[\"keyword\", \"ENDDO\"],\r\n\t[\"keyword\", \"ENDON\"],\r\n\t[\"keyword\", \"GREEN\"],\r\n\t[\"keyword\", \"INDEX\"],\r\n\t[\"keyword\", \"INOUT\"],\r\n\t[\"keyword\", \"LEAVE\"],\r\n\t[\"keyword\", \"LEVEL\"],\r\n\t[\"keyword\", \"LINES\"],\r\n\t[\"keyword\", \"MODIF\"],\r\n\t[\"keyword\", \"ORDER\"],\r\n\t[\"keyword\", \"OUTER\"],\r\n\t[\"keyword\", \"RANGE\"],\r\n\t[\"keyword\", \"RESET\"],\r\n\t[\"keyword\", \"RETRY\"],\r\n\t[\"keyword\", \"RIGHT\"],\r\n\t[\"keyword\", \"SMART\"],\r\n\t[\"keyword\", \"SPLIT\"],\r\n\t[\"keyword\", \"STYLE\"],\r\n\t[\"keyword\", \"TABLE\"],\r\n\t[\"keyword\", \"THROW\"],\r\n\t[\"keyword\", \"UNDER\"],\r\n\t[\"keyword\", \"UNTIL\"],\r\n\t[\"keyword\", \"UPPER\"],\r\n\t[\"keyword\", \"UTF-8\"],\r\n\t[\"keyword\", \"WHERE\"],\r\n\t[\"keyword\", \"ALIAS\"],\r\n\t[\"keyword\", \"BLANK\"],\r\n\t[\"keyword\", \"CLEAR\"],\r\n\t[\"keyword\", \"CLOSE\"],\r\n\t[\"keyword\", \"EXACT\"],\r\n\t[\"keyword\", \"FETCH\"],\r\n\t[\"keyword\", \"FIRST\"],\r\n\t[\"keyword\", \"FOUND\"],\r\n\t[\"keyword\", \"GROUP\"],\r\n\t[\"keyword\", \"LLANG\"],\r\n\t[\"keyword\", \"LOCAL\"],\r\n\t[\"keyword\", \"OTHER\"],\r\n\t[\"keyword\", \"REGEX\"],\r\n\t[\"keyword\", \"SPOOL\"],\r\n\t[\"keyword\", \"TITLE\"],\r\n\t[\"keyword\", \"TYPES\"],\r\n\t[\"keyword\", \"VALID\"],\r\n\t[\"keyword\", \"WHILE\"],\r\n\t[\"keyword\", \"ALPHA\"],\r\n\t[\"keyword\", \"BOXED\"],\r\n\t[\"keyword\", \"CATCH\"],\r\n\t[\"keyword\", \"CHAIN\"],\r\n\t[\"keyword\", \"CHECK\"],\r\n\t[\"keyword\", \"CLASS\"],\r\n\t[\"keyword\", \"COVER\"],\r\n\t[\"keyword\", \"ENDIF\"],\r\n\t[\"keyword\", \"EQUIV\"],\r\n\t[\"keyword\", \"FIELD\"],\r\n\t[\"keyword\", \"FLOOR\"],\r\n\t[\"keyword\", \"FRAME\"],\r\n\t[\"keyword\", \"INPUT\"],\r\n\t[\"keyword\", \"LOWER\"],\r\n\t[\"keyword\", \"MATCH\"],\r\n\t[\"keyword\", \"NODES\"],\r\n\t[\"keyword\", \"PAGES\"],\r\n\t[\"keyword\", \"PRINT\"],\r\n\t[\"keyword\", \"RAISE\"],\r\n\t[\"keyword\", \"ROUND\"],\r\n\t[\"keyword\", \"SHIFT\"],\r\n\t[\"keyword\", \"SPACE\"],\r\n\t[\"keyword\", \"SPOTS\"],\r\n\t[\"keyword\", \"STAMP\"],\r\n\t[\"keyword\", \"STATE\"],\r\n\t[\"keyword\", \"TASKS\"],\r\n\t[\"keyword\", \"TIMES\"],\r\n\t[\"keyword\", \"TRMAC\"],\r\n\t[\"keyword\", \"ULINE\"],\r\n\t[\"keyword\", \"UNION\"],\r\n\t[\"keyword\", \"VALUE\"],\r\n\t[\"keyword\", \"WIDTH\"],\r\n\t[\"keyword\", \"EQUAL\"],\r\n\t[\"keyword\", \"LOG10\"],\r\n\t[\"keyword\", \"TRUNC\"],\r\n\t[\"keyword\", \"BLOB\"],\r\n\t[\"keyword\", \"CASE\"],\r\n\t[\"keyword\", \"CEIL\"],\r\n\t[\"keyword\", \"CLOB\"],\r\n\t[\"keyword\", \"COND\"],\r\n\t[\"keyword\", \"EXIT\"],\r\n\t[\"keyword\", \"FILE\"],\r\n\t[\"keyword\", \"GAPS\"],\r\n\t[\"keyword\", \"HOLD\"],\r\n\t[\"keyword\", \"INCL\"],\r\n\t[\"keyword\", \"INTO\"],\r\n\t[\"keyword\", \"KEEP\"],\r\n\t[\"keyword\", \"KEYS\"],\r\n\t[\"keyword\", \"LAST\"],\r\n\t[\"keyword\", \"LINE\"],\r\n\t[\"keyword\", \"LONG\"],\r\n\t[\"keyword\", \"LPAD\"],\r\n\t[\"keyword\", \"MAIL\"],\r\n\t[\"keyword\", \"MODE\"],\r\n\t[\"keyword\", \"OPEN\"],\r\n\t[\"keyword\", \"PINK\"],\r\n\t[\"keyword\", \"READ\"],\r\n\t[\"keyword\", \"ROWS\"],\r\n\t[\"keyword\", \"TEST\"],\r\n\t[\"keyword\", \"THEN\"],\r\n\t[\"keyword\", \"ZERO\"],\r\n\t[\"keyword\", \"AREA\"],\r\n\t[\"keyword\", \"BACK\"],\r\n\t[\"keyword\", \"BADI\"],\r\n\t[\"keyword\", \"BYTE\"],\r\n\t[\"keyword\", \"CAST\"],\r\n\t[\"keyword\", \"EDIT\"],\r\n\t[\"keyword\", \"EXEC\"],\r\n\t[\"keyword\", \"FAIL\"],\r\n\t[\"keyword\", \"FIND\"],\r\n\t[\"keyword\", \"FKEQ\"],\r\n\t[\"keyword\", \"FONT\"],\r\n\t[\"keyword\", \"FREE\"],\r\n\t[\"keyword\", \"GKEQ\"],\r\n\t[\"keyword\", \"HIDE\"],\r\n\t[\"keyword\", \"INIT\"],\r\n\t[\"keyword\", \"ITNO\"],\r\n\t[\"keyword\", \"LATE\"],\r\n\t[\"keyword\", \"LOOP\"],\r\n\t[\"keyword\", \"MAIN\"],\r\n\t[\"keyword\", \"MARK\"],\r\n\t[\"keyword\", \"MOVE\"],\r\n\t[\"keyword\", \"NEXT\"],\r\n\t[\"keyword\", \"NULL\"],\r\n\t[\"keyword\", \"RISK\"],\r\n\t[\"keyword\", \"ROLE\"],\r\n\t[\"keyword\", \"UNIT\"],\r\n\t[\"keyword\", \"WAIT\"],\r\n\t[\"keyword\", \"ZONE\"],\r\n\t[\"keyword\", \"BASE\"],\r\n\t[\"keyword\", \"CALL\"],\r\n\t[\"keyword\", \"CODE\"],\r\n\t[\"keyword\", \"DATA\"],\r\n\t[\"keyword\", \"DATE\"],\r\n\t[\"keyword\", \"FKGE\"],\r\n\t[\"keyword\", \"GKGE\"],\r\n\t[\"keyword\", \"HIGH\"],\r\n\t[\"keyword\", \"KIND\"],\r\n\t[\"keyword\", \"LEFT\"],\r\n\t[\"keyword\", \"LIST\"],\r\n\t[\"keyword\", \"MASK\"],\r\n\t[\"keyword\", \"MESH\"],\r\n\t[\"keyword\", \"NAME\"],\r\n\t[\"keyword\", \"NODE\"],\r\n\t[\"keyword\", \"PACK\"],\r\n\t[\"keyword\", \"PAGE\"],\r\n\t[\"keyword\", \"POOL\"],\r\n\t[\"keyword\", \"SEND\"],\r\n\t[\"keyword\", \"SIGN\"],\r\n\t[\"keyword\", \"SIZE\"],\r\n\t[\"keyword\", \"SOME\"],\r\n\t[\"keyword\", \"STOP\"],\r\n\t[\"keyword\", \"TASK\"],\r\n\t[\"keyword\", \"TEXT\"],\r\n\t[\"keyword\", \"TIME\"],\r\n\t[\"keyword\", \"USER\"],\r\n\t[\"keyword\", \"VARY\"],\r\n\t[\"keyword\", \"WITH\"],\r\n\t[\"keyword\", \"WORD\"],\r\n\t[\"keyword\", \"BLUE\"],\r\n\t[\"keyword\", \"CONV\"],\r\n\t[\"keyword\", \"COPY\"],\r\n\t[\"keyword\", \"DEEP\"],\r\n\t[\"keyword\", \"ELSE\"],\r\n\t[\"keyword\", \"FORM\"],\r\n\t[\"keyword\", \"FROM\"],\r\n\t[\"keyword\", \"HINT\"],\r\n\t[\"keyword\", \"ICON\"],\r\n\t[\"keyword\", \"JOIN\"],\r\n\t[\"keyword\", \"LIKE\"],\r\n\t[\"keyword\", \"LOAD\"],\r\n\t[\"keyword\", \"ONLY\"],\r\n\t[\"keyword\", \"PART\"],\r\n\t[\"keyword\", \"SCAN\"],\r\n\t[\"keyword\", \"SKIP\"],\r\n\t[\"keyword\", \"SORT\"],\r\n\t[\"keyword\", \"TYPE\"],\r\n\t[\"keyword\", \"UNIX\"],\r\n\t[\"keyword\", \"VIEW\"],\r\n\t[\"keyword\", \"WHEN\"],\r\n\t[\"keyword\", \"WORK\"],\r\n\t[\"keyword\", \"ACOS\"],\r\n\t[\"keyword\", \"ASIN\"],\r\n\t[\"keyword\", \"ATAN\"],\r\n\t[\"keyword\", \"COSH\"],\r\n\t[\"keyword\", \"EACH\"],\r\n\t[\"keyword\", \"FRAC\"],\r\n\t[\"keyword\", \"LESS\"],\r\n\t[\"keyword\", \"RTTI\"],\r\n\t[\"keyword\", \"SINH\"],\r\n\t[\"keyword\", \"SQRT\"],\r\n\t[\"keyword\", \"TANH\"],\r\n\t[\"keyword\", \"AVG\"],\r\n\t[\"keyword\", \"BIT\"],\r\n\t[\"keyword\", \"DIV\"],\r\n\t[\"keyword\", \"ISO\"],\r\n\t[\"keyword\", \"LET\"],\r\n\t[\"keyword\", \"OUT\"],\r\n\t[\"keyword\", \"PAD\"],\r\n\t[\"keyword\", \"SQL\"],\r\n\t[\"keyword\", \"ALL\"],\r\n\t[\"keyword\", \"CI_\"],\r\n\t[\"keyword\", \"CPI\"],\r\n\t[\"keyword\", \"END\"],\r\n\t[\"keyword\", \"LOB\"],\r\n\t[\"keyword\", \"LPI\"],\r\n\t[\"keyword\", \"MAX\"],\r\n\t[\"keyword\", \"MIN\"],\r\n\t[\"keyword\", \"NEW\"],\r\n\t[\"keyword\", \"OLE\"],\r\n\t[\"keyword\", \"RUN\"],\r\n\t[\"keyword\", \"SET\"],\r\n\t[\"keyword\", \"?TO\"],\r\n\t[\"keyword\", \"YES\"],\r\n\t[\"keyword\", \"ABS\"],\r\n\t[\"keyword\", \"ADD\"],\r\n\t[\"keyword\", \"AND\"],\r\n\t[\"keyword\", \"BIG\"],\r\n\t[\"keyword\", \"FOR\"],\r\n\t[\"keyword\", \"HDB\"],\r\n\t[\"keyword\", \"JOB\"],\r\n\t[\"keyword\", \"LOW\"],\r\n\t[\"keyword\", \"NOT\"],\r\n\t[\"keyword\", \"SAP\"],\r\n\t[\"keyword\", \"TRY\"],\r\n\t[\"keyword\", \"VIA\"],\r\n\t[\"keyword\", \"XML\"],\r\n\t[\"keyword\", \"ANY\"],\r\n\t[\"keyword\", \"GET\"],\r\n\t[\"keyword\", \"IDS\"],\r\n\t[\"keyword\", \"KEY\"],\r\n\t[\"keyword\", \"MOD\"],\r\n\t[\"keyword\", \"OFF\"],\r\n\t[\"keyword\", \"PUT\"],\r\n\t[\"keyword\", \"RAW\"],\r\n\t[\"keyword\", \"RED\"],\r\n\t[\"keyword\", \"REF\"],\r\n\t[\"keyword\", \"SUM\"],\r\n\t[\"keyword\", \"TAB\"],\r\n\t[\"keyword\", \"XSD\"],\r\n\t[\"keyword\", \"CNT\"],\r\n\t[\"keyword\", \"COS\"],\r\n\t[\"keyword\", \"EXP\"],\r\n\t[\"keyword\", \"LOG\"],\r\n\t[\"keyword\", \"SIN\"],\r\n\t[\"keyword\", \"TAN\"],\r\n\t[\"keyword\", \"XOR\"],\r\n\t[\"keyword\", \"AT\"],\r\n\t[\"keyword\", \"CO\"],\r\n\t[\"keyword\", \"CP\"],\r\n\t[\"keyword\", \"DO\"],\r\n\t[\"keyword\", \"GT\"],\r\n\t[\"keyword\", \"ID\"],\r\n\t[\"keyword\", \"IF\"],\r\n\t[\"keyword\", \"NS\"],\r\n\t[\"keyword\", \"OR\"],\r\n\t[\"keyword\", \"BT\"],\r\n\t[\"keyword\", \"CA\"],\r\n\t[\"keyword\", \"CS\"],\r\n\t[\"keyword\", \"GE\"],\r\n\t[\"keyword\", \"NA\"],\r\n\t[\"keyword\", \"NB\"],\r\n\t[\"keyword\", \"EQ\"],\r\n\t[\"keyword\", \"IN\"],\r\n\t[\"keyword\", \"LT\"],\r\n\t[\"keyword\", \"NE\"],\r\n\t[\"keyword\", \"NO\"],\r\n\t[\"keyword\", \"OF\"],\r\n\t[\"keyword\", \"ON\"],\r\n\t[\"keyword\", \"PF\"],\r\n\t[\"keyword\", \"TO\"],\r\n\t[\"keyword\", \"AS\"],\r\n\t[\"keyword\", \"BY\"],\r\n\t[\"keyword\", \"CN\"],\r\n\t[\"keyword\", \"IS\"],\r\n\t[\"keyword\", \"LE\"],\r\n\t[\"keyword\", \"NP\"],\r\n\t[\"keyword\", \"UP\"],\r\n\t[\"keyword\", \"E\"],\r\n\t[\"keyword\", \"I\"],\r\n\t[\"keyword\", \"M\"],\r\n\t[\"keyword\", \"O\"],\r\n\t[\"keyword\", \"Z\"],\r\n\t[\"keyword\", \"C\"],\r\n\t[\"keyword\", \"X\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/abap/number_feature.test",
    "content": "0\r\n42\r\n123456789\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"123456789\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/abap/operator_feature.test",
    "content": ".\r\n+ -\r\n/ * **\r\n< > <= >=\r\n= ?= <>\r\n\r\n& &&\r\n\r\na-b\r\na~b\r\na->b\r\na=>b\r\na|b\r\na{b}c\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \".\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"*\"], [\"operator\", \"**\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \">\"], [\"operator\", \"<=\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"?=\"], [\"operator\", \"<>\"],\r\n\r\n\t[\"string-operator\", \"&\"], [\"string-operator\", \"&&\"],\r\n\r\n\t\"\\r\\n\\r\\na\", [\"token-operator\", \"-\"],\r\n\t\"b\\r\\na\", [\"token-operator\", \"~\"],\r\n\t\"b\\r\\na\", [\"token-operator\", \"->\"],\r\n\t\"b\\r\\na\", [\"token-operator\", \"=>\"],\r\n\t\"b\\r\\na\", [\"token-operator\", \"|\"],\r\n\t\"b\\r\\na\", [\"token-operator\", \"{\"], \"b\", [\"token-operator\", \"}\"], \"c\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators, string-operators and token-operators.\r\nThe leading dot serves only because tests are trimmed."
  },
  {
    "path": "tests/languages/abap/string-template_feature.test",
    "content": "|foobar|\r\n|foo\\|b\\{a}r|\r\n|foo { bar } baz|\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"token-operator\", \"|\"], [\"string-template\", \"foobar\"], [\"token-operator\", \"|\"],\r\n\t[\"token-operator\", \"|\"], [\"string-template\", \"foo\\\\|b\\\\{a}r\"], [\"token-operator\", \"|\"],\r\n\t[\"token-operator\", \"|\"], [\"string-template\", \"foo \"], [\"token-operator\", \"{\"],\r\n\t\" bar \",\r\n\t[\"token-operator\", \"}\"], [\"string-template\", \" baz\"], [\"token-operator\", \"|\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for string templates."
  },
  {
    "path": "tests/languages/abap/string_feature.test",
    "content": "''\r\n'foo'\r\n'foo\\'bar'\r\n``\r\n`foo`\r\n`foo\\`bar`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'foo'\"],\r\n\t[\"string\", \"'foo\\\\'bar'\"],\r\n\t[\"string\", \"``\"],\r\n\t[\"string\", \"`foo`\"],\r\n\t[\"string\", \"`foo\\\\`bar`\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/abnf/comment_feature.test",
    "content": ";\n; comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \";\"],\n\t[\"comment\", \"; comment\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/abnf/core-rule_feature.test",
    "content": "ALPHA\nBIT\nCHAR\nCR\nCRLF\nCTL\nDIGIT\nDQUOTE\nHEXDIG\nHTAB\nLF\nLWSP\nOCTET\nSP\nVCHAR\nWSP\n\nbit\nbiT\n<bIt>\n\n----------------------------------------------------\n\n[\n\t[\"core-rule\", [\"ALPHA\"]],\n\t[\"core-rule\", [\"BIT\"]],\n\t[\"core-rule\", [\"CHAR\"]],\n\t[\"core-rule\", [\"CR\"]],\n\t[\"core-rule\", [\"CRLF\"]],\n\t[\"core-rule\", [\"CTL\"]],\n\t[\"core-rule\", [\"DIGIT\"]],\n\t[\"core-rule\", [\"DQUOTE\"]],\n\t[\"core-rule\", [\"HEXDIG\"]],\n\t[\"core-rule\", [\"HTAB\"]],\n\t[\"core-rule\", [\"LF\"]],\n\t[\"core-rule\", [\"LWSP\"]],\n\t[\"core-rule\", [\"OCTET\"]],\n\t[\"core-rule\", [\"SP\"]],\n\t[\"core-rule\", [\"VCHAR\"]],\n\t[\"core-rule\", [\"WSP\"]],\n\n\t[\"core-rule\", [\"bit\"]],\n\t[\"core-rule\", [\"biT\"]],\n\t[\"core-rule\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"bIt\",\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for core rules.\n"
  },
  {
    "path": "tests/languages/abnf/definition_feature.test",
    "content": "foo-bar   =  %x20\n<foo-foo> =/ foo-bar\n\n----------------------------------------------------\n\n[\n\t[\"definition\", [\"foo-bar\"]],\n\t[\"operator\", \"=\"],\n\t[\"terminal\", \"%x20\"],\n\n\t[\"definition\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"foo-foo\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"operator\", \"=/\"],\n\t[\"rule\", [\"foo-bar\"]]\n]\n\n----------------------------------------------------\n\nChecks for definitions.\n"
  },
  {
    "path": "tests/languages/abnf/operator_feature.test",
    "content": "= =/ /\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"=/\"],\n\t[\"operator\", \"/\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/abnf/punctuation_feature.test",
    "content": "()\n[]\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/abnf/range_feature.test",
    "content": "%b0-11111\n%d0-31\n%x0-1F\n%x0-1f\n\n----------------------------------------------------\n\n[\n\t[\"range\", \"%b0-11111\"],\n\t[\"range\", \"%d0-31\"],\n\t[\"range\", \"%x0-1F\"],\n\t[\"range\", \"%x0-1f\"]\n]\n\n----------------------------------------------------\n\nChecks for ranges.\n"
  },
  {
    "path": "tests/languages/abnf/repetition_feature.test",
    "content": "*foo\n2foo\n*2foo\n2*foo\n2*3foo\n\n----------------------------------------------------\n\n[\n\t[\"repetition\", \"*\"], [\"rule\", [\"foo\"]],\n\t[\"repetition\", \"2\"], [\"rule\", [\"foo\"]],\n\t[\"repetition\", \"*2\"], [\"rule\", [\"foo\"]],\n\t[\"repetition\", \"2*\"], [\"rule\", [\"foo\"]],\n\t[\"repetition\", \"2*3\"], [\"rule\", [\"foo\"]]\n]\n\n----------------------------------------------------\n\nChecks for repetitions.\n"
  },
  {
    "path": "tests/languages/abnf/rule_feature.test",
    "content": "foo\nfoo-Bar\n<foo-bar>\n\n----------------------------------------------------\n\n[\n\t[\"rule\", [\"foo\"]],\n\t[\"rule\", [\"foo-Bar\"]],\n\t[\"rule\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"foo-bar\",\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for rules.\n"
  },
  {
    "path": "tests/languages/abnf/string_feature.test",
    "content": "\"\"\n\"a\"\n\"abc<d>\"\n\";\"\n\n%s\"abc\"\n%i\"abc\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", [\"\\\"\\\"\"]],\n\t[\"string\", [\"\\\"a\\\"\"]],\n\t[\"string\", [\"\\\"abc<d>\\\"\"]],\n\t[\"string\", [\"\\\";\\\"\"]],\n\n\t[\"string\", [\n\t\t[\"punctuation\", \"%s\"],\n\t\t\"\\\"abc\\\"\"\n\t]],\n\t[\"string\", [\n\t\t[\"punctuation\", \"%i\"],\n\t\t\"\\\"abc\\\"\"\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/abnf/terminal_feature.test",
    "content": "%b1000001\n%d65\n%x41\n%d65.66.67\n%x41.42.43\n\n----------------------------------------------------\n\n[\n\t[\"terminal\", \"%b1000001\"],\n\t[\"terminal\", \"%d65\"],\n\t[\"terminal\", \"%x41\"],\n\t[\"terminal\", \"%d65.66.67\"],\n\t[\"terminal\", \"%x41.42.43\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/actionscript/keyword_feature.test",
    "content": "as; break; case; catch; class;\r\nconst; default; delete; do; else;\r\nextends; finally; for; function; if;\r\nimplements; import; in; instanceof; interface;\r\ninternal; is; native; new; null;\r\npackage; private; protected; public; return;\r\nsuper; switch; this; throw; try;\r\ntypeof; use; var; void; while;\r\nwith; dynamic; each; final; get;\r\ninclude; namespace; native; override; set;\r\nstatic;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"case\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"catch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"default\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"delete\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"finally\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"function\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"import\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"instanceof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"internal\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"is\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"native\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"null\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"package\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"private\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"protected\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"public\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"super\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"this\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"throw\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"try\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"typeof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"use\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"var\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"void\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"with\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dynamic\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"each\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"final\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"get\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"include\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"namespace\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"native\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"override\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"set\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/actionscript/operator_feature.test",
    "content": "+ - * / % ^\r\n+= -= *= /= %= ^=\r\n& && | ||\r\n&= &&= |= ||=\r\n< << > >> >>>\r\n<= <<= >= >>= >>>=\r\n! != = ==\r\n!== ===\r\n~ ? @\r\n++ --\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"%\"], [\"operator\", \"^\"],\r\n\t[\"operator\", \"+=\"], [\"operator\", \"-=\"], [\"operator\", \"*=\"], [\"operator\", \"/=\"], [\"operator\", \"%=\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"|\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"&=\"], [\"operator\", \"&&=\"], [\"operator\", \"|=\"], [\"operator\", \"||=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">>>\"],\r\n\t[\"operator\", \"<=\"], [\"operator\", \"<<=\"], [\"operator\", \">=\"], [\"operator\", \">>=\"], [\"operator\", \">>>=\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"], [\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"!==\"], [\"operator\", \"===\"],\r\n\t[\"operator\", \"~\"], [\"operator\", \"?\"], [\"operator\", \"@\"],\r\n\t[\"operator\", \"++\"], [\"operator\", \"--\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/ada/attribute_feature.test",
    "content": "Integer'Size\nCharacter'Val\n\n----------------------------------------------------\n\n[\n\t[\"variable\", \"Integer\"], [\"attribute\", \"'Size\"],\n\t[\"variable\", \"Character\"], [\"attribute\", \"'Val\"]\n]\n\n----------------------------------------------------\n\nChecks for attributes.\n"
  },
  {
    "path": "tests/languages/ada/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/ada/char_feature.test",
    "content": "'f'\r\n'A'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"char\", \"'f'\"],\r\n\t[\"char\", \"'A'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for chars."
  },
  {
    "path": "tests/languages/ada/comment_feature.test",
    "content": "--\r\n-- Foo bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"--\"],\r\n\t[\"comment\", \"-- Foo bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/ada/keyword_feature.test",
    "content": "abort\r\nabs\r\nabstract\r\naccept\r\naccess\r\naliased\r\nall\r\nand\r\narray\r\nat\r\nbegin\r\nbody\r\ncase\r\nconstant\r\ndeclare\r\ndelay\r\ndelta\r\ndigits\r\ndo\r\nelse\r\nnew\r\nreturn\r\nelsif\r\nend\r\nentry\r\nexception\r\nexit\r\nfor\r\nfunction\r\ngeneric\r\ngoto\r\nif\r\nin\r\ninterface\r\nis\r\nlimited\r\nloop\r\nmod\r\nnot\r\nnull\r\nof\r\nor\r\nothers\r\nout\r\noverriding\r\npackage\r\npragma\r\nprivate\r\nprocedure\r\nprotected\r\nraise\r\nrange\r\nrecord\r\nrem\r\nrenames\r\nrequeue\r\nreverse\r\nselect\r\nseparate\r\nsome\r\nsubtype\r\nsynchronized\r\ntagged\r\ntask\r\nterminate\r\nthen\r\ntype\r\nuntil\r\nuse\r\nwhen\r\nwhile\r\nwith\r\nxor\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abort\"],\r\n\t[\"keyword\", \"abs\"],\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"accept\"],\r\n\t[\"keyword\", \"access\"],\r\n\t[\"keyword\", \"aliased\"],\r\n\t[\"keyword\", \"all\"],\r\n\t[\"keyword\", \"and\"],\r\n\t[\"keyword\", \"array\"],\r\n\t[\"keyword\", \"at\"],\r\n\t[\"keyword\", \"begin\"],\r\n\t[\"keyword\", \"body\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"constant\"],\r\n\t[\"keyword\", \"declare\"],\r\n\t[\"keyword\", \"delay\"],\r\n\t[\"keyword\", \"delta\"],\r\n\t[\"keyword\", \"digits\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"elsif\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"entry\"],\r\n\t[\"keyword\", \"exception\"],\r\n\t[\"keyword\", \"exit\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"generic\"],\r\n\t[\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"limited\"],\r\n\t[\"keyword\", \"loop\"],\r\n\t[\"keyword\", \"mod\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"others\"],\r\n\t[\"keyword\", \"out\"],\r\n\t[\"keyword\", \"overriding\"],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"pragma\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"procedure\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"raise\"],\r\n\t[\"keyword\", \"range\"],\r\n\t[\"keyword\", \"record\"],\r\n\t[\"keyword\", \"rem\"],\r\n\t[\"keyword\", \"renames\"],\r\n\t[\"keyword\", \"requeue\"],\r\n\t[\"keyword\", \"reverse\"],\r\n\t[\"keyword\", \"select\"],\r\n\t[\"keyword\", \"separate\"],\r\n\t[\"keyword\", \"some\"],\r\n\t[\"keyword\", \"subtype\"],\r\n\t[\"keyword\", \"synchronized\"],\r\n\t[\"keyword\", \"tagged\"],\r\n\t[\"keyword\", \"task\"],\r\n\t[\"keyword\", \"terminate\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"until\"],\r\n\t[\"keyword\", \"use\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"keyword\", \"xor\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/ada/number_feature.test",
    "content": "42\r\n42_000\r\n3.14_15_9\r\n0.4E+123_456\r\n3.7e-7\r\n1_6#Bad_Face#E-32_1\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"42_000\"],\r\n\t[\"number\", \"3.14_15_9\"],\r\n\t[\"number\", \"0.4E+123_456\"],\r\n\t[\"number\", \"3.7e-7\"],\r\n\t[\"number\", \"1_6#Bad_Face#E-32_1\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/ada/operator_feature.test",
    "content": "<>\r\n=> :=\r\n< <=\r\n> >=\r\n= /=\r\n& + -\r\n* ** /\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"<>\"],\r\n\t[\"operator\", \"=>\"], [\"operator\", \":=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"+\"], [\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"**\"], [\"operator\", \"/\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/ada/punctuation_feature.test",
    "content": ". ..\n, ; ( ) :\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \"..\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \":\"]\n]\n"
  },
  {
    "path": "tests/languages/ada/string_feature.test",
    "content": "\"\"\r\n\"Foo\"\"bar\"\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Foo\\\"\\\"bar\\\"\\\"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/ada/variable_feature.test",
    "content": "Byte\r\nfoo_bar42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"Byte\"],\r\n\t[\"variable\", \"foo_bar42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/agda/comment_feature.test",
    "content": "{-\n\tThis is a\n\tmultiline comment\n-}\n-- This is a singleline comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"{-\\r\\n\\tThis is a\\r\\n\\tmultiline comment\\r\\n-}\"],\n\t[\"comment\", \"-- This is a singleline comment\"]\n]\n\n----------------------------------------------------\n\nIn agda there are two kinds of comments:\n\t- Multiline comments wrapped by {- -}\n\t- Singleline comments leading by --\n"
  },
  {
    "path": "tests/languages/agda/data_feature.test",
    "content": "data _≐_ {ℓ} {A : Set ℓ} (x : A) : A → Prop ℓ where\n\trefl : x ≐ x\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"data\"],\n\t[\"class-name\", \"_≐_\"],\n\t[\"punctuation\", \"{\"],\n\t\"ℓ\",\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"{\"],\n\t[\"function\", \"A \"],\n\t[\"operator\", \":\"],\n\t[\"keyword\", \"Set\"],\n\t\" ℓ\",\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"x \"],\n\t[\"operator\", \":\"],\n\t\" A\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \":\"],\n\t\" A \",\n\t[\"operator\", \"→\"],\n\t\" Prop ℓ \",\n\t[\"keyword\", \"where\"],\n\t[\"function\", \"refl \"],\n\t[\"operator\", \":\"],\n\t\" x ≐ x\"\n]\n\n----------------------------------------------------\n\nThe `data` keyword in Agda is used to declare a type (of course it can be dependent)\nin a fashion like Haskell's GADTs.\n"
  },
  {
    "path": "tests/languages/agda/function_feature.test",
    "content": "merge : {A : Set} (_<_ : A → A → Bool) → List A → List A → List A\nmerge xs [] = xs\nmerge [] ys = ys\nmerge xs@(x ∷ xs₁) ys@(y ∷ ys₁) =\n\tif x < y then x ∷ merge xs₁ ys\n\t\t\t\t\t else y ∷ merge xs ys₁\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"merge \"],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"function\", \"A \"],\n\t[\"operator\", \":\"],\n\t[\"keyword\", \"Set\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"_<_ \"],\n\t[\"operator\", \":\"],\n\t\" A \",\n\t[\"operator\", \"→\"],\n\t\" A \",\n\t[\"operator\", \"→\"],\n\t\" Bool\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"→\"],\n\t\" List A \",\n\t[\"operator\", \"→\"],\n\t\" List A \",\n\t[\"operator\", \"→\"],\n\t\" List A\\r\\nmerge xs [] \",\n\t[\"operator\", \"=\"],\n\t\" xs\\r\\nmerge [] ys \",\n\t[\"operator\", \"=\"],\n\t\" ys\\r\\nmerge xs\",\n\t[\"punctuation\", \"@\"],\n\t[\"punctuation\", \"(\"],\n\t\"x ∷ xs₁\",\n\t[\"punctuation\", \")\"],\n\t\" ys\",\n\t[\"punctuation\", \"@\"],\n\t[\"punctuation\", \"(\"],\n\t\"y ∷ ys₁\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=\"],\n\n\t\"\\r\\n\\tif x < y then x ∷ merge xs₁ ys\\r\\n\\t\\t\\t\\t\\t else y ∷ merge xs ys₁\"\n]\n\n----------------------------------------------------\n\nFunctions in Agda are PURE and TOTAL.\nDifferent from Haskell, they can be *dependent* and they can receive implicit arguments.\nFunctions can be infix, or even mixfix, and they become operators.\nSo it is generally not possible to highlight all the \"operators\" as they are functions.\n(Also, types are functions too, so it is generally impossible to highlight types.)\n"
  },
  {
    "path": "tests/languages/agda/module_feature.test",
    "content": "module Test.test where\nimport Relation.Binary.PropositionalEquality as Eq\nopen Eq hiding (_≡_; refl)\nopen Eq.≡-Reasoning using (begin_; _≡⟨⟩_; _∎) renaming (begin_ to start_)\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"module\"],\n\t\" Test\",\n\t[\"punctuation\", \".\"],\n\t\"test \",\n\t[\"keyword\", \"where\"],\n\n\t[\"keyword\", \"import\"],\n\t\" Relation\",\n\t[\"punctuation\", \".\"],\n\t\"Binary\",\n\t[\"punctuation\", \".\"],\n\t\"PropositionalEquality as Eq\\r\\n\",\n\n\t[\"keyword\", \"open\"],\n\t\" Eq \",\n\t[\"keyword\", \"hiding\"],\n\t[\"punctuation\", \"(\"],\n\t\"_≡_\",\n\t[\"punctuation\", \";\"],\n\t\" refl\",\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"open\"],\n\t\" Eq\",\n\t[\"punctuation\", \".\"],\n\t\"≡-Reasoning \",\n\t[\"keyword\", \"using\"],\n\t[\"punctuation\", \"(\"],\n\t\"begin_\",\n\t[\"punctuation\", \";\"],\n\t\" _≡⟨⟩_\",\n\t[\"punctuation\", \";\"],\n\t\" _∎\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"renaming\"],\n\t[\"punctuation\", \"(\"],\n\t\"begin_ to start_\",\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nAgda's module system is one based on namespaces and corresponding to file structure.\nIt supports namespace importing, open importing, partial hiding/using and renaming.\n"
  },
  {
    "path": "tests/languages/agda/record_feature.test",
    "content": "record Fin (n : Nat) : Set where\n\tconstructor _[_]\n\tfield\n\t\t⟦_⟧   : Nat\n\t\tproof : suc ⟦_⟧ ≤ n\nopen Fin\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"record\"],\n\t[\"class-name\", \"Fin\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"n \"],\n\t[\"operator\", \":\"],\n\t\" Nat\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \":\"],\n\t[\"keyword\", \"Set\"],\n\t[\"keyword\", \"where\"],\n\n\t[\"keyword\", \"constructor\"],\n\t\" _[_]\\r\\n\\t\",\n\n\t[\"keyword\", \"field\"],\n\n\t[\"function\", \"⟦_⟧   \"],\n\t[\"operator\", \":\"],\n\t\" Nat\\r\\n\\t\\t\",\n\n\t[\"function\", \"proof \"],\n\t[\"operator\", \":\"],\n\t\" suc ⟦_⟧ ≤ n\\r\\n\",\n\n\t[\"keyword\", \"open\"],\n\t\" Fin\"\n]\n\n----------------------------------------------------\n\nAgda's record is like objects, but different in many aspects and much more powerful.\n"
  },
  {
    "path": "tests/languages/al/boolean_feature.test",
    "content": "false\ntrue\nFALSE\nTRUE\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"false\"],\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"FALSE\"],\n\t[\"boolean\", \"TRUE\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans.\n"
  },
  {
    "path": "tests/languages/al/class-name_feature.test",
    "content": "automation\nbiginteger\nbigtext\nblob\nboolean\nbyte\nchar\nclienttype\ncode\ncompletiontriggererrorlevel\nconnectiontype\ndatabase\ndataclassification\ndatascope\ndate\ndateformula\ndatetime\ndecimal\ndefaultlayout\ndialog\ndictionary\ndotnetassembly\ndotnettypedeclaration\nduration\nerrorinfo\nerrortype\nexecutioncontext\nexecutionmode\nfieldclass\nfieldref\nfieldtype\nfile\nfilterpagebuilder\nguid\nhttpclient\nhttpcontent\nhttpheaders\nhttprequestmessage\nhttpresponsemessage\ninstream\ninteger\njoker\njsonarray\njsonobject\njsontoken\njsonvalue\nkeyref\nlist\nmoduledependencyinfo\nmoduleinfo\nnone\nnotification\nnotificationscope\nobjecttype\noption\noutstream\npageresult\nrecord\nrecordid\nrecordref\nreportformat\nsecurityfilter\nsessionsettings\ntableconnectiontype\ntablefilter\ntestaction\ntestfield\ntestfilterfield\ntestpage\ntestpermissions\ntestrequestpage\ntext\ntextbuilder\ntextconst\ntextencoding\ntime\ntransactionmodel\ntransactiontype\nvariant\nverbosity\nversion\nview\nviews\nwebserviceactioncontext\nwebserviceactionresultcode\nxmlattribute\nxmlattributecollection\nxmlcdata\nxmlcomment\nxmldeclaration\nxmldocument\nxmldocumenttype\nxmlelement\nxmlnamespacemanager\nxmlnametable\nxmlnode\nxmlnodelist\nxmlprocessinginstruction\nxmlreadoptions\nxmltext\nxmlwriteoptions\n\n----------------------------------------------------\n\n[\n\t[\"class-name\", \"automation\"],\n\t[\"class-name\", \"biginteger\"],\n\t[\"class-name\", \"bigtext\"],\n\t[\"class-name\", \"blob\"],\n\t[\"class-name\", \"boolean\"],\n\t[\"class-name\", \"byte\"],\n\t[\"class-name\", \"char\"],\n\t[\"class-name\", \"clienttype\"],\n\t[\"class-name\", \"code\"],\n\t[\"class-name\", \"completiontriggererrorlevel\"],\n\t[\"class-name\", \"connectiontype\"],\n\t[\"class-name\", \"database\"],\n\t[\"class-name\", \"dataclassification\"],\n\t[\"class-name\", \"datascope\"],\n\t[\"class-name\", \"date\"],\n\t[\"class-name\", \"dateformula\"],\n\t[\"class-name\", \"datetime\"],\n\t[\"class-name\", \"decimal\"],\n\t[\"class-name\", \"defaultlayout\"],\n\t[\"class-name\", \"dialog\"],\n\t[\"class-name\", \"dictionary\"],\n\t[\"class-name\", \"dotnetassembly\"],\n\t[\"class-name\", \"dotnettypedeclaration\"],\n\t[\"class-name\", \"duration\"],\n\t[\"class-name\", \"errorinfo\"],\n\t[\"class-name\", \"errortype\"],\n\t[\"class-name\", \"executioncontext\"],\n\t[\"class-name\", \"executionmode\"],\n\t[\"class-name\", \"fieldclass\"],\n\t[\"class-name\", \"fieldref\"],\n\t[\"class-name\", \"fieldtype\"],\n\t[\"class-name\", \"file\"],\n\t[\"class-name\", \"filterpagebuilder\"],\n\t[\"class-name\", \"guid\"],\n\t[\"class-name\", \"httpclient\"],\n\t[\"class-name\", \"httpcontent\"],\n\t[\"class-name\", \"httpheaders\"],\n\t[\"class-name\", \"httprequestmessage\"],\n\t[\"class-name\", \"httpresponsemessage\"],\n\t[\"class-name\", \"instream\"],\n\t[\"class-name\", \"integer\"],\n\t[\"class-name\", \"joker\"],\n\t[\"class-name\", \"jsonarray\"],\n\t[\"class-name\", \"jsonobject\"],\n\t[\"class-name\", \"jsontoken\"],\n\t[\"class-name\", \"jsonvalue\"],\n\t[\"class-name\", \"keyref\"],\n\t[\"class-name\", \"list\"],\n\t[\"class-name\", \"moduledependencyinfo\"],\n\t[\"class-name\", \"moduleinfo\"],\n\t[\"class-name\", \"none\"],\n\t[\"class-name\", \"notification\"],\n\t[\"class-name\", \"notificationscope\"],\n\t[\"class-name\", \"objecttype\"],\n\t[\"class-name\", \"option\"],\n\t[\"class-name\", \"outstream\"],\n\t[\"class-name\", \"pageresult\"],\n\t[\"class-name\", \"record\"],\n\t[\"class-name\", \"recordid\"],\n\t[\"class-name\", \"recordref\"],\n\t[\"class-name\", \"reportformat\"],\n\t[\"class-name\", \"securityfilter\"],\n\t[\"class-name\", \"sessionsettings\"],\n\t[\"class-name\", \"tableconnectiontype\"],\n\t[\"class-name\", \"tablefilter\"],\n\t[\"class-name\", \"testaction\"],\n\t[\"class-name\", \"testfield\"],\n\t[\"class-name\", \"testfilterfield\"],\n\t[\"class-name\", \"testpage\"],\n\t[\"class-name\", \"testpermissions\"],\n\t[\"class-name\", \"testrequestpage\"],\n\t[\"class-name\", \"text\"],\n\t[\"class-name\", \"textbuilder\"],\n\t[\"class-name\", \"textconst\"],\n\t[\"class-name\", \"textencoding\"],\n\t[\"class-name\", \"time\"],\n\t[\"class-name\", \"transactionmodel\"],\n\t[\"class-name\", \"transactiontype\"],\n\t[\"class-name\", \"variant\"],\n\t[\"class-name\", \"verbosity\"],\n\t[\"class-name\", \"version\"],\n\t[\"class-name\", \"view\"],\n\t[\"class-name\", \"views\"],\n\t[\"class-name\", \"webserviceactioncontext\"],\n\t[\"class-name\", \"webserviceactionresultcode\"],\n\t[\"class-name\", \"xmlattribute\"],\n\t[\"class-name\", \"xmlattributecollection\"],\n\t[\"class-name\", \"xmlcdata\"],\n\t[\"class-name\", \"xmlcomment\"],\n\t[\"class-name\", \"xmldeclaration\"],\n\t[\"class-name\", \"xmldocument\"],\n\t[\"class-name\", \"xmldocumenttype\"],\n\t[\"class-name\", \"xmlelement\"],\n\t[\"class-name\", \"xmlnamespacemanager\"],\n\t[\"class-name\", \"xmlnametable\"],\n\t[\"class-name\", \"xmlnode\"],\n\t[\"class-name\", \"xmlnodelist\"],\n\t[\"class-name\", \"xmlprocessinginstruction\"],\n\t[\"class-name\", \"xmlreadoptions\"],\n\t[\"class-name\", \"xmltext\"],\n\t[\"class-name\", \"xmlwriteoptions\"]\n]\n\n----------------------------------------------------\n\nChecks for class names.\n"
  },
  {
    "path": "tests/languages/al/comment_feature.test",
    "content": "// comment\n/**/\n/*\n comment\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// comment\"],\n\t[\"comment\", \"/**/\"],\n\t[\"comment\", \"/*\\r\\n comment\\r\\n*/\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/al/function_feature.test",
    "content": "procedure CallJavaScript(i : integer; s: text; d : decimal; c : char);\nlocal procedure AssignGlobalToLocal(var addin : ControlAddIn TestAddIn)\ntrigger Callback(i : integer; s: text; d : decimal; c : char)\ntrigger OnAction();\nevent Callback(i : integer; s: text; d : decimal; c : char);\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"procedure\"],\n\t[\"function\", \"CallJavaScript\"],\n\t[\"punctuation\", \"(\"],\n\t\"i \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"integer\"],\n\t[\"punctuation\", \";\"],\n\t\" s\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"text\"],\n\t[\"punctuation\", \";\"],\n\t\" d \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"decimal\"],\n\t[\"punctuation\", \";\"],\n\t\" c \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"char\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"local\"],\n\t[\"keyword\", \"procedure\"],\n\t[\"function\", \"AssignGlobalToLocal\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"var\"],\n\t\" addin \",\n\t[\"punctuation\", \":\"],\n\t[\"keyword\", \"ControlAddIn\"],\n\t\" TestAddIn\",\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"trigger\"],\n\t[\"function\", \"Callback\"],\n\t[\"punctuation\", \"(\"],\n\t\"i \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"integer\"],\n\t[\"punctuation\", \";\"],\n\t\" s\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"text\"],\n\t[\"punctuation\", \";\"],\n\t\" d \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"decimal\"],\n\t[\"punctuation\", \";\"],\n\t\" c \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"char\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"trigger\"],\n\t[\"function\", \"OnAction\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"event\"],\n\t[\"function\", \"Callback\"],\n\t[\"punctuation\", \"(\"],\n\t\"i \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"integer\"],\n\t[\"punctuation\", \";\"],\n\t\" s\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"text\"],\n\t[\"punctuation\", \";\"],\n\t\" d \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"decimal\"],\n\t[\"punctuation\", \";\"],\n\t\" c \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"char\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for functions.\n"
  },
  {
    "path": "tests/languages/al/keyword_feature.test",
    "content": "array\nasserterror\nbegin\nbreak\ncase\ndo\ndownto\nelse\nend\nevent\nexit\nfor\nforeach\nfunction\nif\nimplements\nin\nindataset\ninterface\ninternal\nlocal\nof\nprocedure\nprogram\nprotected\nrepeat\nrunonclient\nsecurityfiltering\nsuppressdispose\ntemporary\nthen\nto\ntrigger\nuntil\nvar\nwhile\nwith\nwithevents\n\naction\nactions\naddafter\naddbefore\naddfirst\naddlast\narea\nassembly\nchartpart\ncodeunit\ncolumn\ncontroladdin\ncuegroup\ncustomizes\ndataitem\ndataset\ndotnet\nelements\nenum\nenumextension\nextends\nfield\nfieldattribute\nfieldelement\nfieldgroup\nfieldgroups\nfields\nfilter\nfixed\ngrid\ngroup\nkey\nkeys\nlabel\nlabels\nlayout\nmodify\nmoveafter\nmovebefore\nmovefirst\nmovelast\npage\npagecustomization\npageextension\npart\nprofile\nquery\nrepeater\nreport\nrequestpage\nschema\nseparator\nsystempart\ntable\ntableelement\ntableextension\ntextattribute\ntextelement\ntype\nusercontrol\nvalue\nxmlport\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"array\"],\n\t[\"keyword\", \"asserterror\"],\n\t[\"keyword\", \"begin\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"do\"],\n\t[\"keyword\", \"downto\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"end\"],\n\t[\"keyword\", \"event\"],\n\t[\"keyword\", \"exit\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"foreach\"],\n\t[\"keyword\", \"function\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"implements\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"indataset\"],\n\t[\"keyword\", \"interface\"],\n\t[\"keyword\", \"internal\"],\n\t[\"keyword\", \"local\"],\n\t[\"keyword\", \"of\"],\n\t[\"keyword\", \"procedure\"],\n\t[\"keyword\", \"program\"],\n\t[\"keyword\", \"protected\"],\n\t[\"keyword\", \"repeat\"],\n\t[\"keyword\", \"runonclient\"],\n\t[\"keyword\", \"securityfiltering\"],\n\t[\"keyword\", \"suppressdispose\"],\n\t[\"keyword\", \"temporary\"],\n\t[\"keyword\", \"then\"],\n\t[\"keyword\", \"to\"],\n\t[\"keyword\", \"trigger\"],\n\t[\"keyword\", \"until\"],\n\t[\"keyword\", \"var\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"with\"],\n\t[\"keyword\", \"withevents\"],\n\t[\"keyword\", \"action\"],\n\t[\"keyword\", \"actions\"],\n\t[\"keyword\", \"addafter\"],\n\t[\"keyword\", \"addbefore\"],\n\t[\"keyword\", \"addfirst\"],\n\t[\"keyword\", \"addlast\"],\n\t[\"keyword\", \"area\"],\n\t[\"keyword\", \"assembly\"],\n\t[\"keyword\", \"chartpart\"],\n\t[\"keyword\", \"codeunit\"],\n\t[\"keyword\", \"column\"],\n\t[\"keyword\", \"controladdin\"],\n\t[\"keyword\", \"cuegroup\"],\n\t[\"keyword\", \"customizes\"],\n\t[\"keyword\", \"dataitem\"],\n\t[\"keyword\", \"dataset\"],\n\t[\"keyword\", \"dotnet\"],\n\t[\"keyword\", \"elements\"],\n\t[\"keyword\", \"enum\"],\n\t[\"keyword\", \"enumextension\"],\n\t[\"keyword\", \"extends\"],\n\t[\"keyword\", \"field\"],\n\t[\"keyword\", \"fieldattribute\"],\n\t[\"keyword\", \"fieldelement\"],\n\t[\"keyword\", \"fieldgroup\"],\n\t[\"keyword\", \"fieldgroups\"],\n\t[\"keyword\", \"fields\"],\n\t[\"keyword\", \"filter\"],\n\t[\"keyword\", \"fixed\"],\n\t[\"keyword\", \"grid\"],\n\t[\"keyword\", \"group\"],\n\t[\"keyword\", \"key\"],\n\t[\"keyword\", \"keys\"],\n\t[\"keyword\", \"label\"],\n\t[\"keyword\", \"labels\"],\n\t[\"keyword\", \"layout\"],\n\t[\"keyword\", \"modify\"],\n\t[\"keyword\", \"moveafter\"],\n\t[\"keyword\", \"movebefore\"],\n\t[\"keyword\", \"movefirst\"],\n\t[\"keyword\", \"movelast\"],\n\t[\"keyword\", \"page\"],\n\t[\"keyword\", \"pagecustomization\"],\n\t[\"keyword\", \"pageextension\"],\n\t[\"keyword\", \"part\"],\n\t[\"keyword\", \"profile\"],\n\t[\"keyword\", \"query\"],\n\t[\"keyword\", \"repeater\"],\n\t[\"keyword\", \"report\"],\n\t[\"keyword\", \"requestpage\"],\n\t[\"keyword\", \"schema\"],\n\t[\"keyword\", \"separator\"],\n\t[\"keyword\", \"systempart\"],\n\t[\"keyword\", \"table\"],\n\t[\"keyword\", \"tableelement\"],\n\t[\"keyword\", \"tableextension\"],\n\t[\"keyword\", \"textattribute\"],\n\t[\"keyword\", \"textelement\"],\n\t[\"keyword\", \"type\"],\n\t[\"keyword\", \"usercontrol\"],\n\t[\"keyword\", \"value\"],\n\t[\"keyword\", \"xmlport\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords and other literals which behave like keywords.\n"
  },
  {
    "path": "tests/languages/al/operator_feature.test",
    "content": "+ - * /\n+= -= *= /=\n\n< <= > >= <> =\n\n:=\n::\n\n100..100\n\nAND DIV MOD NOT OR XOR\nand div mod not or xor\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<>\"],\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \":=\"],\n\t[\"operator\", \"::\"],\n\n\t[\"number\", \"100\"],\n\t[\"operator\", \"..\"],\n\t[\"number\", \"100\"],\n\n\t[\"operator\", \"AND\"],\n\t[\"operator\", \"DIV\"],\n\t[\"operator\", \"MOD\"],\n\t[\"operator\", \"NOT\"],\n\t[\"operator\", \"OR\"],\n\t[\"operator\", \"XOR\"],\n\t[\"operator\", \"and\"],\n\t[\"operator\", \"div\"],\n\t[\"operator\", \"mod\"],\n\t[\"operator\", \"not\"],\n\t[\"operator\", \"or\"],\n\t[\"operator\", \"xor\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/al/string_feature.test",
    "content": "''\n\"\"\n'foo'\n\"bar\"\n\n'C:\\text.txt'\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"''\"],\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"'foo'\"],\n\t[\"string\", \"\\\"bar\\\"\"],\n\t[\"string\", \"'C:\\\\text.txt'\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/al/variable_feature.test",
    "content": "CurrFieldNo\nCurrPage\nCurrReport\nRequestOptionsPage\nRec\nxRec\n\n----------------------------------------------------\n\n[\n\t[\"variable\", \"CurrFieldNo\"],\n\t[\"variable\", \"CurrPage\"],\n\t[\"variable\", \"CurrReport\"],\n\t[\"variable\", \"RequestOptionsPage\"],\n\t[\"variable\", \"Rec\"],\n\t[\"variable\", \"xRec\"]\n]\n\n----------------------------------------------------\n\nChecks for variables.\n"
  },
  {
    "path": "tests/languages/antlr4/action_feature.test",
    "content": "options { superClass = LexerAdaptor; }\n\n@lexer::header {\n  import { Token } from 'antlr4ts/Token';\n  import { CommonToken } from 'antlr4ts/CommonToken';\n  import { Python3Parser } from './Python3Parser';\n}\n\nEND : 'end' {System.out.println(\"found an end\");} ;\n\n@header {\nfrom LexerAdaptor import LexerAdaptor\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"options\"],\n\t[\"action\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"content\", \" superClass = LexerAdaptor; \"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t[\"annotation\", \"@lexer::header\"],\n\t[\"action\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"content\", \"\\r\\n  import { Token } from 'antlr4ts/Token';\\r\\n  import { CommonToken } from 'antlr4ts/CommonToken';\\r\\n  import { Python3Parser } from './Python3Parser';\\r\\n\"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t[\"definition\", \"END\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'end'\"],\n\t[\"action\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"content\", \"System.out.println(\\\"found an end\\\");\"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"annotation\", \"@header\"],\n\t[\"action\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"content\", \"\\r\\nfrom LexerAdaptor import LexerAdaptor\\r\\n\"],\n\t\t[\"punctuation\", \"}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for actions.\n"
  },
  {
    "path": "tests/languages/antlr4/annotation_feature.test",
    "content": "@header {}\n@lexer::header {}\n\n----------------------------------------------------\n\n[\n\t[\"annotation\", \"@header\"],\n\t[\"action\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\t[\"annotation\", \"@lexer::header\"],\n\t[\"action\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"punctuation\", \"}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for annotations.\n"
  },
  {
    "path": "tests/languages/antlr4/character-class_feature.test",
    "content": "[abc]\n[\\r\\n\\\\\\]]\n[a-z]\n[+-] [-+]\n[\\uFFFF\\u{10FFFF}\\p{Block=Latin_1_Supplement}]\n\n----------------------------------------------------\n\n[\n\t[\"character-class\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t\"abc\",\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"character-class\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"escape\", \"\\\\r\"],\n\t\t[\"escape\", \"\\\\n\"],\n\t\t[\"escape\", \"\\\\\\\\\"],\n\t\t[\"escape\", \"\\\\]\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"character-class\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t\"a\",\n\t\t[\"range\", \"-\"],\n\t\t\"z\",\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"character-class\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t\"+-\",\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"character-class\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t\"-+\",\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"character-class\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"escape\", \"\\\\uFFFF\"],\n\t\t[\"escape\", \"\\\\u{10FFFF}\"],\n\t\t[\"escape\", \"\\\\p{Block=Latin_1_Supplement}\"],\n\t\t[\"punctuation\", \"]\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for character classes.\n"
  },
  {
    "path": "tests/languages/antlr4/command_feature.test",
    "content": "WS : [ \\t]+ -> skip ;\n\nOPEN        : '<' -> pushMode(INSIDE) ;\nXMLDeclOpen : '<?xml' S -> pushMode(INSIDE) ;\nSPECIAL_OPEN: '<?' Name -> more, pushMode(PROC_INSTR) ;\n\nmode INSIDE;\nCLOSE        : '>' -> popMode ;\nSPECIAL_CLOSE: '?>' -> popMode ;\nSLASH_CLOSE  : '/>' -> popMode ;\n\nLQUOTE : '\"' -> more, mode(STR) ;\nWS : [ \\t]+ -> skip ;\nmode STR;\nSTRING : '\"' -> mode(DEFAULT_MODE) ;\nTEXT : . -> more ;\n\nDOUBLE : '\"' .*? '\"'   -> type(STRING) ;\nSINGLE : '\\'' .*? '\\'' -> type(STRING) ;\nWS     : [ \\t]+    -> skip ;\n\nWS : [ \\t]+ -> channel(HIDDEN) ;\n\n----------------------------------------------------\n\n[\n\t[\"definition\", \"WS\"],\n\t[\"punctuation\", \":\"],\n\t[\"character-class\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"escape\", \"\\\\t\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"skip\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"OPEN\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'<'\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"pushMode\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"INSIDE\",\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"XMLDeclOpen\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'<?xml'\"],\n\t[\"constant\", \"S\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"pushMode\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"INSIDE\",\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"SPECIAL_OPEN\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'<?'\"],\n\t\" Name \",\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"more\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"function\", \"pushMode\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"PROC_INSTR\",\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"mode\"],\n\t[\"constant\", \"INSIDE\"],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"CLOSE\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'>'\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"popMode\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"SPECIAL_CLOSE\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'?>'\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"popMode\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"SLASH_CLOSE\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'/>'\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"popMode\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"LQUOTE\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'\\\"'\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"more\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"function\", \"mode\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"STR\",\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"WS\"],\n\t[\"punctuation\", \":\"],\n\t[\"character-class\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"escape\", \"\\\\t\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"skip\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"mode\"],\n\t[\"constant\", \"STR\"],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"STRING\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'\\\"'\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"mode\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"DEFAULT_MODE\",\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"TEXT\"],\n\t[\"punctuation\", \":\"],\n\t\" . \",\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"more\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"DOUBLE\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'\\\"'\"],\n\t\" .\",\n\t[\"operator\", \"*?\"],\n\t[\"string\", \"'\\\"'\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"type\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"STRING\",\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"SINGLE\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'\\\\''\"],\n\t\" .\",\n\t[\"operator\", \"*?\"],\n\t[\"string\", \"'\\\\''\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"type\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"STRING\",\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"WS\"],\n\t[\"punctuation\", \":\"],\n\t[\"character-class\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"escape\", \"\\\\t\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"skip\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"WS\"],\n\t[\"punctuation\", \":\"],\n\t[\"character-class\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"escape\", \"\\\\t\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"->\"],\n\t[\"command\", [\n\t\t[\"function\", \"channel\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"HIDDEN\",\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for commands.\n"
  },
  {
    "path": "tests/languages/antlr4/comment_feature.test",
    "content": "// comment\n/*\n comment\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// comment\"],\n\t[\"comment\", \"/*\\r\\n comment\\r\\n*/\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/antlr4/definition_feature.test",
    "content": "foo : FOO ;\nFOO : BAR ;\nfragment BAR : 'bar' ;\n\n----------------------------------------------------\n\n[\n\t[\"definition\", \"foo\"],\n\t[\"punctuation\", \":\"],\n\t[\"constant\", \"FOO\"],\n\t[\"punctuation\", \";\"],\n\t[\"definition\", \"FOO\"],\n\t[\"punctuation\", \":\"],\n\t[\"constant\", \"BAR\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"fragment\"],\n\t[\"definition\", \"BAR\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'bar'\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for token and rule definitions.\n"
  },
  {
    "path": "tests/languages/antlr4/keyword_feature.test",
    "content": "catch\nchannels\nfinally\nfragment\ngrammar\nimport\nlexer\nlocals\nmode\noptions\nparser\nreturns\nthrows\ntokens\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"catch\"],\n\t[\"keyword\", \"channels\"],\n\t[\"keyword\", \"finally\"],\n\t[\"keyword\", \"fragment\"],\n\t[\"keyword\", \"grammar\"],\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"lexer\"],\n\t[\"keyword\", \"locals\"],\n\t[\"keyword\", \"mode\"],\n\t[\"keyword\", \"options\"],\n\t[\"keyword\", \"parser\"],\n\t[\"keyword\", \"returns\"],\n\t[\"keyword\", \"throws\"],\n\t[\"keyword\", \"tokens\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/antlr4/label_feature.test",
    "content": "stat: 'return' e ';' # Return\n\t| 'break' ';' # Break\n\t;\ne   : e '*' e # Mult\n\t| e '+' e # Add\n\t| INT # Int\n\t;\n\n----------------------------------------------------\n\n[\n\t[\"definition\", \"stat\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"'return'\"],\n\t\" e \",\n\t[\"string\", \"';'\"],\n\t[\"label\", \"# Return\"],\n\t[\"operator\", \"|\"],\n\t[\"string\", \"'break'\"],\n\t[\"string\", \"';'\"],\n\t[\"label\", \"# Break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"definition\", \"e\"],\n\t[\"punctuation\", \":\"],\n\t\" e \",\n\t[\"string\", \"'*'\"],\n\t\" e \",\n\t[\"label\", \"# Mult\"],\n\t[\"operator\", \"|\"],\n\t\" e \",\n\t[\"string\", \"'+'\"],\n\t\" e \",\n\t[\"label\", \"# Add\"],\n\t[\"operator\", \"|\"],\n\t[\"constant\", \"INT\"],\n\t[\"label\", \"# Int\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for labels.\n"
  },
  {
    "path": "tests/languages/antlr4/operator_feature.test",
    "content": "* + ?\n*? +? ??\n\n| ~ ..\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"?\"],\n\n\t[\"operator\", \"*?\"],\n\t[\"operator\", \"+?\"],\n\t[\"operator\", \"??\"],\n\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"..\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/antlr4/string_feature.test",
    "content": "'foo'\n'a'\n'\\''\n'\\r\\n'\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"'foo'\"],\n\t[\"string\", \"'a'\"],\n\t[\"string\", \"'\\\\''\"],\n\t[\"string\", \"'\\\\r\\\\n'\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/apacheconf/comment_feature.test",
    "content": "#foo\r\n# bar\r\n# Redirect 301 /2006/oldfile.html http://subdomain.domain.tld/newfile.html\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#foo\"],\r\n\t[\"comment\", \"# bar\"],\r\n\t[\"comment\", \"# Redirect 301 /2006/oldfile.html http://subdomain.domain.tld/newfile.html\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/apacheconf/directive-block_feature.test",
    "content": "<AuthnProviderAlias file file2>\r\n</AuthnProviderAlias>\r\n<AuthzProviderAlias ldap-group ldap-group-alias1 \"cn=my-group,o=ctx\">\r\n</AuthzProviderAlias>\r\n<Directory \"/webpages/secure\">\r\n</Directory>\r\n<DirectoryMatch \"^/www/(.+/)?[0-9]{3}\">\r\n</DirectoryMatch>\r\n<Else>\r\n</Else>\r\n<ElseIf \"-R '10.0.0.0/8'\">\r\n</ElseIf>\r\n<Files ~ \"\\.(gif|jpe?g|png)$\">\r\n</Files>\r\n<FilesMatch \".+\\.(gif|jpe?g|png)$\">\r\n</FilesMatch>\r\n<If \"-z req('Host')\">\r\n</If>\r\n<IfDefine !MemCache>\r\n</IfDefine>\r\n<IfModule mod_rewrite.c>\r\n</IfModule>\r\n<IfVersion 2.1.0>\r\n</IfVersion>\r\n<Limit POST PUT DELETE>\r\n</Limit>\r\n<LimitExcept POST GET>\r\n</LimitExcept>\r\n<Location /private1>\r\n</Location>\r\n<LocationMatch \"/(extra|special)/data\">\r\n</LocationMatch>\r\n<Macro LocalAccessPolicy>\r\n</Macro>\r\n<Proxy \"*\">\r\n</Proxy>\r\n<RequireAll>\r\n</RequireAll>\r\n<RequireAny>\r\n</RequireAny>\r\n<RequireNone>\r\n</RequireNone>\r\n<VirtualHost [2001:db8::a00:20ff:fea7:ccea]:80>\r\n</VirtualHost>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"AuthnProviderAlias\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t\" file file2\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\"AuthnProviderAlias\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"<\"],\r\n            \"AuthzProviderAlias\"\r\n        ]],\r\n        [\"directive-block-parameter\", [\r\n            \" ldap-group ldap-group-alias1 \",\r\n            [\"string\", [\r\n                \"\\\"cn=my-group,o=ctx\\\"\"\r\n            ]]\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n    [\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"AuthzProviderAlias\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"Directory\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"/webpages/secure\\\"\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"Directory\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"DirectoryMatch\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"^/www/(.+/)?[0-9]{3}\\\"\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"DirectoryMatch\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"Else\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"Else\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"ElseIf\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"-R '10.0.0.0/8'\\\"\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"ElseIf\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"Files\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t\" ~ \",\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"\\\\.(gif|jpe?g|png)$\\\"\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"Files\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"FilesMatch\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\".+\\\\.(gif|jpe?g|png)$\\\"\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"FilesMatch\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"If\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"-z req('Host')\\\"\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"If\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"IfDefine\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t\" !MemCache\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"IfDefine\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"IfModule\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t\" mod_rewrite.c\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"IfModule\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"IfVersion\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t\" 2.1.0\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"IfVersion\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"Limit\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t\" POST PUT DELETE\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"Limit\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"LimitExcept\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t\" POST GET\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"LimitExcept\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"Location\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t\" /private1\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"Location\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"LocationMatch\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"/(extra|special)/data\\\"\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"LocationMatch\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"Macro\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t\" LocalAccessPolicy\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"Macro\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"Proxy\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"*\\\"\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"Proxy\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"RequireAll\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"RequireAll\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"RequireAny\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"RequireAny\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"RequireNone\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"RequireNone\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]],\r\n\r\n    [\"directive-block\", [\r\n\t\t[\"directive-block\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"VirtualHost\"\r\n\t\t]],\r\n\t\t[\"directive-block-parameter\", [\r\n\t\t\t\" [2001\",\r\n            [\"punctuation\", \":\"],\r\n            \"db8\",\r\n            [\"punctuation\", \":\"],\r\n            [\"punctuation\", \":\"],\r\n            \"a00\",\r\n            [\"punctuation\", \":\"],\r\n            \"20ff\",\r\n            [\"punctuation\", \":\"],\r\n            \"fea7\",\r\n            [\"punctuation\", \":\"],\r\n            \"ccea]\",\r\n            [\"punctuation\", \":\"],\r\n            \"80\"\r\n        ]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive-block\", [\r\n        [\"directive-block\", [\r\n            [\"punctuation\", \"</\"],\r\n            \"VirtualHost\"\r\n        ]],\r\n        [\"punctuation\", \">\"]\r\n    ]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directive blocks."
  },
  {
    "path": "tests/languages/apacheconf/directive-flags_feature.test",
    "content": "[OR]\r\n[L,QSA]\r\n[L,R=301,NC]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive-flags\", \"[OR]\"],\r\n\t[\"directive-flags\", \"[L,QSA]\"],\r\n\t[\"directive-flags\", \"[L,R=301,NC]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directive flags.\r\n"
  },
  {
    "path": "tests/languages/apacheconf/directive-inline_feature.test",
    "content": "AcceptFilter\r\nAcceptPathInfo\r\nAccessFileName\r\nAction\r\nAddAlt\r\nAddAltByEncoding\r\nAddAltByType\r\nAddCharset\r\nAddDefaultCharset\r\nAddDescription\r\nAddEncoding\r\nAddHandler\r\nAddIcon\r\nAddIconByEncoding\r\nAddIconByType\r\nAddInputFilter\r\nAddLanguage\r\nAddModuleInfo\r\nAddOutputFilter\r\nAddOutputFilterByType\r\nAddType\r\nAlias\r\nAliasMatch\r\nAllow\r\nAllowCONNECT\r\nAllowEncodedSlashes\r\nAllowMethods\r\nAllowOverride\r\nAllowOverrideList\r\nAnonymous\r\nAnonymous_LogEmail\r\nAnonymous_MustGiveEmail\r\nAnonymous_NoUserID\r\nAnonymous_VerifyEmail\r\nAsyncRequestWorkerFactor\r\nAuthBasicAuthoritative\r\nAuthBasicFake\r\nAuthBasicProvider\r\nAuthBasicUseDigestAlgorithm\r\nAuthDBDUserPWQuery\r\nAuthDBDUserRealmQuery\r\nAuthDBMGroupFile\r\nAuthDBMType\r\nAuthDBMUserFile\r\nAuthDigestAlgorithm\r\nAuthDigestDomain\r\nAuthDigestNonceLifetime\r\nAuthDigestProvider\r\nAuthDigestQop\r\nAuthDigestShmemSize\r\nAuthFormAuthoritative\r\nAuthFormBody\r\nAuthFormDisableNoStore\r\nAuthFormFakeBasicAuth\r\nAuthFormLocation\r\nAuthFormLoginRequiredLocation\r\nAuthFormLoginSuccessLocation\r\nAuthFormLogoutLocation\r\nAuthFormMethod\r\nAuthFormMimetype\r\nAuthFormPassword\r\nAuthFormProvider\r\nAuthFormSitePassphrase\r\nAuthFormSize\r\nAuthFormUsername\r\nAuthGroupFile\r\nAuthLDAPAuthorizePrefix\r\nAuthLDAPBindAuthoritative\r\nAuthLDAPBindDN\r\nAuthLDAPBindPassword\r\nAuthLDAPCharsetConfig\r\nAuthLDAPCompareAsUser\r\nAuthLDAPCompareDNOnServer\r\nAuthLDAPDereferenceAliases\r\nAuthLDAPGroupAttribute\r\nAuthLDAPGroupAttributeIsDN\r\nAuthLDAPInitialBindAsUser\r\nAuthLDAPInitialBindPattern\r\nAuthLDAPMaxSubGroupDepth\r\nAuthLDAPRemoteUserAttribute\r\nAuthLDAPRemoteUserIsDN\r\nAuthLDAPSearchAsUser\r\nAuthLDAPSubGroupAttribute\r\nAuthLDAPSubGroupClass\r\nAuthLDAPUrl\r\nAuthMerging\r\nAuthName\r\nAuthnCacheContext\r\nAuthnCacheEnable\r\nAuthnCacheProvideFor\r\nAuthnCacheSOCache\r\nAuthnCacheTimeout\r\nAuthnzFcgiCheckAuthnProvider\r\nAuthnzFcgiDefineProvider\r\nAuthType\r\nAuthUserFile\r\nAuthzDBDLoginToReferer\r\nAuthzDBDQuery\r\nAuthzDBDRedirectQuery\r\nAuthzDBMType\r\nAuthzSendForbiddenOnFailure\r\nBalancerGrowth\r\nBalancerInherit\r\nBalancerMember\r\nBalancerPersist\r\nBrowserMatch\r\nBrowserMatchNoCase\r\nBufferedLogs\r\nBufferSize\r\nCacheDefaultExpire\r\nCacheDetailHeader\r\nCacheDirLength\r\nCacheDirLevels\r\nCacheDisable\r\nCacheEnable\r\nCacheFile\r\nCacheHeader\r\nCacheIgnoreCacheControl\r\nCacheIgnoreHeaders\r\nCacheIgnoreNoLastMod\r\nCacheIgnoreQueryString\r\nCacheIgnoreURLSessionIdentifiers\r\nCacheKeyBaseURL\r\nCacheLastModifiedFactor\r\nCacheLock\r\nCacheLockMaxAge\r\nCacheLockPath\r\nCacheMaxExpire\r\nCacheMaxFileSize\r\nCacheMinExpire\r\nCacheMinFileSize\r\nCacheNegotiatedDocs\r\nCacheQuickHandler\r\nCacheReadSize\r\nCacheReadTime\r\nCacheRoot\r\nCacheSocache\r\nCacheSocacheMaxSize\r\nCacheSocacheMaxTime\r\nCacheSocacheMinTime\r\nCacheSocacheReadSize\r\nCacheSocacheReadTime\r\nCacheStaleOnError\r\nCacheStoreExpired\r\nCacheStoreNoStore\r\nCacheStorePrivate\r\nCGIDScriptTimeout\r\nCGIMapExtension\r\nCharsetDefault\r\nCharsetOptions\r\nCharsetSourceEnc\r\nCheckCaseOnly\r\nCheckSpelling\r\nChrootDir\r\nContentDigest\r\nCookieDomain\r\nCookieExpires\r\nCookieName\r\nCookieStyle\r\nCookieTracking\r\nCoreDumpDirectory\r\nCustomLog\r\nDav\r\nDavDepthInfinity\r\nDavGenericLockDB\r\nDavLockDB\r\nDavMinTimeout\r\nDBDExptime\r\nDBDInitSQL\r\nDBDKeep\r\nDBDMax\r\nDBDMin\r\nDBDParams\r\nDBDPersist\r\nDBDPrepareSQL\r\nDBDriver\r\nDefaultIcon\r\nDefaultLanguage\r\nDefaultRuntimeDir\r\nDefaultType\r\nDefine\r\nDeflateBufferSize\r\nDeflateCompressionLevel\r\nDeflateFilterNote\r\nDeflateInflateLimitRequestBody\r\nDeflateInflateRatioBurst\r\nDeflateInflateRatioLimit\r\nDeflateMemLevel\r\nDeflateWindowSize\r\nDeny\r\nDirectoryCheckHandler\r\nDirectoryIndex\r\nDirectoryIndexRedirect\r\nDirectorySlash\r\nDocumentRoot\r\nDTracePrivileges\r\nDumpIOInput\r\nDumpIOOutput\r\nEnableExceptionHook\r\nEnableMMAP\r\nEnableSendfile\r\nError\r\nErrorDocument\r\nErrorLog\r\nErrorLogFormat\r\nExample\r\nExpiresActive\r\nExpiresByType\r\nExpiresDefault\r\nExtendedStatus\r\nExtFilterDefine\r\nExtFilterOptions\r\nFallbackResource\r\nFileETag\r\nFilterChain\r\nFilterDeclare\r\nFilterProtocol\r\nFilterProvider\r\nFilterTrace\r\nForceLanguagePriority\r\nForceType\r\nForensicLog\r\nGprofDir\r\nGracefulShutdownTimeout\r\nGroup\r\nHeader\r\nHeaderName\r\nHeartbeatAddress\r\nHeartbeatListen\r\nHeartbeatMaxServers\r\nHeartbeatStorage\r\nHeartbeatStorage\r\nHostnameLookups\r\nIdentityCheck\r\nIdentityCheckTimeout\r\nImapBase\r\nImapDefault\r\nImapMenu\r\nInclude\r\nIncludeOptional\r\nIndexHeadInsert\r\nIndexIgnore\r\nIndexIgnoreReset\r\nIndexOptions\r\nIndexOrderDefault\r\nIndexStyleSheet\r\nInputSed\r\nISAPIAppendLogToErrors\r\nISAPIAppendLogToQuery\r\nISAPICacheFile\r\nISAPIFakeAsync\r\nISAPILogNotSupported\r\nISAPIReadAheadBuffer\r\nKeepAlive\r\nKeepAliveTimeout\r\nKeptBodySize\r\nLanguagePriority\r\nLDAPCacheEntries\r\nLDAPCacheTTL\r\nLDAPConnectionPoolTTL\r\nLDAPConnectionTimeout\r\nLDAPLibraryDebug\r\nLDAPOpCacheEntries\r\nLDAPOpCacheTTL\r\nLDAPReferralHopLimit\r\nLDAPReferrals\r\nLDAPRetries\r\nLDAPRetryDelay\r\nLDAPSharedCacheFile\r\nLDAPSharedCacheSize\r\nLDAPTimeout\r\nLDAPTrustedClientCert\r\nLDAPTrustedGlobalCert\r\nLDAPTrustedMode\r\nLDAPVerifyServerCert\r\nLimitInternalRecursion\r\nLimitRequestBody\r\nLimitRequestFields\r\nLimitRequestFieldSize\r\nLimitRequestLine\r\nLimitXMLRequestBody\r\nListen\r\nListenBackLog\r\nLoadFile\r\nLoadModule\r\nLogFormat\r\nLogLevel\r\nLogMessage\r\nLuaAuthzProvider\r\nLuaCodeCache\r\nLuaHookAccessChecker\r\nLuaHookAuthChecker\r\nLuaHookCheckUserID\r\nLuaHookFixups\r\nLuaHookInsertFilter\r\nLuaHookLog\r\nLuaHookMapToStorage\r\nLuaHookTranslateName\r\nLuaHookTypeChecker\r\nLuaInherit\r\nLuaInputFilter\r\nLuaMapHandler\r\nLuaOutputFilter\r\nLuaPackageCPath\r\nLuaPackagePath\r\nLuaQuickHandler\r\nLuaRoot\r\nLuaScope\r\nMaxConnectionsPerChild\r\nMaxKeepAliveRequests\r\nMaxMemFree\r\nMaxRangeOverlaps\r\nMaxRangeReversals\r\nMaxRanges\r\nMaxRequestWorkers\r\nMaxSpareServers\r\nMaxSpareThreads\r\nMaxThreads\r\nMergeTrailers\r\nMetaDir\r\nMetaFiles\r\nMetaSuffix\r\nMimeMagicFile\r\nMinSpareServers\r\nMinSpareThreads\r\nMMapFile\r\nModemStandard\r\nModMimeUsePathInfo\r\nMultiviewsMatch\r\nMutex\r\nNameVirtualHost\r\nNoProxy\r\nNWSSLTrustedCerts\r\nNWSSLUpgradeable\r\nOptions\r\nOrder\r\nOutputSed\r\nPassEnv\r\nPidFile\r\nPrivilegesMode\r\nProtocol\r\nProtocolEcho\r\nProxyAddHeaders\r\nProxyBadHeader\r\nProxyBlock\r\nProxyDomain\r\nProxyErrorOverride\r\nProxyExpressDBMFile\r\nProxyExpressDBMType\r\nProxyExpressEnable\r\nProxyFtpDirCharset\r\nProxyFtpEscapeWildcards\r\nProxyFtpListOnWildcard\r\nProxyHTMLBufSize\r\nProxyHTMLCharsetOut\r\nProxyHTMLDocType\r\nProxyHTMLEnable\r\nProxyHTMLEvents\r\nProxyHTMLExtended\r\nProxyHTMLFixups\r\nProxyHTMLInterp\r\nProxyHTMLLinks\r\nProxyHTMLMeta\r\nProxyHTMLStripComments\r\nProxyHTMLURLMap\r\nProxyIOBufferSize\r\nProxyMaxForwards\r\nProxyPass\r\nProxyPassInherit\r\nProxyPassInterpolateEnv\r\nProxyPassMatch\r\nProxyPassReverse\r\nProxyPassReverseCookieDomain\r\nProxyPassReverseCookiePath\r\nProxyPreserveHost\r\nProxyReceiveBufferSize\r\nProxyRemote\r\nProxyRemoteMatch\r\nProxyRequests\r\nProxySCGIInternalRedirect\r\nProxySCGISendfile\r\nProxySet\r\nProxySourceAddress\r\nProxyStatus\r\nProxyTimeout\r\nProxyVia\r\nReadmeName\r\nReceiveBufferSize\r\nRedirect\r\nRedirectMatch\r\nRedirectPermanent\r\nRedirectTemp\r\nReflectorHeader\r\nRemoteIPHeader\r\nRemoteIPInternalProxy\r\nRemoteIPInternalProxyList\r\nRemoteIPProxiesHeader\r\nRemoteIPTrustedProxy\r\nRemoteIPTrustedProxyList\r\nRemoveCharset\r\nRemoveEncoding\r\nRemoveHandler\r\nRemoveInputFilter\r\nRemoveLanguage\r\nRemoveOutputFilter\r\nRemoveType\r\nRequestHeader\r\nRequestReadTimeout\r\nRequire\r\nRewriteBase\r\nRewriteCond\r\nRewriteEngine\r\nRewriteMap\r\nRewriteOptions\r\nRewriteRule\r\nRLimitCPU\r\nRLimitMEM\r\nRLimitNPROC\r\nSatisfy\r\nScoreBoardFile\r\nScript\r\nScriptAlias\r\nScriptAliasMatch\r\nScriptInterpreterSource\r\nScriptLog\r\nScriptLogBuffer\r\nScriptLogLength\r\nScriptSock\r\nSecureListen\r\nSeeRequestTail\r\nSendBufferSize\r\nServerAdmin\r\nServerAlias\r\nServerLimit\r\nServerName\r\nServerPath\r\nServerRoot\r\nServerSignature\r\nServerTokens\r\nSession\r\nSessionCookieName\r\nSessionCookieName2\r\nSessionCookieRemove\r\nSessionCryptoCipher\r\nSessionCryptoDriver\r\nSessionCryptoPassphrase\r\nSessionCryptoPassphraseFile\r\nSessionDBDCookieName\r\nSessionDBDCookieName2\r\nSessionDBDCookieRemove\r\nSessionDBDDeleteLabel\r\nSessionDBDInsertLabel\r\nSessionDBDPerUser\r\nSessionDBDSelectLabel\r\nSessionDBDUpdateLabel\r\nSessionEnv\r\nSessionExclude\r\nSessionHeader\r\nSessionInclude\r\nSessionMaxAge\r\nSetEnv\r\nSetEnvIf\r\nSetEnvIfExpr\r\nSetEnvIfNoCase\r\nSetHandler\r\nSetInputFilter\r\nSetOutputFilter\r\nSSIEndTag\r\nSSIErrorMsg\r\nSSIETag\r\nSSILastModified\r\nSSILegacyExprParser\r\nSSIStartTag\r\nSSITimeFormat\r\nSSIUndefinedEcho\r\nSSLCACertificateFile\r\nSSLCACertificatePath\r\nSSLCADNRequestFile\r\nSSLCADNRequestPath\r\nSSLCARevocationCheck\r\nSSLCARevocationFile\r\nSSLCARevocationPath\r\nSSLCertificateChainFile\r\nSSLCertificateFile\r\nSSLCertificateKeyFile\r\nSSLCipherSuite\r\nSSLCompression\r\nSSLCryptoDevice\r\nSSLEngine\r\nSSLFIPS\r\nSSLHonorCipherOrder\r\nSSLInsecureRenegotiation\r\nSSLOCSPDefaultResponder\r\nSSLOCSPEnable\r\nSSLOCSPOverrideResponder\r\nSSLOCSPResponderTimeout\r\nSSLOCSPResponseMaxAge\r\nSSLOCSPResponseTimeSkew\r\nSSLOCSPUseRequestNonce\r\nSSLOpenSSLConfCmd\r\nSSLOptions\r\nSSLPassPhraseDialog\r\nSSLProtocol\r\nSSLProxyCACertificateFile\r\nSSLProxyCACertificatePath\r\nSSLProxyCARevocationCheck\r\nSSLProxyCARevocationFile\r\nSSLProxyCARevocationPath\r\nSSLProxyCheckPeerCN\r\nSSLProxyCheckPeerExpire\r\nSSLProxyCheckPeerName\r\nSSLProxyCipherSuite\r\nSSLProxyEngine\r\nSSLProxyMachineCertificateChainFile\r\nSSLProxyMachineCertificateFile\r\nSSLProxyMachineCertificatePath\r\nSSLProxyProtocol\r\nSSLProxyVerify\r\nSSLProxyVerifyDepth\r\nSSLRandomSeed\r\nSSLRenegBufferSize\r\nSSLRequire\r\nSSLRequireSSL\r\nSSLSessionCache\r\nSSLSessionCacheTimeout\r\nSSLSessionTicketKeyFile\r\nSSLSessionTickets\r\nSSLSRPUnknownUserSeed\r\nSSLSRPVerifierFile\r\nSSLStaplingCache\r\nSSLStaplingErrorCacheTimeout\r\nSSLStaplingFakeTryLater\r\nSSLStaplingForceURL\r\nSSLStaplingResponderTimeout\r\nSSLStaplingResponseMaxAge\r\nSSLStaplingResponseTimeSkew\r\nSSLStaplingReturnResponderErrors\r\nSSLStaplingStandardCacheTimeout\r\nSSLStrictSNIVHostCheck\r\nSSLUserName\r\nSSLUseStapling\r\nSSLVerifyClient\r\nSSLVerifyDepth\r\nStartServers\r\nStartThreads\r\nSubstitute\r\nSuexec\r\nSuexecUserGroup\r\nThreadLimit\r\nThreadsPerChild\r\nThreadStackSize\r\nTimeOut\r\nTraceEnable\r\nTransferLog\r\nTypesConfig\r\nUnDefine\r\nUndefMacro\r\nUnsetEnv\r\nUse\r\nUseCanonicalName\r\nUseCanonicalPhysicalPort\r\nUser\r\nUserDir\r\nVHostCGIMode\r\nVHostCGIPrivs\r\nVHostGroup\r\nVHostPrivs\r\nVHostSecure\r\nVHostUser\r\nVirtualDocumentRoot\r\nVirtualDocumentRootIP\r\nVirtualScriptAlias\r\nVirtualScriptAliasIP\r\nWatchdogInterval\r\nXBitHack\r\nxml2EncAlias\r\nxml2EncDefault\r\nxml2StartParse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive-inline\", \"AcceptFilter\"],\r\n\t[\"directive-inline\", \"AcceptPathInfo\"],\r\n\t[\"directive-inline\", \"AccessFileName\"],\r\n\t[\"directive-inline\", \"Action\"],\r\n\t[\"directive-inline\", \"AddAlt\"],\r\n\t[\"directive-inline\", \"AddAltByEncoding\"],\r\n\t[\"directive-inline\", \"AddAltByType\"],\r\n\t[\"directive-inline\", \"AddCharset\"],\r\n\t[\"directive-inline\", \"AddDefaultCharset\"],\r\n\t[\"directive-inline\", \"AddDescription\"],\r\n\t[\"directive-inline\", \"AddEncoding\"],\r\n\t[\"directive-inline\", \"AddHandler\"],\r\n\t[\"directive-inline\", \"AddIcon\"],\r\n\t[\"directive-inline\", \"AddIconByEncoding\"],\r\n\t[\"directive-inline\", \"AddIconByType\"],\r\n\t[\"directive-inline\", \"AddInputFilter\"],\r\n\t[\"directive-inline\", \"AddLanguage\"],\r\n\t[\"directive-inline\", \"AddModuleInfo\"],\r\n\t[\"directive-inline\", \"AddOutputFilter\"],\r\n\t[\"directive-inline\", \"AddOutputFilterByType\"],\r\n\t[\"directive-inline\", \"AddType\"],\r\n\t[\"directive-inline\", \"Alias\"],\r\n\t[\"directive-inline\", \"AliasMatch\"],\r\n\t[\"directive-inline\", \"Allow\"],\r\n\t[\"directive-inline\", \"AllowCONNECT\"],\r\n\t[\"directive-inline\", \"AllowEncodedSlashes\"],\r\n\t[\"directive-inline\", \"AllowMethods\"],\r\n\t[\"directive-inline\", \"AllowOverride\"],\r\n\t[\"directive-inline\", \"AllowOverrideList\"],\r\n\t[\"directive-inline\", \"Anonymous\"],\r\n\t[\"directive-inline\", \"Anonymous_LogEmail\"],\r\n\t[\"directive-inline\", \"Anonymous_MustGiveEmail\"],\r\n\t[\"directive-inline\", \"Anonymous_NoUserID\"],\r\n\t[\"directive-inline\", \"Anonymous_VerifyEmail\"],\r\n\t[\"directive-inline\", \"AsyncRequestWorkerFactor\"],\r\n\t[\"directive-inline\", \"AuthBasicAuthoritative\"],\r\n\t[\"directive-inline\", \"AuthBasicFake\"],\r\n\t[\"directive-inline\", \"AuthBasicProvider\"],\r\n\t[\"directive-inline\", \"AuthBasicUseDigestAlgorithm\"],\r\n\t[\"directive-inline\", \"AuthDBDUserPWQuery\"],\r\n\t[\"directive-inline\", \"AuthDBDUserRealmQuery\"],\r\n\t[\"directive-inline\", \"AuthDBMGroupFile\"],\r\n\t[\"directive-inline\", \"AuthDBMType\"],\r\n\t[\"directive-inline\", \"AuthDBMUserFile\"],\r\n\t[\"directive-inline\", \"AuthDigestAlgorithm\"],\r\n\t[\"directive-inline\", \"AuthDigestDomain\"],\r\n\t[\"directive-inline\", \"AuthDigestNonceLifetime\"],\r\n\t[\"directive-inline\", \"AuthDigestProvider\"],\r\n\t[\"directive-inline\", \"AuthDigestQop\"],\r\n\t[\"directive-inline\", \"AuthDigestShmemSize\"],\r\n\t[\"directive-inline\", \"AuthFormAuthoritative\"],\r\n\t[\"directive-inline\", \"AuthFormBody\"],\r\n\t[\"directive-inline\", \"AuthFormDisableNoStore\"],\r\n\t[\"directive-inline\", \"AuthFormFakeBasicAuth\"],\r\n\t[\"directive-inline\", \"AuthFormLocation\"],\r\n\t[\"directive-inline\", \"AuthFormLoginRequiredLocation\"],\r\n\t[\"directive-inline\", \"AuthFormLoginSuccessLocation\"],\r\n\t[\"directive-inline\", \"AuthFormLogoutLocation\"],\r\n\t[\"directive-inline\", \"AuthFormMethod\"],\r\n\t[\"directive-inline\", \"AuthFormMimetype\"],\r\n\t[\"directive-inline\", \"AuthFormPassword\"],\r\n\t[\"directive-inline\", \"AuthFormProvider\"],\r\n\t[\"directive-inline\", \"AuthFormSitePassphrase\"],\r\n\t[\"directive-inline\", \"AuthFormSize\"],\r\n\t[\"directive-inline\", \"AuthFormUsername\"],\r\n\t[\"directive-inline\", \"AuthGroupFile\"],\r\n\t[\"directive-inline\", \"AuthLDAPAuthorizePrefix\"],\r\n\t[\"directive-inline\", \"AuthLDAPBindAuthoritative\"],\r\n\t[\"directive-inline\", \"AuthLDAPBindDN\"],\r\n\t[\"directive-inline\", \"AuthLDAPBindPassword\"],\r\n\t[\"directive-inline\", \"AuthLDAPCharsetConfig\"],\r\n\t[\"directive-inline\", \"AuthLDAPCompareAsUser\"],\r\n\t[\"directive-inline\", \"AuthLDAPCompareDNOnServer\"],\r\n\t[\"directive-inline\", \"AuthLDAPDereferenceAliases\"],\r\n\t[\"directive-inline\", \"AuthLDAPGroupAttribute\"],\r\n\t[\"directive-inline\", \"AuthLDAPGroupAttributeIsDN\"],\r\n\t[\"directive-inline\", \"AuthLDAPInitialBindAsUser\"],\r\n\t[\"directive-inline\", \"AuthLDAPInitialBindPattern\"],\r\n\t[\"directive-inline\", \"AuthLDAPMaxSubGroupDepth\"],\r\n\t[\"directive-inline\", \"AuthLDAPRemoteUserAttribute\"],\r\n\t[\"directive-inline\", \"AuthLDAPRemoteUserIsDN\"],\r\n\t[\"directive-inline\", \"AuthLDAPSearchAsUser\"],\r\n\t[\"directive-inline\", \"AuthLDAPSubGroupAttribute\"],\r\n\t[\"directive-inline\", \"AuthLDAPSubGroupClass\"],\r\n\t[\"directive-inline\", \"AuthLDAPUrl\"],\r\n\t[\"directive-inline\", \"AuthMerging\"],\r\n\t[\"directive-inline\", \"AuthName\"],\r\n\t[\"directive-inline\", \"AuthnCacheContext\"],\r\n\t[\"directive-inline\", \"AuthnCacheEnable\"],\r\n\t[\"directive-inline\", \"AuthnCacheProvideFor\"],\r\n\t[\"directive-inline\", \"AuthnCacheSOCache\"],\r\n\t[\"directive-inline\", \"AuthnCacheTimeout\"],\r\n\t[\"directive-inline\", \"AuthnzFcgiCheckAuthnProvider\"],\r\n\t[\"directive-inline\", \"AuthnzFcgiDefineProvider\"],\r\n\t[\"directive-inline\", \"AuthType\"],\r\n\t[\"directive-inline\", \"AuthUserFile\"],\r\n\t[\"directive-inline\", \"AuthzDBDLoginToReferer\"],\r\n\t[\"directive-inline\", \"AuthzDBDQuery\"],\r\n\t[\"directive-inline\", \"AuthzDBDRedirectQuery\"],\r\n\t[\"directive-inline\", \"AuthzDBMType\"],\r\n\t[\"directive-inline\", \"AuthzSendForbiddenOnFailure\"],\r\n\t[\"directive-inline\", \"BalancerGrowth\"],\r\n\t[\"directive-inline\", \"BalancerInherit\"],\r\n\t[\"directive-inline\", \"BalancerMember\"],\r\n\t[\"directive-inline\", \"BalancerPersist\"],\r\n\t[\"directive-inline\", \"BrowserMatch\"],\r\n\t[\"directive-inline\", \"BrowserMatchNoCase\"],\r\n\t[\"directive-inline\", \"BufferedLogs\"],\r\n\t[\"directive-inline\", \"BufferSize\"],\r\n\t[\"directive-inline\", \"CacheDefaultExpire\"],\r\n\t[\"directive-inline\", \"CacheDetailHeader\"],\r\n\t[\"directive-inline\", \"CacheDirLength\"],\r\n\t[\"directive-inline\", \"CacheDirLevels\"],\r\n\t[\"directive-inline\", \"CacheDisable\"],\r\n\t[\"directive-inline\", \"CacheEnable\"],\r\n\t[\"directive-inline\", \"CacheFile\"],\r\n\t[\"directive-inline\", \"CacheHeader\"],\r\n\t[\"directive-inline\", \"CacheIgnoreCacheControl\"],\r\n\t[\"directive-inline\", \"CacheIgnoreHeaders\"],\r\n\t[\"directive-inline\", \"CacheIgnoreNoLastMod\"],\r\n\t[\"directive-inline\", \"CacheIgnoreQueryString\"],\r\n\t[\"directive-inline\", \"CacheIgnoreURLSessionIdentifiers\"],\r\n\t[\"directive-inline\", \"CacheKeyBaseURL\"],\r\n\t[\"directive-inline\", \"CacheLastModifiedFactor\"],\r\n\t[\"directive-inline\", \"CacheLock\"],\r\n\t[\"directive-inline\", \"CacheLockMaxAge\"],\r\n\t[\"directive-inline\", \"CacheLockPath\"],\r\n\t[\"directive-inline\", \"CacheMaxExpire\"],\r\n\t[\"directive-inline\", \"CacheMaxFileSize\"],\r\n\t[\"directive-inline\", \"CacheMinExpire\"],\r\n\t[\"directive-inline\", \"CacheMinFileSize\"],\r\n\t[\"directive-inline\", \"CacheNegotiatedDocs\"],\r\n\t[\"directive-inline\", \"CacheQuickHandler\"],\r\n\t[\"directive-inline\", \"CacheReadSize\"],\r\n\t[\"directive-inline\", \"CacheReadTime\"],\r\n\t[\"directive-inline\", \"CacheRoot\"],\r\n\t[\"directive-inline\", \"CacheSocache\"],\r\n\t[\"directive-inline\", \"CacheSocacheMaxSize\"],\r\n\t[\"directive-inline\", \"CacheSocacheMaxTime\"],\r\n\t[\"directive-inline\", \"CacheSocacheMinTime\"],\r\n\t[\"directive-inline\", \"CacheSocacheReadSize\"],\r\n\t[\"directive-inline\", \"CacheSocacheReadTime\"],\r\n\t[\"directive-inline\", \"CacheStaleOnError\"],\r\n\t[\"directive-inline\", \"CacheStoreExpired\"],\r\n\t[\"directive-inline\", \"CacheStoreNoStore\"],\r\n\t[\"directive-inline\", \"CacheStorePrivate\"],\r\n\t[\"directive-inline\", \"CGIDScriptTimeout\"],\r\n\t[\"directive-inline\", \"CGIMapExtension\"],\r\n\t[\"directive-inline\", \"CharsetDefault\"],\r\n\t[\"directive-inline\", \"CharsetOptions\"],\r\n\t[\"directive-inline\", \"CharsetSourceEnc\"],\r\n\t[\"directive-inline\", \"CheckCaseOnly\"],\r\n\t[\"directive-inline\", \"CheckSpelling\"],\r\n\t[\"directive-inline\", \"ChrootDir\"],\r\n\t[\"directive-inline\", \"ContentDigest\"],\r\n\t[\"directive-inline\", \"CookieDomain\"],\r\n\t[\"directive-inline\", \"CookieExpires\"],\r\n\t[\"directive-inline\", \"CookieName\"],\r\n\t[\"directive-inline\", \"CookieStyle\"],\r\n\t[\"directive-inline\", \"CookieTracking\"],\r\n\t[\"directive-inline\", \"CoreDumpDirectory\"],\r\n\t[\"directive-inline\", \"CustomLog\"],\r\n\t[\"directive-inline\", \"Dav\"],\r\n\t[\"directive-inline\", \"DavDepthInfinity\"],\r\n\t[\"directive-inline\", \"DavGenericLockDB\"],\r\n\t[\"directive-inline\", \"DavLockDB\"],\r\n\t[\"directive-inline\", \"DavMinTimeout\"],\r\n\t[\"directive-inline\", \"DBDExptime\"],\r\n\t[\"directive-inline\", \"DBDInitSQL\"],\r\n\t[\"directive-inline\", \"DBDKeep\"],\r\n\t[\"directive-inline\", \"DBDMax\"],\r\n\t[\"directive-inline\", \"DBDMin\"],\r\n\t[\"directive-inline\", \"DBDParams\"],\r\n\t[\"directive-inline\", \"DBDPersist\"],\r\n\t[\"directive-inline\", \"DBDPrepareSQL\"],\r\n\t[\"directive-inline\", \"DBDriver\"],\r\n\t[\"directive-inline\", \"DefaultIcon\"],\r\n\t[\"directive-inline\", \"DefaultLanguage\"],\r\n\t[\"directive-inline\", \"DefaultRuntimeDir\"],\r\n\t[\"directive-inline\", \"DefaultType\"],\r\n\t[\"directive-inline\", \"Define\"],\r\n\t[\"directive-inline\", \"DeflateBufferSize\"],\r\n\t[\"directive-inline\", \"DeflateCompressionLevel\"],\r\n\t[\"directive-inline\", \"DeflateFilterNote\"],\r\n\t[\"directive-inline\", \"DeflateInflateLimitRequestBody\"],\r\n\t[\"directive-inline\", \"DeflateInflateRatioBurst\"],\r\n\t[\"directive-inline\", \"DeflateInflateRatioLimit\"],\r\n\t[\"directive-inline\", \"DeflateMemLevel\"],\r\n\t[\"directive-inline\", \"DeflateWindowSize\"],\r\n\t[\"directive-inline\", \"Deny\"],\r\n\t[\"directive-inline\", \"DirectoryCheckHandler\"],\r\n\t[\"directive-inline\", \"DirectoryIndex\"],\r\n\t[\"directive-inline\", \"DirectoryIndexRedirect\"],\r\n\t[\"directive-inline\", \"DirectorySlash\"],\r\n\t[\"directive-inline\", \"DocumentRoot\"],\r\n\t[\"directive-inline\", \"DTracePrivileges\"],\r\n\t[\"directive-inline\", \"DumpIOInput\"],\r\n\t[\"directive-inline\", \"DumpIOOutput\"],\r\n\t[\"directive-inline\", \"EnableExceptionHook\"],\r\n\t[\"directive-inline\", \"EnableMMAP\"],\r\n\t[\"directive-inline\", \"EnableSendfile\"],\r\n\t[\"directive-inline\", \"Error\"],\r\n\t[\"directive-inline\", \"ErrorDocument\"],\r\n\t[\"directive-inline\", \"ErrorLog\"],\r\n\t[\"directive-inline\", \"ErrorLogFormat\"],\r\n\t[\"directive-inline\", \"Example\"],\r\n\t[\"directive-inline\", \"ExpiresActive\"],\r\n\t[\"directive-inline\", \"ExpiresByType\"],\r\n\t[\"directive-inline\", \"ExpiresDefault\"],\r\n\t[\"directive-inline\", \"ExtendedStatus\"],\r\n\t[\"directive-inline\", \"ExtFilterDefine\"],\r\n\t[\"directive-inline\", \"ExtFilterOptions\"],\r\n\t[\"directive-inline\", \"FallbackResource\"],\r\n\t[\"directive-inline\", \"FileETag\"],\r\n\t[\"directive-inline\", \"FilterChain\"],\r\n\t[\"directive-inline\", \"FilterDeclare\"],\r\n\t[\"directive-inline\", \"FilterProtocol\"],\r\n\t[\"directive-inline\", \"FilterProvider\"],\r\n\t[\"directive-inline\", \"FilterTrace\"],\r\n\t[\"directive-inline\", \"ForceLanguagePriority\"],\r\n\t[\"directive-inline\", \"ForceType\"],\r\n\t[\"directive-inline\", \"ForensicLog\"],\r\n\t[\"directive-inline\", \"GprofDir\"],\r\n\t[\"directive-inline\", \"GracefulShutdownTimeout\"],\r\n\t[\"directive-inline\", \"Group\"],\r\n\t[\"directive-inline\", \"Header\"],\r\n\t[\"directive-inline\", \"HeaderName\"],\r\n\t[\"directive-inline\", \"HeartbeatAddress\"],\r\n\t[\"directive-inline\", \"HeartbeatListen\"],\r\n\t[\"directive-inline\", \"HeartbeatMaxServers\"],\r\n\t[\"directive-inline\", \"HeartbeatStorage\"],\r\n\t[\"directive-inline\", \"HeartbeatStorage\"],\r\n\t[\"directive-inline\", \"HostnameLookups\"],\r\n\t[\"directive-inline\", \"IdentityCheck\"],\r\n\t[\"directive-inline\", \"IdentityCheckTimeout\"],\r\n\t[\"directive-inline\", \"ImapBase\"],\r\n\t[\"directive-inline\", \"ImapDefault\"],\r\n\t[\"directive-inline\", \"ImapMenu\"],\r\n\t[\"directive-inline\", \"Include\"],\r\n\t[\"directive-inline\", \"IncludeOptional\"],\r\n\t[\"directive-inline\", \"IndexHeadInsert\"],\r\n\t[\"directive-inline\", \"IndexIgnore\"],\r\n\t[\"directive-inline\", \"IndexIgnoreReset\"],\r\n\t[\"directive-inline\", \"IndexOptions\"],\r\n\t[\"directive-inline\", \"IndexOrderDefault\"],\r\n\t[\"directive-inline\", \"IndexStyleSheet\"],\r\n\t[\"directive-inline\", \"InputSed\"],\r\n\t[\"directive-inline\", \"ISAPIAppendLogToErrors\"],\r\n\t[\"directive-inline\", \"ISAPIAppendLogToQuery\"],\r\n\t[\"directive-inline\", \"ISAPICacheFile\"],\r\n\t[\"directive-inline\", \"ISAPIFakeAsync\"],\r\n\t[\"directive-inline\", \"ISAPILogNotSupported\"],\r\n\t[\"directive-inline\", \"ISAPIReadAheadBuffer\"],\r\n\t[\"directive-inline\", \"KeepAlive\"],\r\n\t[\"directive-inline\", \"KeepAliveTimeout\"],\r\n\t[\"directive-inline\", \"KeptBodySize\"],\r\n\t[\"directive-inline\", \"LanguagePriority\"],\r\n\t[\"directive-inline\", \"LDAPCacheEntries\"],\r\n\t[\"directive-inline\", \"LDAPCacheTTL\"],\r\n\t[\"directive-inline\", \"LDAPConnectionPoolTTL\"],\r\n\t[\"directive-inline\", \"LDAPConnectionTimeout\"],\r\n\t[\"directive-inline\", \"LDAPLibraryDebug\"],\r\n\t[\"directive-inline\", \"LDAPOpCacheEntries\"],\r\n\t[\"directive-inline\", \"LDAPOpCacheTTL\"],\r\n\t[\"directive-inline\", \"LDAPReferralHopLimit\"],\r\n\t[\"directive-inline\", \"LDAPReferrals\"],\r\n\t[\"directive-inline\", \"LDAPRetries\"],\r\n\t[\"directive-inline\", \"LDAPRetryDelay\"],\r\n\t[\"directive-inline\", \"LDAPSharedCacheFile\"],\r\n\t[\"directive-inline\", \"LDAPSharedCacheSize\"],\r\n\t[\"directive-inline\", \"LDAPTimeout\"],\r\n\t[\"directive-inline\", \"LDAPTrustedClientCert\"],\r\n\t[\"directive-inline\", \"LDAPTrustedGlobalCert\"],\r\n\t[\"directive-inline\", \"LDAPTrustedMode\"],\r\n\t[\"directive-inline\", \"LDAPVerifyServerCert\"],\r\n\t[\"directive-inline\", \"LimitInternalRecursion\"],\r\n\t[\"directive-inline\", \"LimitRequestBody\"],\r\n\t[\"directive-inline\", \"LimitRequestFields\"],\r\n\t[\"directive-inline\", \"LimitRequestFieldSize\"],\r\n\t[\"directive-inline\", \"LimitRequestLine\"],\r\n\t[\"directive-inline\", \"LimitXMLRequestBody\"],\r\n\t[\"directive-inline\", \"Listen\"],\r\n\t[\"directive-inline\", \"ListenBackLog\"],\r\n\t[\"directive-inline\", \"LoadFile\"],\r\n\t[\"directive-inline\", \"LoadModule\"],\r\n\t[\"directive-inline\", \"LogFormat\"],\r\n\t[\"directive-inline\", \"LogLevel\"],\r\n\t[\"directive-inline\", \"LogMessage\"],\r\n\t[\"directive-inline\", \"LuaAuthzProvider\"],\r\n\t[\"directive-inline\", \"LuaCodeCache\"],\r\n\t[\"directive-inline\", \"LuaHookAccessChecker\"],\r\n\t[\"directive-inline\", \"LuaHookAuthChecker\"],\r\n\t[\"directive-inline\", \"LuaHookCheckUserID\"],\r\n\t[\"directive-inline\", \"LuaHookFixups\"],\r\n\t[\"directive-inline\", \"LuaHookInsertFilter\"],\r\n\t[\"directive-inline\", \"LuaHookLog\"],\r\n\t[\"directive-inline\", \"LuaHookMapToStorage\"],\r\n\t[\"directive-inline\", \"LuaHookTranslateName\"],\r\n\t[\"directive-inline\", \"LuaHookTypeChecker\"],\r\n\t[\"directive-inline\", \"LuaInherit\"],\r\n\t[\"directive-inline\", \"LuaInputFilter\"],\r\n\t[\"directive-inline\", \"LuaMapHandler\"],\r\n\t[\"directive-inline\", \"LuaOutputFilter\"],\r\n\t[\"directive-inline\", \"LuaPackageCPath\"],\r\n\t[\"directive-inline\", \"LuaPackagePath\"],\r\n\t[\"directive-inline\", \"LuaQuickHandler\"],\r\n\t[\"directive-inline\", \"LuaRoot\"],\r\n\t[\"directive-inline\", \"LuaScope\"],\r\n\t[\"directive-inline\", \"MaxConnectionsPerChild\"],\r\n\t[\"directive-inline\", \"MaxKeepAliveRequests\"],\r\n\t[\"directive-inline\", \"MaxMemFree\"],\r\n\t[\"directive-inline\", \"MaxRangeOverlaps\"],\r\n\t[\"directive-inline\", \"MaxRangeReversals\"],\r\n\t[\"directive-inline\", \"MaxRanges\"],\r\n\t[\"directive-inline\", \"MaxRequestWorkers\"],\r\n\t[\"directive-inline\", \"MaxSpareServers\"],\r\n\t[\"directive-inline\", \"MaxSpareThreads\"],\r\n\t[\"directive-inline\", \"MaxThreads\"],\r\n\t[\"directive-inline\", \"MergeTrailers\"],\r\n\t[\"directive-inline\", \"MetaDir\"],\r\n\t[\"directive-inline\", \"MetaFiles\"],\r\n\t[\"directive-inline\", \"MetaSuffix\"],\r\n\t[\"directive-inline\", \"MimeMagicFile\"],\r\n\t[\"directive-inline\", \"MinSpareServers\"],\r\n\t[\"directive-inline\", \"MinSpareThreads\"],\r\n\t[\"directive-inline\", \"MMapFile\"],\r\n\t[\"directive-inline\", \"ModemStandard\"],\r\n\t[\"directive-inline\", \"ModMimeUsePathInfo\"],\r\n\t[\"directive-inline\", \"MultiviewsMatch\"],\r\n\t[\"directive-inline\", \"Mutex\"],\r\n\t[\"directive-inline\", \"NameVirtualHost\"],\r\n\t[\"directive-inline\", \"NoProxy\"],\r\n\t[\"directive-inline\", \"NWSSLTrustedCerts\"],\r\n\t[\"directive-inline\", \"NWSSLUpgradeable\"],\r\n\t[\"directive-inline\", \"Options\"],\r\n\t[\"directive-inline\", \"Order\"],\r\n\t[\"directive-inline\", \"OutputSed\"],\r\n\t[\"directive-inline\", \"PassEnv\"],\r\n\t[\"directive-inline\", \"PidFile\"],\r\n\t[\"directive-inline\", \"PrivilegesMode\"],\r\n\t[\"directive-inline\", \"Protocol\"],\r\n\t[\"directive-inline\", \"ProtocolEcho\"],\r\n\t[\"directive-inline\", \"ProxyAddHeaders\"],\r\n\t[\"directive-inline\", \"ProxyBadHeader\"],\r\n\t[\"directive-inline\", \"ProxyBlock\"],\r\n\t[\"directive-inline\", \"ProxyDomain\"],\r\n\t[\"directive-inline\", \"ProxyErrorOverride\"],\r\n\t[\"directive-inline\", \"ProxyExpressDBMFile\"],\r\n\t[\"directive-inline\", \"ProxyExpressDBMType\"],\r\n\t[\"directive-inline\", \"ProxyExpressEnable\"],\r\n\t[\"directive-inline\", \"ProxyFtpDirCharset\"],\r\n\t[\"directive-inline\", \"ProxyFtpEscapeWildcards\"],\r\n\t[\"directive-inline\", \"ProxyFtpListOnWildcard\"],\r\n\t[\"directive-inline\", \"ProxyHTMLBufSize\"],\r\n\t[\"directive-inline\", \"ProxyHTMLCharsetOut\"],\r\n\t[\"directive-inline\", \"ProxyHTMLDocType\"],\r\n\t[\"directive-inline\", \"ProxyHTMLEnable\"],\r\n\t[\"directive-inline\", \"ProxyHTMLEvents\"],\r\n\t[\"directive-inline\", \"ProxyHTMLExtended\"],\r\n\t[\"directive-inline\", \"ProxyHTMLFixups\"],\r\n\t[\"directive-inline\", \"ProxyHTMLInterp\"],\r\n\t[\"directive-inline\", \"ProxyHTMLLinks\"],\r\n\t[\"directive-inline\", \"ProxyHTMLMeta\"],\r\n\t[\"directive-inline\", \"ProxyHTMLStripComments\"],\r\n\t[\"directive-inline\", \"ProxyHTMLURLMap\"],\r\n\t[\"directive-inline\", \"ProxyIOBufferSize\"],\r\n\t[\"directive-inline\", \"ProxyMaxForwards\"],\r\n\t[\"directive-inline\", \"ProxyPass\"],\r\n\t[\"directive-inline\", \"ProxyPassInherit\"],\r\n\t[\"directive-inline\", \"ProxyPassInterpolateEnv\"],\r\n\t[\"directive-inline\", \"ProxyPassMatch\"],\r\n\t[\"directive-inline\", \"ProxyPassReverse\"],\r\n\t[\"directive-inline\", \"ProxyPassReverseCookieDomain\"],\r\n\t[\"directive-inline\", \"ProxyPassReverseCookiePath\"],\r\n\t[\"directive-inline\", \"ProxyPreserveHost\"],\r\n\t[\"directive-inline\", \"ProxyReceiveBufferSize\"],\r\n\t[\"directive-inline\", \"ProxyRemote\"],\r\n\t[\"directive-inline\", \"ProxyRemoteMatch\"],\r\n\t[\"directive-inline\", \"ProxyRequests\"],\r\n\t[\"directive-inline\", \"ProxySCGIInternalRedirect\"],\r\n\t[\"directive-inline\", \"ProxySCGISendfile\"],\r\n\t[\"directive-inline\", \"ProxySet\"],\r\n\t[\"directive-inline\", \"ProxySourceAddress\"],\r\n\t[\"directive-inline\", \"ProxyStatus\"],\r\n\t[\"directive-inline\", \"ProxyTimeout\"],\r\n\t[\"directive-inline\", \"ProxyVia\"],\r\n\t[\"directive-inline\", \"ReadmeName\"],\r\n\t[\"directive-inline\", \"ReceiveBufferSize\"],\r\n\t[\"directive-inline\", \"Redirect\"],\r\n\t[\"directive-inline\", \"RedirectMatch\"],\r\n\t[\"directive-inline\", \"RedirectPermanent\"],\r\n\t[\"directive-inline\", \"RedirectTemp\"],\r\n\t[\"directive-inline\", \"ReflectorHeader\"],\r\n\t[\"directive-inline\", \"RemoteIPHeader\"],\r\n\t[\"directive-inline\", \"RemoteIPInternalProxy\"],\r\n\t[\"directive-inline\", \"RemoteIPInternalProxyList\"],\r\n\t[\"directive-inline\", \"RemoteIPProxiesHeader\"],\r\n\t[\"directive-inline\", \"RemoteIPTrustedProxy\"],\r\n\t[\"directive-inline\", \"RemoteIPTrustedProxyList\"],\r\n\t[\"directive-inline\", \"RemoveCharset\"],\r\n\t[\"directive-inline\", \"RemoveEncoding\"],\r\n\t[\"directive-inline\", \"RemoveHandler\"],\r\n\t[\"directive-inline\", \"RemoveInputFilter\"],\r\n\t[\"directive-inline\", \"RemoveLanguage\"],\r\n\t[\"directive-inline\", \"RemoveOutputFilter\"],\r\n\t[\"directive-inline\", \"RemoveType\"],\r\n\t[\"directive-inline\", \"RequestHeader\"],\r\n\t[\"directive-inline\", \"RequestReadTimeout\"],\r\n\t[\"directive-inline\", \"Require\"],\r\n\t[\"directive-inline\", \"RewriteBase\"],\r\n\t[\"directive-inline\", \"RewriteCond\"],\r\n\t[\"directive-inline\", \"RewriteEngine\"],\r\n\t[\"directive-inline\", \"RewriteMap\"],\r\n\t[\"directive-inline\", \"RewriteOptions\"],\r\n\t[\"directive-inline\", \"RewriteRule\"],\r\n\t[\"directive-inline\", \"RLimitCPU\"],\r\n\t[\"directive-inline\", \"RLimitMEM\"],\r\n\t[\"directive-inline\", \"RLimitNPROC\"],\r\n\t[\"directive-inline\", \"Satisfy\"],\r\n\t[\"directive-inline\", \"ScoreBoardFile\"],\r\n\t[\"directive-inline\", \"Script\"],\r\n\t[\"directive-inline\", \"ScriptAlias\"],\r\n\t[\"directive-inline\", \"ScriptAliasMatch\"],\r\n\t[\"directive-inline\", \"ScriptInterpreterSource\"],\r\n\t[\"directive-inline\", \"ScriptLog\"],\r\n\t[\"directive-inline\", \"ScriptLogBuffer\"],\r\n\t[\"directive-inline\", \"ScriptLogLength\"],\r\n\t[\"directive-inline\", \"ScriptSock\"],\r\n\t[\"directive-inline\", \"SecureListen\"],\r\n\t[\"directive-inline\", \"SeeRequestTail\"],\r\n\t[\"directive-inline\", \"SendBufferSize\"],\r\n\t[\"directive-inline\", \"ServerAdmin\"],\r\n\t[\"directive-inline\", \"ServerAlias\"],\r\n\t[\"directive-inline\", \"ServerLimit\"],\r\n\t[\"directive-inline\", \"ServerName\"],\r\n\t[\"directive-inline\", \"ServerPath\"],\r\n\t[\"directive-inline\", \"ServerRoot\"],\r\n\t[\"directive-inline\", \"ServerSignature\"],\r\n\t[\"directive-inline\", \"ServerTokens\"],\r\n\t[\"directive-inline\", \"Session\"],\r\n\t[\"directive-inline\", \"SessionCookieName\"],\r\n\t[\"directive-inline\", \"SessionCookieName2\"],\r\n\t[\"directive-inline\", \"SessionCookieRemove\"],\r\n\t[\"directive-inline\", \"SessionCryptoCipher\"],\r\n\t[\"directive-inline\", \"SessionCryptoDriver\"],\r\n\t[\"directive-inline\", \"SessionCryptoPassphrase\"],\r\n\t[\"directive-inline\", \"SessionCryptoPassphraseFile\"],\r\n\t[\"directive-inline\", \"SessionDBDCookieName\"],\r\n\t[\"directive-inline\", \"SessionDBDCookieName2\"],\r\n\t[\"directive-inline\", \"SessionDBDCookieRemove\"],\r\n\t[\"directive-inline\", \"SessionDBDDeleteLabel\"],\r\n\t[\"directive-inline\", \"SessionDBDInsertLabel\"],\r\n\t[\"directive-inline\", \"SessionDBDPerUser\"],\r\n\t[\"directive-inline\", \"SessionDBDSelectLabel\"],\r\n\t[\"directive-inline\", \"SessionDBDUpdateLabel\"],\r\n\t[\"directive-inline\", \"SessionEnv\"],\r\n\t[\"directive-inline\", \"SessionExclude\"],\r\n\t[\"directive-inline\", \"SessionHeader\"],\r\n\t[\"directive-inline\", \"SessionInclude\"],\r\n\t[\"directive-inline\", \"SessionMaxAge\"],\r\n\t[\"directive-inline\", \"SetEnv\"],\r\n\t[\"directive-inline\", \"SetEnvIf\"],\r\n\t[\"directive-inline\", \"SetEnvIfExpr\"],\r\n\t[\"directive-inline\", \"SetEnvIfNoCase\"],\r\n\t[\"directive-inline\", \"SetHandler\"],\r\n\t[\"directive-inline\", \"SetInputFilter\"],\r\n\t[\"directive-inline\", \"SetOutputFilter\"],\r\n\t[\"directive-inline\", \"SSIEndTag\"],\r\n\t[\"directive-inline\", \"SSIErrorMsg\"],\r\n\t[\"directive-inline\", \"SSIETag\"],\r\n\t[\"directive-inline\", \"SSILastModified\"],\r\n\t[\"directive-inline\", \"SSILegacyExprParser\"],\r\n\t[\"directive-inline\", \"SSIStartTag\"],\r\n\t[\"directive-inline\", \"SSITimeFormat\"],\r\n\t[\"directive-inline\", \"SSIUndefinedEcho\"],\r\n\t[\"directive-inline\", \"SSLCACertificateFile\"],\r\n\t[\"directive-inline\", \"SSLCACertificatePath\"],\r\n\t[\"directive-inline\", \"SSLCADNRequestFile\"],\r\n\t[\"directive-inline\", \"SSLCADNRequestPath\"],\r\n\t[\"directive-inline\", \"SSLCARevocationCheck\"],\r\n\t[\"directive-inline\", \"SSLCARevocationFile\"],\r\n\t[\"directive-inline\", \"SSLCARevocationPath\"],\r\n\t[\"directive-inline\", \"SSLCertificateChainFile\"],\r\n\t[\"directive-inline\", \"SSLCertificateFile\"],\r\n\t[\"directive-inline\", \"SSLCertificateKeyFile\"],\r\n\t[\"directive-inline\", \"SSLCipherSuite\"],\r\n\t[\"directive-inline\", \"SSLCompression\"],\r\n\t[\"directive-inline\", \"SSLCryptoDevice\"],\r\n\t[\"directive-inline\", \"SSLEngine\"],\r\n\t[\"directive-inline\", \"SSLFIPS\"],\r\n\t[\"directive-inline\", \"SSLHonorCipherOrder\"],\r\n\t[\"directive-inline\", \"SSLInsecureRenegotiation\"],\r\n\t[\"directive-inline\", \"SSLOCSPDefaultResponder\"],\r\n\t[\"directive-inline\", \"SSLOCSPEnable\"],\r\n\t[\"directive-inline\", \"SSLOCSPOverrideResponder\"],\r\n\t[\"directive-inline\", \"SSLOCSPResponderTimeout\"],\r\n\t[\"directive-inline\", \"SSLOCSPResponseMaxAge\"],\r\n\t[\"directive-inline\", \"SSLOCSPResponseTimeSkew\"],\r\n\t[\"directive-inline\", \"SSLOCSPUseRequestNonce\"],\r\n\t[\"directive-inline\", \"SSLOpenSSLConfCmd\"],\r\n\t[\"directive-inline\", \"SSLOptions\"],\r\n\t[\"directive-inline\", \"SSLPassPhraseDialog\"],\r\n\t[\"directive-inline\", \"SSLProtocol\"],\r\n\t[\"directive-inline\", \"SSLProxyCACertificateFile\"],\r\n\t[\"directive-inline\", \"SSLProxyCACertificatePath\"],\r\n\t[\"directive-inline\", \"SSLProxyCARevocationCheck\"],\r\n\t[\"directive-inline\", \"SSLProxyCARevocationFile\"],\r\n\t[\"directive-inline\", \"SSLProxyCARevocationPath\"],\r\n\t[\"directive-inline\", \"SSLProxyCheckPeerCN\"],\r\n\t[\"directive-inline\", \"SSLProxyCheckPeerExpire\"],\r\n\t[\"directive-inline\", \"SSLProxyCheckPeerName\"],\r\n\t[\"directive-inline\", \"SSLProxyCipherSuite\"],\r\n\t[\"directive-inline\", \"SSLProxyEngine\"],\r\n\t[\"directive-inline\", \"SSLProxyMachineCertificateChainFile\"],\r\n\t[\"directive-inline\", \"SSLProxyMachineCertificateFile\"],\r\n\t[\"directive-inline\", \"SSLProxyMachineCertificatePath\"],\r\n\t[\"directive-inline\", \"SSLProxyProtocol\"],\r\n\t[\"directive-inline\", \"SSLProxyVerify\"],\r\n\t[\"directive-inline\", \"SSLProxyVerifyDepth\"],\r\n\t[\"directive-inline\", \"SSLRandomSeed\"],\r\n\t[\"directive-inline\", \"SSLRenegBufferSize\"],\r\n\t[\"directive-inline\", \"SSLRequire\"],\r\n\t[\"directive-inline\", \"SSLRequireSSL\"],\r\n\t[\"directive-inline\", \"SSLSessionCache\"],\r\n\t[\"directive-inline\", \"SSLSessionCacheTimeout\"],\r\n\t[\"directive-inline\", \"SSLSessionTicketKeyFile\"],\r\n\t[\"directive-inline\", \"SSLSessionTickets\"],\r\n\t[\"directive-inline\", \"SSLSRPUnknownUserSeed\"],\r\n\t[\"directive-inline\", \"SSLSRPVerifierFile\"],\r\n\t[\"directive-inline\", \"SSLStaplingCache\"],\r\n\t[\"directive-inline\", \"SSLStaplingErrorCacheTimeout\"],\r\n\t[\"directive-inline\", \"SSLStaplingFakeTryLater\"],\r\n\t[\"directive-inline\", \"SSLStaplingForceURL\"],\r\n\t[\"directive-inline\", \"SSLStaplingResponderTimeout\"],\r\n\t[\"directive-inline\", \"SSLStaplingResponseMaxAge\"],\r\n\t[\"directive-inline\", \"SSLStaplingResponseTimeSkew\"],\r\n\t[\"directive-inline\", \"SSLStaplingReturnResponderErrors\"],\r\n\t[\"directive-inline\", \"SSLStaplingStandardCacheTimeout\"],\r\n\t[\"directive-inline\", \"SSLStrictSNIVHostCheck\"],\r\n\t[\"directive-inline\", \"SSLUserName\"],\r\n\t[\"directive-inline\", \"SSLUseStapling\"],\r\n\t[\"directive-inline\", \"SSLVerifyClient\"],\r\n\t[\"directive-inline\", \"SSLVerifyDepth\"],\r\n\t[\"directive-inline\", \"StartServers\"],\r\n\t[\"directive-inline\", \"StartThreads\"],\r\n\t[\"directive-inline\", \"Substitute\"],\r\n\t[\"directive-inline\", \"Suexec\"],\r\n\t[\"directive-inline\", \"SuexecUserGroup\"],\r\n\t[\"directive-inline\", \"ThreadLimit\"],\r\n\t[\"directive-inline\", \"ThreadsPerChild\"],\r\n\t[\"directive-inline\", \"ThreadStackSize\"],\r\n\t[\"directive-inline\", \"TimeOut\"],\r\n\t[\"directive-inline\", \"TraceEnable\"],\r\n\t[\"directive-inline\", \"TransferLog\"],\r\n\t[\"directive-inline\", \"TypesConfig\"],\r\n\t[\"directive-inline\", \"UnDefine\"],\r\n\t[\"directive-inline\", \"UndefMacro\"],\r\n\t[\"directive-inline\", \"UnsetEnv\"],\r\n\t[\"directive-inline\", \"Use\"],\r\n\t[\"directive-inline\", \"UseCanonicalName\"],\r\n\t[\"directive-inline\", \"UseCanonicalPhysicalPort\"],\r\n\t[\"directive-inline\", \"User\"],\r\n\t[\"directive-inline\", \"UserDir\"],\r\n\t[\"directive-inline\", \"VHostCGIMode\"],\r\n\t[\"directive-inline\", \"VHostCGIPrivs\"],\r\n\t[\"directive-inline\", \"VHostGroup\"],\r\n\t[\"directive-inline\", \"VHostPrivs\"],\r\n\t[\"directive-inline\", \"VHostSecure\"],\r\n\t[\"directive-inline\", \"VHostUser\"],\r\n\t[\"directive-inline\", \"VirtualDocumentRoot\"],\r\n\t[\"directive-inline\", \"VirtualDocumentRootIP\"],\r\n\t[\"directive-inline\", \"VirtualScriptAlias\"],\r\n\t[\"directive-inline\", \"VirtualScriptAliasIP\"],\r\n\t[\"directive-inline\", \"WatchdogInterval\"],\r\n\t[\"directive-inline\", \"XBitHack\"],\r\n\t[\"directive-inline\", \"xml2EncAlias\"],\r\n\t[\"directive-inline\", \"xml2EncDefault\"],\r\n\t[\"directive-inline\", \"xml2StartParse\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all inline directives.\r\n"
  },
  {
    "path": "tests/languages/apacheconf/regex_feature.test",
    "content": "^(.*)$\r\n^foo\r\nbar$\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"regex\", \"^(.*)$\"],\r\n\t[\"regex\", \"^foo\"],\r\n\t[\"regex\", \"bar$\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for regex."
  },
  {
    "path": "tests/languages/apacheconf/string_feature.test",
    "content": "\"foo bar\"\r\n'foo bar'\r\n\"%{REMOTE_HOST}\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\r\n\t\t\"\\\"foo bar\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"'foo bar'\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"variable\", \"%{REMOTE_HOST}\"],\r\n\t\t\"\\\"\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\nAlso checks for variables inside strings."
  },
  {
    "path": "tests/languages/apacheconf/variable_feature.test",
    "content": "$port\r\n${docroot}\r\n%{REMOTE_HOST}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$port\"],\r\n\t[\"variable\", \"${docroot}\"],\r\n\t[\"variable\", \"%{REMOTE_HOST}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/apex/annotation_feature.test",
    "content": "@Future\r\n@IsTest\r\n@isTest(SeeAllData=true)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"annotation\", \"@Future\"],\r\n\t[\"annotation\", \"@IsTest\"],\r\n\t[\"annotation\", \"@isTest\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"SeeAllData\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/apex/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/apex/class-name_feature.test",
    "content": "Integer i;\r\nInteger i = (Integer)obj;\r\nInteger[] myInts = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\nObject obj = new MyApexClass();\r\nlist<Item__c> itemList;\r\nList<List<Set<Integer>>> my_list_2 = new List<List<Set<Integer>>>();\r\nMap<ID, Shipping_Invoice__C> updateMap = new Map<ID, Shipping_Invoice__C>();\r\nset<Id> AllItems = new set<id>();\r\n\r\npublic Season getSouthernHemisphereSeason(season northernHemisphereSeason) {}\r\n\r\nfor(Shipping_Invoice__C sc : AllShippingInvoices){}\r\npublic static Integer calculate() {}\r\n\r\nif (sobject instanceof Account) {\r\n\tAccount a = (Account) sobject;\r\n}\r\n\r\npublic class myOuterClass {}\r\npublic enum MyEnumClass { X, Y }\r\npublic class YellowMarker extends Marker {}\r\ninterface MySecondInterface extends MyInterface {}\r\npublic virtual class InnerClass implements MySecondInterface {}\r\n\r\n\r\nclass Foo {\r\n\tList<Account> accs {get; set;}\r\n\tInteger i {get; set;}\r\n}\r\n\r\n\r\npublic with sharing class sharingClass {}\r\npublic without sharing class noSharing {}\r\npublic inherited sharing class InheritedSharingClass{}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"Integer\"],\r\n\t\" i\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"Integer\"],\r\n\t\" i \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"Integer\"],\r\n\t[\"punctuation\", \")\"],\r\n\t\"obj\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"Integer\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t\" myInts \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"Integer\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"5\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"6\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"7\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"8\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"9\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"10\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"Object\"],\r\n\t\" obj \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"class-name\", [\r\n\t\t\"MyApexClass\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"list\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"Item__c\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" itemList\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"List\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"keyword\", \"List\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"keyword\", \"Set\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"keyword\", \"Integer\"],\r\n\t\t[\"punctuation\", \">\"],\r\n\t\t[\"punctuation\", \">\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" my_list_2 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"List\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"keyword\", \"List\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"keyword\", \"Set\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"keyword\", \"Integer\"],\r\n\t\t[\"punctuation\", \">\"],\r\n\t\t[\"punctuation\", \">\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"Map\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"ID\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" Shipping_Invoice__C\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" updateMap \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"Map\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"ID\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" Shipping_Invoice__C\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"set\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"Id\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" AllItems \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"set\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"id\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"class-name\", [\r\n\t\t\"Season\"\r\n\t]],\r\n\t[\"function\", \"getSouthernHemisphereSeason\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t\"season\"\r\n\t]],\r\n\t\" northernHemisphereSeason\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"for\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t\"Shipping_Invoice__C\"\r\n\t]],\r\n\t\" sc \",\r\n\t[\"operator\", \":\"],\r\n\t\" AllShippingInvoices\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"Integer\"],\r\n\t[\"function\", \"calculate\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"sobject\"],\r\n\t[\"keyword\", \"instanceof\"],\r\n\t[\"class-name\", [\r\n\t\t\"Account\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"class-name\", [\r\n\t\t\"Account\"\r\n\t]],\r\n\t\" a \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t\"Account\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"sobject\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"myOuterClass\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"class-name\", [\r\n\t\t\"MyEnumClass\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" X\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" Y \",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"YellowMarker\"\r\n\t]],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\r\n\t\t\"Marker\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"class-name\", [\r\n\t\t\"MySecondInterface\"\r\n\t]],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\r\n\t\t\"MyInterface\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"virtual\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"InnerClass\"\r\n\t]],\r\n\t[\"keyword\", \"implements\"],\r\n\t[\"class-name\", [\r\n\t\t\"MySecondInterface\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"List\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"Account\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" accs \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"Integer\"],\r\n\t\" i \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"with sharing\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"sharingClass\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"without sharing\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"noSharing\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"inherited sharing\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"InheritedSharingClass\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]"
  },
  {
    "path": "tests/languages/apex/comment_feature.test",
    "content": "// comment\r\n/*\r\ncomment\r\n*/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// comment\"],\r\n\t[\"comment\", \"/*\\r\\ncomment\\r\\n*/\"]\r\n]"
  },
  {
    "path": "tests/languages/apex/number_feature.test",
    "content": "0\r\n123\r\n.123\r\n21.3\r\n123L\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \".123\"],\r\n\t[\"number\", \"21.3\"],\r\n\t[\"number\", \"123L\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/apex/operator_feature.test",
    "content": "=\r\n\r\n+= *= -= /=\r\n|= &= <<= >>= >>>=\r\n\r\n? :\r\n\r\n&& ||\r\n== === < > <= >= != !==\r\n\r\n+ - * / !\r\n++ --\r\n& |\r\n^ ^=\r\n<< >> >>>\r\n\r\n?.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"=\"],\r\n\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"|=\"],\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \">>>=\"],\r\n\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \":\"],\r\n\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"===\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"!==\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"^=\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \">>>\"],\r\n\r\n\t[\"operator\", \"?.\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/apex/punctuation_feature.test",
    "content": "( ) [ ] { }\r\n. , ;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/apex/sql_feature.test",
    "content": "b = [SELECT Price__c FROM Book__c WHERE Id =:b.Id];\r\nreturn [SELECT Name FROM Contact];\r\n\r\n// don't capture array indexing\r\na[0].Name = 'Acme';\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"b \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"sql\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"keyword\", \"SELECT\"],\r\n\t\t\" Price__c \",\r\n\t\t[\"keyword\", \"FROM\"],\r\n\t\t\" Book__c \",\r\n\t\t[\"keyword\", \"WHERE\"],\r\n\t\t\" Id \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\":b\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Id\",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"sql\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"keyword\", \"SELECT\"],\r\n\t\t\" Name \",\r\n\t\t[\"keyword\", \"FROM\"],\r\n\t\t\" Contact\",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"// don't capture array indexing\"],\r\n\t\"\\r\\na\",\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"Name \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"'Acme'\"],\r\n\t[\"punctuation\", \";\"]\r\n]"
  },
  {
    "path": "tests/languages/apex/string_feature.test",
    "content": "''\r\n'  '\r\n'\\''\r\n'foo\\nbar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'  '\"],\r\n\t[\"string\", \"'\\\\''\"],\r\n\t[\"string\", \"'foo\\\\nbar'\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/apex/trigger_feature.test",
    "content": "trigger HelloWorldTrigger on Book__c (before insert) {}\r\n\r\ntrigger T1 on Account (before delete, after delete, after undelete) {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"trigger\"],\r\n\t[\"trigger\", \"HelloWorldTrigger\"],\r\n\t[\"keyword\", \"on\"],\r\n\t[\"class-name\", [\r\n\t\t\"Book__c\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"before\"],\r\n\t[\"keyword\", \"insert\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"trigger\"],\r\n\t[\"trigger\", \"T1\"],\r\n\t[\"keyword\", \"on\"],\r\n\t[\"class-name\", [\r\n\t\t\"Account\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"before\"],\r\n\t[\"keyword\", \"delete\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"after\"],\r\n\t[\"keyword\", \"delete\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"after\"],\r\n\t[\"keyword\", \"undelete\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/apl/assignment_feature.test",
    "content": "a←1 2 3\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"a\",\r\n\t[\"assignment\", \"←\"],\r\n\t[\"number\", \"1\"], [\"number\", \"2\"], [\"number\", \"3\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for assignment."
  },
  {
    "path": "tests/languages/apl/comment_feature.test",
    "content": "⍝\r\n⍝ Foobar\r\n#!/usr/bin/env runapl\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"⍝\"],\r\n\t[\"comment\", \"⍝ Foobar\"],\r\n\t[\"comment\", \"#!/usr/bin/env runapl\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/apl/constant_feature.test",
    "content": "⍬\r\n⌾\r\n#\r\n⎕\r\n⍞\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"⍬\"],\r\n\t[\"constant\", \"⌾\"],\r\n\t[\"constant\", \"#\"],\r\n\t[\"constant\", \"⎕\"],\r\n\t[\"constant\", \"⍞\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants."
  },
  {
    "path": "tests/languages/apl/dfn_feature.test",
    "content": "{0=⍴⍴⍺:'hello' ⋄ ∇¨⍵}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"dfn\", \"{\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"function\", \"=\"],\r\n\t[\"function\", \"⍴\"],\r\n\t[\"function\", \"⍴\"],\r\n\t[\"dfn\", \"⍺\"],\r\n\t[\"dfn\", \":\"],\r\n\t[\"string\", \"'hello'\"],\r\n\t[\"punctuation\", \"⋄\"],\r\n\t[\"dfn\", \"∇\"],\r\n\t[\"monadic-operator\", \"¨\"],\r\n\t[\"dfn\", \"⍵\"],\r\n\t[\"dfn\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Dfns."
  },
  {
    "path": "tests/languages/apl/dyadic-operator_feature.test",
    "content": ". ⍣ ⍠\r\n⍤ ∘ ⌸\r\n@ ⌺ ⍥\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"dyadic-operator\", \".\"], [\"dyadic-operator\", \"⍣\"], [\"dyadic-operator\", \"⍠\"],\r\n\t[\"dyadic-operator\", \"⍤\"], [\"dyadic-operator\", \"∘\"], [\"dyadic-operator\", \"⌸\"],\r\n\t[\"dyadic-operator\", \"@\"], [\"dyadic-operator\", \"⌺\"], [\"dyadic-operator\", \"⍥\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for dyadic operators.\r\n"
  },
  {
    "path": "tests/languages/apl/function_feature.test",
    "content": "- + × ÷\r\n⌈ ⌊ ∣ |\r\n⍳ ⍸ ? *\r\n⍟ ○ ! ⌹\r\n< ≤ = >\r\n≥ ≠ ≡ ≢\r\n∊ ⍷ ∪ ∩\r\n~ ∨ ∧ ⍱\r\n⍲ ⍴ , ⍪\r\n⌽ ⊖ ⍉\r\n↑ ↓ ⊂ ⊃\r\n⊆ ⊇\r\n⌷ ⍋ ⍒\r\n⊤ ⊥ ⍕ ⍎\r\n⊣ ⊢ ⍁ ⍂\r\n≈ ⍯\r\n↗ ¤ →\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"-\"], [\"function\", \"+\"], [\"function\", \"×\"], [\"function\", \"÷\"],\r\n\t[\"function\", \"⌈\"], [\"function\", \"⌊\"], [\"function\", \"∣\"], [\"function\", \"|\"],\r\n\t[\"function\", \"⍳\"], [\"function\", \"⍸\"], [\"function\", \"?\"], [\"function\", \"*\"],\r\n\t[\"function\", \"⍟\"], [\"function\", \"○\"], [\"function\", \"!\"], [\"function\", \"⌹\"],\r\n\t[\"function\", \"<\"], [\"function\", \"≤\"], [\"function\", \"=\"], [\"function\", \">\"],\r\n\t[\"function\", \"≥\"], [\"function\", \"≠\"], [\"function\", \"≡\"], [\"function\", \"≢\"],\r\n\t[\"function\", \"∊\"], [\"function\", \"⍷\"], [\"function\", \"∪\"], [\"function\", \"∩\"],\r\n\t[\"function\", \"~\"], [\"function\", \"∨\"], [\"function\", \"∧\"], [\"function\", \"⍱\"],\r\n\t[\"function\", \"⍲\"], [\"function\", \"⍴\"], [\"function\", \",\"], [\"function\", \"⍪\"],\r\n\t[\"function\", \"⌽\"], [\"function\", \"⊖\"], [\"function\", \"⍉\"],\r\n\t[\"function\", \"↑\"], [\"function\", \"↓\"], [\"function\", \"⊂\"], [\"function\", \"⊃\"],\r\n\t[\"function\", \"⊆\"], [\"function\", \"⊇\"],\r\n\t[\"function\", \"⌷\"], [\"function\", \"⍋\"], [\"function\", \"⍒\"],\r\n\t[\"function\", \"⊤\"], [\"function\", \"⊥\"], [\"function\", \"⍕\"], [\"function\", \"⍎\"],\r\n\t[\"function\", \"⊣\"], [\"function\", \"⊢\"], [\"function\", \"⍁\"], [\"function\", \"⍂\"],\r\n\t[\"function\", \"≈\"], [\"function\", \"⍯\"],\r\n\t[\"function\", \"↗\"], [\"function\", \"¤\"], [\"function\", \"→\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/apl/monadic-operator_feature.test",
    "content": "\\ / ⌿ ⍀\r\n¨ ⍨ ⌶\r\n& ∥\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"monadic-operator\", \"\\\\\"], [\"monadic-operator\", \"/\"], [\"monadic-operator\", \"⌿\"], [\"monadic-operator\", \"⍀\"],\r\n\t[\"monadic-operator\", \"¨\"], [\"monadic-operator\", \"⍨\"], [\"monadic-operator\", \"⌶\"],\r\n\t[\"monadic-operator\", \"&\"], [\"monadic-operator\", \"∥\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for monadic operators."
  },
  {
    "path": "tests/languages/apl/number_feature.test",
    "content": "42\r\n3.14159\r\n¯2\r\n∞\r\n3E12\r\n2.8e¯4\r\n0.1e+7\r\n2j3\r\n¯4.3e2J1.9e¯4\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"¯2\"],\r\n\t[\"number\", \"∞\"],\r\n\t[\"number\", \"3E12\"],\r\n\t[\"number\", \"2.8e¯4\"],\r\n\t[\"number\", \"0.1e+7\"],\r\n\t[\"number\", \"2j3\"],\r\n\t[\"number\", \"¯4.3e2J1.9e¯4\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/apl/statement_feature.test",
    "content": ":Ab\r\n:FooBar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"statement\", \":Ab\"],\r\n\t[\"statement\", \":FooBar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for statements."
  },
  {
    "path": "tests/languages/apl/string_feature.test",
    "content": "''\r\n'foobar'\r\n'fo''obar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'foobar'\"],\r\n\t[\"string\", \"'fo''obar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/apl/system-function_feature.test",
    "content": "⎕IO\r\n⎕WA\r\n⎕CR\r\n⎕TCNL\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"system-function\", \"⎕IO\"],\r\n\t[\"system-function\", \"⎕WA\"],\r\n\t[\"system-function\", \"⎕CR\"],\r\n\t[\"system-function\", \"⎕TCNL\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for system functions."
  },
  {
    "path": "tests/languages/applescript/class-name_feature.test",
    "content": "alias application boolean class constant\ndate file integer list number\nPOSIX file\nreal record reference\nRGB color\nscript text centimetres centimeters feet\ninches kilometres kilometers metres meters\nmiles yards\nsquare feet square kilometres square kilometers square metres\nsquare meters square miles square yards\ncubic centimetres cubic centimeters cubic feet cubic inches\ncubic metres cubic meters cubic yards\ngallons litres liters quarts grams\nkilograms ounces pounds\ndegrees Celsius degrees Fahrenheit degrees Kelvin\n\n----------------------------------------------------\n\n[\n\t[\"class-name\", \"alias\"],\n\t[\"class-name\", \"application\"],\n\t[\"class-name\", \"boolean\"],\n\t[\"class-name\", \"class\"],\n\t[\"class-name\", \"constant\"],\n\n\t[\"class-name\", \"date\"],\n\t[\"class-name\", \"file\"],\n\t[\"class-name\", \"integer\"],\n\t[\"class-name\", \"list\"],\n\t[\"class-name\", \"number\"],\n\n\t[\"class-name\", \"POSIX file\"],\n\n\t[\"class-name\", \"real\"],\n\t[\"class-name\", \"record\"],\n\t[\"class-name\", \"reference\"],\n\n\t[\"class-name\", \"RGB color\"],\n\n\t[\"class-name\", \"script\"],\n\t[\"class-name\", \"text\"],\n\t[\"class-name\", \"centimetres\"],\n\t[\"class-name\", \"centimeters\"],\n\t[\"class-name\", \"feet\"],\n\n\t[\"class-name\", \"inches\"],\n\t[\"class-name\", \"kilometres\"],\n\t[\"class-name\", \"kilometers\"],\n\t[\"class-name\", \"metres\"],\n\t[\"class-name\", \"meters\"],\n\n\t[\"class-name\", \"miles\"],\n\t[\"class-name\", \"yards\"],\n\n\t[\"class-name\", \"square feet\"],\n\t[\"class-name\", \"square kilometres\"],\n\t[\"class-name\", \"square kilometers\"],\n\t[\"class-name\", \"square metres\"],\n\n\t[\"class-name\", \"square meters\"],\n\t[\"class-name\", \"square miles\"],\n\t[\"class-name\", \"square yards\"],\n\n\t[\"class-name\", \"cubic centimetres\"],\n\t[\"class-name\", \"cubic centimeters\"],\n\t[\"class-name\", \"cubic feet\"],\n\t[\"class-name\", \"cubic inches\"],\n\n\t[\"class-name\", \"cubic metres\"],\n\t[\"class-name\", \"cubic meters\"],\n\t[\"class-name\", \"cubic yards\"],\n\n\t[\"class-name\", \"gallons\"],\n\t[\"class-name\", \"litres\"],\n\t[\"class-name\", \"liters\"],\n\t[\"class-name\", \"quarts\"],\n\t[\"class-name\", \"grams\"],\n\n\t[\"class-name\", \"kilograms\"],\n\t[\"class-name\", \"ounces\"],\n\t[\"class-name\", \"pounds\"],\n\n\t[\"class-name\", \"degrees Celsius\"],\n\t[\"class-name\", \"degrees Fahrenheit\"],\n\t[\"class-name\", \"degrees Kelvin\"]\n]\n\n----------------------------------------------------\n\nChecks for all classes.\n"
  },
  {
    "path": "tests/languages/applescript/comment_feature.test",
    "content": "-- foo bar\r\n# foo bar\r\n(* foo\r\nbar *)\r\n(* foo\r\n(* bar *)\r\n*)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"-- foo bar\"],\r\n\t[\"comment\", \"# foo bar\"],\r\n\t[\"comment\", \"(* foo\\r\\nbar *)\"],\r\n\t[\"comment\", \"(* foo\\r\\n(* bar *)\\r\\n*)\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments.\r\nAlso checks for one level of nesting."
  },
  {
    "path": "tests/languages/applescript/keyword_feature.test",
    "content": "about above after against\r\napart from\r\naround\r\naside from\r\nat back before beginning behind below\r\nbeneath beside between but by\r\nconsidering continue copy\r\ndoes eighth else end\r\nequal error every exit\r\nfalse fifth first for fourth\r\nfrom front get given global\r\nif ignoring in\r\ninstead of\r\ninto is it its last\r\nlocal me middle my\r\nninth of on onto\r\nout of\r\nover prop property put\r\nrepeat return returning\r\nsecond set seventh since sixth\r\nsome tell tenth that the\r\nthen third through thru timeout\r\ntimes to transaction true try\r\nuntil where while whose with\r\nwithout\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"about\"], [\"keyword\", \"above\"], [\"keyword\", \"after\"], [\"keyword\", \"against\"],\r\n\t[\"keyword\", \"apart from\"],\r\n\t[\"keyword\", \"around\"],\r\n\t[\"keyword\", \"aside from\"],\r\n\t[\"keyword\", \"at\"], [\"keyword\", \"back\"], [\"keyword\", \"before\"], [\"keyword\", \"beginning\"], [\"keyword\", \"behind\"], [\"keyword\", \"below\"],\r\n\t[\"keyword\", \"beneath\"], [\"keyword\", \"beside\"], [\"keyword\", \"between\"], [\"keyword\", \"but\"], [\"keyword\", \"by\"],\r\n\t[\"keyword\", \"considering\"], [\"keyword\", \"continue\"], [\"keyword\", \"copy\"],\r\n\t[\"keyword\", \"does\"], [\"keyword\", \"eighth\"], [\"keyword\", \"else\"], [\"keyword\", \"end\"],\r\n\t[\"keyword\", \"equal\"], [\"keyword\", \"error\"], [\"keyword\", \"every\"], [\"keyword\", \"exit\"],\r\n\t[\"keyword\", \"false\"], [\"keyword\", \"fifth\"], [\"keyword\", \"first\"], [\"keyword\", \"for\"], [\"keyword\", \"fourth\"],\r\n\t[\"keyword\", \"from\"], [\"keyword\", \"front\"], [\"keyword\", \"get\"], [\"keyword\", \"given\"], [\"keyword\", \"global\"],\r\n\t[\"keyword\", \"if\"], [\"keyword\", \"ignoring\"], [\"keyword\", \"in\"],\r\n\t[\"keyword\", \"instead of\"],\r\n\t[\"keyword\", \"into\"], [\"keyword\", \"is\"], [\"keyword\", \"it\"], [\"keyword\", \"its\"], [\"keyword\", \"last\"],\r\n\t[\"keyword\", \"local\"], [\"keyword\", \"me\"], [\"keyword\", \"middle\"], [\"keyword\", \"my\"],\r\n\t[\"keyword\", \"ninth\"], [\"keyword\", \"of\"], [\"keyword\", \"on\"], [\"keyword\", \"onto\"],\r\n\t[\"keyword\", \"out of\"],\r\n\t[\"keyword\", \"over\"], [\"keyword\", \"prop\"], [\"keyword\", \"property\"], [\"keyword\", \"put\"],\r\n\t[\"keyword\", \"repeat\"], [\"keyword\", \"return\"], [\"keyword\", \"returning\"],\r\n\t[\"keyword\", \"second\"], [\"keyword\", \"set\"], [\"keyword\", \"seventh\"], [\"keyword\", \"since\"], [\"keyword\", \"sixth\"],\r\n\t[\"keyword\", \"some\"], [\"keyword\", \"tell\"], [\"keyword\", \"tenth\"], [\"keyword\", \"that\"], [\"keyword\", \"the\"],\r\n\t[\"keyword\", \"then\"], [\"keyword\", \"third\"], [\"keyword\", \"through\"], [\"keyword\", \"thru\"], [\"keyword\", \"timeout\"],\r\n\t[\"keyword\", \"times\"], [\"keyword\", \"to\"], [\"keyword\", \"transaction\"], [\"keyword\", \"true\"], [\"keyword\", \"try\"],\r\n\t[\"keyword\", \"until\"], [\"keyword\", \"where\"], [\"keyword\", \"while\"], [\"keyword\", \"whose\"], [\"keyword\", \"with\"],\r\n\t[\"keyword\", \"without\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/applescript/number_feature.test",
    "content": "42\r\n3.14159\r\n3e10\r\n4.2E-5\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3e10\"],\r\n\t[\"number\", \"4.2E-5\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/applescript/operator_feature.test",
    "content": "& = ≠ ≤ ≥\r\n* + - / ÷ ^\r\n< <= > >=\r\n\r\nstart with begin with end with\r\nstarts with begins with ends with\r\ndoes not contain doesn't contain\r\ncontain contains\r\nis in isn't in is not in\r\nis contained by isn't contained by is not contained by\r\ngreater than greater than or equal greater than or equal to\r\nless than less than or equal less than or equal to\r\ndoes not come before doesn't come before comes before\r\ndoes not come after doesn't come after comes after\r\nis equal isn't equal is not equal\r\nis equal to isn't equal to is not equal to\r\ndoes not equal doesn't equal equals\r\nisn't is not\r\nref a ref to a reference to\r\nand or div mod as not\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"&\"], [\"operator\", \"=\"], [\"operator\", \"≠\"], [\"operator\", \"≤\"], [\"operator\", \"≥\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"/\"], [\"operator\", \"÷\"], [\"operator\", \"^\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"start with\"], [\"operator\", \"begin with\"], [\"operator\", \"end with\"],\r\n\t[\"operator\", \"starts with\"], [\"operator\", \"begins with\"], [\"operator\", \"ends with\"],\r\n\t[\"operator\", \"does not contain\"], [\"operator\", \"doesn't contain\"],\r\n\t[\"operator\", \"contain\"], [\"operator\", \"contains\"],\r\n\t[\"operator\", \"is in\"], [\"operator\", \"isn't in\"], [\"operator\", \"is not in\"],\r\n\t[\"operator\", \"is contained by\"], [\"operator\", \"isn't contained by\"], [\"operator\", \"is not contained by\"],\r\n\t[\"operator\", \"greater than\"], [\"operator\", \"greater than or equal\"], [\"operator\", \"greater than or equal to\"],\r\n\t[\"operator\", \"less than\"], [\"operator\", \"less than or equal\"], [\"operator\", \"less than or equal to\"],\r\n\t[\"operator\", \"does not come before\"], [\"operator\", \"doesn't come before\"], [\"operator\", \"comes before\"],\r\n\t[\"operator\", \"does not come after\"], [\"operator\", \"doesn't come after\"], [\"operator\", \"comes after\"],\r\n\t[\"operator\", \"is equal\"], [\"operator\", \"isn't equal\"], [\"operator\", \"is not equal\"],\r\n\t[\"operator\", \"is equal to\"], [\"operator\", \"isn't equal to\"], [\"operator\", \"is not equal to\"],\r\n\t[\"operator\", \"does not equal\"], [\"operator\", \"doesn't equal\"], [\"operator\", \"equals\"],\r\n\t[\"operator\", \"isn't\"], [\"operator\", \"is not\"],\r\n\t[\"operator\", \"ref\"], [\"operator\", \"a ref to\"], [\"operator\", \"a reference to\"],\r\n\t[\"operator\", \"and\"], [\"operator\", \"or\"], [\"operator\", \"div\"], [\"operator\", \"mod\"], [\"operator\", \"as\"], [\"operator\", \"not\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for most of the operators."
  },
  {
    "path": "tests/languages/applescript/punctuation_feature.test",
    "content": "{ } ( ) : ,\n¬ « » 《 》\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \"¬\"],\n\t[\"punctuation\", \"«\"],\n\t[\"punctuation\", \"»\"],\n\t[\"punctuation\", \"《\"],\n\t[\"punctuation\", \"》\"]\n]\n"
  },
  {
    "path": "tests/languages/applescript/string_feature.test",
    "content": "\"\"\r\n\"foo bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo bar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/aql/boolean_feature.test",
    "content": "true\nfalse\nTRUE\nFALSE\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"],\n\t[\"boolean\", \"TRUE\"],\n\t[\"boolean\", \"FALSE\"]\n]\n"
  },
  {
    "path": "tests/languages/aql/comment_feature.test",
    "content": "// single line\r\n/*\r\n multi\r\n line\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// single line\"],\r\n\t[\"comment\", \"/*\\r\\n multi\\r\\n line\\r\\n */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/aql/identifier_feature.test",
    "content": "´filter´\n`sort`\n\n----------------------------------------------------\n\n[\n\t[\"identifier\", \"´filter´\"],\n\t[\"identifier\", \"`sort`\"]\n]\n"
  },
  {
    "path": "tests/languages/aql/keyword_feature.test",
    "content": "WITH COUNT INTO\r\nCOUNT\r\n\r\nAGGREGATE\r\nALL\r\nAND\r\nANY\r\nASC\r\nCOLLECT\r\nDESC\r\nDISTINCT\r\nFILTER\r\nFOR\r\nGRAPH\r\nIN\r\nINBOUND\r\nINSERT\r\nINTO\r\nK_PATHS\r\nK_SHORTEST_PATHS\r\nLET\r\nLIKE\r\nLIMIT\r\nNONE\r\nNOT\r\nNULL\r\nOR\r\nOUTBOUND\r\nREMOVE\r\nREPLACE\r\nRETURN\r\nSHORTEST_PATH\r\nSORT\r\nUPDATE\r\nUPSERT\r\nWINDOW\r\nWITH\r\n\r\nKEEP\r\nPRUNE\r\nSEARCH\r\nTO\r\n\r\nCURRENT\r\nNEW\r\nOLD\r\n\r\nOPTIONS {}\r\nOPTIONS\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"WITH\"],\r\n\t[\"keyword\", \"COUNT\"],\r\n\t[\"keyword\", \"INTO\"],\r\n\t\"\\r\\nCOUNT\\r\\n\\r\\n\",\r\n\r\n\t[\"keyword\", \"AGGREGATE\"],\r\n\t[\"keyword\", \"ALL\"],\r\n\t[\"keyword\", \"AND\"],\r\n\t[\"keyword\", \"ANY\"],\r\n\t[\"keyword\", \"ASC\"],\r\n\t[\"keyword\", \"COLLECT\"],\r\n\t[\"keyword\", \"DESC\"],\r\n\t[\"keyword\", \"DISTINCT\"],\r\n\t[\"keyword\", \"FILTER\"],\r\n\t[\"keyword\", \"FOR\"],\r\n\t[\"keyword\", \"GRAPH\"],\r\n\t[\"keyword\", \"IN\"],\r\n\t[\"keyword\", \"INBOUND\"],\r\n\t[\"keyword\", \"INSERT\"],\r\n\t[\"keyword\", \"INTO\"],\r\n\t[\"keyword\", \"K_PATHS\"],\r\n\t[\"keyword\", \"K_SHORTEST_PATHS\"],\r\n\t[\"keyword\", \"LET\"],\r\n\t[\"keyword\", \"LIKE\"],\r\n\t[\"keyword\", \"LIMIT\"],\r\n\t[\"keyword\", \"NONE\"],\r\n\t[\"keyword\", \"NOT\"],\r\n\t[\"keyword\", \"NULL\"],\r\n\t[\"keyword\", \"OR\"],\r\n\t[\"keyword\", \"OUTBOUND\"],\r\n\t[\"keyword\", \"REMOVE\"],\r\n\t[\"keyword\", \"REPLACE\"],\r\n\t[\"keyword\", \"RETURN\"],\r\n\t[\"keyword\", \"SHORTEST_PATH\"],\r\n\t[\"keyword\", \"SORT\"],\r\n\t[\"keyword\", \"UPDATE\"],\r\n\t[\"keyword\", \"UPSERT\"],\r\n\t[\"keyword\", \"WINDOW\"],\r\n\t[\"keyword\", \"WITH\"],\r\n\r\n\t[\"keyword\", \"KEEP\"],\r\n\t[\"keyword\", \"PRUNE\"],\r\n\t[\"keyword\", \"SEARCH\"],\r\n\t[\"keyword\", \"TO\"],\r\n\r\n\t[\"keyword\", \"CURRENT\"],\r\n\t[\"keyword\", \"NEW\"],\r\n\t[\"keyword\", \"OLD\"],\r\n\r\n\t[\"keyword\", \"OPTIONS\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t\"\\r\\nOPTIONS\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/aql/number_feature.test",
    "content": "1\r\n42\r\n1.23\r\n99.99\r\n0.5\r\n.5\r\n4.87e103\r\n4.87E103\r\n0b10101110\r\n0xabcdef02\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"1\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"1.23\"],\r\n\t[\"number\", \"99.99\"],\r\n\t[\"number\", \"0.5\"],\r\n\t[\"number\", \".5\"],\r\n\t[\"number\", \"4.87e103\"],\r\n\t[\"number\", \"4.87E103\"],\r\n\t[\"number\", \"0b10101110\"],\r\n\t[\"number\", \"0xabcdef02\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/aql/operator_feature.test",
    "content": "+ - * / %\r\n> >= <= < == != =\r\n!~ =~\r\n\r\n! && ||\r\n\r\n[**] [***] [****]\r\n\r\n..\r\n1..100\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"=\"],\r\n\r\n\t[\"operator\", \"!~\"],\r\n\t[\"operator\", \"=~\"],\r\n\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"operator\", \"**\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"operator\", \"***\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"operator\", \"****\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"range\", \"..\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"range\", \"..\"],\r\n\t[\"number\", \"100\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/aql/property_feature.test",
    "content": "{ foo: … }\r\n{ 'foo': … }\r\n{ \"foo\": … }\r\n{ `foo`: … }\r\n{ ´foo´: … }\r\n\r\n// not a property\r\nLET opType = IS_NULL(OLD) ? \"insert\" : \"update\"\r\n\r\nLET foo = { CURRENT: 1, keep: 2, NEW: 3, OLD: 4, options: 5, prune: 6, search: 7, to: 8 }\r\nLET bar = foo[CURRENT] + foo.NEW + foo[\"OLD\"] + foo[keep] + foo.options + foo[\"prune\"] + foo.search + foo[to]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"foo\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" … \",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"'foo'\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" … \",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"foo\\\"\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" … \",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"`foo`\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" … \",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"´foo´\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" … \",\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"comment\", \"// not a property\"],\r\n\t[\"keyword\", \"LET\"],\r\n\t\" opType \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"function\", \"IS_NULL\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"OLD\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"?\"],\r\n\t[\"string\", \"\\\"insert\\\"\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"string\", \"\\\"update\\\"\"],\r\n\r\n\t[\"keyword\", \"LET\"],\r\n\t\" foo \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"CURRENT\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"keep\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"NEW\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"OLD\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"options\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"5\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"prune\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"6\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"search\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"7\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"to\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"8\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"LET\"],\r\n\t\" bar \",\r\n\t[\"operator\", \"=\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \"[\"],\r\n\t\"CURRENT\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"+\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"NEW \",\r\n\t[\"operator\", \"+\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"\\\"OLD\\\"\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"+\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \"[\"],\r\n\t\"keep\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"+\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"options \",\r\n\t[\"operator\", \"+\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"\\\"prune\\\"\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"+\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"search \",\r\n\t[\"operator\", \"+\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \"[\"],\r\n\t\"to\",\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties. (beware of ternary operators)\r\n"
  },
  {
    "path": "tests/languages/aql/string_feature.test",
    "content": "\"yikes!\"\r\n\"don't know\"\r\n\"this is a \\\"quoted\\\" word\"\r\n\"this is a longer string.\"\r\n\"the path separator on Windows is \\\\\"\r\n\r\n'yikes!'\r\n'don\\'t know'\r\n'this is a \"quoted\" word'\r\n'this is a longer string.'\r\n'the path separator on Windows is \\\\'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"yikes!\\\"\"],\r\n\t[\"string\", \"\\\"don't know\\\"\"],\r\n\t[\"string\", \"\\\"this is a \\\\\\\"quoted\\\\\\\" word\\\"\"],\r\n\t[\"string\", \"\\\"this is a longer string.\\\"\"],\r\n\t[\"string\", \"\\\"the path separator on Windows is \\\\\\\\\\\"\"],\r\n\r\n\t[\"string\", \"'yikes!'\"],\r\n\t[\"string\", \"'don\\\\'t know'\"],\r\n\t[\"string\", \"'this is a \\\"quoted\\\" word'\"],\r\n\t[\"string\", \"'this is a longer string.'\"],\r\n\t[\"string\", \"'the path separator on Windows is \\\\\\\\'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/aql/variable_feature.test",
    "content": "FILTER u.id == @id && u.name == @name\r\nFOR u IN @@collection\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"FILTER\"],\r\n\t\" u\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"id \",\r\n\t[\"operator\", \"==\"],\r\n\t[\"variable\", \"@id\"],\r\n\t[\"operator\", \"&&\"],\r\n\t\" u\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"name \",\r\n\t[\"operator\", \"==\"],\r\n\t[\"variable\", \"@name\"],\r\n\r\n\t[\"keyword\", \"FOR\"],\r\n\t\" u \",\r\n\t[\"keyword\", \"IN\"],\r\n\t[\"variable\", \"@@collection\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variable binds.\r\n"
  },
  {
    "path": "tests/languages/arduino/builtin_feature.test",
    "content": "KeyboardController\nMouseController\nSoftwareSerial\nEthernetServer\nEthernetClient\nLiquidCrystal\nLiquidCrystal_I2C\nRobotControl\nGSMVoiceCall\nEthernetUDP\nEsploraTFT\nHttpClient\nRobotMotor\nWiFiClient\nGSMScanner\nFileSystem\nScheduler\nGSMServer\nYunClient\nYunServer\nIPAddress\nGSMClient\nGSMModem\nKeyboard\nEthernet\nConsole\nGSMBand\nEsplora\nStepper\nProcess\nWiFiUDP\nGSM_SMS\nMailbox\nUSBHost\nFirmata\nPImage\nClient\nServer\nGSMPIN\nFileIO\nBridge\nSerial\nEEPROM\nStream\nMouse\nAudio\nServo\nFile\nTask\nGPRS\nWiFi\nWire\nTFT\nGSM\nSPI\nSD\nrunShellCommandAsynchronously\nanalogWriteResolution\nretrieveCallingNumber\nprintFirmwareVersion\nanalogReadResolution\nsendDigitalPortPair\nnoListenOnLocalhost\nreadJoystickButton\nsetFirmwareVersion\nreadJoystickSwitch\nscrollDisplayRight\ngetVoiceCallStatus\nscrollDisplayLeft\nwriteMicroseconds\ndelayMicroseconds\nbeginTransmission\ngetSignalStrength\nrunAsynchronously\ngetAsynchronously\nlistenOnLocalhost\ngetCurrentCarrier\nreadAccelerometer\nmessageAvailable\nsendDigitalPorts\nlineFollowConfig\ncountryNameWrite\nrunShellCommand\nreadStringUntil\nrewindDirectory\nreadTemperature\nsetClockDivider\nreadLightSensor\nendTransmission\nanalogReference\ndetachInterrupt\ncountryNameRead\nattachInterrupt\nencryptionType\nreadBytesUntil\nrobotNameWrite\nreadMicrophone\nrobotNameRead\ncityNameWrite\nuserNameWrite\nreadJoystickY\nreadJoystickX\nmouseReleased\nopenNextFile\nscanNetworks\nnoInterrupts\ndigitalWrite\nbeginSpeaker\nmousePressed\nisActionDone\nmouseDragged\ndisplayLogos\nnoAutoscroll\naddParameter\nremoteNumber\ngetModifiers\nkeyboardRead\nuserNameRead\nwaitContinue\nprocessInput\nparseCommand\nprintVersion\nreadNetworks\nwriteMessage\nblinkVersion\ncityNameRead\nreadMessage\nsetDataMode\nparsePacket\nisListening\nsetBitOrder\nbeginPacket\nisDirectory\nmotorsWrite\ndrawCompass\ndigitalRead\nclearScreen\nserialEvent\nrightToLeft\nsetTextSize\nleftToRight\nrequestFrom\nkeyReleased\ncompassRead\nanalogWrite\ninterrupts\nWiFiServer\ndisconnect\nplayMelody\nparseFloat\nautoscroll\ngetPINUsed\nsetPINUsed\nsetTimeout\nsendAnalog\nreadSlider\nanalogRead\nbeginWrite\ncreateChar\nmotorsStop\nkeyPressed\ntempoWrite\nreadButton\nsubnetMask\ndebugPrint\nmacAddress\nwriteGreen\nrandomSeed\nattachGPRS\nreadString\nsendString\nremotePort\nreleaseAll\nmouseMoved\nbackground\ngetXChange\ngetYChange\nanswerCall\ngetResult\nvoiceCall\nendPacket\nconstrain\ngetSocket\nwriteJSON\ngetButton\navailable\nconnected\nfindUntil\nreadBytes\nexitValue\nreadGreen\nwriteBlue\nstartLoop\nisPressed\nsendSysex\npauseMode\ngatewayIP\nsetCursor\ngetOemKey\ntuneWrite\nnoDisplay\nloadImage\nswitchPIN\nonRequest\nonReceive\nchangePIN\nplayFile\nnoBuffer\nparseInt\noverflow\ncheckPIN\nknobRead\nbeginTFT\nbitClear\nupdateIR\nbitWrite\nposition\nwriteRGB\nhighByte\nwriteRed\nsetSpeed\nreadBlue\nnoStroke\nremoteIP\ntransfer\nshutdown\nhangCall\nbeginSMS\nendWrite\nattached\nmaintain\nnoCursor\ncheckReg\ncheckPUK\nshiftOut\nisValid\nshiftIn\npulseIn\nconnect\nprintln\nlocalIP\npinMode\ngetIMEI\ndisplay\nnoBlink\nprocess\ngetBand\nrunning\nbeginSD\ndrawBMP\nlowByte\nsetBand\nrelease\nbitRead\nprepare\npointTo\nreadRed\nsetMode\nnoFill\nremove\nlisten\nstroke\ndetach\nattach\nnoTone\nexists\nbuffer\nheight\nbitSet\ncircle\nconfig\ncursor\nrandom\nIRread\nsetDNS\nendSMS\ngetKey\nmicros\nmillis\nbegin\nprint\nwrite\nready\nflush\nwidth\nisPIN\nblink\nclear\npress\nmkdir\nrmdir\nclose\npoint\nyield\nimage\nBSSID\nclick\ndelay\nread\ntext\nmove\npeek\nbeep\nrect\nline\nopen\nseek\nfill\nsize\nturn\nstop\nhome\nfind\nstep\ntone\nsqrt\nRSSI\nSSID\nend\nbit\ntan\ncos\nsin\npow\nmap\nabs\nmax\nmin\nget\nrun\nput\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"KeyboardController\"],\n\t[\"builtin\", \"MouseController\"],\n\t[\"builtin\", \"SoftwareSerial\"],\n\t[\"builtin\", \"EthernetServer\"],\n\t[\"builtin\", \"EthernetClient\"],\n\t[\"builtin\", \"LiquidCrystal\"],\n\t[\"builtin\", \"LiquidCrystal_I2C\"],\n\t[\"builtin\", \"RobotControl\"],\n\t[\"builtin\", \"GSMVoiceCall\"],\n\t[\"builtin\", \"EthernetUDP\"],\n\t[\"builtin\", \"EsploraTFT\"],\n\t[\"builtin\", \"HttpClient\"],\n\t[\"builtin\", \"RobotMotor\"],\n\t[\"builtin\", \"WiFiClient\"],\n\t[\"builtin\", \"GSMScanner\"],\n\t[\"builtin\", \"FileSystem\"],\n\t[\"builtin\", \"Scheduler\"],\n\t[\"builtin\", \"GSMServer\"],\n\t[\"builtin\", \"YunClient\"],\n\t[\"builtin\", \"YunServer\"],\n\t[\"builtin\", \"IPAddress\"],\n\t[\"builtin\", \"GSMClient\"],\n\t[\"builtin\", \"GSMModem\"],\n\t[\"builtin\", \"Keyboard\"],\n\t[\"builtin\", \"Ethernet\"],\n\t[\"builtin\", \"Console\"],\n\t[\"builtin\", \"GSMBand\"],\n\t[\"builtin\", \"Esplora\"],\n\t[\"builtin\", \"Stepper\"],\n\t[\"builtin\", \"Process\"],\n\t[\"builtin\", \"WiFiUDP\"],\n\t[\"builtin\", \"GSM_SMS\"],\n\t[\"builtin\", \"Mailbox\"],\n\t[\"builtin\", \"USBHost\"],\n\t[\"builtin\", \"Firmata\"],\n\t[\"builtin\", \"PImage\"],\n\t[\"builtin\", \"Client\"],\n\t[\"builtin\", \"Server\"],\n\t[\"builtin\", \"GSMPIN\"],\n\t[\"builtin\", \"FileIO\"],\n\t[\"builtin\", \"Bridge\"],\n\t[\"builtin\", \"Serial\"],\n\t[\"builtin\", \"EEPROM\"],\n\t[\"builtin\", \"Stream\"],\n\t[\"builtin\", \"Mouse\"],\n\t[\"builtin\", \"Audio\"],\n\t[\"builtin\", \"Servo\"],\n\t[\"builtin\", \"File\"],\n\t[\"builtin\", \"Task\"],\n\t[\"builtin\", \"GPRS\"],\n\t[\"builtin\", \"WiFi\"],\n\t[\"builtin\", \"Wire\"],\n\t[\"builtin\", \"TFT\"],\n\t[\"builtin\", \"GSM\"],\n\t[\"builtin\", \"SPI\"],\n\t[\"builtin\", \"SD\"],\n\t[\"builtin\", \"runShellCommandAsynchronously\"],\n\t[\"builtin\", \"analogWriteResolution\"],\n\t[\"builtin\", \"retrieveCallingNumber\"],\n\t[\"builtin\", \"printFirmwareVersion\"],\n\t[\"builtin\", \"analogReadResolution\"],\n\t[\"builtin\", \"sendDigitalPortPair\"],\n\t[\"builtin\", \"noListenOnLocalhost\"],\n\t[\"builtin\", \"readJoystickButton\"],\n\t[\"builtin\", \"setFirmwareVersion\"],\n\t[\"builtin\", \"readJoystickSwitch\"],\n\t[\"builtin\", \"scrollDisplayRight\"],\n\t[\"builtin\", \"getVoiceCallStatus\"],\n\t[\"builtin\", \"scrollDisplayLeft\"],\n\t[\"builtin\", \"writeMicroseconds\"],\n\t[\"builtin\", \"delayMicroseconds\"],\n\t[\"builtin\", \"beginTransmission\"],\n\t[\"builtin\", \"getSignalStrength\"],\n\t[\"builtin\", \"runAsynchronously\"],\n\t[\"builtin\", \"getAsynchronously\"],\n\t[\"builtin\", \"listenOnLocalhost\"],\n\t[\"builtin\", \"getCurrentCarrier\"],\n\t[\"builtin\", \"readAccelerometer\"],\n\t[\"builtin\", \"messageAvailable\"],\n\t[\"builtin\", \"sendDigitalPorts\"],\n\t[\"builtin\", \"lineFollowConfig\"],\n\t[\"builtin\", \"countryNameWrite\"],\n\t[\"builtin\", \"runShellCommand\"],\n\t[\"builtin\", \"readStringUntil\"],\n\t[\"builtin\", \"rewindDirectory\"],\n\t[\"builtin\", \"readTemperature\"],\n\t[\"builtin\", \"setClockDivider\"],\n\t[\"builtin\", \"readLightSensor\"],\n\t[\"builtin\", \"endTransmission\"],\n\t[\"builtin\", \"analogReference\"],\n\t[\"builtin\", \"detachInterrupt\"],\n\t[\"builtin\", \"countryNameRead\"],\n\t[\"builtin\", \"attachInterrupt\"],\n\t[\"builtin\", \"encryptionType\"],\n\t[\"builtin\", \"readBytesUntil\"],\n\t[\"builtin\", \"robotNameWrite\"],\n\t[\"builtin\", \"readMicrophone\"],\n\t[\"builtin\", \"robotNameRead\"],\n\t[\"builtin\", \"cityNameWrite\"],\n\t[\"builtin\", \"userNameWrite\"],\n\t[\"builtin\", \"readJoystickY\"],\n\t[\"builtin\", \"readJoystickX\"],\n\t[\"builtin\", \"mouseReleased\"],\n\t[\"builtin\", \"openNextFile\"],\n\t[\"builtin\", \"scanNetworks\"],\n\t[\"builtin\", \"noInterrupts\"],\n\t[\"builtin\", \"digitalWrite\"],\n\t[\"builtin\", \"beginSpeaker\"],\n\t[\"builtin\", \"mousePressed\"],\n\t[\"builtin\", \"isActionDone\"],\n\t[\"builtin\", \"mouseDragged\"],\n\t[\"builtin\", \"displayLogos\"],\n\t[\"builtin\", \"noAutoscroll\"],\n\t[\"builtin\", \"addParameter\"],\n\t[\"builtin\", \"remoteNumber\"],\n\t[\"builtin\", \"getModifiers\"],\n\t[\"builtin\", \"keyboardRead\"],\n\t[\"builtin\", \"userNameRead\"],\n\t[\"builtin\", \"waitContinue\"],\n\t[\"builtin\", \"processInput\"],\n\t[\"builtin\", \"parseCommand\"],\n\t[\"builtin\", \"printVersion\"],\n\t[\"builtin\", \"readNetworks\"],\n\t[\"builtin\", \"writeMessage\"],\n\t[\"builtin\", \"blinkVersion\"],\n\t[\"builtin\", \"cityNameRead\"],\n\t[\"builtin\", \"readMessage\"],\n\t[\"builtin\", \"setDataMode\"],\n\t[\"builtin\", \"parsePacket\"],\n\t[\"builtin\", \"isListening\"],\n\t[\"builtin\", \"setBitOrder\"],\n\t[\"builtin\", \"beginPacket\"],\n\t[\"builtin\", \"isDirectory\"],\n\t[\"builtin\", \"motorsWrite\"],\n\t[\"builtin\", \"drawCompass\"],\n\t[\"builtin\", \"digitalRead\"],\n\t[\"builtin\", \"clearScreen\"],\n\t[\"builtin\", \"serialEvent\"],\n\t[\"builtin\", \"rightToLeft\"],\n\t[\"builtin\", \"setTextSize\"],\n\t[\"builtin\", \"leftToRight\"],\n\t[\"builtin\", \"requestFrom\"],\n\t[\"builtin\", \"keyReleased\"],\n\t[\"builtin\", \"compassRead\"],\n\t[\"builtin\", \"analogWrite\"],\n\t[\"builtin\", \"interrupts\"],\n\t[\"builtin\", \"WiFiServer\"],\n\t[\"builtin\", \"disconnect\"],\n\t[\"builtin\", \"playMelody\"],\n\t[\"builtin\", \"parseFloat\"],\n\t[\"builtin\", \"autoscroll\"],\n\t[\"builtin\", \"getPINUsed\"],\n\t[\"builtin\", \"setPINUsed\"],\n\t[\"builtin\", \"setTimeout\"],\n\t[\"builtin\", \"sendAnalog\"],\n\t[\"builtin\", \"readSlider\"],\n\t[\"builtin\", \"analogRead\"],\n\t[\"builtin\", \"beginWrite\"],\n\t[\"builtin\", \"createChar\"],\n\t[\"builtin\", \"motorsStop\"],\n\t[\"builtin\", \"keyPressed\"],\n\t[\"builtin\", \"tempoWrite\"],\n\t[\"builtin\", \"readButton\"],\n\t[\"builtin\", \"subnetMask\"],\n\t[\"builtin\", \"debugPrint\"],\n\t[\"builtin\", \"macAddress\"],\n\t[\"builtin\", \"writeGreen\"],\n\t[\"builtin\", \"randomSeed\"],\n\t[\"builtin\", \"attachGPRS\"],\n\t[\"builtin\", \"readString\"],\n\t[\"builtin\", \"sendString\"],\n\t[\"builtin\", \"remotePort\"],\n\t[\"builtin\", \"releaseAll\"],\n\t[\"builtin\", \"mouseMoved\"],\n\t[\"builtin\", \"background\"],\n\t[\"builtin\", \"getXChange\"],\n\t[\"builtin\", \"getYChange\"],\n\t[\"builtin\", \"answerCall\"],\n\t[\"builtin\", \"getResult\"],\n\t[\"builtin\", \"voiceCall\"],\n\t[\"builtin\", \"endPacket\"],\n\t[\"builtin\", \"constrain\"],\n\t[\"builtin\", \"getSocket\"],\n\t[\"builtin\", \"writeJSON\"],\n\t[\"builtin\", \"getButton\"],\n\t[\"builtin\", \"available\"],\n\t[\"builtin\", \"connected\"],\n\t[\"builtin\", \"findUntil\"],\n\t[\"builtin\", \"readBytes\"],\n\t[\"builtin\", \"exitValue\"],\n\t[\"builtin\", \"readGreen\"],\n\t[\"builtin\", \"writeBlue\"],\n\t[\"builtin\", \"startLoop\"],\n\t[\"builtin\", \"isPressed\"],\n\t[\"builtin\", \"sendSysex\"],\n\t[\"builtin\", \"pauseMode\"],\n\t[\"builtin\", \"gatewayIP\"],\n\t[\"builtin\", \"setCursor\"],\n\t[\"builtin\", \"getOemKey\"],\n\t[\"builtin\", \"tuneWrite\"],\n\t[\"builtin\", \"noDisplay\"],\n\t[\"builtin\", \"loadImage\"],\n\t[\"builtin\", \"switchPIN\"],\n\t[\"builtin\", \"onRequest\"],\n\t[\"builtin\", \"onReceive\"],\n\t[\"builtin\", \"changePIN\"],\n\t[\"builtin\", \"playFile\"],\n\t[\"builtin\", \"noBuffer\"],\n\t[\"builtin\", \"parseInt\"],\n\t[\"builtin\", \"overflow\"],\n\t[\"builtin\", \"checkPIN\"],\n\t[\"builtin\", \"knobRead\"],\n\t[\"builtin\", \"beginTFT\"],\n\t[\"builtin\", \"bitClear\"],\n\t[\"builtin\", \"updateIR\"],\n\t[\"builtin\", \"bitWrite\"],\n\t[\"builtin\", \"position\"],\n\t[\"builtin\", \"writeRGB\"],\n\t[\"builtin\", \"highByte\"],\n\t[\"builtin\", \"writeRed\"],\n\t[\"builtin\", \"setSpeed\"],\n\t[\"builtin\", \"readBlue\"],\n\t[\"builtin\", \"noStroke\"],\n\t[\"builtin\", \"remoteIP\"],\n\t[\"builtin\", \"transfer\"],\n\t[\"builtin\", \"shutdown\"],\n\t[\"builtin\", \"hangCall\"],\n\t[\"builtin\", \"beginSMS\"],\n\t[\"builtin\", \"endWrite\"],\n\t[\"builtin\", \"attached\"],\n\t[\"builtin\", \"maintain\"],\n\t[\"builtin\", \"noCursor\"],\n\t[\"builtin\", \"checkReg\"],\n\t[\"builtin\", \"checkPUK\"],\n\t[\"builtin\", \"shiftOut\"],\n\t[\"builtin\", \"isValid\"],\n\t[\"builtin\", \"shiftIn\"],\n\t[\"builtin\", \"pulseIn\"],\n\t[\"builtin\", \"connect\"],\n\t[\"builtin\", \"println\"],\n\t[\"builtin\", \"localIP\"],\n\t[\"builtin\", \"pinMode\"],\n\t[\"builtin\", \"getIMEI\"],\n\t[\"builtin\", \"display\"],\n\t[\"builtin\", \"noBlink\"],\n\t[\"builtin\", \"process\"],\n\t[\"builtin\", \"getBand\"],\n\t[\"builtin\", \"running\"],\n\t[\"builtin\", \"beginSD\"],\n\t[\"builtin\", \"drawBMP\"],\n\t[\"builtin\", \"lowByte\"],\n\t[\"builtin\", \"setBand\"],\n\t[\"builtin\", \"release\"],\n\t[\"builtin\", \"bitRead\"],\n\t[\"builtin\", \"prepare\"],\n\t[\"builtin\", \"pointTo\"],\n\t[\"builtin\", \"readRed\"],\n\t[\"builtin\", \"setMode\"],\n\t[\"builtin\", \"noFill\"],\n\t[\"builtin\", \"remove\"],\n\t[\"builtin\", \"listen\"],\n\t[\"builtin\", \"stroke\"],\n\t[\"builtin\", \"detach\"],\n\t[\"builtin\", \"attach\"],\n\t[\"builtin\", \"noTone\"],\n\t[\"builtin\", \"exists\"],\n\t[\"builtin\", \"buffer\"],\n\t[\"builtin\", \"height\"],\n\t[\"builtin\", \"bitSet\"],\n\t[\"builtin\", \"circle\"],\n\t[\"builtin\", \"config\"],\n\t[\"builtin\", \"cursor\"],\n\t[\"builtin\", \"random\"],\n\t[\"builtin\", \"IRread\"],\n\t[\"builtin\", \"setDNS\"],\n\t[\"builtin\", \"endSMS\"],\n\t[\"builtin\", \"getKey\"],\n\t[\"builtin\", \"micros\"],\n\t[\"builtin\", \"millis\"],\n\t[\"builtin\", \"begin\"],\n\t[\"builtin\", \"print\"],\n\t[\"builtin\", \"write\"],\n\t[\"builtin\", \"ready\"],\n\t[\"builtin\", \"flush\"],\n\t[\"builtin\", \"width\"],\n\t[\"builtin\", \"isPIN\"],\n\t[\"builtin\", \"blink\"],\n\t[\"builtin\", \"clear\"],\n\t[\"builtin\", \"press\"],\n\t[\"builtin\", \"mkdir\"],\n\t[\"builtin\", \"rmdir\"],\n\t[\"builtin\", \"close\"],\n\t[\"builtin\", \"point\"],\n\t[\"builtin\", \"yield\"],\n\t[\"builtin\", \"image\"],\n\t[\"builtin\", \"BSSID\"],\n\t[\"builtin\", \"click\"],\n\t[\"builtin\", \"delay\"],\n\t[\"builtin\", \"read\"],\n\t[\"builtin\", \"text\"],\n\t[\"builtin\", \"move\"],\n\t[\"builtin\", \"peek\"],\n\t[\"builtin\", \"beep\"],\n\t[\"builtin\", \"rect\"],\n\t[\"builtin\", \"line\"],\n\t[\"builtin\", \"open\"],\n\t[\"builtin\", \"seek\"],\n\t[\"builtin\", \"fill\"],\n\t[\"builtin\", \"size\"],\n\t[\"builtin\", \"turn\"],\n\t[\"builtin\", \"stop\"],\n\t[\"builtin\", \"home\"],\n\t[\"builtin\", \"find\"],\n\t[\"builtin\", \"step\"],\n\t[\"builtin\", \"tone\"],\n\t[\"builtin\", \"sqrt\"],\n\t[\"builtin\", \"RSSI\"],\n\t[\"builtin\", \"SSID\"],\n\t[\"builtin\", \"end\"],\n\t[\"builtin\", \"bit\"],\n\t[\"builtin\", \"tan\"],\n\t[\"builtin\", \"cos\"],\n\t[\"builtin\", \"sin\"],\n\t[\"builtin\", \"pow\"],\n\t[\"builtin\", \"map\"],\n\t[\"builtin\", \"abs\"],\n\t[\"builtin\", \"max\"],\n\t[\"builtin\", \"min\"],\n\t[\"builtin\", \"get\"],\n\t[\"builtin\", \"run\"],\n\t[\"builtin\", \"put\"]\n]\n"
  },
  {
    "path": "tests/languages/arduino/constant_feature.test",
    "content": "DIGITAL_MESSAGE\nFIRMATA_STRING\nANALOG_MESSAGE\nREPORT_DIGITAL\nREPORT_ANALOG\nINPUT_PULLUP\nSET_PIN_MODE\nINTERNAL2V56\nSYSTEM_RESET\nLED_BUILTIN\nINTERNAL1V1\nSYSEX_START\nINTERNAL\nEXTERNAL\nDEFAULT\nOUTPUT\nINPUT\nHIGH\nLOW\n\n----------------------------------------------------\n\n[\n\t[\"constant\", \"DIGITAL_MESSAGE\"],\n\t[\"constant\", \"FIRMATA_STRING\"],\n\t[\"constant\", \"ANALOG_MESSAGE\"],\n\t[\"constant\", \"REPORT_DIGITAL\"],\n\t[\"constant\", \"REPORT_ANALOG\"],\n\t[\"constant\", \"INPUT_PULLUP\"],\n\t[\"constant\", \"SET_PIN_MODE\"],\n\t[\"constant\", \"INTERNAL2V56\"],\n\t[\"constant\", \"SYSTEM_RESET\"],\n\t[\"constant\", \"LED_BUILTIN\"],\n\t[\"constant\", \"INTERNAL1V1\"],\n\t[\"constant\", \"SYSEX_START\"],\n\t[\"constant\", \"INTERNAL\"],\n\t[\"constant\", \"EXTERNAL\"],\n\t[\"constant\", \"DEFAULT\"],\n\t[\"constant\", \"OUTPUT\"],\n\t[\"constant\", \"INPUT\"],\n\t[\"constant\", \"HIGH\"],\n\t[\"constant\", \"LOW\"]\n]\n"
  },
  {
    "path": "tests/languages/arduino/keyword_feature.test",
    "content": "setup\nif\nelse\nwhile\ndo\nfor\nreturn\nin\ninstanceof\ndefault\nfunction\nloop\ngoto\nswitch\ncase\nnew\ntry\nthrow\ncatch\nfinally\nnull\nbreak\ncontinue\nboolean\nbool\nvoid\nbyte\nword\nstring\nString\narray\nint\nlong\ninteger\ndouble\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"setup\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"do\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"instanceof\"],\n\t[\"keyword\", \"default\"],\n\t[\"keyword\", \"function\"],\n\t[\"keyword\", \"loop\"],\n\t[\"keyword\", \"goto\"],\n\t[\"keyword\", \"switch\"],\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"new\"],\n\t[\"keyword\", \"try\"],\n\t[\"keyword\", \"throw\"],\n\t[\"keyword\", \"catch\"],\n\t[\"keyword\", \"finally\"],\n\t[\"keyword\", \"null\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"boolean\"],\n\t[\"keyword\", \"bool\"],\n\t[\"keyword\", \"void\"],\n\t[\"keyword\", \"byte\"],\n\t[\"keyword\", \"word\"],\n\t[\"keyword\", \"string\"],\n\t[\"keyword\", \"String\"],\n\t[\"keyword\", \"array\"],\n\t[\"keyword\", \"int\"],\n\t[\"keyword\", \"long\"],\n\t[\"keyword\", \"integer\"],\n\t[\"keyword\", \"double\"]\n]\n"
  },
  {
    "path": "tests/languages/arff/comment_feature.test",
    "content": "%\r\n% Some comment\r\n% Comment \" with ' quotes\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"%\"],\r\n\t[\"comment\", \"% Some comment\"],\r\n\t[\"comment\", \"% Comment \\\" with ' quotes\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/arff/keyword_feature.test",
    "content": "@attribute\r\n@data\r\n@end\r\n@relation\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"@attribute\"],\r\n\t[\"keyword\", \"@data\"],\r\n\t[\"keyword\", \"@end\"],\r\n\t[\"keyword\", \"@relation\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/arff/number_feature.test",
    "content": "42\r\n0.14\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"0.14\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/arff/string_feature.test",
    "content": "\"double quoted\\\"' % string\"\r\n'single quoted\"\\' % string'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"double quoted\\\\\\\"' % string\\\"\"],\r\n\t[\"string\", \"'single quoted\\\"\\\\' % string'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/armasm/boolean_feature.test",
    "content": "TRUE\nFALSE\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"TRUE\"],\n\t[\"boolean\", \"FALSE\"]\n]\n"
  },
  {
    "path": "tests/languages/armasm/char_feature.test",
    "content": "'a'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"]\n]\n"
  },
  {
    "path": "tests/languages/armasm/comment_feature.test",
    "content": "; comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"; comment\"]\n]\n"
  },
  {
    "path": "tests/languages/armasm/directives_feature.test",
    "content": "ALIAS\nALIGN\nAREA\nARM\nASSERT\nATTR\nCN\nCODE\nCODE16\nCODE32\nCOMMON\nCP\nDATA\nDCB\nDCD\nDCDO\nDCDU\nDCFD\nDCFDU\nDCI\nDCQ\nDCQU\nDCW\nDCWU\nDN\nELIF\nELSE\nEND\nENDFUNC\nENDIF\nENDP\nENTRY\nEQU\nEXPORT\nEXPORTAS\nEXTERN\nFIELD\nFILL\nFN\nFUNCTION\nGBLA\nGBLL\nGBLS\nGET\nGLOBAL\nIF\nIMPORT\nINCBIN\nINCLUDE\nINFO\nKEEP\nLCLA\nLCLL\nLCLS\nLTORG\nMACRO\nMAP\nMEND\nMEXIT\nNOFP\nOPT\nPRESERVE8\nPROC\nQN\nREADONLY\nRELOC\nREQUIRE\nREQUIRE8\nRLIST\nROUT\nSETA\nSETL\nSETS\nSN\nSPACE\nSUBT\nTHUMB\nTHUMBX\nTTL\nWEND\nWHILE\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"ALIAS\"],\n\t[\"directive\", \"ALIGN\"],\n\t[\"directive\", \"AREA\"],\n\t[\"directive\", \"ARM\"],\n\t[\"directive\", \"ASSERT\"],\n\t[\"directive\", \"ATTR\"],\n\t[\"directive\", \"CN\"],\n\t[\"directive\", \"CODE\"],\n\t[\"directive\", \"CODE16\"],\n\t[\"directive\", \"CODE32\"],\n\t[\"directive\", \"COMMON\"],\n\t[\"directive\", \"CP\"],\n\t[\"directive\", \"DATA\"],\n\t[\"directive\", \"DCB\"],\n\t[\"directive\", \"DCD\"],\n\t[\"directive\", \"DCDO\"],\n\t[\"directive\", \"DCDU\"],\n\t[\"directive\", \"DCFD\"],\n\t[\"directive\", \"DCFDU\"],\n\t[\"directive\", \"DCI\"],\n\t[\"directive\", \"DCQ\"],\n\t[\"directive\", \"DCQU\"],\n\t[\"directive\", \"DCW\"],\n\t[\"directive\", \"DCWU\"],\n\t[\"directive\", \"DN\"],\n\t[\"directive\", \"ELIF\"],\n\t[\"directive\", \"ELSE\"],\n\t[\"directive\", \"END\"],\n\t[\"directive\", \"ENDFUNC\"],\n\t[\"directive\", \"ENDIF\"],\n\t[\"directive\", \"ENDP\"],\n\t[\"directive\", \"ENTRY\"],\n\t[\"directive\", \"EQU\"],\n\t[\"directive\", \"EXPORT\"],\n\t[\"directive\", \"EXPORTAS\"],\n\t[\"directive\", \"EXTERN\"],\n\t[\"directive\", \"FIELD\"],\n\t[\"directive\", \"FILL\"],\n\t[\"directive\", \"FN\"],\n\t[\"directive\", \"FUNCTION\"],\n\t[\"directive\", \"GBLA\"],\n\t[\"directive\", \"GBLL\"],\n\t[\"directive\", \"GBLS\"],\n\t[\"directive\", \"GET\"],\n\t[\"directive\", \"GLOBAL\"],\n\t[\"directive\", \"IF\"],\n\t[\"directive\", \"IMPORT\"],\n\t[\"directive\", \"INCBIN\"],\n\t[\"directive\", \"INCLUDE\"],\n\t[\"directive\", \"INFO\"],\n\t[\"directive\", \"KEEP\"],\n\t[\"directive\", \"LCLA\"],\n\t[\"directive\", \"LCLL\"],\n\t[\"directive\", \"LCLS\"],\n\t[\"directive\", \"LTORG\"],\n\t[\"directive\", \"MACRO\"],\n\t[\"directive\", \"MAP\"],\n\t[\"directive\", \"MEND\"],\n\t[\"directive\", \"MEXIT\"],\n\t[\"directive\", \"NOFP\"],\n\t[\"directive\", \"OPT\"],\n\t[\"directive\", \"PRESERVE8\"],\n\t[\"directive\", \"PROC\"],\n\t[\"directive\", \"QN\"],\n\t[\"directive\", \"READONLY\"],\n\t[\"directive\", \"RELOC\"],\n\t[\"directive\", \"REQUIRE\"],\n\t[\"directive\", \"REQUIRE8\"],\n\t[\"directive\", \"RLIST\"],\n\t[\"directive\", \"ROUT\"],\n\t[\"directive\", \"SETA\"],\n\t[\"directive\", \"SETL\"],\n\t[\"directive\", \"SETS\"],\n\t[\"directive\", \"SN\"],\n\t[\"directive\", \"SPACE\"],\n\t[\"directive\", \"SUBT\"],\n\t[\"directive\", \"THUMB\"],\n\t[\"directive\", \"THUMBX\"],\n\t[\"directive\", \"TTL\"],\n\t[\"directive\", \"WEND\"],\n\t[\"directive\", \"WHILE\"]\n]\n"
  },
  {
    "path": "tests/languages/armasm/instruction_feature.test",
    "content": "AREA    subrout, CODE, READONLY     ; Name this block of code\n        ENTRY                        ; Mark first instruction to execute\nstart   MOV     r0, #10              ; Set up parameters\n        MOV     r1, #3\n        BL      doadd                ; Call subroutine\nstop    MOV     r0, #0x18            ; angel_SWIreason_ReportException\n        LDR     r1, =0x20026         ; ADP_Stopped_ApplicationExit\n        SVC     #0x123456            ; ARM semihosting (formerly SWI)\ndoadd   ADD     r0, r0, r1           ; Subroutine code\n        BX      lr                   ; Return from subroutine\n        END                          ; Mark end of file\n\n\n        MACRO\n$Lab    DivMod  $Div,$Top,$Bot,$Temp\n        ASSERT  $Top <> $Bot         ; Produce an error message if the\n        ASSERT  $Top <> $Temp        ; registers supplied are\n        ASSERT  $Bot <> $Temp        ; not all different\n        IF      \"$Div\" <> \"\"\n        ASSERT  $Div <> $Top         ; These three only matter if $Div\n        ASSERT  $Div <> $Bot         ; is not null (\"\")\n        ASSERT  $Div <> $Temp        ;\n        ENDIF\n$Lab\n        MOV     $Temp, $Bot          ; Put divisor in $Temp\n        CMP     $Temp, $Top, LSR #1  ; double it until\n90      MOVLS   $Temp, $Temp, LSL #1 ; 2 * $Temp > $Top\n        CMP     $Temp, $Top, LSR #1\n        BLS     %b90                 ; The b means search backwards\n        IF      \"$Div\" <> \"\"         ; Omit next instruction if $Div is null\n        MOV     $Div, #0             ; Initialize quotient\n        ENDIF\n91      CMP     $Top, $Temp          ; Can we subtract $Temp?\n        SUBCS   $Top, $Top,$Temp     ; If we can, do so\n        IF      \"$Div\" <> \"\"         ; Omit next instruction if $Div is null\n        ADC     $Div, $Div, $Div     ; Double $Div\n        ENDIF\n        MOV     $Temp, $Temp, LSR #1 ; Halve $Temp,\n        CMP     $Temp, $Bot          ; and loop until\n        BHS     %b91                 ; less than divisor\n        MEND\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"AREA\"],\n\t\"    subrout\",\n\t[\"punctuation\", \",\"],\n\t[\"directive\", \"CODE\"],\n\t[\"punctuation\", \",\"],\n\t[\"directive\", \"READONLY\"],\n\t[\"comment\", \"; Name this block of code\"],\n\n\t[\"directive\", \"ENTRY\"],\n\t[\"comment\", \"; Mark first instruction to execute\"],\n\n\t\"\\r\\nstart   \",\n\t[\"instruction\", \"MOV\"],\n\t[\"register\", \"r0\"],\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \"#\"],\n\t[\"number\", \"10\"],\n\t[\"comment\", \"; Set up parameters\"],\n\n\t[\"instruction\", \"MOV\"],\n\t[\"register\", \"r1\"],\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \"#\"],\n\t[\"number\", \"3\"],\n\n\t[\"instruction\", \"BL\"],\n\t\"      doadd                \",\n\t[\"comment\", \"; Call subroutine\"],\n\n\t\"\\r\\nstop    \",\n\t[\"instruction\", \"MOV\"],\n\t[\"register\", \"r0\"],\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \"#\"],\n\t[\"number\", \"0x18\"],\n\t[\"comment\", \"; angel_SWIreason_ReportException\"],\n\n\t[\"instruction\", \"LDR\"],\n\t[\"register\", \"r1\"],\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0x20026\"],\n\t[\"comment\", \"; ADP_Stopped_ApplicationExit\"],\n\n\t[\"instruction\", \"SVC\"],\n\t[\"operator\", \"#\"],\n\t[\"number\", \"0x123456\"],\n\t[\"comment\", \"; ARM semihosting (formerly SWI)\"],\n\n\t\"\\r\\ndoadd   \",\n\t[\"instruction\", \"ADD\"],\n\t[\"register\", \"r0\"],\n\t[\"punctuation\", \",\"],\n\t[\"register\", \"r0\"],\n\t[\"punctuation\", \",\"],\n\t[\"register\", \"r1\"],\n\t[\"comment\", \"; Subroutine code\"],\n\n\t[\"instruction\", \"BX\"],\n\t[\"register\", \"lr\"],\n\t[\"comment\", \"; Return from subroutine\"],\n\n\t[\"directive\", \"END\"],\n\t[\"comment\", \"; Mark end of file\"],\n\n\t[\"directive\", \"MACRO\"],\n\n\t[\"variable\", \"$Lab\"],\n\t\"    DivMod  \",\n\t[\"variable\", \"$Div\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Top\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Bot\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Temp\"],\n\n\t[\"directive\", \"ASSERT\"],\n\t[\"variable\", \"$Top\"],\n\t[\"operator\", \"<>\"],\n\t[\"variable\", \"$Bot\"],\n\t[\"comment\", \"; Produce an error message if the\"],\n\n\t[\"directive\", \"ASSERT\"],\n\t[\"variable\", \"$Top\"],\n\t[\"operator\", \"<>\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"comment\", \"; registers supplied are\"],\n\n\t[\"directive\", \"ASSERT\"],\n\t[\"variable\", \"$Bot\"],\n\t[\"operator\", \"<>\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"comment\", \"; not all different\"],\n\n\t[\"directive\", \"IF\"],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"variable\", \"$Div\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"operator\", \"<>\"],\n\t[\"string\", [\"\\\"\\\"\"]],\n\n\t[\"directive\", \"ASSERT\"],\n\t[\"variable\", \"$Div\"],\n\t[\"operator\", \"<>\"],\n\t[\"variable\", \"$Top\"],\n\t[\"comment\", \"; These three only matter if $Div\"],\n\n\t[\"directive\", \"ASSERT\"],\n\t[\"variable\", \"$Div\"],\n\t[\"operator\", \"<>\"],\n\t[\"variable\", \"$Bot\"],\n\t[\"comment\", \"; is not null (\\\"\\\")\"],\n\n\t[\"directive\", \"ASSERT\"],\n\t[\"variable\", \"$Div\"],\n\t[\"operator\", \"<>\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"comment\", \";\"],\n\n\t[\"directive\", \"ENDIF\"],\n\n\t[\"variable\", \"$Lab\"],\n\n\t[\"instruction\", \"MOV\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Bot\"],\n\t[\"comment\", \"; Put divisor in $Temp\"],\n\n\t[\"instruction\", \"CMP\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Top\"],\n\t[\"punctuation\", \",\"],\n\t\" LSR \",\n\t[\"operator\", \"#\"],\n\t[\"number\", \"1\"],\n\t[\"comment\", \"; double it until\"],\n\n\t[\"number\", \"90\"],\n\t[\"instruction\", \"MOVLS\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"punctuation\", \",\"],\n\t\" LSL \",\n\t[\"operator\", \"#\"],\n\t[\"number\", \"1\"],\n\t[\"comment\", \"; 2 * $Temp > $Top\"],\n\n\t[\"instruction\", \"CMP\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Top\"],\n\t[\"punctuation\", \",\"],\n\t\" LSR \",\n\t[\"operator\", \"#\"],\n\t[\"number\", \"1\"],\n\n\t[\"instruction\", \"BLS\"],\n\t[\"operator\", \"%\"],\n\t\"b90                 \",\n\t[\"comment\", \"; The b means search backwards\"],\n\n\t[\"directive\", \"IF\"],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"variable\", \"$Div\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"operator\", \"<>\"],\n\t[\"string\", [\"\\\"\\\"\"]],\n\t[\"comment\", \"; Omit next instruction if $Div is null\"],\n\n\t[\"instruction\", \"MOV\"],\n\t[\"variable\", \"$Div\"],\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \"#\"],\n\t[\"number\", \"0\"],\n\t[\"comment\", \"; Initialize quotient\"],\n\n\t[\"directive\", \"ENDIF\"],\n\n\t[\"number\", \"91\"],\n\t[\"instruction\", \"CMP\"],\n\t[\"variable\", \"$Top\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"comment\", \"; Can we subtract $Temp?\"],\n\n\t[\"instruction\", \"SUBCS\"],\n\t[\"variable\", \"$Top\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Top\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"comment\", \"; If we can, do so\"],\n\n\t[\"directive\", \"IF\"],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"variable\", \"$Div\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"operator\", \"<>\"],\n\t[\"string\", [\"\\\"\\\"\"]],\n\t[\"comment\", \"; Omit next instruction if $Div is null\"],\n\n\t[\"instruction\", \"ADC\"],\n\t[\"variable\", \"$Div\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Div\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Div\"],\n\t[\"comment\", \"; Double $Div\"],\n\n\t[\"directive\", \"ENDIF\"],\n\n\t[\"instruction\", \"MOV\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"punctuation\", \",\"],\n\t\" LSR \",\n\t[\"operator\", \"#\"],\n\t[\"number\", \"1\"],\n\t[\"comment\", \"; Halve $Temp,\"],\n\n\t[\"instruction\", \"CMP\"],\n\t[\"variable\", \"$Temp\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$Bot\"],\n\t[\"comment\", \"; and loop until\"],\n\n\t[\"instruction\", \"BHS\"],\n\t[\"operator\", \"%\"],\n\t\"b91                 \",\n\t[\"comment\", \"; less than divisor\"],\n\n\t[\"directive\", \"MEND\"]\n]\n"
  },
  {
    "path": "tests/languages/armasm/number_feature.test",
    "content": "123\n\n2_11001010\n5_241\n8_74007\n\n0x7b\n0xA10E\n0x0123456789abcdef\n&1000000F\n\n1E308\n-4E-100\n1.0\n.1\n0.02\n3.725e15\n0f_00000000\n0d_00000000\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"123\"],\n\n\t[\"number\", \"2_11001010\"],\n\t[\"number\", \"5_241\"],\n\t[\"number\", \"8_74007\"],\n\n\t[\"number\", \"0x7b\"],\n\t[\"number\", \"0xA10E\"],\n\t[\"number\", \"0x0123456789abcdef\"],\n\t[\"number\", \"&1000000F\"],\n\n\t[\"number\", \"1E308\"],\n\t[\"operator\", \"-\"], [\"number\", \"4E-100\"],\n\t[\"number\", \"1.0\"],\n\t[\"number\", \".1\"],\n\t[\"number\", \"0.02\"],\n\t[\"number\", \"3.725e15\"],\n\t[\"number\", \"0f_00000000\"],\n\t[\"number\", \"0d_00000000\"]\n]\n"
  },
  {
    "path": "tests/languages/armasm/operator_feature.test",
    "content": "+ - * / %\n< <= > >= == = /= != <>\n>> << | & ^\n&& ||\n?\n#\n\n:MOD: :CHR:\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<>\"],\n\n\t[\"operator\", \">>\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"^\"],\n\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\n\t[\"operator\", \"?\"],\n\n\t[\"operator\", \"#\"],\n\n\t[\"operator\", \":MOD:\"], [\"operator\", \":CHR:\"]\n]\n"
  },
  {
    "path": "tests/languages/armasm/punctuation_feature.test",
    "content": "( ) [ ]\n,\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \",\"]\n]\n"
  },
  {
    "path": "tests/languages/armasm/string_feature.test",
    "content": "\"\"\n\"foo\"\n\n\"this string contains only one \"\" double quote\"\n\"this string contains only one $$ dollar symbol\"\n\n\"$DIV\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", [\"\\\"\\\"\"]],\n\t[\"string\", [\"\\\"foo\\\"\"]],\n\n\t[\"string\", [\"\\\"this string contains only one \\\"\\\" double quote\\\"\"]],\n\t[\"string\", [\"\\\"this string contains only one $$ dollar symbol\\\"\"]],\n\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"variable\", \"$DIV\"],\n\t\t\"\\\"\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/armasm/variable_feature.test",
    "content": "MACRO\n$label  TestAndBranch  $dest, $reg, $cc\n$label  CMP     $reg, #0\n        B$cc    $dest\n        MEND\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"MACRO\"],\n\n\t[\"variable\", \"$label\"],\n\t\"  TestAndBranch  \",\n\t[\"variable\", \"$dest\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$reg\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$cc\"],\n\n\t[\"variable\", \"$label\"],\n\t\"  CMP     \",\n\t[\"variable\", \"$reg\"],\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \"#\"],\n\t[\"number\", \"0\"],\n\n\t[\"instruction\", \"B\"],\n\t[\"variable\", \"$cc\"],\n\t[\"variable\", \"$dest\"],\n\n\t[\"directive\", \"MEND\"]\n]\n"
  },
  {
    "path": "tests/languages/armasm/version-symbol_feature.test",
    "content": "|my_versioned_symbol@@ver2|   ; Default version\n\n----------------------------------------------------\n\n[\n\t[\"version-symbol\", \"|my_versioned_symbol@@ver2|\"],\n\t[\"comment\", \"; Default version\"]\n]\n"
  },
  {
    "path": "tests/languages/arturo/boolean_feature.test",
    "content": "true\nmaybe\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n    [\"boolean\", \"maybe\"],\n    [\"boolean\", \"false\"]\n]\n\n----------------------------------------------------\n\nChecks for boolean values.\n"
  },
  {
    "path": "tests/languages/arturo/builtin-function_feature.test",
    "content": "print \"Hello world!\"\nabs\nacos\nacosh\nacsec\nacsech\nactan\nactanh\nadd\nafter\nalert\nalias\nand\nangle\nappend\narg\nargs\narity\narray\nas\nasec\nasech\nasin\nasinh\natan\natan2\natanh\nattr\nattrs\naverage\nbefore\nbenchmark\nblend\nbreak\ncall\ncapitalize\ncase\nceil\nchop\nclear\nclip\nclose\ncolor\ncombine\nconj\ncontinue\ncopy\ncos\ncosh\ncrc\ncsec\ncsech\nctan\nctanh\ncursor\ndarken\ndec\ndecode\ndefine\ndelete\ndesaturate\ndeviation\ndialog\ndictionary\ndifference\ndigest\ndigits\ndiv\ndo\ndownload\ndrop\ndup\ne\nelse\nempty\nencode\nensure\nenv\nescape\nexecute\nexit\nexp\nextend\nextract\nfactors\nfdiv\nfilter\nfirst\nflatten\nfloor\nfold\nfrom\nfunction\ngamma\ngcd\nget\ngoto\nhash\nhypot\nif\ninc\nindent\nindex\ninfinity\ninfo\ninput\ninsert\ninspect\nintersection\ninvert\njaro\njoin\nkeys\nkurtosis\nlast\nlet\nlevenshtein\nlighten\nlist\nln\nlog\nloop\nlower\nmail\nmap\nmatch\nmax\nmedian\nmin\nmod\nmodule\nmul\nnand\nneg\nnew\nnor\nnormalize\nnot\nnow\nnull\nopen\nor\noutdent\npad\npalette\npanic\npath\npause\npermissions\npermutate\npi\npop\npopup\npow\npowerset\npowmod\nprefix\nprints\nprocess\nproduct\nquery\nrandom\nrange\nread\nrelative\nremove\nrename\nrender\nrepeat\nreplace\nrequest\nreturn\nreverse\nround\nsample\nsaturate\nscript\nsec\nsech\nselect\nserve\nset\nshl\nshr\nshuffle\nsin\nsinh\nsize\nskewness\nslice\nsort\nspin\nsplit\nsqrt\nsqueeze\nstack\nstrip\nsub\nsuffix\nsum\nswitch\nsymbols\nsymlink\nsys\ntake\ntan\ntanh\nterminal\nterminate\nto\ntruncate\ntry\ntype\nunclip\nunion\nunique\nunless\nuntil\nunzip\nupper\nvalues\nvar\nvariance\nvolume\nwebview\nwhile\nwith\nwordwrap\nwrite\nxnor\nxor\nzip\n\n----------------------------------------------------\n\n[\n\t[\"builtin-function\", \"print\"],\n    [\"string\", \"\\\"Hello world!\\\"\"],\n\n    [\"builtin-function\", \"abs\"],\n    [\"builtin-function\", \"acos\"],\n    [\"builtin-function\", \"acosh\"],\n    [\"builtin-function\", \"acsec\"],\n    [\"builtin-function\", \"acsech\"],\n    [\"builtin-function\", \"actan\"],\n    [\"builtin-function\", \"actanh\"],\n    [\"builtin-function\", \"add\"],\n    [\"builtin-function\", \"after\"],\n    [\"builtin-function\", \"alert\"],\n    [\"builtin-function\", \"alias\"],\n    [\"builtin-function\", \"and\"],\n    [\"builtin-function\", \"angle\"],\n    [\"builtin-function\", \"append\"],\n    [\"builtin-function\", \"arg\"],\n    [\"builtin-function\", \"args\"],\n    [\"builtin-function\", \"arity\"],\n    [\"builtin-function\", \"array\"],\n    [\"builtin-function\", \"as\"],\n    [\"builtin-function\", \"asec\"],\n    [\"builtin-function\", \"asech\"],\n    [\"builtin-function\", \"asin\"],\n    [\"builtin-function\", \"asinh\"],\n    [\"builtin-function\", \"atan\"],\n    [\"builtin-function\", \"atan2\"],\n    [\"builtin-function\", \"atanh\"],\n    [\"builtin-function\", \"attr\"],\n    [\"builtin-function\", \"attrs\"],\n    [\"builtin-function\", \"average\"],\n    [\"builtin-function\", \"before\"],\n    [\"builtin-function\", \"benchmark\"],\n    [\"builtin-function\", \"blend\"],\n    [\"builtin-function\", \"break\"],\n    [\"builtin-function\", \"call\"],\n    [\"builtin-function\", \"capitalize\"],\n    [\"builtin-function\", \"case\"],\n    [\"builtin-function\", \"ceil\"],\n    [\"builtin-function\", \"chop\"],\n    [\"builtin-function\", \"clear\"],\n    [\"builtin-function\", \"clip\"],\n    [\"builtin-function\", \"close\"],\n    [\"builtin-function\", \"color\"],\n    [\"builtin-function\", \"combine\"],\n    [\"builtin-function\", \"conj\"],\n    [\"builtin-function\", \"continue\"],\n    [\"builtin-function\", \"copy\"],\n    [\"builtin-function\", \"cos\"],\n    [\"builtin-function\", \"cosh\"],\n    [\"builtin-function\", \"crc\"],\n    [\"builtin-function\", \"csec\"],\n    [\"builtin-function\", \"csech\"],\n    [\"builtin-function\", \"ctan\"],\n    [\"builtin-function\", \"ctanh\"],\n    [\"builtin-function\", \"cursor\"],\n    [\"builtin-function\", \"darken\"],\n    [\"builtin-function\", \"dec\"],\n    [\"builtin-function\", \"decode\"],\n    [\"builtin-function\", \"define\"],\n    [\"builtin-function\", \"delete\"],\n    [\"builtin-function\", \"desaturate\"],\n    [\"builtin-function\", \"deviation\"],\n    [\"builtin-function\", \"dialog\"],\n    [\"builtin-function\", \"dictionary\"],\n    [\"builtin-function\", \"difference\"],\n    [\"builtin-function\", \"digest\"],\n    [\"builtin-function\", \"digits\"],\n    [\"builtin-function\", \"div\"],\n    [\"builtin-function\", \"do\"],\n    [\"builtin-function\", \"download\"],\n    [\"builtin-function\", \"drop\"],\n    [\"builtin-function\", \"dup\"],\n    [\"builtin-function\", \"e\"],\n    [\"builtin-function\", \"else\"],\n    [\"builtin-function\", \"empty\"],\n    [\"builtin-function\", \"encode\"],\n    [\"builtin-function\", \"ensure\"],\n    [\"builtin-function\", \"env\"],\n    [\"builtin-function\", \"escape\"],\n    [\"builtin-function\", \"execute\"],\n    [\"builtin-function\", \"exit\"],\n    [\"builtin-function\", \"exp\"],\n    [\"builtin-function\", \"extend\"],\n    [\"builtin-function\", \"extract\"],\n    [\"builtin-function\", \"factors\"],\n    [\"builtin-function\", \"fdiv\"],\n    [\"builtin-function\", \"filter\"],\n    [\"builtin-function\", \"first\"],\n    [\"builtin-function\", \"flatten\"],\n    [\"builtin-function\", \"floor\"],\n    [\"builtin-function\", \"fold\"],\n    [\"builtin-function\", \"from\"],\n    [\"builtin-function\", \"function\"],\n    [\"builtin-function\", \"gamma\"],\n    [\"builtin-function\", \"gcd\"],\n    [\"builtin-function\", \"get\"],\n    [\"builtin-function\", \"goto\"],\n    [\"builtin-function\", \"hash\"],\n    [\"builtin-function\", \"hypot\"],\n    [\"builtin-function\", \"if\"],\n    [\"builtin-function\", \"inc\"],\n    [\"builtin-function\", \"indent\"],\n    [\"builtin-function\", \"index\"],\n    [\"builtin-function\", \"infinity\"],\n    [\"builtin-function\", \"info\"],\n    [\"builtin-function\", \"input\"],\n    [\"builtin-function\", \"insert\"],\n    [\"builtin-function\", \"inspect\"],\n    [\"builtin-function\", \"intersection\"],\n    [\"builtin-function\", \"invert\"],\n    [\"builtin-function\", \"jaro\"],\n    [\"builtin-function\", \"join\"],\n    [\"builtin-function\", \"keys\"],\n    [\"builtin-function\", \"kurtosis\"],\n    [\"builtin-function\", \"last\"],\n    [\"builtin-function\", \"let\"],\n    [\"builtin-function\", \"levenshtein\"],\n    [\"builtin-function\", \"lighten\"],\n    [\"builtin-function\", \"list\"],\n    [\"builtin-function\", \"ln\"],\n    [\"builtin-function\", \"log\"],\n    [\"builtin-function\", \"loop\"],\n    [\"builtin-function\", \"lower\"],\n    [\"builtin-function\", \"mail\"],\n    [\"builtin-function\", \"map\"],\n    [\"builtin-function\", \"match\"],\n    [\"builtin-function\", \"max\"],\n    [\"builtin-function\", \"median\"],\n    [\"builtin-function\", \"min\"],\n    [\"builtin-function\", \"mod\"],\n    [\"builtin-function\", \"module\"],\n    [\"builtin-function\", \"mul\"],\n    [\"builtin-function\", \"nand\"],\n    [\"builtin-function\", \"neg\"],\n    [\"builtin-function\", \"new\"],\n    [\"builtin-function\", \"nor\"],\n    [\"builtin-function\", \"normalize\"],\n    [\"builtin-function\", \"not\"],\n    [\"builtin-function\", \"now\"],\n    [\"builtin-function\", \"null\"],\n    [\"builtin-function\", \"open\"],\n    [\"builtin-function\", \"or\"],\n    [\"builtin-function\", \"outdent\"],\n    [\"builtin-function\", \"pad\"],\n    [\"builtin-function\", \"palette\"],\n    [\"builtin-function\", \"panic\"],\n    [\"builtin-function\", \"path\"],\n    [\"builtin-function\", \"pause\"],\n    [\"builtin-function\", \"permissions\"],\n    [\"builtin-function\", \"permutate\"],\n    [\"builtin-function\", \"pi\"],\n    [\"builtin-function\", \"pop\"],\n    [\"builtin-function\", \"popup\"],\n    [\"builtin-function\", \"pow\"],\n    [\"builtin-function\", \"powerset\"],\n    [\"builtin-function\", \"powmod\"],\n    [\"builtin-function\", \"prefix\"],\n    [\"builtin-function\", \"prints\"],\n    [\"builtin-function\", \"process\"],\n    [\"builtin-function\", \"product\"],\n    [\"builtin-function\", \"query\"],\n    [\"builtin-function\", \"random\"],\n    [\"builtin-function\", \"range\"],\n    [\"builtin-function\", \"read\"],\n    [\"builtin-function\", \"relative\"],\n    [\"builtin-function\", \"remove\"],\n    [\"builtin-function\", \"rename\"],\n    [\"builtin-function\", \"render\"],\n    [\"builtin-function\", \"repeat\"],\n    [\"builtin-function\", \"replace\"],\n    [\"builtin-function\", \"request\"],\n    [\"builtin-function\", \"return\"],\n    [\"builtin-function\", \"reverse\"],\n    [\"builtin-function\", \"round\"],\n    [\"builtin-function\", \"sample\"],\n    [\"builtin-function\", \"saturate\"],\n    [\"builtin-function\", \"script\"],\n    [\"builtin-function\", \"sec\"],\n    [\"builtin-function\", \"sech\"],\n    [\"builtin-function\", \"select\"],\n    [\"builtin-function\", \"serve\"],\n    [\"builtin-function\", \"set\"],\n    [\"builtin-function\", \"shl\"],\n    [\"builtin-function\", \"shr\"],\n    [\"builtin-function\", \"shuffle\"],\n    [\"builtin-function\", \"sin\"],\n    [\"builtin-function\", \"sinh\"],\n    [\"builtin-function\", \"size\"],\n    [\"builtin-function\", \"skewness\"],\n    [\"builtin-function\", \"slice\"],\n    [\"builtin-function\", \"sort\"],\n    [\"builtin-function\", \"spin\"],\n    [\"builtin-function\", \"split\"],\n    [\"builtin-function\", \"sqrt\"],\n    [\"builtin-function\", \"squeeze\"],\n    [\"builtin-function\", \"stack\"],\n    [\"builtin-function\", \"strip\"],\n    [\"builtin-function\", \"sub\"],\n    [\"builtin-function\", \"suffix\"],\n    [\"builtin-function\", \"sum\"],\n    [\"builtin-function\", \"switch\"],\n    [\"builtin-function\", \"symbols\"],\n    [\"builtin-function\", \"symlink\"],\n    [\"builtin-function\", \"sys\"],\n    [\"builtin-function\", \"take\"],\n    [\"builtin-function\", \"tan\"],\n    [\"builtin-function\", \"tanh\"],\n    [\"builtin-function\", \"terminal\"],\n    [\"builtin-function\", \"terminate\"],\n    [\"builtin-function\", \"to\"],\n    [\"builtin-function\", \"truncate\"],\n    [\"builtin-function\", \"try\"],\n    [\"builtin-function\", \"type\"],\n    [\"builtin-function\", \"unclip\"],\n    [\"builtin-function\", \"union\"],\n    [\"builtin-function\", \"unique\"],\n    [\"builtin-function\", \"unless\"],\n    [\"builtin-function\", \"until\"],\n    [\"builtin-function\", \"unzip\"],\n    [\"builtin-function\", \"upper\"],\n    [\"builtin-function\", \"values\"],\n    [\"builtin-function\", \"var\"],\n    [\"builtin-function\", \"variance\"],\n    [\"builtin-function\", \"volume\"],\n    [\"builtin-function\", \"webview\"],\n    [\"builtin-function\", \"while\"],\n    [\"builtin-function\", \"with\"],\n    [\"builtin-function\", \"wordwrap\"],\n    [\"builtin-function\", \"write\"],\n    [\"builtin-function\", \"xnor\"],\n    [\"builtin-function\", \"xor\"],\n    [\"builtin-function\", \"zip\"]\n]\n\n----------------------------------------------------\n\nChecks for built-in functions."
  },
  {
    "path": "tests/languages/arturo/character_feature.test",
    "content": "`a`\n\n----------------------------------------------------\n\n[\n\t[\"character\", \"`a`\"]\n]\n\n----------------------------------------------------\n\nChecks for character literals.\n"
  },
  {
    "path": "tests/languages/arturo/color_feature.test",
    "content": "#FF0066\n#red\n\n----------------------------------------------------\n\n[\n\t[\"color\", \"#FF0066\"],\n    [\"color\", \"#red\"]\n]\n\n----------------------------------------------------\n\nChecks for colors.\n"
  },
  {
    "path": "tests/languages/arturo/comment_feature.test",
    "content": "; this is a comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"; this is a comment\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/arturo/label_feature.test",
    "content": "someLabel: \"someValue\"\n\n----------------------------------------------------\n\n[\n\t[\"label\", \"someLabel:\"],\n    [\"string\", \"\\\"someValue\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for labels."
  },
  {
    "path": "tests/languages/arturo/literal_feature.test",
    "content": "'someLiteral\n\n----------------------------------------------------\n\n[\n\t[\"literal\", \"'someLiteral\"]\n]\n\n----------------------------------------------------\n\nChecks for literals."
  },
  {
    "path": "tests/languages/arturo/multistring_feature.test",
    "content": "{hello}\n{:hello:}\n» hello\n------\nhello\n\n----------------------------------------------------\n\n[\n\t[\"multistring\", \"{hello}\"],\n    [\"multistring\", \"{:hello:}\"],\n    [\"multistring\", \"» hello\"],\n    [\"multistring\", \"------\\r\\nhello\"]\n]\n\n----------------------------------------------------\n\nChecks for string literals.\n"
  },
  {
    "path": "tests/languages/arturo/number_feature.test",
    "content": "123\n23.345\n45.678.90\n1.2.3-rc1+build123\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"123\"],\n    [\"number\", \"23.345\"],\n    [\"number\", \"45.678.90\"],\n    [\"number\", \"1.2.3-rc1+build123\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers."
  },
  {
    "path": "tests/languages/arturo/predicate_feature.test",
    "content": "all?\nand?\nany?\nascii?\nattr?\nattribute?\nattributeLabel?\nbinary?\nblock?\nchar?\ncontains?\ndatabase?\ndate?\ndictionary?\nempty?\nequal?\neven?\nevery?\nexists?\nfalse?\nfloating?\nfunction?\ngreater?\ngreaterOrEqual?\nif?\nin?\ninline?\ninteger?\nis?\nkey?\nlabel?\nleap?\nless?\nlessOrEqual?\nliteral?\nlogical?\nlower?\nnand?\nnegative?\nnor?\nnot?\nnotEqual?\nnull?\nnumeric?\nodd?\nor?\npath?\npathLabel?\npositive?\nprefix?\nprime?\nregex?\nsame?\nset?\nsome?\nsorted?\nstandalone?\nstring?\nsubset?\nsuffix?\nsuperset?\nsymbol?\nsymbolLiteral?\ntrue?\ntry?\ntype?\nunless?\nupper?\nwhen?\nwhitespace?\nword?\nxnor?\nxor?\nzero?\n\n----------------------------------------------------\n\n[\n\t[\"predicate\", \"all?\"],\n    [\"predicate\", \"and?\"],\n    [\"predicate\", \"any?\"],\n    [\"predicate\", \"ascii?\"],\n    [\"predicate\", \"attr?\"],\n    [\"predicate\", \"attribute?\"],\n    [\"predicate\", \"attributeLabel?\"],\n    [\"predicate\", \"binary?\"],\n    [\"predicate\", \"block?\"],\n    [\"predicate\", \"char?\"],\n    [\"predicate\", \"contains?\"],\n    [\"predicate\", \"database?\"],\n    [\"predicate\", \"date?\"],\n    [\"predicate\", \"dictionary?\"],\n    [\"predicate\", \"empty?\"],\n    [\"predicate\", \"equal?\"],\n    [\"predicate\", \"even?\"],\n    [\"predicate\", \"every?\"],\n    [\"predicate\", \"exists?\"],\n    [\"predicate\", \"false?\"],\n    [\"predicate\", \"floating?\"],\n    [\"predicate\", \"function?\"],\n    [\"predicate\", \"greater?\"],\n    [\"predicate\", \"greaterOrEqual?\"],\n    [\"predicate\", \"if?\"],\n    [\"predicate\", \"in?\"],\n    [\"predicate\", \"inline?\"],\n    [\"predicate\", \"integer?\"],\n    [\"predicate\", \"is?\"],\n    [\"predicate\", \"key?\"],\n    [\"predicate\", \"label?\"],\n    [\"predicate\", \"leap?\"],\n    [\"predicate\", \"less?\"],\n    [\"predicate\", \"lessOrEqual?\"],\n    [\"predicate\", \"literal?\"],\n    [\"predicate\", \"logical?\"],\n    [\"predicate\", \"lower?\"],\n    [\"predicate\", \"nand?\"],\n    [\"predicate\", \"negative?\"],\n    [\"predicate\", \"nor?\"],\n    [\"predicate\", \"not?\"],\n    [\"predicate\", \"notEqual?\"],\n    [\"predicate\", \"null?\"],\n    [\"predicate\", \"numeric?\"],\n    [\"predicate\", \"odd?\"],\n    [\"predicate\", \"or?\"],\n    [\"predicate\", \"path?\"],\n    [\"predicate\", \"pathLabel?\"],\n    [\"predicate\", \"positive?\"],\n    [\"predicate\", \"prefix?\"],\n    [\"predicate\", \"prime?\"],\n    [\"predicate\", \"regex?\"],\n    [\"predicate\", \"same?\"],\n    [\"predicate\", \"set?\"],\n    [\"predicate\", \"some?\"],\n    [\"predicate\", \"sorted?\"],\n    [\"predicate\", \"standalone?\"],\n    [\"predicate\", \"string?\"],\n    [\"predicate\", \"subset?\"],\n    [\"predicate\", \"suffix?\"],\n    [\"predicate\", \"superset?\"],\n    [\"predicate\", \"symbol?\"],\n    [\"predicate\", \"symbolLiteral?\"],\n    [\"predicate\", \"true?\"],\n    [\"predicate\", \"try?\"],\n    [\"predicate\", \"type?\"],\n    [\"predicate\", \"unless?\"],\n    [\"predicate\", \"upper?\"],\n    [\"predicate\", \"when?\"],\n    [\"predicate\", \"whitespace?\"],\n    [\"predicate\", \"word?\"],\n    [\"predicate\", \"xnor?\"],\n    [\"predicate\", \"xor?\"],\n    [\"predicate\", \"zero?\"]\n]\n\n----------------------------------------------------\n\nChecks for built-in predicates."
  },
  {
    "path": "tests/languages/arturo/punctuation_feature.test",
    "content": "print [2]\n\n----------------------------------------------------\n\n[\n\t[\"builtin-function\", \"print\"],\n    [\"punctuation\", \"[\"],\n    [\"number\", \"2\"],\n    [\"punctuation\", \"]\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation."
  },
  {
    "path": "tests/languages/arturo/regex_feature.test",
    "content": "{/[a-z]+/}\n\n----------------------------------------------------\n\n[\n\t[\"regex\", \"{/[a-z]+/}\"]\n]\n\n----------------------------------------------------\n\nChecks for regexes."
  },
  {
    "path": "tests/languages/arturo/string_feature.test",
    "content": "\"hello\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"hello\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for string literals.\n"
  },
  {
    "path": "tests/languages/arturo/sugar_feature.test",
    "content": "print -> \"hello\"\n\n----------------------------------------------------\n\n[\n\t[\"builtin-function\", \"print\"],\n    [\"sugar\", \"->\"],\n    [\"string\", \"\\\"hello\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for syntactic sugar."
  },
  {
    "path": "tests/languages/arturo/symbol_feature.test",
    "content": "\"hello\" = \" world\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"hello\\\"\"],\n    [\"symbol\", \"=\"],\n    [\"string\", \"\\\" world\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for symbols."
  },
  {
    "path": "tests/languages/arturo/type_feature.test",
    "content": ":integer\n\n----------------------------------------------------\n\n[\n\t[\"type\", \":integer\"]\n]\n\n----------------------------------------------------\n\nChecks for types."
  },
  {
    "path": "tests/languages/arturo!+bash/sh-string_feature.test",
    "content": "{!sh\n    ls -la test/*x\n}\n\n----------------------------------------------------\n\n[\n\t[\"sh-string\", [\n\t\t[\"string\", \"{!sh\"],\n\t\t[\"embedded\", [\n\t\t\t[\"function\", \"ls\"],\n\t\t\t[\"parameter\", \"-la\"],\n\t\t\t\" test/*x\\r\\n\"\n\t\t]],\n\t\t[\"string\", \"}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for string literals with embedded Shell script.\n"
  },
  {
    "path": "tests/languages/arturo!+css/css-string_feature.test",
    "content": "{!css\n    a { color: #ff8800; }\n}\n\n----------------------------------------------------\n\n[\n\t[\"css-string\", [\n\t\t[\"string\", \"{!css\"],\n\t\t[\"embedded\", [\n\t\t\t[\"selector\", \"a\"],\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"property\", \"color\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t\" #ff8800\",\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for string literals with embedded CSS."
  },
  {
    "path": "tests/languages/arturo!+javascript/js-string_feature.test",
    "content": "{!js\n    var a = 2;\n}\n\n----------------------------------------------------\n\n[\n\t[\"js-string\", [\n\t\t[\"string\", \"{!js\"],\n\t\t[\"embedded\", [\n\t\t\t[\"keyword\", \"var\"],\n\t\t\t\" a \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"number\", \"2\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]],\n\t\t[\"string\", \"}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for string literals with embedded JavaScript."
  },
  {
    "path": "tests/languages/arturo!+markdown/md-string_feature.test",
    "content": "{!md\n    ## This is a header\n}\n\n----------------------------------------------------\n\n[\n\t[\"md-string\", [\n\t\t[\"string\", \"{!md\"],\n\t\t[\"embedded\", [\n\t\t\t[\"code\", \"    ## This is a header\"]\n\t\t]],\n\t\t[\"string\", \"}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for string literals with embedded Markdown."
  },
  {
    "path": "tests/languages/arturo!+markup/html-string_feature.test",
    "content": "{!html\n    <h1>Header</h1>\n}\n\n----------------------------------------------------\n\n[\n\t[\"html-string\", [\n\t\t[\"string\", \"{!html\"],\n\t\t[\"embedded\", [\n\t\t\t[\"tag\", [\n\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t[\"tag\", [\"h1\"]],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]],\n\t\t\t\"Header\",\n\t\t\t[\"tag\", [\n\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t[\"tag\", [\"h1\"]],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]]\n\t\t]],\n\t\t[\"string\", \"}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for string literals with embedded HTML.\n"
  },
  {
    "path": "tests/languages/arturo!+sql/sql-string_feature.test",
    "content": "{!sql\n    SELECT * FROM tbl;\n}\n\n----------------------------------------------------\n\n[\n\t[\"sql-string\", [\n\t\t[\"string\", \"{!sql\"],\n\t\t[\"embedded\", [\n\t\t\t[\"keyword\", \"SELECT\"],\n\t\t\t[\"operator\", \"*\"],\n\t\t\t[\"keyword\", \"FROM\"],\n\t\t\t\" tbl\",\n\t\t\t[\"punctuation\", \";\"]\n\t\t]],\n\t\t[\"string\", \"}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for string literals with embedded SQL."
  },
  {
    "path": "tests/languages/asciidoc/admonition_feature.test",
    "content": "TIP: Foobar\r\nNOTE: Foo bar baz\r\nIMPORTANT: Foobar\r\nWARNING: Foo bar baz\r\nCAUTION: Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"admonition\", \"TIP:\"], \" Foobar\\r\\n\",\r\n\t[\"admonition\", \"NOTE:\"], \" Foo bar baz\\r\\n\",\r\n\t[\"admonition\", \"IMPORTANT:\"], \" Foobar\\r\\n\",\r\n\t[\"admonition\", \"WARNING:\"], \" Foo bar baz\\r\\n\",\r\n\t[\"admonition\", \"CAUTION:\"], \" Foobar\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for admonitions."
  },
  {
    "path": "tests/languages/asciidoc/attribute-entry_feature.test",
    "content": ":Foo bar: baz\r\n\r\n:Foobar: Foo +\r\nbar +\r\nbaz\r\n\r\n:Foo bar!:\r\n:Foobar!:\r\n\r\n=====\r\n:Foo bar: baz\r\n\r\n:Foobar: Foo +\r\nbar +\r\nbaz\r\n\r\n:Foo bar!:\r\n:Foobar!:\r\n=====\r\n\r\n|=====\r\n|\r\n:Foo bar: baz\r\n\r\n:Foobar: Foo +\r\nbar +\r\nbaz\r\n|=====\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"attribute-entry\", \":Foo bar: baz\"],\r\n\t[\"attribute-entry\", \":Foobar: Foo +\\r\\nbar +\\r\\nbaz\"],\r\n\t[\"attribute-entry\", \":Foo bar!:\"],\r\n\t[\"attribute-entry\", \":Foobar!:\"],\r\n\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"=====\"],\r\n\t\t[\"attribute-entry\", \":Foo bar: baz\"],\r\n\t\t[\"attribute-entry\", \":Foobar: Foo +\\r\\nbar +\\r\\nbaz\"],\r\n\t\t[\"attribute-entry\", \":Foo bar!:\"],\r\n\t\t[\"attribute-entry\", \":Foobar!:\"],\r\n\t\t[\"punctuation\", \"=====\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|=====\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"attribute-entry\", \":Foo bar: baz\"],\r\n\t\t[\"attribute-entry\", \":Foobar: Foo +\\r\\nbar +\\r\\nbaz\"],\r\n\t\t[\"punctuation\", \"|=====\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for attribute entries."
  },
  {
    "path": "tests/languages/asciidoc/attributes_feature.test",
    "content": "Foo [big red yellow-background]#obvious#\r\n\r\n[float]\r\n[quote,'http://en.wikipedia.org/wiki/Samuel_Johnson[Samuel Johnson]']\r\n[quote,'&#34;with *an* image&#34; image:foo.png[] (TM)']\r\n\r\n[NOTE]\r\n[icon=\"./images/icons/wink.png\"]\r\n[icons=None, caption=\"My Special Note\"]\r\n[start=7]\r\n\r\n[cols=\"e,m,^,>s\",width=\"25%\"]\r\n\r\n=====\r\nFoo [big red yellow-background]#obvious#\r\n\r\n[float]\r\n[quote,'http://en.wikipedia.org/wiki/Samuel_Johnson[Samuel Johnson]']\r\n[quote,'&#34;with *an* image&#34; image:foo.png[] (TM)']\r\n\r\n[NOTE]\r\n[icon=\"./images/icons/wink.png\"]\r\n[icons=None, caption=\"My Special Note\"]\r\n[start=7]\r\n\r\n[cols=\"e,m,^,>s\",width=\"25%\"]\r\n=====\r\n\r\n|=====\r\n|\r\nFoo [big red yellow-background]#obvious#\r\n\r\n[float]\r\n[quote,'http://en.wikipedia.org/wiki/Samuel_Johnson[Samuel Johnson]']\r\n[quote,'&#34;with *an* image&#34; image:foo.png[] (TM)']\r\n\r\n[NOTE]\r\n[icon=\"./images/icons/wink.png\"]\r\n[icons=None, caption=\"My Special Note\"]\r\n[start=7]\r\n\r\n[cols=\"e,m,^,>s\",width=\"25%\"]\r\n|=====\r\n\r\n\r\nlatexmath:[$C = \\alpha + \\beta Y^{\\gamma} + \\epsilon$]\r\nasciimath:[`x/x={(1,if x!=0),(text{undefined},if x=0):}`]\r\nlatexmath:[$\\sum_{n=1}^\\infty \\frac{1}{2^n}$]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"Foo \",\r\n\t[\"inline\", [\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-value\", \"big red yellow-background\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"#\"], \"obvious\", [\"punctuation\", \"#\"]\r\n\t]],\r\n\r\n\t[\"attributes\", [\r\n\t\t[\"punctuation\", \"[\"], [\"attr-value\", \"float\"], [\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"attributes\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"attr-value\", \"quote\"], [\"punctuation\", \",\"],\r\n\t\t[\"interpreted\", [\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t[\"macro\", [\r\n\t\t\t\t[\"function\", \"http\"], [\"punctuation\", \":\"],\r\n\t\t\t\t\"//en.wikipedia.org/wiki/Samuel_Johnson\",\r\n\t\t\t\t[\"attributes\", [\r\n\t\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t\t[\"attr-value\", \"Samuel Johnson\"],\r\n\t\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"attributes\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"attr-value\", \"quote\"], [\"punctuation\", \",\"],\r\n\t\t[\"interpreted\", [\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t[\"entity\", \"&#34;\"],\r\n\t\t\t\"with \",\r\n\t\t\t[\"inline\", [\r\n\t\t\t\t[\"bold\", [\r\n\t\t\t\t\t[\"punctuation\", \"*\"], \"an\", [\"punctuation\", \"*\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t\" image\",\r\n\t\t\t[\"entity\", \"&#34;\"],\r\n\t\t\t[\"macro\", [\r\n\t\t\t\t[\"function\", \"image\"], [\"punctuation\", \":\"],\r\n\t\t\t\t\"foo.png\",\r\n\t\t\t\t[\"attributes\", [\r\n\t\t\t\t\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"replacement\", \"(TM)\"],\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t[\"attributes\", [\r\n\t\t[\"punctuation\", \"[\"], [\"attr-value\", \"NOTE\"], [\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"attributes\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"variable\", \"icon\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"./images/icons/wink.png\\\"\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"attributes\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"variable\", \"icons\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"attr-value\", \"None\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"variable\", \"caption\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"My Special Note\\\"\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"attributes\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"variable\", \"start\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"attr-value\", \"7\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t[\"attributes\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"variable\", \"cols\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"e,m,^,>s\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"variable\", \"width\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"25%\\\"\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"=====\"],\r\n\r\n\t\t\"\\r\\nFoo \",\r\n\t\t[\"inline\", [\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"attr-value\", \"big red yellow-background\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"#\"], \"obvious\", [\"punctuation\", \"#\"]\r\n\t\t]],\r\n\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"], [\"attr-value\", \"float\"], [\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-value\", \"quote\"], [\"punctuation\", \",\"],\r\n\t\t\t[\"interpreted\", [\r\n\t\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\t[\"macro\", [\r\n\t\t\t\t\t[\"function\", \"http\"], [\"punctuation\", \":\"],\r\n\t\t\t\t\t\"//en.wikipedia.org/wiki/Samuel_Johnson\",\r\n\t\t\t\t\t[\"attributes\", [\r\n\t\t\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t\t\t[\"attr-value\", \"Samuel Johnson\"],\r\n\t\t\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t\t\t]]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"'\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-value\", \"quote\"], [\"punctuation\", \",\"],\r\n\t\t\t[\"interpreted\", [\r\n\t\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\t[\"entity\", \"&#34;\"],\r\n\t\t\t\t\"with \",\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"bold\", [\r\n\t\t\t\t\t\t[\"punctuation\", \"*\"], \"an\", [\"punctuation\", \"*\"]\r\n\t\t\t\t\t]]\r\n\t\t\t\t]],\r\n\t\t\t\t\" image\",\r\n\t\t\t\t[\"entity\", \"&#34;\"],\r\n\t\t\t\t[\"macro\", [\r\n\t\t\t\t\t[\"function\", \"image\"], [\"punctuation\", \":\"],\r\n\t\t\t\t\t\"foo.png\",\r\n\t\t\t\t\t[\"attributes\", [\r\n\t\t\t\t\t\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"]\r\n\t\t\t\t\t]]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"replacement\", \"(TM)\"],\r\n\t\t\t\t[\"punctuation\", \"'\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"], [\"attr-value\", \"NOTE\"], [\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"icon\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"\\\"./images/icons/wink.png\\\"\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"icons\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"None\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"variable\", \"caption\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"\\\"My Special Note\\\"\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"start\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"7\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"cols\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"\\\"e,m,^,>s\\\"\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"variable\", \"width\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"\\\"25%\\\"\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"=====\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|=====\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\"\\r\\nFoo \",\r\n\t\t[\"inline\", [\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"attr-value\", \"big red yellow-background\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"#\"], \"obvious\", [\"punctuation\", \"#\"]\r\n\t\t]],\r\n\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"], [\"attr-value\", \"float\"], [\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-value\", \"quote\"], [\"punctuation\", \",\"],\r\n\t\t\t[\"interpreted\", [\r\n\t\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\t[\"macro\", [\r\n\t\t\t\t\t[\"function\", \"http\"], [\"punctuation\", \":\"],\r\n\t\t\t\t\t\"//en.wikipedia.org/wiki/Samuel_Johnson\",\r\n\t\t\t\t\t[\"attributes\", [\r\n\t\t\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t\t\t[\"attr-value\", \"Samuel Johnson\"],\r\n\t\t\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t\t\t]]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"'\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-value\", \"quote\"], [\"punctuation\", \",\"],\r\n\t\t\t[\"interpreted\", [\r\n\t\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\t[\"entity\", \"&#34;\"],\r\n\t\t\t\t\"with \",\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"bold\", [\r\n\t\t\t\t\t\t[\"punctuation\", \"*\"], \"an\", [\"punctuation\", \"*\"]\r\n\t\t\t\t\t]]\r\n\t\t\t\t]],\r\n\t\t\t\t\" image\",\r\n\t\t\t\t[\"entity\", \"&#34;\"],\r\n\t\t\t\t[\"macro\", [\r\n\t\t\t\t\t[\"function\", \"image\"], [\"punctuation\", \":\"],\r\n\t\t\t\t\t\"foo.png\",\r\n\t\t\t\t\t[\"attributes\", [\r\n\t\t\t\t\t\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"]\r\n\t\t\t\t\t]]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"replacement\", \"(TM)\"],\r\n\t\t\t\t[\"punctuation\", \"'\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"], [\"attr-value\", \"NOTE\"], [\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"icon\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"\\\"./images/icons/wink.png\\\"\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"icons\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"None\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"variable\", \"caption\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"\\\"My Special Note\\\"\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"start\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"7\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"cols\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"\\\"e,m,^,>s\\\"\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"variable\", \"width\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"\\\"25%\\\"\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"|=====\"]\r\n\t]],\r\n\r\n\t[\"macro\", [\r\n\t\t[\"function\", \"latexmath\"], [\"punctuation\", \":\"],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"quoted\", [\r\n\t\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t\t\"C = \\\\alpha + \\\\beta Y^{\\\\gamma} + \\\\epsilon\",\r\n\t\t\t\t[\"punctuation\", \"$\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"function\", \"asciimath\"], [\"punctuation\", \":\"],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"quoted\", [\r\n\t\t\t\t[\"punctuation\", \"`\"],\r\n\t\t\t\t\"x/x={(1,if x!=0),(text{undefined},if x=0):}\",\r\n\t\t\t\t[\"punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"function\", \"latexmath\"], [\"punctuation\", \":\"],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"quoted\", [\r\n\t\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t\t\"\\\\sum_{n=1}^\\\\infty \\\\frac{1}{2^n}\",\r\n\t\t\t\t[\"punctuation\", \"$\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for attributes."
  },
  {
    "path": "tests/languages/asciidoc/callout_feature.test",
    "content": "Foobar <1>\r\n<1> Foo\r\n1> Bar\r\n> Baz\r\n\r\n|====\r\n| Foobar <1>\r\n<1> Foo\r\n1> Bar\r\n> Baz\r\n|====\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"Foobar \", [\"callout\", \"<1>\"],\r\n\t[\"callout\", \"<1>\"], \" Foo\\r\\n\",\r\n\t[\"callout\", \"1>\"], \" Bar\\r\\n\",\r\n\t[\"callout\", \">\"], \" Baz\\r\\n\\r\\n\",\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|====\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t\" Foobar \", [\"callout\", \"<1>\"],\r\n\t\t[\"callout\", \"<1>\"], \" Foo\\r\\n\",\r\n\t\t[\"callout\", \"1>\"], \" Bar\\r\\n\",\r\n\t\t[\"callout\", \">\"], \" Baz\\r\\n\",\r\n\t\t[\"punctuation\", \"|====\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for callouts."
  },
  {
    "path": "tests/languages/asciidoc/comment-block_feature.test",
    "content": "////\r\n////\r\n\r\n////\r\nFoobar\r\n\r\nBaz\r\n////\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment-block\", \"////\\r\\n////\"],\r\n\t[\"comment-block\", \"////\\r\\nFoobar\\r\\n\\r\\nBaz\\r\\n////\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comment blocks."
  },
  {
    "path": "tests/languages/asciidoc/comment_feature.test",
    "content": "//\r\n// Foobar\r\n\r\n******\r\n//\r\n// Foobar\r\n******\r\n\r\n|======\r\n|\r\n//\r\n|\r\n// Foobar\r\n|======\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// Foobar\"],\r\n\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"******\"],\r\n\t\t[\"comment\", \"//\"],\r\n\t\t[\"comment\", \"// Foobar\"],\r\n\t\t[\"punctuation\", \"******\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|======\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"comment\", \"//\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"comment\", \"// Foobar\"],\r\n\t\t[\"punctuation\", \"|======\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/asciidoc/entity_feature.html.test",
    "content": "&#x278a;\n&#182;\n\n----------------------------------------------------\n\n<span class=\"token entity\" title=\"&#x278a;\">&amp;#x278a;</span>\n<span class=\"token entity\" title=\"&#182;\">&amp;#182;</span>\n"
  },
  {
    "path": "tests/languages/asciidoc/entity_feature.test",
    "content": "&#x278a; &#182;\r\n\r\n&#x278a; &#182;\r\n============\r\n\r\n['&#x278a; &#182;']\r\n\r\n--\r\n&#x278a; &#182;\r\n--\r\n\r\n|======\r\n| &#x278a; &#182;\r\n|======\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"entity\", \"&#x278a;\"], [\"entity\", \"&#182;\"],\r\n\t[\"title\", [\r\n\t\t[\"entity\", \"&#x278a;\"], [\"entity\", \"&#182;\"],\r\n\t\t[\"punctuation\", \"============\"]\r\n\t]],\r\n\t[\"attributes\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"interpreted\", [\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t[\"entity\", \"&#x278a;\"], [\"entity\", \"&#182;\"],\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"--\"],\r\n\t\t[\"entity\", \"&#x278a;\"], [\"entity\", \"&#182;\"],\r\n\t\t[\"punctuation\", \"--\"]\r\n\t]],\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|======\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"entity\", \"&#x278a;\"], [\"entity\", \"&#182;\"],\r\n\t\t[\"punctuation\", \"|======\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for entities."
  },
  {
    "path": "tests/languages/asciidoc/hr_feature.test",
    "content": "'''\r\n\r\n''''''''''\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"hr\", \"'''\"],\r\n\t[\"hr\", \"''''''''''\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hr."
  },
  {
    "path": "tests/languages/asciidoc/indented-block_feature.test",
    "content": ".\r\n\r\n\t(TM) __foobar__\r\n\t:bar: baz\r\n\r\n Foo *bar* baz\r\n // Foobar\r\n == Foobar ==\r\n\r\n    Title\r\n    ~~~~~\r\n    .....\r\n    .....\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\".\\r\\n\\r\\n\",\r\n\t[\"indented-block\", \"\\t(TM) __foobar__\\r\\n\\t:bar: baz\"],\r\n\t[\"indented-block\", \" Foo *bar* baz\\r\\n // Foobar\\r\\n == Foobar ==\"],\r\n\t[\"indented-block\", \"    Title\\r\\n    ~~~~~\\r\\n    .....\\r\\n    .....\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for indented blocks.\r\nAlso checks that nothing gets highlighted inside.\r\nThe initial dot is required because tests are trimmed."
  },
  {
    "path": "tests/languages/asciidoc/inline_feature.test",
    "content": "_emphasis_\r\n``double quotes''\r\n`single quotes'\r\n`monospace`\r\n'emphasis'\r\n*strong*\r\n+monospace+\r\n#unquoted#\r\n\r\n_foo _ bar baz_\r\n`foo ' bar baz'\r\n`foo ` bar baz`\r\n'foo ' bar baz'\r\n*foo * bar baz*\r\n+foo + bar baz+\r\n#foo # bar baz#\r\n\r\n_foo\r\nbar_\r\n``foo\r\nbar''\r\n`foo\r\nbar'\r\n`foo\r\nbar`\r\n'foo\r\nbar'\r\n*foo\r\nbar*\r\n+foo\r\nbar+\r\n#foo\r\nbar#\r\n\r\nfoo__emphasis__bar\r\nfoo**strong**bar\r\nfoo++monospace++bar\r\nfoo+++passthrough+++bar\r\nfoo##unquoted##bar\r\nfoo$$passthrough$$bar\r\nfoo~subscript~bar\r\nfoo^superscript^bar\r\nfoo{attribute-reference}bar\r\nfoo[[anchor]]bar\r\nfoo[[[bibliography anchor]]]bar\r\nfoo<<xref>>bar\r\nfoo(((indexes)))bar\r\nfoo((indexes))bar\r\n\r\n====\r\n_emphasis_\r\n``double quotes''\r\n`single quotes'\r\n`monospace`\r\n'emphasis'\r\n*strong*\r\n+monospace+\r\n#unquoted#\r\n__emphasis__\r\n**strong**\r\n++monospace++\r\n+++passthrough+++\r\n##unquoted##\r\n$$passthrough$$\r\n~subscript~\r\n^superscript^\r\n{attribute-reference}\r\n[[anchor]]\r\n[[[bibliography anchor]]]\r\n<<xref>>\r\n(((indexes)))\r\n((indexes))\r\n====\r\n\r\n|====\r\n|\r\n_emphasis_\r\n``double quotes''\r\n`single quotes'\r\n`monospace`\r\n'emphasis'\r\n*strong*\r\n+monospace+\r\n#unquoted#\r\n__emphasis__\r\n**strong**\r\n++monospace++\r\n+++passthrough+++\r\n##unquoted##\r\n$$passthrough$$\r\n~subscript~\r\n^superscript^\r\n{attribute-reference}\r\n[[anchor]]\r\n[[[bibliography anchor]]]\r\n<<xref>>\r\n(((indexes)))\r\n((indexes))\r\n|====\r\n\r\n['foo *bar* baz']\r\n\r\n== foo *bar* baz ==\r\n\r\n{names=value}\r\n{names?value}\r\n{names!value}\r\n{names#value}\r\n{names%value}\r\n{names@regexp:value1:value2}\r\n{names$regexp:value1:value2}\r\n{names$regexp::value}\r\n{foo,bar=foobar}\r\n{foo+bar=foobar}\r\n{counter:attrname}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"inline\", [\r\n\t\t[\"italic\", [[\"punctuation\", \"_\"], \"emphasis\", [\"punctuation\", \"_\"]]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"``\"], \"double quotes\", [\"punctuation\", \"''\"]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"`\"], \"single quotes\", [\"punctuation\", \"'\"]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"`\"], \"monospace\", [\"punctuation\", \"`\"]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"italic\", [[\"punctuation\", \"'\"], \"emphasis\", [\"punctuation\", \"'\"]]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"bold\", [[\"punctuation\", \"*\"], \"strong\", [\"punctuation\", \"*\"]]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"+\"], \"monospace\", [\"punctuation\", \"+\"]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"#\"], \"unquoted\", [\"punctuation\", \"#\"]\r\n\t]],\r\n\r\n\t[\"inline\", [\r\n\t\t[\"italic\", [[\"punctuation\", \"_\"], \"foo _ bar baz\", [\"punctuation\", \"_\"]]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"`\"], \"foo ' bar baz\", [\"punctuation\", \"'\"]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"`\"], \"foo ` bar baz\", [\"punctuation\", \"`\"]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"italic\", [[\"punctuation\", \"'\"], \"foo ' bar baz\", [\"punctuation\", \"'\"]]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"bold\", [[\"punctuation\", \"*\"], \"foo * bar baz\", [\"punctuation\", \"*\"]]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"+\"], \"foo + bar baz\", [\"punctuation\", \"+\"]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"#\"], \"foo # bar baz\", [\"punctuation\", \"#\"]\r\n\t]],\r\n\r\n\t[\"inline\", [\r\n\t\t[\"italic\", [[\"punctuation\", \"_\"], \"foo\\r\\nbar\", [\"punctuation\", \"_\"]]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"``\"], \"foo\\r\\nbar\", [\"punctuation\", \"''\"]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"`\"], \"foo\\r\\nbar\", [\"punctuation\", \"'\"]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"`\"], \"foo\\r\\nbar\", [\"punctuation\", \"`\"]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"italic\", [[\"punctuation\", \"'\"], \"foo\\r\\nbar\", [\"punctuation\", \"'\"]]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"bold\", [[\"punctuation\", \"*\"], \"foo\\r\\nbar\", [\"punctuation\", \"*\"]]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"+\"], \"foo\\r\\nbar\", [\"punctuation\", \"+\"]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"#\"], \"foo\\r\\nbar\", [\"punctuation\", \"#\"]\r\n\t]],\r\n\r\n\t\"\\r\\n\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"italic\", [[\"punctuation\", \"__\"], \"emphasis\", [\"punctuation\", \"__\"]]]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"bold\", [[\"punctuation\", \"**\"], \"strong\", [\"punctuation\", \"**\"]]]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"++\"], \"monospace\", [\"punctuation\", \"++\"]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"+++\"], \"passthrough\", [\"punctuation\", \"+++\"]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"##\"], \"unquoted\", [\"punctuation\", \"##\"]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"$$\"], \"passthrough\", [\"punctuation\", \"$$\"]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"~\"], \"subscript\", [\"punctuation\", \"~\"]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"^\"], \"superscript\", [\"punctuation\", \"^\"]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"attribute-ref\", [[\"punctuation\", \"{\"], [\"variable\", \"attribute-reference\"], [\"punctuation\", \"}\"]]]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"url\", [[\"punctuation\", \"[[\"], \"anchor\", [\"punctuation\", \"]]\"]]]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"url\", [[\"punctuation\", \"[[[\"], \"bibliography anchor\", [\"punctuation\", \"]]]\"]]]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"url\", [[\"punctuation\", \"<<\"], \"xref\", [\"punctuation\", \">>\"]]]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"(((\"], \"indexes\", [\"punctuation\", \")))\"]\r\n\t]],\r\n\t\"bar\\r\\nfoo\",\r\n\t[\"inline\", [\r\n\t\t[\"punctuation\", \"((\"], \"indexes\", [\"punctuation\", \"))\"]\r\n\t]],\r\n\t\"bar\\r\\n\\r\\n\",\r\n\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"====\"],\r\n\r\n\t\t[\"inline\", [\r\n\t\t\t[\"italic\", [[\"punctuation\", \"_\"], \"emphasis\", [\"punctuation\", \"_\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"``\"], \"double quotes\", [\"punctuation\", \"''\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"`\"], \"single quotes\", [\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"`\"], \"monospace\", [\"punctuation\", \"`\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"italic\", [[\"punctuation\", \"'\"], \"emphasis\", [\"punctuation\", \"'\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"bold\", [[\"punctuation\", \"*\"], \"strong\", [\"punctuation\", \"*\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"+\"], \"monospace\", [\"punctuation\", \"+\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"#\"], \"unquoted\", [\"punctuation\", \"#\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"italic\", [[\"punctuation\", \"__\"], \"emphasis\", [\"punctuation\", \"__\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"bold\", [[\"punctuation\", \"**\"], \"strong\", [\"punctuation\", \"**\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"++\"], \"monospace\", [\"punctuation\", \"++\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"+++\"], \"passthrough\", [\"punctuation\", \"+++\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"##\"], \"unquoted\", [\"punctuation\", \"##\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"$$\"], \"passthrough\", [\"punctuation\", \"$$\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"~\"], \"subscript\", [\"punctuation\", \"~\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"^\"], \"superscript\", [\"punctuation\", \"^\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"attribute-ref\", [[\"punctuation\", \"{\"], [\"variable\", \"attribute-reference\"], [\"punctuation\", \"}\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"url\", [[\"punctuation\", \"[[\"], \"anchor\", [\"punctuation\", \"]]\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"url\", [[\"punctuation\", \"[[[\"], \"bibliography anchor\", [\"punctuation\", \"]]]\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"url\", [[\"punctuation\", \"<<\"], \"xref\", [\"punctuation\", \">>\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"(((\"], \"indexes\", [\"punctuation\", \")))\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"((\"], \"indexes\", [\"punctuation\", \"))\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"====\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|====\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t[\"inline\", [\r\n\t\t\t[\"italic\", [[\"punctuation\", \"_\"], \"emphasis\", [\"punctuation\", \"_\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"``\"], \"double quotes\", [\"punctuation\", \"''\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"`\"], \"single quotes\", [\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"`\"], \"monospace\", [\"punctuation\", \"`\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"italic\", [[\"punctuation\", \"'\"], \"emphasis\", [\"punctuation\", \"'\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"bold\", [[\"punctuation\", \"*\"], \"strong\", [\"punctuation\", \"*\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"+\"], \"monospace\", [\"punctuation\", \"+\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"#\"], \"unquoted\", [\"punctuation\", \"#\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"italic\", [[\"punctuation\", \"__\"], \"emphasis\", [\"punctuation\", \"__\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"bold\", [[\"punctuation\", \"**\"], \"strong\", [\"punctuation\", \"**\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"++\"], \"monospace\", [\"punctuation\", \"++\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"+++\"], \"passthrough\", [\"punctuation\", \"+++\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"##\"], \"unquoted\", [\"punctuation\", \"##\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"$$\"], \"passthrough\", [\"punctuation\", \"$$\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"~\"], \"subscript\", [\"punctuation\", \"~\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"^\"], \"superscript\", [\"punctuation\", \"^\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"attribute-ref\", [[\"punctuation\", \"{\"], [\"variable\", \"attribute-reference\"], [\"punctuation\", \"}\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"url\", [[\"punctuation\", \"[[\"], \"anchor\", [\"punctuation\", \"]]\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"url\", [[\"punctuation\", \"[[[\"], \"bibliography anchor\", [\"punctuation\", \"]]]\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"url\", [[\"punctuation\", \"<<\"], \"xref\", [\"punctuation\", \">>\"]]]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"(((\"], \"indexes\", [\"punctuation\", \")))\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"((\"], \"indexes\", [\"punctuation\", \"))\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"|====\"]\r\n\t]],\r\n\r\n\t[\"attributes\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"interpreted\", [\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"foo \", [\"inline\", [[\"bold\", [[\"punctuation\", \"*\"], \"bar\", [\"punctuation\", \"*\"]]]]], \" baz\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"==\"],\r\n\t\t\" foo \", [\"inline\", [[\"bold\", [[\"punctuation\", \"*\"], \"bar\", [\"punctuation\", \"*\"]]]]], \" baz \",\r\n\t\t[\"punctuation\", \"==\"]\r\n\t]],\r\n\r\n\t[\"inline\", [\r\n\t\t[\"attribute-ref\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"names\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\"value\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"attribute-ref\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"names\"],\r\n\t\t\t[\"operator\", \"?\"],\r\n\t\t\t\"value\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"attribute-ref\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"names\"],\r\n\t\t\t[\"operator\", \"!\"],\r\n\t\t\t\"value\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"attribute-ref\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"names\"],\r\n\t\t\t[\"operator\", \"#\"],\r\n\t\t\t\"value\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"attribute-ref\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"names\"],\r\n\t\t\t[\"operator\", \"%\"],\r\n\t\t\t\"value\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"attribute-ref\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"names\"],\r\n\t\t\t[\"operator\", \"@\"],\r\n\t\t\t\"regexp\", [\"punctuation\", \":\"],\r\n\t\t\t\"value1\", [\"punctuation\", \":\"],\r\n\t\t\t\"value2\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"attribute-ref\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"names\"],\r\n\t\t\t[\"operator\", \"$\"],\r\n\t\t\t\"regexp\", [\"punctuation\", \":\"],\r\n\t\t\t\"value1\", [\"punctuation\", \":\"],\r\n\t\t\t\"value2\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"attribute-ref\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"names\"],\r\n\t\t\t[\"operator\", \"$\"],\r\n\t\t\t\"regexp\", [\"punctuation\", \"::\"],\r\n\t\t\t\"value\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n    [\"inline\", [\r\n\t\t[\"attribute-ref\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"foo,bar\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\"foobar\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"attribute-ref\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"foo+bar\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\"foobar\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"inline\", [\r\n\t\t[\"attribute-ref\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"counter\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\"attrname\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all kinds of inline quoted text."
  },
  {
    "path": "tests/languages/asciidoc/issue3480.test",
    "content": "// View this document online at https://asciidoctor.org/docs/asciidoc-writers-guide/\n= AsciiDoc Writer's Guide\nDan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White <https://github.com/graphitefriction[@graphitefriction]>\n:description: This guide describes the basic structure of an AsciiDoc document, how to create your first AsciiDoc document, how to add other structural elements such as lists, block quotes and source code, and how to convert an AsciiDoc document to HTML, DocBook and PDF.\n:keywords: AsciiDoc, Asciidoctor, syntax, reference, learn, how to, writers, authors\n:page-description: {description}\n:page-keywords: {keywords}\n:page-layout: docs\nifndef::env-site[]\n:toc: left\n:icons: font\n:idprefix:\n:idseparator: -\n:sectanchors:\n:source-highlighter: highlightjs\nendif::[]\n:experimental:\n:mdash: &#8212;\n:language: asciidoc\n:source-language: {language}\n:table-caption!:\n:example-caption!:\n:figure-caption!:\n:imagesdir: ../images\n// Refs\n:url-docs-asciidoc: https://docs.asciidoctor.org/asciidoc/latest/\n:url-quickref: {url-docs-asciidoc}syntax-quick-reference/\n:user-ref: https://asciidoctor.org/docs/user-manual\n:asciidoctor-ref: https://asciidoctor.org/\n:asciidoctor-gem-ref: https://rubygems.org/gems/asciidoctor\n:uri-install: https://asciidoctor.org/docs/install-toolchain/\n:fopub-doc-ref: https://github.com/asciidoctor/asciidoctor-fopub#readme\n:docs-ref: https://asciidoctor.org/docs\n:gist-ref: https://gist.github.com\n:snippets-ref: https://gitlab.com/explore/snippets\n:publican-ref: https://fedorahosted.org/publican\n\nThis guide provides a gentle introduction to AsciiDoc, a _plain text_ documentation *syntax* and *processor*.\nThis introduction is intended for anyone who wants to reduce the effort required to write and publish content, whether for technical documentation, articles, web pages or good ol'-fashioned prose.\n\nTIP: If you want to know what AsciiDoc is all about, find the answer in {url-docs-asciidoc}#about-asciidoc[About AsciiDoc].\nIf you're looking for a concise survey of the AsciiDoc syntax, consult the {url-quickref}[AsciiDoc Syntax Quick Reference].\n\nIn this guide, you'll learn:\n\n- The basic structure of an AsciiDoc document\n- How to create your first AsciiDoc document\n- How to add other structural elements such as lists, block quotes and source code\n- How to convert an AsciiDoc document to HTML, DocBook and PDF\n\nIn addition to covering the AsciiDoc basics, this guide also suggests a set of conventions to help you create more consistent documents and maximize your writing productivity.\n\nLet's dive in to AsciiDoc!\n\n== Writing in AsciiDoc\n\nThe goal of this section is to teach you how to compose your first AsciiDoc document.\nHopefully, when you look back, you'll agree it just makes sense.\n\nYour adventure with AsciiDoc begins in your favorite text editor.\n\n=== It's just text, mate.\n\nSince AsciiDoc syntax is just _plain text_, you can write an AsciiDoc document using _any_ text editor.\nYou don't need complex word processing programs like Microsoft Word, OpenOffice Writer or Google Docs.\nIn fact, you _shouldn't_ use these programs because they add cruft to your document (that you can't see) and makes conversion tedious.\n\nTIP: While it's true any text editor will do, I recommend selecting an editor that supports syntax highlighting for AsciiDoc.\nThe *[red]##c##[green]##o##[purple]##l##[fuchsia]##o##[blue]##r##* brings contrast to the text, making it easier to read.\nThe highlighting also confirms when you've entered the correct syntax for an inline or block element.\n\nThe most popular application for editing plain text on macOS is *TextMate*.\nA similar choice on Linux is *GEdit*.\nOn Windows, stay away from Notepad and Wordpad because they produce plain text which is not cross-platform friendly.\nOpt instead for a competent text editor like *Notepad++*.\nIf you're a programmer (or a writer with an inner geek), you'll likely prefer *Vim*, *Emacs*, or *Sublime Text*, all of which are available cross-platform.\nThe key feature all these editors share is syntax highlighting for AsciiDoc.\n\nOpen up your favorite text editor and get ready to write some AsciiDoc!\n\n=== Content is king!\n\nThe bulk of the content in a document is paragraph text.\nThis is why Asciidoctor doesn't require any special markup or attributes to specify paragraph content.\nYou can just start typing.\n\nIn Asciidoctor, adjacent or consecutive lines of text form a paragraph element.\nTo start a new paragraph after another element, such as a section title or table, hit the kbd:[RETURN] key twice to insert a blank line, and then continue typing your content.\n\n.Two paragraphs in an AsciiDoc document\n[source]\n----\nThis journey begins one late Monday afternoon in Antwerp.\nOur team desperately needs coffee, but none of us dare open the office door.\n\nTo leave means code dismemberment and certain death.\n----\n\n.The two paragraphs rendered using the default (html5) converter and stylesheet (asciidoctor.css)\n====\nThis journey begins one late Monday afternoon in Antwerp.\nOur team desperately needs coffee, but none of us dare open the office door.\n\nTo leave means code dismemberment and certain death.\n====\n\nJust like that, *you're writing in AsciiDoc!*\nAs you can see, it's just like writing an e-mail.\n\nSave the file with a file extension of `.adoc`.\n\nTIP: If you want to find out how to convert the document to HTML, DocBook or PDF, skip ahead to the section on <<converting-your-document>>.\n\n==== Wrapped text and hard line breaks\n\nSince adjacent lines of text are combined into a single paragraph when Asciidoctor converts a document, that means you can wrap paragraph text or put each sentence or phrase on a separate line.\nThe line breaks won't appear in the output.\n\nHowever, if you want the line breaks in a paragraph to be preserved, you can either use a space followed by a plus sign (`{plus}`) or set the `hardbreaks` option on the paragraph.\nThis results in a visible line break (e.g., `<br>`) following each line.\n\n[source]\n.Line breaks preserved using a space followed by the plus sign ({plus})\n----\nRubies are red, +\nTopazes are blue.\n----\n\n====\nRubies are red, +\nTopazes are blue.\n====\n\n[source]\n.Line breaks preserved using the hardbreaks option\n----\n[%hardbreaks]\nRuby is red.\nJava is black.\n----\n\n====\n[%hardbreaks]\nRuby is red.\nJava is black.\n====\n\nTo preserve line breaks throughout your whole document, add the `hardbreaks` attribute to the document's header.\n\n.Line breaks preserved throughout the document using the hardbreaks attribute\n[source]\n----\n= Line Break Doc Title\n:hardbreaks:\n\nRubies are red,\nTopazes are blue.\n----\n\n=== Admonitions\n\nThere are certain statements you may want to draw attention to by taking them out of the content's flow and labeling them with a priority.\nThese are called admonitions.\nIt's rendered style is determined by the assigned label (i.e., value).\nAsciidoctor provides five admonition style labels:\n\n* `NOTE`\n* `TIP`\n* `IMPORTANT`\n* `CAUTION`\n* `WARNING`\n\n.Caution vs. Warning\n[#caution-vs-warning]\n****\nWhen choosing the admonition type, you may find yourself getting confused between \"caution\" and \"warning\" as these words are often used interchangeably.\nHere's a simple rule to help you differentiate the two:\n\n* Use *CAUTION* to advise the reader to _act_ carefully (i.e., exercise care).\n* Use *WARNING* to inform the reader of danger, harm, or consequences that exist.\n\nTo find a deeper analysis, see https://www.differencebetween.com/difference-between-caution-and-vs-warning/.\n****\n\nWhen you want to call attention to a single paragraph, start the first line of the paragraph with the label you want to use.\nThe label must be uppercase and followed by a colon (`:`).\n\n.Admonition paragraph syntax\n[source]\n----\nWARNING: Wolpertingers are known to nest in server racks. <1> <2>\nEnter at your own risk.\n----\n<1> The label must be uppercase and immediately followed by a colon (`:`).\n<2> Separate the first line of the paragraph from the label by a single space.\n\n.Result: Admonition paragraph\n====\nWARNING: Wolpertingers are known to nest in server racks.\nEnter at your own risk.\n====\n\nAn admonition paragraph is rendered in a callout box with the admonition label--or its corresponding icon--in the gutter.\nIcons are enabled by setting the `icons` attribute on the document.\n\nNOTE: Admonitions can also encapsulate any block content, which we'll cover later.\n\n=== Mild punctuation, strong impact\n\nJust as we emphasize certain words and phrases when we speak, we can emphasize them in text by surrounding them with punctuation.\nAsciiDoc refers to this markup as _quoted text_.\n\n==== Quoted text\n\nFor instance, in an e-mail, you might \"`speak`\" a word louder by enclosing it in asterisks.\n\n[source]\nI can't believe it, we *won*!\n\nAs you would expect, the asterisks make the text *won* bold.\nYou can almost sense the emotion.\nThis is one example of quoted (i.e., formatted) text.\n\nNOTE: The term \"`quote`\" is used liberally here to apply to any symbols that surround text in order to apply emphasis or special meaning.\n\nHere are the forms of quoted text that AsciiDoc recognizes:\n\n.Bold, italic, and monospace formatting syntax\n[source]\n----\nbold *constrained* & **un**constrained\n\nitalic _constrained_ & __un__constrained\n\nbold italic *_constrained_* & **__un__**constrained\n\nmonospace `constrained` & ``un``constrained\n\nmonospace bold `*constrained*` & ``**un**``constrained\n\nmonospace italic `_constrained_` & ``__un__``constrained\n\nmonospace bold italic `*_constrained_*` & ``**__un__**``constrained\n----\n\nWhen you want to quote text (e.g., place emphasis) somewhere other than at the boundaries of a word, you need to double up the punctuation.\n\n.Result: Bold, italic, and monospace text\n====\nbold *constrained* & **un**constrained\n\nitalic _constrained_ & __un__constrained\n\nbold italic *_constrained_* & **__un__**constrained\n\nmonospace `constrained` & ``un``constrained\n\nmonospace bold `*constrained*` & ``**un**``constrained\n\nmonospace italic `_constrained_` & ``__un__``constrained\n\nmonospace bold italic `*_constrained_*` & ``**__un__**``constrained\n====\n\nAny quoted text can be prefixed with an attribute list.\nThe first positional attribute is treated as a role.\nThe role can be used to apply custom styling to the text.\nFor instance:\n\n[source]\nType the word [.userinput]#asciidoc# into the search bar.\n\nWhen converting to HTML, the word \"`asciidoc`\" is wrapped in `<span>` tags and the role is used as the element's CSS class:\n\n[source,xml]\n<span class=\"userinput\">asciidoc</span>\n\nYou can apply styles to the text using CSS.\n\nYou may not always want these substitutions to take place.\nIn those cases, you'll need to use markup to escape the text.\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// View this document online at https://asciidoctor.org/docs/asciidoc-writers-guide/\"],\n\t[\"title\", [\n\t\t[\"punctuation\", \"=\"],\n\t\t\" AsciiDoc Writer's Guide\"\n\t]],\n\t\"\\r\\nDan Allen <\",\n\t[\"macro\", [\n\t\t[\"function\", \"https\"],\n\t\t[\"punctuation\", \":\"],\n\t\t\"//github.com/mojavelinux\",\n\t\t[\"attributes\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"attr-value\", \"@mojavelinux\"],\n\t\t\t[\"punctuation\", \"]\"]\n\t\t]]\n\t]],\n\t\">; Sarah White <\",\n\t[\"macro\", [\n\t\t[\"function\", \"https\"],\n\t\t[\"punctuation\", \":\"],\n\t\t\"//github.com/graphitefriction\",\n\t\t[\"attributes\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"attr-value\", \"@graphitefriction\"],\n\t\t\t[\"punctuation\", \"]\"]\n\t\t]]\n\t]],\n\t\">\\r\\n\",\n\t[\"attribute-entry\", \":description: This guide describes the basic structure of an AsciiDoc document, how to create your first AsciiDoc document, how to add other structural elements such as lists, block quotes and source code, and how to convert an AsciiDoc document to HTML, DocBook and PDF.\"],\n\t[\"attribute-entry\", \":keywords: AsciiDoc, Asciidoctor, syntax, reference, learn, how to, writers, authors\"],\n\t[\"attribute-entry\", \":page-description: {description}\"],\n\t[\"attribute-entry\", \":page-keywords: {keywords}\"],\n\t[\"attribute-entry\", \":page-layout: docs\"],\n\t[\"macro\", [\n\t\t[\"function\", \"ifndef\"],\n\t\t[\"punctuation\", \"::\"],\n\t\t\"env-site\",\n\t\t[\"attributes\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"punctuation\", \"]\"]\n\t\t]]\n\t]],\n\t[\"attribute-entry\", \":toc: left\"],\n\t[\"attribute-entry\", \":icons: font\"],\n\t[\"attribute-entry\", \":idprefix:\"],\n\t[\"attribute-entry\", \":idseparator: -\"],\n\t[\"attribute-entry\", \":sectanchors:\"],\n\t[\"attribute-entry\", \":source-highlighter: highlightjs\"],\n\t[\"macro\", [\n\t\t[\"function\", \"endif\"],\n\t\t[\"punctuation\", \"::\"],\n\t\t[\"attributes\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"punctuation\", \"]\"]\n\t\t]]\n\t]],\n\t[\"attribute-entry\", \":experimental:\"],\n\t[\"attribute-entry\", \":mdash: &#8212;\"],\n\t[\"attribute-entry\", \":language: asciidoc\"],\n\t[\"attribute-entry\", \":source-language: {language}\"],\n\t[\"attribute-entry\", \":table-caption!:\"],\n\t[\"attribute-entry\", \":example-caption!:\"],\n\t[\"attribute-entry\", \":figure-caption!:\"],\n\t[\"attribute-entry\", \":imagesdir: ../images\"],\n\t[\"comment\", \"// Refs\"],\n\t[\"attribute-entry\", \":url-docs-asciidoc: https://docs.asciidoctor.org/asciidoc/latest/\"],\n\t[\"attribute-entry\", \":url-quickref: {url-docs-asciidoc}syntax-quick-reference/\"],\n\t[\"attribute-entry\", \":user-ref: https://asciidoctor.org/docs/user-manual\"],\n\t[\"attribute-entry\", \":asciidoctor-ref: https://asciidoctor.org/\"],\n\t[\"attribute-entry\", \":asciidoctor-gem-ref: https://rubygems.org/gems/asciidoctor\"],\n\t[\"attribute-entry\", \":uri-install: https://asciidoctor.org/docs/install-toolchain/\"],\n\t[\"attribute-entry\", \":fopub-doc-ref: https://github.com/asciidoctor/asciidoctor-fopub#readme\"],\n\t[\"attribute-entry\", \":docs-ref: https://asciidoctor.org/docs\"],\n\t[\"attribute-entry\", \":gist-ref: https://gist.github.com\"],\n\t[\"attribute-entry\", \":snippets-ref: https://gitlab.com/explore/snippets\"],\n\t[\"attribute-entry\", \":publican-ref: https://fedorahosted.org/publican\"],\n\n\t\"\\r\\n\\r\\nThis guide provides a gentle introduction to AsciiDoc, a \",\n\t[\"inline\", [\n\t\t[\"italic\", [\n\t\t\t[\"punctuation\", \"_\"],\n\t\t\t\"plain text\",\n\t\t\t[\"punctuation\", \"_\"]\n\t\t]]\n\t]],\n\t\" documentation \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"syntax\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\t\" and \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"processor\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\t\".\\r\\nThis introduction is intended for anyone who wants to reduce the effort required to write and publish content, whether for technical documentation, articles, web pages or good ol'-fashioned prose.\\r\\n\\r\\n\",\n\n\t[\"admonition\", \"TIP:\"],\n\t\" If you want to know what AsciiDoc is all about, find the answer in \",\n\t[\"inline\", [\n\t\t[\"attribute-ref\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"variable\", \"url-docs-asciidoc\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\t\"#about-asciidoc[About AsciiDoc].\\r\\nIf you're looking for a concise survey of the AsciiDoc syntax, consult the \",\n\t[\"inline\", [\n\t\t[\"attribute-ref\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"variable\", \"url-quickref\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\t\"[AsciiDoc Syntax Quick Reference].\\r\\n\\r\\nIn this guide, you'll learn:\\r\\n\\r\\n\",\n\n\t[\"list-punctuation\", \"-\"],\n\t\" The basic structure of an AsciiDoc document\\r\\n\",\n\n\t[\"list-punctuation\", \"-\"],\n\t\" How to create your first AsciiDoc document\\r\\n\",\n\n\t[\"list-punctuation\", \"-\"],\n\t\" How to add other structural elements such as lists, block quotes and source code\\r\\n\",\n\n\t[\"list-punctuation\", \"-\"],\n\t\" How to convert an AsciiDoc document to HTML, DocBook and PDF\\r\\n\\r\\nIn addition to covering the AsciiDoc basics, this guide also suggests a set of conventions to help you create more consistent documents and maximize your writing productivity.\\r\\n\\r\\nLet's dive in to AsciiDoc!\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \"==\"],\n\t\t\" Writing in AsciiDoc\"\n\t]],\n\n\t\"\\r\\n\\r\\nThe goal of this section is to teach you how to compose your first AsciiDoc document.\\r\\nHopefully, when you look back, you'll agree it just makes sense.\\r\\n\\r\\nYour adventure with AsciiDoc begins in your favorite text editor.\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \"===\"],\n\t\t\" It's just text, mate.\"\n\t]],\n\n\t\"\\r\\n\\r\\nSince AsciiDoc syntax is just \",\n\t[\"inline\", [\n\t\t[\"italic\", [\n\t\t\t[\"punctuation\", \"_\"],\n\t\t\t\"plain text\",\n\t\t\t[\"punctuation\", \"_\"]\n\t\t]]\n\t]],\n\t\", you can write an AsciiDoc document using \",\n\t[\"inline\", [\n\t\t[\"italic\", [\n\t\t\t[\"punctuation\", \"_\"],\n\t\t\t\"any\",\n\t\t\t[\"punctuation\", \"_\"]\n\t\t]]\n\t]],\n\t\" text editor.\\r\\nYou don't need complex word processing programs like Microsoft Word, OpenOffice Writer or Google Docs.\\r\\nIn fact, you \",\n\t[\"inline\", [\n\t\t[\"italic\", [\n\t\t\t[\"punctuation\", \"_\"],\n\t\t\t\"shouldn't\",\n\t\t\t[\"punctuation\", \"_\"]\n\t\t]]\n\t]],\n\t\" use these programs because they add cruft to your document (that you can't see) and makes conversion tedious.\\r\\n\\r\\n\",\n\n\t[\"admonition\", \"TIP:\"],\n\t\" While it's true any text editor will do, I recommend selecting an editor that supports syntax highlighting for AsciiDoc.\\r\\nThe \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"[red]##c##[green]##o##[purple]##l##[fuchsia]##o##[blue]##r##\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\t\" brings contrast to the text, making it easier to read.\\r\\nThe highlighting also confirms when you've entered the correct syntax for an inline or block element.\\r\\n\\r\\nThe most popular application for editing plain text on macOS is \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"TextMate\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\t\".\\r\\nA similar choice on Linux is \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"GEdit\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\t\".\\r\\nOn Windows, stay away from Notepad and Wordpad because they produce plain text which is not cross-platform friendly.\\r\\nOpt instead for a competent text editor like \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"Notepad++\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\t\".\\r\\nIf you're a programmer (or a writer with an inner geek), you'll likely prefer \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"Vim\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\t\", \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"Emacs\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\t\", or \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"Sublime Text\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\t\", all of which are available cross-platform.\\r\\nThe key feature all these editors share is syntax highlighting for AsciiDoc.\\r\\n\\r\\nOpen up your favorite text editor and get ready to write some AsciiDoc!\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \"===\"],\n\t\t\" Content is king!\"\n\t]],\n\n\t\"\\r\\n\\r\\nThe bulk of the content in a document is paragraph text.\\r\\nThis is why Asciidoctor doesn't require any special markup or attributes to specify paragraph content.\\r\\nYou can just start typing.\\r\\n\\r\\nIn Asciidoctor, adjacent or consecutive lines of text form a paragraph element.\\r\\nTo start a new paragraph after another element, such as a section title or table, hit the \",\n\t[\"macro\", [\n\t\t[\"function\", \"kbd\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"attributes\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"attr-value\", \"RETURN\"],\n\t\t\t[\"punctuation\", \"]\"]\n\t\t]]\n\t]],\n\t\" key twice to insert a blank line, and then continue typing your content.\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \".\"],\n\t\t\"Two paragraphs in an AsciiDoc document\"\n\t]],\n\t[\"attributes\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-value\", \"source\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"literal-block\", [\n\t\t[\"punctuation\", \"----\"],\n\t\t\"\\r\\nThis journey begins one late Monday afternoon in Antwerp.\\r\\nOur team desperately needs coffee, but none of us dare open the office door.\\r\\n\\r\\nTo leave means code dismemberment and certain death.\\r\\n\",\n\t\t[\"punctuation\", \"----\"]\n\t]],\n\n\t[\"title\", [\n\t\t[\"punctuation\", \".\"],\n\t\t\"The two paragraphs rendered using the default (html5) converter and stylesheet (asciidoctor.css)\"\n\t]],\n\t[\"other-block\", [\n\t\t[\"punctuation\", \"====\"],\n\t\t\"\\r\\nThis journey begins one late Monday afternoon in Antwerp.\\r\\nOur team desperately needs coffee, but none of us dare open the office door.\\r\\n\\r\\nTo leave means code dismemberment and certain death.\\r\\n\",\n\t\t[\"punctuation\", \"====\"]\n\t]],\n\n\t\"\\r\\n\\r\\nJust like that, \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"you're writing in AsciiDoc!\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\n\t\"\\r\\nAs you can see, it's just like writing an e-mail.\\r\\n\\r\\nSave the file with a file extension of \",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\".adoc\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\".\\r\\n\\r\\n\",\n\n\t[\"admonition\", \"TIP:\"],\n\t\" If you want to find out how to convert the document to HTML, DocBook or PDF, skip ahead to the section on \",\n\t[\"inline\", [\n\t\t[\"url\", [\n\t\t\t[\"punctuation\", \"<<\"],\n\t\t\t\"converting-your-document\",\n\t\t\t[\"punctuation\", \">>\"]\n\t\t]]\n\t]],\n\t\".\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \"====\"],\n\t\t\" Wrapped text and hard line breaks\"\n\t]],\n\n\t\"\\r\\n\\r\\nSince adjacent lines of text are combined into a single paragraph when Asciidoctor converts a document, that means you can wrap paragraph text or put each sentence or phrase on a separate line.\\r\\nThe line breaks won't appear in the output.\\r\\n\\r\\nHowever, if you want the line breaks in a paragraph to be preserved, you can either use a space followed by a plus sign (\",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"{plus}\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\") or set the \",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"hardbreaks\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\" option on the paragraph.\\r\\nThis results in a visible line break (e.g., \",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"<br>\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\") following each line.\\r\\n\\r\\n\",\n\n\t[\"attributes\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-value\", \"source\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"title\", [\n\t\t[\"punctuation\", \".\"],\n\t\t\"Line breaks preserved using a space followed by the plus sign (\",\n\t\t[\"inline\", [\n\t\t\t[\"attribute-ref\", [\n\t\t\t\t[\"punctuation\", \"{\"],\n\t\t\t\t[\"variable\", \"plus\"],\n\t\t\t\t[\"punctuation\", \"}\"]\n\t\t\t]]\n\t\t]],\n\t\t\")\"\n\t]],\n\t[\"literal-block\", [\n\t\t[\"punctuation\", \"----\"],\n\t\t\"\\r\\nRubies are red, +\\r\\nTopazes are blue.\\r\\n\",\n\t\t[\"punctuation\", \"----\"]\n\t]],\n\n\t[\"other-block\", [\n\t\t[\"punctuation\", \"====\"],\n\t\t\"\\r\\nRubies are red, \", [\"line-continuation\", \"+\"],\n\t\t\"\\r\\nTopazes are blue.\\r\\n\",\n\t\t[\"punctuation\", \"====\"]\n\t]],\n\n\t[\"attributes\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-value\", \"source\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"title\", [\n\t\t[\"punctuation\", \".\"],\n\t\t\"Line breaks preserved using the hardbreaks option\"\n\t]],\n\t[\"literal-block\", [\n\t\t[\"punctuation\", \"----\"],\n\t\t\"\\r\\n[%hardbreaks]\\r\\nRuby is red.\\r\\nJava is black.\\r\\n\",\n\t\t[\"punctuation\", \"----\"]\n\t]],\n\n\t[\"other-block\", [\n\t\t[\"punctuation\", \"====\"],\n\t\t[\"attributes\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"attr-value\", \"%hardbreaks\"],\n\t\t\t[\"punctuation\", \"]\"]\n\t\t]],\n\t\t\"\\r\\nRuby is red.\\r\\nJava is black.\\r\\n\",\n\t\t[\"punctuation\", \"====\"]\n\t]],\n\n\t\"\\r\\n\\r\\nTo preserve line breaks throughout your whole document, add the \",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"hardbreaks\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\" attribute to the document's header.\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \".\"],\n\t\t\"Line breaks preserved throughout the document using the hardbreaks attribute\"\n\t]],\n\t[\"attributes\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-value\", \"source\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"literal-block\", [\n\t\t[\"punctuation\", \"----\"],\n\t\t\"\\r\\n= Line Break Doc Title\\r\\n:hardbreaks:\\r\\n\\r\\nRubies are red,\\r\\nTopazes are blue.\\r\\n\",\n\t\t[\"punctuation\", \"----\"]\n\t]],\n\n\t[\"title\", [\n\t\t[\"punctuation\", \"===\"],\n\t\t\" Admonitions\"\n\t]],\n\n\t\"\\r\\n\\r\\nThere are certain statements you may want to draw attention to by taking them out of the content's flow and labeling them with a priority.\\r\\nThese are called admonitions.\\r\\nIt's rendered style is determined by the assigned label (i.e., value).\\r\\nAsciidoctor provides five admonition style labels:\\r\\n\\r\\n\",\n\n\t[\"list-punctuation\", \"*\"],\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"NOTE\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\n\t[\"list-punctuation\", \"*\"],\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"TIP\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\n\t[\"list-punctuation\", \"*\"],\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"IMPORTANT\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\n\t[\"list-punctuation\", \"*\"],\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"CAUTION\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\n\t[\"list-punctuation\", \"*\"],\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"WARNING\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\n\t[\"title\", [\n\t\t[\"punctuation\", \".\"],\n\t\t\"Caution vs. Warning\"\n\t]],\n\n\t[\"attributes\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-value\", \"#caution-vs-warning\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"other-block\", [\n\t\t[\"punctuation\", \"****\"],\n\t\t\"\\r\\nWhen choosing the admonition type, you may find yourself getting confused between \\\"caution\\\" and \\\"warning\\\" as these words are often used interchangeably.\\r\\nHere's a simple rule to help you differentiate the two:\\r\\n\\r\\n\",\n\n\t\t[\"list-punctuation\", \"*\"],\n\t\t\" Use \",\n\t\t[\"inline\", [\n\t\t\t[\"bold\", [\n\t\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\t\"CAUTION\",\n\t\t\t\t[\"punctuation\", \"*\"]\n\t\t\t]]\n\t\t]],\n\t\t\" to advise the reader to \",\n\t\t[\"inline\", [\n\t\t\t[\"italic\", [\n\t\t\t\t[\"punctuation\", \"_\"],\n\t\t\t\t\"act\",\n\t\t\t\t[\"punctuation\", \"_\"]\n\t\t\t]]\n\t\t]],\n\t\t\" carefully (i.e., exercise care).\\r\\n\",\n\n\t\t[\"list-punctuation\", \"*\"],\n\t\t\" Use \",\n\t\t[\"inline\", [\n\t\t\t[\"bold\", [\n\t\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\t\"WARNING\",\n\t\t\t\t[\"punctuation\", \"*\"]\n\t\t\t]]\n\t\t]],\n\t\t\" to inform the reader of danger, harm, or consequences that exist.\\r\\n\\r\\nTo find a deeper analysis, see https://www.differencebetween.com/difference-between-caution-and-vs-warning/.\\r\\n\",\n\n\t\t[\"punctuation\", \"****\"]\n\t]],\n\n\t\"\\r\\n\\r\\nWhen you want to call attention to a single paragraph, start the first line of the paragraph with the label you want to use.\\r\\nThe label must be uppercase and followed by a colon (\",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\":\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\").\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \".\"],\n\t\t\"Admonition paragraph syntax\"\n\t]],\n\n\t[\"attributes\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-value\", \"source\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"literal-block\", [\n\t\t[\"punctuation\", \"----\"],\n\t\t\"\\r\\nWARNING: Wolpertingers are known to nest in server racks. \",\n\t\t[\"callout\", \"<1>\"],\n\t\t[\"callout\", \"<2>\"],\n\t\t\"\\r\\nEnter at your own risk.\\r\\n\",\n\t\t[\"punctuation\", \"----\"]\n\t]],\n\n\t[\"callout\", \"<1>\"],\n\t\" The label must be uppercase and immediately followed by a colon (\",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\":\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\").\\r\\n\",\n\n\t[\"callout\", \"<2>\"],\n\t\" Separate the first line of the paragraph from the label by a single space.\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \".\"],\n\t\t\"Result: Admonition paragraph\"\n\t]],\n\t[\"other-block\", [\n\t\t[\"punctuation\", \"====\"],\n\t\t[\"admonition\", \"WARNING:\"],\n\t\t\" Wolpertingers are known to nest in server racks.\\r\\nEnter at your own risk.\\r\\n\",\n\t\t[\"punctuation\", \"====\"]\n\t]],\n\n\t\"\\r\\n\\r\\nAn admonition paragraph is rendered in a callout box with the admonition label--or its corresponding icon--in the gutter.\\r\\nIcons are enabled by setting the \",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"icons\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\" attribute on the document.\\r\\n\\r\\n\",\n\n\t[\"admonition\", \"NOTE:\"],\n\t\" Admonitions can also encapsulate any block content, which we'll cover later.\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \"===\"],\n\t\t\" Mild punctuation, strong impact\"\n\t]],\n\n\t\"\\r\\n\\r\\nJust as we emphasize certain words and phrases when we speak, we can emphasize them in text by surrounding them with punctuation.\\r\\nAsciiDoc refers to this markup as \",\n\t[\"inline\", [\n\t\t[\"italic\", [\n\t\t\t[\"punctuation\", \"_\"],\n\t\t\t\"quoted text\",\n\t\t\t[\"punctuation\", \"_\"]\n\t\t]]\n\t]],\n\t\".\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \"====\"],\n\t\t\" Quoted text\"\n\t]],\n\n\t\"\\r\\n\\r\\nFor instance, in an e-mail, you might \\\"\",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"speak\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\"\\\" a word louder by enclosing it in asterisks.\\r\\n\\r\\n\",\n\n\t[\"attributes\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-value\", \"source\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t\"\\r\\nI can't believe it, we \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"won\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\t\"!\\r\\n\\r\\nAs you would expect, the asterisks make the text \",\n\t[\"inline\", [\n\t\t[\"bold\", [\n\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\"won\",\n\t\t\t[\"punctuation\", \"*\"]\n\t\t]]\n\t]],\n\t\" bold.\\r\\nYou can almost sense the emotion.\\r\\nThis is one example of quoted (i.e., formatted) text.\\r\\n\\r\\n\",\n\n\t[\"admonition\", \"NOTE:\"],\n\t\" The term \\\"\",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"quote\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\"\\\" is used liberally here to apply to any symbols that surround text in order to apply emphasis or special meaning.\\r\\n\\r\\nHere are the forms of quoted text that AsciiDoc recognizes:\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \".\"],\n\t\t\"Bold, italic, and monospace formatting syntax\"\n\t]],\n\t[\"attributes\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-value\", \"source\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"literal-block\", [\n\t\t[\"punctuation\", \"----\"],\n\t\t\"\\r\\nbold *constrained* & **un**constrained\\r\\n\\r\\nitalic _constrained_ & __un__constrained\\r\\n\\r\\nbold italic *_constrained_* & **__un__**constrained\\r\\n\\r\\nmonospace `constrained` & ``un``constrained\\r\\n\\r\\nmonospace bold `*constrained*` & ``**un**``constrained\\r\\n\\r\\nmonospace italic `_constrained_` & ``__un__``constrained\\r\\n\\r\\nmonospace bold italic `*_constrained_*` & ``**__un__**``constrained\\r\\n\",\n\t\t[\"punctuation\", \"----\"]\n\t]],\n\n\t\"\\r\\n\\r\\nWhen you want to quote text (e.g., place emphasis) somewhere other than at the boundaries of a word, you need to double up the punctuation.\\r\\n\\r\\n\",\n\n\t[\"title\", [\n\t\t[\"punctuation\", \".\"],\n\t\t\"Result: Bold, italic, and monospace text\"\n\t]],\n\n\t[\"other-block\", [\n\t\t[\"punctuation\", \"====\"],\n\n\t\t\"\\r\\nbold \",\n\t\t[\"inline\", [\n\t\t\t[\"bold\", [\n\t\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\t\"constrained\",\n\t\t\t\t[\"punctuation\", \"*\"]\n\t\t\t]]\n\t\t]],\n\t\t\" & \",\n\t\t[\"inline\", [\n\t\t\t[\"bold\", [\n\t\t\t\t[\"punctuation\", \"**\"],\n\t\t\t\t\"un\",\n\t\t\t\t[\"punctuation\", \"**\"]\n\t\t\t]]\n\t\t]],\n\t\t\"constrained\\r\\n\\r\\nitalic \",\n\t\t[\"inline\", [\n\t\t\t[\"italic\", [\n\t\t\t\t[\"punctuation\", \"_\"],\n\t\t\t\t\"constrained\",\n\t\t\t\t[\"punctuation\", \"_\"]\n\t\t\t]]\n\t\t]],\n\t\t\" & \",\n\t\t[\"inline\", [\n\t\t\t[\"italic\", [\n\t\t\t\t[\"punctuation\", \"__\"],\n\t\t\t\t\"un\",\n\t\t\t\t[\"punctuation\", \"__\"]\n\t\t\t]]\n\t\t]],\n\t\t\"constrained\\r\\n\\r\\nbold italic \",\n\t\t[\"inline\", [\n\t\t\t[\"bold\", [\n\t\t\t\t[\"punctuation\", \"*\"],\n\t\t\t\t\"_constrained_\",\n\t\t\t\t[\"punctuation\", \"*\"]\n\t\t\t]]\n\t\t]],\n\t\t\" & \",\n\t\t[\"inline\", [\n\t\t\t[\"bold\", [\n\t\t\t\t[\"punctuation\", \"**\"],\n\t\t\t\t\"__un__\",\n\t\t\t\t[\"punctuation\", \"**\"]\n\t\t\t]]\n\t\t]],\n\t\t\"constrained\\r\\n\\r\\nmonospace \",\n\t\t[\"inline\", [\n\t\t\t[\"punctuation\", \"`\"],\n\t\t\t\"constrained\",\n\t\t\t[\"punctuation\", \"`\"]\n\t\t]],\n\t\t\" & `\",\n\t\t[\"inline\", [\n\t\t\t[\"punctuation\", \"`\"],\n\t\t\t\"un\",\n\t\t\t[\"punctuation\", \"`\"]\n\t\t]],\n\t\t[\"inline\", [\n\t\t\t[\"punctuation\", \"`\"],\n\t\t\t\"constrained\\r\\n\\r\\nmonospace bold `*constrained*\",\n\t\t\t[\"punctuation\", \"`\"]\n\t\t]],\n\t\t\" & `\",\n\t\t[\"inline\", [\n\t\t\t[\"punctuation\", \"`\"],\n\t\t\t\"**un**\",\n\t\t\t[\"punctuation\", \"`\"]\n\t\t]],\n\t\t[\"inline\", [\n\t\t\t[\"punctuation\", \"`\"],\n\t\t\t\"constrained\\r\\n\\r\\nmonospace italic `_constrained_\",\n\t\t\t[\"punctuation\", \"`\"]\n\t\t]],\n\t\t\" & `\",\n\t\t[\"inline\", [\n\t\t\t[\"punctuation\", \"`\"],\n\t\t\t\"__un__\",\n\t\t\t[\"punctuation\", \"`\"]\n\t\t]],\n\t\t[\"inline\", [\n\t\t\t[\"punctuation\", \"`\"],\n\t\t\t\"constrained\\r\\n\\r\\nmonospace bold italic `*_constrained_*\",\n\t\t\t[\"punctuation\", \"`\"]\n\t\t]],\n\t\t\" & `\",\n\t\t[\"inline\", [\n\t\t\t[\"punctuation\", \"`\"],\n\t\t\t\"**__un__**\",\n\t\t\t[\"punctuation\", \"`\"]\n\t\t]],\n\t\t\"`constrained\\r\\n\",\n\n\t\t[\"punctuation\", \"====\"]\n\t]],\n\n\t\"\\r\\n\\r\\nAny quoted text can be prefixed with an attribute list.\\r\\nThe first positional attribute is treated as a role.\\r\\nThe role can be used to apply custom styling to the text.\\r\\nFor instance:\\r\\n\\r\\n\",\n\n\t[\"attributes\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-value\", \"source\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t\"\\r\\nType the word \",\n\t[\"inline\", [\n\t\t[\"attributes\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"attr-value\", \".userinput\"],\n\t\t\t[\"punctuation\", \"]\"]\n\t\t]],\n\t\t[\"punctuation\", \"#\"],\n\t\t\"asciidoc\",\n\t\t[\"punctuation\", \"#\"]\n\t]],\n\t\" into the search bar.\\r\\n\\r\\nWhen converting to HTML, the word \\\"\",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"asciidoc\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\"\\\" is wrapped in \",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"<span>\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t\" tags and the role is used as the element's CSS class:\\r\\n\\r\\n\",\n\n\t[\"attributes\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-value\", \"source\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"attr-value\", \"xml\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"\\r\\n<span class=\\\"userinput\\\">asciidoc</span>\\r\\n\\r\\nYou can apply styles to the text using CSS.\\r\\n\\r\\nYou may not always want these substitutions to take place.\\r\\nIn those cases, you'll need to use markup to escape the text.\"\n]\n"
  },
  {
    "path": "tests/languages/asciidoc/line-continuation_feature.test",
    "content": "Foo +\r\nbar\r\n\r\n* Foo\r\n+\r\nbar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"Foo \", [\"line-continuation\", \"+\"], \"\\r\\nbar\\r\\n\\r\\n\",\r\n\t[\"list-punctuation\", \"*\"], \" Foo\\r\\n\",\r\n\t[\"line-continuation\", \"+\"], \"\\r\\nbar\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for line continuations."
  },
  {
    "path": "tests/languages/asciidoc/list-label_feature.test",
    "content": "In::\r\nLorem::\r\n  Foo bar baz\r\nDolor:::\r\n  Ipsum::::\r\n    Donec;;\r\n      Foobar\r\n\r\n____\r\nIn::\r\nLorem::\r\n  Foo bar baz\r\nDolor:::\r\n  Ipsum::::\r\n    Donec;;\r\n      Foobar\r\n____\r\n\r\n|========\r\n|\r\nIn::\r\nLorem::\r\n  Foo bar baz\r\nDolor:::\r\n  Ipsum::::\r\n    Donec;;\r\n      Foobar\r\n|========\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"list-label\", \"In::\"],\r\n\t[\"list-label\", \"Lorem::\"],\r\n\t\"\\r\\n  Foo bar baz\\r\\n\",\r\n\t[\"list-label\", \"Dolor:::\"],\r\n\t[\"list-label\", \"Ipsum::::\"],\r\n\t[\"list-label\", \"Donec;;\"],\r\n\t\"\\r\\n      Foobar\\r\\n\\r\\n\",\r\n\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"____\"],\r\n\r\n\t\t[\"list-label\", \"In::\"],\r\n\t\t[\"list-label\", \"Lorem::\"],\r\n\t\t\"\\r\\n  Foo bar baz\\r\\n\",\r\n\t\t[\"list-label\", \"Dolor:::\"],\r\n\t\t[\"list-label\", \"Ipsum::::\"],\r\n\t\t[\"list-label\", \"Donec;;\"],\r\n\t\t\"\\r\\n      Foobar\\r\\n\",\r\n\r\n\t\t[\"punctuation\", \"____\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|========\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t[\"list-label\", \"In::\"],\r\n\t\t[\"list-label\", \"Lorem::\"],\r\n\t\t\"\\r\\n  Foo bar baz\\r\\n\",\r\n\t\t[\"list-label\", \"Dolor:::\"],\r\n\t\t[\"list-label\", \"Ipsum::::\"],\r\n\t\t[\"list-label\", \"Donec;;\"],\r\n\t\t\"\\r\\n      Foobar\\r\\n\",\r\n\r\n\t\t[\"punctuation\", \"|========\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for list labels."
  },
  {
    "path": "tests/languages/asciidoc/list-punctuation_feature.test",
    "content": "- Foo\r\n* Foo\r\n** Foo bar\r\n*** Foo\r\n\t1. Foo\r\n\t2. Foo bar\r\n\t42. Foo\r\n**** Foo\r\n***** Foo bar\r\n\r\n. Foo\r\n.. Foo\r\n    a. Foo\r\n    b. Foo\r\n    z. Foo\r\n... Foo bar\r\n.... Foo\r\n\ti) Foo\r\n\tvi) Bar\r\n\txxvii) Baz\r\n..... Foo\r\n\r\n____\r\n. 1\r\n.. 2\r\n____\r\n\r\n|===\r\n|\r\nxi) a\r\nxii) b\r\n|===\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"list-punctuation\", \"-\"], \" Foo\\r\\n\",\r\n\t[\"list-punctuation\", \"*\"], \" Foo\\r\\n\",\r\n\t[\"list-punctuation\", \"**\"], \" Foo bar\\r\\n\",\r\n\t[\"list-punctuation\", \"***\"], \" Foo\\r\\n\\t\",\r\n\t[\"list-punctuation\", \"1.\"], \" Foo\\r\\n\\t\",\r\n\t[\"list-punctuation\", \"2.\"], \" Foo bar\\r\\n\\t\",\r\n\t[\"list-punctuation\", \"42.\"], \" Foo\\r\\n\",\r\n\t[\"list-punctuation\", \"****\"], \" Foo\\r\\n\",\r\n\t[\"list-punctuation\", \"*****\"], \" Foo bar\\r\\n\\r\\n\",\r\n\r\n\t[\"list-punctuation\", \".\"], \" Foo\\r\\n\",\r\n\t[\"list-punctuation\", \"..\"], \" Foo\\r\\n    \",\r\n\t[\"list-punctuation\", \"a.\"], \" Foo\\r\\n    \",\r\n\t[\"list-punctuation\", \"b.\"], \" Foo\\r\\n    \",\r\n\t[\"list-punctuation\", \"z.\"], \" Foo\\r\\n\",\r\n\t[\"list-punctuation\", \"...\"], \" Foo bar\\r\\n\",\r\n\t[\"list-punctuation\", \"....\"], \" Foo\\r\\n\\t\",\r\n\t[\"list-punctuation\", \"i)\"], \" Foo\\r\\n\\t\",\r\n\t[\"list-punctuation\", \"vi)\"], \" Bar\\r\\n\\t\",\r\n\t[\"list-punctuation\", \"xxvii)\"], \" Baz\\r\\n\",\r\n\t[\"list-punctuation\", \".....\"], \" Foo\\r\\n\\r\\n\",\r\n\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"____\"],\r\n\t\t[\"list-punctuation\", \".\"], \" 1\\r\\n\",\r\n\t\t[\"list-punctuation\", \"..\"], \" 2\\r\\n\",\r\n\t\t[\"punctuation\", \"____\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|===\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"list-punctuation\", \"xi)\"], \" a\\r\\n\",\r\n\t\t[\"list-punctuation\", \"xii)\"], \" b\\r\\n\",\r\n\t\t[\"punctuation\", \"|===\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for list punctuation."
  },
  {
    "path": "tests/languages/asciidoc/literal-block_feature.test",
    "content": "----\r\n== Foobar ==\r\nBar _baz_ (TM) <1>\r\n* Foo <2>\r\n<1> Foobar\r\n2> Baz\r\n----\r\n\r\n.......\r\n.Foo\r\n. Foobar <1>\r\ninclude::addendum.txt <2>\r\n> Foo\r\n> Bar\r\n__Foo__**bar**{baz}\r\n.......\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"literal-block\", [\r\n\t\t[\"punctuation\", \"----\"],\r\n\t\t\"\\r\\n== Foobar ==\\r\\nBar _baz_ (TM) \",\r\n\t\t[\"callout\", \"<1>\"],\r\n\t\t\"\\r\\n* Foo \",\r\n\t\t[\"callout\", \"<2>\"],\r\n\t\t[\"callout\", \"<1>\"], \" Foobar\\r\\n\",\r\n\t\t[\"callout\", \"2>\"], \" Baz\\r\\n\",\r\n\t\t[\"punctuation\", \"----\"]\r\n\t]],\r\n\t[\"literal-block\", [\r\n\t\t[\"punctuation\", \".......\"],\r\n\t\t\"\\r\\n.Foo\\r\\n. Foobar \",\r\n\t\t[\"callout\", \"<1>\"],\r\n\t\t\"\\r\\ninclude::addendum.txt \",\r\n\t\t[\"callout\", \"<2>\"],\r\n\t\t[\"callout\", \">\"], \" Foo\\r\\n\",\r\n\t\t[\"callout\", \">\"], \" Bar\\r\\n__Foo__**bar**{baz}\\r\\n\",\r\n\t\t[\"punctuation\", \".......\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for literal blocks and listing blocks.\r\nAlso checks that nothing gets highlighted inside expect callouts.\r\n"
  },
  {
    "path": "tests/languages/asciidoc/macro_feature.test",
    "content": "footnote:[An example footnote.]\r\nindexterm:[Tigers,Big cats]\r\n\r\nhttp://www.docbook.org/[DocBook.org]\r\ninclude::chapt1.txt[tabsize=2]\r\nmailto:srackham@gmail.com[]\r\n\r\nimage:screen-thumbnail.png[height=32,link=\"screen.png\"]\r\n\r\n== Foo image:foo.jpg[] ==\r\n\r\n--\r\nfootnote:[An example footnote.]\r\nindexterm:[Tigers,Big cats]\r\n\r\nhttp://www.docbook.org/[DocBook.org]\r\ninclude::chapt1.txt[tabsize=2]\r\nmailto:srackham@gmail.com[]\r\n\r\nimage:screen-thumbnail.png[height=32,link=\"screen.png\"]\r\n--\r\n\r\n|====\r\n|\r\nfootnote:[An example footnote.]\r\nindexterm:[Tigers,Big cats]\r\n\r\nhttp://www.docbook.org/[DocBook.org]\r\ninclude::chapt1.txt[tabsize=2]\r\nmailto:srackham@gmail.com[]\r\n\r\nimage:screen-thumbnail.png[height=32,link=\"screen.png\"]\r\n|====\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"macro\", [\r\n\t\t[\"function\", \"footnote\"], [\"punctuation\", \":\"],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-value\", \"An example footnote.\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"function\", \"indexterm\"], [\"punctuation\", \":\"],\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-value\", \"Tigers\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"attr-value\", \"Big cats\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"function\", \"http\"], [\"punctuation\", \":\"],\r\n\t\t\"//www.docbook.org/\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-value\", \"DocBook.org\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"function\", \"include\"], [\"punctuation\", \"::\"],\r\n\t\t\"chapt1.txt\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"tabsize\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"2\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"function\", \"mailto\"], [\"punctuation\", \":\"],\r\n\t\t\"srackham@gmail.com\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"function\", \"image\"], [\"punctuation\", \":\"],\r\n\t\t\"screen-thumbnail.png\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"height\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"32\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"variable\", \"link\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"\\\"screen.png\\\"\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"==\"],\r\n\t\t\" Foo \",\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"image\"], [\"punctuation\", \":\"],\r\n\t\t\t\"foo.jpg\",\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"==\"]\r\n\t]],\r\n\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"--\"],\r\n\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"footnote\"], [\"punctuation\", \":\"],\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"attr-value\", \"An example footnote.\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"indexterm\"], [\"punctuation\", \":\"],\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"attr-value\", \"Tigers\"],\r\n\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t[\"attr-value\", \"Big cats\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"http\"], [\"punctuation\", \":\"],\r\n\t\t\t\"//www.docbook.org/\",\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"attr-value\", \"DocBook.org\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"include\"], [\"punctuation\", \"::\"],\r\n\t\t\t\"chapt1.txt\",\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"variable\", \"tabsize\"],\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"attr-value\", \"2\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"mailto\"], [\"punctuation\", \":\"],\r\n\t\t\t\"srackham@gmail.com\",\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"image\"], [\"punctuation\", \":\"],\r\n\t\t\t\"screen-thumbnail.png\",\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"variable\", \"height\"],\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"attr-value\", \"32\"],\r\n\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t[\"variable\", \"link\"],\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"string\", \"\\\"screen.png\\\"\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"--\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|====\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"footnote\"], [\"punctuation\", \":\"],\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"attr-value\", \"An example footnote.\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"indexterm\"], [\"punctuation\", \":\"],\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"attr-value\", \"Tigers\"],\r\n\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t[\"attr-value\", \"Big cats\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"http\"], [\"punctuation\", \":\"],\r\n\t\t\t\"//www.docbook.org/\",\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"attr-value\", \"DocBook.org\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"include\"], [\"punctuation\", \"::\"],\r\n\t\t\t\"chapt1.txt\",\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"variable\", \"tabsize\"],\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"attr-value\", \"2\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"mailto\"], [\"punctuation\", \":\"],\r\n\t\t\t\"srackham@gmail.com\",\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"image\"], [\"punctuation\", \":\"],\r\n\t\t\t\"screen-thumbnail.png\",\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"variable\", \"height\"],\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"attr-value\", \"32\"],\r\n\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t[\"variable\", \"link\"],\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"string\", \"\\\"screen.png\\\"\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"|====\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for macros."
  },
  {
    "path": "tests/languages/asciidoc/other-block_feature.test",
    "content": "****\r\nSidebar block <1>\r\n****\r\n\r\n______\r\nQuote block <2>\r\n______\r\n\r\n========\r\nExample block <3>\r\n========\r\n\r\n--\r\nOpen block <4>\r\n--\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"****\"],\r\n\t\t\"\\r\\nSidebar block <1>\\r\\n\",\r\n\t\t[\"punctuation\", \"****\"]\r\n\t]],\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"______\"],\r\n\t\t\"\\r\\nQuote block <2>\\r\\n\",\r\n\t\t[\"punctuation\", \"______\"]\r\n\t]],\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"========\"],\r\n\t\t\"\\r\\nExample block <3>\\r\\n\",\r\n\t\t[\"punctuation\", \"========\"]\r\n\t]],\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"--\"],\r\n\t\t\"\\r\\nOpen block <4>\\r\\n\",\r\n\t\t[\"punctuation\", \"--\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for sidebar blocks, quote blocks, example blocks and open blocks.\r\nAlso checks that callouts are not highlighted."
  },
  {
    "path": "tests/languages/asciidoc/page-break_feature.test",
    "content": "<<<\r\n\r\n<<<<<<<<<<<<<\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"page-break\", \"<<<\"],\r\n\t[\"page-break\", \"<<<<<<<<<<<<<\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for page breaks."
  },
  {
    "path": "tests/languages/asciidoc/passthrough-block_feature.test",
    "content": "++++\r\n.Fo__o__bar *baz*\r\nFo(((o)))bar baz\r\n* Foobar baz\r\ninclude::addendum.txt[]\r\n++++\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"passthrough-block\", [\r\n\t\t[\"punctuation\", \"++++\"],\r\n\t\t\"\\r\\n.Fo__o__bar *baz*\\r\\nFo(((o)))bar baz\\r\\n* Foobar baz\\r\\n\",\r\n\t\t[\"macro\", [\r\n\t\t\t[\"function\", \"include\"],\r\n\t\t\t[\"punctuation\", \"::\"],\r\n\t\t\t\"addendum.txt\",\r\n\t\t\t[\"attributes\", [\r\n\t\t\t\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"++++\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for passthrough blocks.\r\nAlso checks that nothing gets highlighted inside expect macros."
  },
  {
    "path": "tests/languages/asciidoc/replacement_feature.test",
    "content": "(C) (TM) (R)\r\n\r\n(C) (TM) (R)\r\n============\r\n\r\n['(C) (TM) (R)']\r\n\r\n--\r\n(C) (TM) (R)\r\n--\r\n\r\n|======\r\n| (C) (TM) (R)\r\n|======\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"replacement\", \"(C)\"], [\"replacement\", \"(TM)\"], [\"replacement\", \"(R)\"],\r\n\t[\"title\", [\r\n\t\t[\"replacement\", \"(C)\"], [\"replacement\", \"(TM)\"], [\"replacement\", \"(R)\"],\r\n\t\t[\"punctuation\", \"============\"]\r\n\t]],\r\n\t[\"attributes\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"interpreted\", [\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t[\"replacement\", \"(C)\"], [\"replacement\", \"(TM)\"], [\"replacement\", \"(R)\"],\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"other-block\", [\r\n\t\t[\"punctuation\", \"--\"],\r\n\t\t[\"replacement\", \"(C)\"], [\"replacement\", \"(TM)\"], [\"replacement\", \"(R)\"],\r\n\t\t[\"punctuation\", \"--\"]\r\n\t]],\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|======\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"replacement\", \"(C)\"], [\"replacement\", \"(TM)\"], [\"replacement\", \"(R)\"],\r\n\t\t[\"punctuation\", \"|======\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for replacements."
  },
  {
    "path": "tests/languages/asciidoc/table_feature.test",
    "content": "|===\r\n|1\r\n|===\r\n\r\n|============================\r\n|1 >s|2 |3 |4\r\n^|5 2.2+^.^|6 .3+<.>m|7\r\n2*^|8\r\n|9 2+>|10\r\n|============================\r\n\r\n|==============================================\r\n|Normal cell\r\n\r\n|Cell with nested table\r\n\r\n!==============================================\r\n!Nested table cell 1 !Nested table cell 2\r\n!==============================================\r\n\r\n|==============================================\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|===\"],\r\n\t\t[\"punctuation\", \"|\"], \"1\\r\\n\",\r\n\t\t[\"punctuation\", \"|===\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|============================\"],\r\n\t\t[\"punctuation\", \"|\"], \"1 \",\r\n\t\t[\"specifiers\", \">s\"], [\"punctuation\", \"|\"], \"2 \",\r\n\t\t[\"punctuation\", \"|\"], \"3 \",\r\n\t\t[\"punctuation\", \"|\"], \"4\\r\\n\",\r\n\t\t[\"specifiers\", \"^\"], [\"punctuation\", \"|\"], \"5 \",\r\n\t\t[\"specifiers\", \"2.2+^.^\"], [\"punctuation\", \"|\"], \"6 \",\r\n\t\t[\"specifiers\", \".3+<.>m\"], [\"punctuation\", \"|\"], \"7\\r\\n\",\r\n\t\t[\"specifiers\", \"2*^\"], [\"punctuation\", \"|\"], \"8\\r\\n\",\r\n\t\t[\"punctuation\", \"|\"], \"9 \",\r\n\t\t[\"specifiers\", \"2+>\"], [\"punctuation\", \"|\"], \"10\\r\\n\",\r\n\t\t[\"punctuation\", \"|============================\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"|==============================================\"],\r\n\t\t[\"punctuation\", \"|\"], \"Normal cell\\r\\n\\r\\n\",\r\n\t\t[\"punctuation\", \"|\"], \"Cell with nested table\\r\\n\\r\\n\",\r\n\t\t[\"punctuation\", \"!==============================================\"],\r\n\t\t[\"punctuation\", \"!\"], \"Nested table cell 1 \",\r\n\t\t[\"punctuation\", \"!\"], \"Nested table cell 2\\r\\n\",\r\n\t\t[\"punctuation\", \"!==============================================\"],\r\n\t\t[\"punctuation\", \"|==============================================\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tables."
  },
  {
    "path": "tests/languages/asciidoc/title_feature.test",
    "content": "Foobar\r\n======\r\n\r\nFoobar\r\n------\r\n\r\nFoobar\r\n~~~~~~\r\n\r\nFoobar\r\n^^^^^^\r\n\r\nFoo\r\n+++\r\n\r\n= Foo bar baz =\r\n== Foo bar baz\r\n=== Foo bar baz ===\r\n==== Foo bar baz\r\n===== Foo bar baz =====\r\n\r\n.Foo bar baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"title\", [\r\n\t\t\"Foobar\\r\\n\",\r\n\t\t[\"punctuation\", \"======\"]\r\n\t]],\r\n\t[\"title\", [\r\n\t\t\"Foobar\\r\\n\",\r\n\t\t[\"punctuation\", \"------\"]\r\n\t]],\r\n\t[\"title\", [\r\n\t\t\"Foobar\\r\\n\",\r\n\t\t[\"punctuation\", \"~~~~~~\"]\r\n\t]],\r\n\t[\"title\", [\r\n\t\t\"Foobar\\r\\n\",\r\n\t\t[\"punctuation\", \"^^^^^^\"]\r\n\t]],\r\n\t[\"title\", [\r\n\t\t\"Foo\\r\\n\",\r\n\t\t[\"punctuation\", \"+++\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"=\"],\r\n\t\t\" Foo bar baz \",\r\n\t\t[\"punctuation\", \"=\"]\r\n\t]],\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"==\"],\r\n\t\t\" Foo bar baz\"\r\n\t]],\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"===\"],\r\n\t\t\" Foo bar baz \",\r\n\t\t[\"punctuation\", \"===\"]\r\n\t]],\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"====\"],\r\n\t\t\" Foo bar baz\"\r\n\t]],\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"=====\"],\r\n\t\t\" Foo bar baz \",\r\n\t\t[\"punctuation\", \"=====\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Foo bar baz\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for titles."
  },
  {
    "path": "tests/languages/asm6502/comment_feature.test",
    "content": ";\n; foo bar baz\n\n-------------------------\n\n[\n  [\"comment\", \";\"],\n  [\"comment\", \"; foo bar baz\"]\n]\n\n-------------------------\n\nCheck for comments\n"
  },
  {
    "path": "tests/languages/asm6502/directive_feature.test",
    "content": ".segment CODE\n\n-------------------------\n\n[\n  [\"directive\", \".segment\"],\n  \" CODE\"\n]\n\n-------------------------\n\nCheck for directives\n"
  },
  {
    "path": "tests/languages/asm6502/number_feature.test",
    "content": "LDA #127\nSTA $8000\nSTA #$1\nLDX #%10001010\n\n----------------------------------------------------\n\n[\n\t[\"op-code\", \"LDA\"], [\"decimal-number\", \"#127\"],\n\t[\"op-code\", \"STA\"], [\"hex-number\", \"$8000\"],\n\t[\"op-code\", \"STA\"], [\"hex-number\", \"#$1\"],\n\t[\"op-code\", \"LDX\"], [\"binary-number\", \"#%10001010\"]\n]\n\n----------------------------------------------------\n\nCheck for numbers\n"
  },
  {
    "path": "tests/languages/asm6502/opcode_feature.test",
    "content": "adc\nand\nasl\nbcc\nbcs\nbeq\nbit\nbmi\nbne\nbpl\nbrk\nbvc\nbvs\nclc\ncld\ncli\nclv\ncmp\ncpx\ncpy\ndec\ndex\ndey\neor\ninc\ninx\niny\njmp\njsr\nlda\nldx\nldy\nlsr\nnop\nora\npha\nphp\npla\nplp\nrol\nror\nrti\nrts\nsbc\nsec\nsed\nsei\nsta\nstx\nsty\ntax\ntay\ntsx\ntxa\ntxs\ntya\nADC\nAND\nASL\nBCC\nBCS\nBEQ\nBIT\nBMI\nBNE\nBPL\nBRK\nBVC\nBVS\nCLC\nCLD\nCLI\nCLV\nCMP\nCPX\nCPY\nDEC\nDEX\nDEY\nEOR\nINC\nINX\nINY\nJMP\nJSR\nLDA\nLDX\nLDY\nLSR\nNOP\nORA\nPHA\nPHP\nPLA\nPLP\nROL\nROR\nRTI\nRTS\nSBC\nSEC\nSED\nSEI\nSTA\nSTX\nSTY\nTAX\nTAY\nTSX\nTXA\nTXS\nTYA\n\n----------------------------------------------------\n\n[\n\t[\"op-code\", \"adc\"],\n\t[\"op-code\", \"and\"],\n\t[\"op-code\", \"asl\"],\n\t[\"op-code\", \"bcc\"],\n\t[\"op-code\", \"bcs\"],\n\t[\"op-code\", \"beq\"],\n\t[\"op-code\", \"bit\"],\n\t[\"op-code\", \"bmi\"],\n\t[\"op-code\", \"bne\"],\n\t[\"op-code\", \"bpl\"],\n\t[\"op-code\", \"brk\"],\n\t[\"op-code\", \"bvc\"],\n\t[\"op-code\", \"bvs\"],\n\t[\"op-code\", \"clc\"],\n\t[\"op-code\", \"cld\"],\n\t[\"op-code\", \"cli\"],\n\t[\"op-code\", \"clv\"],\n\t[\"op-code\", \"cmp\"],\n\t[\"op-code\", \"cpx\"],\n\t[\"op-code\", \"cpy\"],\n\t[\"op-code\", \"dec\"],\n\t[\"op-code\", \"dex\"],\n\t[\"op-code\", \"dey\"],\n\t[\"op-code\", \"eor\"],\n\t[\"op-code\", \"inc\"],\n\t[\"op-code\", \"inx\"],\n\t[\"op-code\", \"iny\"],\n\t[\"op-code\", \"jmp\"],\n\t[\"op-code\", \"jsr\"],\n\t[\"op-code\", \"lda\"],\n\t[\"op-code\", \"ldx\"],\n\t[\"op-code\", \"ldy\"],\n\t[\"op-code\", \"lsr\"],\n\t[\"op-code\", \"nop\"],\n\t[\"op-code\", \"ora\"],\n\t[\"op-code\", \"pha\"],\n\t[\"op-code\", \"php\"],\n\t[\"op-code\", \"pla\"],\n\t[\"op-code\", \"plp\"],\n\t[\"op-code\", \"rol\"],\n\t[\"op-code\", \"ror\"],\n\t[\"op-code\", \"rti\"],\n\t[\"op-code\", \"rts\"],\n\t[\"op-code\", \"sbc\"],\n\t[\"op-code\", \"sec\"],\n\t[\"op-code\", \"sed\"],\n\t[\"op-code\", \"sei\"],\n\t[\"op-code\", \"sta\"],\n\t[\"op-code\", \"stx\"],\n\t[\"op-code\", \"sty\"],\n\t[\"op-code\", \"tax\"],\n\t[\"op-code\", \"tay\"],\n\t[\"op-code\", \"tsx\"],\n\t[\"op-code\", \"txa\"],\n\t[\"op-code\", \"txs\"],\n\t[\"op-code\", \"tya\"],\n\t[\"op-code\", \"ADC\"],\n\t[\"op-code\", \"AND\"],\n\t[\"op-code\", \"ASL\"],\n\t[\"op-code\", \"BCC\"],\n\t[\"op-code\", \"BCS\"],\n\t[\"op-code\", \"BEQ\"],\n\t[\"op-code\", \"BIT\"],\n\t[\"op-code\", \"BMI\"],\n\t[\"op-code\", \"BNE\"],\n\t[\"op-code\", \"BPL\"],\n\t[\"op-code\", \"BRK\"],\n\t[\"op-code\", \"BVC\"],\n\t[\"op-code\", \"BVS\"],\n\t[\"op-code\", \"CLC\"],\n\t[\"op-code\", \"CLD\"],\n\t[\"op-code\", \"CLI\"],\n\t[\"op-code\", \"CLV\"],\n\t[\"op-code\", \"CMP\"],\n\t[\"op-code\", \"CPX\"],\n\t[\"op-code\", \"CPY\"],\n\t[\"op-code\", \"DEC\"],\n\t[\"op-code\", \"DEX\"],\n\t[\"op-code\", \"DEY\"],\n\t[\"op-code\", \"EOR\"],\n\t[\"op-code\", \"INC\"],\n\t[\"op-code\", \"INX\"],\n\t[\"op-code\", \"INY\"],\n\t[\"op-code\", \"JMP\"],\n\t[\"op-code\", \"JSR\"],\n\t[\"op-code\", \"LDA\"],\n\t[\"op-code\", \"LDX\"],\n\t[\"op-code\", \"LDY\"],\n\t[\"op-code\", \"LSR\"],\n\t[\"op-code\", \"NOP\"],\n\t[\"op-code\", \"ORA\"],\n\t[\"op-code\", \"PHA\"],\n\t[\"op-code\", \"PHP\"],\n\t[\"op-code\", \"PLA\"],\n\t[\"op-code\", \"PLP\"],\n\t[\"op-code\", \"ROL\"],\n\t[\"op-code\", \"ROR\"],\n\t[\"op-code\", \"RTI\"],\n\t[\"op-code\", \"RTS\"],\n\t[\"op-code\", \"SBC\"],\n\t[\"op-code\", \"SEC\"],\n\t[\"op-code\", \"SED\"],\n\t[\"op-code\", \"SEI\"],\n\t[\"op-code\", \"STA\"],\n\t[\"op-code\", \"STX\"],\n\t[\"op-code\", \"STY\"],\n\t[\"op-code\", \"TAX\"],\n\t[\"op-code\", \"TAY\"],\n\t[\"op-code\", \"TSX\"],\n\t[\"op-code\", \"TXA\"],\n\t[\"op-code\", \"TXS\"],\n\t[\"op-code\", \"TYA\"]\n]\n\n----------------------------------------------------\n\nCheck for opcodes\n"
  },
  {
    "path": "tests/languages/asm6502/punctuation_feature.test",
    "content": "( ) , :\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \":\"]\n]\n"
  },
  {
    "path": "tests/languages/asm6502/register_feature.test",
    "content": "LDA $8000,x\nASL A\n\n----------------------------------------------------\n\n[\n\t[\"op-code\", \"LDA\"],\n\t[\"hex-number\", \"$8000\"],\n\t[\"punctuation\", \",\"],\n\t[\"register\", \"x\"],\n\n\t[\"op-code\", \"ASL\"],\n\t[\"register\", \"A\"]\n]\n\n----------------------------------------------------\n\nCheck for registers\n"
  },
  {
    "path": "tests/languages/asm6502/string_feature.test",
    "content": ".include \"header.asm\"\n\n-------------------------\n\n[\n  [\"directive\", \".include\"],\n  [\"string\", \"\\\"header.asm\\\"\"]\n]\n\n-------------------------\n\nCheck for strings\n"
  },
  {
    "path": "tests/languages/asmatmel/comment_feature.test",
    "content": ";\n; foo bar baz\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \";\"],\n\t[\"comment\", \"; foo bar baz\"]\n]\n\n----------------------------------------------------\n\nCheck for comments\n"
  },
  {
    "path": "tests/languages/asmatmel/constant_feature.test",
    "content": "OUT PORTD,x\r\nldi r17,PD06\r\nldi\tr19,(1<<DDB31)\r\nldi\tr19,(1<<DDA30)\r\nldi\tr19,(1<<DDL10)\r\nldi\tr19,(1<<DDZ05)\r\nldi\tr19,(1<<PD7)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"op-code\", \"OUT\"],\r\n\t[\"constant\", \"PORTD\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"register\", \"x\"],\r\n\r\n\t[\"op-code\", \"ldi\"],\r\n\t[\"r-register\", \"r17\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"constant\", \"PD06\"],\r\n\r\n\t[\"op-code\", \"ldi\"],\r\n\t[\"r-register\", \"r19\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"decimal-number\", \"1\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"constant\", \"DDB31\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"op-code\", \"ldi\"],\r\n\t[\"r-register\", \"r19\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"decimal-number\", \"1\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"constant\", \"DDA30\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"op-code\", \"ldi\"],\r\n\t[\"r-register\", \"r19\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"decimal-number\", \"1\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"constant\", \"DDL10\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"op-code\", \"ldi\"],\r\n\t[\"r-register\", \"r19\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"decimal-number\", \"1\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"constant\", \"DDZ05\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"op-code\", \"ldi\"],\r\n\t[\"r-register\", \"r19\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"decimal-number\", \"1\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"constant\", \"PD7\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nCheck for constants\r\n"
  },
  {
    "path": "tests/languages/asmatmel/directive_feature.test",
    "content": ".segment CODE\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \".segment\"],\n\t\" CODE\"\n]\n\n----------------------------------------------------\n\nCheck for directives\n"
  },
  {
    "path": "tests/languages/asmatmel/number_feature.test",
    "content": "LD #127\nST $8000\nLD #%10001010\n\n----------------------------------------------------\n\n[\n\t[\"op-code\", \"LD\"], [\"decimal-number\", \"#127\"],\n\t[\"op-code\", \"ST\"], [\"hex-number\", \"$8000\"],\n\t[\"op-code\", \"LD\"], [\"binary-number\", \"#%10001010\"]\n]\n\n----------------------------------------------------\n\nCheck for numbers\n"
  },
  {
    "path": "tests/languages/asmatmel/opcode_feature.test",
    "content": "LDY\nLDZ\nout\nldi\n\n----------------------------------------------------\n\n[\n\t[\"op-code\", \"LDY\"],\n\t[\"op-code\", \"LDZ\"],\n\t[\"op-code\", \"out\"],\n\t[\"op-code\", \"ldi\"]\n]\n\n----------------------------------------------------\n\nCheck for opcodes\n"
  },
  {
    "path": "tests/languages/asmatmel/operator_feature.test",
    "content": "OUT PORTB,x\r\nldi r17,(1<<PD07)\r\n\r\n+ - * / ^\r\n+= -= *= /= ^=\r\n>> >>= << <<=\r\n& && &= | || |=\r\n< <= > >= != ==\r\n! = ? ?=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"op-code\", \"OUT\"],\r\n\t[\"constant\", \"PORTB\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"register\", \"x\"],\r\n\r\n\t[\"op-code\", \"ldi\"],\r\n\t[\"r-register\", \"r17\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"decimal-number\", \"1\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"constant\", \"PD07\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"^\"],\r\n\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"^=\"],\r\n\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \"<<=\"],\r\n\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"|=\"],\r\n\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"==\"],\r\n\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"?=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nCheck for operators\r\n"
  },
  {
    "path": "tests/languages/asmatmel/register_feature.test",
    "content": "OUT PORTB,x\nldi r17,(1<<PD07)\nOUT PORTD,r31\nOUT PORTB,A\nOUT PORTL,r10\n\n----------------------------------------------------\n\n[\n\t[\"op-code\", \"OUT\"],\n\t[\"constant\", \"PORTB\"],\n\t[\"punctuation\", \",\"],\n\t[\"register\", \"x\"],\n\n\t[\"op-code\", \"ldi\"],\n\t[\"r-register\", \"r17\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \"(\"],\n\t[\"decimal-number\", \"1\"],\n\t[\"operator\", \"<<\"],\n\t[\"constant\", \"PD07\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"op-code\", \"OUT\"],\n\t[\"constant\", \"PORTD\"],\n\t[\"punctuation\", \",\"],\n\t[\"r-register\", \"r31\"],\n\n\t[\"op-code\", \"OUT\"],\n\t[\"constant\", \"PORTB\"],\n\t[\"punctuation\", \",\"],\n\t[\"register\", \"A\"],\n\n\t[\"op-code\", \"OUT\"],\n\t[\"constant\", \"PORTL\"],\n\t[\"punctuation\", \",\"],\n\t[\"r-register\", \"r10\"]\n]\n\n----------------------------------------------------\n\nCheck for registers\n"
  },
  {
    "path": "tests/languages/asmatmel/string_feature.test",
    "content": ".include \"header.asm\"\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \".include\"],\n\t[\"string\", \"\\\"header.asm\\\"\"]\n]\n\n----------------------------------------------------\n\nCheck for strings\n"
  },
  {
    "path": "tests/languages/aspnet/comment_feature.test",
    "content": "<%----%>\r\n<%--foo--%>\r\n<%-- foo\r\nbar --%>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"asp-comment\", \"<%----%>\"],\r\n\t[\"asp-comment\", \"<%--foo--%>\"],\r\n\t[\"asp-comment\", \"<%-- foo\\r\\nbar --%>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/aspnet/page-directive_feature.test",
    "content": "<%@Assembly foo=\"bar\"%>\r\n<% @Control foo=\"bar\" %>\r\n<%@ Implements%>\r\n<%@Import%>\r\n<%@Master%>\r\n<%@MasterType%>\r\n<%@OutputCache%>\r\n<%@Page%>\r\n<%@PreviousPageType%>\r\n<%@Reference%>\r\n<%@Register%>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"page-directive\", [\r\n\t\t[\"page-directive\", \"<%@Assembly\"],\r\n\t\t[\"attr-name\", [\r\n\t\t\t\"foo\"\r\n\t\t]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"page-directive\", \"%>\"]\r\n\t]],\r\n\r\n\t[\"page-directive\", [\r\n\t\t[\"page-directive\", \"<% @Control\"],\r\n\t\t[\"attr-name\", [\r\n\t\t\t\"foo\"\r\n\t\t]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"page-directive\", \"%>\"]\r\n\t]],\r\n\r\n\t[\"page-directive\", [\r\n\t\t[\"page-directive\", \"<%@ Implements\"],\r\n\t\t[\"page-directive\", \"%>\"]\r\n\t]],\r\n\r\n\t[\"page-directive\", [\r\n\t\t[\"page-directive\", \"<%@Import\"],\r\n\t\t[\"page-directive\", \"%>\"]\r\n\t]],\r\n\r\n\t[\"page-directive\", [\r\n\t\t[\"page-directive\", \"<%@Master\"],\r\n\t\t[\"page-directive\", \"%>\"]\r\n\t]],\r\n\r\n\t[\"page-directive\", [\r\n\t\t[\"page-directive\", \"<%@MasterType\"],\r\n\t\t[\"page-directive\", \"%>\"]\r\n\t]],\r\n\r\n\t[\"page-directive\", [\r\n\t\t[\"page-directive\", \"<%@OutputCache\"],\r\n\t\t[\"page-directive\", \"%>\"]\r\n\t]],\r\n\r\n\t[\"page-directive\", [\r\n\t\t[\"page-directive\", \"<%@Page\"],\r\n\t\t[\"page-directive\", \"%>\"]\r\n\t]],\r\n\r\n\t[\"page-directive\", [\r\n\t\t[\"page-directive\", \"<%@PreviousPageType\"],\r\n\t\t[\"page-directive\", \"%>\"]\r\n\t]],\r\n\r\n\t[\"page-directive\", [\r\n\t\t[\"page-directive\", \"<%@Reference\"],\r\n\t\t[\"page-directive\", \"%>\"]\r\n\t]],\r\n\r\n\t[\"page-directive\", [\r\n\t\t[\"page-directive\", \"<%@Register\"],\r\n\t\t[\"page-directive\", \"%>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all page directives.\r\n"
  },
  {
    "path": "tests/languages/autohotkey/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans"
  },
  {
    "path": "tests/languages/autohotkey/builtin_feature.test",
    "content": "abs\nacos\nasc\nasin\natan\nceil\nchr\nclass\ncos\ncomobjactive\ncomobjarray\ncomobjconnect\ncomobjcreate\ncomobjerror\ncomobjflags\ncomobjget\ncomobjquery\ncomobjtype\ncomobjvalue\ndllcall\nexp\nfileexist\nFileopen\nfloor\nformat\nil_add\nil_create\nil_destroy\ninstr\nsubstr\nisfunc\nislabel\nIsObject\nln\nlog\nltrim\nrtrim\nlv_add\nlv_delete\nlv_deletecol\nlv_getcount\nlv_getnext\nlv_gettext\nlv_insert\nlv_insertcol\nlv_modify\nlv_modifycol\nlv_setimagelist\nmod\nonmessage\nnumget\nnumput\nregistercallback\nregexmatch\nregexreplace\nround\nsin\ntan\nsqrt\nstrlen\nstrreplace\nsb_seticon\nsb_setparts\nsb_settext\nstrsplit\ntv_add\ntv_delete\ntv_getchild\ntv_getcount\ntv_getnext\ntv_get\ntv_getparent\ntv_getprev\ntv_getselection\ntv_gettext\ntv_modify\nvarsetcapacity\nwinactive\nwinexist\n__New\n__Call\n__Get\n__Set\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"abs\"],\n\t[\"builtin\", \"acos\"],\n\t[\"builtin\", \"asc\"],\n\t[\"builtin\", \"asin\"],\n\t[\"builtin\", \"atan\"],\n\t[\"builtin\", \"ceil\"],\n\t[\"builtin\", \"chr\"],\n\t[\"builtin\", \"class\"],\n\t[\"builtin\", \"cos\"],\n\t[\"builtin\", \"comobjactive\"],\n\t[\"builtin\", \"comobjarray\"],\n\t[\"builtin\", \"comobjconnect\"],\n\t[\"builtin\", \"comobjcreate\"],\n\t[\"builtin\", \"comobjerror\"],\n\t[\"builtin\", \"comobjflags\"],\n\t[\"builtin\", \"comobjget\"],\n\t[\"builtin\", \"comobjquery\"],\n\t[\"builtin\", \"comobjtype\"],\n\t[\"builtin\", \"comobjvalue\"],\n\t[\"builtin\", \"dllcall\"],\n\t[\"builtin\", \"exp\"],\n\t[\"builtin\", \"fileexist\"],\n\t[\"builtin\", \"Fileopen\"],\n\t[\"builtin\", \"floor\"],\n\t[\"builtin\", \"format\"],\n\t[\"builtin\", \"il_add\"],\n\t[\"builtin\", \"il_create\"],\n\t[\"builtin\", \"il_destroy\"],\n\t[\"builtin\", \"instr\"],\n\t[\"builtin\", \"substr\"],\n\t[\"builtin\", \"isfunc\"],\n\t[\"builtin\", \"islabel\"],\n\t[\"builtin\", \"IsObject\"],\n\t[\"builtin\", \"ln\"],\n\t[\"builtin\", \"log\"],\n\t[\"builtin\", \"ltrim\"],\n\t[\"builtin\", \"rtrim\"],\n\t[\"builtin\", \"lv_add\"],\n\t[\"builtin\", \"lv_delete\"],\n\t[\"builtin\", \"lv_deletecol\"],\n\t[\"builtin\", \"lv_getcount\"],\n\t[\"builtin\", \"lv_getnext\"],\n\t[\"builtin\", \"lv_gettext\"],\n\t[\"builtin\", \"lv_insert\"],\n\t[\"builtin\", \"lv_insertcol\"],\n\t[\"builtin\", \"lv_modify\"],\n\t[\"builtin\", \"lv_modifycol\"],\n\t[\"builtin\", \"lv_setimagelist\"],\n\t[\"builtin\", \"mod\"],\n\t[\"builtin\", \"onmessage\"],\n\t[\"builtin\", \"numget\"],\n\t[\"builtin\", \"numput\"],\n\t[\"builtin\", \"registercallback\"],\n\t[\"builtin\", \"regexmatch\"],\n\t[\"builtin\", \"regexreplace\"],\n\t[\"builtin\", \"round\"],\n\t[\"builtin\", \"sin\"],\n\t[\"builtin\", \"tan\"],\n\t[\"builtin\", \"sqrt\"],\n\t[\"builtin\", \"strlen\"],\n\t[\"builtin\", \"strreplace\"],\n\t[\"builtin\", \"sb_seticon\"],\n\t[\"builtin\", \"sb_setparts\"],\n\t[\"builtin\", \"sb_settext\"],\n\t[\"builtin\", \"strsplit\"],\n\t[\"builtin\", \"tv_add\"],\n\t[\"builtin\", \"tv_delete\"],\n\t[\"builtin\", \"tv_getchild\"],\n\t[\"builtin\", \"tv_getcount\"],\n\t[\"builtin\", \"tv_getnext\"],\n\t[\"builtin\", \"tv_get\"],\n\t[\"builtin\", \"tv_getparent\"],\n\t[\"builtin\", \"tv_getprev\"],\n\t[\"builtin\", \"tv_getselection\"],\n\t[\"builtin\", \"tv_gettext\"],\n\t[\"builtin\", \"tv_modify\"],\n\t[\"builtin\", \"varsetcapacity\"],\n\t[\"builtin\", \"winactive\"],\n\t[\"builtin\", \"winexist\"],\n\t[\"builtin\", \"__New\"],\n\t[\"builtin\", \"__Call\"],\n\t[\"builtin\", \"__Get\"],\n\t[\"builtin\", \"__Set\"]\n]\n\n----------------------------------------------------\n\nChecks for all builtins.\n"
  },
  {
    "path": "tests/languages/autohotkey/command_feature.test",
    "content": "AutoTrim\nBlockInput\nBreak\nClick\nClipWait\nContinue\nControl\nControlClick\nControlFocus\nControlGet\nControlGetFocus\nControlGetPos\nControlGetText\nControlMove\nControlSend\nControlSendRaw\nControlSetText\nCoordMode\nCritical\nDetectHiddenText\nDetectHiddenWindows\nDrive\nDriveGet\nDriveSpaceFree\nEnvAdd\nEnvDiv\nEnvGet\nEnvMult\nEnvSet\nEnvSub\nEnvUpdate\nExit\nExitApp\nFileAppend\nFileCopy\nFileCopyDir\nFileCreateDir\nFileCreateShortcut\nFileDelete\nFileEncoding\nFileGetAttrib\nFileGetShortcut\nFileGetSize\nFileGetTime\nFileGetVersion\nFileInstall\nFileMove\nFileMoveDir\nFileRead\nFileReadLine\nFileRecycle\nFileRecycleEmpty\nFileRemoveDir\nFileSelectFile\nFileSelectFolder\nFileSetAttrib\nFileSetTime\nFormatTime\nGetKeyState\nGosub\nGoto\nGroupActivate\nGroupAdd\nGroupClose\nGroupDeactivate\nGui\nGuiControl\nGuiControlGet\nHotkey\nImageSearch\nIniDelete\nIniRead\nIniWrite\nInput\nInputBox\nKeyWait\nListHotkeys\nListLines\nListVars\nLoop\nMenu\nMouseClick\nMouseClickDrag\nMouseGetPos\nMouseMove\nMsgBox\nOnExit\nOutputDebug\nPause\nPixelGetColor\nPixelSearch\nPostMessage\nProcess\nProgress\nRandom\nRegDelete\nRegRead\nRegWrite\nReload\nRepeat\nReturn\nRun\nRunAs\nRunWait\nSend\nSendEvent\nSendInput\nSendMessage\nSendMode\nSendPlay\nSendRaw\nSetBatchLines\nSetCapslockState\nSetControlDelay\nSetDefaultMouseSpeed\nSetEnv\nSetFormat\nSetKeyDelay\nSetMouseDelay\nSetNumlockState\nSetRegView\nSetScrollLockState\nSetStoreCapslockMode\nSetTimer\nSetTitleMatchMode\nSetWinDelay\nSetWorkingDir\nShutdown\nSleep\nSort\nSoundBeep\nSoundGet\nSoundGetWaveVolume\nSoundPlay\nSoundSet\nSoundSetWaveVolume\nSplashImage\nSplashTextOff\nSplashTextOn\nSplitPath\nStatusBarGetText\nStatusBarWait\nStringCaseSense\nStringGetPos\nStringLeft\nStringLen\nStringLower\nStringMid\nStringReplace\nStringRight\nStringSplit\nStringTrimLeft\nStringTrimRight\nStringUpper\nSuspend\nSysGet\nThread\nToolTip\nTransform\nTrayTip\nURLDownloadToFile\nWinActivate\nWinActivateBottom\nWinClose\nWinGet\nWinGetActiveStats\nWinGetActiveTitle\nWinGetClass\nWinGetPos\nWinGetText\nWinGetTitle\nWinHide\nWinKill\nWinMaximize\nWinMenuSelectItem\nWinMinimize\nWinMinimizeAll\nWinMinimizeAllUndo\nWinMove\nWinRestore\nWinSet\nWinSetTitle\nWinShow\nWinWait\nWinWaitActive\nWinWaitClose\nWinWaitNotActive\n\n----------------------------------------------------\n\n[\n\t[\"command\", \"AutoTrim\"],\n\t[\"command\", \"BlockInput\"],\n\t[\"command\", \"Break\"],\n\t[\"command\", \"Click\"],\n\t[\"command\", \"ClipWait\"],\n\t[\"command\", \"Continue\"],\n\t[\"command\", \"Control\"],\n\t[\"command\", \"ControlClick\"],\n\t[\"command\", \"ControlFocus\"],\n\t[\"command\", \"ControlGet\"],\n\t[\"command\", \"ControlGetFocus\"],\n\t[\"command\", \"ControlGetPos\"],\n\t[\"command\", \"ControlGetText\"],\n\t[\"command\", \"ControlMove\"],\n\t[\"command\", \"ControlSend\"],\n\t[\"command\", \"ControlSendRaw\"],\n\t[\"command\", \"ControlSetText\"],\n\t[\"command\", \"CoordMode\"],\n\t[\"command\", \"Critical\"],\n\t[\"command\", \"DetectHiddenText\"],\n\t[\"command\", \"DetectHiddenWindows\"],\n\t[\"command\", \"Drive\"],\n\t[\"command\", \"DriveGet\"],\n\t[\"command\", \"DriveSpaceFree\"],\n\t[\"command\", \"EnvAdd\"],\n\t[\"command\", \"EnvDiv\"],\n\t[\"command\", \"EnvGet\"],\n\t[\"command\", \"EnvMult\"],\n\t[\"command\", \"EnvSet\"],\n\t[\"command\", \"EnvSub\"],\n\t[\"command\", \"EnvUpdate\"],\n\t[\"command\", \"Exit\"],\n\t[\"command\", \"ExitApp\"],\n\t[\"command\", \"FileAppend\"],\n\t[\"command\", \"FileCopy\"],\n\t[\"command\", \"FileCopyDir\"],\n\t[\"command\", \"FileCreateDir\"],\n\t[\"command\", \"FileCreateShortcut\"],\n\t[\"command\", \"FileDelete\"],\n\t[\"command\", \"FileEncoding\"],\n\t[\"command\", \"FileGetAttrib\"],\n\t[\"command\", \"FileGetShortcut\"],\n\t[\"command\", \"FileGetSize\"],\n\t[\"command\", \"FileGetTime\"],\n\t[\"command\", \"FileGetVersion\"],\n\t[\"command\", \"FileInstall\"],\n\t[\"command\", \"FileMove\"],\n\t[\"command\", \"FileMoveDir\"],\n\t[\"command\", \"FileRead\"],\n\t[\"command\", \"FileReadLine\"],\n\t[\"command\", \"FileRecycle\"],\n\t[\"command\", \"FileRecycleEmpty\"],\n\t[\"command\", \"FileRemoveDir\"],\n\t[\"command\", \"FileSelectFile\"],\n\t[\"command\", \"FileSelectFolder\"],\n\t[\"command\", \"FileSetAttrib\"],\n\t[\"command\", \"FileSetTime\"],\n\t[\"command\", \"FormatTime\"],\n\t[\"command\", \"GetKeyState\"],\n\t[\"command\", \"Gosub\"],\n\t[\"command\", \"Goto\"],\n\t[\"command\", \"GroupActivate\"],\n\t[\"command\", \"GroupAdd\"],\n\t[\"command\", \"GroupClose\"],\n\t[\"command\", \"GroupDeactivate\"],\n\t[\"command\", \"Gui\"],\n\t[\"command\", \"GuiControl\"],\n\t[\"command\", \"GuiControlGet\"],\n\t[\"command\", \"Hotkey\"],\n\t[\"command\", \"ImageSearch\"],\n\t[\"command\", \"IniDelete\"],\n\t[\"command\", \"IniRead\"],\n\t[\"command\", \"IniWrite\"],\n\t[\"command\", \"Input\"],\n\t[\"command\", \"InputBox\"],\n\t[\"command\", \"KeyWait\"],\n\t[\"command\", \"ListHotkeys\"],\n\t[\"command\", \"ListLines\"],\n\t[\"command\", \"ListVars\"],\n\t[\"command\", \"Loop\"],\n\t[\"command\", \"Menu\"],\n\t[\"command\", \"MouseClick\"],\n\t[\"command\", \"MouseClickDrag\"],\n\t[\"command\", \"MouseGetPos\"],\n\t[\"command\", \"MouseMove\"],\n\t[\"command\", \"MsgBox\"],\n\t[\"command\", \"OnExit\"],\n\t[\"command\", \"OutputDebug\"],\n\t[\"command\", \"Pause\"],\n\t[\"command\", \"PixelGetColor\"],\n\t[\"command\", \"PixelSearch\"],\n\t[\"command\", \"PostMessage\"],\n\t[\"command\", \"Process\"],\n\t[\"command\", \"Progress\"],\n\t[\"command\", \"Random\"],\n\t[\"command\", \"RegDelete\"],\n\t[\"command\", \"RegRead\"],\n\t[\"command\", \"RegWrite\"],\n\t[\"command\", \"Reload\"],\n\t[\"command\", \"Repeat\"],\n\t[\"command\", \"Return\"],\n\t[\"command\", \"Run\"],\n\t[\"command\", \"RunAs\"],\n\t[\"command\", \"RunWait\"],\n\t[\"command\", \"Send\"],\n\t[\"command\", \"SendEvent\"],\n\t[\"command\", \"SendInput\"],\n\t[\"command\", \"SendMessage\"],\n\t[\"command\", \"SendMode\"],\n\t[\"command\", \"SendPlay\"],\n\t[\"command\", \"SendRaw\"],\n\t[\"command\", \"SetBatchLines\"],\n\t[\"command\", \"SetCapslockState\"],\n\t[\"command\", \"SetControlDelay\"],\n\t[\"command\", \"SetDefaultMouseSpeed\"],\n\t[\"command\", \"SetEnv\"],\n\t[\"command\", \"SetFormat\"],\n\t[\"command\", \"SetKeyDelay\"],\n\t[\"command\", \"SetMouseDelay\"],\n\t[\"command\", \"SetNumlockState\"],\n\t[\"command\", \"SetRegView\"],\n\t[\"command\", \"SetScrollLockState\"],\n\t[\"command\", \"SetStoreCapslockMode\"],\n\t[\"command\", \"SetTimer\"],\n\t[\"command\", \"SetTitleMatchMode\"],\n\t[\"command\", \"SetWinDelay\"],\n\t[\"command\", \"SetWorkingDir\"],\n\t[\"command\", \"Shutdown\"],\n\t[\"command\", \"Sleep\"],\n\t[\"command\", \"Sort\"],\n\t[\"command\", \"SoundBeep\"],\n\t[\"command\", \"SoundGet\"],\n\t[\"command\", \"SoundGetWaveVolume\"],\n\t[\"command\", \"SoundPlay\"],\n\t[\"command\", \"SoundSet\"],\n\t[\"command\", \"SoundSetWaveVolume\"],\n\t[\"command\", \"SplashImage\"],\n\t[\"command\", \"SplashTextOff\"],\n\t[\"command\", \"SplashTextOn\"],\n\t[\"command\", \"SplitPath\"],\n\t[\"command\", \"StatusBarGetText\"],\n\t[\"command\", \"StatusBarWait\"],\n\t[\"command\", \"StringCaseSense\"],\n\t[\"command\", \"StringGetPos\"],\n\t[\"command\", \"StringLeft\"],\n\t[\"command\", \"StringLen\"],\n\t[\"command\", \"StringLower\"],\n\t[\"command\", \"StringMid\"],\n\t[\"command\", \"StringReplace\"],\n\t[\"command\", \"StringRight\"],\n\t[\"command\", \"StringSplit\"],\n\t[\"command\", \"StringTrimLeft\"],\n\t[\"command\", \"StringTrimRight\"],\n\t[\"command\", \"StringUpper\"],\n\t[\"command\", \"Suspend\"],\n\t[\"command\", \"SysGet\"],\n\t[\"command\", \"Thread\"],\n\t[\"command\", \"ToolTip\"],\n\t[\"command\", \"Transform\"],\n\t[\"command\", \"TrayTip\"],\n\t[\"command\", \"URLDownloadToFile\"],\n\t[\"command\", \"WinActivate\"],\n\t[\"command\", \"WinActivateBottom\"],\n\t[\"command\", \"WinClose\"],\n\t[\"command\", \"WinGet\"],\n\t[\"command\", \"WinGetActiveStats\"],\n\t[\"command\", \"WinGetActiveTitle\"],\n\t[\"command\", \"WinGetClass\"],\n\t[\"command\", \"WinGetPos\"],\n\t[\"command\", \"WinGetText\"],\n\t[\"command\", \"WinGetTitle\"],\n\t[\"command\", \"WinHide\"],\n\t[\"command\", \"WinKill\"],\n\t[\"command\", \"WinMaximize\"],\n\t[\"command\", \"WinMenuSelectItem\"],\n\t[\"command\", \"WinMinimize\"],\n\t[\"command\", \"WinMinimizeAll\"],\n\t[\"command\", \"WinMinimizeAllUndo\"],\n\t[\"command\", \"WinMove\"],\n\t[\"command\", \"WinRestore\"],\n\t[\"command\", \"WinSet\"],\n\t[\"command\", \"WinSetTitle\"],\n\t[\"command\", \"WinShow\"],\n\t[\"command\", \"WinWait\"],\n\t[\"command\", \"WinWaitActive\"],\n\t[\"command\", \"WinWaitClose\"],\n\t[\"command\", \"WinWaitNotActive\"]\n]\n\n----------------------------------------------------\n\nChecks for all selectors.\n"
  },
  {
    "path": "tests/languages/autohotkey/comment_feature.test",
    "content": ";foo\r\n; bar\r\n\r\nnota;comment\r\n\r\n; comments break strings\r\n\" ;\"\r\n\r\n/*\r\n0\r\n*/\r\n/*1*/\r\n\t  */\r\n/*\r\n1 ;\r\n2 */\r\nfoo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \";foo\"],\r\n\t[\"comment\", \"; bar\"],\r\n\r\n\t\"\\r\\n\\r\\nnota;comment\\r\\n\\r\\n\",\r\n\r\n\t[\"comment\", \"; comments break strings\"],\r\n\t\"\\r\\n\\\" \",\r\n\t[\"comment\", \";\\\"\"],\r\n\r\n\t[\"comment\", \"/*\\r\\n0\\r\\n*/\"],\r\n\t[\"comment\", \"/*1*/\\r\\n\\t  */\"],\r\n\t[\"comment\", \"/*\\r\\n1 ;\\r\\n2 */\\r\\nfoo\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/autohotkey/constant_feature.test",
    "content": "a_ahkpath\r\na_ahkversion\r\na_appdata\r\na_appdatacommon\r\na_autotrim\r\na_batchlines\r\na_caretx\r\na_carety\r\na_computername\r\na_controldelay\r\na_cursor\r\na_dd\r\na_ddd\r\na_dddd\r\na_defaultmousespeed\r\na_desktop\r\na_desktopcommon\r\na_detecthiddentext\r\na_detecthiddenwindows\r\na_endchar\r\na_eventinfo\r\na_exitreason\r\na_fileencoding\r\na_formatfloat\r\na_formatinteger\r\na_gui\r\na_guievent\r\na_guicontrol\r\na_guicontrolevent\r\na_guiheight\r\na_guiwidth\r\na_guix\r\na_guiy\r\na_hour\r\na_iconfile\r\na_iconhidden\r\na_iconnumber\r\na_icontip\r\na_index\r\na_ipaddress1\r\na_ipaddress2\r\na_ipaddress3\r\na_ipaddress4\r\na_is64bitos\r\na_isadmin\r\na_iscompiled\r\na_iscritical\r\na_ispaused\r\na_issuspended\r\na_isunicode\r\na_keydelay\r\na_language\r\na_lasterror\r\na_linefile\r\na_linenumber\r\na_loopfield\r\na_loopfileattrib\r\na_loopfiledir\r\na_loopfileext\r\na_loopfilefullpath\r\na_loopfilelongpath\r\na_loopfilename\r\na_loopfileshortname\r\na_loopfileshortpath\r\na_loopfilesize\r\na_loopfilesizekb\r\na_loopfilesizemb\r\na_loopfiletimeaccessed\r\na_loopfiletimecreated\r\na_loopfiletimemodified\r\na_loopreadline\r\na_loopregkey\r\na_loopregname\r\na_loopregsubkey\r\na_loopregtimemodified\r\na_loopregtype\r\na_mday\r\na_min\r\na_mm\r\na_mmm\r\na_mmmm\r\na_mon\r\na_mousedelay\r\na_msec\r\na_mydocuments\r\na_now\r\na_nowutc\r\na_numbatchlines\r\na_ostype\r\na_osversion\r\na_priorhotkey\r\na_priorkey\r\nprogramfiles\r\na_programfiles\r\na_programs\r\na_programscommon\r\na_ptrsize\r\na_regview\r\na_screendpi\r\na_screenheight\r\na_scripthwnd\r\na_screenwidth\r\na_scriptdir\r\na_scriptfullpath\r\na_scriptname\r\na_sec\r\na_space\r\na_startmenu\r\na_startmenucommon\r\na_startup\r\na_startupcommon\r\na_stringcasesense\r\na_tab\r\na_temp\r\na_thisfunc\r\na_thishotkey\r\na_thislabel\r\na_thismenu\r\na_thismenuitem\r\na_thismenuitempos\r\na_tickcount\r\na_timeidle\r\na_timeidlephysical\r\na_timesincepriorhotkey\r\na_timesincethishotkey\r\na_titlematchmode\r\na_titlematchmodespeed\r\na_username\r\na_wday\r\na_windelay\r\na_windir\r\na_workingdir\r\na_yday\r\na_year\r\na_yweek\r\na_yyyy\r\nclipboard\r\nclipboardall\r\ncomspec\r\nerrorlevel\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"a_ahkpath\"],\r\n\t[\"constant\", \"a_ahkversion\"],\r\n\t[\"constant\", \"a_appdata\"],\r\n\t[\"constant\", \"a_appdatacommon\"],\r\n\t[\"constant\", \"a_autotrim\"],\r\n\t[\"constant\", \"a_batchlines\"],\r\n\t[\"constant\", \"a_caretx\"],\r\n\t[\"constant\", \"a_carety\"],\r\n\t[\"constant\", \"a_computername\"],\r\n\t[\"constant\", \"a_controldelay\"],\r\n\t[\"constant\", \"a_cursor\"],\r\n\t[\"constant\", \"a_dd\"],\r\n\t[\"constant\", \"a_ddd\"],\r\n\t[\"constant\", \"a_dddd\"],\r\n\t[\"constant\", \"a_defaultmousespeed\"],\r\n\t[\"constant\", \"a_desktop\"],\r\n\t[\"constant\", \"a_desktopcommon\"],\r\n\t[\"constant\", \"a_detecthiddentext\"],\r\n\t[\"constant\", \"a_detecthiddenwindows\"],\r\n\t[\"constant\", \"a_endchar\"],\r\n\t[\"constant\", \"a_eventinfo\"],\r\n\t[\"constant\", \"a_exitreason\"],\r\n\t[\"constant\", \"a_fileencoding\"],\r\n\t[\"constant\", \"a_formatfloat\"],\r\n\t[\"constant\", \"a_formatinteger\"],\r\n\t[\"constant\", \"a_gui\"],\r\n\t[\"constant\", \"a_guievent\"],\r\n\t[\"constant\", \"a_guicontrol\"],\r\n\t[\"constant\", \"a_guicontrolevent\"],\r\n\t[\"constant\", \"a_guiheight\"],\r\n\t[\"constant\", \"a_guiwidth\"],\r\n\t[\"constant\", \"a_guix\"],\r\n\t[\"constant\", \"a_guiy\"],\r\n\t[\"constant\", \"a_hour\"],\r\n\t[\"constant\", \"a_iconfile\"],\r\n\t[\"constant\", \"a_iconhidden\"],\r\n\t[\"constant\", \"a_iconnumber\"],\r\n\t[\"constant\", \"a_icontip\"],\r\n\t[\"constant\", \"a_index\"],\r\n\t[\"constant\", \"a_ipaddress1\"],\r\n\t[\"constant\", \"a_ipaddress2\"],\r\n\t[\"constant\", \"a_ipaddress3\"],\r\n\t[\"constant\", \"a_ipaddress4\"],\r\n\t[\"constant\", \"a_is64bitos\"],\r\n\t[\"constant\", \"a_isadmin\"],\r\n\t[\"constant\", \"a_iscompiled\"],\r\n\t[\"constant\", \"a_iscritical\"],\r\n\t[\"constant\", \"a_ispaused\"],\r\n\t[\"constant\", \"a_issuspended\"],\r\n\t[\"constant\", \"a_isunicode\"],\r\n\t[\"constant\", \"a_keydelay\"],\r\n\t[\"constant\", \"a_language\"],\r\n\t[\"constant\", \"a_lasterror\"],\r\n\t[\"constant\", \"a_linefile\"],\r\n\t[\"constant\", \"a_linenumber\"],\r\n\t[\"constant\", \"a_loopfield\"],\r\n\t[\"constant\", \"a_loopfileattrib\"],\r\n\t[\"constant\", \"a_loopfiledir\"],\r\n\t[\"constant\", \"a_loopfileext\"],\r\n\t[\"constant\", \"a_loopfilefullpath\"],\r\n\t[\"constant\", \"a_loopfilelongpath\"],\r\n\t[\"constant\", \"a_loopfilename\"],\r\n\t[\"constant\", \"a_loopfileshortname\"],\r\n\t[\"constant\", \"a_loopfileshortpath\"],\r\n\t[\"constant\", \"a_loopfilesize\"],\r\n\t[\"constant\", \"a_loopfilesizekb\"],\r\n\t[\"constant\", \"a_loopfilesizemb\"],\r\n\t[\"constant\", \"a_loopfiletimeaccessed\"],\r\n\t[\"constant\", \"a_loopfiletimecreated\"],\r\n\t[\"constant\", \"a_loopfiletimemodified\"],\r\n\t[\"constant\", \"a_loopreadline\"],\r\n\t[\"constant\", \"a_loopregkey\"],\r\n\t[\"constant\", \"a_loopregname\"],\r\n\t[\"constant\", \"a_loopregsubkey\"],\r\n\t[\"constant\", \"a_loopregtimemodified\"],\r\n\t[\"constant\", \"a_loopregtype\"],\r\n\t[\"constant\", \"a_mday\"],\r\n\t[\"constant\", \"a_min\"],\r\n\t[\"constant\", \"a_mm\"],\r\n\t[\"constant\", \"a_mmm\"],\r\n\t[\"constant\", \"a_mmmm\"],\r\n\t[\"constant\", \"a_mon\"],\r\n\t[\"constant\", \"a_mousedelay\"],\r\n\t[\"constant\", \"a_msec\"],\r\n\t[\"constant\", \"a_mydocuments\"],\r\n\t[\"constant\", \"a_now\"],\r\n\t[\"constant\", \"a_nowutc\"],\r\n\t[\"constant\", \"a_numbatchlines\"],\r\n\t[\"constant\", \"a_ostype\"],\r\n\t[\"constant\", \"a_osversion\"],\r\n\t[\"constant\", \"a_priorhotkey\"],\r\n\t[\"constant\", \"a_priorkey\"],\r\n\t[\"constant\", \"programfiles\"],\r\n\t[\"constant\", \"a_programfiles\"],\r\n\t[\"constant\", \"a_programs\"],\r\n\t[\"constant\", \"a_programscommon\"],\r\n\t[\"constant\", \"a_ptrsize\"],\r\n\t[\"constant\", \"a_regview\"],\r\n\t[\"constant\", \"a_screendpi\"],\r\n\t[\"constant\", \"a_screenheight\"],\r\n\t[\"constant\", \"a_scripthwnd\"],\r\n\t[\"constant\", \"a_screenwidth\"],\r\n\t[\"constant\", \"a_scriptdir\"],\r\n\t[\"constant\", \"a_scriptfullpath\"],\r\n\t[\"constant\", \"a_scriptname\"],\r\n\t[\"constant\", \"a_sec\"],\r\n\t[\"constant\", \"a_space\"],\r\n\t[\"constant\", \"a_startmenu\"],\r\n\t[\"constant\", \"a_startmenucommon\"],\r\n\t[\"constant\", \"a_startup\"],\r\n\t[\"constant\", \"a_startupcommon\"],\r\n\t[\"constant\", \"a_stringcasesense\"],\r\n\t[\"constant\", \"a_tab\"],\r\n\t[\"constant\", \"a_temp\"],\r\n\t[\"constant\", \"a_thisfunc\"],\r\n\t[\"constant\", \"a_thishotkey\"],\r\n\t[\"constant\", \"a_thislabel\"],\r\n\t[\"constant\", \"a_thismenu\"],\r\n\t[\"constant\", \"a_thismenuitem\"],\r\n\t[\"constant\", \"a_thismenuitempos\"],\r\n\t[\"constant\", \"a_tickcount\"],\r\n\t[\"constant\", \"a_timeidle\"],\r\n\t[\"constant\", \"a_timeidlephysical\"],\r\n\t[\"constant\", \"a_timesincepriorhotkey\"],\r\n\t[\"constant\", \"a_timesincethishotkey\"],\r\n\t[\"constant\", \"a_titlematchmode\"],\r\n\t[\"constant\", \"a_titlematchmodespeed\"],\r\n\t[\"constant\", \"a_username\"],\r\n\t[\"constant\", \"a_wday\"],\r\n\t[\"constant\", \"a_windelay\"],\r\n\t[\"constant\", \"a_windir\"],\r\n\t[\"constant\", \"a_workingdir\"],\r\n\t[\"constant\", \"a_yday\"],\r\n\t[\"constant\", \"a_year\"],\r\n\t[\"constant\", \"a_yweek\"],\r\n\t[\"constant\", \"a_yyyy\"],\r\n\t[\"constant\", \"clipboard\"],\r\n\t[\"constant\", \"clipboardall\"],\r\n\t[\"constant\", \"comspec\"],\r\n\t[\"constant\", \"errorlevel\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all constants."
  },
  {
    "path": "tests/languages/autohotkey/directive_feature.test",
    "content": "#AllowSameLineComments\n#ClipboardTimeout\n#CommentFlag\n#DerefChar\n#ErrorStdOut\n#EscapeChar\n#HotkeyInterval\n#HotkeyModifierTimeout\n#Hotstring\n#If\n#IfTimeout\n#IfWinActive\n#IfWinExist\n#IfWinNotActive\n#IfWinNotExist\n#Include\n#IncludeAgain\n#InputLevel\n#InstallKeybdHook\n#InstallMouseHook\n#KeyHistory\n#MaxHotkeysPerInterval\n#MaxMem\n#MaxThreads\n#MaxThreadsBuffer\n#MaxThreadsPerHotkey\n#MenuMaskKey\n#NoEnv\n#NoTrayIcon\n#Persistent\n#SingleInstance\n#UseHook\n#WinActivateForce\n#Warn\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"#AllowSameLineComments\"],\n\t[\"directive\", \"#ClipboardTimeout\"],\n\t[\"directive\", \"#CommentFlag\"],\n\t[\"directive\", \"#DerefChar\"],\n\t[\"directive\", \"#ErrorStdOut\"],\n\t[\"directive\", \"#EscapeChar\"],\n\t[\"directive\", \"#HotkeyInterval\"],\n\t[\"directive\", \"#HotkeyModifierTimeout\"],\n\t[\"directive\", \"#Hotstring\"],\n\t[\"directive\", \"#If\"],\n\t[\"directive\", \"#IfTimeout\"],\n\t[\"directive\", \"#IfWinActive\"],\n\t[\"directive\", \"#IfWinExist\"],\n\t[\"directive\", \"#IfWinNotActive\"],\n\t[\"directive\", \"#IfWinNotExist\"],\n\t[\"directive\", \"#Include\"],\n\t[\"directive\", \"#IncludeAgain\"],\n\t[\"directive\", \"#InputLevel\"],\n\t[\"directive\", \"#InstallKeybdHook\"],\n\t[\"directive\", \"#InstallMouseHook\"],\n\t[\"directive\", \"#KeyHistory\"],\n\t[\"directive\", \"#MaxHotkeysPerInterval\"],\n\t[\"directive\", \"#MaxMem\"],\n\t[\"directive\", \"#MaxThreads\"],\n\t[\"directive\", \"#MaxThreadsBuffer\"],\n\t[\"directive\", \"#MaxThreadsPerHotkey\"],\n\t[\"directive\", \"#MenuMaskKey\"],\n\t[\"directive\", \"#NoEnv\"],\n\t[\"directive\", \"#NoTrayIcon\"],\n\t[\"directive\", \"#Persistent\"],\n\t[\"directive\", \"#SingleInstance\"],\n\t[\"directive\", \"#UseHook\"],\n\t[\"directive\", \"#WinActivateForce\"],\n\t[\"directive\", \"#Warn\"]\n]\n\n----------------------------------------------------\n\nChecks for all important keywords.\n"
  },
  {
    "path": "tests/languages/autohotkey/function_feature.test",
    "content": "foo(\r\nfoo_bar(\r\n\r\n; not a function\r\nif(\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo_bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"comment\", \"; not a function\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/autohotkey/issue2911.test",
    "content": "A.invert({1:\"a\", 2:\"A\"})\n; => {\"a\":2}\n\nNormalLabel:\n; do something\nreturn\n\tTabbedLabel:\n\t; do something\n\treturn\nSus{}//[]Label:\n; do something\nreturn\n\n----------------------------------------------------\n\n[\n\t\"A\",\n\t[\"operator\", \".\"],\n\t[\"function\", \"invert\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \"{\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"\\\"a\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"\\\"A\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"comment\", \"; => {\\\"a\\\":2}\"],\n\n\t[\"tag\", \"NormalLabel\"], [\"punctuation\", \":\"],\n\t[\"comment\", \"; do something\"],\n\t[\"command\", \"return\"],\n\t[\"tag\", \"TabbedLabel\"], [\"punctuation\", \":\"],\n\t[\"comment\", \"; do something\"],\n\t[\"command\", \"return\"],\n\t[\"tag\", \"Sus{}//[]Label\"], [\"punctuation\", \":\"],\n\t[\"comment\", \"; do something\"],\n\t[\"command\", \"return\"]\n]\n"
  },
  {
    "path": "tests/languages/autohotkey/keyword_feature.test",
    "content": "Abort\r\nAboveNormal\r\nAdd\r\nahk_class\r\nahk_exe\r\nahk_group\r\nahk_id\r\nahk_pid\r\nAll\r\nAlnum\r\nAlpha\r\nAltSubmit\r\nAltTab\r\nAltTabAndMenu\r\nAltTabMenu\r\nAltTabMenuDismiss\r\nAlwaysOnTop\r\nAutoSize\r\nBackground\r\nBackgroundTrans\r\nBelowNormal\r\nbetween\r\nBitAnd\r\nBitNot\r\nBitOr\r\nBitShiftLeft\r\nBitShiftRight\r\nBitXOr\r\nBold\r\nBorder\r\nButton\r\nByRef\r\nCatch\r\nCheckbox\r\nChecked\r\nCheckedGray\r\nChoose\r\nChooseString\r\nClose\r\nColor\r\nComboBox\r\nContains\r\nControlList\r\nCount\r\nDate\r\nDateTime\r\nDays\r\nDDL\r\nDefault\r\nDeleteAll\r\nDelimiter\r\nDeref\r\nDestroy\r\nDigit\r\nDisable\r\nDisabled\r\nDropDownList\r\nEdit\r\nEject\r\nElse\r\nEnable\r\nEnabled\r\nError\r\nExist\r\nExpand\r\nExStyle\r\nFileSystem\r\nFinally\r\nFirst\r\nFlash\r\nFloat\r\nFloatFast\r\nFocus\r\nFont\r\nfor\r\nglobal\r\nGrid\r\nGroup\r\nGroupBox\r\nGuiClose\r\nGuiContextMenu\r\nGuiDropFiles\r\nGuiEscape\r\nGuiSize\r\nHdr\r\nHidden\r\nHide\r\nHigh\r\nHKCC\r\nHKCR\r\nHKCU\r\nHKEY_CLASSES_ROOT\r\nHKEY_CURRENT_CONFIG\r\nHKEY_CURRENT_USER\r\nHKEY_LOCAL_MACHINE\r\nHKEY_USERS\r\nHKLM\r\nHKU\r\nHours\r\nHScroll\r\nIcon\r\nIconSmall\r\nID\r\nIDLast\r\nIf\r\nIfEqual\r\nIfExist\r\nIfGreater\r\nIfGreaterOrEqual\r\nIfInString\r\nIfLess\r\nIfLessOrEqual\r\nIfMsgBox\r\nIfNotEqual\r\nIfNotExist\r\nIfNotInString\r\nIfWinActive\r\nIfWinExist\r\nIfWinNotActive\r\nIfWinNotExist\r\nIgnore\r\nImageList\r\nin\r\nInteger\r\nIntegerFast\r\nInterrupt\r\nis\r\nitalic\r\nJoin\r\nLabel\r\nLastFound\r\nLastFoundExist\r\nLimit\r\nLines\r\nList\r\nListBox\r\nListView\r\nlocal\r\nLock\r\nLogoff\r\nLow\r\nLower\r\nLowercase\r\nMainWindow\r\nMargin\r\nMaximize\r\nMaximizeBox\r\nMaxSize\r\nMinimize\r\nMinimizeBox\r\nMinMax\r\nMinSize\r\nMinutes\r\nMonthCal\r\nMouse\r\nMove\r\nMulti\r\nNA\r\nNo\r\nNoActivate\r\nNoDefault\r\nNoHide\r\nNoIcon\r\nNoMainWindow\r\nnorm\r\nNormal\r\nNoSort\r\nNoSortHdr\r\nNoStandard\r\nNot\r\nNoTab\r\nNoTimers\r\nNumber\r\nOff\r\nOk\r\nOn\r\nOwnDialogs\r\nOwner\r\nParse\r\nPassword\r\nPicture\r\nPixel\r\nPos\r\nPow\r\nPriority\r\nProcessName\r\nRadio\r\nRange\r\nRead\r\nReadOnly\r\nRealtime\r\nRedraw\r\nREG_BINARY\r\nREG_DWORD\r\nREG_EXPAND_SZ\r\nREG_MULTI_SZ\r\nREG_SZ\r\nRegion\r\nRelative\r\nRename\r\nReport\r\nResize\r\nRestore\r\nRetry\r\nRGB\r\nScreen\r\nSeconds\r\nSection\r\nSerial\r\nSetLabel\r\nShiftAltTab\r\nShow\r\nSingle\r\nSlider\r\nSortDesc\r\nStandard\r\nstatic\r\nStatus\r\nStatusBar\r\nStatusCD\r\nstrike\r\nStyle\r\nSubmit\r\nSysMenu\r\nTab2\r\nTabStop\r\nText\r\nTheme\r\nThrow\r\nTile\r\nToggleCheck\r\nToggleEnable\r\nToolWindow\r\nTop\r\nTopmost\r\nTransColor\r\nTransparent\r\nTray\r\nTreeView\r\nTry\r\nTryAgain\r\nType\r\nUnCheck\r\nunderline\r\nUnicode\r\nUnlock\r\nUntil\r\nUpDown\r\nUpper\r\nUppercase\r\nUseErrorLevel\r\nVis\r\nVisFirst\r\nVisible\r\nVScroll\r\nWait\r\nWaitClose\r\nWantCtrlA\r\nWantF2\r\nWantReturn\r\nWhile\r\nWrap\r\nXdigit\r\nxm\r\nxp\r\nxs\r\nYes\r\nym\r\nyp\r\nys\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"Abort\"],\r\n\t[\"keyword\", \"AboveNormal\"],\r\n\t[\"keyword\", \"Add\"],\r\n\t[\"keyword\", \"ahk_class\"],\r\n\t[\"keyword\", \"ahk_exe\"],\r\n\t[\"keyword\", \"ahk_group\"],\r\n\t[\"keyword\", \"ahk_id\"],\r\n\t[\"keyword\", \"ahk_pid\"],\r\n\t[\"keyword\", \"All\"],\r\n\t[\"keyword\", \"Alnum\"],\r\n\t[\"keyword\", \"Alpha\"],\r\n\t[\"keyword\", \"AltSubmit\"],\r\n\t[\"keyword\", \"AltTab\"],\r\n\t[\"keyword\", \"AltTabAndMenu\"],\r\n\t[\"keyword\", \"AltTabMenu\"],\r\n\t[\"keyword\", \"AltTabMenuDismiss\"],\r\n\t[\"keyword\", \"AlwaysOnTop\"],\r\n\t[\"keyword\", \"AutoSize\"],\r\n\t[\"keyword\", \"Background\"],\r\n\t[\"keyword\", \"BackgroundTrans\"],\r\n\t[\"keyword\", \"BelowNormal\"],\r\n\t[\"keyword\", \"between\"],\r\n\t[\"keyword\", \"BitAnd\"],\r\n\t[\"keyword\", \"BitNot\"],\r\n\t[\"keyword\", \"BitOr\"],\r\n\t[\"keyword\", \"BitShiftLeft\"],\r\n\t[\"keyword\", \"BitShiftRight\"],\r\n\t[\"keyword\", \"BitXOr\"],\r\n\t[\"keyword\", \"Bold\"],\r\n\t[\"keyword\", \"Border\"],\r\n\t[\"keyword\", \"Button\"],\r\n\t[\"keyword\", \"ByRef\"],\r\n\t[\"keyword\", \"Catch\"],\r\n\t[\"keyword\", \"Checkbox\"],\r\n\t[\"keyword\", \"Checked\"],\r\n\t[\"keyword\", \"CheckedGray\"],\r\n\t[\"keyword\", \"Choose\"],\r\n\t[\"keyword\", \"ChooseString\"],\r\n\t[\"keyword\", \"Close\"],\r\n\t[\"keyword\", \"Color\"],\r\n\t[\"keyword\", \"ComboBox\"],\r\n\t[\"keyword\", \"Contains\"],\r\n\t[\"keyword\", \"ControlList\"],\r\n\t[\"keyword\", \"Count\"],\r\n\t[\"keyword\", \"Date\"],\r\n\t[\"keyword\", \"DateTime\"],\r\n\t[\"keyword\", \"Days\"],\r\n\t[\"keyword\", \"DDL\"],\r\n\t[\"keyword\", \"Default\"],\r\n\t[\"keyword\", \"DeleteAll\"],\r\n\t[\"keyword\", \"Delimiter\"],\r\n\t[\"keyword\", \"Deref\"],\r\n\t[\"keyword\", \"Destroy\"],\r\n\t[\"keyword\", \"Digit\"],\r\n\t[\"keyword\", \"Disable\"],\r\n\t[\"keyword\", \"Disabled\"],\r\n\t[\"keyword\", \"DropDownList\"],\r\n\t[\"keyword\", \"Edit\"],\r\n\t[\"keyword\", \"Eject\"],\r\n\t[\"keyword\", \"Else\"],\r\n\t[\"keyword\", \"Enable\"],\r\n\t[\"keyword\", \"Enabled\"],\r\n\t[\"keyword\", \"Error\"],\r\n\t[\"keyword\", \"Exist\"],\r\n\t[\"keyword\", \"Expand\"],\r\n\t[\"keyword\", \"ExStyle\"],\r\n\t[\"keyword\", \"FileSystem\"],\r\n\t[\"keyword\", \"Finally\"],\r\n\t[\"keyword\", \"First\"],\r\n\t[\"keyword\", \"Flash\"],\r\n\t[\"keyword\", \"Float\"],\r\n\t[\"keyword\", \"FloatFast\"],\r\n\t[\"keyword\", \"Focus\"],\r\n\t[\"keyword\", \"Font\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"global\"],\r\n\t[\"keyword\", \"Grid\"],\r\n\t[\"keyword\", \"Group\"],\r\n\t[\"keyword\", \"GroupBox\"],\r\n\t[\"keyword\", \"GuiClose\"],\r\n\t[\"keyword\", \"GuiContextMenu\"],\r\n\t[\"keyword\", \"GuiDropFiles\"],\r\n\t[\"keyword\", \"GuiEscape\"],\r\n\t[\"keyword\", \"GuiSize\"],\r\n\t[\"keyword\", \"Hdr\"],\r\n\t[\"keyword\", \"Hidden\"],\r\n\t[\"keyword\", \"Hide\"],\r\n\t[\"keyword\", \"High\"],\r\n\t[\"keyword\", \"HKCC\"],\r\n\t[\"keyword\", \"HKCR\"],\r\n\t[\"keyword\", \"HKCU\"],\r\n\t[\"keyword\", \"HKEY_CLASSES_ROOT\"],\r\n\t[\"keyword\", \"HKEY_CURRENT_CONFIG\"],\r\n\t[\"keyword\", \"HKEY_CURRENT_USER\"],\r\n\t[\"keyword\", \"HKEY_LOCAL_MACHINE\"],\r\n\t[\"keyword\", \"HKEY_USERS\"],\r\n\t[\"keyword\", \"HKLM\"],\r\n\t[\"keyword\", \"HKU\"],\r\n\t[\"keyword\", \"Hours\"],\r\n\t[\"keyword\", \"HScroll\"],\r\n\t[\"keyword\", \"Icon\"],\r\n\t[\"keyword\", \"IconSmall\"],\r\n\t[\"keyword\", \"ID\"],\r\n\t[\"keyword\", \"IDLast\"],\r\n\t[\"keyword\", \"If\"],\r\n\t[\"keyword\", \"IfEqual\"],\r\n\t[\"keyword\", \"IfExist\"],\r\n\t[\"keyword\", \"IfGreater\"],\r\n\t[\"keyword\", \"IfGreaterOrEqual\"],\r\n\t[\"keyword\", \"IfInString\"],\r\n\t[\"keyword\", \"IfLess\"],\r\n\t[\"keyword\", \"IfLessOrEqual\"],\r\n\t[\"keyword\", \"IfMsgBox\"],\r\n\t[\"keyword\", \"IfNotEqual\"],\r\n\t[\"keyword\", \"IfNotExist\"],\r\n\t[\"keyword\", \"IfNotInString\"],\r\n\t[\"keyword\", \"IfWinActive\"],\r\n\t[\"keyword\", \"IfWinExist\"],\r\n\t[\"keyword\", \"IfWinNotActive\"],\r\n\t[\"keyword\", \"IfWinNotExist\"],\r\n\t[\"keyword\", \"Ignore\"],\r\n\t[\"keyword\", \"ImageList\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"Integer\"],\r\n\t[\"keyword\", \"IntegerFast\"],\r\n\t[\"keyword\", \"Interrupt\"],\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"italic\"],\r\n\t[\"keyword\", \"Join\"],\r\n\t[\"keyword\", \"Label\"],\r\n\t[\"keyword\", \"LastFound\"],\r\n\t[\"keyword\", \"LastFoundExist\"],\r\n\t[\"keyword\", \"Limit\"],\r\n\t[\"keyword\", \"Lines\"],\r\n\t[\"keyword\", \"List\"],\r\n\t[\"keyword\", \"ListBox\"],\r\n\t[\"keyword\", \"ListView\"],\r\n\t[\"keyword\", \"local\"],\r\n\t[\"keyword\", \"Lock\"],\r\n\t[\"keyword\", \"Logoff\"],\r\n\t[\"keyword\", \"Low\"],\r\n\t[\"keyword\", \"Lower\"],\r\n\t[\"keyword\", \"Lowercase\"],\r\n\t[\"keyword\", \"MainWindow\"],\r\n\t[\"keyword\", \"Margin\"],\r\n\t[\"keyword\", \"Maximize\"],\r\n\t[\"keyword\", \"MaximizeBox\"],\r\n\t[\"keyword\", \"MaxSize\"],\r\n\t[\"keyword\", \"Minimize\"],\r\n\t[\"keyword\", \"MinimizeBox\"],\r\n\t[\"keyword\", \"MinMax\"],\r\n\t[\"keyword\", \"MinSize\"],\r\n\t[\"keyword\", \"Minutes\"],\r\n\t[\"keyword\", \"MonthCal\"],\r\n\t[\"keyword\", \"Mouse\"],\r\n\t[\"keyword\", \"Move\"],\r\n\t[\"keyword\", \"Multi\"],\r\n\t[\"keyword\", \"NA\"],\r\n\t[\"keyword\", \"No\"],\r\n\t[\"keyword\", \"NoActivate\"],\r\n\t[\"keyword\", \"NoDefault\"],\r\n\t[\"keyword\", \"NoHide\"],\r\n\t[\"keyword\", \"NoIcon\"],\r\n\t[\"keyword\", \"NoMainWindow\"],\r\n\t[\"keyword\", \"norm\"],\r\n\t[\"keyword\", \"Normal\"],\r\n\t[\"keyword\", \"NoSort\"],\r\n\t[\"keyword\", \"NoSortHdr\"],\r\n\t[\"keyword\", \"NoStandard\"],\r\n\t[\"keyword\", \"Not\"],\r\n\t[\"keyword\", \"NoTab\"],\r\n\t[\"keyword\", \"NoTimers\"],\r\n\t[\"keyword\", \"Number\"],\r\n\t[\"keyword\", \"Off\"],\r\n\t[\"keyword\", \"Ok\"],\r\n\t[\"keyword\", \"On\"],\r\n\t[\"keyword\", \"OwnDialogs\"],\r\n\t[\"keyword\", \"Owner\"],\r\n\t[\"keyword\", \"Parse\"],\r\n\t[\"keyword\", \"Password\"],\r\n\t[\"keyword\", \"Picture\"],\r\n\t[\"keyword\", \"Pixel\"],\r\n\t[\"keyword\", \"Pos\"],\r\n\t[\"keyword\", \"Pow\"],\r\n\t[\"keyword\", \"Priority\"],\r\n\t[\"keyword\", \"ProcessName\"],\r\n\t[\"keyword\", \"Radio\"],\r\n\t[\"keyword\", \"Range\"],\r\n\t[\"keyword\", \"Read\"],\r\n\t[\"keyword\", \"ReadOnly\"],\r\n\t[\"keyword\", \"Realtime\"],\r\n\t[\"keyword\", \"Redraw\"],\r\n\t[\"keyword\", \"REG_BINARY\"],\r\n\t[\"keyword\", \"REG_DWORD\"],\r\n\t[\"keyword\", \"REG_EXPAND_SZ\"],\r\n\t[\"keyword\", \"REG_MULTI_SZ\"],\r\n\t[\"keyword\", \"REG_SZ\"],\r\n\t[\"keyword\", \"Region\"],\r\n\t[\"keyword\", \"Relative\"],\r\n\t[\"keyword\", \"Rename\"],\r\n\t[\"keyword\", \"Report\"],\r\n\t[\"keyword\", \"Resize\"],\r\n\t[\"keyword\", \"Restore\"],\r\n\t[\"keyword\", \"Retry\"],\r\n\t[\"keyword\", \"RGB\"],\r\n\t[\"keyword\", \"Screen\"],\r\n\t[\"keyword\", \"Seconds\"],\r\n\t[\"keyword\", \"Section\"],\r\n\t[\"keyword\", \"Serial\"],\r\n\t[\"keyword\", \"SetLabel\"],\r\n\t[\"keyword\", \"ShiftAltTab\"],\r\n\t[\"keyword\", \"Show\"],\r\n\t[\"keyword\", \"Single\"],\r\n\t[\"keyword\", \"Slider\"],\r\n\t[\"keyword\", \"SortDesc\"],\r\n\t[\"keyword\", \"Standard\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"Status\"],\r\n\t[\"keyword\", \"StatusBar\"],\r\n\t[\"keyword\", \"StatusCD\"],\r\n\t[\"keyword\", \"strike\"],\r\n\t[\"keyword\", \"Style\"],\r\n\t[\"keyword\", \"Submit\"],\r\n\t[\"keyword\", \"SysMenu\"],\r\n\t[\"keyword\", \"Tab2\"],\r\n\t[\"keyword\", \"TabStop\"],\r\n\t[\"keyword\", \"Text\"],\r\n\t[\"keyword\", \"Theme\"],\r\n\t[\"keyword\", \"Throw\"],\r\n\t[\"keyword\", \"Tile\"],\r\n\t[\"keyword\", \"ToggleCheck\"],\r\n\t[\"keyword\", \"ToggleEnable\"],\r\n\t[\"keyword\", \"ToolWindow\"],\r\n\t[\"keyword\", \"Top\"],\r\n\t[\"keyword\", \"Topmost\"],\r\n\t[\"keyword\", \"TransColor\"],\r\n\t[\"keyword\", \"Transparent\"],\r\n\t[\"keyword\", \"Tray\"],\r\n\t[\"keyword\", \"TreeView\"],\r\n\t[\"keyword\", \"Try\"],\r\n\t[\"keyword\", \"TryAgain\"],\r\n\t[\"keyword\", \"Type\"],\r\n\t[\"keyword\", \"UnCheck\"],\r\n\t[\"keyword\", \"underline\"],\r\n\t[\"keyword\", \"Unicode\"],\r\n\t[\"keyword\", \"Unlock\"],\r\n\t[\"keyword\", \"Until\"],\r\n\t[\"keyword\", \"UpDown\"],\r\n\t[\"keyword\", \"Upper\"],\r\n\t[\"keyword\", \"Uppercase\"],\r\n\t[\"keyword\", \"UseErrorLevel\"],\r\n\t[\"keyword\", \"Vis\"],\r\n\t[\"keyword\", \"VisFirst\"],\r\n\t[\"keyword\", \"Visible\"],\r\n\t[\"keyword\", \"VScroll\"],\r\n\t[\"keyword\", \"Wait\"],\r\n\t[\"keyword\", \"WaitClose\"],\r\n\t[\"keyword\", \"WantCtrlA\"],\r\n\t[\"keyword\", \"WantF2\"],\r\n\t[\"keyword\", \"WantReturn\"],\r\n\t[\"keyword\", \"While\"],\r\n\t[\"keyword\", \"Wrap\"],\r\n\t[\"keyword\", \"Xdigit\"],\r\n\t[\"keyword\", \"xm\"],\r\n\t[\"keyword\", \"xp\"],\r\n\t[\"keyword\", \"xs\"],\r\n\t[\"keyword\", \"Yes\"],\r\n\t[\"keyword\", \"ym\"],\r\n\t[\"keyword\", \"yp\"],\r\n\t[\"keyword\", \"ys\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/autohotkey/number_feature.test",
    "content": "42\r\n3.14159\r\n3.2e10\r\n2.9E-7\r\n0xbabe\r\n0xBABE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3.2e10\"],\r\n\t[\"number\", \"2.9E-7\"],\r\n\t[\"number\", \"0xbabe\"],\r\n\t[\"number\", \"0xBABE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/autohotkey/operator_feature.test",
    "content": "+ - * /\r\n= ? & |\r\n< >\r\n++ -- ** //\r\n! ~ ^ .\r\n<< >> <= >=\r\n~= == <> !=\r\nNOT AND && OR ||\r\n:= += -= *=\r\n/= //= .=\r\n|= &= ^=\r\n>>= <<=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"?\"], [\"operator\", \"&\"], [\"operator\", \"|\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \">\"],\r\n\t[\"operator\", \"++\"], [\"operator\", \"--\"], [\"operator\", \"**\"], [\"operator\", \"//\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"~\"], [\"operator\", \"^\"], [\"operator\", \".\"],\r\n\t[\"operator\", \"<<\"], [\"operator\", \">>\"], [\"operator\", \"<=\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"~=\"], [\"operator\", \"==\"], [\"operator\", \"<>\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"NOT\"], [\"operator\", \"AND\"], [\"operator\", \"&&\"], [\"operator\", \"OR\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \":=\"], [\"operator\", \"+=\"], [\"operator\", \"-=\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"], [\"operator\", \"//=\"], [\"operator\", \".=\"],\r\n\t[\"operator\", \"|=\"], [\"operator\", \"&=\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \">>=\"], [\"operator\", \"<<=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/autohotkey/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n\"foo\"\"bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\\\"bar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/autohotkey/symbol_feature.test",
    "content": "alt\r\naltdown\r\naltup\r\nappskey\r\nbackspace\r\nbrowser_back\r\nbrowser_favorites\r\nbrowser_forward\r\nbrowser_home\r\nbrowser_refresh\r\nbrowser_search\r\nbrowser_stop\r\nbs\r\ncapslock\r\nctrl\r\nctrlbreak\r\nctrldown\r\nctrlup\r\ndel\r\ndelete\r\ndown\r\nend\r\nenter\r\nesc\r\nescape\r\nf1\r\nf10\r\nf11\r\nf12\r\nf13\r\nf14\r\nf15\r\nf16\r\nf17\r\nf18\r\nf19\r\nf2\r\nf20\r\nf21\r\nf22\r\nf23\r\nf24\r\nf3\r\nf4\r\nf5\r\nf6\r\nf7\r\nf8\r\nf9\r\nhome\r\nins\r\ninsert\r\njoy1\r\njoy10\r\njoy11\r\njoy12\r\njoy13\r\njoy14\r\njoy15\r\njoy16\r\njoy17\r\njoy18\r\njoy19\r\njoy2\r\njoy20\r\njoy21\r\njoy22\r\njoy23\r\njoy24\r\njoy25\r\njoy26\r\njoy27\r\njoy28\r\njoy29\r\njoy3\r\njoy30\r\njoy31\r\njoy32\r\njoy4\r\njoy5\r\njoy6\r\njoy7\r\njoy8\r\njoy9\r\njoyaxes\r\njoybuttons\r\njoyinfo\r\njoyname\r\njoypov\r\njoyr\r\njoyu\r\njoyv\r\njoyx\r\njoyy\r\njoyz\r\nlalt\r\nlaunch_app1\r\nlaunch_app2\r\nlaunch_mail\r\nlaunch_media\r\nlbutton\r\nlcontrol\r\nlctrl\r\nleft\r\nlshift\r\nlwin\r\nlwindown\r\nlwinup\r\nmbutton\r\nmedia_next\r\nmedia_play_pause\r\nmedia_prev\r\nmedia_stop\r\nnumlock\r\nnumpad0\r\nnumpad1\r\nnumpad2\r\nnumpad3\r\nnumpad4\r\nnumpad5\r\nnumpad6\r\nnumpad7\r\nnumpad8\r\nnumpad9\r\nnumpadadd\r\nnumpadclear\r\nnumpaddel\r\nnumpaddiv\r\nnumpaddot\r\nnumpaddown\r\nnumpadend\r\nnumpadenter\r\nnumpadhome\r\nnumpadins\r\nnumpadleft\r\nnumpadmult\r\nnumpadpgdn\r\nnumpadpgup\r\nnumpadright\r\nnumpadsub\r\nnumpadup\r\npgdn\r\npgup\r\nprintscreen\r\nralt\r\nrbutton\r\nrcontrol\r\nrctrl\r\nright\r\nrshift\r\nrwin\r\nrwindown\r\nrwinup\r\nscrolllock\r\nshift\r\nshiftdown\r\nshiftup\r\nspace\r\ntab\r\nup\r\nvolume_down\r\nvolume_mute\r\nvolume_up\r\nwheeldown\r\nwheelleft\r\nwheelright\r\nwheelup\r\nxbutton1\r\nxbutton2\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"symbol\", \"alt\"],\r\n\t[\"symbol\", \"altdown\"],\r\n\t[\"symbol\", \"altup\"],\r\n\t[\"symbol\", \"appskey\"],\r\n\t[\"symbol\", \"backspace\"],\r\n\t[\"symbol\", \"browser_back\"],\r\n\t[\"symbol\", \"browser_favorites\"],\r\n\t[\"symbol\", \"browser_forward\"],\r\n\t[\"symbol\", \"browser_home\"],\r\n\t[\"symbol\", \"browser_refresh\"],\r\n\t[\"symbol\", \"browser_search\"],\r\n\t[\"symbol\", \"browser_stop\"],\r\n\t[\"symbol\", \"bs\"],\r\n\t[\"symbol\", \"capslock\"],\r\n\t[\"symbol\", \"ctrl\"],\r\n\t[\"symbol\", \"ctrlbreak\"],\r\n\t[\"symbol\", \"ctrldown\"],\r\n\t[\"symbol\", \"ctrlup\"],\r\n\t[\"symbol\", \"del\"],\r\n\t[\"symbol\", \"delete\"],\r\n\t[\"symbol\", \"down\"],\r\n\t[\"symbol\", \"end\"],\r\n\t[\"symbol\", \"enter\"],\r\n\t[\"symbol\", \"esc\"],\r\n\t[\"symbol\", \"escape\"],\r\n\t[\"symbol\", \"f1\"],\r\n\t[\"symbol\", \"f10\"],\r\n\t[\"symbol\", \"f11\"],\r\n\t[\"symbol\", \"f12\"],\r\n\t[\"symbol\", \"f13\"],\r\n\t[\"symbol\", \"f14\"],\r\n\t[\"symbol\", \"f15\"],\r\n\t[\"symbol\", \"f16\"],\r\n\t[\"symbol\", \"f17\"],\r\n\t[\"symbol\", \"f18\"],\r\n\t[\"symbol\", \"f19\"],\r\n\t[\"symbol\", \"f2\"],\r\n\t[\"symbol\", \"f20\"],\r\n\t[\"symbol\", \"f21\"],\r\n\t[\"symbol\", \"f22\"],\r\n\t[\"symbol\", \"f23\"],\r\n\t[\"symbol\", \"f24\"],\r\n\t[\"symbol\", \"f3\"],\r\n\t[\"symbol\", \"f4\"],\r\n\t[\"symbol\", \"f5\"],\r\n\t[\"symbol\", \"f6\"],\r\n\t[\"symbol\", \"f7\"],\r\n\t[\"symbol\", \"f8\"],\r\n\t[\"symbol\", \"f9\"],\r\n\t[\"symbol\", \"home\"],\r\n\t[\"symbol\", \"ins\"],\r\n\t[\"symbol\", \"insert\"],\r\n\t[\"symbol\", \"joy1\"],\r\n\t[\"symbol\", \"joy10\"],\r\n\t[\"symbol\", \"joy11\"],\r\n\t[\"symbol\", \"joy12\"],\r\n\t[\"symbol\", \"joy13\"],\r\n\t[\"symbol\", \"joy14\"],\r\n\t[\"symbol\", \"joy15\"],\r\n\t[\"symbol\", \"joy16\"],\r\n\t[\"symbol\", \"joy17\"],\r\n\t[\"symbol\", \"joy18\"],\r\n\t[\"symbol\", \"joy19\"],\r\n\t[\"symbol\", \"joy2\"],\r\n\t[\"symbol\", \"joy20\"],\r\n\t[\"symbol\", \"joy21\"],\r\n\t[\"symbol\", \"joy22\"],\r\n\t[\"symbol\", \"joy23\"],\r\n\t[\"symbol\", \"joy24\"],\r\n\t[\"symbol\", \"joy25\"],\r\n\t[\"symbol\", \"joy26\"],\r\n\t[\"symbol\", \"joy27\"],\r\n\t[\"symbol\", \"joy28\"],\r\n\t[\"symbol\", \"joy29\"],\r\n\t[\"symbol\", \"joy3\"],\r\n\t[\"symbol\", \"joy30\"],\r\n\t[\"symbol\", \"joy31\"],\r\n\t[\"symbol\", \"joy32\"],\r\n\t[\"symbol\", \"joy4\"],\r\n\t[\"symbol\", \"joy5\"],\r\n\t[\"symbol\", \"joy6\"],\r\n\t[\"symbol\", \"joy7\"],\r\n\t[\"symbol\", \"joy8\"],\r\n\t[\"symbol\", \"joy9\"],\r\n\t[\"symbol\", \"joyaxes\"],\r\n\t[\"symbol\", \"joybuttons\"],\r\n\t[\"symbol\", \"joyinfo\"],\r\n\t[\"symbol\", \"joyname\"],\r\n\t[\"symbol\", \"joypov\"],\r\n\t[\"symbol\", \"joyr\"],\r\n\t[\"symbol\", \"joyu\"],\r\n\t[\"symbol\", \"joyv\"],\r\n\t[\"symbol\", \"joyx\"],\r\n\t[\"symbol\", \"joyy\"],\r\n\t[\"symbol\", \"joyz\"],\r\n\t[\"symbol\", \"lalt\"],\r\n\t[\"symbol\", \"launch_app1\"],\r\n\t[\"symbol\", \"launch_app2\"],\r\n\t[\"symbol\", \"launch_mail\"],\r\n\t[\"symbol\", \"launch_media\"],\r\n\t[\"symbol\", \"lbutton\"],\r\n\t[\"symbol\", \"lcontrol\"],\r\n\t[\"symbol\", \"lctrl\"],\r\n\t[\"symbol\", \"left\"],\r\n\t[\"symbol\", \"lshift\"],\r\n\t[\"symbol\", \"lwin\"],\r\n\t[\"symbol\", \"lwindown\"],\r\n\t[\"symbol\", \"lwinup\"],\r\n\t[\"symbol\", \"mbutton\"],\r\n\t[\"symbol\", \"media_next\"],\r\n\t[\"symbol\", \"media_play_pause\"],\r\n\t[\"symbol\", \"media_prev\"],\r\n\t[\"symbol\", \"media_stop\"],\r\n\t[\"symbol\", \"numlock\"],\r\n\t[\"symbol\", \"numpad0\"],\r\n\t[\"symbol\", \"numpad1\"],\r\n\t[\"symbol\", \"numpad2\"],\r\n\t[\"symbol\", \"numpad3\"],\r\n\t[\"symbol\", \"numpad4\"],\r\n\t[\"symbol\", \"numpad5\"],\r\n\t[\"symbol\", \"numpad6\"],\r\n\t[\"symbol\", \"numpad7\"],\r\n\t[\"symbol\", \"numpad8\"],\r\n\t[\"symbol\", \"numpad9\"],\r\n\t[\"symbol\", \"numpadadd\"],\r\n\t[\"symbol\", \"numpadclear\"],\r\n\t[\"symbol\", \"numpaddel\"],\r\n\t[\"symbol\", \"numpaddiv\"],\r\n\t[\"symbol\", \"numpaddot\"],\r\n\t[\"symbol\", \"numpaddown\"],\r\n\t[\"symbol\", \"numpadend\"],\r\n\t[\"symbol\", \"numpadenter\"],\r\n\t[\"symbol\", \"numpadhome\"],\r\n\t[\"symbol\", \"numpadins\"],\r\n\t[\"symbol\", \"numpadleft\"],\r\n\t[\"symbol\", \"numpadmult\"],\r\n\t[\"symbol\", \"numpadpgdn\"],\r\n\t[\"symbol\", \"numpadpgup\"],\r\n\t[\"symbol\", \"numpadright\"],\r\n\t[\"symbol\", \"numpadsub\"],\r\n\t[\"symbol\", \"numpadup\"],\r\n\t[\"symbol\", \"pgdn\"],\r\n\t[\"symbol\", \"pgup\"],\r\n\t[\"symbol\", \"printscreen\"],\r\n\t[\"symbol\", \"ralt\"],\r\n\t[\"symbol\", \"rbutton\"],\r\n\t[\"symbol\", \"rcontrol\"],\r\n\t[\"symbol\", \"rctrl\"],\r\n\t[\"symbol\", \"right\"],\r\n\t[\"symbol\", \"rshift\"],\r\n\t[\"symbol\", \"rwin\"],\r\n\t[\"symbol\", \"rwindown\"],\r\n\t[\"symbol\", \"rwinup\"],\r\n\t[\"symbol\", \"scrolllock\"],\r\n\t[\"symbol\", \"shift\"],\r\n\t[\"symbol\", \"shiftdown\"],\r\n\t[\"symbol\", \"shiftup\"],\r\n\t[\"symbol\", \"space\"],\r\n\t[\"symbol\", \"tab\"],\r\n\t[\"symbol\", \"up\"],\r\n\t[\"symbol\", \"volume_down\"],\r\n\t[\"symbol\", \"volume_mute\"],\r\n\t[\"symbol\", \"volume_up\"],\r\n\t[\"symbol\", \"wheeldown\"],\r\n\t[\"symbol\", \"wheelleft\"],\r\n\t[\"symbol\", \"wheelright\"],\r\n\t[\"symbol\", \"wheelup\"],\r\n\t[\"symbol\", \"xbutton1\"],\r\n\t[\"symbol\", \"xbutton2\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all symbols."
  },
  {
    "path": "tests/languages/autohotkey/tag_feature.test",
    "content": "foo:\r\nfoo_bar:\r\n\r\nvalidLabel: ; a comment\r\n/* multiline comment\r\n*/ validLabel:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"tag\", \"foo_bar\"], [\"punctuation\", \":\"],\r\n\r\n\t[\"tag\", \"validLabel\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"comment\", \"; a comment\"],\r\n\r\n\t[\"comment\", \"/* multiline comment\\r\\n*/\"],\r\n\t[\"tag\", \"validLabel\"],\r\n\t[\"punctuation\", \":\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags (labels).\r\n"
  },
  {
    "path": "tests/languages/autohotkey/variable_feature.test",
    "content": "%foo%\r\n%foo_bar%\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"%foo%\"],\r\n\t[\"variable\", \"%foo_bar%\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/autoit/boolean_feature.test",
    "content": "True\r\nFalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"True\"],\r\n\t[\"boolean\", \"False\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/autoit/comment_feature.test",
    "content": ";\r\n; foo\r\n#comments-start\r\n\tfoobar()\r\n#comments-end\r\n#cs\r\n\tfoobar()\r\n#ce\r\n;#comments-start\r\n\tfoobar()\r\n;#comments-end\r\n;#cs\r\n\tfoobar()\r\n;#ce\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \";\"],\r\n\t[\"comment\", \"; foo\"],\r\n\t[\"comment\", \"#comments-start\\r\\n\\tfoobar()\\r\\n#comments-end\"],\r\n\t[\"comment\", \"#cs\\r\\n\\tfoobar()\\r\\n#ce\"],\r\n\t[\"comment\", \";#comments-start\"],\r\n\t[\"function\", \"foobar\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"comment\", \";#comments-end\"],\r\n\t[\"comment\", \";#cs\"],\r\n\t[\"function\", \"foobar\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"comment\", \";#ce\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/autoit/directive_feature.test",
    "content": "#NoTrayIcon\r\n#OnAutoItStartRegister \"Example\"\r\n#include-once\r\n#include <MsgBoxConstants.au3>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"#NoTrayIcon\"],\r\n\t[\"directive\", \"#OnAutoItStartRegister\"], [\"string\", [\"\\\"Example\\\"\"]],\r\n\t[\"directive\", \"#include-once\"],\r\n\t[\"directive\", \"#include\"], [\"url\", \"<MsgBoxConstants.au3>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directives.\r\n"
  },
  {
    "path": "tests/languages/autoit/function_feature.test",
    "content": "foo()\r\nfoo_bar()\r\nfoo_bar_42()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"foo_bar\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"foo_bar_42\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/autoit/keyword_feature.test",
    "content": "Case\r\nConst\r\nContinueCase\r\nContinueLoop\r\nDefault\r\nDim\r\nDo\r\nElse\r\nElseIf\r\nEndFunc\r\nEndIf\r\nEndSelect\r\nEndSwitch\r\nEndWith\r\nEnum\r\nExit\r\nExitLoop\r\nFor\r\nFunc\r\nGlobal\r\nIf\r\nIn\r\nLocal\r\nNext\r\nNull\r\nReDim\r\nSelect\r\nStatic\r\nStep\r\nSwitch\r\nThen\r\nTo\r\nUntil\r\nVolatile\r\nWEnd\r\nWhile\r\nWith\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"Case\"],\r\n\t[\"keyword\", \"Const\"],\r\n\t[\"keyword\", \"ContinueCase\"],\r\n\t[\"keyword\", \"ContinueLoop\"],\r\n\t[\"keyword\", \"Default\"],\r\n\t[\"keyword\", \"Dim\"],\r\n\t[\"keyword\", \"Do\"],\r\n\t[\"keyword\", \"Else\"],\r\n\t[\"keyword\", \"ElseIf\"],\r\n\t[\"keyword\", \"EndFunc\"],\r\n\t[\"keyword\", \"EndIf\"],\r\n\t[\"keyword\", \"EndSelect\"],\r\n\t[\"keyword\", \"EndSwitch\"],\r\n\t[\"keyword\", \"EndWith\"],\r\n\t[\"keyword\", \"Enum\"],\r\n\t[\"keyword\", \"Exit\"],\r\n\t[\"keyword\", \"ExitLoop\"],\r\n\t[\"keyword\", \"For\"],\r\n\t[\"keyword\", \"Func\"],\r\n\t[\"keyword\", \"Global\"],\r\n\t[\"keyword\", \"If\"],\r\n\t[\"keyword\", \"In\"],\r\n\t[\"keyword\", \"Local\"],\r\n\t[\"keyword\", \"Next\"],\r\n\t[\"keyword\", \"Null\"],\r\n\t[\"keyword\", \"ReDim\"],\r\n\t[\"keyword\", \"Select\"],\r\n\t[\"keyword\", \"Static\"],\r\n\t[\"keyword\", \"Step\"],\r\n\t[\"keyword\", \"Switch\"],\r\n\t[\"keyword\", \"Then\"],\r\n\t[\"keyword\", \"To\"],\r\n\t[\"keyword\", \"Until\"],\r\n\t[\"keyword\", \"Volatile\"],\r\n\t[\"keyword\", \"WEnd\"],\r\n\t[\"keyword\", \"While\"],\r\n\t[\"keyword\", \"With\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/autoit/number_feature.test",
    "content": "42\r\n3.14159\r\n4e8\r\n3.5E-9\r\n0.7e+12\r\n0xBadFace\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"4e8\"],\r\n\t[\"number\", \"3.5E-9\"],\r\n\t[\"number\", \"0.7e+12\"],\r\n\t[\"number\", \"0xBadFace\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/autoit/operator_feature.test",
    "content": "< <= <>\r\n> >=\r\n+ += - -=\r\n* *= / /=\r\n& &=\r\n? ^\r\nAnd Or Not\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<>\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"+=\"], [\"operator\", \"-\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"*=\"], [\"operator\", \"/\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&=\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \"^\"],\r\n\t[\"operator\", \"And\"], [\"operator\", \"Or\"], [\"operator\", \"Not\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/autoit/string_feature.test",
    "content": "\"\"\r\n\"foo\"\"bar\"\r\n\"foo %foo% bar $bar$ baz @baz@\"\r\n''\r\n'foo''bar'\r\n'foo %foo% bar $bar$ baz @baz@'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"\\\"\"]],\r\n\t[\"string\", [\"\\\"foo\\\"\\\"bar\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"\\\"foo \",\r\n\t\t[\"variable\", \"%foo%\"],\r\n\t\t\" bar \",\r\n\t\t[\"variable\", \"$bar$\"],\r\n\t\t\" baz \",\r\n\t\t[\"variable\", \"@baz@\"],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\"''\"]],\r\n\t[\"string\", [\"'foo''bar'\"]],\r\n\t[\"string\", [\r\n\t\t\"'foo \",\r\n\t\t[\"variable\", \"%foo%\"],\r\n\t\t\" bar \",\r\n\t\t[\"variable\", \"$bar$\"],\r\n\t\t\" baz \",\r\n\t\t[\"variable\", \"@baz@\"],\r\n\t\t\"'\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and interpolation."
  },
  {
    "path": "tests/languages/autoit/url_feature.test",
    "content": "#include <foo.au3>\r\n#include \"foo.au3\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"#include\"],\r\n\t[\"url\", \"<foo.au3>\"],\r\n\t[\"directive\", \"#include\"],\r\n\t[\"url\", \"\\\"foo.au3\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for files in includes."
  },
  {
    "path": "tests/languages/autoit/variable_feature.test",
    "content": "$foo\r\n$foo_bar_42\r\n@ComputerName\r\n@CPUArch\r\n@TAB\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"variable\", \"$foo_bar_42\"],\r\n\t[\"variable\", \"@ComputerName\"],\r\n\t[\"variable\", \"@CPUArch\"],\r\n\t[\"variable\", \"@TAB\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables and macros."
  },
  {
    "path": "tests/languages/avisynth/clipproperties_feature.test",
    "content": "hasaudio\nhasvideo\nwidth\nheight\nframecount\nframerate\nframeratenumerator\nframeratedenominator\nisfieldbased\nisframebased\ngetparity\n\npixeltype\nisplanar\nisinterleaved\nisrgb\nisrgb24\nisrgb32\nisyuv\nisyuy2\nisy8\nisyv12\nisyv16\nisyv24\nisyv411\nis420\nis422\nis444\nisy\nisyuva\nisrgb48\nisrgb64\nispackedrgb\nisplanarrgb\nisplanarrgba\nhasalpha\ncomponentsize\nnumcomponents\nbitspercomponent\n\naudiorate\naudioduration\naudiolength\naudiolengthf\naudiolengths\naudiolengthlo\naudiolengthhi\naudiochannels\naudiobits\nisaudiofloat\nisaudioint\n\nxyzisaudiointxyz\n\n----------------------------------------------------\n\n[\n\t[\"builtin-function\", \"hasaudio\"],\n\t[\"builtin-function\", \"hasvideo\"],\n\t[\"builtin-function\", \"width\"],\n\t[\"builtin-function\", \"height\"],\n\t[\"builtin-function\", \"framecount\"],\n\t[\"builtin-function\", \"framerate\"],\n\t[\"builtin-function\", \"frameratenumerator\"],\n\t[\"builtin-function\", \"frameratedenominator\"],\n\t[\"builtin-function\", \"isfieldbased\"],\n\t[\"builtin-function\", \"isframebased\"],\n\t[\"builtin-function\", \"getparity\"],\n\n\t[\"builtin-function\", \"pixeltype\"],\n\t[\"builtin-function\", \"isplanar\"],\n\t[\"builtin-function\", \"isinterleaved\"],\n\t[\"builtin-function\", \"isrgb\"],\n\t[\"builtin-function\", \"isrgb24\"],\n\t[\"builtin-function\", \"isrgb32\"],\n\t[\"builtin-function\", \"isyuv\"],\n\t[\"builtin-function\", \"isyuy2\"],\n\t[\"builtin-function\", \"isy8\"],\n\t[\"builtin-function\", \"isyv12\"],\n\t[\"builtin-function\", \"isyv16\"],\n\t[\"builtin-function\", \"isyv24\"],\n\t[\"builtin-function\", \"isyv411\"],\n\t[\"builtin-function\", \"is420\"],\n\t[\"builtin-function\", \"is422\"],\n\t[\"builtin-function\", \"is444\"],\n\t[\"builtin-function\", \"isy\"],\n\t[\"builtin-function\", \"isyuva\"],\n\t[\"builtin-function\", \"isrgb48\"],\n\t[\"builtin-function\", \"isrgb64\"],\n\t[\"builtin-function\", \"ispackedrgb\"],\n\t[\"builtin-function\", \"isplanarrgb\"],\n\t[\"builtin-function\", \"isplanarrgba\"],\n\t[\"builtin-function\", \"hasalpha\"],\n\t[\"builtin-function\", \"componentsize\"],\n\t[\"builtin-function\", \"numcomponents\"],\n\t[\"builtin-function\", \"bitspercomponent\"],\n\n\t[\"builtin-function\", \"audiorate\"],\n\t[\"builtin-function\", \"audioduration\"],\n\t[\"builtin-function\", \"audiolength\"],\n\t[\"builtin-function\", \"audiolengthf\"],\n\t[\"builtin-function\", \"audiolengths\"],\n\t[\"builtin-function\", \"audiolengthlo\"],\n\t[\"builtin-function\", \"audiolengthhi\"],\n\t[\"builtin-function\", \"audiochannels\"],\n\t[\"builtin-function\", \"audiobits\"],\n\t[\"builtin-function\", \"isaudiofloat\"],\n\t[\"builtin-function\", \"isaudioint\"],\n\n\t\"\\r\\n\\r\\nxyzisaudiointxyz\"\n]\n\n----------------------------------------------------\n\nAll internal functions, filters, and properties can be used in the following formats:\nintFunc == intFunc() == last.intFunc == last.intFunc()\nThey must not appear within other words.\n"
  },
  {
    "path": "tests/languages/avisynth/comments_strings_predefines_feature.test",
    "content": "[* comment [* global *] DEFAULT_MT_MODE *]\n\nnotacomment\n\n/* comment\nglobal \"a string\"\nDEFAULT_MT_MODE */\n\nnotacomment\n\n# comment global DEFAULT_MT_MODE\n\nnotacomment\n\n\"a simple string\"\n\n\"\"\"a\ncomplex\nstring\"\"\"\n\n\"DEFAULT_MT_MODE\"\n\"SCRIPTDIR\"\n\"MAINSCRIPTDIR\"\n\"PROGRAMDIR\"\n\"USER_PLUS_PLUGINS\"\n\"MACHINE_PLUS_PLUGINS\"\n\"USER_CLASSIC_PLUGINS\"\n\"MACHINE_CLASSIC_PLUGINS\"\n\n\"default_mt_mode\"\n\"scriptdir\"\n\"mainscriptdir\"\n\"programdir\"\n\"user_plus_plugins\"\n\"machine_plus_plugins\"\n\"user_classic_plugins\"\n\"machine_classic_plugins\"\n\nDEFAULT_MT_MODE\n# SCRIPTDIR is also an internal function\nMAINSCRIPTDIR\nPROGRAMDIR\nUSER_PLUS_PLUGINS\nMACHINE_PLUS_PLUGINS\nUSER_CLASSIC_PLUGINS\nMACHINE_CLASSIC_PLUGINS\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"[* comment [* global *] DEFAULT_MT_MODE *]\"],\n\n\t\"\\r\\n\\r\\nnotacomment\\r\\n\\r\\n\",\n\n\t[\"comment\", \"/* comment\\r\\nglobal \\\"a string\\\"\\r\\nDEFAULT_MT_MODE */\"],\n\n\t\"\\r\\n\\r\\nnotacomment\\r\\n\\r\\n\",\n\n\t[\"comment\", \"# comment global DEFAULT_MT_MODE\"],\n\n\t\"\\r\\n\\r\\nnotacomment\\r\\n\\r\\n\",\n\n\t[\"string\", [\"\\\"a simple string\\\"\"]],\n\n\t[\"string\", \"\\\"\\\"\\\"a\\r\\ncomplex\\r\\nstring\\\"\\\"\\\"\"],\n\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"constant\", \"DEFAULT_MT_MODE\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"constant\", \"SCRIPTDIR\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"constant\", \"MAINSCRIPTDIR\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"constant\", \"PROGRAMDIR\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"constant\", \"USER_PLUS_PLUGINS\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"constant\", \"MACHINE_PLUS_PLUGINS\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"constant\", \"USER_CLASSIC_PLUGINS\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"constant\", \"MACHINE_CLASSIC_PLUGINS\"],\n\t\t\"\\\"\"\n\t]],\n\n\t[\"string\", [\"\\\"default_mt_mode\\\"\"]],\n\t[\"string\", [\"\\\"scriptdir\\\"\"]],\n\t[\"string\", [\"\\\"mainscriptdir\\\"\"]],\n\t[\"string\", [\"\\\"programdir\\\"\"]],\n\t[\"string\", [\"\\\"user_plus_plugins\\\"\"]],\n\t[\"string\", [\"\\\"machine_plus_plugins\\\"\"]],\n\t[\"string\", [\"\\\"user_classic_plugins\\\"\"]],\n\t[\"string\", [\"\\\"machine_classic_plugins\\\"\"]],\n\n\t\"\\r\\n\\r\\nDEFAULT_MT_MODE\\r\\n\",\n\t[\"comment\", \"# SCRIPTDIR is also an internal function\"],\n\t\"\\r\\nMAINSCRIPTDIR\\r\\nPROGRAMDIR\\r\\nUSER_PLUS_PLUGINS\\r\\nMACHINE_PLUS_PLUGINS\\r\\nUSER_CLASSIC_PLUGINS\\r\\nMACHINE_CLASSIC_PLUGINS\"\n]\n\n----------------------------------------------------\n\nBlock comments should not allow any other tokens within them, and should work over multiple lines.\nSingle line comments are the same, but just one line.\nKnown issue: square bracket block comments can be nested, but regular languages can't do that.\n\nSingle line strings should be surrounded by double quotes, and allow no tokens within them except for predefined symbols.\nTriple quote strings can span multiple lines and allow no tokens within them.\n\nPredefined symbols must appear within single line strings. They are case sensitive.\n"
  },
  {
    "path": "tests/languages/avisynth/intenalfuncs_feature.test",
    "content": "isbool\nisclip\nisfloat\nisint\nisstring\nexist\ndefined\nfunctionexists\ninternalfunctionexists\nvarexist\n\napply\neval\nimport\nselect\ndefault\nassert\nnop\nundefined\n\nsetmemorymax\nsetcachemode\nsetmaxcpu\nsetworkingdir\nsetplanarlegacyalignment\nopt_allowfloataudio\nopt_usewaveextensible\nopt_dwchannelmask\nopt_avipadscanlines\nopt_vdubplanarhack\nopt_enable_v210\nopt_enable_y3_10_10\nopt_enable_y3_10_16\nopt_enable_b64a\nopt_enable_planartopackedrgb\n\nvalue\nhexvalue\nhex\n\nmax\nmin\nmuldiv\nfloor\nceil\nround\nfmod\npi\nexp\nlog\nlog10\npow\nsqrt\nabs\nsign\nfrac\nrand\nspline\ncontinuednumerator\ncontinueddenominator\n\nsin\ncos\ntan\nasin\nacos\natan\natan2\nsinh\ncosh\ntanh\n\nbitand\nbitnot\nbitor\nbitxor\nbitlshift\nbitshl\nbitsal\nbitrshifta\nbitrshifts\nbitsar\nbitrshiftl\nbitrshiftu\nbitshr\nbitlrotate\nbitrol\nbitrrotatel\nbitror\nbittest\nbittst\nbitset\nbitsetcount\nbitclear\nbitclr\nbitchange\nbitchg\n\naverageluma\naveragechromau\naveragechromav\naverageb\naverageg\naverager\nlumadifference\nchromaudifference\nchromavdifference\nrgbdifference\nbdifference\ngdifference\nrdifference\nydifferencefromprevious\nudifferencefromprevious\nvdifferencefromprevious\nrgbdifferencefromprevious\nbdifferencefromprevious\ngdifferencefromprevious\nrdifferencefromprevious\nydifferencetonext\nudifferencetonext\nvdifferencetonext\nrgbdifferencetonext\nrdifferencetonext\ngdifferencetonext\nbdifferencetonext\nyplanemedian\nuplanemedian\nvplanemedian\nbplanemedian\ngplanemedian\nrplanemedian\nyplanemin\nuplanemin\nvplanemin\nbplanemin\ngplanemin\nrplanemin\nyplanemax\nuplanemax\nvplanemax\nbplanemax\ngplanemax\nrplanemax\nyplaneminmaxdifference\nuplaneminmaxdifference\nvplaneminmaxdifference\nbplaneminmaxdifference\ngplaneminmaxdifference\nrplaneminmaxdifference\n\nscriptname\nscriptnameutf8\nscriptfile\nscriptfileutf8\nscriptdir\nscriptdirutf8\nsetlogparams\nlogmsg\ngetprocessinfo\n\nlcase\nucase\nstrtoutf8\nstrfromutf8\nstrlen\nrevstr\nleftstr\nrightstr\nmidstr\nfindstr\nreplacestr\nformat\nfillstr\nstrcmp\nstrcmpi\ntrimleft\ntrimright\ntrimall\nchr\nord\ntime\n\nversionnumber\nversionstring\nisversionorgreater\n\nbuildpixeltype\ncolorspacenametopixeltype\n\nkevincosner\n\n----------------------------------------------------\n\n[\n\t[\"builtin-function\", \"isbool\"],\n\t[\"builtin-function\", \"isclip\"],\n\t[\"builtin-function\", \"isfloat\"],\n\t[\"builtin-function\", \"isint\"],\n\t[\"builtin-function\", \"isstring\"],\n\t[\"builtin-function\", \"exist\"],\n\t[\"builtin-function\", \"defined\"],\n\t[\"builtin-function\", \"functionexists\"],\n\t[\"builtin-function\", \"internalfunctionexists\"],\n\t[\"builtin-function\", \"varexist\"],\n\n\t[\"builtin-function\", \"apply\"],\n\t[\"builtin-function\", \"eval\"],\n\t[\"builtin-function\", \"import\"],\n\t[\"builtin-function\", \"select\"],\n\t[\"builtin-function\", \"default\"],\n\t[\"builtin-function\", \"assert\"],\n\t[\"builtin-function\", \"nop\"],\n\t[\"builtin-function\", \"undefined\"],\n\n\t[\"builtin-function\", \"setmemorymax\"],\n\t[\"builtin-function\", \"setcachemode\"],\n\t[\"builtin-function\", \"setmaxcpu\"],\n\t[\"builtin-function\", \"setworkingdir\"],\n\t[\"builtin-function\", \"setplanarlegacyalignment\"],\n\t[\"builtin-function\", \"opt_allowfloataudio\"],\n\t[\"builtin-function\", \"opt_usewaveextensible\"],\n\t[\"builtin-function\", \"opt_dwchannelmask\"],\n\t[\"builtin-function\", \"opt_avipadscanlines\"],\n\t[\"builtin-function\", \"opt_vdubplanarhack\"],\n\t[\"builtin-function\", \"opt_enable_v210\"],\n\t[\"builtin-function\", \"opt_enable_y3_10_10\"],\n\t[\"builtin-function\", \"opt_enable_y3_10_16\"],\n\t[\"builtin-function\", \"opt_enable_b64a\"],\n\t[\"builtin-function\", \"opt_enable_planartopackedrgb\"],\n\n\t[\"builtin-function\", \"value\"],\n\t[\"builtin-function\", \"hexvalue\"],\n\t[\"builtin-function\", \"hex\"],\n\n\t[\"builtin-function\", \"max\"],\n\t[\"builtin-function\", \"min\"],\n\t[\"builtin-function\", \"muldiv\"],\n\t[\"builtin-function\", \"floor\"],\n\t[\"builtin-function\", \"ceil\"],\n\t[\"builtin-function\", \"round\"],\n\t[\"builtin-function\", \"fmod\"],\n\t[\"builtin-function\", \"pi\"],\n\t[\"builtin-function\", \"exp\"],\n\t[\"builtin-function\", \"log\"],\n\t[\"builtin-function\", \"log10\"],\n\t[\"builtin-function\", \"pow\"],\n\t[\"builtin-function\", \"sqrt\"],\n\t[\"builtin-function\", \"abs\"],\n\t[\"builtin-function\", \"sign\"],\n\t[\"builtin-function\", \"frac\"],\n\t[\"builtin-function\", \"rand\"],\n\t[\"builtin-function\", \"spline\"],\n\t[\"builtin-function\", \"continuednumerator\"],\n\t[\"builtin-function\", \"continueddenominator\"],\n\n\t[\"builtin-function\", \"sin\"],\n\t[\"builtin-function\", \"cos\"],\n\t[\"builtin-function\", \"tan\"],\n\t[\"builtin-function\", \"asin\"],\n\t[\"builtin-function\", \"acos\"],\n\t[\"builtin-function\", \"atan\"],\n\t[\"builtin-function\", \"atan2\"],\n\t[\"builtin-function\", \"sinh\"],\n\t[\"builtin-function\", \"cosh\"],\n\t[\"builtin-function\", \"tanh\"],\n\n\t[\"builtin-function\", \"bitand\"],\n\t[\"builtin-function\", \"bitnot\"],\n\t[\"builtin-function\", \"bitor\"],\n\t[\"builtin-function\", \"bitxor\"],\n\t[\"builtin-function\", \"bitlshift\"],\n\t[\"builtin-function\", \"bitshl\"],\n\t[\"builtin-function\", \"bitsal\"],\n\t[\"builtin-function\", \"bitrshifta\"],\n\t[\"builtin-function\", \"bitrshifts\"],\n\t[\"builtin-function\", \"bitsar\"],\n\t[\"builtin-function\", \"bitrshiftl\"],\n\t[\"builtin-function\", \"bitrshiftu\"],\n\t[\"builtin-function\", \"bitshr\"],\n\t[\"builtin-function\", \"bitlrotate\"],\n\t[\"builtin-function\", \"bitrol\"],\n\t[\"builtin-function\", \"bitrrotatel\"],\n\t[\"builtin-function\", \"bitror\"],\n\t[\"builtin-function\", \"bittest\"],\n\t[\"builtin-function\", \"bittst\"],\n\t[\"builtin-function\", \"bitset\"],\n\t[\"builtin-function\", \"bitsetcount\"],\n\t[\"builtin-function\", \"bitclear\"],\n\t[\"builtin-function\", \"bitclr\"],\n\t[\"builtin-function\", \"bitchange\"],\n\t[\"builtin-function\", \"bitchg\"],\n\n\t[\"builtin-function\", \"averageluma\"],\n\t[\"builtin-function\", \"averagechromau\"],\n\t[\"builtin-function\", \"averagechromav\"],\n\t[\"builtin-function\", \"averageb\"],\n\t[\"builtin-function\", \"averageg\"],\n\t[\"builtin-function\", \"averager\"],\n\t[\"builtin-function\", \"lumadifference\"],\n\t[\"builtin-function\", \"chromaudifference\"],\n\t[\"builtin-function\", \"chromavdifference\"],\n\t[\"builtin-function\", \"rgbdifference\"],\n\t[\"builtin-function\", \"bdifference\"],\n\t[\"builtin-function\", \"gdifference\"],\n\t[\"builtin-function\", \"rdifference\"],\n\t[\"builtin-function\", \"ydifferencefromprevious\"],\n\t[\"builtin-function\", \"udifferencefromprevious\"],\n\t[\"builtin-function\", \"vdifferencefromprevious\"],\n\t[\"builtin-function\", \"rgbdifferencefromprevious\"],\n\t[\"builtin-function\", \"bdifferencefromprevious\"],\n\t[\"builtin-function\", \"gdifferencefromprevious\"],\n\t[\"builtin-function\", \"rdifferencefromprevious\"],\n\t[\"builtin-function\", \"ydifferencetonext\"],\n\t[\"builtin-function\", \"udifferencetonext\"],\n\t[\"builtin-function\", \"vdifferencetonext\"],\n\t[\"builtin-function\", \"rgbdifferencetonext\"],\n\t[\"builtin-function\", \"rdifferencetonext\"],\n\t[\"builtin-function\", \"gdifferencetonext\"],\n\t[\"builtin-function\", \"bdifferencetonext\"],\n\t[\"builtin-function\", \"yplanemedian\"],\n\t[\"builtin-function\", \"uplanemedian\"],\n\t[\"builtin-function\", \"vplanemedian\"],\n\t[\"builtin-function\", \"bplanemedian\"],\n\t[\"builtin-function\", \"gplanemedian\"],\n\t[\"builtin-function\", \"rplanemedian\"],\n\t[\"builtin-function\", \"yplanemin\"],\n\t[\"builtin-function\", \"uplanemin\"],\n\t[\"builtin-function\", \"vplanemin\"],\n\t[\"builtin-function\", \"bplanemin\"],\n\t[\"builtin-function\", \"gplanemin\"],\n\t[\"builtin-function\", \"rplanemin\"],\n\t[\"builtin-function\", \"yplanemax\"],\n\t[\"builtin-function\", \"uplanemax\"],\n\t[\"builtin-function\", \"vplanemax\"],\n\t[\"builtin-function\", \"bplanemax\"],\n\t[\"builtin-function\", \"gplanemax\"],\n\t[\"builtin-function\", \"rplanemax\"],\n\t[\"builtin-function\", \"yplaneminmaxdifference\"],\n\t[\"builtin-function\", \"uplaneminmaxdifference\"],\n\t[\"builtin-function\", \"vplaneminmaxdifference\"],\n\t[\"builtin-function\", \"bplaneminmaxdifference\"],\n\t[\"builtin-function\", \"gplaneminmaxdifference\"],\n\t[\"builtin-function\", \"rplaneminmaxdifference\"],\n\n\t[\"builtin-function\", \"scriptname\"],\n\t[\"builtin-function\", \"scriptnameutf8\"],\n\t[\"builtin-function\", \"scriptfile\"],\n\t[\"builtin-function\", \"scriptfileutf8\"],\n\t[\"builtin-function\", \"scriptdir\"],\n\t[\"builtin-function\", \"scriptdirutf8\"],\n\t[\"builtin-function\", \"setlogparams\"],\n\t[\"builtin-function\", \"logmsg\"],\n\t[\"builtin-function\", \"getprocessinfo\"],\n\n\t[\"builtin-function\", \"lcase\"],\n\t[\"builtin-function\", \"ucase\"],\n\t[\"builtin-function\", \"strtoutf8\"],\n\t[\"builtin-function\", \"strfromutf8\"],\n\t[\"builtin-function\", \"strlen\"],\n\t[\"builtin-function\", \"revstr\"],\n\t[\"builtin-function\", \"leftstr\"],\n\t[\"builtin-function\", \"rightstr\"],\n\t[\"builtin-function\", \"midstr\"],\n\t[\"builtin-function\", \"findstr\"],\n\t[\"builtin-function\", \"replacestr\"],\n\t[\"builtin-function\", \"format\"],\n\t[\"builtin-function\", \"fillstr\"],\n\t[\"builtin-function\", \"strcmp\"],\n\t[\"builtin-function\", \"strcmpi\"],\n\t[\"builtin-function\", \"trimleft\"],\n\t[\"builtin-function\", \"trimright\"],\n\t[\"builtin-function\", \"trimall\"],\n\t[\"builtin-function\", \"chr\"],\n\t[\"builtin-function\", \"ord\"],\n\t[\"builtin-function\", \"time\"],\n\n\t[\"builtin-function\", \"versionnumber\"],\n\t[\"builtin-function\", \"versionstring\"],\n\t[\"builtin-function\", \"isversionorgreater\"],\n\n\t[\"builtin-function\", \"buildpixeltype\"],\n\t[\"builtin-function\", \"colorspacenametopixeltype\"],\n\n\t\"\\r\\n\\r\\nkevincosner\"\n]\n\n----------------------------------------------------\n\nAll internal functions, filters, and properties can be used in the following formats:\nintFunc == intFunc() == last.intFunc == last.intFunc()\nThey must not appear within other words.\n"
  },
  {
    "path": "tests/languages/avisynth/internalfilters_feature.test",
    "content": "avisource\navifilesource\nopendmlsource\ndirectshowsource\nimagereader\nimagesource\nimagesourceanim\nsegmentedavisource\nsegmenteddirectshowsource\nwavsource\n\ncoloryuv\nconvertbacktoyuy2\nconverttorgb\nconverttorgb24\nconverttorgb32\nconverttorgb48\nconverttorgb64\nconverttoplanarrgb\nconverttoplanarrgba\nconverttoyuy2\nconverttoyv24\nconverttoyv16\nconverttoyv12\nconverttoy8\nconverttoyuv444\nconverttoyuv422\nconverttoyuv420\nconverttoyuva444\nconverttoyuva422\nconverttoyuva420\nconverttoyuv411\nfixluminance\ngreyscale\ngrayscale\ninvert\nlevels\nlimiter\nmergergb\nmergeargb\nmergeluma\nmergechroma\nrgbadjust\nshowred\nshowgreen\nshowblue\nshowalpha\nswapuv\ntweak\nutoy\nutoy8\nvtoy\nvtoy8\nytouv\n\ncolorkeymask\nlayer\nmask\nmaskhs\nmerge\noverlay\nresetmask\nsubtract\n\naddborders\ncrop\ncropbottom\nfliphorizontal\nflipvertical\nletterbox\nhorizontalreduceby2\nverticalreduceby2\nreduceby2\nbicubicresize\nbilinearresize\nblackmanresize\ngaussresize\nlanczosresize\nlanczos4resize\npointresize\nsincresize\nspline16resize\nspline36resize\nspline64resize\n\nskewrows\nturnleft\nturnright\nturn180\n\nblur\nsharpen\ngeneralconvolution\nspatialsoften\ntemporalsoften\nfixbrokenchromaupsampling\n\nalignedsplice\nunalignedsplice\nassumefps\nassumescaledfps\nchangefps\nconvertfps\ndeleteframe\ndissolve\nduplicateframe\nfadein0\nfadein\nfadein2\nfadeout0\nfadeout\nfadeout2\nfadeio0\nfadeio\nfadeio2\nfreezeframe\ninterleave\nloop\nreverse\nselecteven\nselectodd\nselectevery\nselectrangeevery\ntrim\n\nassumeframebased\nassumefieldbased\nassumebff\nassumetff\nbob\ncomplementparity\ndoubleweave\npeculiarblend\npulldown\nseparatecolumns\nseparaterows\nseparatefields\nswapfields\nweave\nweavecolumns\nweaverows\n\namplify\namplifydb\nassumesamplerate\naudiodub\naudiodubex\naudiotrim\nconvertaudioto8bit\nconvertaudioto16bit\nconvertaudioto24bit\nconvertaudioto32bit\nconvertaudiotofloat\nconverttomono\ndelayaudio\nensurevbrmp3sync\ngetchannel\ngetleftchannel\ngetrightchannel\nkillaudio\nkillvideo\nmergechannels\nmixaudio\nmonotostereo\nnormalize\nresampleaudio\nsupereq\nssrc\ntimestretch\n\nconditionalfilter\nframeevaluate\nscriptclip\nconditionalselect\nconditionalreader\nwritefile\nwritefileif\nwritefilestart\nwritefileend\nanimate\napplyrange\ntcpserver\ntcpsource\n\nimagewriter\n\nblankclip\nblackness\ncolorbars\ncolorbarshd\ncompare\ndumpfiltergraph\nsetgraphanalysis\necho\nhistogram\ninfo\nmessageclip\npreroll\nshowfiveversions\nshowframenumber\nshowsmpte\nshowtime\nstackhorizontal\nstackvertical\nsubtitle\ntone\nversion\n\npantone\n\n----------------------------------------------------\n\n[\n\t[\"builtin-function\", \"avisource\"],\n\t[\"builtin-function\", \"avifilesource\"],\n\t[\"builtin-function\", \"opendmlsource\"],\n\t[\"builtin-function\", \"directshowsource\"],\n\t[\"builtin-function\", \"imagereader\"],\n\t[\"builtin-function\", \"imagesource\"],\n\t[\"builtin-function\", \"imagesourceanim\"],\n\t[\"builtin-function\", \"segmentedavisource\"],\n\t[\"builtin-function\", \"segmenteddirectshowsource\"],\n\t[\"builtin-function\", \"wavsource\"],\n\n\t[\"builtin-function\", \"coloryuv\"],\n\t[\"builtin-function\", \"convertbacktoyuy2\"],\n\t[\"builtin-function\", \"converttorgb\"],\n\t[\"builtin-function\", \"converttorgb24\"],\n\t[\"builtin-function\", \"converttorgb32\"],\n\t[\"builtin-function\", \"converttorgb48\"],\n\t[\"builtin-function\", \"converttorgb64\"],\n\t[\"builtin-function\", \"converttoplanarrgb\"],\n\t[\"builtin-function\", \"converttoplanarrgba\"],\n\t[\"builtin-function\", \"converttoyuy2\"],\n\t[\"builtin-function\", \"converttoyv24\"],\n\t[\"builtin-function\", \"converttoyv16\"],\n\t[\"builtin-function\", \"converttoyv12\"],\n\t[\"builtin-function\", \"converttoy8\"],\n\t[\"builtin-function\", \"converttoyuv444\"],\n\t[\"builtin-function\", \"converttoyuv422\"],\n\t[\"builtin-function\", \"converttoyuv420\"],\n\t[\"builtin-function\", \"converttoyuva444\"],\n\t[\"builtin-function\", \"converttoyuva422\"],\n\t[\"builtin-function\", \"converttoyuva420\"],\n\t[\"builtin-function\", \"converttoyuv411\"],\n\t[\"builtin-function\", \"fixluminance\"],\n\t[\"builtin-function\", \"greyscale\"],\n\t[\"builtin-function\", \"grayscale\"],\n\t[\"builtin-function\", \"invert\"],\n\t[\"builtin-function\", \"levels\"],\n\t[\"builtin-function\", \"limiter\"],\n\t[\"builtin-function\", \"mergergb\"],\n\t[\"builtin-function\", \"mergeargb\"],\n\t[\"builtin-function\", \"mergeluma\"],\n\t[\"builtin-function\", \"mergechroma\"],\n\t[\"builtin-function\", \"rgbadjust\"],\n\t[\"builtin-function\", \"showred\"],\n\t[\"builtin-function\", \"showgreen\"],\n\t[\"builtin-function\", \"showblue\"],\n\t[\"builtin-function\", \"showalpha\"],\n\t[\"builtin-function\", \"swapuv\"],\n\t[\"builtin-function\", \"tweak\"],\n\t[\"builtin-function\", \"utoy\"],\n\t[\"builtin-function\", \"utoy8\"],\n\t[\"builtin-function\", \"vtoy\"],\n\t[\"builtin-function\", \"vtoy8\"],\n\t[\"builtin-function\", \"ytouv\"],\n\n\t[\"builtin-function\", \"colorkeymask\"],\n\t[\"builtin-function\", \"layer\"],\n\t[\"builtin-function\", \"mask\"],\n\t[\"builtin-function\", \"maskhs\"],\n\t[\"builtin-function\", \"merge\"],\n\t[\"builtin-function\", \"overlay\"],\n\t[\"builtin-function\", \"resetmask\"],\n\t[\"builtin-function\", \"subtract\"],\n\n\t[\"builtin-function\", \"addborders\"],\n\t[\"builtin-function\", \"crop\"],\n\t[\"builtin-function\", \"cropbottom\"],\n\t[\"builtin-function\", \"fliphorizontal\"],\n\t[\"builtin-function\", \"flipvertical\"],\n\t[\"builtin-function\", \"letterbox\"],\n\t[\"builtin-function\", \"horizontalreduceby2\"],\n\t[\"builtin-function\", \"verticalreduceby2\"],\n\t[\"builtin-function\", \"reduceby2\"],\n\t[\"builtin-function\", \"bicubicresize\"],\n\t[\"builtin-function\", \"bilinearresize\"],\n\t[\"builtin-function\", \"blackmanresize\"],\n\t[\"builtin-function\", \"gaussresize\"],\n\t[\"builtin-function\", \"lanczosresize\"],\n\t[\"builtin-function\", \"lanczos4resize\"],\n\t[\"builtin-function\", \"pointresize\"],\n\t[\"builtin-function\", \"sincresize\"],\n\t[\"builtin-function\", \"spline16resize\"],\n\t[\"builtin-function\", \"spline36resize\"],\n\t[\"builtin-function\", \"spline64resize\"],\n\n\t[\"builtin-function\", \"skewrows\"],\n\t[\"builtin-function\", \"turnleft\"],\n\t[\"builtin-function\", \"turnright\"],\n\t[\"builtin-function\", \"turn180\"],\n\n\t[\"builtin-function\", \"blur\"],\n\t[\"builtin-function\", \"sharpen\"],\n\t[\"builtin-function\", \"generalconvolution\"],\n\t[\"builtin-function\", \"spatialsoften\"],\n\t[\"builtin-function\", \"temporalsoften\"],\n\t[\"builtin-function\", \"fixbrokenchromaupsampling\"],\n\n\t[\"builtin-function\", \"alignedsplice\"],\n\t[\"builtin-function\", \"unalignedsplice\"],\n\t[\"builtin-function\", \"assumefps\"],\n\t[\"builtin-function\", \"assumescaledfps\"],\n\t[\"builtin-function\", \"changefps\"],\n\t[\"builtin-function\", \"convertfps\"],\n\t[\"builtin-function\", \"deleteframe\"],\n\t[\"builtin-function\", \"dissolve\"],\n\t[\"builtin-function\", \"duplicateframe\"],\n\t[\"builtin-function\", \"fadein0\"],\n\t[\"builtin-function\", \"fadein\"],\n\t[\"builtin-function\", \"fadein2\"],\n\t[\"builtin-function\", \"fadeout0\"],\n\t[\"builtin-function\", \"fadeout\"],\n\t[\"builtin-function\", \"fadeout2\"],\n\t[\"builtin-function\", \"fadeio0\"],\n\t[\"builtin-function\", \"fadeio\"],\n\t[\"builtin-function\", \"fadeio2\"],\n\t[\"builtin-function\", \"freezeframe\"],\n\t[\"builtin-function\", \"interleave\"],\n\t[\"builtin-function\", \"loop\"],\n\t[\"builtin-function\", \"reverse\"],\n\t[\"builtin-function\", \"selecteven\"],\n\t[\"builtin-function\", \"selectodd\"],\n\t[\"builtin-function\", \"selectevery\"],\n\t[\"builtin-function\", \"selectrangeevery\"],\n\t[\"builtin-function\", \"trim\"],\n\n\t[\"builtin-function\", \"assumeframebased\"],\n\t[\"builtin-function\", \"assumefieldbased\"],\n\t[\"builtin-function\", \"assumebff\"],\n\t[\"builtin-function\", \"assumetff\"],\n\t[\"builtin-function\", \"bob\"],\n\t[\"builtin-function\", \"complementparity\"],\n\t[\"builtin-function\", \"doubleweave\"],\n\t[\"builtin-function\", \"peculiarblend\"],\n\t[\"builtin-function\", \"pulldown\"],\n\t[\"builtin-function\", \"separatecolumns\"],\n\t[\"builtin-function\", \"separaterows\"],\n\t[\"builtin-function\", \"separatefields\"],\n\t[\"builtin-function\", \"swapfields\"],\n\t[\"builtin-function\", \"weave\"],\n\t[\"builtin-function\", \"weavecolumns\"],\n\t[\"builtin-function\", \"weaverows\"],\n\n\t[\"builtin-function\", \"amplify\"],\n\t[\"builtin-function\", \"amplifydb\"],\n\t[\"builtin-function\", \"assumesamplerate\"],\n\t[\"builtin-function\", \"audiodub\"],\n\t[\"builtin-function\", \"audiodubex\"],\n\t[\"builtin-function\", \"audiotrim\"],\n\t[\"builtin-function\", \"convertaudioto8bit\"],\n\t[\"builtin-function\", \"convertaudioto16bit\"],\n\t[\"builtin-function\", \"convertaudioto24bit\"],\n\t[\"builtin-function\", \"convertaudioto32bit\"],\n\t[\"builtin-function\", \"convertaudiotofloat\"],\n\t[\"builtin-function\", \"converttomono\"],\n\t[\"builtin-function\", \"delayaudio\"],\n\t[\"builtin-function\", \"ensurevbrmp3sync\"],\n\t[\"builtin-function\", \"getchannel\"],\n\t[\"builtin-function\", \"getleftchannel\"],\n\t[\"builtin-function\", \"getrightchannel\"],\n\t[\"builtin-function\", \"killaudio\"],\n\t[\"builtin-function\", \"killvideo\"],\n\t[\"builtin-function\", \"mergechannels\"],\n\t[\"builtin-function\", \"mixaudio\"],\n\t[\"builtin-function\", \"monotostereo\"],\n\t[\"builtin-function\", \"normalize\"],\n\t[\"builtin-function\", \"resampleaudio\"],\n\t[\"builtin-function\", \"supereq\"],\n\t[\"builtin-function\", \"ssrc\"],\n\t[\"builtin-function\", \"timestretch\"],\n\n\t[\"builtin-function\", \"conditionalfilter\"],\n\t[\"builtin-function\", \"frameevaluate\"],\n\t[\"builtin-function\", \"scriptclip\"],\n\t[\"builtin-function\", \"conditionalselect\"],\n\t[\"builtin-function\", \"conditionalreader\"],\n\t[\"builtin-function\", \"writefile\"],\n\t[\"builtin-function\", \"writefileif\"],\n\t[\"builtin-function\", \"writefilestart\"],\n\t[\"builtin-function\", \"writefileend\"],\n\t[\"builtin-function\", \"animate\"],\n\t[\"builtin-function\", \"applyrange\"],\n\t[\"builtin-function\", \"tcpserver\"],\n\t[\"builtin-function\", \"tcpsource\"],\n\n\t[\"builtin-function\", \"imagewriter\"],\n\n\t[\"builtin-function\", \"blankclip\"],\n\t[\"builtin-function\", \"blackness\"],\n\t[\"builtin-function\", \"colorbars\"],\n\t[\"builtin-function\", \"colorbarshd\"],\n\t[\"builtin-function\", \"compare\"],\n\t[\"builtin-function\", \"dumpfiltergraph\"],\n\t[\"builtin-function\", \"setgraphanalysis\"],\n\t[\"builtin-function\", \"echo\"],\n\t[\"builtin-function\", \"histogram\"],\n\t[\"builtin-function\", \"info\"],\n\t[\"builtin-function\", \"messageclip\"],\n\t[\"builtin-function\", \"preroll\"],\n\t[\"builtin-function\", \"showfiveversions\"],\n\t[\"builtin-function\", \"showframenumber\"],\n\t[\"builtin-function\", \"showsmpte\"],\n\t[\"builtin-function\", \"showtime\"],\n\t[\"builtin-function\", \"stackhorizontal\"],\n\t[\"builtin-function\", \"stackvertical\"],\n\t[\"builtin-function\", \"subtitle\"],\n\t[\"builtin-function\", \"tone\"],\n\t[\"builtin-function\", \"version\"],\n\n\t\"\\r\\n\\r\\npantone\"\n]\n\n----------------------------------------------------\n\nAll internal functions, filters, and properties can be used in the following formats:\nintFunc == intFunc() == last.intFunc == last.intFunc()\nThey must not appear within other words.\n"
  },
  {
    "path": "tests/languages/avisynth/keywords_constants_bools_last_feature.test",
    "content": "function\nglobal\nreturn\ntry\ncatch\nif\nelse\nwhile\nfor\n__END__\n\n\nMT_NICE_FILTER\nMT_MULTI_INSTANCE\nMT_SERIALIZED\nMT_SPECIAL_MT\n\nmt_nice_filter\nmt_multi_instance\nmt_serialized\nmt_special_mt\n\nTEXTMT_NICE_FILTERTEXT\n\ntrue\nFALSE\nyEs\nno\n\nknot\n\nlaST\n\nblasted\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"function\"],\n\t[\"keyword\", \"global\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"try\"],\n\t[\"keyword\", \"catch\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"__END__\"],\n\n\t[\"constant\", \"MT_NICE_FILTER\"],\n\t[\"constant\", \"MT_MULTI_INSTANCE\"],\n\t[\"constant\", \"MT_SERIALIZED\"],\n\t[\"constant\", \"MT_SPECIAL_MT\"],\n\n\t\"\\r\\n\\r\\nmt_nice_filter\\r\\nmt_multi_instance\\r\\nmt_serialized\\r\\nmt_special_mt\\r\\n\\r\\nTEXTMT_NICE_FILTERTEXT\\r\\n\\r\\n\",\n\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"FALSE\"],\n\t[\"boolean\", \"yEs\"],\n\t[\"boolean\", \"no\"],\n\n\t\"\\r\\n\\r\\nknot\\r\\n\\r\\n\",\n\n\t[\"variable\", \"laST\"],\n\n\t\"\\r\\n\\r\\nblasted\"\n]\n\n----------------------------------------------------\n\nKeywords just have word boundaries. Keywords can actually be used as parameter names in functions, but this\nscenario is an extreme edge and we do not bother handling it.\n\nConstants are case sensitive, and must not appear within other words.\n\nBools are case insensitive, come in 4 flavors, and must not appear within other words.\n\nThe Last special variable is case insensitive, and must not appear within other words.\n"
  },
  {
    "path": "tests/languages/avisynth/operators_numbers_punctuation.test",
    "content": "+\n++\n-\n!\n!=\n<\n<=\n>\n>=\n=\n==\n&&\n||\n?\n:\n%\n/\n*\n\n$abcdef\n$89abcdef\n123.89032\n.902834\n\n$9abcdef\na$123456a\n\n()\n{}\n[]\n;\n,\n.\n\\\n\n\\ 1.0 \\\n\n1.0 \\ 1.0\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"++\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\t[\"operator\", \"?\"],\n\t[\"operator\", \":\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"*\"],\n\n\t[\"number\", \"$abcdef\"],\n\t[\"number\", \"$89abcdef\"],\n\t[\"number\", \"123.89032\"],\n\t[\"number\", \".902834\"],\n\n\t\"\\r\\n\\r\\n$9abcdef\\r\\na$123456a\\r\\n\\r\\n\",\n\n\t[\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \".\"],\n\t[\"line-continuation\", \"\\\\\"],\n\n\t[\"line-continuation\", \"\\\\\"], [\"number\", \"1.0\"], [\"line-continuation\", \"\\\\\"],\n\n\t[\"number\", \"1.0\"], \" \\\\ \", [\"number\", \"1.0\"]\n]\n\n----------------------------------------------------\n\nNumbers can be specified in decimal form, with or without a leading value. So 0.0 and .0 both work.\nNumbers can also be specified as 6- or 8- digit hexadecimal strings for colors. They begin with a $.\nNumbers can not be bounded by words.\n\nLine continuations must be either the first or last character in a line, less some whitespace.\n"
  },
  {
    "path": "tests/languages/avisynth/types_arguments_feature.test",
    "content": "function test(clip input, int interleavedFields, float precision, string \"floatingDesync\", bool \"useQTGMC\", val \"chromaNoise\")\n{\n\tcastTest = clip(chromaNoise)\n\tcastTest = int(chromaNoise)\n\tcastTest = float(chromaNoise)\n\tcastTest = string(chromaNoise)\n\tcastTest = bool(chromaNoise)\n\tcastTest = val(chromaNoise)\n\n\treturn interleavedClip\n}\n\ntest(5, 0.5, floatingDesync=\"progressive\")\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"function\"],\n\t[\"function\", \"test\"],\n\t[\"punctuation\", \"(\"],\n\t[\"argument\", [\n\t\t[\"keyword\", \"clip\"],\n\t\t\" input\"\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"argument\", [\n\t\t[\"keyword\", \"int\"],\n\t\t\" interleavedFields\"\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"argument\", [\n\t\t[\"keyword\", \"float\"],\n\t\t\" precision\"\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"argument\", [\n\t\t[\"keyword\", \"string\"],\n\t\t\" \\\"floatingDesync\\\"\"\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"argument\", [\n\t\t[\"keyword\", \"bool\"],\n\t\t\" \\\"useQTGMC\\\"\"\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"argument\", [\n\t\t[\"keyword\", \"val\"],\n\t\t\" \\\"chromaNoise\\\"\"\n\t]],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n\\tcastTest \",\n\t[\"operator\", \"=\"],\n\t[\"type-cast\", \"clip\"],\n\t[\"punctuation\", \"(\"],\n\t\"chromaNoise\",\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\n\\tcastTest \",\n\t[\"operator\", \"=\"],\n\t[\"type-cast\", \"int\"],\n\t[\"punctuation\", \"(\"],\n\t\"chromaNoise\",\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\n\\tcastTest \",\n\t[\"operator\", \"=\"],\n\t[\"type-cast\", \"float\"],\n\t[\"punctuation\", \"(\"],\n\t\"chromaNoise\",\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\n\\tcastTest \",\n\t[\"operator\", \"=\"],\n\t[\"type-cast\", \"string\"],\n\t[\"punctuation\", \"(\"],\n\t\"chromaNoise\",\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\n\\tcastTest \",\n\t[\"operator\", \"=\"],\n\t[\"type-cast\", \"bool\"],\n\t[\"punctuation\", \"(\"],\n\t\"chromaNoise\",\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\n\\tcastTest \",\n\t[\"operator\", \"=\"],\n\t[\"type-cast\", \"val\"],\n\t[\"punctuation\", \"(\"],\n\t\"chromaNoise\",\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"return\"], \" interleavedClip\\r\\n\",\n\t[\"punctuation\", \"}\"],\n\n\t[\"function\", \"test\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"5\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0.5\"],\n\t[\"punctuation\", \",\"],\n\t[\"argument-label\", [\n\t\t[\"argument-name\", \"floatingDesync\"],\n\t\t[\"punctuation\", \"=\"]\n\t]],\n\t[\"string\", [\"\\\"progressive\\\"\"]],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nOptional arguments check for preceeding types to match before getting matched as a string, and should not be matched as strings.\nIncidental names of types in an arguments list (such as \"interleavedFields\" containing \"int\") should not get highlighted.\nTypes can be used as casts, and should not be highlighted as user-functions.\nIncidental names of types elsewhere (such as \"interleavedClip\" in a function body) should not get highlighted.\nExplicitly-named optional arguments in function calls get lowlighted (including the '=').\n"
  },
  {
    "path": "tests/languages/avisynth/userfunctions_feature.test",
    "content": "function CustomUserFunction() {\n\nQTGMC()\nlast.QTGMC\nlast.QTGMC()\n\nQTGMC\n1func()\nlast.1func\nlast.1func()\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"function\"],\n\t[\"function\", \"CustomUserFunction\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"function\", \"QTGMC\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"variable\", \"last\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"QTGMC\"],\n\n\t[\"variable\", \"last\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"QTGMC\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\n\\r\\nQTGMC\\r\\n1func\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"variable\", \"last\"],\n\t[\"punctuation\", \".\"],\n\t\"1func\\r\\n\",\n\n\t[\"variable\", \"last\"],\n\t[\"punctuation\", \".\"],\n\t\"1func\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nValid identifiers (starts with [a-zA-Z_]) proceeding a '.', preceeding a '(', or both are user/external functions.\nUser/external functions that don't match the above are technically valid but indistinguisable from variables.\n"
  },
  {
    "path": "tests/languages/avro-idl/annotation_feature.test",
    "content": "record MyRecord {\n  string @order(\"ascending\") myAscendingSortField;\n  string @order(\"descending\")  myDescendingField;\n  string @order(\"ignore\") myIgnoredField;\n}\n\n@java-class(\"java.util.ArrayList\") array<string> myStrings;\n\n@namespace(\"org.apache.avro.firstNamespace\")\n\nunion { MD5, null} @aliases([\"hash\"]) nullableHash;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"record\"],\n\t[\"class-name\", \"MyRecord\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"string\"],\n\t[\"annotation\", \"@order\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"ascending\\\"\"],\n\t[\"punctuation\", \")\"],\n\t\" myAscendingSortField\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"string\"],\n\t[\"annotation\", \"@order\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"descending\\\"\"],\n\t[\"punctuation\", \")\"],\n\t\"  myDescendingField\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"string\"],\n\t[\"annotation\", \"@order\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"ignore\\\"\"],\n\t[\"punctuation\", \")\"],\n\t\" myIgnoredField\",\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"annotation\", \"@java-class\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"java.util.ArrayList\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"array\"],\n\t[\"punctuation\", \"<\"],\n\t[\"keyword\", \"string\"],\n\t[\"punctuation\", \">\"],\n\t\" myStrings\",\n\t[\"punctuation\", \";\"],\n\n\t[\"annotation\", \"@namespace\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"org.apache.avro.firstNamespace\\\"\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"union\"],\n\t[\"punctuation\", \"{\"],\n\t\" MD5\",\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"null\"],\n\t[\"punctuation\", \"}\"],\n\t[\"annotation\", \"@aliases\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \"[\"],\n\t[\"string\", \"\\\"hash\\\"\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \")\"],\n\t\" nullableHash\",\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/avro-idl/class-name_feature.test",
    "content": "protocol MyProto {\n  @namespace(\"org.apache.avro.someOtherNamespace\")\n  record Foo {}\n\n  record Bar {}\n\n  enum Kind {\n    FOO,\n    BAR, // the bar enum value\n    BAZ\n  }\n\n  error TestError {\n    string message;\n  }\n\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"protocol\"],\n\t[\"class-name\", \"MyProto\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"annotation\", \"@namespace\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"org.apache.avro.someOtherNamespace\\\"\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"record\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"record\"],\n\t[\"class-name\", \"Bar\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"enum\"], [\"class-name\", \"Kind\"], [\"punctuation\", \"{\"],\n\t\"\\r\\n    FOO\", [\"punctuation\", \",\"],\n\t\"\\r\\n    BAR\", [\"punctuation\", \",\"], [\"comment\", \"// the bar enum value\"],\n\t\"\\r\\n    BAZ\\r\\n  \",\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"error\"], [\"class-name\", \"TestError\"], [\"punctuation\", \"{\"],\n\t[\"keyword\", \"string\"], \" message\", [\"punctuation\", \";\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/avro-idl/comment_feature.test",
    "content": "/* comment */\n/*\n comment\n */\n\n// comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"/* comment */\"],\n\t[\"comment\", \"/*\\r\\n comment\\r\\n */\"],\n\n\t[\"comment\", \"// comment\"]\n]\n"
  },
  {
    "path": "tests/languages/avro-idl/function_feature.test",
    "content": "int add(int foo, int bar = 0);\n\nvoid logMessage(string message);\n\nvoid goKaboom() throws Kaboom;\n\nvoid fireAndForget(string message) oneway;\n\nvoid `error`();\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"int\"],\n\t[\"function\", \"add\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"int\"],\n\t\" foo\",\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"int\"],\n\t\" bar \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"void\"],\n\t[\"function\", \"logMessage\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"string\"],\n\t\" message\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"void\"],\n\t[\"function\", \"goKaboom\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"throws\"],\n\t[\"class-name\", \"Kaboom\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"void\"],\n\t[\"function\", \"fireAndForget\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"string\"],\n\t\" message\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"oneway\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"void\"],\n\t[\"function-identifier\", \"`error`\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/avro-idl/keyword_feature.test",
    "content": "array;\nboolean;\nbytes;\ndate;\ndecimal;\ndouble;\nenum;\nerror;\nfalse;\nfixed;\nfloat;\nidl;\nimport;\nint;\nlocal_timestamp_ms;\nlong;\nmap;\nnull;\noneway;\nprotocol;\nrecord;\nschema;\nstring;\nthrows;\ntime_ms;\ntimestamp_ms;\ntrue;\nunion;\nuuid;\nvoid;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"array\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"boolean\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"bytes\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"date\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"decimal\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"double\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"error\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"false\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"fixed\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"float\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"idl\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"import\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"int\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"local_timestamp_ms\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"long\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"map\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"null\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"oneway\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"protocol\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"record\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"schema\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"string\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"throws\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"time_ms\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"timestamp_ms\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"true\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"union\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"uuid\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"void\"], [\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/avro-idl/number_feature.test",
    "content": "0\n123\n0xFFF\n-0\n-123\n-0xFF\n12343324234L\n0xFFFFFFFFFl\n\n0.342e4\n0.342e-4f\n0.342e-4d\n.324\n123.\n0x.2Fp+323f\n0x234.p+323d\n\nNaN\nInfinity\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"123\"],\n\t[\"number\", \"0xFFF\"],\n\t[\"number\", \"-0\"],\n\t[\"number\", \"-123\"],\n\t[\"number\", \"-0xFF\"],\n\t[\"number\", \"12343324234L\"],\n\t[\"number\", \"0xFFFFFFFFFl\"],\n\n\t[\"number\", \"0.342e4\"],\n\t[\"number\", \"0.342e-4f\"],\n\t[\"number\", \"0.342e-4d\"],\n\t[\"number\", \".324\"],\n\t[\"number\", \"123.\"],\n\t[\"number\", \"0x.2Fp+323f\"],\n\t[\"number\", \"0x234.p+323d\"],\n\n\t[\"number\", \"NaN\"],\n\t[\"number\", \"Infinity\"]\n]\n"
  },
  {
    "path": "tests/languages/avro-idl/operator_feature.test",
    "content": "=\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"=\"]\n]\n"
  },
  {
    "path": "tests/languages/avro-idl/punctuation_feature.test",
    "content": "( ) [ ] { } < >\n. : , ;\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"<\"],\n\t[\"punctuation\", \">\"],\n\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/avro-idl/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"\\\"\"\n\"\\n\\n\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"\\\\\\\"\\\"\"],\n\t[\"string\", \"\\\"\\\\n\\\\n\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/awk/comment_feature.test",
    "content": "# some comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"# some comment\"]\n]\n"
  },
  {
    "path": "tests/languages/awk/hashbang_feature.test",
    "content": "#! /bin/awk -f\n\n----------------------------------------------------\n\n[\n\t[\"hashbang\", \"#! /bin/awk -f\"]\n]\n"
  },
  {
    "path": "tests/languages/awk/keyword_feature.test",
    "content": "BEGIN\nBEGINFILE\nEND\nENDFILE\nbreak\ncase\ncontinue\ndefault\ndelete\ndo\nelse\nexit\nfor\nfunction\ngetline\nif\nin\nnext\nnextfile\nprint\nprintf\nreturn\nswitch\nwhile\n\n@include\n@load\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"BEGIN\"],\n\t[\"keyword\", \"BEGINFILE\"],\n\t[\"keyword\", \"END\"],\n\t[\"keyword\", \"ENDFILE\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"default\"],\n\t[\"keyword\", \"delete\"],\n\t[\"keyword\", \"do\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"exit\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"function\"],\n\t[\"keyword\", \"getline\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"next\"],\n\t[\"keyword\", \"nextfile\"],\n\t[\"keyword\", \"print\"],\n\t[\"keyword\", \"printf\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"switch\"],\n\t[\"keyword\", \"while\"],\n\n\t[\"keyword\", \"@include\"],\n\t[\"keyword\", \"@load\"]\n]\n"
  },
  {
    "path": "tests/languages/awk/number_feature.test",
    "content": "105\n1.05e+2\n1050e-1\n0x11\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"105\"],\n\t[\"number\", \"1.05e+2\"],\n\t[\"number\", \"1050e-1\"],\n\t[\"number\", \"0x11\"]\n]\n"
  },
  {
    "path": "tests/languages/awk/operator_feature.test",
    "content": "+ - * / % ^ **\n+= -= *= /= %= ^= **=\n++ --\n\n> >= < <= != ==\n&& || !\n\n|& >& << >>\n\n~ !~\n\n? :\n=\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"**\"],\n\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"%=\"],\n\t[\"operator\", \"^=\"],\n\t[\"operator\", \"**=\"],\n\n\t[\"operator\", \"++\"],\n\t[\"operator\", \"--\"],\n\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"==\"],\n\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\t[\"operator\", \"!\"],\n\n\t[\"operator\", \"|&\"],\n\t[\"operator\", \">&\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \">>\"],\n\n\t[\"operator\", \"~\"], [\"operator\", \"!~\"],\n\n\t[\"operator\", \"?\"], [\"operator\", \":\"],\n\t[\"operator\", \"=\"]\n]\n"
  },
  {
    "path": "tests/languages/awk/punctuation_feature.test",
    "content": "( ) [ ] { }\n, ;\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/awk/regex_feature.test",
    "content": "//;\n/.*:\\/home\\/[[:alnum:]]+:.*/\n\n----------------------------------------------------\n\n[\n\t[\"regex\", \"//\"], [\"punctuation\", \";\"],\n\t[\"regex\", \"/.*:\\\\/home\\\\/[[:alnum:]]+:.*/\"]\n]\n"
  },
  {
    "path": "tests/languages/awk/string_feature.test",
    "content": "\"\"\n\"foo\"\n\".png\\\">\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\".png\\\\\\\">\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/awk/variable_feature.test",
    "content": "$0 $1 $2\n$NF\n$i\n\n----------------------------------------------------\n\n[\n\t[\"variable\", \"$0\"], [\"variable\", \"$1\"], [\"variable\", \"$2\"],\n\t[\"variable\", \"$NF\"],\n\t[\"variable\", \"$i\"]\n]\n"
  },
  {
    "path": "tests/languages/bash/arithmetic_environment_feature.test",
    "content": "(( 4 + 5 ))\n$((5 * 7))\n\"foo $((5 * 7)) bar\"\nfor (( NUM=1 ; NUM<=1000 ; NUM++ ))\n\n----------------------------------------------------\n\n[\n\t[\"variable\", [\n\t\t[\"punctuation\", \"((\"],\n\t\t[\"number\", \"4\"],\n\t\t[\"operator\", \"+\"],\n\t\t[\"number\", \"5\"],\n\t\t[\"punctuation\", \"))\"]\n\t]],\n\t[\"variable\", [\n\t\t[\"variable\", \"$((\"],\n\t\t[\"number\", \"5\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"number\", \"7\"],\n\t\t[\"variable\", \"))\"]\n\t]],\n\t[\"string\", [\n\t\t\"\\\"foo \",\n\t\t[\"variable\", [\n\t\t\t[\"variable\", \"$((\"],\n\t\t\t[\"number\", \"5\"],\n\t\t\t[\"operator\", \"*\"],\n\t\t\t[\"number\", \"7\"],\n\t\t\t[\"variable\", \"))\"]\n\t\t]],\n\t\t\" bar\\\"\"\n\t]],\n\t[\"keyword\", \"for\"],\n\t[\"variable\", [\n\t\t[\"punctuation\", \"((\"],\n\t\t\" NUM\",\n\t\t[\"operator\", \"=\"],\n\t\t[\"number\", \"1\"],\n\t\t[\"punctuation\", \";\"],\n\t\t\" NUM\",\n\t\t[\"operator\", \"<=\"],\n\t\t[\"number\", \"1000\"],\n\t\t[\"punctuation\", \";\"],\n\t\t\" NUM\",\n\t\t[\"operator\", \"++\"],\n\t\t[\"punctuation\", \"))\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks arithmetic environments\n"
  },
  {
    "path": "tests/languages/bash/assign-left_feature.test",
    "content": "foo=12\r\nbar+='xyz'\r\nfoo+=('xyz')\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"assign-left\", [\"foo\"]],\r\n\t[\"operator\", [\"=\"]],\r\n\t[\"number\", \"12\"],\r\n\r\n\t[\"assign-left\", [\"bar\"]],\r\n\t[\"operator\", [\"+=\"]],\r\n\t[\"string\", \"'xyz'\"],\r\n\r\n\t[\"assign-left\", [\"foo\"]],\r\n\t[\"operator\", [\"+=\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"'xyz'\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variable assignments.\r\n"
  },
  {
    "path": "tests/languages/bash/builtin_feature.test",
    "content": ".\r\n:\r\nbreak\r\ncd\r\ncontinue\r\neval\r\nexec\r\nexit\r\nexport\r\ngetopts\r\nhash\r\npwd\r\nreadonly\r\nreturn\r\nshift\r\ntest\r\ntimes\r\ntrap\r\numask\r\nunset\r\nalias\r\nbind\r\nbuiltin\r\ncaller\r\ncommand\r\ndeclare\r\necho\r\nenable\r\nhelp\r\nlet\r\nlocal\r\nlogout\r\nmapfile\r\nprintf\r\nread\r\nreadarray\r\nsource\r\ntype\r\ntypeset\r\nulimit\r\nunalias\r\nset\r\nshopt\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \".\"],\r\n\t[\"builtin\", \":\"],\r\n\t[\"builtin\", \"break\"],\r\n\t[\"builtin\", \"cd\"],\r\n\t[\"builtin\", \"continue\"],\r\n\t[\"builtin\", \"eval\"],\r\n\t[\"builtin\", \"exec\"],\r\n\t[\"builtin\", \"exit\"],\r\n\t[\"builtin\", \"export\"],\r\n\t[\"builtin\", \"getopts\"],\r\n\t[\"builtin\", \"hash\"],\r\n\t[\"builtin\", \"pwd\"],\r\n\t[\"builtin\", \"readonly\"],\r\n\t[\"builtin\", \"return\"],\r\n\t[\"builtin\", \"shift\"],\r\n\t[\"builtin\", \"test\"],\r\n\t[\"builtin\", \"times\"],\r\n\t[\"builtin\", \"trap\"],\r\n\t[\"builtin\", \"umask\"],\r\n\t[\"builtin\", \"unset\"],\r\n\t[\"builtin\", \"alias\"],\r\n\t[\"builtin\", \"bind\"],\r\n\t[\"builtin\", \"builtin\"],\r\n\t[\"builtin\", \"caller\"],\r\n\t[\"builtin\", \"command\"],\r\n\t[\"builtin\", \"declare\"],\r\n\t[\"builtin\", \"echo\"],\r\n\t[\"builtin\", \"enable\"],\r\n\t[\"builtin\", \"help\"],\r\n\t[\"builtin\", \"let\"],\r\n\t[\"builtin\", \"local\"],\r\n\t[\"builtin\", \"logout\"],\r\n\t[\"builtin\", \"mapfile\"],\r\n\t[\"builtin\", \"printf\"],\r\n\t[\"builtin\", \"read\"],\r\n\t[\"builtin\", \"readarray\"],\r\n\t[\"builtin\", \"source\"],\r\n\t[\"builtin\", \"type\"],\r\n\t[\"builtin\", \"typeset\"],\r\n\t[\"builtin\", \"ulimit\"],\r\n\t[\"builtin\", \"unalias\"],\r\n\t[\"builtin\", \"set\"],\r\n\t[\"builtin\", \"shopt\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all builtins.\r\n"
  },
  {
    "path": "tests/languages/bash/command_substitution_feature.test",
    "content": "$(echo \"foo\")\n`echo \"foo\"`\n\"$(echo \"foo\") bar\"\n\"`echo \"foo\"` bar\"\n\n----------------------------------------------------\n\n[\n\t[\"variable\", [\n\t\t[\"variable\", \"$(\"],\n\t\t[\"builtin\", \"echo\"], \n\t\t[\"string\", [\"\\\"foo\\\"\"]],\n\t\t[\"variable\", \")\"]\n\t]],\n\t[\"variable\", [\n\t\t[\"variable\", \"`\"],\n\t\t[\"builtin\", \"echo\"], \n\t\t[\"string\", [\"\\\"foo\\\"\"]],\n\t\t[\"variable\", \"`\"]\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"variable\", [\n\t\t\t[\"variable\", \"$(\"],\n\t\t\t[\"builtin\", \"echo\"], \n\t\t\t[\"string\", [\"\\\"foo\\\"\"]],\n\t\t\t[\"variable\", \")\"]\n\t\t]],\n\t\t\" bar\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"variable\", [\n\t\t\t[\"variable\", \"`\"],\n\t\t\t[\"builtin\", \"echo\"],\n\t\t\t[\"string\", [\"\\\"foo\\\"\"]],\n\t\t\t[\"variable\", \"`\"]\n\t\t]],\n\t\t\" bar\\\"\"\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for command substitution.\n"
  },
  {
    "path": "tests/languages/bash/comment_feature.test",
    "content": "#foo\r\n# bar\r\n$(\r\n\t# foo\r\n\tbar\r\n)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#foo\"],\r\n\t[\"comment\", \"# bar\"],\r\n\t[\"variable\", [\r\n\t\t[\"variable\", \"$(\"],\r\n\t\t[\"comment\", \"# foo\"],\r\n\t\t\"\\r\\n\\tbar\\r\\n\",\r\n\t\t[\"variable\", \")\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/bash/entities_in_strings_feature.test",
    "content": "$'1\\a2\\b3\\c4\\e5\\f6\\n7\\r8\\t9\\v'\r\n$'1234\\056789'\r\n$'123\\456789'\r\n\"abc\\xdef\"\r\n\"\\uABCDEFG\"\r\n\"a\\\"b\"\r\n\r\n'1\\a2\\b3\\c4\\e5\\f6\\n7\\r8\\t9\\v'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\r\n\t\t\"$'1\",\r\n\t\t[\"entity\", \"\\\\a\"],\r\n\t\t\"2\",\r\n\t\t[\"entity\", \"\\\\b\"],\r\n\t\t\"3\",\r\n\t\t[\"entity\", \"\\\\c\"],\r\n\t\t\"4\",\r\n\t\t[\"entity\", \"\\\\e\"],\r\n\t\t\"5\",\r\n\t\t[\"entity\", \"\\\\f\"],\r\n\t\t\"6\",\r\n\t\t[\"entity\", \"\\\\n\"],\r\n\t\t\"7\",\r\n\t\t[\"entity\", \"\\\\r\"],\r\n\t\t\"8\",\r\n\t\t[\"entity\", \"\\\\t\"],\r\n\t\t\"9\",\r\n\t\t[\"entity\", \"\\\\v\"],\r\n\t\t\"'\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"$'1234\",\r\n\t\t[\"entity\", \"\\\\056\"],\r\n\t\t\"789'\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"$'123\",\r\n\t\t[\"entity\", \"\\\\456\"],\r\n\t\t\"789'\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"abc\",\r\n\t\t[\"entity\", \"\\\\xde\"],\r\n\t\t\"f\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"entity\", \"\\\\uABCD\"],\r\n\t\t\"EFG\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"a\",\r\n\t\t[\"entity\", \"\\\\\\\"\"],\r\n\t\t\"b\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", \"'1\\\\a2\\\\b3\\\\c4\\\\e5\\\\f6\\\\n7\\\\r8\\\\t9\\\\v'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for entities in strings, mainly according to echo and printf's manuals.\r\nNote that in some cases (“\\x”, “\\u”…) there's a limit to the number of\r\ncharacters that can be used afterwards to specify the bytes, etc.\r\n"
  },
  {
    "path": "tests/languages/bash/environment_feature.test",
    "content": "$foo\r\n$IFS\r\nIFS=a\r\n\"$PS1\"\r\n\"${PS1}\"\r\n$BASH\r\n$BASHOPTS\r\n$BASH_ALIASES\r\n$BASH_ARGC\r\n$BASH_ARGV\r\n$BASH_CMDS\r\n$BASH_COMPLETION_COMPAT_DIR\r\n$BASH_LINENO\r\n$BASH_REMATCH\r\n$BASH_SOURCE\r\n$BASH_VERSINFO\r\n$BASH_VERSION\r\n$COLORTERM\r\n$COLUMNS\r\n$COMP_WORDBREAKS\r\n$DBUS_SESSION_BUS_ADDRESS\r\n$DEFAULTS_PATH\r\n$DESKTOP_SESSION\r\n$DIRSTACK\r\n$DISPLAY\r\n$EUID\r\n$GDMSESSION\r\n$GDM_LANG\r\n$GNOME_KEYRING_CONTROL\r\n$GNOME_KEYRING_PID\r\n$GPG_AGENT_INFO\r\n$GROUPS\r\n$HISTCONTROL\r\n$HISTFILE\r\n$HISTFILESIZE\r\n$HISTSIZE\r\n$HOME\r\n$HOSTNAME\r\n$HOSTTYPE\r\n$IFS\r\n$INSTANCE\r\n$JOB\r\n$LANG\r\n$LANGUAGE\r\n$LC_ADDRESS\r\n$LC_ALL\r\n$LC_IDENTIFICATION\r\n$LC_MEASUREMENT\r\n$LC_MONETARY\r\n$LC_NAME\r\n$LC_NUMERIC\r\n$LC_PAPER\r\n$LC_TELEPHONE\r\n$LC_TIME\r\n$LESSCLOSE\r\n$LESSOPEN\r\n$LINES\r\n$LOGNAME\r\n$LS_COLORS\r\n$MACHTYPE\r\n$MAILCHECK\r\n$MANDATORY_PATH\r\n$NO_AT_BRIDGE\r\n$OLDPWD\r\n$OPTERR\r\n$OPTIND\r\n$ORBIT_SOCKETDIR\r\n$OSTYPE\r\n$PAPERSIZE\r\n$PATH\r\n$PIPESTATUS\r\n$PPID\r\n$PS1\r\n$PS2\r\n$PS3\r\n$PS4\r\n$PWD\r\n$RANDOM\r\n$REPLY\r\n$SECONDS\r\n$SELINUX_INIT\r\n$SESSION\r\n$SESSIONTYPE\r\n$SESSION_MANAGER\r\n$SHELL\r\n$SHELLOPTS\r\n$SHLVL\r\n$SSH_AUTH_SOCK\r\n$TERM\r\n$UID\r\n$UPSTART_EVENTS\r\n$UPSTART_INSTANCE\r\n$UPSTART_JOB\r\n$UPSTART_SESSION\r\n$USER\r\n$WINDOWID\r\n$XAUTHORITY\r\n$XDG_CONFIG_DIRS\r\n$XDG_CURRENT_DESKTOP\r\n$XDG_DATA_DIRS\r\n$XDG_GREETER_DATA_DIR\r\n$XDG_MENU_PREFIX\r\n$XDG_RUNTIME_DIR\r\n$XDG_SEAT\r\n$XDG_SEAT_PATH\r\n$XDG_SESSION_DESKTOP\r\n$XDG_SESSION_ID\r\n$XDG_SESSION_PATH\r\n$XDG_SESSION_TYPE\r\n$XDG_VTNR\r\n$XMODIFIERS\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"environment\", \"$IFS\"],\r\n\t[\"assign-left\", [\r\n\t\t[\"environment\", \"IFS\"]\r\n\t]],\r\n\t[\"operator\", [\"=\"]],\r\n\t\"a\\r\\n\",\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"environment\", \"$PS1\"],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"variable\", [\r\n\t\t\t\"${\",\r\n\t\t\t[\"environment\", \"PS1\"],\r\n\t\t\t\"}\"\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"environment\", \"$BASH\"],\r\n\t[\"environment\", \"$BASHOPTS\"],\r\n\t[\"environment\", \"$BASH_ALIASES\"],\r\n\t[\"environment\", \"$BASH_ARGC\"],\r\n\t[\"environment\", \"$BASH_ARGV\"],\r\n\t[\"environment\", \"$BASH_CMDS\"],\r\n\t[\"environment\", \"$BASH_COMPLETION_COMPAT_DIR\"],\r\n\t[\"environment\", \"$BASH_LINENO\"],\r\n\t[\"environment\", \"$BASH_REMATCH\"],\r\n\t[\"environment\", \"$BASH_SOURCE\"],\r\n\t[\"environment\", \"$BASH_VERSINFO\"],\r\n\t[\"environment\", \"$BASH_VERSION\"],\r\n\t[\"environment\", \"$COLORTERM\"],\r\n\t[\"environment\", \"$COLUMNS\"],\r\n\t[\"environment\", \"$COMP_WORDBREAKS\"],\r\n\t[\"environment\", \"$DBUS_SESSION_BUS_ADDRESS\"],\r\n\t[\"environment\", \"$DEFAULTS_PATH\"],\r\n\t[\"environment\", \"$DESKTOP_SESSION\"],\r\n\t[\"environment\", \"$DIRSTACK\"],\r\n\t[\"environment\", \"$DISPLAY\"],\r\n\t[\"environment\", \"$EUID\"],\r\n\t[\"environment\", \"$GDMSESSION\"],\r\n\t[\"environment\", \"$GDM_LANG\"],\r\n\t[\"environment\", \"$GNOME_KEYRING_CONTROL\"],\r\n\t[\"environment\", \"$GNOME_KEYRING_PID\"],\r\n\t[\"environment\", \"$GPG_AGENT_INFO\"],\r\n\t[\"environment\", \"$GROUPS\"],\r\n\t[\"environment\", \"$HISTCONTROL\"],\r\n\t[\"environment\", \"$HISTFILE\"],\r\n\t[\"environment\", \"$HISTFILESIZE\"],\r\n\t[\"environment\", \"$HISTSIZE\"],\r\n\t[\"environment\", \"$HOME\"],\r\n\t[\"environment\", \"$HOSTNAME\"],\r\n\t[\"environment\", \"$HOSTTYPE\"],\r\n\t[\"environment\", \"$IFS\"],\r\n\t[\"environment\", \"$INSTANCE\"],\r\n\t[\"environment\", \"$JOB\"],\r\n\t[\"environment\", \"$LANG\"],\r\n\t[\"environment\", \"$LANGUAGE\"],\r\n\t[\"environment\", \"$LC_ADDRESS\"],\r\n\t[\"environment\", \"$LC_ALL\"],\r\n\t[\"environment\", \"$LC_IDENTIFICATION\"],\r\n\t[\"environment\", \"$LC_MEASUREMENT\"],\r\n\t[\"environment\", \"$LC_MONETARY\"],\r\n\t[\"environment\", \"$LC_NAME\"],\r\n\t[\"environment\", \"$LC_NUMERIC\"],\r\n\t[\"environment\", \"$LC_PAPER\"],\r\n\t[\"environment\", \"$LC_TELEPHONE\"],\r\n\t[\"environment\", \"$LC_TIME\"],\r\n\t[\"environment\", \"$LESSCLOSE\"],\r\n\t[\"environment\", \"$LESSOPEN\"],\r\n\t[\"environment\", \"$LINES\"],\r\n\t[\"environment\", \"$LOGNAME\"],\r\n\t[\"environment\", \"$LS_COLORS\"],\r\n\t[\"environment\", \"$MACHTYPE\"],\r\n\t[\"environment\", \"$MAILCHECK\"],\r\n\t[\"environment\", \"$MANDATORY_PATH\"],\r\n\t[\"environment\", \"$NO_AT_BRIDGE\"],\r\n\t[\"environment\", \"$OLDPWD\"],\r\n\t[\"environment\", \"$OPTERR\"],\r\n\t[\"environment\", \"$OPTIND\"],\r\n\t[\"environment\", \"$ORBIT_SOCKETDIR\"],\r\n\t[\"environment\", \"$OSTYPE\"],\r\n\t[\"environment\", \"$PAPERSIZE\"],\r\n\t[\"environment\", \"$PATH\"],\r\n\t[\"environment\", \"$PIPESTATUS\"],\r\n\t[\"environment\", \"$PPID\"],\r\n\t[\"environment\", \"$PS1\"],\r\n\t[\"environment\", \"$PS2\"],\r\n\t[\"environment\", \"$PS3\"],\r\n\t[\"environment\", \"$PS4\"],\r\n\t[\"environment\", \"$PWD\"],\r\n\t[\"environment\", \"$RANDOM\"],\r\n\t[\"environment\", \"$REPLY\"],\r\n\t[\"environment\", \"$SECONDS\"],\r\n\t[\"environment\", \"$SELINUX_INIT\"],\r\n\t[\"environment\", \"$SESSION\"],\r\n\t[\"environment\", \"$SESSIONTYPE\"],\r\n\t[\"environment\", \"$SESSION_MANAGER\"],\r\n\t[\"environment\", \"$SHELL\"],\r\n\t[\"environment\", \"$SHELLOPTS\"],\r\n\t[\"environment\", \"$SHLVL\"],\r\n\t[\"environment\", \"$SSH_AUTH_SOCK\"],\r\n\t[\"environment\", \"$TERM\"],\r\n\t[\"environment\", \"$UID\"],\r\n\t[\"environment\", \"$UPSTART_EVENTS\"],\r\n\t[\"environment\", \"$UPSTART_INSTANCE\"],\r\n\t[\"environment\", \"$UPSTART_JOB\"],\r\n\t[\"environment\", \"$UPSTART_SESSION\"],\r\n\t[\"environment\", \"$USER\"],\r\n\t[\"environment\", \"$WINDOWID\"],\r\n\t[\"environment\", \"$XAUTHORITY\"],\r\n\t[\"environment\", \"$XDG_CONFIG_DIRS\"],\r\n\t[\"environment\", \"$XDG_CURRENT_DESKTOP\"],\r\n\t[\"environment\", \"$XDG_DATA_DIRS\"],\r\n\t[\"environment\", \"$XDG_GREETER_DATA_DIR\"],\r\n\t[\"environment\", \"$XDG_MENU_PREFIX\"],\r\n\t[\"environment\", \"$XDG_RUNTIME_DIR\"],\r\n\t[\"environment\", \"$XDG_SEAT\"],\r\n\t[\"environment\", \"$XDG_SEAT_PATH\"],\r\n\t[\"environment\", \"$XDG_SESSION_DESKTOP\"],\r\n\t[\"environment\", \"$XDG_SESSION_ID\"],\r\n\t[\"environment\", \"$XDG_SESSION_PATH\"],\r\n\t[\"environment\", \"$XDG_SESSION_TYPE\"],\r\n\t[\"environment\", \"$XDG_VTNR\"],\r\n\t[\"environment\", \"$XMODIFIERS\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for environment variables.\r\n"
  },
  {
    "path": "tests/languages/bash/for-or-select_feature.test",
    "content": "for var in a b c\r\ndo :; done\r\nselect var in a b c\r\ndo :; done\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"for\"],\r\n\t[\"for-or-select\", \"var\"],\r\n\t[\"keyword\", \"in\"], \" a b c\\r\\n\", [\"keyword\", \"do\"],\r\n\t[\"builtin\", \":\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"done\"],\r\n\t[\"keyword\", \"select\"],\r\n\t[\"for-or-select\", \"var\"],\r\n\t[\"keyword\", \"in\"], \" a b c\\r\\n\", [\"keyword\", \"do\"],\r\n\t[\"builtin\", \":\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"done\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variable names in “for” and “select” loops.\r\n"
  },
  {
    "path": "tests/languages/bash/function-name_feature.test",
    "content": "function foo { :; }\r\nfunction foo-bar { :; }\r\nbar() { :; }\r\nfunction foo() { :; }\r\n# Not a function:\r\nbar { :; }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-name\", \"foo\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"builtin\", \":\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-name\", \"foo-bar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"builtin\", \":\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"function-name\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"builtin\", \":\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-name\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"builtin\", \":\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"comment\", \"# Not a function:\"],\r\n\t\"\\r\\nbar \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"builtin\", \":\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for function definitions.\r\n"
  },
  {
    "path": "tests/languages/bash/function_feature.test",
    "content": "add\napropos\napt\naptitude\napt-cache\napt-get\naspell\nautomysqlbackup\nawk\nbasename\nbash\nbc\nbconsole\nbg\nbzip2\ncal\ncat\ncfdisk\nchgrp\nchkconfig\nchmod\nchown\nchroot\ncksum\nclear\ncmp\ncolumn\ncomm\ncomposer\ncp\ncron\ncrontab\ncsplit\ncurl\ncut\ndate\ndc\ndd\nddrescue\ndebootstrap\ndf\ndiff\ndiff3\ndig\ndir\ndircolors\ndirname\ndirs\ndmesg\ndu\negrep\neject\nenv\nethtool\nexpand\nexpect\nexpr\nfdformat\nfdisk\nfg\nfgrep\nfile\nfind\nfmt\nfold\nformat\nfree\nfsck\nftp\nfuser\ngawk\ngit\ngparted\ngrep\ngroupadd\ngroupdel\ngroupmod\ngroups\ngrub-mkconfig\ngzip\nhalt\nhead\nhg\nhistory\nhost\nhostname\nhtop\niconv\nid\nifconfig\nifdown\nifup\nimport\ninstall\nip\njava\njobs\njoin\nkill\nkillall\nless\nlink\nln\nlocate\nlogname\nlogrotate\nlook\nlpc\nlpr\nlprint\nlprintd\nlprintq\nlprm\nls\nlsof\nlynx\nmake\nman\nmc\nmdadm\nmkconfig\nmkdir\nmke2fs\nmkfifo\nmkfs\nmkisofs\nmknod\nmkswap\nmmv\nmore\nmost\nmount\nmtools\nmtr\nmutt\nmv\nnano\nnc\nnetstat\nnice\nnl\nnohup\nnotify-send\nnpm\nnslookup\nop\nopen\nparted\npasswd\npaste\npathchk\nping\npkill\npnpm\npopd\npr\nprintcap\nprintenv\nps\npushd\npv\nquota\nquotacheck\nquotactl\nram\nrar\nrcp\nreboot\nremsync\nrename\nrenice\nrev\nrm\nrmdir\nrpm\nrsync\nscp\nscreen\nsdiff\nsed\nsendmail\nseq\nservice\nsftp\nsh\nshellcheck\nshuf\nshutdown\nsleep\nslocate\nsort\nsplit\nssh\nstat\nstrace\nsu\nsudo\nsum\nsuspend\nswapon\nsync\nsysctl\ntac\ntail\ntar\ntee\ntime\ntimeout\ntop\ntouch\ntr\ntraceroute\ntsort\ntty\numount\nuname\nunexpand\nuniq\nunits\nunrar\nunshar\nunzip\nupdate-grub\nuptime\nuseradd\nuserdel\nusermod\nusers\nuudecode\nuuencode\nv\nvdir\nvi\nvim\nvirsh\nvmstat\nwait\nwatch\nwc\nwget\nwhereis\nwhich\nwho\nwhoami\nwrite\nxargs\nxdg-open\nyarn\nyes\nzenity\nzip\nzsh\nzypper\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"add\"], [\"function\", \"apropos\"], [\"function\", \"apt\"], [\"function\", \"aptitude\"], \n\t[\"function\", \"apt-cache\"], [\"function\", \"apt-get\"], [\"function\", \"aspell\"], \n\t[\"function\", \"automysqlbackup\"], [\"function\", \"awk\"], [\"function\", \n\t\"basename\"], [\"function\", \"bash\"], [\"function\", \"bc\"], [\"function\", \n\t\"bconsole\"], [\"function\", \"bg\"], [\"function\", \"bzip2\"], [\"function\", \n\t\"cal\"], [\"function\", \"cat\"], [\"function\", \"cfdisk\"], [\"function\", \"chgrp\"], \n\t[\"function\", \"chkconfig\"], [\"function\", \"chmod\"], [\"function\", \"chown\"], \n\t[\"function\", \"chroot\"], [\"function\", \"cksum\"], [\"function\", \"clear\"], \n\t[\"function\", \"cmp\"], [\"function\", \"column\"], [\"function\", \"comm\"], [\"function\", \"composer\"], \n\t[\"function\", \"cp\"], [\"function\", \"cron\"], [\"function\", \"crontab\"], \n\t[\"function\", \"csplit\"], [\"function\", \"curl\"], [\"function\", \"cut\"], \n\t[\"function\", \"date\"], [\"function\", \"dc\"], [\"function\", \"dd\"], [\"function\", \n\t\"ddrescue\"], [\"function\", \"debootstrap\"], [\"function\", \"df\"], [\"function\", \n\t\"diff\"], [\"function\", \"diff3\"], [\"function\", \"dig\"], [\"function\", \"dir\"], \n\t[\"function\", \"dircolors\"], [\"function\", \"dirname\"], [\"function\", \"dirs\"], \n\t[\"function\", \"dmesg\"], [\"function\", \"du\"], [\"function\", \"egrep\"], \n\t[\"function\", \"eject\"], [\"function\", \"env\"], [\"function\", \"ethtool\"], \n\t[\"function\", \"expand\"], [\"function\", \"expect\"], [\"function\", \"expr\"], \n\t[\"function\", \"fdformat\"], [\"function\", \"fdisk\"], [\"function\", \"fg\"], \n\t[\"function\", \"fgrep\"], [\"function\", \"file\"], [\"function\", \"find\"], \n\t[\"function\", \"fmt\"], [\"function\", \"fold\"], [\"function\", \"format\"], \n\t[\"function\", \"free\"], [\"function\", \"fsck\"], [\"function\", \"ftp\"], \n\t[\"function\", \"fuser\"], [\"function\", \"gawk\"], [\"function\", \"git\"], \n\t[\"function\", \"gparted\"], [\"function\", \"grep\"], [\"function\", \"groupadd\"], \n\t[\"function\", \"groupdel\"], [\"function\", \"groupmod\"], [\"function\", \"groups\"], \n\t[\"function\", \"grub-mkconfig\"], [\"function\", \"gzip\"], [\"function\", \"halt\"], \n\t[\"function\", \"head\"], [\"function\", \"hg\"], [\"function\", \"history\"], \n\t[\"function\", \"host\"], [\"function\", \"hostname\"], [\"function\", \"htop\"], \n\t[\"function\", \"iconv\"], [\"function\", \"id\"], [\"function\", \"ifconfig\"], \n\t[\"function\", \"ifdown\"], [\"function\", \"ifup\"], [\"function\", \"import\"], \n\t[\"function\", \"install\"], [\"function\", \"ip\"], [\"function\", \"java\"], [\"function\", \"jobs\"],\n\t[\"function\", \"join\"], [\"function\", \"kill\"], [\"function\", \"killall\"], \n\t[\"function\", \"less\"], [\"function\", \"link\"], [\"function\", \"ln\"], \n\t[\"function\", \"locate\"], [\"function\", \"logname\"], [\"function\", \"logrotate\"], \n\t[\"function\", \"look\"], [\"function\", \"lpc\"], [\"function\", \"lpr\"], \n\t[\"function\", \"lprint\"], [\"function\", \"lprintd\"], [\"function\", \"lprintq\"], \n\t[\"function\", \"lprm\"], [\"function\", \"ls\"], [\"function\", \"lsof\"], \n\t[\"function\", \"lynx\"], [\"function\", \"make\"], [\"function\", \"man\"], \n\t[\"function\", \"mc\"], [\"function\", \"mdadm\"], [\"function\", \"mkconfig\"], \n\t[\"function\", \"mkdir\"], [\"function\", \"mke2fs\"], [\"function\", \"mkfifo\"], \n\t[\"function\", \"mkfs\"], [\"function\", \"mkisofs\"], [\"function\", \"mknod\"], \n\t[\"function\", \"mkswap\"], [\"function\", \"mmv\"], [\"function\", \"more\"], \n\t[\"function\", \"most\"], [\"function\", \"mount\"], [\"function\", \"mtools\"], \n\t[\"function\", \"mtr\"], [\"function\", \"mutt\"], [\"function\", \"mv\"], [\"function\", \n\t\"nano\"], [\"function\", \"nc\"], [\"function\", \"netstat\"], [\"function\", \"nice\"], \n\t[\"function\", \"nl\"], [\"function\", \"nohup\"], [\"function\", \"notify-send\"], \n\t[\"function\", \"npm\"], [\"function\", \"nslookup\"], [\"function\", \"op\"], \n\t[\"function\", \"open\"], [\"function\", \"parted\"], [\"function\", \"passwd\"], \n\t[\"function\", \"paste\"], [\"function\", \"pathchk\"], [\"function\", \"ping\"], \n\t[\"function\", \"pkill\"], [\"function\", \"pnpm\"], [\"function\", \"popd\"], [\"function\", \"pr\"], \n\t[\"function\", \"printcap\"], [\"function\", \"printenv\"], [\"function\", \"ps\"], \n\t[\"function\", \"pushd\"], [\"function\", \"pv\"], [\"function\", \"quota\"], \n\t[\"function\", \"quotacheck\"], [\"function\", \"quotactl\"], [\"function\", \"ram\"], \n\t[\"function\", \"rar\"], [\"function\", \"rcp\"], [\"function\", \"reboot\"], \n\t[\"function\", \"remsync\"], [\"function\", \"rename\"], [\"function\", \"renice\"], \n\t[\"function\", \"rev\"], [\"function\", \"rm\"], [\"function\", \"rmdir\"], \n\t[\"function\", \"rpm\"], [\"function\", \"rsync\"], [\"function\", \"scp\"], \n\t[\"function\", \"screen\"], [\"function\", \"sdiff\"], [\"function\", \"sed\"], \n\t[\"function\", \"sendmail\"], [\"function\", \"seq\"], [\"function\", \"service\"], \n\t[\"function\", \"sftp\"], [\"function\", \"sh\"], [\"function\", \"shellcheck\"], \n\t[\"function\", \"shuf\"], [\"function\", \"shutdown\"], [\"function\", \"sleep\"], \n\t[\"function\", \"slocate\"], [\"function\", \"sort\"], [\"function\", \"split\"], \n\t[\"function\", \"ssh\"], [\"function\", \"stat\"], [\"function\", \"strace\"], \n\t[\"function\", \"su\"], [\"function\", \"sudo\"], [\"function\", \"sum\"], [\"function\", \n\t\"suspend\"], [\"function\", \"swapon\"], [\"function\", \"sync\"], [\"function\", \"sysctl\"], [\"function\",\n\t\"tac\"], [\"function\", \"tail\"], [\"function\", \"tar\"], [\"function\", \"tee\"], \n\t[\"function\", \"time\"], [\"function\", \"timeout\"], [\"function\", \"top\"], \n\t[\"function\", \"touch\"], [\"function\", \"tr\"], [\"function\", \"traceroute\"], \n\t[\"function\", \"tsort\"], [\"function\", \"tty\"], [\"function\", \"umount\"], \n\t[\"function\", \"uname\"], [\"function\", \"unexpand\"], [\"function\", \"uniq\"], \n\t[\"function\", \"units\"], [\"function\", \"unrar\"], [\"function\", \"unshar\"], \n\t[\"function\", \"unzip\"], [\"function\", \"update-grub\"], [\"function\", \"uptime\"], \n\t[\"function\", \"useradd\"], [\"function\", \"userdel\"], [\"function\", \"usermod\"], \n\t[\"function\", \"users\"], [\"function\", \"uudecode\"], [\"function\", \"uuencode\"], \n\t[\"function\", \"v\"], [\"function\", \"vdir\"], [\"function\", \"vi\"], [\"function\", \n\t\"vim\"], [\"function\", \"virsh\"], [\"function\", \"vmstat\"], [\"function\", \n\t\"wait\"], [\"function\", \"watch\"], [\"function\", \"wc\"], [\"function\", \"wget\"], \n\t[\"function\", \"whereis\"], [\"function\", \"which\"], [\"function\", \"who\"], \n\t[\"function\", \"whoami\"], [\"function\", \"write\"], [\"function\", \"xargs\"], \n\t[\"function\", \"xdg-open\"], [\"function\", \"yarn\"], [\"function\", \"yes\"], [\"function\", \"zenity\"], \n\t[\"function\", \"zip\"], [\"function\", \"zsh\"], [\"function\", \"zypper\"]\n]\n\n----------------------------------------------------\n\nChecks for all functions.\n"
  },
  {
    "path": "tests/languages/bash/heredoc_command_feature.test",
    "content": "cat << \"EOF\" > /tmp/output\ndata\nEOF\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"cat\"],\n\t[\"operator\", [\"<<\"]],\n\t[\"string\", [\n\t\t\"\\\"EOF\\\"\",\n\t\t[\"bash\", [\n\t\t\t[\"operator\", [\">\"]],\n\t\t\t\" /tmp/output\"\n\t\t]],\n\t\t\"\\r\\ndata\\r\\nEOF\"\n\t]]\n]\n\n----------------------------------------------------\n\nChecks that commands inside quoted here-documents are tokenized as Bash code.\n"
  },
  {
    "path": "tests/languages/bash/issue2436.test",
    "content": "echo $'module.exports = {\\n  extends: [\\n    // add more generic rulesets here, such as:\\n    // 'eslint:recommended',\\n    \"plugin:vue/vue3-recommended\",\\n    \"prettier\",\\n    \"prettier/vue\",\\n  ],\\n  rules: {\\n    // override/add rules settings here, such as:\\n    // 'vue/no-unused-vars': 'error'\\n  },\\n};' > .eslintrc.js\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"echo\"],\r\n\t[\"string\", [\r\n\t\t\"$'module.exports = {\",\r\n\t\t[\"entity\", \"\\\\n\"],\r\n\t\t\"  extends: [\",\r\n\t\t[\"entity\", \"\\\\n\"],\r\n\t\t\"    // add more generic rulesets here, such as:\",\r\n\t\t[\"entity\", \"\\\\n\"],\r\n\t\t\"    // '\"\r\n\t]],\r\n\t\"eslint:recommended\",\r\n\t[\"string\", \"',\\\\n    \\\"plugin:vue/vue3-recommended\\\",\\\\n    \\\"prettier\\\",\\\\n    \\\"prettier/vue\\\",\\\\n  ],\\\\n  rules: {\\\\n    // override/add rules settings here, such as:\\\\n    // '\"],\r\n\t\"vue/no-unused-vars\",\r\n\t[\"string\", \"': '\"],\r\n\t\"error\",\r\n\t[\"string\", \"'\\\\n  },\\\\n};'\"],\r\n\t[\"operator\", [\">\"]],\r\n\t\" .eslintrc.js\"\r\n]"
  },
  {
    "path": "tests/languages/bash/keyword_feature.test",
    "content": "if\r\nthen\r\nelse\r\nelif\r\nfi\r\nfor x in a\r\nwhile\r\ncase\r\nesac\r\nfunction\r\nselect x in a\r\ndo\r\ndone\r\nuntil\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"elif\"],\r\n\t[\"keyword\", \"fi\"],\r\n\t[\"keyword\", \"for\"], [\"for-or-select\", \"x\"], [\"keyword\", \"in\"], \" a\\r\\n\",\r\n\t[\"keyword\", \"while\"], \r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"esac\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"select\"], [\"for-or-select\", \"x\"], [\"keyword\", \"in\"], \" a\\r\\n\",\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"done\"], \r\n\t[\"keyword\", \"until\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/bash/operator_feature.test",
    "content": "a |& b &> c\r\na >&2\r\na 2<&\r\na <> b\r\na &>> b\r\na && b || c\r\n\r\n<(yes) <(if true; then :; fi) <(echo) <(true)\r\n<(for x in a b; do :; done)\r\n<(select x in a b; do :; done)\r\n>(yes) >(if true; then :; fi) >(echo) >(true)\r\n>(for x in a b; do :; done)\r\n>(select x in a b; do :; done)\r\n\r\n${x:1:2} ${x:-a} ${x:=a} ${x:?a} ${x:+a}\r\n${!x} ${x/a/b}\r\n${x#*a} ${x##*a} ${x%a*} ${x%%a*}\r\n${x^a} ${x^^a} ${x,a} ${x,,a}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"a \", [\"operator\", [\"|&\"]], \" b \", [\"operator\", [\"&>\"]], \" c\\r\\na \",\r\n\t[\"operator\", [\">\"]], [\"file-descriptor\", \"&2\"], \"\\r\\na \",\r\n\t[\"operator\", [\r\n\t\t[\"file-descriptor\", \"2\"], \"<&\"\r\n\t]],\r\n\t\"\\r\\na \", [\"operator\", [\"<>\"]], \" b\\r\\na \",\r\n\t[\"operator\", [\"&>>\"]], \" b\\r\\na \",\r\n\t[\"operator\", [\"&&\"]], \" b \", [\"operator\", [\"||\"]], \" c\\r\\n\\r\\n\",\r\n\t[\"operator\", [\"<\"]], [\"punctuation\", \"(\"], [\"function\", \"yes\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", [\"<\"]], [\"punctuation\", \"(\"], [\"keyword\", \"if\"], [\"boolean\", \"true\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"then\"], [\"builtin\", \":\"], [\"punctuation\", \";\"], [\"keyword\", \"fi\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", [\"<\"]], [\"punctuation\", \"(\"], [\"builtin\", \"echo\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", [\"<\"]], [\"punctuation\", \"(\"], [\"boolean\", \"true\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", [\"<\"]], [\"punctuation\", \"(\"], [\"keyword\", \"for\"], [\"for-or-select\", \"x\"], [\"keyword\", \"in\"], \" a b\", [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"], [\"builtin\", \":\"], [\"punctuation\", \";\"], [\"keyword\", \"done\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", [\"<\"]], [\"punctuation\", \"(\"], [\"keyword\", \"select\"], [\"for-or-select\", \"x\"], [\"keyword\", \"in\"], \" a b\", [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"], [\"builtin\", \":\"], [\"punctuation\", \";\"], [\"keyword\", \"done\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", [\">\"]], [\"punctuation\", \"(\"], [\"function\", \"yes\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", [\">\"]], [\"punctuation\", \"(\"], [\"keyword\", \"if\"], [\"boolean\", \"true\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"then\"], [\"builtin\", \":\"], [\"punctuation\", \";\"], [\"keyword\", \"fi\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", [\">\"]], [\"punctuation\", \"(\"], [\"builtin\", \"echo\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", [\">\"]], [\"punctuation\", \"(\"], [\"boolean\", \"true\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", [\">\"]], [\"punctuation\", \"(\"], [\"keyword\", \"for\"], [\"for-or-select\", \"x\"], [\"keyword\", \"in\"], \" a b\", [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"], [\"builtin\", \":\"], [\"punctuation\", \";\"], [\"keyword\", \"done\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", [\">\"]], [\"punctuation\", \"(\"], [\"keyword\", \"select\"], [\"for-or-select\", \"x\"], [\"keyword\", \"in\"], \" a b\", [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"], [\"builtin\", \":\"], [\"punctuation\", \";\"], [\"keyword\", \"done\"], [\"punctuation\", \")\"],\r\n\t[\"variable\", [\"${x\", [\"operator\", \":\"], \"1\", [\"operator\", \":\"], \"2}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \":-\"], \"a}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \":=\"], \"a}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \":?\"], \"a}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \":+\"], \"a}\"]],\r\n\t[\"variable\", [\"${\", [\"operator\", \"!\"], \"x}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \"/\"], \"a\", [\"operator\", \"/\"], \"b}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \"#\"], \"*a}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \"##\"], \"*a}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \"%\"], \"a*}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \"%%\"], \"a*}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \"^\"], \"a}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \"^^\"], \"a}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \",\"], \"a}\"]],\r\n\t[\"variable\", [\"${x\", [\"operator\", \",,\"], \"a}\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/bash/parameter_feature.test",
    "content": "docker run\n--name elk \\\n-p 5601:5601 \\\n--restart=always \\\n--privileged \\\n-dit \\\neasyj/elk:7.12.1\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"docker\"],\n\t\" run\\r\\n\",\n\n\t[\"parameter\", \"--name\"],\n\t\" elk \",\n\t[\"punctuation\", \"\\\\\"],\n\n\t[\"parameter\", \"-p\"],\n\t[\"number\", \"5601\"],\n\t\":5601 \",\n\t[\"punctuation\", \"\\\\\"],\n\n\t[\"parameter\", \"--restart\"],\n\t[\"operator\", [\"=\"]],\n\t\"always \",\n\t[\"punctuation\", \"\\\\\"],\n\n\t[\"parameter\", \"--privileged\"],\n\t[\"punctuation\", \"\\\\\"],\n\n\t[\"parameter\", \"-dit\"],\n\t[\"punctuation\", \"\\\\\"],\n\n\t\"\\r\\neasyj/elk:7.12.1\"\n]\n\n----------------------------------------------------\n\nChecks for variable assignments.\n"
  },
  {
    "path": "tests/languages/bash/shebang_feature.test",
    "content": "#! /usr/bin/env bash\r\n#/bin/bash\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"shebang\", \"#! /usr/bin/env bash\"],\r\n\t[\"comment\", \"#/bin/bash\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for shebang.\r\n"
  },
  {
    "path": "tests/languages/bash/string_feature.test",
    "content": "\"\"\r\n''\r\n\"foo\"\r\n'foo'\r\n\"foo\r\nbar\"\r\n'foo\r\nbar'\r\n\"'foo'\"\r\n'\"bar\"'\r\n\"$@\"\r\n\"${foo}\"\r\n\\\\\"foo\"\r\n\\'a # ' not a string\r\n\r\n<< STRING_END\r\nfoo\r\nbar\r\nSTRING_END\r\n\r\n<<- STRING_END\r\nfoo\r\nbar\r\nSTRING_END\r\n\r\n<<   EOF\r\nfoo $@\r\nbar\r\nEOF\r\n\r\n<< 'EOF'\r\n'single quoted string'\r\n\"double quoted string\"\r\nEOF\r\n\r\n<< \"EOF\"\r\nfoo\r\n$bar\r\nEOF\r\n\r\n<< STRING_END\r\n# comment\r\nSTRING_END\r\n\r\n\"  # comment  \"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"\\\"\"]],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", [\"\\\"foo\\\"\"]],\r\n\t[\"string\", \"'foo'\"],\r\n\t[\"string\", [\"\\\"foo\\r\\nbar\\\"\"]],\r\n\t[\"string\", \"'foo\\r\\nbar'\"],\r\n\t[\"string\", [\"\\\"'foo'\\\"\"]],\r\n\t[\"string\", \"'\\\"bar\\\"'\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"variable\", \"$@\"],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"variable\", [\"${foo}\"]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \"\\\\\"], [\"punctuation\", \"\\\\\"], [\"string\", [\"\\\"foo\\\"\"]],\r\n\t[\"punctuation\", \"\\\\\"], \"'a \", [\"comment\", \"# ' not a string\"],\r\n\r\n\t[\"operator\", [\"<<\"]], [\"string\", [\"STRING_END\\r\\nfoo\\r\\nbar\\r\\nSTRING_END\"]],\r\n\r\n\t[\"operator\", [\"<<-\"]], [\"string\", [\"STRING_END\\r\\nfoo\\r\\nbar\\r\\nSTRING_END\"]],\r\n\r\n\t[\"operator\", [\"<<\"]],\r\n\t[\"string\", [\r\n\t\t\"EOF\\r\\nfoo \", [\"variable\", \"$@\"],\r\n\t\t\"\\r\\nbar\\r\\nEOF\"\r\n\t]],\r\n\r\n\t[\"operator\", [\"<<\"]],\r\n\t[\"string\", [\"'EOF'\\r\\n'single quoted string'\\r\\n\\\"double quoted string\\\"\\r\\nEOF\"]],\r\n\r\n\t[\"operator\", [\"<<\"]], [\"string\", [\"\\\"EOF\\\"\\r\\nfoo\\r\\n$bar\\r\\nEOF\"]],\r\n\r\n\t[\"operator\", [\"<<\"]], [\"string\", [\"STRING_END\\r\\n# comment\\r\\nSTRING_END\"]],\r\n\r\n\t[\"string\", [\"\\\"  # comment  \\\"\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-quoted and double-quoted strings.\r\nAlso checks for variables in strings.\r\n"
  },
  {
    "path": "tests/languages/bash/variable_feature.test",
    "content": "$foo\r\n$* $@ $# $? $$ $! $0\r\n${foo}\r\n$!!!! $????\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"variable\", \"$*\"],\r\n\t[\"variable\", \"$@\"],\r\n\t[\"variable\", \"$#\"],\r\n\t[\"variable\", \"$?\"],\r\n\t[\"variable\", \"$$\"],\r\n\t[\"variable\", \"$!\"],\r\n\t[\"variable\", \"$0\"],\r\n\t[\"variable\", [\"${foo}\"]],\r\n\t[\"variable\", \"$!\"],\r\n\t[\"operator\", [\"!\"]],\r\n\t[\"operator\", [\"!\"]],\r\n\t[\"operator\", [\"!\"]],\r\n\t[\"variable\", \"$?\"],\r\n\t\"???\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables.\r\n"
  },
  {
    "path": "tests/languages/bash/variable_operator_feature.test",
    "content": "\"$((\n\n+ - * / % ^ & |\n+= -= *= /= %= ^= &= |=\n-- ++ ** && ||\n\n>> >>= << <<=\n\n== != > >= < <=\n= ! ~ ? :\n\n\n\n))\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"variable\", [\n\t\t\t[\"variable\", \"$((\"],\n\n\t\t\t[\"operator\", \"+\"],\n\t\t\t[\"operator\", \"-\"],\n\t\t\t[\"operator\", \"*\"],\n\t\t\t[\"operator\", \"/\"],\n\t\t\t[\"operator\", \"%\"],\n\t\t\t[\"operator\", \"^\"],\n\t\t\t[\"operator\", \"&\"],\n\t\t\t[\"operator\", \"|\"],\n\n\t\t\t[\"operator\", \"+=\"],\n\t\t\t[\"operator\", \"-=\"],\n\t\t\t[\"operator\", \"*=\"],\n\t\t\t[\"operator\", \"/=\"],\n\t\t\t[\"operator\", \"%=\"],\n\t\t\t[\"operator\", \"^=\"],\n\t\t\t[\"operator\", \"&=\"],\n\t\t\t[\"operator\", \"|=\"],\n\n\t\t\t[\"operator\", \"--\"],\n\t\t\t[\"operator\", \"++\"],\n\t\t\t[\"operator\", \"**\"],\n\t\t\t[\"operator\", \"&&\"],\n\t\t\t[\"operator\", \"||\"],\n\n\t\t\t[\"operator\", \">>\"],\n\t\t\t[\"operator\", \">>=\"],\n\t\t\t[\"operator\", \"<<\"],\n\t\t\t[\"operator\", \"<<=\"],\n\n\t\t\t[\"operator\", \"==\"],\n\t\t\t[\"operator\", \"!=\"],\n\t\t\t[\"operator\", \">\"],\n\t\t\t[\"operator\", \">=\"],\n\t\t\t[\"operator\", \"<\"],\n\t\t\t[\"operator\", \"<=\"],\n\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"operator\", \"!\"],\n\t\t\t[\"operator\", \"~\"],\n\t\t\t[\"operator\", \"?\"],\n\t\t\t[\"operator\", \":\"],\n\n\t\t\t[\"variable\", \"))\"]\n\t\t]],\n\t\t\"\\\"\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/basic/comment_feature.test",
    "content": "! Foobar\r\nREM Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", [\"! Foobar\"]],\r\n\t[\"comment\", [[\"keyword\", \"REM\"], \" Foobar\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/basic/function_feature.test",
    "content": "ABS\r\nACCESS\r\nACOS\r\nANGLE\r\nAREA\r\nARITHMETIC\r\nARRAY\r\nASIN\r\nASK\r\nAT\r\nATN\r\nBASE\r\nBEGIN\r\nBREAK\r\nCAUSE\r\nCEIL\r\nCHR\r\nCLIP\r\nCOLLATE\r\nCOLOR\r\nCON\r\nCOS\r\nCOSH\r\nCOT\r\nCSC\r\nDATE\r\nDATUM\r\nDEBUG\r\nDECIMAL\r\nDEF\r\nDEG\r\nDEGREES\r\nDELETE\r\nDET\r\nDEVICE\r\nDISPLAY\r\nDOT\r\nELAPSED\r\nEPS\r\nERASABLE\r\nEXLINE\r\nEXP\r\nEXTERNAL\r\nEXTYPE\r\nFILETYPE\r\nFIXED\r\nFP\r\nGO\r\nGRAPH\r\nHANDLER\r\nIDN\r\nIMAGE\r\nIN\r\nINT\r\nINTERNAL\r\nIP\r\nIS\r\nKEYED\r\nLBOUND\r\nLCASE\r\nLEFT\r\nLEN\r\nLENGTH\r\nLET\r\nLINE\r\nLINES\r\nLOG\r\nLOG10\r\nLOG2\r\nLTRIM\r\nMARGIN\r\nMAT\r\nMAX\r\nMAXNUM\r\nMID\r\nMIN\r\nMISSING\r\nMOD\r\nNATIVE\r\nNUL\r\nNUMERIC\r\nOF\r\nOPTION\r\nORD\r\nORGANIZATION\r\nOUTIN\r\nOUTPUT\r\nPI\r\nPOINT\r\nPOINTER\r\nPOINTS\r\nPOS\r\nPRINT\r\nPROGRAM\r\nPROMPT\r\nRAD\r\nRADIANS\r\nRANDOMIZE\r\nRECORD\r\nRECSIZE\r\nRECTYPE\r\nRELATIVE\r\nREMAINDER\r\nREPEAT\r\nREST\r\nRETRY\r\nREWRITE\r\nRIGHT\r\nRND\r\nROUND\r\nRTRIM\r\nSAME\r\nSEC\r\nSELECT\r\nSEQUENTIAL\r\nSET\r\nSETTER\r\nSGN\r\nSIN\r\nSINH\r\nSIZE\r\nSKIP\r\nSQR\r\nSTANDARD\r\nSTATUS\r\nSTR\r\nSTREAM\r\nSTYLE\r\nTAB\r\nTAN\r\nTANH\r\nTEMPLATE\r\nTEXT\r\nTHERE\r\nTIME\r\nTIMEOUT\r\nTRACE\r\nTRANSFORM\r\nTRUNCATE\r\nUBOUND\r\nUCASE\r\nUSE\r\nVAL\r\nVARIABLE\r\nVIEWPORT\r\nWHEN\r\nWINDOW\r\nWITH\r\nZER\r\nZONEWIDTH\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"ABS\"],\r\n\t[\"function\", \"ACCESS\"],\r\n\t[\"function\", \"ACOS\"],\r\n\t[\"function\", \"ANGLE\"],\r\n\t[\"function\", \"AREA\"],\r\n\t[\"function\", \"ARITHMETIC\"],\r\n\t[\"function\", \"ARRAY\"],\r\n\t[\"function\", \"ASIN\"],\r\n\t[\"function\", \"ASK\"],\r\n\t[\"function\", \"AT\"],\r\n\t[\"function\", \"ATN\"],\r\n\t[\"function\", \"BASE\"],\r\n\t[\"function\", \"BEGIN\"],\r\n\t[\"function\", \"BREAK\"],\r\n\t[\"function\", \"CAUSE\"],\r\n\t[\"function\", \"CEIL\"],\r\n\t[\"function\", \"CHR\"],\r\n\t[\"function\", \"CLIP\"],\r\n\t[\"function\", \"COLLATE\"],\r\n\t[\"function\", \"COLOR\"],\r\n\t[\"function\", \"CON\"],\r\n\t[\"function\", \"COS\"],\r\n\t[\"function\", \"COSH\"],\r\n\t[\"function\", \"COT\"],\r\n\t[\"function\", \"CSC\"],\r\n\t[\"function\", \"DATE\"],\r\n\t[\"function\", \"DATUM\"],\r\n\t[\"function\", \"DEBUG\"],\r\n\t[\"function\", \"DECIMAL\"],\r\n\t[\"function\", \"DEF\"],\r\n\t[\"function\", \"DEG\"],\r\n\t[\"function\", \"DEGREES\"],\r\n\t[\"function\", \"DELETE\"],\r\n\t[\"function\", \"DET\"],\r\n\t[\"function\", \"DEVICE\"],\r\n\t[\"function\", \"DISPLAY\"],\r\n\t[\"function\", \"DOT\"],\r\n\t[\"function\", \"ELAPSED\"],\r\n\t[\"function\", \"EPS\"],\r\n\t[\"function\", \"ERASABLE\"],\r\n\t[\"function\", \"EXLINE\"],\r\n\t[\"function\", \"EXP\"],\r\n\t[\"function\", \"EXTERNAL\"],\r\n\t[\"function\", \"EXTYPE\"],\r\n\t[\"function\", \"FILETYPE\"],\r\n\t[\"function\", \"FIXED\"],\r\n\t[\"function\", \"FP\"],\r\n\t[\"function\", \"GO\"],\r\n\t[\"function\", \"GRAPH\"],\r\n\t[\"function\", \"HANDLER\"],\r\n\t[\"function\", \"IDN\"],\r\n\t[\"function\", \"IMAGE\"],\r\n\t[\"function\", \"IN\"],\r\n\t[\"function\", \"INT\"],\r\n\t[\"function\", \"INTERNAL\"],\r\n\t[\"function\", \"IP\"],\r\n\t[\"function\", \"IS\"],\r\n\t[\"function\", \"KEYED\"],\r\n\t[\"function\", \"LBOUND\"],\r\n\t[\"function\", \"LCASE\"],\r\n\t[\"function\", \"LEFT\"],\r\n\t[\"function\", \"LEN\"],\r\n\t[\"function\", \"LENGTH\"],\r\n\t[\"function\", \"LET\"],\r\n\t[\"function\", \"LINE\"],\r\n\t[\"function\", \"LINES\"],\r\n\t[\"function\", \"LOG\"],\r\n\t[\"function\", \"LOG10\"],\r\n\t[\"function\", \"LOG2\"],\r\n\t[\"function\", \"LTRIM\"],\r\n\t[\"function\", \"MARGIN\"],\r\n\t[\"function\", \"MAT\"],\r\n\t[\"function\", \"MAX\"],\r\n\t[\"function\", \"MAXNUM\"],\r\n\t[\"function\", \"MID\"],\r\n\t[\"function\", \"MIN\"],\r\n\t[\"function\", \"MISSING\"],\r\n\t[\"function\", \"MOD\"],\r\n\t[\"function\", \"NATIVE\"],\r\n\t[\"function\", \"NUL\"],\r\n\t[\"function\", \"NUMERIC\"],\r\n\t[\"function\", \"OF\"],\r\n\t[\"function\", \"OPTION\"],\r\n\t[\"function\", \"ORD\"],\r\n\t[\"function\", \"ORGANIZATION\"],\r\n\t[\"function\", \"OUTIN\"],\r\n\t[\"function\", \"OUTPUT\"],\r\n\t[\"function\", \"PI\"],\r\n\t[\"function\", \"POINT\"],\r\n\t[\"function\", \"POINTER\"],\r\n\t[\"function\", \"POINTS\"],\r\n\t[\"function\", \"POS\"],\r\n\t[\"function\", \"PRINT\"],\r\n\t[\"function\", \"PROGRAM\"],\r\n\t[\"function\", \"PROMPT\"],\r\n\t[\"function\", \"RAD\"],\r\n\t[\"function\", \"RADIANS\"],\r\n\t[\"function\", \"RANDOMIZE\"],\r\n\t[\"function\", \"RECORD\"],\r\n\t[\"function\", \"RECSIZE\"],\r\n\t[\"function\", \"RECTYPE\"],\r\n\t[\"function\", \"RELATIVE\"],\r\n\t[\"function\", \"REMAINDER\"],\r\n\t[\"function\", \"REPEAT\"],\r\n\t[\"function\", \"REST\"],\r\n\t[\"function\", \"RETRY\"],\r\n\t[\"function\", \"REWRITE\"],\r\n\t[\"function\", \"RIGHT\"],\r\n\t[\"function\", \"RND\"],\r\n\t[\"function\", \"ROUND\"],\r\n\t[\"function\", \"RTRIM\"],\r\n\t[\"function\", \"SAME\"],\r\n\t[\"function\", \"SEC\"],\r\n\t[\"function\", \"SELECT\"],\r\n\t[\"function\", \"SEQUENTIAL\"],\r\n\t[\"function\", \"SET\"],\r\n\t[\"function\", \"SETTER\"],\r\n\t[\"function\", \"SGN\"],\r\n\t[\"function\", \"SIN\"],\r\n\t[\"function\", \"SINH\"],\r\n\t[\"function\", \"SIZE\"],\r\n\t[\"function\", \"SKIP\"],\r\n\t[\"function\", \"SQR\"],\r\n\t[\"function\", \"STANDARD\"],\r\n\t[\"function\", \"STATUS\"],\r\n\t[\"function\", \"STR\"],\r\n\t[\"function\", \"STREAM\"],\r\n\t[\"function\", \"STYLE\"],\r\n\t[\"function\", \"TAB\"],\r\n\t[\"function\", \"TAN\"],\r\n\t[\"function\", \"TANH\"],\r\n\t[\"function\", \"TEMPLATE\"],\r\n\t[\"function\", \"TEXT\"],\r\n\t[\"function\", \"THERE\"],\r\n\t[\"function\", \"TIME\"],\r\n\t[\"function\", \"TIMEOUT\"],\r\n\t[\"function\", \"TRACE\"],\r\n\t[\"function\", \"TRANSFORM\"],\r\n\t[\"function\", \"TRUNCATE\"],\r\n\t[\"function\", \"UBOUND\"],\r\n\t[\"function\", \"UCASE\"],\r\n\t[\"function\", \"USE\"],\r\n\t[\"function\", \"VAL\"],\r\n\t[\"function\", \"VARIABLE\"],\r\n\t[\"function\", \"VIEWPORT\"],\r\n\t[\"function\", \"WHEN\"],\r\n\t[\"function\", \"WINDOW\"],\r\n\t[\"function\", \"WITH\"],\r\n\t[\"function\", \"ZER\"],\r\n\t[\"function\", \"ZONEWIDTH\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/basic/keyword_feature.test",
    "content": "AS\r\nBEEP\r\nBLOAD\r\nBSAVE\r\nCALL\r\nCALL ABSOLUTE\r\nCASE\r\nCHAIN\r\nCHDIR\r\nCLEAR\r\nCLOSE\r\nCLS\r\nCOM\r\nCOMMON\r\nCONST\r\nDATA\r\nDECLARE\r\nDEF FN\r\nDEF SEG\r\nDEFDBL\r\nDEFINT\r\nDEFLNG\r\nDEFSNG\r\nDEFSTR\r\nDIM\r\nDO\r\nDOUBLE\r\nELSE\r\nELSEIF\r\nEND\r\nENVIRON\r\nERASE\r\nERROR\r\nEXIT\r\nFIELD\r\nFILES\r\nFOR\r\nFUNCTION\r\nGET\r\nGOSUB\r\nGOTO\r\nIF\r\nINPUT\r\nINTEGER\r\nIOCTL\r\nKEY\r\nKILL\r\nLINE INPUT\r\nLOCATE\r\nLOCK\r\nLONG\r\nLOOP\r\nLSET\r\nMKDIR\r\nNAME\r\nNEXT\r\nOFF\r\nON\r\nON COM\r\nON ERROR\r\nON KEY\r\nON TIMER\r\nOPEN\r\nOPTION BASE\r\nOUT\r\nPOKE\r\nPUT\r\nREAD\r\nREDIM\r\nREM\r\nRESTORE\r\nRESUME\r\nRETURN\r\nRMDIR\r\nRSET\r\nRUN\r\nSHARED\r\nSINGLE\r\nSELECT CASE\r\nSHELL\r\nSLEEP\r\nSTATIC\r\nSTEP\r\nSTOP\r\nSTRING\r\nSUB\r\nSWAP\r\nSYSTEM\r\nTHEN\r\nTIMER\r\nTO\r\nTROFF\r\nTRON\r\nTYPE\r\nUNLOCK\r\nUNTIL\r\nUSING\r\nVIEW PRINT\r\nWAIT\r\nWEND\r\nWHILE\r\nWRITE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"AS\"],\r\n\t[\"keyword\", \"BEEP\"],\r\n\t[\"keyword\", \"BLOAD\"],\r\n\t[\"keyword\", \"BSAVE\"],\r\n\t[\"keyword\", \"CALL\"],\r\n\t[\"keyword\", \"CALL ABSOLUTE\"],\r\n\t[\"keyword\", \"CASE\"],\r\n\t[\"keyword\", \"CHAIN\"],\r\n\t[\"keyword\", \"CHDIR\"],\r\n\t[\"keyword\", \"CLEAR\"],\r\n\t[\"keyword\", \"CLOSE\"],\r\n\t[\"keyword\", \"CLS\"],\r\n\t[\"keyword\", \"COM\"],\r\n\t[\"keyword\", \"COMMON\"],\r\n\t[\"keyword\", \"CONST\"],\r\n\t[\"keyword\", \"DATA\"],\r\n\t[\"keyword\", \"DECLARE\"],\r\n\t[\"keyword\", \"DEF FN\"],\r\n\t[\"keyword\", \"DEF SEG\"],\r\n\t[\"keyword\", \"DEFDBL\"],\r\n\t[\"keyword\", \"DEFINT\"],\r\n\t[\"keyword\", \"DEFLNG\"],\r\n\t[\"keyword\", \"DEFSNG\"],\r\n\t[\"keyword\", \"DEFSTR\"],\r\n\t[\"keyword\", \"DIM\"],\r\n\t[\"keyword\", \"DO\"],\r\n\t[\"keyword\", \"DOUBLE\"],\r\n\t[\"keyword\", \"ELSE\"],\r\n\t[\"keyword\", \"ELSEIF\"],\r\n\t[\"keyword\", \"END\"],\r\n\t[\"keyword\", \"ENVIRON\"],\r\n\t[\"keyword\", \"ERASE\"],\r\n\t[\"keyword\", \"ERROR\"],\r\n\t[\"keyword\", \"EXIT\"],\r\n\t[\"keyword\", \"FIELD\"],\r\n\t[\"keyword\", \"FILES\"],\r\n\t[\"keyword\", \"FOR\"],\r\n\t[\"keyword\", \"FUNCTION\"],\r\n\t[\"keyword\", \"GET\"],\r\n\t[\"keyword\", \"GOSUB\"],\r\n\t[\"keyword\", \"GOTO\"],\r\n\t[\"keyword\", \"IF\"],\r\n\t[\"keyword\", \"INPUT\"],\r\n\t[\"keyword\", \"INTEGER\"],\r\n\t[\"keyword\", \"IOCTL\"],\r\n\t[\"keyword\", \"KEY\"],\r\n\t[\"keyword\", \"KILL\"],\r\n\t[\"keyword\", \"LINE INPUT\"],\r\n\t[\"keyword\", \"LOCATE\"],\r\n\t[\"keyword\", \"LOCK\"],\r\n\t[\"keyword\", \"LONG\"],\r\n\t[\"keyword\", \"LOOP\"],\r\n\t[\"keyword\", \"LSET\"],\r\n\t[\"keyword\", \"MKDIR\"],\r\n\t[\"keyword\", \"NAME\"],\r\n\t[\"keyword\", \"NEXT\"],\r\n\t[\"keyword\", \"OFF\"],\r\n\t[\"keyword\", \"ON\"],\r\n\t[\"keyword\", \"ON COM\"],\r\n\t[\"keyword\", \"ON ERROR\"],\r\n\t[\"keyword\", \"ON KEY\"],\r\n\t[\"keyword\", \"ON TIMER\"],\r\n\t[\"keyword\", \"OPEN\"],\r\n\t[\"keyword\", \"OPTION BASE\"],\r\n\t[\"keyword\", \"OUT\"],\r\n\t[\"keyword\", \"POKE\"],\r\n\t[\"keyword\", \"PUT\"],\r\n\t[\"keyword\", \"READ\"],\r\n\t[\"keyword\", \"REDIM\"],\r\n\t[\"keyword\", \"REM\"],\r\n\t[\"keyword\", \"RESTORE\"],\r\n\t[\"keyword\", \"RESUME\"],\r\n\t[\"keyword\", \"RETURN\"],\r\n\t[\"keyword\", \"RMDIR\"],\r\n\t[\"keyword\", \"RSET\"],\r\n\t[\"keyword\", \"RUN\"],\r\n\t[\"keyword\", \"SHARED\"],\r\n\t[\"keyword\", \"SINGLE\"],\r\n\t[\"keyword\", \"SELECT CASE\"],\r\n\t[\"keyword\", \"SHELL\"],\r\n\t[\"keyword\", \"SLEEP\"],\r\n\t[\"keyword\", \"STATIC\"],\r\n\t[\"keyword\", \"STEP\"],\r\n\t[\"keyword\", \"STOP\"],\r\n\t[\"keyword\", \"STRING\"],\r\n\t[\"keyword\", \"SUB\"],\r\n\t[\"keyword\", \"SWAP\"],\r\n\t[\"keyword\", \"SYSTEM\"],\r\n\t[\"keyword\", \"THEN\"],\r\n\t[\"keyword\", \"TIMER\"],\r\n\t[\"keyword\", \"TO\"],\r\n\t[\"keyword\", \"TROFF\"],\r\n\t[\"keyword\", \"TRON\"],\r\n\t[\"keyword\", \"TYPE\"],\r\n\t[\"keyword\", \"UNLOCK\"],\r\n\t[\"keyword\", \"UNTIL\"],\r\n\t[\"keyword\", \"USING\"],\r\n\t[\"keyword\", \"VIEW PRINT\"],\r\n\t[\"keyword\", \"WAIT\"],\r\n\t[\"keyword\", \"WEND\"],\r\n\t[\"keyword\", \"WHILE\"],\r\n\t[\"keyword\", \"WRITE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/basic/number_feature.test",
    "content": "42\r\n3.14159\r\n2e8\r\n3.4E-9\r\n0.7E+12\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2e8\"],\r\n\t[\"number\", \"3.4E-9\"],\r\n\t[\"number\", \"0.7E+12\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/basic/operator_feature.test",
    "content": "< <= <>\r\n> >=\r\n+ - * /\r\n^ = &\r\nAND EQV IMP\r\nNOT OR XOR\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<>\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"=\"], [\"operator\", \"&\"],\r\n\t[\"operator\", \"AND\"], [\"operator\", \"EQV\"], [\"operator\", \"IMP\"],\r\n\t[\"operator\", \"NOT\"], [\"operator\", \"OR\"], [\"operator\", \"XOR\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/basic/punctuation_feature.test",
    "content": ", ; : ( )\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/basic/string_feature.test",
    "content": "\"\"\r\n\"fo\"\"obar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\"\\\"obar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/batch/command_feature.test",
    "content": "FOR /l %%a in (5,-1,1) do (TITLE %title% -- closing in %%as)\r\n\r\nFOR /F %%A IN ('TYPE \"%InFile%\"^|find /v /c \"\"')\r\n\r\nSET title=%~n0\r\n\r\necho.Hello World\r\n\r\n@ECHO OFF\r\n\r\nif not defined ProgressFormat set \"ProgressFormat=[PPPP]\"\r\n\r\nEXIT /b\r\n\r\nset /a ProgressCnt+=1\r\n\r\nIF \"%~1\" NEQ \"\" (SET %~1=%new%) ELSE (echo.%new%)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"FOR\"],\r\n\t\t[\"parameter\", [\r\n\t\t\t\"/l\"\r\n\t\t]],\r\n\t\t[\"variable\", \"%%a\"],\r\n\t\t[\"keyword\", \"in\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"5\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"number\", \"-1\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"keyword\", \"do\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"TITLE\"],\r\n\t\t[\"variable\", \"%title%\"],\r\n\t\t\" -- closing in \",\r\n\t\t[\"variable\", \"%%as\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"FOR\"],\r\n\t\t[\"parameter\", [\r\n\t\t\t\"/F\"\r\n\t\t]],\r\n\t\t[\"variable\", \"%%A\"],\r\n\t\t\" IN ('TYPE \",\r\n\t\t[\"string\", \"\\\"%InFile%\\\"\"],\r\n\t\t[\"operator\", \"^\"],\r\n\t\t\"|find \",\r\n\t\t[\"parameter\", [\r\n\t\t\t\"/v\"\r\n\t\t]],\r\n\t\t[\"parameter\", [\r\n\t\t\t\"/c\"\r\n\t\t]],\r\n\t\t[\"string\", \"\\\"\\\"\"],\r\n\t\t\"'\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"SET\"],\r\n\t\t[\"variable\", \"title\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"variable\", \"%~n0\"]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"echo\"],\r\n\t\t\".Hello World\"\r\n\t]],\r\n\r\n\t[\"operator\", \"@\"],\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"ECHO\"],\r\n\t\t\" OFF\"\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"keyword\", \"not\"],\r\n\t\t[\"keyword\", \"defined\"],\r\n\t\t\" ProgressFormat\"\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"set\"],\r\n\t\t[\"string\", \"\\\"ProgressFormat=[PPPP]\\\"\"]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"EXIT\"],\r\n\t\t[\"parameter\", [\r\n\t\t\t\"/b\"\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"set\"],\r\n\t\t[\"parameter\", [\r\n\t\t\t\"/a\"\r\n\t\t]],\r\n\t\t[\"variable\", \"ProgressCnt\"],\r\n\t\t[\"operator\", \"+=\"],\r\n\t\t[\"number\", \"1\"]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"IF\"],\r\n\t\t[\"string\", \"\\\"%~1\\\"\"],\r\n\t\t[\"operator\", \"NEQ\"],\r\n\t\t[\"string\", \"\\\"\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"SET\"],\r\n\t\t[\"variable\", \"%~1\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"variable\", \"%new%\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"ELSE\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"echo\"],\r\n\t\t\".\",\r\n\t\t[\"variable\", \"%new%\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for commands.\r\n"
  },
  {
    "path": "tests/languages/batch/comment_feature.test",
    "content": "::\r\n:: Foobar\r\nREM Foobar\r\nrem foo^\r\nbar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"::\"],\r\n\t[\"comment\", \":: Foobar\"],\r\n\t[\"comment\", \"REM Foobar\"],\r\n\t[\"comment\", \"rem foo^\\r\\nbar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/batch/label_feature.test",
    "content": ":foo\r\n:Foo_Bar\r\nGOTO:eof\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"label\", \":foo\"],\r\n\t[\"label\", \":Foo_Bar\"],\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"GOTO\"],\r\n\t\t[\"label\", \":eof\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for labels.\r\n"
  },
  {
    "path": "tests/languages/batch/string_feature.test",
    "content": "cmd \"\"\r\ncmd \"f\\\"oo\"\r\ncmd \"f\\\\\"oo\"\r\ncmd \"print(\"\"hello\"\")\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"cmd\"],\r\n\t\t[\"string\", \"\\\"\\\"\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"cmd\"],\r\n\t\t[\"string\", \"\\\"f\\\\\\\"oo\\\"\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"cmd\"],\r\n\t\t[\"string\", \"\\\"f\\\\\\\\\\\"oo\\\"\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"keyword\", \"cmd\"],\r\n\t\t[\"string\", \"\\\"print(\\\"\\\"hello\\\"\\\")\\\"\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/bbcode/tag_feature.test",
    "content": "[list]\n  [*]Entry A\n  [*]Entry B\n[/list]\n\n[list=1]\n  [*]Entry 1\n  [*]Entry 2\n[/list]\n\n[style color=\"fuchsia\"]Text in fuchsia[/style] or\n[style color=#FF00FF]Text in fuchsia[/style] or\n[color=#FF00FF]Text in fuchsia[/color]\n[quote]quoted text[/quote]\n[quote=\"author\"]quoted text[/quote]\n\n[:-)]\n\n[url]https://en.wikipedia.org[/url]\n[url=https://en.wikipedia.org]English Wikipedia[/url]\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"list\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"*\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"Entry A\\r\\n  \",\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"*\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"Entry B\\r\\n\",\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[/\"],\n\t\t\t\"list\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"list\"\n\t\t]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\"1\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"*\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"Entry 1\\r\\n  \",\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"*\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"Entry 2\\r\\n\",\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[/\"],\n\t\t\t\"list\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"style\"\n\t\t]],\n\t\t[\"attr-name\", \"color\"],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\"fuchsia\",\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"Text in fuchsia\",\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[/\"],\n\t\t\t\"style\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\" or\\r\\n\",\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"style\"\n\t\t]],\n\t\t[\"attr-name\", \"color\"],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\"#FF00FF\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"Text in fuchsia\",\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[/\"],\n\t\t\t\"style\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\" or\\r\\n\",\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"color\"\n\t\t]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\"#FF00FF\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"Text in fuchsia\",\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[/\"],\n\t\t\t\"color\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"quote\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"quoted text\",\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[/\"],\n\t\t\t\"quote\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"quote\"\n\t\t]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\"author\",\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"quoted text\",\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[/\"],\n\t\t\t\"quote\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\":-)\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"url\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"https://en.wikipedia.org\",\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[/\"],\n\t\t\t\"url\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"url\"\n\t\t]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\"https://en.wikipedia.org\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\"English Wikipedia\",\n\t[\"tag\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"[/\"],\n\t\t\t\"url\"\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for tags.\n"
  },
  {
    "path": "tests/languages/bbj/boolean_feature.test",
    "content": "BBjAPI.FALSE\nBBjAPI.TRUE\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"BBjAPI.FALSE\"],\n\t[\"boolean\", \"BBjAPI.TRUE\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans.\n"
  },
  {
    "path": "tests/languages/bbj/comment_feature.test",
    "content": "rem Single line comment\n\nrem /**\nrem  * This file is part of the X plugin.\nrem  *\nrem  * For the full copyright and license information, please view the LICENSE\nrem  * file that was distributed with this source code.\nrem  */\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"rem Single line comment\"],\n\n\t[\"comment\", \"rem /**\"],\n\t[\"comment\", \"rem  * This file is part of the X plugin.\"],\n\t[\"comment\", \"rem  *\"],\n\t[\"comment\", \"rem  * For the full copyright and license information, please view the LICENSE\"],\n\t[\"comment\", \"rem  * file that was distributed with this source code.\"],\n\t[\"comment\", \"rem  */\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/bbj/keyword_feature.test",
    "content": "abstract all argc begin bye callback case chn class classend ctl day delete dim dom \ndread dsz else end endif err exitto extends fi field for from gosub goto if implements \ninterface interfaceend iol iolist let list load method methodend methodret on opts pfx \nprint private process_events protected psz public read read_resource release remove_callback \nrepeat restore return rev seterr setesc sqlchn sqlunt ssn start static swend switch sys then \ntim unt until use void wend where while declare\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"abstract\"],\n\t[\"keyword\", \"all\"],\n\t[\"keyword\", \"argc\"],\n\t[\"keyword\", \"begin\"],\n\t[\"keyword\", \"bye\"],\n\t[\"keyword\", \"callback\"],\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"chn\"],\n\t[\"keyword\", \"class\"],\n\t[\"keyword\", \"classend\"],\n\t[\"keyword\", \"ctl\"],\n\t[\"keyword\", \"day\"],\n\t[\"keyword\", \"delete\"],\n\t[\"keyword\", \"dim\"],\n\t[\"keyword\", \"dom\"],\n\n\t[\"keyword\", \"dread\"],\n\t[\"keyword\", \"dsz\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"end\"],\n\t[\"keyword\", \"endif\"],\n\t[\"keyword\", \"err\"],\n\t[\"keyword\", \"exitto\"],\n\t[\"keyword\", \"extends\"],\n\t[\"keyword\", \"fi\"],\n\t[\"keyword\", \"field\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"from\"],\n\t[\"keyword\", \"gosub\"],\n\t[\"keyword\", \"goto\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"implements\"],\n\n\t[\"keyword\", \"interface\"],\n\t[\"keyword\", \"interfaceend\"],\n\t[\"keyword\", \"iol\"],\n\t[\"keyword\", \"iolist\"],\n\t[\"keyword\", \"let\"],\n\t[\"keyword\", \"list\"],\n\t[\"keyword\", \"load\"],\n\t[\"keyword\", \"method\"],\n\t[\"keyword\", \"methodend\"],\n\t[\"keyword\", \"methodret\"],\n\t[\"keyword\", \"on\"],\n\t[\"keyword\", \"opts\"],\n\t[\"keyword\", \"pfx\"],\n\n\t[\"keyword\", \"print\"],\n\t[\"keyword\", \"private\"],\n\t[\"keyword\", \"process_events\"],\n\t[\"keyword\", \"protected\"],\n\t[\"keyword\", \"psz\"],\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"read\"],\n\t[\"keyword\", \"read_resource\"],\n\t[\"keyword\", \"release\"],\n\t[\"keyword\", \"remove_callback\"],\n\n\t[\"keyword\", \"repeat\"],\n\t[\"keyword\", \"restore\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"rev\"],\n\t[\"keyword\", \"seterr\"],\n\t[\"keyword\", \"setesc\"],\n\t[\"keyword\", \"sqlchn\"],\n\t[\"keyword\", \"sqlunt\"],\n\t[\"keyword\", \"ssn\"],\n\t[\"keyword\", \"start\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"swend\"],\n\t[\"keyword\", \"switch\"],\n\t[\"keyword\", \"sys\"],\n\t[\"keyword\", \"then\"],\n\n\t[\"keyword\", \"tim\"],\n\t[\"keyword\", \"unt\"],\n\t[\"keyword\", \"until\"],\n\t[\"keyword\", \"use\"],\n\t[\"keyword\", \"void\"],\n\t[\"keyword\", \"wend\"],\n\t[\"keyword\", \"where\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"declare\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/bbj/number_feature.test",
    "content": "42\n3.14159\n2e8\n3.4E-9\n0.7E+12\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"42\"],\n\t[\"number\", \"3.14159\"],\n\t[\"number\", \"2e8\"],\n\t[\"number\", \"3.4E-9\"],\n\t[\"number\", \"0.7E+12\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers."
  },
  {
    "path": "tests/languages/bbj/operator_feature.test",
    "content": "or xor not and > >= < <= + =*\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"or\"],\n\t[\"operator\", \"xor\"],\n\t[\"operator\", \"not\"],\n\t[\"operator\", \"and\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"*\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/bbj/punctuation_feature.test",
    "content": ", ; : ( ) .\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \".\"]\n]\n"
  },
  {
    "path": "tests/languages/bbj/string_feature.test",
    "content": "\"\"\n''\n\"f\\\"oo\"\n'b\\'ar'\n\n\"foo rem comment bar\"\n\"foo \"\"rem\"\" comment bar\"\n\"foo rem /* *rem comment bar\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"''\"],\n\t[\"string\", \"\\\"f\\\\\\\"oo\\\"\"],\n\t[\"string\", \"'b\\\\'ar'\"],\n\n\t[\"string\", \"\\\"foo rem comment bar\\\"\"],\n\t[\"string\", \"\\\"foo \\\"\"],\n\t[\"string\", \"\\\"rem\\\"\"],\n\t[\"string\", \"\\\" comment bar\\\"\"],\n\t[\"string\", \"\\\"foo rem /* *rem comment bar\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/bicep/boolean_feature.test",
    "content": "true\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans."
  },
  {
    "path": "tests/languages/bicep/comment_feature.test",
    "content": "// this is a comment\n\n/* this\nis a\nmulti line comment */\n\n/* so is\nthis */\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// this is a comment\"],\n\n\t[\"comment\", \"/* this\\r\\nis a\\r\\nmulti line comment */\"],\n\n\t[\"comment\", \"/* so is\\r\\nthis */\"]\n]\n"
  },
  {
    "path": "tests/languages/bicep/datatype_feature.test",
    "content": "param myString string\nparam myInt int\nparam myBool bool\nparam myObject object\nparam myArray array\n\noutput myHardcodedOutput int = 42\noutput myLoopyOutput array = [for myItem in myArray: {\n  myProperty: myItem.myOtherProperty\n}]\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"param\"], \" myString \", [\"datatype\", \"string\"],\n\t[\"keyword\", \"param\"], \" myInt \", [\"datatype\", \"int\"],\n\t[\"keyword\", \"param\"], \" myBool \", [\"datatype\", \"bool\"],\n\t[\"keyword\", \"param\"], \" myObject \", [\"datatype\", \"object\"],\n\t[\"keyword\", \"param\"], \" myArray \", [\"datatype\", \"array\"],\n\n\t[\"keyword\", \"output\"],\n\t\" myHardcodedOutput \",\n\t[\"datatype\", \"int\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"42\"],\n\n\t[\"keyword\", \"output\"],\n\t\" myLoopyOutput \",\n\t[\"datatype\", \"array\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"[\"],\n\t[\"keyword\", \"for\"],\n\t\" myItem \",\n\t[\"keyword\", \"in\"],\n\t\" myArray\",\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"property\", \"myProperty\"],\n\t[\"operator\", \":\"],\n\t\" myItem\",\n\t[\"punctuation\", \".\"],\n\t\"myOtherProperty\\r\\n\",\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"]\"]\n]\n"
  },
  {
    "path": "tests/languages/bicep/decorator_feature.test",
    "content": "@secure()\nparam demoPassword string\n@allowed([\n  'one'\n  'two'\n])\nparam demoEnum string\n\n@minLength(3)\n@maxLength(24)\n@description('Name of the storage account')\nparam storageAccountName string = concat(uniqueString(resourceGroup().id), 'sa')\n\n----------------------------------------------------\n\n[\n\t[\"decorator\", \"@secure\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\t[\"keyword\", \"param\"], \" demoPassword \", [\"datatype\", \"string\"],\n\t[\"decorator\", \"@allowed\"], [\"punctuation\", \"(\"], [\"punctuation\", \"[\"],\n\t[\"string\", \"'one'\"],\n\t[\"string\", \"'two'\"],\n\t[\"punctuation\", \"]\"], [\"punctuation\", \")\"],\n\t[\"keyword\", \"param\"], \" demoEnum \", [\"datatype\", \"string\"],\n\n\t[\"decorator\", \"@minLength\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"3\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"decorator\", \"@maxLength\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"24\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"decorator\", \"@description\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"'Name of the storage account'\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"param\"],\n\t\" storageAccountName \",\n\t[\"datatype\", \"string\"],\n\t[\"operator\", \"=\"],\n\t[\"function\", \"concat\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"uniqueString\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"resourceGroup\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \".\"],\n\t\"id\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"'sa'\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for functions. Also checks for unicode characters in identifiers.\n"
  },
  {
    "path": "tests/languages/bicep/function_feature.test",
    "content": "param location string = resourceGroup().location\nvar hostingPlanName = 'hostingplan${uniqueString(resourceGroup().id)}'\n\narray(parameters('stringToConvert'))\ncreateArray(1, 2, 3)\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"param\"],\n\t\" location \",\n\t[\"datatype\", \"string\"],\n\t[\"operator\", \"=\"],\n\t[\"function\", \"resourceGroup\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \".\"],\n\t\"location\\r\\n\",\n\n\t[\"keyword\", \"var\"],\n\t\" hostingPlanName \",\n\t[\"operator\", \"=\"],\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"'hostingplan\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"${\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"function\", \"uniqueString\"],\n\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t[\"function\", \"resourceGroup\"],\n\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t[\"punctuation\", \")\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"id\",\n\t\t\t\t[\"punctuation\", \")\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"'\"]\n\t]],\n\n\t[\"function\", \"array\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"parameters\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"'stringToConvert'\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"function\", \"createArray\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"3\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for functions. Based upon https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions-array\n"
  },
  {
    "path": "tests/languages/bicep/keyword_feature.test",
    "content": "targetScope\nresource appServicePlan 'Microsoft.Web/serverfarms@2020-09-01' existing =  = if (diagnosticsEnabled) {\n  name: logAnalyticsWsName\n}\nmodule cosmosDb './cosmosdb.bicep' = {\n  name: 'cosmosDbDeploy'\n}\nparam env string\nvar oneNumber = 123\noutput databaseName string = cosmosdbDatabaseName\nfor item in cosmosdbAllowedIpAddresses: {\n\tipAddressOrRange: item\n}\nif\nnull\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"targetScope\"],\n\n\t[\"keyword\", \"resource\"],\n\t\" appServicePlan \",\n\t[\"string\", \"'Microsoft.Web/serverfarms@2020-09-01'\"],\n\t[\"keyword\", \"existing\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"if\"],\n\t[\"punctuation\", \"(\"],\n\t\"diagnosticsEnabled\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"property\", \"name\"],\n\t[\"operator\", \":\"],\n\t\" logAnalyticsWsName\\r\\n\",\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"module\"],\n\t\" cosmosDb \",\n\t[\"string\", \"'./cosmosdb.bicep'\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"property\", \"name\"],\n\t[\"operator\", \":\"],\n\t[\"string\", \"'cosmosDbDeploy'\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"param\"],\n\t\" env \",\n\t[\"datatype\", \"string\"],\n\n\t[\"keyword\", \"var\"],\n\t\" oneNumber \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"123\"],\n\n\t[\"keyword\", \"output\"],\n\t\" databaseName \",\n\t[\"datatype\", \"string\"],\n\t[\"operator\", \"=\"],\n\t\" cosmosdbDatabaseName\\r\\n\",\n\n\t[\"keyword\", \"for\"],\n\t\" item \",\n\t[\"keyword\", \"in\"],\n\t\" cosmosdbAllowedIpAddresses\",\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"property\", \"ipAddressOrRange\"],\n\t[\"operator\", \":\"],\n\t\" item\\r\\n\",\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"if\"],\n\n\t[\"keyword\", \"null\"]\n]\n\n----------------------------------------------------\n\nChecks for all keywords.\n"
  },
  {
    "path": "tests/languages/bicep/number_feature.test",
    "content": "42\n3.14159\n4e10\n3.2E+6\n2.1e-10\n0b1101\n0o571\n0xbabe\n0xBABE\n\nNaN\nInfinity\n\n123n\n0x123n\n\n1_000_000_000_000\n1_000_000.220_720\n0b0101_0110_0011_1000\n0o12_34_56\n0x40_76_38_6A_73\n4_642_473_943_484_686_707n\n0.000_001\n1e10_000\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"42\"],\n\t[\"number\", \"3.14159\"],\n\t[\"number\", \"4e10\"],\n\t[\"number\", \"3.2E+6\"],\n\t[\"number\", \"2.1e-10\"],\n\t[\"number\", \"0\"], \"b1101\\r\\n\",\n\t[\"number\", \"0\"], \"o571\\r\\n\",\n\t[\"number\", \"0\"], \"xbabe\\r\\n\",\n\t[\"number\", \"0\"], \"xBABE\\r\\n\\r\\nNaN\\r\\nInfinity\\r\\n\\r\\n\",\n\n\t[\"number\", \"123\"], \"n\\r\\n\",\n\t[\"number\", \"0\"], \"x123n\\r\\n\\r\\n\",\n\n\t[\"number\", \"1\"],\n\t\"_000_000_000_000\\r\\n\",\n\n\t[\"number\", \"1\"],\n\t\"_000_000\",\n\t[\"punctuation\", \".\"],\n\t[\"number\", \"220\"],\n\t\"_720\\r\\n\",\n\n\t[\"number\", \"0\"],\n\t\"b0101_0110_0011_1000\\r\\n\",\n\n\t[\"number\", \"0\"],\n\t\"o12_34_56\\r\\n\",\n\n\t[\"number\", \"0\"],\n\t\"x40_76_38_6A_73\\r\\n\",\n\n\t[\"number\", \"4\"],\n\t\"_642_473_943_484_686_707n\\r\\n\",\n\n\t[\"number\", \"0.000\"],\n\t\"_001\\r\\n\",\n\n\t[\"number\", \"1e10\"],\n\t\"_000\"\n]\n\n----------------------------------------------------\n\nChecks for decimal numbers, binary numbers, octal numbers, hexadecimal numbers.\nAlso checks for keywords representing numbers.\n"
  },
  {
    "path": "tests/languages/bicep/operator_feature.test",
    "content": "- -- -=\n+ ++ +=\n< <= << <<=\n> >= >> >>= >>> >>>=\n= == === =>\n! != !==\n& && &= &&=\n| || |= ||=\n* ** *= **=\n/ /= ~\n^ ^= % %=\n? : ...\n?? ?. ??=\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"-=\"],\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"+=\"],\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<<\"], [\"operator\", \"<<=\"],\n\t[\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \">>\"], [\"operator\", \">>=\"], [\"operator\", \">>>\"], [\"operator\", \">>>=\"],\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"===\"], [\"operator\", \"=>\"],\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"], [\"operator\", \"!==\"],\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"&=\"], [\"operator\", \"&&=\"],\n\t[\"operator\", \"|\"], [\"operator\", \"||\"], [\"operator\", \"|=\"], [\"operator\", \"||=\"],\n\t[\"operator\", \"*\"], [\"operator\", \"**\"], [\"operator\", \"*=\"], [\"operator\", \"**=\"],\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"], [\"operator\", \"~\"],\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"], [\"operator\", \"%\"], [\"operator\", \"%=\"],\n\t[\"operator\", \"?\"], [\"operator\", \":\"], [\"operator\", \"...\"],\n\t[\"operator\", \"??\"], [\"operator\", \"?.\"], [\"operator\", \"??=\"]\n]\n\n----------------------------------------------------\n\nChecks for all operators.\n"
  },
  {
    "path": "tests/languages/bicep/property_feature.test",
    "content": "var myObjWithSpecialChars = {\n  '$special\\tchars!': true\n  normalKey: 'val'\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"var\"],\n\t\" myObjWithSpecialChars \",\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"property\", \"'$special\\\\tchars!'\"],\n\t[\"operator\", \":\"],\n\t[\"boolean\", \"true\"],\n\n\t[\"property\", \"normalKey\"],\n\t[\"operator\", \":\"],\n\t[\"string\", \"'val'\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/bicep/string_feature.test",
    "content": "''\n'hello!'\n'what\\'s up?'\n'steve'\n'hello ${name}!'\n'😁\\u{1F642}'\n'Microsoft.Web/sites/config@2020-12-01'\n'https://${frontDoorName}.azurefd.net/.auth/login/aad/callback'\n\n'''hello!'''\nvar myVar2 = '''\nhello!'''\n'''\nhello!\n'''\n'''\n  this\n    is\n      indented\n'''\n\n'''\ncomments // are included\n/* because everything is read as-is */\n'''\n\n'''interpolation\nis ${blocked}'''\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"''\"],\n\t[\"string\", \"'hello!'\"],\n\t[\"string\", \"'what\\\\'s up?'\"],\n\t[\"string\", \"'steve'\"],\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"'hello \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"${\"],\n\t\t\t[\"expression\", [\"name\"]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"!'\"]\n\t]],\n\t[\"string\", \"'😁\\\\u{1F642}'\"],\n\t[\"string\", \"'Microsoft.Web/sites/config@2020-12-01'\"],\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"'https://\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"${\"],\n\t\t\t[\"expression\", [\"frontDoorName\"]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \".azurefd.net/.auth/login/aad/callback'\"]\n\t]],\n\n\t[\"string\", \"'''hello!'''\"],\n\t[\"keyword\", \"var\"],\n\t\" myVar2 \",\n\t[\"operator\", \"=\"],\n\t[\"string\", \"'''\\r\\nhello!'''\"],\n\t[\"string\", \"'''\\r\\nhello!\\r\\n'''\"],\n\t[\"string\", \"'''\\r\\n  this\\r\\n    is\\r\\n      indented\\r\\n'''\"],\n\n\t[\"string\", \"'''\\r\\ncomments // are included\\r\\n/* because everything is read as-is */\\r\\n'''\"],\n\n\t[\"string\", \"'''interpolation\\r\\nis ${blocked}'''\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/bicep/var_feature.test",
    "content": "var oneString = 'abc'\nvar oneNumber = 123\nvar numbers = [\n  123\n]\nvar oneObject = {\n\tabc: 123\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"var\"], \" oneString \", [\"operator\", \"=\"], [\"string\", \"'abc'\"],\n\t[\"keyword\", \"var\"], \" oneNumber \", [\"operator\", \"=\"], [\"number\", \"123\"],\n\t[\"keyword\", \"var\"], \" numbers \", [\"operator\", \"=\"], [\"punctuation\", \"[\"],\n\t[\"number\", \"123\"],\n\t[\"punctuation\", \"]\"],\n\t[\"keyword\", \"var\"], \" oneObject \", [\"operator\", \"=\"], [\"punctuation\", \"{\"],\n\t[\"property\", \"abc\"], [\"operator\", \":\"], [\"number\", \"123\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for vars.\n"
  },
  {
    "path": "tests/languages/birb/class-name_feature.test",
    "content": "class Birb {\n\tString name = \"Birb\";\n\tint age = 5;\n\tbool isMale = true;\n\n\tString getName() {\n\t\treturn name;\n\t}\n}\n\nList list = [\"Seeb\", 10, false];\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"Birb\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"class-name\", \"String\"],\n\t[\"variable\", \"name\"],\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"Birb\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", \"int\"],\n\t[\"variable\", \"age\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"5\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", \"bool\"],\n\t[\"variable\", \"isMale\"],\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", \"String\"],\n\t[\"function\", \"getName\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"class-name\", \"return\"],\n\t[\"variable\", \"name\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"class-name\", \"List\"],\n\t[\"variable\", \"list\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"[\"],\n\t[\"string\", \"\\\"Seeb\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"10\"],\n\t[\"punctuation\", \",\"],\n\t[\"boolean\", \"false\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/birb/function_feature.test",
    "content": "void foo(int a) {}\r\nfoo(0);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"void\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", \"int\"],\r\n\t[\"variable\", \"a\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/birb/keyword_feature.test",
    "content": "assert;\r\nbreak;\r\ncase;\r\nclass;\r\nconst;\r\ndefault;\r\nelse;\r\nenum;\r\nfinal;\r\nfollows;\r\nfor;\r\ngrab;\r\nif;\r\nnest;\r\nnext;\r\nnew;\r\nnoSeeb;\r\nreturn;\r\nstatic;\r\nswitch;\r\nthrow;\r\nvar;\r\nvoid;\r\nwhile;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"assert\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"case\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"default\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"final\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"follows\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"grab\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"nest\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"next\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"noSeeb\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"throw\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"var\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"void\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/birb/metadata_feature.test",
    "content": "<Supersede>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"metadata\", \"<Supersede>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for metadata."
  },
  {
    "path": "tests/languages/birb/operator_feature.test",
    "content": "++ --\r\n* / % ~/\r\n+ - ! ~\r\n<< >> ? :\r\n& ^ |\r\n>= > <= <\r\n== != && ||\r\n= *= /=\r\n%= += -=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"++\"], [\"operator\", \"--\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"%\"], [\"operator\", \"~/\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"!\"], [\"operator\", \"~\"],\r\n\t[\"operator\", \"<<\"], [\"operator\", \">>\"], [\"operator\", \"?\"], [\"operator\", \":\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"^\"], [\"operator\", \"|\"],\r\n\t[\"operator\", \">=\"], [\"operator\", \">\"], [\"operator\", \"<=\"], [\"operator\", \"<\"],\r\n\t[\"operator\", \"==\"], [\"operator\", \"!=\"], [\"operator\", \"&&\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"*=\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"], [\"operator\", \"+=\"], [\"operator\", \"-=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/birb/string_feature.test",
    "content": "\"\" ''\r\nr\"\" r''\r\n\"fo\\\"o\" 'fo\\'o'\r\n'foo\r\nbar'\r\n\"foo\r\nbar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"], [\"string\", \"''\"],\r\n\t[\"string\", \"r\\\"\\\"\"], [\"string\", \"r''\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"], [\"string\", \"'fo\\\\'o'\"],\r\n\t[\"string\", \"'foo\\r\\nbar'\"],\r\n\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single quoted, double quoted, and multiline strings"
  },
  {
    "path": "tests/languages/bison/c_feature.test",
    "content": "%{\r\n\t#include <stdio.h>\r\n%}\r\n%code {\r\n\tif(foo) {\r\n\r\n\t}\r\n}\r\n%%\r\nexp:\r\n\tNUM {\r\n\t\t$$ = f($3, $4);\r\n\t\t@$.first_column = @1.first_column;\r\n\t\t$result = $left + $<itype>1;\r\n\t}\r\n%%\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"bison\", [\r\n\t\t[\"c\", [\r\n\t\t\t[\"delimiter\", \"%{\"],\r\n\t\t\t[\"macro\", [\r\n\t\t\t\t[\"directive-hash\", \"#\"],\r\n\t\t\t\t[\"directive\", \"include\"],\r\n\t\t\t\t[\"string\", \"<stdio.h>\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"%}\"]\r\n\t\t]],\r\n\t\t[\"keyword\", \"%code\"],\r\n\t\t[\"c\", [\r\n\t\t\t[\"delimiter\", \"{\"],\r\n\t\t\t[\"keyword\", \"if\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"%%\"],\r\n\t\t[\"property\", \"exp\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"\\r\\n\\tNUM \",\r\n\t\t[\"c\", [\r\n\t\t\t[\"delimiter\", \"{\"],\r\n\t\t\t[\"bison-variable\", [\r\n\t\t\t\t\"$$\"\r\n\t\t\t]],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"function\", \"f\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"bison-variable\", [\r\n\t\t\t\t\"$3\"\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"bison-variable\", [\r\n\t\t\t\t\"$4\"\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"bison-variable\", [\r\n\t\t\t\t\"@$\"\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"first_column \",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"bison-variable\", [\r\n\t\t\t\t\"@1\"\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"first_column\",\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"bison-variable\", [\r\n\t\t\t\t\"$result\"\r\n\t\t\t]],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"bison-variable\", [\r\n\t\t\t\t\"$left\"\r\n\t\t\t]],\r\n\t\t\t[\"operator\", \"+\"],\r\n\t\t\t[\"bison-variable\", [\r\n\t\t\t\t\"$\",\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t\"itype\",\r\n\t\t\t\t[\"punctuation\", \">\"],\r\n\t\t\t\t\"1\"\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"%%\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for C inside Bison, along with special Bison variables.\r\n"
  },
  {
    "path": "tests/languages/bison/char_feature.test",
    "content": "'+'\n'\\''\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'+'\"],\n\t[\"char\", \"'\\\\''\"]\n]\n"
  },
  {
    "path": "tests/languages/bison/comment_feature.test",
    "content": "// Foobar\r\n/* Foo\r\nbar */\r\n%%\r\n// Foobar\r\n/* Foo\r\nbar */\r\n%%\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"bison\", [\r\n\t\t[\"comment\", \"// Foobar\"],\r\n\t\t[\"comment\", \"/* Foo\\r\\nbar */\"],\r\n\t\t[\"punctuation\", \"%%\"],\r\n\t\t[\"comment\", \"// Foobar\"],\r\n\t\t[\"comment\", \"/* Foo\\r\\nbar */\"],\r\n\t\t[\"punctuation\", \"%%\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/bison/keyword_feature.test",
    "content": "%union\r\n%token\r\n%%\r\nexp: %empty\r\n%%\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"bison\", [\r\n\t\t[\"keyword\", \"%union\"],\r\n\t\t[\"keyword\", \"%token\"],\r\n\t\t[\"punctuation\", \"%%\"],\r\n\t\t[\"property\", \"exp\"], [\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"%empty\"],\r\n\t\t[\"punctuation\", \"%%\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/bison/number_feature.test",
    "content": "%%\r\n42\r\n0\r\n0xBadFace\r\n%%\r\n\r\n42\r\n0\r\n0xBadFace\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"bison\", [\r\n\t\t[\"punctuation\", \"%%\"],\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"number\", \"0\"],\r\n\t\t[\"number\", \"0xBadFace\"],\r\n\t\t[\"punctuation\", \"%%\"]\r\n\t]],\r\n\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"0xBadFace\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/bison/property_feature.test",
    "content": "%%\r\nfoo:\r\nbar_42:\r\n$@1:\r\n%%\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"bison\", [\r\n\t\t[\"punctuation\", \"%%\"],\r\n\t\t[\"property\", \"foo\"], [\"punctuation\", \":\"],\r\n\t\t[\"property\", \"bar_42\"], [\"punctuation\", \":\"],\r\n\t\t[\"property\", \"$@1\"], [\"punctuation\", \":\"],\r\n\t\t[\"punctuation\", \"%%\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties."
  },
  {
    "path": "tests/languages/bison/string_feature.test",
    "content": "%%\r\nfoo: \"foo\";\r\nbar: \"\\\"\";\r\n%%\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"bison\", [\r\n\t\t[\"punctuation\", \"%%\"],\r\n\r\n\t\t[\"property\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"string\", \"\\\"foo\\\"\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t[\"property\", \"bar\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"string\", \"\\\"\\\\\\\"\\\"\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t[\"punctuation\", \"%%\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/bnf/definition_feature.test",
    "content": "<foo> ::= \"a\"\n\n----------------------------------------------------\n\n[\n\t[\"definition\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"foo\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"operator\", \"::=\"],\n\t[\"string\", \"\\\"a\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for definitions.\n"
  },
  {
    "path": "tests/languages/bnf/operator_feature.test",
    "content": "::= |\n() [] {}\n* + ?\n...\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"::=\"],\n\t[\"operator\", \"|\"],\n\n\t[\"operator\", \"(\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \"[\"],\n\t[\"operator\", \"]\"],\n\t[\"operator\", \"{\"],\n\t[\"operator\", \"}\"],\n\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"?\"],\n\n\t[\"operator\", \"...\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/bnf/rule_feature.test",
    "content": "<foo-bar>\n<öäüß>\n\n----------------------------------------------------\n\n[\n\t[\"rule\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"foo-bar\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"rule\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"öäüß\",\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for rules.\n"
  },
  {
    "path": "tests/languages/bnf/string_featrue.test",
    "content": "\"\"\n''\n\"'\"\n'\"'\n\"foo\"\n'bar|::=()'\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"''\"],\n\t[\"string\", \"\\\"'\\\"\"],\n\t[\"string\", \"'\\\"'\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"'bar|::=()'\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/bqn/comments.test",
    "content": "#!/usr/bin/env bqn\n# Full Line Comment. The above is a shebang.\n+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔! # Comment at End of Line.\n'#'  # The preceding should not be a comment.\n\"BQN is #1\" # The preceding should not be a comment.\n# Comments # Continue # To # The # EOL #\n########################################\nSymbol\n\n----------------------------------------------------\n\n[\n\t[\"shebang\", \"#!/usr/bin/env bqn\"],\n\n\t[\"comment\", \"# Full Line Comment. The above is a shebang.\"],\n\n\t[\"primitive-functions\", \"+\"],\n\t[\"primitive-functions\", \"-\"],\n\t[\"primitive-functions\", \"×\"],\n\t[\"primitive-functions\", \"÷\"],\n\t[\"primitive-functions\", \"⋆\"],\n\t[\"primitive-functions\", \"√\"],\n\t[\"primitive-functions\", \"⌊\"],\n\t[\"primitive-functions\", \"⌈\"],\n\t[\"primitive-functions\", \"|\"],\n\t[\"primitive-functions\", \"¬\"],\n\t[\"primitive-functions\", \"∧\"],\n\t[\"primitive-functions\", \"∨\"],\n\t[\"primitive-functions\", \"<\"],\n\t[\"primitive-functions\", \">\"],\n\t[\"primitive-functions\", \"≠\"],\n\t[\"primitive-functions\", \"=\"],\n\t[\"primitive-functions\", \"≤\"],\n\t[\"primitive-functions\", \"≥\"],\n\t[\"primitive-functions\", \"≡\"],\n\t[\"primitive-functions\", \"≢\"],\n\t[\"primitive-functions\", \"⊣\"],\n\t[\"primitive-functions\", \"⊢\"],\n\t[\"primitive-functions\", \"⥊\"],\n\t[\"primitive-functions\", \"∾\"],\n\t[\"primitive-functions\", \"≍\"],\n\t[\"primitive-functions\", \"⋈\"],\n\t[\"primitive-functions\", \"↑\"],\n\t[\"primitive-functions\", \"↓\"],\n\t[\"primitive-functions\", \"↕\"],\n\t[\"primitive-functions\", \"«\"],\n\t[\"primitive-functions\", \"»\"],\n\t[\"primitive-functions\", \"⌽\"],\n\t[\"primitive-functions\", \"⍉\"],\n\t[\"primitive-functions\", \"/\"],\n\t[\"primitive-functions\", \"⍋\"],\n\t[\"primitive-functions\", \"⍒\"],\n\t[\"primitive-functions\", \"⊏\"],\n\t[\"primitive-functions\", \"⊑\"],\n\t[\"primitive-functions\", \"⊐\"],\n\t[\"primitive-functions\", \"⊒\"],\n\t[\"primitive-functions\", \"∊\"],\n\t[\"primitive-functions\", \"⍷\"],\n\t[\"primitive-functions\", \"⊔\"],\n\t[\"primitive-functions\", \"!\"],\n\t[\"comment\", \"# Comment at End of Line.\"],\n\n\t[\"character-literal\", \"'#'\"],\n\t[\"comment\", \"# The preceding should not be a comment.\"],\n\n\t[\"string-literal\", \"\\\"BQN is #1\\\"\"],\n\t[\"comment\", \"# The preceding should not be a comment.\"],\n\n\t[\"comment\", \"# Comments # Continue # To # The # EOL #\"],\n\n\t[\"comment\", \"########################################\"],\n\n\t[\"word-name\", \"Symbol\"]\n]\n\n----------------------------------------------------\n\nComments follow a '#' character only, on a single line, to the end of the\nline, unless in a shebang, character literal, or string literal.\n"
  },
  {
    "path": "tests/languages/bqn/namespace.test",
    "content": "example.b\n{n⇐7}.n\n\n----------------------------------------------------\n\n[\n\t[\"dot-notation-on-name\", \"example.\"],\n\t[\"word-name\", \"b\"],\n\n\t[\"dot-notation-on-brackets\", \"{\"],\n\t[\"word-name\", \"n\"],\n\t[\"punctuation\", \"⇐\"],\n\t[\"word-number\", \"7\"],\n\t[\"dot-notation-on-brackets\", \"}.\"],\n\t[\"word-name\", \"n\"]\n]\n\n----------------------------------------------------\n\nA namespace is a type of value that groups together several variables\n(fields) from the same scope. A block or file returns a namespace if it\ncontains any export arrows ⇐ at the top level, and fields from namespaces can\nbe accessed with either dot syntax or destructuring assignment. A namespace\ncan be mutable only if any of its source code uses ↩ to change the value of a\nfield.\n\nThere are also two ways to get values out of a namespace, such as example\ndefined above. First, one field at a time can be retrieved with dot syntax:\nwrite the namespace, then a dot ., then another name.\n\nThe second, destructuring assignments, does not require special highlighting.\n"
  },
  {
    "path": "tests/languages/bqn/strings.test",
    "content": "\"String Literal\"\n'c'\n'not a string or character'\n\"\"Not A String\n\"\"Not A String\"\"\n\"\"\"There is a double quote at the start of this string.\"\n\"'this is a string'\"\n\"'c'\"\n# \"Comment, not String\"\n\"String, # Not Comment\"\n\"\n\n----------------------------------------------------\n\n[\n\t[\"string-literal\", \"\\\"String Literal\\\"\"],\n\n\t[\"character-literal\", \"'c'\"],\n\n\t\"\\r\\n'\",\n\t[\"word-name\", \"not\"],\n\t[\"word-name\", \"a\"],\n\t[\"word-name\", \"string\"],\n\t[\"word-name\", \"or\"],\n\t[\"word-name\", \"character\"],\n\t\"'\\r\\n\",\n\n\t[\"string-literal\", \"\\\"\\\"\"],\n\t[\"word-name\", \"Not\"],\n\t[\"word-name\", \"A\"],\n\t[\"word-name\", \"String\"],\n\n\t[\"string-literal\", \"\\\"\\\"\"],\n\t[\"word-name\", \"Not\"],\n\t[\"word-name\", \"A\"],\n\t[\"word-name\", \"String\"],\n\t[\"string-literal\", \"\\\"\\\"\"],\n\n\t[\"string-literal\", \"\\\"\\\"\\\"There is a double quote at the start of this string.\\\"\"],\n\n\t[\"string-literal\", \"\\\"'this is a string'\\\"\"],\n\n\t[\"string-literal\", \"\\\"'c'\\\"\"],\n\n\t[\"comment\", \"# \\\"Comment, not String\\\"\"],\n\n\t[\"string-literal\", \"\\\"String, # Not Comment\\\"\"],\n\n\t\"\\r\\n\\\"\"\n]\n\n----------------------------------------------------\n\nStrings—lists of characters—are written with double quotes \"\", and characters\nwith single quotes '' with a single character in between. Only one character\never needs to be escaped: a double quote in a string is written twice. So\n\"\"\"\" is a one-character string of \", and if two string literals are next to\neach other, they have to be separated by a space. Character literals don't\nhave even one escape, as the length is already known. Other than the double\nquote, character and string literals can contain any character directly:\nnewlines, null characters, or other Unicode.\n"
  },
  {
    "path": "tests/languages/bqn/system-functions.test",
    "content": "•Function\n •function \n•_function_\n@•Function@\n+•Function+\n˙•Function˙\n∘•Function∘\n𝕨•Function𝕩\n←•Function?\n•Function_.¯∞πCanHaveSymbols\n•0.0.0.0\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"•Function\"],\n\n\t[\"function\", \"•function\"],\n\n\t[\"function\", \"•_function_\"],\n\n\t[\"null-literal\", \"@\"],\n\t[\"function\", \"•Function\"],\n\t[\"null-literal\", \"@\"],\n\n\t[\"primitive-functions\", \"+\"],\n\t[\"function\", \"•Function\"],\n\t[\"primitive-functions\", \"+\"],\n\n\t[\"primitive-1-operators\", \"˙\"],\n\t[\"function\", \"•Function\"],\n\t[\"primitive-1-operators\", \"˙\"],\n\n\t[\"primitive-2-operators\", \"∘\"],\n\t[\"function\", \"•Function\"],\n\t[\"primitive-2-operators\", \"∘\"],\n\n\t[\"special-name\", \"𝕨\"],\n\t[\"function\", \"•Function\"],\n\t[\"special-name\", \"𝕩\"],\n\n\t[\"punctuation\", \"←\"],\n\t[\"function\", \"•Function\"],\n\t[\"punctuation\", \"?\"],\n\n\t[\"function\", \"•Function_.¯∞πCanHaveSymbols\"],\n\n\t[\"function\", \"•0.0.0.0\"]\n]\n\n----------------------------------------------------\n\nSystem Functions should be identified regardless of what is next to them.\n"
  },
  {
    "path": "tests/languages/bqn/tokens.test",
    "content": "@\n+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!\n˙˜˘¨⌜⁼´˝`\n∘○⊸⟜⌾⊘◶⎉⚇⍟⎊\n𝕨𝕩𝕗𝕘𝕤𝕣𝕎𝕏𝔽𝔾𝕊 _𝕣 _𝕣_\n←⇐↩(){}⟨⟩[]‿·⋄,.;:?\n\n----------------------------------------------------\n\n[\n\t[\"null-literal\", \"@\"],\n\n\t[\"primitive-functions\", \"+\"],\n\t[\"primitive-functions\", \"-\"],\n\t[\"primitive-functions\", \"×\"],\n\t[\"primitive-functions\", \"÷\"],\n\t[\"primitive-functions\", \"⋆\"],\n\t[\"primitive-functions\", \"√\"],\n\t[\"primitive-functions\", \"⌊\"],\n\t[\"primitive-functions\", \"⌈\"],\n\t[\"primitive-functions\", \"|\"],\n\t[\"primitive-functions\", \"¬\"],\n\t[\"primitive-functions\", \"∧\"],\n\t[\"primitive-functions\", \"∨\"],\n\t[\"primitive-functions\", \"<\"],\n\t[\"primitive-functions\", \">\"],\n\t[\"primitive-functions\", \"≠\"],\n\t[\"primitive-functions\", \"=\"],\n\t[\"primitive-functions\", \"≤\"],\n\t[\"primitive-functions\", \"≥\"],\n\t[\"primitive-functions\", \"≡\"],\n\t[\"primitive-functions\", \"≢\"],\n\t[\"primitive-functions\", \"⊣\"],\n\t[\"primitive-functions\", \"⊢\"],\n\t[\"primitive-functions\", \"⥊\"],\n\t[\"primitive-functions\", \"∾\"],\n\t[\"primitive-functions\", \"≍\"],\n\t[\"primitive-functions\", \"⋈\"],\n\t[\"primitive-functions\", \"↑\"],\n\t[\"primitive-functions\", \"↓\"],\n\t[\"primitive-functions\", \"↕\"],\n\t[\"primitive-functions\", \"«\"],\n\t[\"primitive-functions\", \"»\"],\n\t[\"primitive-functions\", \"⌽\"],\n\t[\"primitive-functions\", \"⍉\"],\n\t[\"primitive-functions\", \"/\"],\n\t[\"primitive-functions\", \"⍋\"],\n\t[\"primitive-functions\", \"⍒\"],\n\t[\"primitive-functions\", \"⊏\"],\n\t[\"primitive-functions\", \"⊑\"],\n\t[\"primitive-functions\", \"⊐\"],\n\t[\"primitive-functions\", \"⊒\"],\n\t[\"primitive-functions\", \"∊\"],\n\t[\"primitive-functions\", \"⍷\"],\n\t[\"primitive-functions\", \"⊔\"],\n\t[\"primitive-functions\", \"!\"],\n\n\t[\"primitive-1-operators\", \"˙\"],\n\t[\"primitive-1-operators\", \"˜\"],\n\t[\"primitive-1-operators\", \"˘\"],\n\t[\"primitive-1-operators\", \"¨\"],\n\t[\"primitive-1-operators\", \"⌜\"],\n\t[\"primitive-1-operators\", \"⁼\"],\n\t[\"primitive-1-operators\", \"´\"],\n\t[\"primitive-1-operators\", \"˝\"],\n\t[\"primitive-1-operators\", \"`\"],\n\n\t[\"primitive-2-operators\", \"∘\"],\n\t[\"primitive-2-operators\", \"○\"],\n\t[\"primitive-2-operators\", \"⊸\"],\n\t[\"primitive-2-operators\", \"⟜\"],\n\t[\"primitive-2-operators\", \"⌾\"],\n\t[\"primitive-2-operators\", \"⊘\"],\n\t[\"primitive-2-operators\", \"◶\"],\n\t[\"primitive-2-operators\", \"⎉\"],\n\t[\"primitive-2-operators\", \"⚇\"],\n\t[\"primitive-2-operators\", \"⍟\"],\n\t[\"primitive-2-operators\", \"⎊\"],\n\n\t[\"special-name\", \"𝕨\"],\n\t[\"special-name\", \"𝕩\"],\n\t[\"special-name\", \"𝕗\"],\n\t[\"special-name\", \"𝕘\"],\n\t[\"special-name\", \"𝕤\"],\n\t[\"special-name\", \"𝕣\"],\n\t[\"special-name\", \"𝕎\"],\n\t[\"special-name\", \"𝕏\"],\n\t[\"special-name\", \"𝔽\"],\n\t[\"special-name\", \"𝔾\"],\n\t[\"special-name\", \"𝕊\"],\n\t[\"special-name\", \"_𝕣\"],\n\t[\"special-name\", \"_𝕣_\"],\n\n\t[\"punctuation\", \"←\"],\n\t[\"punctuation\", \"⇐\"],\n\t[\"punctuation\", \"↩\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"⟨\"],\n\t[\"punctuation\", \"⟩\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"‿\"],\n\t[\"punctuation\", \"·\"],\n\t[\"punctuation\", \"⋄\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"?\"]\n]\n\n----------------------------------------------------\n\nA test that all of the BQN primitive tokens are correctly identified,\naccording to the spec at https://mlochbaum.github.io/BQN/spec/token.html\n"
  },
  {
    "path": "tests/languages/bqn/words.test",
    "content": "1464\n1.618\n1.314E1\n∞\nπ\n2π\n¯∞\nTheAboveAreNumbersNotNames\nThereAre4Symbols_¯∞πAllowedInNames\nThisIs.aNamespace\n•System_¯∞πFunction\n𝕣\n_𝕣\n_𝕣_\nThis𝕣IsNotASingleName\n\n----------------------------------------------------\n\n[\n\t[\"word-number\", \"1464\"],\n\t[\"word-number\", \"1.618\"],\n\t[\"word-number-scientific\", \"1.314E1\"],\n\t[\"word-number\", \"∞\"],\n\t[\"word-number\", \"π\"],\n\t[\"word-number\", \"2\"],\n\t[\"word-number\", \"π\"],\n\t[\"word-number\", \"¯∞\"],\n\t[\"word-name\", \"TheAboveAreNumbersNotNames\"],\n\t[\"word-name\", \"ThereAre4Symbols_¯∞πAllowedInNames\"],\n\t[\"dot-notation-on-name\", \"ThisIs.\"],\n\t[\"word-name\", \"aNamespace\"],\n\t[\"function\", \"•System_¯∞πFunction\"],\n\t[\"special-name\", \"𝕣\"],\n\t[\"special-name\", \"_𝕣\"],\n\t[\"special-name\", \"_𝕣_\"],\n\t[\"word-name\", \"This\"],\n\t[\"special-name\", \"𝕣\"],\n\t[\"word-name\", \"IsNotASingleName\"]\n]\n\n----------------------------------------------------\n\nNumbers and variable names share a token formation rule, and are collectively\ncalled words. A word is a number if it starts with a digit or numeric\ncharacter ¯∞π, and a name otherwise.\n\nWords are formed from digits, letters, and the characters _.¯∞π. All these\ncharacters stick together, so that you need to separate words with whitespace\nin order to write them next to each other. But . only counts if it's followed\nby a digit: otherwise it forms its own token to support namespace syntax\nns.field. A word may be preceded by • to form a system name.\n\nThe character 𝕣 also sticks with other word-forming characters, but is only\nallowed form the special names 𝕣, _𝕣, and _𝕣_.\n"
  },
  {
    "path": "tests/languages/brainfuck/all_feature.test",
    "content": "++ foobar\r\n[\r\n\t>.\r\n\t<-,\r\n]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"increment\", \"+\"], [\"increment\", \"+\"], [\"comment\", \"foobar\"],\r\n\t[\"branching\", \"[\"],\r\n\t[\"pointer\", \">\"], [\"operator\", \".\"],\r\n\t[\"pointer\", \"<\"], [\"decrement\", \"-\"], [\"operator\", \",\"],\r\n\t[\"branching\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all patterns."
  },
  {
    "path": "tests/languages/brightscript/boolean_feature.test",
    "content": "true\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans.\n"
  },
  {
    "path": "tests/languages/brightscript/class-name_feature.test",
    "content": "Function Foo(a as Object, b=1+1 as Integer) as Void\nEnd Function\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"Function\"],\n\t[\"function\", \"Foo\"],\n\t[\"punctuation\", \"(\"],\n\t\"a \",\n\t[\"keyword\", \"as\"],\n\t[\"class-name\", \"Object\"],\n\t[\"punctuation\", \",\"],\n\t\" b\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1\"],\n\t[\"operator\", \"+\"],\n\t[\"number\", \"1\"],\n\t[\"keyword\", \"as\"],\n\t[\"class-name\", \"Integer\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"as\"],\n\t[\"class-name\", \"Void\"],\n\n\t[\"keyword\", \"End\"],\n\t[\"keyword\", \"Function\"]\n]\n\n----------------------------------------------------\n\nChecks for class names.\n"
  },
  {
    "path": "tests/languages/brightscript/comment_feature.test",
    "content": "REM I'm a comment\n' me too!\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"REM I'm a comment\"],\n\t[\"comment\", \"' me too!\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/brightscript/constant_feature.test",
    "content": "LINE_NUM\n\n----------------------------------------------------\n\n[\n\t[\"constant\", \"LINE_NUM\"]\n]\n\n----------------------------------------------------\n\nChecks for constants.\n"
  },
  {
    "path": "tests/languages/brightscript/directive-statement_feature.test",
    "content": "#const someFlag = true\n#const anotherFlag = false\n#const someOtherFlag = someFlag\n\n#if FeatureA\n#else if FeatureB\n#else\n#end if\n\n#error Your device cannot support this feature.\n\n----------------------------------------------------\n\n[\n\t[\"directive-statement\", [\n\t\t[\"directive\", \"#const\"],\n\t\t[\"expression\", [\n\t\t\t\" someFlag \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"boolean\", \"true\"]\n\t\t]]\n\t]],\n\t[\"directive-statement\", [\n\t\t[\"directive\", \"#const\"],\n\t\t[\"expression\", [\n\t\t\t\" anotherFlag \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"boolean\", \"false\"]\n\t\t]]\n\t]],\n\t[\"directive-statement\", [\n\t\t[\"directive\", \"#const\"],\n\t\t[\"expression\", [\n\t\t\t\" someOtherFlag \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t\" someFlag\"\n\t\t]]\n\t]],\n\n\t[\"directive-statement\", [\n\t\t[\"directive\", \"#if\"],\n\t\t[\"expression\", [\n\t\t\t\" FeatureA\"\n\t\t]]\n\t]],\n\t[\"directive-statement\", [\n\t\t[\"directive\", \"#else if\"],\n\t\t[\"expression\", [\n\t\t\t\" FeatureB\"\n\t\t]]\n\t]],\n\t[\"directive-statement\", [\n\t\t[\"directive\", \"#else\"]\n\t]],\n\t[\"directive-statement\", [\n\t\t[\"directive\", \"#end if\"]\n\t]],\n\n\t[\"directive-statement\", [\n\t\t[\"directive\", \"#error\"],\n\t\t[\"error-message\", \" Your device cannot support this feature.\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for directives (conditional compilation).\n"
  },
  {
    "path": "tests/languages/brightscript/keyword_feature.test",
    "content": "As;\nDim\nEach\nElse\nElseif\nEnd\nExit\nFor\nFunction\nGoto\nIf\nIn\nPrint\nReturn\nStep\nStop\nSub\nThen\nTo\nWhile\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"As\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"Dim\"],\n\t[\"keyword\", \"Each\"],\n\t[\"keyword\", \"Else\"],\n\t[\"keyword\", \"Elseif\"],\n\t[\"keyword\", \"End\"],\n\t[\"keyword\", \"Exit\"],\n\t[\"keyword\", \"For\"],\n\t[\"keyword\", \"Function\"],\n\t[\"keyword\", \"Goto\"],\n\t[\"keyword\", \"If\"],\n\t[\"keyword\", \"In\"],\n\t[\"keyword\", \"Print\"],\n\t[\"keyword\", \"Return\"],\n\t[\"keyword\", \"Step\"],\n\t[\"keyword\", \"Stop\"],\n\t[\"keyword\", \"Sub\"],\n\t[\"keyword\", \"Then\"],\n\t[\"keyword\", \"To\"],\n\t[\"keyword\", \"While\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/brightscript/number_feature.test",
    "content": "123\n&hBAD\n\n1.23e-4\n1.23D+45\n\n123%\n123&\n123!\n123#\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"123\"],\n\t[\"number\", \"&hBAD\"],\n\n\t[\"number\", \"1.23e-4\"],\n\t[\"number\", \"1.23D+45\"],\n\n\t[\"number\", \"123%\"],\n\t[\"number\", \"123&\"],\n\t[\"number\", \"123!\"],\n\t[\"number\", \"123#\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers.\n"
  },
  {
    "path": "tests/languages/brightscript/operator_feature.test",
    "content": "+ - * / \\ ^ ++ --\n+= -= *= /= \\=\n\n>> >>= << <<=\n\n< > <= >= <> =\n\n: ?\n\nMod\nAnd Or Not\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"\\\\\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"++\"],\n\t[\"operator\", \"--\"],\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"\\\\=\"],\n\n\t[\"operator\", \">>\"],\n\t[\"operator\", \">>=\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \"<<=\"],\n\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<>\"],\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \":\"],\n\t[\"operator\", \"?\"],\n\n\t[\"operator\", \"Mod\"],\n\t[\"operator\", \"And\"],\n\t[\"operator\", \"Or\"],\n\t[\"operator\", \"Not\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/brightscript/property_feature.test",
    "content": "{\n\tfoo: 4\n\t\"bar\": 5\n}\n\na = { foo: 5, bar: 6, \"foo bar\": 7 }\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\t[\"property\", \"foo\"], [\"operator\", \":\"], [\"number\", \"4\"],\n\t[\"property\", \"\\\"bar\\\"\"], [\"operator\", \":\"], [\"number\", \"5\"],\n\t[\"punctuation\", \"}\"],\n\n\t\"\\r\\n\\r\\na \",\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\t[\"property\", \"foo\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"5\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", \"bar\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"6\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", \"\\\"foo bar\\\"\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"7\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for properties.\n"
  },
  {
    "path": "tests/languages/brightscript/punctuation_feature.test",
    "content": "() [] {}\n. , ;\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/brightscript/string_feature.test",
    "content": "\"foo bar\"\n\"\"\"\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"foo bar\\\"\"],\n\t[\"string\", \"\\\"\\\"\\\"\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/bro/builtin_feature.test",
    "content": "@load-sigs\n@load-plugin\n@unload\n@prefixes\n@ifndef\n@ifdef\n@else\n&redef\n&priority\nredef\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"@load-sigs\"],\n\t[\"builtin\", \"@load-plugin\"],\n\t[\"builtin\", \"@unload\"],\n\t[\"builtin\", \"@prefixes\"],\n\t[\"builtin\", \"@ifndef\"],\n\t[\"builtin\", \"@ifdef\"],\n\t[\"builtin\", \"@else\"],\n\t[\"builtin\", \"&redef\"],\n\t[\"builtin\", \"&priority\"],\n\t[\"builtin\", \"redef\"]\n]\n\n----------------------------------------------------\n\nChecks for the builtins"
  },
  {
    "path": "tests/languages/bro/comment_feature.test",
    "content": "## comment\n#TODO\n## FIXME\n# XXX\n\n----------------------------------------------------\n\n[\n\t[\"comment\", [ \"## comment\"]],\n\t[\"comment\", [ \"#\", [\"italic\", \"TODO\"]]],\n\t[\"comment\", [ \"## \", [\"italic\", \"FIXME\"]]],\n\t[\"comment\", [ \"# \", [\"italic\", \"XXX\"]]]\n]\n\n----------------------------------------------------\n\nChecks for the highlighting of comments"
  },
  {
    "path": "tests/languages/bro/function_feature.test",
    "content": "function foo\nhook foo\nevent foo\nfunction foo::bar\nhook foo::bar\nevent foo::bar\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"function\"], [\"function\", \"foo\"],\n\t[\"keyword\", \"hook\"], [\"function\", \"foo\"],\n\t[\"keyword\", \"event\"], [\"function\", \"foo\"],\n\t[\"keyword\", \"function\"], [\"function\", \"foo::bar\"],\n\t[\"keyword\", \"hook\"], [\"function\", \"foo::bar\"],\n\t[\"keyword\", \"event\"], [\"function\", \"foo::bar\"]\n]\n\n----------------------------------------------------\n\nChecks for the function feature\n"
  },
  {
    "path": "tests/languages/bro/keyword_feature.test",
    "content": "break\nnext\ncontinue\nalarm\nusing\nof\nadd\ndelete\nexport\nprint\nreturn\nschedule\nwhen\ntimeout\naddr\nany\nbool\ncount\ndouble\nenum\nfile\nint\ninterval\npattern\nopaque\nport\nrecord\nset\nstring\nsubnet\ntable\ntime\nvector\nfor\nif\nelse\nin\nmodule\nfunction\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"next\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"alarm\"],\n\t[\"keyword\", \"using\"],\n\t[\"keyword\", \"of\"],\n\t[\"keyword\", \"add\"],\n\t[\"keyword\", \"delete\"],\n\t[\"keyword\", \"export\"],\n\t[\"keyword\", \"print\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"schedule\"],\n\t[\"keyword\", \"when\"],\n\t[\"keyword\", \"timeout\"],\n\t[\"keyword\", \"addr\"],\n\t[\"keyword\", \"any\"],\n\t[\"keyword\", \"bool\"],\n\t[\"keyword\", \"count\"],\n\t[\"keyword\", \"double\"],\n\t[\"keyword\", \"enum\"],\n\t[\"keyword\", \"file\"],\n\t[\"keyword\", \"int\"],\n\t[\"keyword\", \"interval\"],\n\t[\"keyword\", \"pattern\"],\n\t[\"keyword\", \"opaque\"],\n\t[\"keyword\", \"port\"],\n\t[\"keyword\", \"record\"],\n\t[\"keyword\", \"set\"],\n\t[\"keyword\", \"string\"],\n\t[\"keyword\", \"subnet\"],\n\t[\"keyword\", \"table\"],\n\t[\"keyword\", \"time\"],\n\t[\"keyword\", \"vector\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"module\"],\n\t[\"keyword\", \"function\"]\n]\n\n----------------------------------------------------\n\nChecks for the builtins"
  },
  {
    "path": "tests/languages/bro/string_feature.test",
    "content": "\"\"\n''\n\"foo\"\n'foo'\n\"'foo'\"\n'\"bar\"'\n\"  # comment  \"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"''\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"'foo'\"],\n\t[\"string\", \"\\\"'foo'\\\"\"],\n\t[\"string\", \"'\\\"bar\\\"'\"],\n\t[\"string\", \"\\\"  # comment  \\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for single-quoted and double-quoted strings."
  },
  {
    "path": "tests/languages/bro/variable_feature.test",
    "content": "local foo\nglobal foo\nlocal bool = T;\nconst bar\nlocal baz = 66;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"local\"],\n\t\" foo\\r\\n\",\n\n\t[\"keyword\", \"global\"],\n\t\" foo\\r\\n\",\n\n\t[\"keyword\", \"local\"],\n\t[\"keyword\", \"bool\"],\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"T\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"const\"],\n\t[\"constant\", \"bar\"],\n\n\t[\"keyword\", \"local\"],\n\t\" baz \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"66\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for the highlighting of variables\n"
  },
  {
    "path": "tests/languages/bsl/comment_feature.test",
    "content": "//\r\n// foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/bsl/directive_feature.test",
    "content": "&Client\n\n#If Server Then\n#EndIf\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"&Client\"],\n\n\t[\"directive\", \"#If Server Then\"],\n\t[\"directive\", \"#EndIf\"]\n]\n"
  },
  {
    "path": "tests/languages/bsl/keyword_feature.test",
    "content": "пока для новый прервать попытка\r\nисключение вызватьисключение иначе конецпопытки неопределено\r\nфункция перем возврат конецфункции\r\nесли иначеесли процедура конецпроцедуры тогда\r\nзнач экспорт конецесли\r\nиз каждого истина по\r\nцикл конеццикла выполнить\r\nwhile for new break try\r\nexcept raise else endtry undefined \r\nfunction var return endfunction null\r\nif elseif procedure endprocedure then\r\nval export endif\r\nin each true false to\r\ndo enddo execute\r\n----------------------------------------------------\r\n\r\n[\t\r\n\t[\"keyword\", \"пока\"], [\"keyword\", \"для\"], [\"keyword\", \"новый\"], [\"keyword\", \"прервать\"], [\"keyword\", \"попытка\"],\r\n\t[\"keyword\", \"исключение\"], [\"keyword\", \"вызватьисключение\"], [\"keyword\", \"иначе\"], [\"keyword\", \"конецпопытки\"], [\"keyword\", \"неопределено\"],\r\n\t[\"keyword\", \"функция\"], [\"keyword\", \"перем\"], [\"keyword\", \"возврат\"], [\"keyword\", \"конецфункции\"],\r\n\t[\"keyword\", \"если\"], [\"keyword\", \"иначеесли\"], [\"keyword\", \"процедура\"], [\"keyword\", \"конецпроцедуры\"], [\"keyword\", \"тогда\"],\r\n\t[\"keyword\", \"знач\"], [\"keyword\", \"экспорт\"], [\"keyword\", \"конецесли\"],\r\n\t[\"keyword\", \"из\"], [\"keyword\", \"каждого\"], [\"keyword\", \"истина\"], [\"keyword\", \"по\"],\r\n\t[\"keyword\", \"цикл\"], [\"keyword\", \"конеццикла\"], [\"keyword\", \"выполнить\"],\t\r\n\t\r\n\t[\"keyword\", \"while\"], [\"keyword\", \"for\"], [\"keyword\", \"new\"], [\"keyword\", \"break\"], [\"keyword\", \"try\"],\r\n\t[\"keyword\", \"except\"], [\"keyword\", \"raise\"], [\"keyword\", \"else\"], [\"keyword\", \"endtry\"], [\"keyword\", \"undefined\"],\r\n\t[\"keyword\", \"function\"], [\"keyword\", \"var\"], [\"keyword\", \"return\"], [\"keyword\", \"endfunction\"], [\"keyword\", \"null\"],\r\n\t[\"keyword\", \"if\"], [\"keyword\", \"elseif\"], [\"keyword\", \"procedure\"], [\"keyword\", \"endprocedure\"], [\"keyword\", \"then\"],\r\n\t[\"keyword\", \"val\"], [\"keyword\", \"export\"], [\"keyword\", \"endif\"],\r\n\t[\"keyword\", \"in\"], [\"keyword\", \"each\"], [\"keyword\", \"true\"], [\"keyword\", \"false\"], [\"keyword\", \"to\"],\r\n\t[\"keyword\", \"do\"], [\"keyword\", \"enddo\"], [\"keyword\", \"execute\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/bsl/number_feature.test",
    "content": "42\r\n3.14159\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal."
  },
  {
    "path": "tests/languages/bsl/operator_feature.test",
    "content": "< <= > >=\r\n+ - * /\r\n% =\r\nand or not и или не\r\n----------------------------------------------------\r\n\r\n[\t\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"=\"],\t\r\n\t[\"operator\", \"and\"], [\"operator\", \"or\"], [\"operator\", \"not\"], [\"operator\", \"и\"], [\"operator\", \"или\"], [\"operator\", \"не\"]\r\n\t\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/bsl/punctuation_feature.test",
    "content": "(. .)\n( ) [ ] : ; , .\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(.\"],\n\t[\"punctuation\", \".)\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \".\"]\n]\n"
  },
  {
    "path": "tests/languages/bsl/string_feature.test",
    "content": "\"\"\r\n\"fo\"\r\n\r\n''\r\n'foo'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\"\"],\r\n\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'foo'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and chars.\r\n"
  },
  {
    "path": "tests/languages/c/char_feature.test",
    "content": "'a'\n'\\n'\n'\\13'\n'🍌'\n'ab'\n\nu'a'\nu'¢'\nu'猫'\nU'猫'\nL'猫'\n\n'\\1\\2\\3\\4'\n'\\xFF'\nu'\\U0001f34c'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"],\n\t[\"char\", \"'\\\\n'\"],\n\t[\"char\", \"'\\\\13'\"],\n\t[\"char\", \"'🍌'\"],\n\t[\"char\", \"'ab'\"],\n\n\t\"\\r\\n\\r\\nu\", [\"char\", \"'a'\"],\n\t\"\\r\\nu\", [\"char\", \"'¢'\"],\n\t\"\\r\\nu\", [\"char\", \"'猫'\"],\n\t\"\\r\\nU\", [\"char\", \"'猫'\"],\n\t\"\\r\\nL\", [\"char\", \"'猫'\"],\n\n\t[\"char\", \"'\\\\1\\\\2\\\\3\\\\4'\"],\n\t[\"char\", \"'\\\\xFF'\"],\n\t\"\\r\\nu\", [\"char\", \"'\\\\U0001f34c'\"]\n]\n"
  },
  {
    "path": "tests/languages/c/class-name_feature.test",
    "content": "struct foo;\nenum bar;\n\nstruct foo var;\nstruct __attribute__ ((aligned (8))) S { short f[3]; };\n\n// by name\nuint32_t foo;\nstatic dtrace_helptrace_t *bar;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"struct\"],\n\t[\"class-name\", \"foo\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"enum\"],\n\t[\"class-name\", \"bar\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"struct\"],\n\t[\"class-name\", \"foo\"],\n\t\" var\",\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"struct\"],\n\t[\"keyword\", \"__attribute__\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"aligned\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"8\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"class-name\", \"S\"],\n\t[\"punctuation\", \"{\"],\n\t[\"keyword\", \"short\"],\n\t\" f\",\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"3\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// by name\"],\n\t[\"class-name\", \"uint32_t\"],\n\t\" foo\",\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"static\"],\n\t[\"class-name\", \"dtrace_helptrace_t\"],\n\t[\"operator\", \"*\"],\n\t\"bar\",\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for structs and enums."
  },
  {
    "path": "tests/languages/c/comment_feature.test",
    "content": "//\r\n// comment\r\n// the comment \\\r\n   continues!\r\n\r\n/**/\r\n/*\r\n * comment\r\n */\r\n\r\n/* open-ended comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// comment\"],\r\n\t[\"comment\", \"// the comment \\\\\\r\\n   continues!\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/*\\r\\n * comment\\r\\n */\"],\r\n\t[\"comment\", \"/* open-ended comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/c/constant_feature.test",
    "content": "__FILE__\r\n__LINE__\r\n__DATE__\r\n__TIME__\r\n__TIMESTAMP__\r\n__func__\r\nEOF\r\nNULL\r\nSEEK_CUR\r\nSEEK_END\r\nSEEK_SET\r\nstdin\r\nstdout\r\nstderr\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"__FILE__\"],\r\n\t[\"constant\", \"__LINE__\"],\r\n\t[\"constant\", \"__DATE__\"],\r\n\t[\"constant\", \"__TIME__\"],\r\n\t[\"constant\", \"__TIMESTAMP__\"],\r\n\t[\"constant\", \"__func__\"],\r\n\t[\"constant\", \"EOF\"],\r\n\t[\"constant\", \"NULL\"],\r\n\t[\"constant\", \"SEEK_CUR\"],\r\n\t[\"constant\", \"SEEK_END\"],\r\n\t[\"constant\", \"SEEK_SET\"],\r\n\t[\"constant\", \"stdin\"],\r\n\t[\"constant\", \"stdout\"],\r\n\t[\"constant\", \"stderr\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all constants."
  },
  {
    "path": "tests/languages/c/function_feature.test",
    "content": "foo(void);\r\nbar\r\n(1, 2);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"function\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/c/keyword_feature.test",
    "content": "__attribute__\r\n_Alignas _Alignof _Atomic _Bool\r\n_Complex _Generic _Imaginary\r\n_Noreturn _Static_assert _Thread_local\r\nasm typeof inline auto break\r\ncase char const continue default\r\ndo double else enum;\r\nextern\r\nfloat for goto if int\r\nlong register return short signed\r\nsizeof static struct;\r\nswitch typedef\r\nunion unsigned void volatile while\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"__attribute__\"],\r\n\t[\"keyword\", \"_Alignas\"], [\"keyword\", \"_Alignof\"], [\"keyword\", \"_Atomic\"], [\"keyword\", \"_Bool\"],\r\n\t[\"keyword\", \"_Complex\"], [\"keyword\", \"_Generic\"], [\"keyword\", \"_Imaginary\"],\r\n\t[\"keyword\", \"_Noreturn\"], [\"keyword\", \"_Static_assert\"], [\"keyword\", \"_Thread_local\"],\r\n\t[\"keyword\", \"asm\"], [\"keyword\", \"typeof\"], [\"keyword\", \"inline\"], [\"keyword\", \"auto\"], [\"keyword\", \"break\"],\r\n\t[\"keyword\", \"case\"], [\"keyword\", \"char\"], [\"keyword\", \"const\"], [\"keyword\", \"continue\"], [\"keyword\", \"default\"],\r\n\t[\"keyword\", \"do\"], [\"keyword\", \"double\"], [\"keyword\", \"else\"], [\"keyword\", \"enum\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"float\"], [\"keyword\", \"for\"], [\"keyword\", \"goto\"], [\"keyword\", \"if\"], [\"keyword\", \"int\"],\r\n\t[\"keyword\", \"long\"], [\"keyword\", \"register\"], [\"keyword\", \"return\"], [\"keyword\", \"short\"], [\"keyword\", \"signed\"],\r\n\t[\"keyword\", \"sizeof\"], [\"keyword\", \"static\"], [\"keyword\", \"struct\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"], [\"keyword\", \"typedef\"],\r\n\t[\"keyword\", \"union\"], [\"keyword\", \"unsigned\"], [\"keyword\", \"void\"], [\"keyword\", \"volatile\"], [\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/c/macro_feature.test",
    "content": "# include <stdio.h>\r\n# include \"stdio.h\"\r\n\t#define PG_locked 0\r\n\r\n#defined\r\n#elif\r\n#else\r\n#endif\r\n#error\r\n#ifdef\r\n#ifndef\r\n#if\r\n#import\r\n#include\r\n#line\r\n#pragma\r\n#undef\r\n#using\r\n\r\n#somethingunknown\r\n\r\n#define FOO /*\r\n comment\r\n*/ 1\r\n\r\n#define FOO 1 // trailing comment\r\n#define FOO (1 + 1)\r\n\r\n#define MAX(a, b) \\\r\n\t((a) < (b) ? (b) : (a))\r\n\r\n#define BAR(s) no_##s\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"include\"],\r\n\t\t[\"string\", \"<stdio.h>\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"include\"],\r\n\t\t[\"string\", \"\\\"stdio.h\\\"\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"define\"],\r\n\t\t[\"macro-name\", \"PG_locked\"],\r\n\t\t[\"expression\", [\r\n\t\t\t[\"number\", \"0\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"defined\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"elif\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"else\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"endif\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"error\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"ifdef\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"ifndef\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"if\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"import\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"include\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"line\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"pragma\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"undef\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"using\"]\r\n\t]],\r\n\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"somethingunknown\"]\r\n\t]],\r\n\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"define\"],\r\n\t\t[\"macro-name\", \"FOO\"],\r\n\t\t[\"comment\", \"/*\\r\\n comment\\r\\n*/\"],\r\n\t\t[\"expression\", [\r\n\t\t\t[\"number\", \"1\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"define\"],\r\n\t\t[\"macro-name\", \"FOO\"],\r\n\t\t[\"expression\", [\r\n\t\t\t[\"number\", \"1\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// trailing comment\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"define\"],\r\n\t\t[\"macro-name\", \"FOO\"],\r\n\t\t[\"expression\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"operator\", \"+\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"define\"],\r\n\t\t[\"macro-name\", \"MAX\"],\r\n\t\t[\"expression\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"a\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\" b\",\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t[\"expression\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"a\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"<\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"b\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"?\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"b\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \":\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"a\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"define\"],\r\n\t\t[\"macro-name\", \"BAR\"],\r\n\t\t[\"expression\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"s\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\" no_\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"##\"],\r\n\t\t[\"expression\", [\r\n\t\t\t\"s\"\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for macros and paths inside include statements."
  },
  {
    "path": "tests/languages/c/number_feature.test",
    "content": "42\r\n3.14159\r\n4e10\r\n2.1e-10\r\n0.4e+2\r\n0xbabe\r\n0xBABE\r\n0x1.2\r\n0x0.3p-3\r\n0x0.3p4L\r\n42f\r\n42F\r\n42u\r\n42U\r\n42l\r\n42L\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"4e10\"],\r\n\t[\"number\", \"2.1e-10\"],\r\n\t[\"number\", \"0.4e+2\"],\r\n\t[\"number\", \"0xbabe\"],\r\n\t[\"number\", \"0xBABE\"],\r\n\t[\"number\", \"0x1.2\"],\r\n\t[\"number\", \"0x0.3p-3\"],\r\n\t[\"number\", \"0x0.3p4L\"],\r\n\t[\"number\", \"42f\"],\r\n\t[\"number\", \"42F\"],\r\n\t[\"number\", \"42u\"],\r\n\t[\"number\", \"42U\"],\r\n\t[\"number\", \"42l\"],\r\n\t[\"number\", \"42L\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal numbers and hexadecimal numbers.\r\n"
  },
  {
    "path": "tests/languages/c/operator_feature.test",
    "content": "+ - * / % -- ++\r\n>> <<\r\n~ & | ^\r\n+= -= *= /= %= >>= <<= &= |= ^=\r\n! && ||\r\n-> ::\r\n? :\r\n= == != < > <= >=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"operator\", \"++\"],\r\n\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \"<<\"],\r\n\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"^\"],\r\n\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"|=\"],\r\n\t[\"operator\", \"^=\"],\r\n\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\r\n\t[\"operator\", \"->\"],\r\n\t[\"operator\", \"::\"],\r\n\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \":\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators\r\n"
  },
  {
    "path": "tests/languages/c/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"\\x12\"\n\"3\"\n\n\"\\xff\"\"f\"\n\n\"foo\\\nbar\"\n\n\"a猫🍌\"\nu8\"a猫🍌\"\nu\"a猫🍌\"\nU\"a猫🍌\"\nL\"a猫🍌\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"\\\\x12\\\"\"],\n\t[\"string\", \"\\\"3\\\"\"],\n\n\t[\"string\", \"\\\"\\\\xff\\\"\"], [\"string\", \"\\\"f\\\"\"],\n\n\t[\"string\", \"\\\"foo\\\\\\r\\nbar\\\"\"],\n\n\t[\"string\", \"\\\"a猫🍌\\\"\"],\n\t\"\\r\\nu8\", [\"string\", \"\\\"a猫🍌\\\"\"],\n\t\"\\r\\nu\", [\"string\", \"\\\"a猫🍌\\\"\"],\n\t\"\\r\\nU\", [\"string\", \"\\\"a猫🍌\\\"\"],\n\t\"\\r\\nL\", [\"string\", \"\\\"a猫🍌\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/c+pure/c_inclusion.test",
    "content": "%<\r\nasm ();\r\n%>\r\n\r\n%< -*- C -*-\r\nasm ();\r\n%>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"inline-lang\", [\r\n\t\t[\"delimiter\", \"%<\"],\r\n\t\t[\"keyword\", \"asm\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"], [\"punctuation\", \";\"],\r\n\t\t[\"delimiter\", \"%>\"]\r\n\t]],\r\n\r\n\t[\"inline-lang-c\", [\r\n\t\t[\"delimiter\", \"%< \"],\r\n\t\t[\"lang\", \"-*- C -*-\"],\r\n\t\t[\"keyword\", \"asm\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"], [\"punctuation\", \";\"],\r\n\t\t[\"delimiter\", \"%>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for C in Pure."
  },
  {
    "path": "tests/languages/cfscript/comment_feature.test",
    "content": "// foobar\r\n/**/\r\n/* foo\r\nbar */\r\n/**\r\n* @product.hint\r\n*/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// foobar\"],\r\n\t[\"comment\", [\"/**/\"]],\r\n\t[\"comment\", [\"/* foo\\r\\nbar */\"]],\r\n\t[\"comment\", [\r\n\t\t\"/**\\r\\n*\", [\"annotation\", \" @product.hint\"],\r\n\t\t\"\\r\\n*/\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments along with annotation\r\n"
  },
  {
    "path": "tests/languages/cfscript/function-variable_feature.test",
    "content": "foo = function (  ) {}\r\nfoo = function ( x, y) {}\r\n{foo: function () {}}\r\nfooBar = x => x\r\nfooBar = ( x, y ) => x\r\nಠ_ಠ = () => {}\r\nd = function Example({ props: { a: _A, b} } = Props) {}\r\nf = function (x = fun()) {}\r\nl = (x = fun(), y) => {}\r\na = function () {}, b = () => {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function-variable\", \"foo\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"foo\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\" x\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" y\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"function-variable\", \"foo\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"fooBar\"],\r\n\t[\"operator\", \"=\"],\r\n\t\" x \",\r\n\t[\"operator\", \"=>\"],\r\n\t\" x\\r\\n\",\r\n\r\n\t[\"function-variable\", \"fooBar\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\" x\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" y \",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t\" x\\r\\n\",\r\n\r\n\t[\"function-variable\", \"ಠ_ಠ\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"d\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"Example\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" props\",\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" a\",\r\n\t[\"operator\", \":\"],\r\n\t\" _A\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" b\",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"operator\", \"=\"],\r\n\t\" Props\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"f\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"x \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"function\", \"fun\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"l\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"x \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"function\", \"fun\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" y\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"a\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"function-variable\", \"b\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables obviously containing functions.\r\n"
  },
  {
    "path": "tests/languages/cfscript/keyword_feature.test",
    "content": "abstract\r\nbreak\r\ncatch\r\ncomponent\r\ncontinue\r\ndefault\r\ndo\r\nelse\r\nextends\r\nfinal\r\nfinally\r\nfor\r\nfunction\r\nif\r\nin\r\ninclude\r\npackage\r\nprivate\r\nproperty\r\npublic\r\nremote\r\nrequired\r\nrethrow\r\nreturn\r\nstatic\r\nswitch\r\nthrow\r\ntry\r\nvar\r\nwhile\r\nxml\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"component\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"property\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"remote\"],\r\n\t[\"keyword\", \"required\"],\r\n\t[\"keyword\", \"rethrow\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"xml\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/cfscript/operator_feature.test",
    "content": "+ ++ +=\r\n- -- -=\r\n! !=\r\n< <=\r\n> >=\r\n= ==\r\n=== !==\r\n& && &=\r\n| ||\r\n: ::\r\n? ?. ?:\r\n^ ^=\r\n* *=\r\n/ /=\r\n% %=\r\n\r\nand\r\ncontains\r\neq\r\nequal\r\neqv\r\ngt\r\ngte\r\nimp\r\nis\r\nlt\r\nlte\r\nmod\r\nnot\r\nor\r\nxor\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"===\"], [\"operator\", \"!==\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"&=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \":\"], [\"operator\", \"::\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \"?.\"], [\"operator\", \"?:\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%=\"],\r\n\r\n\t[\"operator\", \"and\"],\r\n\t[\"operator\", \"contains\"],\r\n\t[\"operator\", \"eq\"],\r\n\t[\"operator\", \"equal\"],\r\n\t[\"operator\", \"eqv\"],\r\n\t[\"operator\", \"gt\"],\r\n\t[\"operator\", \"gte\"],\r\n\t[\"operator\", \"imp\"],\r\n\t[\"operator\", \"is\"],\r\n\t[\"operator\", \"lt\"],\r\n\t[\"operator\", \"lte\"],\r\n\t[\"operator\", \"mod\"],\r\n\t[\"operator\", \"not\"],\r\n\t[\"operator\", \"or\"],\r\n\t[\"operator\", \"xor\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/cfscript/scope_feature.test",
    "content": "application\r\narguments\r\ncgi\r\nclient\r\ncookie\r\nlocal\r\nsession\r\nsuper\r\nthis\r\nvariables\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"scope\", \"application\"],\r\n\t[\"scope\", \"arguments\"],\r\n\t[\"scope\", \"cgi\"],\r\n\t[\"scope\", \"client\"],\r\n\t[\"scope\", \"cookie\"],\r\n\t[\"scope\", \"local\"],\r\n\t[\"scope\", \"session\"],\r\n\t[\"scope\", \"super\"],\r\n\t[\"scope\", \"this\"],\r\n\t[\"scope\", \"variables\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all scopes.\r\n"
  },
  {
    "path": "tests/languages/cfscript/type_feature.test",
    "content": "any\r\narray\r\nbinary\r\nboolean\r\ndate\r\nguid\r\nnumeric\r\nquery\r\nstring\r\nstruct\r\nuuid\r\nvoid\r\nxml=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"type\", \"any\"],\r\n\t[\"type\", \"array\"],\r\n\t[\"type\", \"binary\"],\r\n\t[\"type\", \"boolean\"],\r\n\t[\"type\", \"date\"],\r\n\t[\"type\", \"guid\"],\r\n\t[\"type\", \"numeric\"],\r\n\t[\"type\", \"query\"],\r\n\t[\"type\", \"string\"],\r\n\t[\"type\", \"struct\"],\r\n\t[\"type\", \"uuid\"],\r\n\t[\"type\", \"void\"],\r\n\t[\"type\", \"xml\"], [\"operator\", \"=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all types.\r\n"
  },
  {
    "path": "tests/languages/chaiscript/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]"
  },
  {
    "path": "tests/languages/chaiscript/comment_feature.test",
    "content": "// comment\r\n/*\r\n comment\r\n*/\r\n\r\n/*\r\n comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// comment\"],\r\n\t[\"comment\", \"/*\\r\\n comment\\r\\n*/\"],\r\n\r\n\t[\"comment\", \"/*\\r\\n comment\"]\r\n]"
  },
  {
    "path": "tests/languages/chaiscript/function_feature.test",
    "content": "attr Rectangle::height\r\nattr Rectangle::width\r\ndef Rectangle::Rectangle() { this.height = 10; this.width = 20 }\r\ndef Rectangle::area() { this.height * this.width }\r\nvar rect = Rectangle()\r\nrect.height = 30\r\nprint(rect.area())\r\n\r\nclass Rectangle {\r\n  attr height\r\n  attr width\r\n  def Rectangle() { this.height = 10; this.width = 20 }\r\n  def area() { this.height * this.width }\r\n}\r\nvar rect = Rectangle()\r\nrect.height = 30\r\nprint(rect.area())\r\n\r\ndef update(dt) {\r\n  x = x + 20.0f * dt\r\n}\r\n\r\ndef foo(int x, Vector y) {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"attr\"],\r\n\t[\"class-name\", \"Rectangle\"],\r\n\t[\"operator\", \"::\"],\r\n\t\"height\\r\\n\",\r\n\r\n\t[\"keyword\", \"attr\"],\r\n\t[\"class-name\", \"Rectangle\"],\r\n\t[\"operator\", \"::\"],\r\n\t\"width\\r\\n\",\r\n\r\n\t[\"keyword\", \"def\"],\r\n\t[\"class-name\", \"Rectangle\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"function\", \"Rectangle\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"height \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"10\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"width \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"20\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"def\"],\r\n\t[\"class-name\", \"Rectangle\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"function\", \"area\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"height \",\r\n\t[\"operator\", \"*\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"width \",\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t\" rect \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"function\", \"Rectangle\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\nrect\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"height \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"30\"],\r\n\r\n\t[\"function\", \"print\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"rect\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"area\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", \"Rectangle\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"attr\"],\r\n\t\" height\\r\\n  \",\r\n\r\n\t[\"keyword\", \"attr\"],\r\n\t\" width\\r\\n  \",\r\n\r\n\t[\"keyword\", \"def\"],\r\n\t[\"function\", \"Rectangle\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"height \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"10\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"width \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"20\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"def\"],\r\n\t[\"function\", \"area\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"height \",\r\n\t[\"operator\", \"*\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"width \",\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t\" rect \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"function\", \"Rectangle\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\nrect\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"height \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"30\"],\r\n\r\n\t[\"function\", \"print\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"rect\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"area\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"def\"],\r\n\t[\"function\", \"update\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"dt\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t\"\\r\\n  x \",\r\n\t[\"operator\", \"=\"],\r\n\t\" x \",\r\n\t[\"operator\", \"+\"],\r\n\t[\"number\", \"20.0f\"],\r\n\t[\"operator\", \"*\"],\r\n\t\" dt\\r\\n\",\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"def\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter-type\", \"int\"],\r\n\t\" x\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"parameter-type\", \"Vector\"],\r\n\t\" y\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]"
  },
  {
    "path": "tests/languages/chaiscript/keyword_feature.test",
    "content": "attr;\r\nauto;\r\nbreak;\r\ncase;\r\ncatch;\r\nclass;\r\ncontinue;\r\ndef;\r\ndefault;\r\nelse;\r\nfinally;\r\nfor;\r\nfun;\r\nglobal;\r\nif;\r\nreturn;\r\nswitch;\r\nthis;\r\ntry;\r\nvar;\r\nwhile;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"attr\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"auto\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"case\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"catch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"def\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"default\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"finally\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"fun\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"global\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"this\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"try\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"var\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"]\r\n]"
  },
  {
    "path": "tests/languages/chaiscript/number_feature.test",
    "content": "Infinity\r\nNaN\r\n\r\n1e-5\r\n35.5E+8\r\n0.01e19\r\n1.2f\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"Infinity\"],\r\n\t[\"number\", \"NaN\"],\r\n\r\n\t[\"number\", \"1e-5\"],\r\n\t[\"number\", \"35.5E+8\"],\r\n\t[\"number\", \"0.01e19\"],\r\n\t[\"number\", \"1.2f\"]\r\n]"
  },
  {
    "path": "tests/languages/chaiscript/operator_feature.test",
    "content": "?\r\n|| &&\r\n| ^ &\r\n== !=\r\n< <= > >=\r\n<< >>\r\n+ -\r\n* / %\r\n++ -- - + ! ~\r\n\r\n= :=\r\n+= -= *= /= %= <<= >>= &= ^= |=\r\n: ::\r\n\r\n// operator references\r\n`+`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"?\"],\r\n\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"&&\"],\r\n\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"&\"],\r\n\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \">>\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"~\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \":=\"],\r\n\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"^=\"],\r\n\t[\"operator\", \"|=\"],\r\n\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"::\"],\r\n\r\n\t[\"comment\", \"// operator references\"],\r\n\t[\"operator\", \"`+`\"]\r\n]"
  },
  {
    "path": "tests/languages/chaiscript/punctuation_feature.test",
    "content": "( ) [ ] { }\r\n; , .\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \".\"]\r\n]"
  },
  {
    "path": "tests/languages/chaiscript/string_feature.test",
    "content": "\"string\"\r\n\"lhs: ${lhs}, rhs: ${rhs}\"\r\n\"${3 + 5} is 8\"\r\n\"method_missing(${i}, ${name}), ${v.size()} params\"\r\n\r\n'f'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"\\\"string\\\"\"]\r\n\t]],\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"\\\"lhs: \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"interpolation-expression\", [\"lhs\"]],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \", rhs: \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"interpolation-expression\", [\"rhs\"]],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\\"\"]\r\n\t]],\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"\\\"\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"interpolation-expression\", [\r\n\t\t\t\t[\"number\", \"3\"],\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"number\", \"5\"]\r\n\t\t\t]],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \" is 8\\\"\"]\r\n\t]],\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"\\\"method_missing(\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"interpolation-expression\", [\"i\"]],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \", \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"interpolation-expression\", [\"name\"]],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"), \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"interpolation-expression\", [\r\n\t\t\t\t\"v\",\r\n\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t[\"function\", \"size\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \" params\\\"\"]\r\n\t]],\r\n\r\n\t[\"string\", \"'f'\"]\r\n]"
  },
  {
    "path": "tests/languages/cil/asm_reference.test",
    "content": "[mscorlib]\n\n--------------------------------------------------------\n\n[\n\t[ \"variable\", \"[mscorlib]\" ]\n]\n\n--------------------------------------------------------\n\nTests assembly references\n"
  },
  {
    "path": "tests/languages/cil/boolean.test",
    "content": "\ntrue\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n\n----------------------------------------------------\n\nTests booleans.\n"
  },
  {
    "path": "tests/languages/cil/comment.test",
    "content": "// this is a test\n\n--------------------------------------------------------\n\n[\n\t[ \"comment\", \"// this is a test\" ]\n]\n\n--------------------------------------------------------\n\nTests comments\n"
  },
  {
    "path": "tests/languages/cil/directive_feature.test",
    "content": ".class public Foo {\n.method\n.maxstack 2\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \".class\"],\n\t[\"keyword\", \"public\"],\n\t\" Foo \",\n\t[\"punctuation\", \"{\"],\n\t[\"directive\", \".method\"],\n\t[\"directive\", \".maxstack\"],\n\t[\"number\", \"2\"]\n]\n"
  },
  {
    "path": "tests/languages/cil/instructions.test",
    "content": "add\nadd.ovf\nadd.ovf.un\nand\narglist\nbeq\nbeq.s\nbge\nbge.s\nbge.un\nbge.un.s\nbgt\nbgt.s\nbgt.un\nbgt.un.s\nble\nble.s\nble.un\nble.un.s\nblt\nblt.s\nblt.un\nblt.un.s\nbne.un\nbne.un.s\nbox\nbr\nbr.s\nbreak\nbrfalse\nbrfalse.s\nbrinst\nbrinst.s\nbrnull\nbrnull.s\nbrtrue\nbrtrue.s\nbrzero\nbrzero.s\ncall\ncalli\ncallvirt\ncastclass\nceq\ncgt\ncgt.un\nckfinite\nclt\nclt.un\nconv.i\nconv.i1\nconv.i2\nconv.i4\nconv.i8\nconv.ovf.i\nconv.ovf.i.un\nconv.ovf.i1\nconv.ovf.i1.un\nconv.ovf.i2\nconv.ovf.i2.un\nconv.ovf.i4\nconv.ovf.i4.un\nconv.ovf.i8\nconv.ovf.i8.un\nconv.ovf.u\nconv.ovf.u.un\nconv.ovf.u1\nconv.ovf.u1.un\nconv.ovf.u2\nconv.ovf.u2.un\nconv.ovf.u4\nconv.ovf.u4.un\nconv.ovf.u8\nconv.ovf.u8.un\nconv.r.un\nconv.r4\nconv.r8\nconv.u\nconv.u1\nconv.u2\nconv.u4\nconv.u8\ncpblk\ncpobj\ndiv\ndiv.un\ndup\nendfault\nendfilter\nendfinally\ninitblk\ninitobj\nisinst\njmp\nldarg\nldarg.0\nldarg.1\nldarg.2\nldarg.3\nldarg.s\nldarga\nldarga.s\nldc.i4\nldc.i4.0\nldc.i4.1\nldc.i4.2\nldc.i4.3\nldc.i4.4\nldc.i4.5\nldc.i4.6\nldc.i4.7\nldc.i4.8\nldc.i4.m1\nldc.i4.M1\nldc.i4.s\nldc.i8\nldc.r4\nldc.r8\nldelem\nldelem.i\nldelem.i1\nldelem.i2\nldelem.i4\nldelem.i8\nldelem.r4\nldelem.r8\nldelem.ref\nldelem.u1\nldelem.u2\nldelem.u4\nldelem.u8\nldelema\nldfld\nldflda\nldftn\nldind.i\nldind.i1\nldind.i2\nldind.i4\nldind.i8\nldind.r4\nldind.r8\nldind.ref\nldind.u1\nldind.u2\nldind.u4\nldind.u8\nldlen\nldloc\nldloc.0\nldloc.1\nldloc.2\nldloc.3\nldloc.s\nldloca\nldloca.s\nldnull\nldobj\nldsfld\nldsflda\nldstr\nldtoken\nldvirtftn\nleave\nleave.s\nlocalloc\nmkrefany\nmul\nmul.ovf\nmul.ovf.un\nneg\nnewarr\nnewobj\nnop\nnot\nor\npop\nrefanytype\nrefanyval\nrem\nrem.un\nret\nrethrow\nshl\nshr\nshr.un\nsizeof\nstarg\nstarg.s\nstelem\nstelem.i\nstelem.i1\nstelem.i2\nstelem.i4\nstelem.i8\nstelem.r4\nstelem.r8\nstelem.ref\nstfld\nstind.i\nstind.i1\nstind.i2\nstind.i4\nstind.i8\nstind.r4\nstind.r8\nstind.ref\nstloc\nstloc.0\nstloc.1\nstloc.2\nstloc.3\nstloc.s\nstobj\nstsfld\nsub\nsub.ovf\nsub.ovf.un\nswitch\nthrow\nalignment\nunbox\nunbox.any\nxor\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"add\"],\n\t[\"function\", \"add.ovf\"],\n\t[\"function\", \"add.ovf.un\"],\n\t[\"function\", \"and\"],\n\t[\"function\", \"arglist\"],\n\t[\"function\", \"beq\"],\n\t[\"function\", \"beq.s\"],\n\t[\"function\", \"bge\"],\n\t[\"function\", \"bge.s\"],\n\t[\"function\", \"bge.un\"],\n\t[\"function\", \"bge.un.s\"],\n\t[\"function\", \"bgt\"],\n\t[\"function\", \"bgt.s\"],\n\t[\"function\", \"bgt.un\"],\n\t[\"function\", \"bgt.un.s\"],\n\t[\"function\", \"ble\"],\n\t[\"function\", \"ble.s\"],\n\t[\"function\", \"ble.un\"],\n\t[\"function\", \"ble.un.s\"],\n\t[\"function\", \"blt\"],\n\t[\"function\", \"blt.s\"],\n\t[\"function\", \"blt.un\"],\n\t[\"function\", \"blt.un.s\"],\n\t[\"function\", \"bne.un\"],\n\t[\"function\", \"bne.un.s\"],\n\t[\"function\", \"box\"],\n\t[\"function\", \"br\"],\n\t[\"function\", \"br.s\"],\n\t[\"function\", \"break\"],\n\t[\"function\", \"brfalse\"],\n\t[\"function\", \"brfalse.s\"],\n\t[\"function\", \"brinst\"],\n\t[\"function\", \"brinst.s\"],\n\t[\"function\", \"brnull\"],\n\t[\"function\", \"brnull.s\"],\n\t[\"function\", \"brtrue\"],\n\t[\"function\", \"brtrue.s\"],\n\t[\"function\", \"brzero\"],\n\t[\"function\", \"brzero.s\"],\n\t[\"function\", \"call\"],\n\t[\"function\", \"calli\"],\n\t[\"function\", \"callvirt\"],\n\t[\"function\", \"castclass\"],\n\t[\"function\", \"ceq\"],\n\t[\"function\", \"cgt\"],\n\t[\"function\", \"cgt.un\"],\n\t[\"function\", \"ckfinite\"],\n\t[\"function\", \"clt\"],\n\t[\"function\", \"clt.un\"],\n\t[\"function\", \"conv.i\"],\n\t[\"function\", \"conv.i1\"],\n\t[\"function\", \"conv.i2\"],\n\t[\"function\", \"conv.i4\"],\n\t[\"function\", \"conv.i8\"],\n\t[\"function\", \"conv.ovf.i\"],\n\t[\"function\", \"conv.ovf.i.un\"],\n\t[\"function\", \"conv.ovf.i1\"],\n\t[\"function\", \"conv.ovf.i1.un\"],\n\t[\"function\", \"conv.ovf.i2\"],\n\t[\"function\", \"conv.ovf.i2.un\"],\n\t[\"function\", \"conv.ovf.i4\"],\n\t[\"function\", \"conv.ovf.i4.un\"],\n\t[\"function\", \"conv.ovf.i8\"],\n\t[\"function\", \"conv.ovf.i8.un\"],\n\t[\"function\", \"conv.ovf.u\"],\n\t[\"function\", \"conv.ovf.u.un\"],\n\t[\"function\", \"conv.ovf.u1\"],\n\t[\"function\", \"conv.ovf.u1.un\"],\n\t[\"function\", \"conv.ovf.u2\"],\n\t[\"function\", \"conv.ovf.u2.un\"],\n\t[\"function\", \"conv.ovf.u4\"],\n\t[\"function\", \"conv.ovf.u4.un\"],\n\t[\"function\", \"conv.ovf.u8\"],\n\t[\"function\", \"conv.ovf.u8.un\"],\n\t[\"function\", \"conv.r.un\"],\n\t[\"function\", \"conv.r4\"],\n\t[\"function\", \"conv.r8\"],\n\t[\"function\", \"conv.u\"],\n\t[\"function\", \"conv.u1\"],\n\t[\"function\", \"conv.u2\"],\n\t[\"function\", \"conv.u4\"],\n\t[\"function\", \"conv.u8\"],\n\t[\"function\", \"cpblk\"],\n\t[\"function\", \"cpobj\"],\n\t[\"function\", \"div\"],\n\t[\"function\", \"div.un\"],\n\t[\"function\", \"dup\"],\n\t[\"function\", \"endfault\"],\n\t[\"function\", \"endfilter\"],\n\t[\"function\", \"endfinally\"],\n\t[\"function\", \"initblk\"],\n\t[\"function\", \"initobj\"],\n\t[\"function\", \"isinst\"],\n\t[\"function\", \"jmp\"],\n\t[\"function\", \"ldarg\"],\n\t[\"function\", \"ldarg.0\"],\n\t[\"function\", \"ldarg.1\"],\n\t[\"function\", \"ldarg.2\"],\n\t[\"function\", \"ldarg.3\"],\n\t[\"function\", \"ldarg.s\"],\n\t[\"function\", \"ldarga\"],\n\t[\"function\", \"ldarga.s\"],\n\t[\"function\", \"ldc.i4\"],\n\t[\"function\", \"ldc.i4.0\"],\n\t[\"function\", \"ldc.i4.1\"],\n\t[\"function\", \"ldc.i4.2\"],\n\t[\"function\", \"ldc.i4.3\"],\n\t[\"function\", \"ldc.i4.4\"],\n\t[\"function\", \"ldc.i4.5\"],\n\t[\"function\", \"ldc.i4.6\"],\n\t[\"function\", \"ldc.i4.7\"],\n\t[\"function\", \"ldc.i4.8\"],\n\t[\"function\", \"ldc.i4.m1\"],\n\t[\"function\", \"ldc.i4.M1\"],\n\t[\"function\", \"ldc.i4.s\"],\n\t[\"function\", \"ldc.i8\"],\n\t[\"function\", \"ldc.r4\"],\n\t[\"function\", \"ldc.r8\"],\n\t[\"function\", \"ldelem\"],\n\t[\"function\", \"ldelem.i\"],\n\t[\"function\", \"ldelem.i1\"],\n\t[\"function\", \"ldelem.i2\"],\n\t[\"function\", \"ldelem.i4\"],\n\t[\"function\", \"ldelem.i8\"],\n\t[\"function\", \"ldelem.r4\"],\n\t[\"function\", \"ldelem.r8\"],\n\t[\"function\", \"ldelem.ref\"],\n\t[\"function\", \"ldelem.u1\"],\n\t[\"function\", \"ldelem.u2\"],\n\t[\"function\", \"ldelem.u4\"],\n\t[\"function\", \"ldelem.u8\"],\n\t[\"function\", \"ldelema\"],\n\t[\"function\", \"ldfld\"],\n\t[\"function\", \"ldflda\"],\n\t[\"function\", \"ldftn\"],\n\t[\"function\", \"ldind.i\"],\n\t[\"function\", \"ldind.i1\"],\n\t[\"function\", \"ldind.i2\"],\n\t[\"function\", \"ldind.i4\"],\n\t[\"function\", \"ldind.i8\"],\n\t[\"function\", \"ldind.r4\"],\n\t[\"function\", \"ldind.r8\"],\n\t[\"function\", \"ldind.ref\"],\n\t[\"function\", \"ldind.u1\"],\n\t[\"function\", \"ldind.u2\"],\n\t[\"function\", \"ldind.u4\"],\n\t[\"function\", \"ldind.u8\"],\n\t[\"function\", \"ldlen\"],\n\t[\"function\", \"ldloc\"],\n\t[\"function\", \"ldloc.0\"],\n\t[\"function\", \"ldloc.1\"],\n\t[\"function\", \"ldloc.2\"],\n\t[\"function\", \"ldloc.3\"],\n\t[\"function\", \"ldloc.s\"],\n\t[\"function\", \"ldloca\"],\n\t[\"function\", \"ldloca.s\"],\n\t[\"function\", \"ldnull\"],\n\t[\"function\", \"ldobj\"],\n\t[\"function\", \"ldsfld\"],\n\t[\"function\", \"ldsflda\"],\n\t[\"function\", \"ldstr\"],\n\t[\"function\", \"ldtoken\"],\n\t[\"function\", \"ldvirtftn\"],\n\t[\"function\", \"leave\"],\n\t[\"function\", \"leave.s\"],\n\t[\"function\", \"localloc\"],\n\t[\"function\", \"mkrefany\"],\n\t[\"function\", \"mul\"],\n\t[\"function\", \"mul.ovf\"],\n\t[\"function\", \"mul.ovf.un\"],\n\t[\"function\", \"neg\"],\n\t[\"function\", \"newarr\"],\n\t[\"function\", \"newobj\"],\n\t[\"function\", \"nop\"],\n\t[\"function\", \"not\"],\n\t[\"function\", \"or\"],\n\t[\"function\", \"pop\"],\n\t[\"function\", \"refanytype\"],\n\t[\"function\", \"refanyval\"],\n\t[\"function\", \"rem\"],\n\t[\"function\", \"rem.un\"],\n\t[\"function\", \"ret\"],\n\t[\"function\", \"rethrow\"],\n\t[\"function\", \"shl\"],\n\t[\"function\", \"shr\"],\n\t[\"function\", \"shr.un\"],\n\t[\"function\", \"sizeof\"],\n\t[\"function\", \"starg\"],\n\t[\"function\", \"starg.s\"],\n\t[\"function\", \"stelem\"],\n\t[\"function\", \"stelem.i\"],\n\t[\"function\", \"stelem.i1\"],\n\t[\"function\", \"stelem.i2\"],\n\t[\"function\", \"stelem.i4\"],\n\t[\"function\", \"stelem.i8\"],\n\t[\"function\", \"stelem.r4\"],\n\t[\"function\", \"stelem.r8\"],\n\t[\"function\", \"stelem.ref\"],\n\t[\"function\", \"stfld\"],\n\t[\"function\", \"stind.i\"],\n\t[\"function\", \"stind.i1\"],\n\t[\"function\", \"stind.i2\"],\n\t[\"function\", \"stind.i4\"],\n\t[\"function\", \"stind.i8\"],\n\t[\"function\", \"stind.r4\"],\n\t[\"function\", \"stind.r8\"],\n\t[\"function\", \"stind.ref\"],\n\t[\"function\", \"stloc\"],\n\t[\"function\", \"stloc.0\"],\n\t[\"function\", \"stloc.1\"],\n\t[\"function\", \"stloc.2\"],\n\t[\"function\", \"stloc.3\"],\n\t[\"function\", \"stloc.s\"],\n\t[\"function\", \"stobj\"],\n\t[\"function\", \"stsfld\"],\n\t[\"function\", \"sub\"],\n\t[\"function\", \"sub.ovf\"],\n\t[\"function\", \"sub.ovf.un\"],\n\t[\"function\", \"switch\"],\n\t[\"function\", \"throw\"],\n\t[\"function\", \"alignment\"],\n\t[\"function\", \"unbox\"],\n\t[\"function\", \"unbox.any\"],\n\t[\"function\", \"xor\"]\n]\n\n----------------------------------------------------\n\nTests instruction names\n"
  },
  {
    "path": "tests/languages/cil/keywords.test",
    "content": "abstract\nansi\nassembly\nauto\nautochar\nbeforefieldinit\nbool\nbstr\nbyvalstr\ncil\nchar\nclass\ncurrency\ndate\ndecimal\ndefault\nenum\nerror\nexplicit\nextends\nextern\nfamandassem\nfamily\nfamorassem\nfinal\nfloat32\nfloat64\nhidebysig\niant\nidispatch\nimport\ninitonly\ninstance\nint\nint16\nint32\nint64\nint8\nuint\nuint16\nuint32\nuint64\nuint8\ninterface\niunknown\nlpstr\nlpstruct\nlptstr\nlpwstr\nmanaged\nnativeType\nnested\nnewslot\nobjectref\npinvokeimpl\nprivate\nprivatescope\npublic\nreqsecobj\nrtspecialname\nsealed\nsequential\nserializable\nspecialname\nstatic\nstring\nstruct\nsyschar\ntbstr\nunicode\nunmanagedexp\nunsigned\nvalue\nvariant\nvirtual\nvoid\n\n--------------------------------------------------------\n\n[\n\t[ \"keyword\", \"abstract\" ],\n\t[ \"keyword\", \"ansi\" ],\n\t[ \"keyword\", \"assembly\" ],\n\t[ \"keyword\", \"auto\" ],\n\t[ \"keyword\", \"autochar\" ],\n\t[ \"keyword\", \"beforefieldinit\" ],\n\t[ \"keyword\", \"bool\" ],\n\t[ \"keyword\", \"bstr\" ],\n\t[ \"keyword\", \"byvalstr\" ],\n\t[ \"keyword\", \"cil\" ],\n\t[ \"keyword\", \"char\" ],\n\t[ \"keyword\", \"class\" ],\n\t[ \"keyword\", \"currency\" ],\n\t[ \"keyword\", \"date\" ],\n\t[ \"keyword\", \"decimal\" ],\n\t[ \"keyword\", \"default\" ],\n\t[ \"keyword\", \"enum\" ],\n\t[ \"keyword\", \"error\" ],\n\t[ \"keyword\", \"explicit\" ],\n\t[ \"keyword\", \"extends\" ],\n\t[ \"keyword\", \"extern\" ],\n\t[ \"keyword\", \"famandassem\" ],\n\t[ \"keyword\", \"family\" ],\n\t[ \"keyword\", \"famorassem\" ],\n\t[ \"keyword\", \"final\" ],\n\t[ \"keyword\", \"float32\" ],\n\t[ \"keyword\", \"float64\" ],\n\t[ \"keyword\", \"hidebysig\" ],\n\t[ \"keyword\", \"iant\" ],\n\t[ \"keyword\", \"idispatch\" ],\n\t[ \"keyword\", \"import\" ],\n\t[ \"keyword\", \"initonly\" ],\n\t[ \"keyword\", \"instance\" ],\n\t[ \"keyword\", \"int\" ],\n\t[ \"keyword\", \"int16\" ],\n\t[ \"keyword\", \"int32\" ],\n\t[ \"keyword\", \"int64\" ],\n\t[ \"keyword\", \"int8\" ],\n\t[ \"keyword\", \"uint\" ],\n\t[ \"keyword\", \"uint16\" ],\n\t[ \"keyword\", \"uint32\" ],\n\t[ \"keyword\", \"uint64\" ],\n\t[ \"keyword\", \"uint8\" ],\n\t[ \"keyword\", \"interface\" ],\n\t[ \"keyword\", \"iunknown\" ],\n\t[ \"keyword\", \"lpstr\" ],\n\t[ \"keyword\", \"lpstruct\" ],\n\t[ \"keyword\", \"lptstr\" ],\n\t[ \"keyword\", \"lpwstr\" ],\n\t[ \"keyword\", \"managed\" ],\n\t[ \"keyword\", \"nativeType\" ],\n\t[ \"keyword\", \"nested\" ],\n\t[ \"keyword\", \"newslot\" ],\n\t[ \"keyword\", \"objectref\" ],\n\t[ \"keyword\", \"pinvokeimpl\" ],\n\t[ \"keyword\", \"private\" ],\n\t[ \"keyword\", \"privatescope\" ],\n\t[ \"keyword\", \"public\" ],\n\t[ \"keyword\", \"reqsecobj\" ],\n\t[ \"keyword\", \"rtspecialname\" ],\n\t[ \"keyword\", \"sealed\" ],\n\t[ \"keyword\", \"sequential\" ],\n\t[ \"keyword\", \"serializable\" ],\n\t[ \"keyword\", \"specialname\" ],\n\t[ \"keyword\", \"static\" ],\n\t[ \"keyword\", \"string\" ],\n\t[ \"keyword\", \"struct\" ],\n\t[ \"keyword\", \"syschar\" ],\n\t[ \"keyword\", \"tbstr\" ],\n\t[ \"keyword\", \"unicode\" ],\n\t[ \"keyword\", \"unmanagedexp\" ],\n\t[ \"keyword\", \"unsigned\" ],\n\t[ \"keyword\", \"value\" ],\n\t[ \"keyword\", \"variant\" ],\n\t[ \"keyword\", \"virtual\" ],\n\t[ \"keyword\", \"void\"]\n]\n\n--------------------------------------------------------\n\nTests keywords\n"
  },
  {
    "path": "tests/languages/cil/number_feature.test",
    "content": "0x0\n0xFF.5F\n-0x1\n-0xFF.5F\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0x0\"],\n\t[\"number\", \"0xFF.5F\"],\n\t\"\\r\\n-\", [\"number\", \"0x1\"],\n\t\"\\r\\n-\", [\"number\", \"0xFF.5F\"]\n]\n"
  },
  {
    "path": "tests/languages/cil/punctuation_feature.test",
    "content": "( ) [ ] { }\n; , : =\n\nIL_001f\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"=\"],\n\n\t[\"punctuation\", \"IL_001f\"]\n]\n"
  },
  {
    "path": "tests/languages/cil/strings.test",
    "content": "\"testing! £$%^&*\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"testing! £$%^&*\\\"\"]\n]\n\n----------------------------------------------------\n\nTests strings.\n"
  },
  {
    "path": "tests/languages/cilkc/cilk_keywords_feature.test",
    "content": "cilk_for()\ncilk_for ()\n\ncilk_spawn f();\ncilk_spawn {}\ncilk_spawn{}\n\ncilk_sync;\n\ncilk_scope {}\ncilk_scope{}\n\nint cilk_reducer() x;\nint cilk_reducer () x;\n\n----------------------------------------------------\n\n[\n\t[\"parallel-keyword\", \"cilk_for\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\t[\"parallel-keyword\", \"cilk_for\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\n\t[\"parallel-keyword\", \"cilk_spawn\"],\n\t[\"function\", \"f\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"parallel-keyword\", \"cilk_spawn\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"parallel-keyword\", \"cilk_spawn\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"parallel-keyword\", \"cilk_sync\"], [\"punctuation\", \";\"],\n\n\t[\"parallel-keyword\", \"cilk_scope\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"parallel-keyword\", \"cilk_scope\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"int\"],\n\t[\"parallel-keyword\", \"cilk_reducer\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t\" x\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"int\"],\n\t[\"parallel-keyword\", \"cilk_reducer\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t\" x\",\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nCheck Cilk keywords.\n"
  },
  {
    "path": "tests/languages/cilkcpp/cilk_keywords_feature.test",
    "content": "cilk_for()\ncilk_for ()\n\ncilk_spawn f();\ncilk_spawn {}\ncilk_spawn{}\n\ncilk_sync;\n\ncilk_scope {}\ncilk_scope{}\n\nint cilk_reducer() x;\nint cilk_reducer () x;\n\n----------------------------------------------------\n\n[\n\t[\"parallel-keyword\", \"cilk_for\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\t[\"parallel-keyword\", \"cilk_for\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\n\t[\"parallel-keyword\", \"cilk_spawn\"],\n\t[\"function\", \"f\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"parallel-keyword\", \"cilk_spawn\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"parallel-keyword\", \"cilk_spawn\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"parallel-keyword\", \"cilk_sync\"], [\"punctuation\", \";\"],\n\n\t[\"parallel-keyword\", \"cilk_scope\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"parallel-keyword\", \"cilk_scope\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"int\"],\n\t[\"parallel-keyword\", \"cilk_reducer\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t\" x\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"int\"],\n\t[\"parallel-keyword\", \"cilk_reducer\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t\" x\",\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nCheck Cilk keywords.\n"
  },
  {
    "path": "tests/languages/clike/boolean_feature.test",
    "content": "true; false;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"], [\"punctuation\", \";\"],\r\n\t[\"boolean\", \"false\"], [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/clike/class-name_feature.test",
    "content": "class Foo\r\ninterface bar\r\nextends Foo\r\nimplements bar\r\ntrait Foo\r\ninstanceof \\bar\r\nnew \\Foo\r\ncatch (bar)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"class \",\r\n\t[\"class-name\", [\r\n\t\t\"Foo\"\r\n\t]],\r\n\t\"\\r\\ninterface \",\r\n\t[\"class-name\", [\r\n\t\t\"bar\"\r\n\t]],\r\n\t\"\\r\\nextends \",\r\n\t[\"class-name\", [\r\n\t\t\"Foo\"\r\n\t]],\r\n\t\"\\r\\nimplements \",\r\n\t[\"class-name\", [\r\n\t\t\"bar\"\r\n\t]],\r\n\t\"\\r\\ntrait \",\r\n\t[\"class-name\", [\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"keyword\", \"instanceof\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"bar\"\r\n\t]],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t\"bar\"\r\n\t]],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names."
  },
  {
    "path": "tests/languages/clike/comment_feature.test",
    "content": "// foobar\r\n/**/\r\n/* foo\r\nbar */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// foobar\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments."
  },
  {
    "path": "tests/languages/clike/function_feature.test",
    "content": "foo()\r\nfoo_bar()\r\nf42()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo_bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"f42\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/clike/issue1340.test",
    "content": "/*\r\n//\r\n*/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/*\\r\\n//\\r\\n*/\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nNon-regression test for inline comments inside multiline comments. See #1340"
  },
  {
    "path": "tests/languages/clike/keyword_feature.test",
    "content": "if; else; while; do; for;\r\nreturn; in; instanceof; function; new;\r\ntry; throw; catch; finally; null;\r\nbreak; continue;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"instanceof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"function\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"try\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"throw\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"catch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"finally\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"null\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/clike/number_feature.test",
    "content": "42\r\n3.14159\r\n4e10\r\n2.1e-10\r\n0.4e+2\r\n0xbabe\r\n0xBABE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"4e10\"],\r\n\t[\"number\", \"2.1e-10\"],\r\n\t[\"number\", \"0.4e+2\"],\r\n\t[\"number\", \"0xbabe\"],\r\n\t[\"number\", \"0xBABE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal numbers and hexadecimal numbers."
  },
  {
    "path": "tests/languages/clike/operator_feature.test",
    "content": "- + -- ++\r\n< <= > >=\r\n= == ===\r\n! != !==\r\n& && | ||\r\n? * / ~ ^ %\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"-\"], [\"operator\", \"+\"], [\"operator\", \"--\"], [\"operator\", \"++\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"===\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"], [\"operator\", \"!==\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"|\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"~\"], [\"operator\", \"^\"], [\"operator\", \"%\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/clike/string_feature.test",
    "content": "\"\"\r\n''\r\n\"f\\\"oo\"\r\n'b\\'ar'\r\n\"foo\\\r\nbar\"\r\n'foo\\\r\nbar'\r\n\"foo /* comment */ bar\"\r\n'foo // bar'\r\n'foo // bar' //comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"\\\"f\\\\\\\"oo\\\"\"],\r\n\t[\"string\", \"'b\\\\'ar'\"],\r\n\t[\"string\", \"\\\"foo\\\\\\r\\nbar\\\"\"],\r\n\t[\"string\", \"'foo\\\\\\r\\nbar'\"],\r\n\t[\"string\", \"\\\"foo /* comment */ bar\\\"\"],\r\n\t[\"string\", \"'foo // bar'\"],\r\n\t[\"string\", \"'foo // bar'\"],\r\n\t[\"comment\", \"//comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for empty strings, single-line strings and\r\nmulti-line strings, both single-quoted and double-quoted."
  },
  {
    "path": "tests/languages/clojure/boolean_feature.test",
    "content": "false\ntrue\nnil\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"false\"],\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"nil\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans."
  },
  {
    "path": "tests/languages/clojure/comment_feature.test",
    "content": ";; this is comment\n; this is another comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \";; this is comment\"],\n\t[\"comment\", \"; this is another comment\"]\n]\n\n----------------------------------------------------\n\nChecks for comments."
  },
  {
    "path": "tests/languages/clojure/function_feature.test",
    "content": "(foo args)\n\n; not a function\n'(a b c)\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"], [\"function\", \"foo\"], \" args\", [\"punctuation\", \")\"],\n\n\t[\"comment\", \"; not a function\"],\n\t\"\\r\\n'\", [\"punctuation\", \"(\"], \"a b c\", [\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/clojure/keyword_feature.test",
    "content": "(def)\n(if)\n(do)\n(let)\n(var)\n(fn)\n(quote)\n(->>)\n(->)\n(loop)\n(recur)\n(throw)\n(try)\n(monitor-enter)\n(.)\n(new)\n(set!)\n(defn)\n(defn-)\n(defmacro)\n(defmulti)\n(defmethod)\n(defstruct)\n(defonce)\n(declare)\n(definline)\n(definterface)\n(defprotocol)\n(defrecord)\n(deftype)\n(defproject)\n(ns)\n(*)\n(+)\n(-)\n(/)\n(<)\n(<=)\n(>=)\n(=)\n(==)\n(..)\n(>)\n(accessor)\n(agent)\n(agent-errors)\n(aget)\n(alength)\n(all-ns)\n(alter)\n(and)\n(append-child)\n(apply)\n(array-map)\n(aset)\n(aset-boolean)\n(aset-byte)\n(aset-char)\n(aset-double)\n(aset-float)\n(aset-int)\n(aset-long)\n(aset-short)\n(assert)\n(assoc)\n(await)\n(await-for)\n(bean)\n(binding)\n(bit-and)\n(bit-not)\n(branch?)\n(contains?)\n(end?)\n(every?)\n(false?)\n(identical?)\n(instance?)\n(keyword?)\n(list*)\n(not-any?)\n(true?)\n(zero?)\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"], [\"keyword\", \"def\"],           [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"if\"],            [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"do\"],            [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"let\"],\t          [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"var\"],           [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"fn\"],            [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"quote\"],         [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"->>\"],           [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"->\"],            [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"loop\"],          [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"recur\"],         [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"throw\"],         [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"try\"],           [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"monitor-enter\"], [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \".\"],             [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"new\"],           [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"set!\"],          [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"defn\"],          [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"defn-\"],         [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"defmacro\"],      [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"defmulti\"],      [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"defmethod\"],     [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"defstruct\"],     [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"defonce\"],       [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"declare\"],       [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"definline\"],     [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"definterface\"],  [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"defprotocol\"],   [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"defrecord\"],     [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"deftype\"],       [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"defproject\"],    [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"ns\"],            [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"*\"],             [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"+\"],             [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"-\"],             [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"/\"],             [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"<\"],             [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"<=\"],            [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \">=\"],            [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"=\"],             [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"==\"],            [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"..\"],            [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \">\"],             [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"accessor\"],      [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"agent\"],         [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"agent-errors\"],  [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"aget\"],          [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"alength\"],       [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"all-ns\"],        [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"alter\"],         [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"and\"],           [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"append-child\"],  [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"apply\"],         [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"array-map\"],     [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"aset\"],          [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"aset-boolean\"],  [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"aset-byte\"],     [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"aset-char\"],     [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"aset-double\"],   [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"aset-float\"],    [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"aset-int\"],      [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"aset-long\"],     [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"aset-short\"],    [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"assert\"],        [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"assoc\"],         [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"await\"],         [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"await-for\"],     [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"bean\"],          [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"binding\"],       [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"bit-and\"],       [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"bit-not\"],       [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"branch?\"],       [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"contains?\"],     [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"end?\"],          [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"every?\"],        [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"false?\"],        [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"identical?\"],    [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"instance?\"],     [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"keyword?\"],      [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"list*\"],         [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"not-any?\"],      [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"true?\"],         [\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"], [\"keyword\", \"zero?\"],         [\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/clojure/number_feature.test",
    "content": "123\n01234\n0xFFF\n2r0101011\n8r52\n36r16\n1.0\n1M\n2/3\n0.6666666666666666\n36786883868216818816N\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"123\"],\n\t[\"number\", \"01234\"],\n\t[\"number\", \"0xFFF\"],\n\t[\"number\", \"2r0101011\"],\n\t[\"number\", \"8r52\"],\n\t[\"number\", \"36r16\"],\n\t[\"number\", \"1.0\"],\n\t[\"number\", \"1M\"],\n\t[\"number\", \"2/3\"],\n\t[\"number\", \"0.6666666666666666\"],\n\t[\"number\", \"36786883868216818816N\"]\n]\n"
  },
  {
    "path": "tests/languages/clojure/operator_feature.test",
    "content": "# @ ^ ` ~\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"#\"],\n\t[\"operator\", \"@\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"`\"],\n\t[\"operator\", \"~\"]\n]\n"
  },
  {
    "path": "tests/languages/clojure/punctuation_feature.test",
    "content": "{ } [ ] ( )\n,\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \",\"]\n]\n"
  },
  {
    "path": "tests/languages/clojure/string_feature.test",
    "content": "\"\"\n\"Fo\\\"obar\"\n\"multi-line\nstring\"\n\\NewLine\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"Fo\\\\\\\"obar\\\"\"],\n\t[\"string\", \"\\\"multi-line\\r\\nstring\\\"\"],\n\t[\"char\", \"\\\\NewLine\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/clojure/symbol_feature.test",
    "content": ":foo\n:foo/bar-baz\n::foo\n\n----------------------------------------------------\n\n[\n\t[\"symbol\", \":foo\"],\n\t[\"symbol\", \":foo/bar-baz\"],\n\t[\"symbol\", \"::foo\"]\n]\n"
  },
  {
    "path": "tests/languages/cmake/boolean_feature.test",
    "content": "ON\r\nOFF\r\nTRUE\r\nFALSE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"ON\"],\r\n\t[\"boolean\", \"OFF\"],\r\n\t[\"boolean\", \"TRUE\"],\r\n\t[\"boolean\", \"FALSE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/cmake/comment_feature.test",
    "content": "# standalone\nadd_library() # after code\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"# standalone\"],\n\t[\"keyword\", \"add_library\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"], [\"comment\", \"# after code\"]\n]\n\n----------------------------------------------------\n\nChecks for comments."
  },
  {
    "path": "tests/languages/cmake/function_feature.test",
    "content": "foobar()\nbaz()\nFoobar()\nFOOBAR()\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"foobar\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\t[\"function\", \"baz\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\t[\"function\", \"Foobar\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\t[\"function\", \"FOOBAR\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for functions."
  },
  {
    "path": "tests/languages/cmake/inserted_feature.test",
    "content": "foo::bar\nfoo::foo\nFoo::Bar\n\n----------------------------------------------------\n\n[\n\t[\"inserted\", \"foo::bar\"],\n\t[\"inserted\", \"foo::foo\"],\n\t[\"inserted\", \"Foo::Bar\"]\n]\n\n----------------------------------------------------\n\nChecks for all namespaces."
  },
  {
    "path": "tests/languages/cmake/keyword_feature.test",
    "content": "add_compile_definitions()\r\nadd_compile_options()\r\nadd_custom_command()\r\nadd_custom_target()\r\nadd_definitions()\r\nadd_dependencies()\r\nadd_executable()\r\nadd_library()\r\nadd_link_options()\r\nadd_subdirectory()\r\nadd_test()\r\naux_source_directory()\r\nbreak()\r\nbuild_command()\r\nbuild_name()\r\ncmake_host_system_information()\r\ncmake_minimum_required()\r\ncmake_parse_arguments()\r\ncmake_policy()\r\nconfigure_file()\r\ncontinue()\r\ncreate_test_sourcelist()\r\nctest_build()\r\nctest_configure()\r\nctest_coverage()\r\nctest_empty_binary_directory()\r\nctest_memcheck()\r\nctest_read_custom_files()\r\nctest_run_script()\r\nctest_sleep()\r\nctest_start()\r\nctest_submit()\r\nctest_test()\r\nctest_update()\r\nctest_upload()\r\ndefine_property()\r\nelse()\r\nelseif()\r\nenable_language()\r\nenable_testing()\r\nendforeach()\r\nendfunction()\r\nendif()\r\nendmacro()\r\nendwhile()\r\nexec_program()\r\nexecute_process()\r\nexport()\r\nexport_library_dependencies()\r\nfile()\r\nfind_file()\r\nfind_library()\r\nfind_package()\r\nfind_path()\r\nfind_program()\r\nfltk_wrap_ui()\r\nforeach()\r\nfunction()\r\nget_cmake_property()\r\nget_directory_property()\r\nget_filename_component()\r\nget_property()\r\nget_source_file_property()\r\nget_target_property()\r\nget_test_property()\r\nif()\r\ninclude()\r\ninclude_directories()\r\ninclude_external_msproject()\r\ninclude_guard()\r\ninclude_regular_expression()\r\ninstall()\r\ninstall_files()\r\ninstall_programs()\r\ninstall_targets()\r\nlink_directories()\r\nlink_libraries()\r\nlist()\r\nload_cache()\r\nload_command()\r\nmacro()\r\nmake_directory()\r\nmark_as_advanced()\r\nmath()\r\nmessage()\r\noption()\r\noutput_required_files()\r\nproject()\r\nqt_wrap_cpp()\r\nqt_wrap_ui()\r\nremove()\r\nremove_definitions()\r\nreturn()\r\nseparate_arguments()\r\nset()\r\nset_directory_properties()\r\nset_property()\r\nset_source_files_properties()\r\nset_target_properties()\r\nset_tests_properties()\r\nsite_name()\r\nsource_group()\r\nstring()\r\nsubdir_depends()\r\nsubdirs()\r\ntarget_compile_definitions()\r\ntarget_compile_features()\r\ntarget_compile_options()\r\ntarget_include_directories()\r\ntarget_link_directories()\r\ntarget_link_libraries()\r\ntarget_link_options()\r\ntarget_sources()\r\ntry_compile()\r\ntry_run()\r\nunset()\r\nuse_mangled_mesa()\r\nutility_source()\r\nvariable_requires()\r\nvariable_watch()\r\nwhile()\r\nwrite_file()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"add_compile_definitions\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"add_compile_options\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"add_custom_command\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"add_custom_target\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"add_definitions\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"add_dependencies\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"add_executable\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"add_library\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"add_link_options\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"add_subdirectory\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"add_test\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"aux_source_directory\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"build_command\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"build_name\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"cmake_host_system_information\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"cmake_minimum_required\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"cmake_parse_arguments\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"cmake_policy\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"configure_file\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"continue\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"create_test_sourcelist\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_build\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_configure\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_coverage\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_empty_binary_directory\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_memcheck\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_read_custom_files\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_run_script\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_sleep\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_start\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_submit\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_test\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_update\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"ctest_upload\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"define_property\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"elseif\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"enable_language\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"enable_testing\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"endforeach\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"endfunction\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"endif\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"endmacro\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"endwhile\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"exec_program\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"execute_process\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"export\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"export_library_dependencies\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"file\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"find_file\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"find_library\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"find_package\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"find_path\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"find_program\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"fltk_wrap_ui\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"foreach\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"function\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"get_cmake_property\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"get_directory_property\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"get_filename_component\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"get_property\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"get_source_file_property\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"get_target_property\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"get_test_property\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"include\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"include_directories\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"include_external_msproject\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"include_guard\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"include_regular_expression\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"install\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"install_files\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"install_programs\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"install_targets\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"link_directories\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"link_libraries\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"list\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"load_cache\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"load_command\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"macro\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"make_directory\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"mark_as_advanced\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"math\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"message\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"option\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"output_required_files\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"project\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"qt_wrap_cpp\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"qt_wrap_ui\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"remove\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"remove_definitions\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"separate_arguments\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"set\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"set_directory_properties\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"set_property\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"set_source_files_properties\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"set_target_properties\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"set_tests_properties\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"site_name\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"source_group\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"string\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"subdir_depends\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"subdirs\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"target_compile_definitions\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"target_compile_features\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"target_compile_options\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"target_include_directories\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"target_link_directories\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"target_link_libraries\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"target_link_options\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"target_sources\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"try_compile\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"try_run\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"unset\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"use_mangled_mesa\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"utility_source\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"variable_requires\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"variable_watch\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"write_file\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/cmake/namespace_feature.test",
    "content": "PROPERTIES\r\nSHARED\r\nPRIVATE\r\nSTATIC\r\nPUBLIC\r\nINTERFACE\r\nTARGET_OBJECTS\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"namespace\", \"PROPERTIES\"],\r\n\t[\"namespace\", \"SHARED\"],\r\n\t[\"namespace\", \"PRIVATE\"],\r\n\t[\"namespace\", \"STATIC\"],\r\n\t[\"namespace\", \"PUBLIC\"],\r\n\t[\"namespace\", \"INTERFACE\"],\r\n\t[\"namespace\", \"TARGET_OBJECTS\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all namespaces."
  },
  {
    "path": "tests/languages/cmake/number_feature.test",
    "content": "1\n2123\n234234.23423\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"1\"],\n\t[\"number\", \"2123\"],\n\t[\"number\", \"234234.23423\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers."
  },
  {
    "path": "tests/languages/cmake/operator_feature.test",
    "content": "NOT\nAND\nOR\nMATCHES\nLESS\nGREATER\nEQUAL\nSTRLESS\nSTRGREATER\nSTREQUAL\nVERSION_LESS\nVERSION_EQUAL\nVERSION_GREATER\nDEFINED\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"NOT\"],\n\t[\"operator\", \"AND\"],\n\t[\"operator\", \"OR\"],\n\t[\"operator\", \"MATCHES\"],\n\t[\"operator\", \"LESS\"],\n\t[\"operator\", \"GREATER\"],\n\t[\"operator\", \"EQUAL\"],\n\t[\"operator\", \"STRLESS\"],\n\t[\"operator\", \"STRGREATER\"],\n\t[\"operator\", \"STREQUAL\"],\n\t[\"operator\", \"VERSION_LESS\"],\n\t[\"operator\", \"VERSION_EQUAL\"],\n\t[\"operator\", \"VERSION_GREATER\"],\n\t[\"operator\", \"DEFINED\"]\n]\n\n----------------------------------------------------\n\nChecks for all operator."
  },
  {
    "path": "tests/languages/cmake/property_feature.test",
    "content": "WHATEVER_OUTPUT_NAME\r\nWHATEVER_POSTFIX\r\nWHATEVER_CLANG_TIDY\r\nWHATEVER_COMPILER_LAUNCHER\r\nWHATEVER_CPPCHECK\r\nWHATEVER_CPPLINT\r\nWHATEVER_INCLUDE_WHAT_YOU_USE\r\nWHATEVER_VISIBILITY_PRESET\r\nABSTRACT\r\nADDITIONAL_MAKE_CLEAN_FILES\r\nADVANCED\r\nALIASED_TARGET\r\nALLOW_DUPLICATE_CUSTOM_TARGETS\r\nANDROID_ANT_ADDITIONAL_OPTIONS\r\nANDROID_API\r\nANDROID_API_MIN\r\nANDROID_ARCH\r\nANDROID_ASSETS_DIRECTORIES\r\nANDROID_GUI\r\nANDROID_JAR_DEPENDENCIES\r\nANDROID_NATIVE_LIB_DEPENDENCIES\r\nANDROID_NATIVE_LIB_DIRECTORIES\r\nANDROID_PROCESS_MAX\r\nANDROID_PROGUARD\r\nANDROID_PROGUARD_CONFIG_PATH\r\nANDROID_SECURE_PROPS_PATH\r\nANDROID_SKIP_ANT_STEP\r\nANDROID_STL_TYPE\r\nARCHIVE_OUTPUT_DIRECTORY\r\nARCHIVE_OUTPUT_DIRECTORY_WHATEVER\r\nARCHIVE_OUTPUT_NAME\r\nARCHIVE_OUTPUT_NAME_WHATEVER\r\nATTACHED_FILES\r\nATTACHED_FILES_ON_FAIL\r\nAUTOGEN_BUILD_DIR\r\nAUTOGEN_ORIGIN_DEPENDS\r\nAUTOGEN_PARALLEL\r\nAUTOGEN_SOURCE_GROUP\r\nAUTOGEN_TARGETS_FOLDER\r\nAUTOGEN_TARGET_DEPENDS\r\nAUTOMOC\r\nAUTOMOC_COMPILER_PREDEFINES\r\nAUTOMOC_DEPEND_FILTERS\r\nAUTOMOC_EXECUTABLE\r\nAUTOMOC_MACRO_NAMES\r\nAUTOMOC_MOC_OPTIONS\r\nAUTOMOC_SOURCE_GROUP\r\nAUTOMOC_TARGETS_FOLDER\r\nAUTORCC\r\nAUTORCC_EXECUTABLE\r\nAUTORCC_OPTIONS\r\nAUTORCC_OPTIONS\r\nAUTORCC_SOURCE_GROUP\r\nAUTOUIC\r\nAUTOUIC_EXECUTABLE\r\nAUTOUIC_OPTIONS\r\nAUTOUIC_OPTIONS\r\nAUTOUIC_SEARCH_PATHS\r\nBINARY_DIR\r\nBINARY_DIR\r\nBUILDSYSTEM_TARGETS\r\nBUILD_RPATH\r\nBUILD_RPATH_USE_ORIGIN\r\nBUILD_WITH_INSTALL_NAME_DIR\r\nBUILD_WITH_INSTALL_RPATH\r\nBUNDLE\r\nBUNDLE_EXTENSION\r\nCACHE_VARIABLES\r\nCLEAN_NO_CUSTOM\r\nCOMMON_LANGUAGE_RUNTIME\r\nCOMPATIBLE_INTERFACE_BOOL\r\nCOMPATIBLE_INTERFACE_NUMBER_MAX\r\nCOMPATIBLE_INTERFACE_NUMBER_MIN\r\nCOMPATIBLE_INTERFACE_STRING\r\nCOMPILE_DEFINITIONS\r\nCOMPILE_DEFINITIONS\r\nCOMPILE_DEFINITIONS\r\nCOMPILE_DEFINITIONS_WHATEVER\r\nCOMPILE_DEFINITIONS_WHATEVER\r\nCOMPILE_DEFINITIONS_WHATEVER\r\nCOMPILE_FEATURES\r\nCOMPILE_FLAGS\r\nCOMPILE_FLAGS\r\nCOMPILE_OPTIONS\r\nCOMPILE_OPTIONS\r\nCOMPILE_OPTIONS\r\nCOMPILE_PDB_NAME\r\nCOMPILE_PDB_NAME_WHATEVER\r\nCOMPILE_PDB_OUTPUT_DIRECTORY\r\nCOMPILE_PDB_OUTPUT_DIRECTORY_WHATEVER\r\nCOST\r\nCPACK_DESKTOP_SHORTCUTS\r\nCPACK_NEVER_OVERWRITE\r\nCPACK_PERMANENT\r\nCPACK_STARTUP_SHORTCUTS\r\nCPACK_START_MENU_SHORTCUTS\r\nCPACK_WIX_ACL\r\nCROSSCOMPILING_EMULATOR\r\nCUDA_EXTENSIONS\r\nCUDA_PTX_COMPILATION\r\nCUDA_RESOLVE_DEVICE_SYMBOLS\r\nCUDA_SEPARABLE_COMPILATION\r\nCUDA_STANDARD\r\nCUDA_STANDARD_REQUIRED\r\nCXX_EXTENSIONS\r\nCXX_STANDARD\r\nCXX_STANDARD_REQUIRED\r\nC_EXTENSIONS\r\nC_STANDARD\r\nC_STANDARD_REQUIRED\r\nDEBUG_CONFIGURATIONS\r\nDEBUG_POSTFIX\r\nDEFINE_SYMBOL\r\nDEFINITIONS\r\nDEPENDS\r\nDEPLOYMENT_ADDITIONAL_FILES\r\nDEPLOYMENT_REMOTE_DIRECTORY\r\nDISABLED\r\nDISABLED_FEATURES\r\nECLIPSE_EXTRA_CPROJECT_CONTENTS\r\nECLIPSE_EXTRA_NATURES\r\nENABLED_FEATURES\r\nENABLED_LANGUAGES\r\nENABLE_EXPORTS\r\nENVIRONMENT\r\nEXCLUDE_FROM_ALL\r\nEXCLUDE_FROM_ALL\r\nEXCLUDE_FROM_DEFAULT_BUILD\r\nEXCLUDE_FROM_DEFAULT_BUILD_WHATEVER\r\nEXPORT_NAME\r\nEXPORT_PROPERTIES\r\nEXTERNAL_OBJECT\r\nEchoString\r\nFAIL_REGULAR_EXPRESSION\r\nFIND_LIBRARY_USE_LIB32_PATHS\r\nFIND_LIBRARY_USE_LIB64_PATHS\r\nFIND_LIBRARY_USE_LIBX32_PATHS\r\nFIND_LIBRARY_USE_OPENBSD_VERSIONING\r\nFIXTURES_CLEANUP\r\nFIXTURES_REQUIRED\r\nFIXTURES_SETUP\r\nFOLDER\r\nFRAMEWORK\r\nFortran_FORMAT\r\nFortran_FORMAT\r\nFortran_MODULE_DIRECTORY\r\nGENERATED\r\nGENERATOR_FILE_NAME\r\nGENERATOR_IS_MULTI_CONFIG\r\nGHS_INTEGRITY_APP\r\nGHS_NO_SOURCE_GROUP_FILE\r\nGLOBAL_DEPENDS_DEBUG_MODE\r\nGLOBAL_DEPENDS_NO_CYCLES\r\nGNUtoMS\r\nHAS_CXX\r\nHEADER_FILE_ONLY\r\nHELPSTRING\r\nIMPLICIT_DEPENDS_INCLUDE_TRANSFORM\r\nIMPLICIT_DEPENDS_INCLUDE_TRANSFORM\r\nIMPORTED\r\nIMPORTED_COMMON_LANGUAGE_RUNTIME\r\nIMPORTED_CONFIGURATIONS\r\nIMPORTED_GLOBAL\r\nIMPORTED_IMPLIB\r\nIMPORTED_IMPLIB_WHATEVER\r\nIMPORTED_LIBNAME\r\nIMPORTED_LIBNAME_WHATEVER\r\nIMPORTED_LINK_DEPENDENT_LIBRARIES\r\nIMPORTED_LINK_DEPENDENT_LIBRARIES_WHATEVER\r\nIMPORTED_LINK_INTERFACE_LANGUAGES\r\nIMPORTED_LINK_INTERFACE_LANGUAGES_WHATEVER\r\nIMPORTED_LINK_INTERFACE_LIBRARIES\r\nIMPORTED_LINK_INTERFACE_LIBRARIES_WHATEVER\r\nIMPORTED_LINK_INTERFACE_MULTIPLICITY\r\nIMPORTED_LINK_INTERFACE_MULTIPLICITY_WHATEVER\r\nIMPORTED_LOCATION\r\nIMPORTED_LOCATION_WHATEVER\r\nIMPORTED_NO_SONAME\r\nIMPORTED_NO_SONAME_WHATEVER\r\nIMPORTED_OBJECTS\r\nIMPORTED_OBJECTS_WHATEVER\r\nIMPORTED_SONAME\r\nIMPORTED_SONAME_WHATEVER\r\nIMPORT_PREFIX\r\nIMPORT_SUFFIX\r\nINCLUDE_DIRECTORIES\r\nINCLUDE_DIRECTORIES\r\nINCLUDE_DIRECTORIES\r\nINCLUDE_REGULAR_EXPRESSION\r\nINSTALL_NAME_DIR\r\nINSTALL_RPATH\r\nINSTALL_RPATH_USE_LINK_PATH\r\nINTERFACE_AUTOUIC_OPTIONS\r\nINTERFACE_COMPILE_DEFINITIONS\r\nINTERFACE_COMPILE_FEATURES\r\nINTERFACE_COMPILE_OPTIONS\r\nINTERFACE_INCLUDE_DIRECTORIES\r\nINTERFACE_LINK_DEPENDS\r\nINTERFACE_LINK_DIRECTORIES\r\nINTERFACE_LINK_LIBRARIES\r\nINTERFACE_LINK_OPTIONS\r\nINTERFACE_POSITION_INDEPENDENT_CODE\r\nINTERFACE_SOURCES\r\nINTERFACE_SYSTEM_INCLUDE_DIRECTORIES\r\nINTERPROCEDURAL_OPTIMIZATION\r\nINTERPROCEDURAL_OPTIMIZATION\r\nINTERPROCEDURAL_OPTIMIZATION_WHATEVER\r\nINTERPROCEDURAL_OPTIMIZATION_WHATEVER\r\nIN_TRY_COMPILE\r\nIOS_INSTALL_COMBINED\r\nJOB_POOLS\r\nJOB_POOL_COMPILE\r\nJOB_POOL_LINK\r\nKEEP_EXTENSION\r\nLABELS\r\nLABELS\r\nLABELS\r\nLABELS\r\nLANGUAGE\r\nLIBRARY_OUTPUT_DIRECTORY\r\nLIBRARY_OUTPUT_DIRECTORY_WHATEVER\r\nLIBRARY_OUTPUT_NAME\r\nLIBRARY_OUTPUT_NAME_WHATEVER\r\nLINKER_LANGUAGE\r\nLINK_DEPENDS\r\nLINK_DEPENDS_NO_SHARED\r\nLINK_DIRECTORIES\r\nLINK_DIRECTORIES\r\nLINK_FLAGS\r\nLINK_FLAGS_WHATEVER\r\nLINK_INTERFACE_LIBRARIES\r\nLINK_INTERFACE_LIBRARIES_WHATEVER\r\nLINK_INTERFACE_MULTIPLICITY\r\nLINK_INTERFACE_MULTIPLICITY_WHATEVER\r\nLINK_LIBRARIES\r\nLINK_OPTIONS\r\nLINK_OPTIONS\r\nLINK_SEARCH_END_STATIC\r\nLINK_SEARCH_START_STATIC\r\nLINK_WHAT_YOU_USE\r\nLISTFILE_STACK\r\nLOCATION\r\nLOCATION\r\nLOCATION_WHATEVER\r\nMACOSX_BUNDLE\r\nMACOSX_BUNDLE_INFO_PLIST\r\nMACOSX_FRAMEWORK_INFO_PLIST\r\nMACOSX_PACKAGE_LOCATION\r\nMACOSX_RPATH\r\nMACROS\r\nMANUALLY_ADDED_DEPENDENCIES\r\nMAP_IMPORTED_CONFIG_WHATEVER\r\nMEASUREMENT\r\nMODIFIED\r\nNAME\r\nNO_SONAME\r\nNO_SYSTEM_FROM_IMPORTED\r\nOBJECT_DEPENDS\r\nOBJECT_OUTPUTS\r\nOSX_ARCHITECTURES\r\nOSX_ARCHITECTURES_WHATEVER\r\nOUTPUT_NAME\r\nOUTPUT_NAME_WHATEVER\r\nPACKAGES_FOUND\r\nPACKAGES_NOT_FOUND\r\nPARENT_DIRECTORY\r\nPASS_REGULAR_EXPRESSION\r\nPDB_NAME\r\nPDB_NAME_WHATEVER\r\nPDB_OUTPUT_DIRECTORY\r\nPDB_OUTPUT_DIRECTORY_WHATEVER\r\nPOSITION_INDEPENDENT_CODE\r\nPOST_INSTALL_SCRIPT\r\nPREDEFINED_TARGETS_FOLDER\r\nPREFIX\r\nPRE_INSTALL_SCRIPT\r\nPRIVATE_HEADER\r\nPROCESSORS\r\nPROCESSOR_AFFINITY\r\nPROJECT_LABEL\r\nPUBLIC_HEADER\r\nREPORT_UNDEFINED_PROPERTIES\r\nREQUIRED_FILES\r\nRESOURCE\r\nRESOURCE_LOCK\r\nRULE_LAUNCH_COMPILE\r\nRULE_LAUNCH_COMPILE\r\nRULE_LAUNCH_COMPILE\r\nRULE_LAUNCH_CUSTOM\r\nRULE_LAUNCH_CUSTOM\r\nRULE_LAUNCH_CUSTOM\r\nRULE_LAUNCH_LINK\r\nRULE_LAUNCH_LINK\r\nRULE_LAUNCH_LINK\r\nRULE_MESSAGES\r\nRUNTIME_OUTPUT_DIRECTORY\r\nRUNTIME_OUTPUT_DIRECTORY_WHATEVER\r\nRUNTIME_OUTPUT_NAME\r\nRUNTIME_OUTPUT_NAME_WHATEVER\r\nRUN_SERIAL\r\nSKIP_AUTOGEN\r\nSKIP_AUTOMOC\r\nSKIP_AUTORCC\r\nSKIP_AUTOUIC\r\nSKIP_BUILD_RPATH\r\nSKIP_RETURN_CODE\r\nSOURCES\r\nSOURCE_DIR\r\nSOURCE_DIR\r\nSOVERSION\r\nSTATIC_LIBRARY_FLAGS\r\nSTATIC_LIBRARY_FLAGS_WHATEVER\r\nSTATIC_LIBRARY_OPTIONS\r\nSTRINGS\r\nSUBDIRECTORIES\r\nSUFFIX\r\nSYMBOLIC\r\nTARGET_ARCHIVES_MAY_BE_SHARED_LIBS\r\nTARGET_MESSAGES\r\nTARGET_SUPPORTS_SHARED_LIBS\r\nTESTS\r\nTEST_INCLUDE_FILE\r\nTEST_INCLUDE_FILES\r\nTIMEOUT\r\nTIMEOUT_AFTER_MATCH\r\nTYPE\r\nTYPE\r\nUSE_FOLDERS\r\nVALUE\r\nVARIABLES\r\nVERSION\r\nVISIBILITY_INLINES_HIDDEN\r\nVS_CONFIGURATION_TYPE\r\nVS_COPY_TO_OUT_DIR\r\nVS_CSHARP_WHATEVER\r\nVS_DEBUGGER_COMMAND\r\nVS_DEBUGGER_COMMAND_ARGUMENTS\r\nVS_DEBUGGER_ENVIRONMENT\r\nVS_DEBUGGER_WORKING_DIRECTORY\r\nVS_DEPLOYMENT_CONTENT\r\nVS_DEPLOYMENT_LOCATION\r\nVS_DOTNET_REFERENCEPROP_WHATEVER\r\nVS_DOTNET_REFERENCES\r\nVS_DOTNET_REFERENCES_COPY_LOCAL\r\nVS_DOTNET_REFERENCE_WHATEVER\r\nVS_GLOBAL_WHATEVER\r\nVS_GLOBAL_KEYWORD\r\nVS_GLOBAL_PROJECT_TYPES\r\nVS_GLOBAL_ROOTNAMESPACE\r\nVS_GLOBAL_SECTION_POST_WHATEVER\r\nVS_GLOBAL_SECTION_PRE_WHATEVER\r\nVS_INCLUDE_IN_VSIX\r\nVS_IOT_STARTUP_TASK\r\nVS_KEYWORD\r\nVS_RESOURCE_GENERATOR\r\nVS_SCC_AUXPATH\r\nVS_SCC_LOCALPATH\r\nVS_SCC_PROJECTNAME\r\nVS_SCC_PROVIDER\r\nVS_SDK_REFERENCES\r\nVS_SHADER_DISABLE_OPTIMIZATIONS\r\nVS_SHADER_ENABLE_DEBUG\r\nVS_SHADER_ENTRYPOINT\r\nVS_SHADER_FLAGS\r\nVS_SHADER_MODEL\r\nVS_SHADER_OBJECT_FILE_NAME\r\nVS_SHADER_OUTPUT_HEADER_FILE\r\nVS_SHADER_TYPE\r\nVS_SHADER_VARIABLE_NAME\r\nVS_STARTUP_PROJECT\r\nVS_TOOL_OVERRIDE\r\nVS_USER_PROPS\r\nVS_WINRT_COMPONENT\r\nVS_WINRT_EXTENSIONS\r\nVS_WINRT_REFERENCES\r\nVS_XAML_TYPE\r\nWILL_FAIL\r\nWIN32_EXECUTABLE\r\nWINDOWS_EXPORT_ALL_SYMBOLS\r\nWORKING_DIRECTORY\r\nWRAP_EXCLUDE\r\nXCODE_ATTRIBUTE_WHATEVER\r\nXCODE_EMIT_EFFECTIVE_PLATFORM_NAME\r\nXCODE_EXPLICIT_FILE_TYPE\r\nXCODE_EXPLICIT_FILE_TYPE\r\nXCODE_FILE_ATTRIBUTES\r\nXCODE_LAST_KNOWN_FILE_TYPE\r\nXCODE_PRODUCT_TYPE\r\nXCODE_SCHEME_ADDRESS_SANITIZER\r\nXCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN\r\nXCODE_SCHEME_ARGUMENTS\r\nXCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER\r\nXCODE_SCHEME_DYNAMIC_LIBRARY_LOADS\r\nXCODE_SCHEME_DYNAMIC_LINKER_API_USAGE\r\nXCODE_SCHEME_ENVIRONMENT\r\nXCODE_SCHEME_EXECUTABLE\r\nXCODE_SCHEME_GUARD_MALLOC\r\nXCODE_SCHEME_MAIN_THREAD_CHECKER_STOP\r\nXCODE_SCHEME_MALLOC_GUARD_EDGES\r\nXCODE_SCHEME_MALLOC_SCRIBBLE\r\nXCODE_SCHEME_MALLOC_STACK\r\nXCODE_SCHEME_THREAD_SANITIZER\r\nXCODE_SCHEME_THREAD_SANITIZER_STOP\r\nXCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER\r\nXCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP\r\nXCODE_SCHEME_ZOMBIE_OBJECTS\r\nXCTEST\r\ncxx_aggregate_default_initializers\r\ncxx_alias_templates\r\ncxx_alignas\r\ncxx_alignof\r\ncxx_attributes\r\ncxx_attribute_deprecated\r\ncxx_auto_type\r\ncxx_binary_literals\r\ncxx_constexpr\r\ncxx_contextual_conversions\r\ncxx_decltype_incomplete_return_types\r\ncxx_decltype\r\ncxx_decltype_auto\r\ncxx_default_function_template_args\r\ncxx_defaulted_functions\r\ncxx_defaulted_move_initializers\r\ncxx_delegating_constructors\r\ncxx_deleted_functions\r\ncxx_digit_separators\r\ncxx_enum_forward_declarations\r\ncxx_explicit_conversions\r\ncxx_extended_friend_declarations\r\ncxx_extern_templates\r\ncxx_final\r\ncxx_func_identifier\r\ncxx_generalized_initializers\r\ncxx_generic_lambdas\r\ncxx_inheriting_constructors\r\ncxx_inline_namespaces\r\ncxx_lambdas\r\ncxx_lambda_init_captures\r\ncxx_local_type_template_args\r\ncxx_long_long_type\r\ncxx_noexcept\r\ncxx_nonstatic_member_init\r\ncxx_nullptr\r\ncxx_override\r\ncxx_range_for\r\ncxx_raw_string_literals\r\ncxx_reference_qualified_functions\r\ncxx_relaxed_constexpr\r\ncxx_return_type_deduction\r\ncxx_right_angle_brackets\r\ncxx_rvalue_references\r\ncxx_sizeof_member\r\ncxx_static_assert\r\ncxx_strong_enums\r\ncxx_thread_local\r\ncxx_trailing_return_types\r\ncxx_unicode_literals\r\ncxx_uniform_initialization\r\ncxx_unrestricted_unions\r\ncxx_user_literals\r\ncxx_variable_templates\r\ncxx_variadic_macros\r\ncxx_variadic_templates\r\ncxx_template_template_parameters\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"WHATEVER_OUTPUT_NAME\"],\r\n\t[\"property\", \"WHATEVER_POSTFIX\"],\r\n\t[\"property\", \"WHATEVER_CLANG_TIDY\"],\r\n\t[\"property\", \"WHATEVER_COMPILER_LAUNCHER\"],\r\n\t[\"property\", \"WHATEVER_CPPCHECK\"],\r\n\t[\"property\", \"WHATEVER_CPPLINT\"],\r\n\t[\"property\", \"WHATEVER_INCLUDE_WHAT_YOU_USE\"],\r\n\t[\"property\", \"WHATEVER_VISIBILITY_PRESET\"],\r\n\t[\"property\", \"ABSTRACT\"],\r\n\t[\"property\", \"ADDITIONAL_MAKE_CLEAN_FILES\"],\r\n\t[\"property\", \"ADVANCED\"],\r\n\t[\"property\", \"ALIASED_TARGET\"],\r\n\t[\"property\", \"ALLOW_DUPLICATE_CUSTOM_TARGETS\"],\r\n\t[\"property\", \"ANDROID_ANT_ADDITIONAL_OPTIONS\"],\r\n\t[\"property\", \"ANDROID_API\"],\r\n\t[\"property\", \"ANDROID_API_MIN\"],\r\n\t[\"property\", \"ANDROID_ARCH\"],\r\n\t[\"property\", \"ANDROID_ASSETS_DIRECTORIES\"],\r\n\t[\"property\", \"ANDROID_GUI\"],\r\n\t[\"property\", \"ANDROID_JAR_DEPENDENCIES\"],\r\n\t[\"property\", \"ANDROID_NATIVE_LIB_DEPENDENCIES\"],\r\n\t[\"property\", \"ANDROID_NATIVE_LIB_DIRECTORIES\"],\r\n\t[\"property\", \"ANDROID_PROCESS_MAX\"],\r\n\t[\"property\", \"ANDROID_PROGUARD\"],\r\n\t[\"property\", \"ANDROID_PROGUARD_CONFIG_PATH\"],\r\n\t[\"property\", \"ANDROID_SECURE_PROPS_PATH\"],\r\n\t[\"property\", \"ANDROID_SKIP_ANT_STEP\"],\r\n\t[\"property\", \"ANDROID_STL_TYPE\"],\r\n\t[\"property\", \"ARCHIVE_OUTPUT_DIRECTORY\"],\r\n\t[\"property\", \"ARCHIVE_OUTPUT_DIRECTORY_WHATEVER\"],\r\n\t[\"property\", \"ARCHIVE_OUTPUT_NAME\"],\r\n\t[\"property\", \"ARCHIVE_OUTPUT_NAME_WHATEVER\"],\r\n\t[\"property\", \"ATTACHED_FILES\"],\r\n\t[\"property\", \"ATTACHED_FILES_ON_FAIL\"],\r\n\t[\"property\", \"AUTOGEN_BUILD_DIR\"],\r\n\t[\"property\", \"AUTOGEN_ORIGIN_DEPENDS\"],\r\n\t[\"property\", \"AUTOGEN_PARALLEL\"],\r\n\t[\"property\", \"AUTOGEN_SOURCE_GROUP\"],\r\n\t[\"property\", \"AUTOGEN_TARGETS_FOLDER\"],\r\n\t[\"property\", \"AUTOGEN_TARGET_DEPENDS\"],\r\n\t[\"property\", \"AUTOMOC\"],\r\n\t[\"property\", \"AUTOMOC_COMPILER_PREDEFINES\"],\r\n\t[\"property\", \"AUTOMOC_DEPEND_FILTERS\"],\r\n\t[\"property\", \"AUTOMOC_EXECUTABLE\"],\r\n\t[\"property\", \"AUTOMOC_MACRO_NAMES\"],\r\n\t[\"property\", \"AUTOMOC_MOC_OPTIONS\"],\r\n\t[\"property\", \"AUTOMOC_SOURCE_GROUP\"],\r\n\t[\"property\", \"AUTOMOC_TARGETS_FOLDER\"],\r\n\t[\"property\", \"AUTORCC\"],\r\n\t[\"property\", \"AUTORCC_EXECUTABLE\"],\r\n\t[\"property\", \"AUTORCC_OPTIONS\"],\r\n\t[\"property\", \"AUTORCC_OPTIONS\"],\r\n\t[\"property\", \"AUTORCC_SOURCE_GROUP\"],\r\n\t[\"property\", \"AUTOUIC\"],\r\n\t[\"property\", \"AUTOUIC_EXECUTABLE\"],\r\n\t[\"property\", \"AUTOUIC_OPTIONS\"],\r\n\t[\"property\", \"AUTOUIC_OPTIONS\"],\r\n\t[\"property\", \"AUTOUIC_SEARCH_PATHS\"],\r\n\t[\"property\", \"BINARY_DIR\"],\r\n\t[\"property\", \"BINARY_DIR\"],\r\n\t[\"property\", \"BUILDSYSTEM_TARGETS\"],\r\n\t[\"property\", \"BUILD_RPATH\"],\r\n\t[\"property\", \"BUILD_RPATH_USE_ORIGIN\"],\r\n\t[\"property\", \"BUILD_WITH_INSTALL_NAME_DIR\"],\r\n\t[\"property\", \"BUILD_WITH_INSTALL_RPATH\"],\r\n\t[\"property\", \"BUNDLE\"],\r\n\t[\"property\", \"BUNDLE_EXTENSION\"],\r\n\t[\"property\", \"CACHE_VARIABLES\"],\r\n\t[\"property\", \"CLEAN_NO_CUSTOM\"],\r\n\t[\"property\", \"COMMON_LANGUAGE_RUNTIME\"],\r\n\t[\"property\", \"COMPATIBLE_INTERFACE_BOOL\"],\r\n\t[\"property\", \"COMPATIBLE_INTERFACE_NUMBER_MAX\"],\r\n\t[\"property\", \"COMPATIBLE_INTERFACE_NUMBER_MIN\"],\r\n\t[\"property\", \"COMPATIBLE_INTERFACE_STRING\"],\r\n\t[\"property\", \"COMPILE_DEFINITIONS\"],\r\n\t[\"property\", \"COMPILE_DEFINITIONS\"],\r\n\t[\"property\", \"COMPILE_DEFINITIONS\"],\r\n\t[\"property\", \"COMPILE_DEFINITIONS_WHATEVER\"],\r\n\t[\"property\", \"COMPILE_DEFINITIONS_WHATEVER\"],\r\n\t[\"property\", \"COMPILE_DEFINITIONS_WHATEVER\"],\r\n\t[\"property\", \"COMPILE_FEATURES\"],\r\n\t[\"property\", \"COMPILE_FLAGS\"],\r\n\t[\"property\", \"COMPILE_FLAGS\"],\r\n\t[\"property\", \"COMPILE_OPTIONS\"],\r\n\t[\"property\", \"COMPILE_OPTIONS\"],\r\n\t[\"property\", \"COMPILE_OPTIONS\"],\r\n\t[\"property\", \"COMPILE_PDB_NAME\"],\r\n\t[\"property\", \"COMPILE_PDB_NAME_WHATEVER\"],\r\n\t[\"property\", \"COMPILE_PDB_OUTPUT_DIRECTORY\"],\r\n\t[\"property\", \"COMPILE_PDB_OUTPUT_DIRECTORY_WHATEVER\"],\r\n\t[\"property\", \"COST\"],\r\n\t[\"property\", \"CPACK_DESKTOP_SHORTCUTS\"],\r\n\t[\"property\", \"CPACK_NEVER_OVERWRITE\"],\r\n\t[\"property\", \"CPACK_PERMANENT\"],\r\n\t[\"property\", \"CPACK_STARTUP_SHORTCUTS\"],\r\n\t[\"property\", \"CPACK_START_MENU_SHORTCUTS\"],\r\n\t[\"property\", \"CPACK_WIX_ACL\"],\r\n\t[\"property\", \"CROSSCOMPILING_EMULATOR\"],\r\n\t[\"property\", \"CUDA_EXTENSIONS\"],\r\n\t[\"property\", \"CUDA_PTX_COMPILATION\"],\r\n\t[\"property\", \"CUDA_RESOLVE_DEVICE_SYMBOLS\"],\r\n\t[\"property\", \"CUDA_SEPARABLE_COMPILATION\"],\r\n\t[\"property\", \"CUDA_STANDARD\"],\r\n\t[\"property\", \"CUDA_STANDARD_REQUIRED\"],\r\n\t[\"property\", \"CXX_EXTENSIONS\"],\r\n\t[\"property\", \"CXX_STANDARD\"],\r\n\t[\"property\", \"CXX_STANDARD_REQUIRED\"],\r\n\t[\"property\", \"C_EXTENSIONS\"],\r\n\t[\"property\", \"C_STANDARD\"],\r\n\t[\"property\", \"C_STANDARD_REQUIRED\"],\r\n\t[\"property\", \"DEBUG_CONFIGURATIONS\"],\r\n\t[\"property\", \"DEBUG_POSTFIX\"],\r\n\t[\"property\", \"DEFINE_SYMBOL\"],\r\n\t[\"property\", \"DEFINITIONS\"],\r\n\t[\"property\", \"DEPENDS\"],\r\n\t[\"property\", \"DEPLOYMENT_ADDITIONAL_FILES\"],\r\n\t[\"property\", \"DEPLOYMENT_REMOTE_DIRECTORY\"],\r\n\t[\"property\", \"DISABLED\"],\r\n\t[\"property\", \"DISABLED_FEATURES\"],\r\n\t[\"property\", \"ECLIPSE_EXTRA_CPROJECT_CONTENTS\"],\r\n\t[\"property\", \"ECLIPSE_EXTRA_NATURES\"],\r\n\t[\"property\", \"ENABLED_FEATURES\"],\r\n\t[\"property\", \"ENABLED_LANGUAGES\"],\r\n\t[\"property\", \"ENABLE_EXPORTS\"],\r\n\t[\"property\", \"ENVIRONMENT\"],\r\n\t[\"property\", \"EXCLUDE_FROM_ALL\"],\r\n\t[\"property\", \"EXCLUDE_FROM_ALL\"],\r\n\t[\"property\", \"EXCLUDE_FROM_DEFAULT_BUILD\"],\r\n\t[\"property\", \"EXCLUDE_FROM_DEFAULT_BUILD_WHATEVER\"],\r\n\t[\"property\", \"EXPORT_NAME\"],\r\n\t[\"property\", \"EXPORT_PROPERTIES\"],\r\n\t[\"property\", \"EXTERNAL_OBJECT\"],\r\n\t[\"property\", \"EchoString\"],\r\n\t[\"property\", \"FAIL_REGULAR_EXPRESSION\"],\r\n\t[\"property\", \"FIND_LIBRARY_USE_LIB32_PATHS\"],\r\n\t[\"property\", \"FIND_LIBRARY_USE_LIB64_PATHS\"],\r\n\t[\"property\", \"FIND_LIBRARY_USE_LIBX32_PATHS\"],\r\n\t[\"property\", \"FIND_LIBRARY_USE_OPENBSD_VERSIONING\"],\r\n\t[\"property\", \"FIXTURES_CLEANUP\"],\r\n\t[\"property\", \"FIXTURES_REQUIRED\"],\r\n\t[\"property\", \"FIXTURES_SETUP\"],\r\n\t[\"property\", \"FOLDER\"],\r\n\t[\"property\", \"FRAMEWORK\"],\r\n\t[\"property\", \"Fortran_FORMAT\"],\r\n\t[\"property\", \"Fortran_FORMAT\"],\r\n\t[\"property\", \"Fortran_MODULE_DIRECTORY\"],\r\n\t[\"property\", \"GENERATED\"],\r\n\t[\"property\", \"GENERATOR_FILE_NAME\"],\r\n\t[\"property\", \"GENERATOR_IS_MULTI_CONFIG\"],\r\n\t[\"property\", \"GHS_INTEGRITY_APP\"],\r\n\t[\"property\", \"GHS_NO_SOURCE_GROUP_FILE\"],\r\n\t[\"property\", \"GLOBAL_DEPENDS_DEBUG_MODE\"],\r\n\t[\"property\", \"GLOBAL_DEPENDS_NO_CYCLES\"],\r\n\t[\"property\", \"GNUtoMS\"],\r\n\t[\"property\", \"HAS_CXX\"],\r\n\t[\"property\", \"HEADER_FILE_ONLY\"],\r\n\t[\"property\", \"HELPSTRING\"],\r\n\t[\"property\", \"IMPLICIT_DEPENDS_INCLUDE_TRANSFORM\"],\r\n\t[\"property\", \"IMPLICIT_DEPENDS_INCLUDE_TRANSFORM\"],\r\n\t[\"property\", \"IMPORTED\"],\r\n\t[\"property\", \"IMPORTED_COMMON_LANGUAGE_RUNTIME\"],\r\n\t[\"property\", \"IMPORTED_CONFIGURATIONS\"],\r\n\t[\"property\", \"IMPORTED_GLOBAL\"],\r\n\t[\"property\", \"IMPORTED_IMPLIB\"],\r\n\t[\"property\", \"IMPORTED_IMPLIB_WHATEVER\"],\r\n\t[\"property\", \"IMPORTED_LIBNAME\"],\r\n\t[\"property\", \"IMPORTED_LIBNAME_WHATEVER\"],\r\n\t[\"property\", \"IMPORTED_LINK_DEPENDENT_LIBRARIES\"],\r\n\t[\"property\", \"IMPORTED_LINK_DEPENDENT_LIBRARIES_WHATEVER\"],\r\n\t[\"property\", \"IMPORTED_LINK_INTERFACE_LANGUAGES\"],\r\n\t[\"property\", \"IMPORTED_LINK_INTERFACE_LANGUAGES_WHATEVER\"],\r\n\t[\"property\", \"IMPORTED_LINK_INTERFACE_LIBRARIES\"],\r\n\t[\"property\", \"IMPORTED_LINK_INTERFACE_LIBRARIES_WHATEVER\"],\r\n\t[\"property\", \"IMPORTED_LINK_INTERFACE_MULTIPLICITY\"],\r\n\t[\"property\", \"IMPORTED_LINK_INTERFACE_MULTIPLICITY_WHATEVER\"],\r\n\t[\"property\", \"IMPORTED_LOCATION\"],\r\n\t[\"property\", \"IMPORTED_LOCATION_WHATEVER\"],\r\n\t[\"property\", \"IMPORTED_NO_SONAME\"],\r\n\t[\"property\", \"IMPORTED_NO_SONAME_WHATEVER\"],\r\n\t[\"property\", \"IMPORTED_OBJECTS\"],\r\n\t[\"property\", \"IMPORTED_OBJECTS_WHATEVER\"],\r\n\t[\"property\", \"IMPORTED_SONAME\"],\r\n\t[\"property\", \"IMPORTED_SONAME_WHATEVER\"],\r\n\t[\"property\", \"IMPORT_PREFIX\"],\r\n\t[\"property\", \"IMPORT_SUFFIX\"],\r\n\t[\"property\", \"INCLUDE_DIRECTORIES\"],\r\n\t[\"property\", \"INCLUDE_DIRECTORIES\"],\r\n\t[\"property\", \"INCLUDE_DIRECTORIES\"],\r\n\t[\"property\", \"INCLUDE_REGULAR_EXPRESSION\"],\r\n\t[\"property\", \"INSTALL_NAME_DIR\"],\r\n\t[\"property\", \"INSTALL_RPATH\"],\r\n\t[\"property\", \"INSTALL_RPATH_USE_LINK_PATH\"],\r\n\t[\"property\", \"INTERFACE_AUTOUIC_OPTIONS\"],\r\n\t[\"property\", \"INTERFACE_COMPILE_DEFINITIONS\"],\r\n\t[\"property\", \"INTERFACE_COMPILE_FEATURES\"],\r\n\t[\"property\", \"INTERFACE_COMPILE_OPTIONS\"],\r\n\t[\"property\", \"INTERFACE_INCLUDE_DIRECTORIES\"],\r\n\t[\"property\", \"INTERFACE_LINK_DEPENDS\"],\r\n\t[\"property\", \"INTERFACE_LINK_DIRECTORIES\"],\r\n\t[\"property\", \"INTERFACE_LINK_LIBRARIES\"],\r\n\t[\"property\", \"INTERFACE_LINK_OPTIONS\"],\r\n\t[\"property\", \"INTERFACE_POSITION_INDEPENDENT_CODE\"],\r\n\t[\"property\", \"INTERFACE_SOURCES\"],\r\n\t[\"property\", \"INTERFACE_SYSTEM_INCLUDE_DIRECTORIES\"],\r\n\t[\"property\", \"INTERPROCEDURAL_OPTIMIZATION\"],\r\n\t[\"property\", \"INTERPROCEDURAL_OPTIMIZATION\"],\r\n\t[\"property\", \"INTERPROCEDURAL_OPTIMIZATION_WHATEVER\"],\r\n\t[\"property\", \"INTERPROCEDURAL_OPTIMIZATION_WHATEVER\"],\r\n\t[\"property\", \"IN_TRY_COMPILE\"],\r\n\t[\"property\", \"IOS_INSTALL_COMBINED\"],\r\n\t[\"property\", \"JOB_POOLS\"],\r\n\t[\"property\", \"JOB_POOL_COMPILE\"],\r\n\t[\"property\", \"JOB_POOL_LINK\"],\r\n\t[\"property\", \"KEEP_EXTENSION\"],\r\n\t[\"property\", \"LABELS\"],\r\n\t[\"property\", \"LABELS\"],\r\n\t[\"property\", \"LABELS\"],\r\n\t[\"property\", \"LABELS\"],\r\n\t[\"property\", \"LANGUAGE\"],\r\n\t[\"property\", \"LIBRARY_OUTPUT_DIRECTORY\"],\r\n\t[\"property\", \"LIBRARY_OUTPUT_DIRECTORY_WHATEVER\"],\r\n\t[\"property\", \"LIBRARY_OUTPUT_NAME\"],\r\n\t[\"property\", \"LIBRARY_OUTPUT_NAME_WHATEVER\"],\r\n\t[\"property\", \"LINKER_LANGUAGE\"],\r\n\t[\"property\", \"LINK_DEPENDS\"],\r\n\t[\"property\", \"LINK_DEPENDS_NO_SHARED\"],\r\n\t[\"property\", \"LINK_DIRECTORIES\"],\r\n\t[\"property\", \"LINK_DIRECTORIES\"],\r\n\t[\"property\", \"LINK_FLAGS\"],\r\n\t[\"property\", \"LINK_FLAGS_WHATEVER\"],\r\n\t[\"property\", \"LINK_INTERFACE_LIBRARIES\"],\r\n\t[\"property\", \"LINK_INTERFACE_LIBRARIES_WHATEVER\"],\r\n\t[\"property\", \"LINK_INTERFACE_MULTIPLICITY\"],\r\n\t[\"property\", \"LINK_INTERFACE_MULTIPLICITY_WHATEVER\"],\r\n\t[\"property\", \"LINK_LIBRARIES\"],\r\n\t[\"property\", \"LINK_OPTIONS\"],\r\n\t[\"property\", \"LINK_OPTIONS\"],\r\n\t[\"property\", \"LINK_SEARCH_END_STATIC\"],\r\n\t[\"property\", \"LINK_SEARCH_START_STATIC\"],\r\n\t[\"property\", \"LINK_WHAT_YOU_USE\"],\r\n\t[\"property\", \"LISTFILE_STACK\"],\r\n\t[\"property\", \"LOCATION\"],\r\n\t[\"property\", \"LOCATION\"],\r\n\t[\"property\", \"LOCATION_WHATEVER\"],\r\n\t[\"property\", \"MACOSX_BUNDLE\"],\r\n\t[\"property\", \"MACOSX_BUNDLE_INFO_PLIST\"],\r\n\t[\"property\", \"MACOSX_FRAMEWORK_INFO_PLIST\"],\r\n\t[\"property\", \"MACOSX_PACKAGE_LOCATION\"],\r\n\t[\"property\", \"MACOSX_RPATH\"],\r\n\t[\"property\", \"MACROS\"],\r\n\t[\"property\", \"MANUALLY_ADDED_DEPENDENCIES\"],\r\n\t[\"property\", \"MAP_IMPORTED_CONFIG_WHATEVER\"],\r\n\t[\"property\", \"MEASUREMENT\"],\r\n\t[\"property\", \"MODIFIED\"],\r\n\t[\"property\", \"NAME\"],\r\n\t[\"property\", \"NO_SONAME\"],\r\n\t[\"property\", \"NO_SYSTEM_FROM_IMPORTED\"],\r\n\t[\"property\", \"OBJECT_DEPENDS\"],\r\n\t[\"property\", \"OBJECT_OUTPUTS\"],\r\n\t[\"property\", \"OSX_ARCHITECTURES\"],\r\n\t[\"property\", \"OSX_ARCHITECTURES_WHATEVER\"],\r\n\t[\"property\", \"OUTPUT_NAME\"],\r\n\t[\"property\", \"OUTPUT_NAME_WHATEVER\"],\r\n\t[\"property\", \"PACKAGES_FOUND\"],\r\n\t[\"property\", \"PACKAGES_NOT_FOUND\"],\r\n\t[\"property\", \"PARENT_DIRECTORY\"],\r\n\t[\"property\", \"PASS_REGULAR_EXPRESSION\"],\r\n\t[\"property\", \"PDB_NAME\"],\r\n\t[\"property\", \"PDB_NAME_WHATEVER\"],\r\n\t[\"property\", \"PDB_OUTPUT_DIRECTORY\"],\r\n\t[\"property\", \"PDB_OUTPUT_DIRECTORY_WHATEVER\"],\r\n\t[\"property\", \"POSITION_INDEPENDENT_CODE\"],\r\n\t[\"property\", \"POST_INSTALL_SCRIPT\"],\r\n\t[\"property\", \"PREDEFINED_TARGETS_FOLDER\"],\r\n\t[\"property\", \"PREFIX\"],\r\n\t[\"property\", \"PRE_INSTALL_SCRIPT\"],\r\n\t[\"property\", \"PRIVATE_HEADER\"],\r\n\t[\"property\", \"PROCESSORS\"],\r\n\t[\"property\", \"PROCESSOR_AFFINITY\"],\r\n\t[\"property\", \"PROJECT_LABEL\"],\r\n\t[\"property\", \"PUBLIC_HEADER\"],\r\n\t[\"property\", \"REPORT_UNDEFINED_PROPERTIES\"],\r\n\t[\"property\", \"REQUIRED_FILES\"],\r\n\t[\"property\", \"RESOURCE\"],\r\n\t[\"property\", \"RESOURCE_LOCK\"],\r\n\t[\"property\", \"RULE_LAUNCH_COMPILE\"],\r\n\t[\"property\", \"RULE_LAUNCH_COMPILE\"],\r\n\t[\"property\", \"RULE_LAUNCH_COMPILE\"],\r\n\t[\"property\", \"RULE_LAUNCH_CUSTOM\"],\r\n\t[\"property\", \"RULE_LAUNCH_CUSTOM\"],\r\n\t[\"property\", \"RULE_LAUNCH_CUSTOM\"],\r\n\t[\"property\", \"RULE_LAUNCH_LINK\"],\r\n\t[\"property\", \"RULE_LAUNCH_LINK\"],\r\n\t[\"property\", \"RULE_LAUNCH_LINK\"],\r\n\t[\"property\", \"RULE_MESSAGES\"],\r\n\t[\"property\", \"RUNTIME_OUTPUT_DIRECTORY\"],\r\n\t[\"property\", \"RUNTIME_OUTPUT_DIRECTORY_WHATEVER\"],\r\n\t[\"property\", \"RUNTIME_OUTPUT_NAME\"],\r\n\t[\"property\", \"RUNTIME_OUTPUT_NAME_WHATEVER\"],\r\n\t[\"property\", \"RUN_SERIAL\"],\r\n\t[\"property\", \"SKIP_AUTOGEN\"],\r\n\t[\"property\", \"SKIP_AUTOMOC\"],\r\n\t[\"property\", \"SKIP_AUTORCC\"],\r\n\t[\"property\", \"SKIP_AUTOUIC\"],\r\n\t[\"property\", \"SKIP_BUILD_RPATH\"],\r\n\t[\"property\", \"SKIP_RETURN_CODE\"],\r\n\t[\"property\", \"SOURCES\"],\r\n\t[\"property\", \"SOURCE_DIR\"],\r\n\t[\"property\", \"SOURCE_DIR\"],\r\n\t[\"property\", \"SOVERSION\"],\r\n\t[\"property\", \"STATIC_LIBRARY_FLAGS\"],\r\n\t[\"property\", \"STATIC_LIBRARY_FLAGS_WHATEVER\"],\r\n\t[\"property\", \"STATIC_LIBRARY_OPTIONS\"],\r\n\t[\"property\", \"STRINGS\"],\r\n\t[\"property\", \"SUBDIRECTORIES\"],\r\n\t[\"property\", \"SUFFIX\"],\r\n\t[\"property\", \"SYMBOLIC\"],\r\n\t[\"property\", \"TARGET_ARCHIVES_MAY_BE_SHARED_LIBS\"],\r\n\t[\"property\", \"TARGET_MESSAGES\"],\r\n\t[\"property\", \"TARGET_SUPPORTS_SHARED_LIBS\"],\r\n\t[\"property\", \"TESTS\"],\r\n\t[\"property\", \"TEST_INCLUDE_FILE\"],\r\n\t[\"property\", \"TEST_INCLUDE_FILES\"],\r\n\t[\"property\", \"TIMEOUT\"],\r\n\t[\"property\", \"TIMEOUT_AFTER_MATCH\"],\r\n\t[\"property\", \"TYPE\"],\r\n\t[\"property\", \"TYPE\"],\r\n\t[\"property\", \"USE_FOLDERS\"],\r\n\t[\"property\", \"VALUE\"],\r\n\t[\"property\", \"VARIABLES\"],\r\n\t[\"property\", \"VERSION\"],\r\n\t[\"property\", \"VISIBILITY_INLINES_HIDDEN\"],\r\n\t[\"property\", \"VS_CONFIGURATION_TYPE\"],\r\n\t[\"property\", \"VS_COPY_TO_OUT_DIR\"],\r\n\t[\"property\", \"VS_CSHARP_WHATEVER\"],\r\n\t[\"property\", \"VS_DEBUGGER_COMMAND\"],\r\n\t[\"property\", \"VS_DEBUGGER_COMMAND_ARGUMENTS\"],\r\n\t[\"property\", \"VS_DEBUGGER_ENVIRONMENT\"],\r\n\t[\"property\", \"VS_DEBUGGER_WORKING_DIRECTORY\"],\r\n\t[\"property\", \"VS_DEPLOYMENT_CONTENT\"],\r\n\t[\"property\", \"VS_DEPLOYMENT_LOCATION\"],\r\n\t[\"property\", \"VS_DOTNET_REFERENCEPROP_WHATEVER\"],\r\n\t[\"property\", \"VS_DOTNET_REFERENCES\"],\r\n\t[\"property\", \"VS_DOTNET_REFERENCES_COPY_LOCAL\"],\r\n\t[\"property\", \"VS_DOTNET_REFERENCE_WHATEVER\"],\r\n\t[\"property\", \"VS_GLOBAL_WHATEVER\"],\r\n\t[\"property\", \"VS_GLOBAL_KEYWORD\"],\r\n\t[\"property\", \"VS_GLOBAL_PROJECT_TYPES\"],\r\n\t[\"property\", \"VS_GLOBAL_ROOTNAMESPACE\"],\r\n\t[\"property\", \"VS_GLOBAL_SECTION_POST_WHATEVER\"],\r\n\t[\"property\", \"VS_GLOBAL_SECTION_PRE_WHATEVER\"],\r\n\t[\"property\", \"VS_INCLUDE_IN_VSIX\"],\r\n\t[\"property\", \"VS_IOT_STARTUP_TASK\"],\r\n\t[\"property\", \"VS_KEYWORD\"],\r\n\t[\"property\", \"VS_RESOURCE_GENERATOR\"],\r\n\t[\"property\", \"VS_SCC_AUXPATH\"],\r\n\t[\"property\", \"VS_SCC_LOCALPATH\"],\r\n\t[\"property\", \"VS_SCC_PROJECTNAME\"],\r\n\t[\"property\", \"VS_SCC_PROVIDER\"],\r\n\t[\"property\", \"VS_SDK_REFERENCES\"],\r\n\t[\"property\", \"VS_SHADER_DISABLE_OPTIMIZATIONS\"],\r\n\t[\"property\", \"VS_SHADER_ENABLE_DEBUG\"],\r\n\t[\"property\", \"VS_SHADER_ENTRYPOINT\"],\r\n\t[\"property\", \"VS_SHADER_FLAGS\"],\r\n\t[\"property\", \"VS_SHADER_MODEL\"],\r\n\t[\"property\", \"VS_SHADER_OBJECT_FILE_NAME\"],\r\n\t[\"property\", \"VS_SHADER_OUTPUT_HEADER_FILE\"],\r\n\t[\"property\", \"VS_SHADER_TYPE\"],\r\n\t[\"property\", \"VS_SHADER_VARIABLE_NAME\"],\r\n\t[\"property\", \"VS_STARTUP_PROJECT\"],\r\n\t[\"property\", \"VS_TOOL_OVERRIDE\"],\r\n\t[\"property\", \"VS_USER_PROPS\"],\r\n\t[\"property\", \"VS_WINRT_COMPONENT\"],\r\n\t[\"property\", \"VS_WINRT_EXTENSIONS\"],\r\n\t[\"property\", \"VS_WINRT_REFERENCES\"],\r\n\t[\"property\", \"VS_XAML_TYPE\"],\r\n\t[\"property\", \"WILL_FAIL\"],\r\n\t[\"property\", \"WIN32_EXECUTABLE\"],\r\n\t[\"property\", \"WINDOWS_EXPORT_ALL_SYMBOLS\"],\r\n\t[\"property\", \"WORKING_DIRECTORY\"],\r\n\t[\"property\", \"WRAP_EXCLUDE\"],\r\n\t[\"property\", \"XCODE_ATTRIBUTE_WHATEVER\"],\r\n\t[\"property\", \"XCODE_EMIT_EFFECTIVE_PLATFORM_NAME\"],\r\n\t[\"property\", \"XCODE_EXPLICIT_FILE_TYPE\"],\r\n\t[\"property\", \"XCODE_EXPLICIT_FILE_TYPE\"],\r\n\t[\"property\", \"XCODE_FILE_ATTRIBUTES\"],\r\n\t[\"property\", \"XCODE_LAST_KNOWN_FILE_TYPE\"],\r\n\t[\"property\", \"XCODE_PRODUCT_TYPE\"],\r\n\t[\"property\", \"XCODE_SCHEME_ADDRESS_SANITIZER\"],\r\n\t[\"property\", \"XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN\"],\r\n\t[\"property\", \"XCODE_SCHEME_ARGUMENTS\"],\r\n\t[\"property\", \"XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER\"],\r\n\t[\"property\", \"XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS\"],\r\n\t[\"property\", \"XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE\"],\r\n\t[\"property\", \"XCODE_SCHEME_ENVIRONMENT\"],\r\n\t[\"property\", \"XCODE_SCHEME_EXECUTABLE\"],\r\n\t[\"property\", \"XCODE_SCHEME_GUARD_MALLOC\"],\r\n\t[\"property\", \"XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP\"],\r\n\t[\"property\", \"XCODE_SCHEME_MALLOC_GUARD_EDGES\"],\r\n\t[\"property\", \"XCODE_SCHEME_MALLOC_SCRIBBLE\"],\r\n\t[\"property\", \"XCODE_SCHEME_MALLOC_STACK\"],\r\n\t[\"property\", \"XCODE_SCHEME_THREAD_SANITIZER\"],\r\n\t[\"property\", \"XCODE_SCHEME_THREAD_SANITIZER_STOP\"],\r\n\t[\"property\", \"XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER\"],\r\n\t[\"property\", \"XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP\"],\r\n\t[\"property\", \"XCODE_SCHEME_ZOMBIE_OBJECTS\"],\r\n\t[\"property\", \"XCTEST\"],\r\n\t[\"property\", \"cxx_aggregate_default_initializers\"],\r\n\t[\"property\", \"cxx_alias_templates\"],\r\n\t[\"property\", \"cxx_alignas\"],\r\n\t[\"property\", \"cxx_alignof\"],\r\n\t[\"property\", \"cxx_attributes\"],\r\n\t[\"property\", \"cxx_attribute_deprecated\"],\r\n\t[\"property\", \"cxx_auto_type\"],\r\n\t[\"property\", \"cxx_binary_literals\"],\r\n\t[\"property\", \"cxx_constexpr\"],\r\n\t[\"property\", \"cxx_contextual_conversions\"],\r\n\t[\"property\", \"cxx_decltype_incomplete_return_types\"],\r\n\t[\"property\", \"cxx_decltype\"],\r\n\t[\"property\", \"cxx_decltype_auto\"],\r\n\t[\"property\", \"cxx_default_function_template_args\"],\r\n\t[\"property\", \"cxx_defaulted_functions\"],\r\n\t[\"property\", \"cxx_defaulted_move_initializers\"],\r\n\t[\"property\", \"cxx_delegating_constructors\"],\r\n\t[\"property\", \"cxx_deleted_functions\"],\r\n\t[\"property\", \"cxx_digit_separators\"],\r\n\t[\"property\", \"cxx_enum_forward_declarations\"],\r\n\t[\"property\", \"cxx_explicit_conversions\"],\r\n\t[\"property\", \"cxx_extended_friend_declarations\"],\r\n\t[\"property\", \"cxx_extern_templates\"],\r\n\t[\"property\", \"cxx_final\"],\r\n\t[\"property\", \"cxx_func_identifier\"],\r\n\t[\"property\", \"cxx_generalized_initializers\"],\r\n\t[\"property\", \"cxx_generic_lambdas\"],\r\n\t[\"property\", \"cxx_inheriting_constructors\"],\r\n\t[\"property\", \"cxx_inline_namespaces\"],\r\n\t[\"property\", \"cxx_lambdas\"],\r\n\t[\"property\", \"cxx_lambda_init_captures\"],\r\n\t[\"property\", \"cxx_local_type_template_args\"],\r\n\t[\"property\", \"cxx_long_long_type\"],\r\n\t[\"property\", \"cxx_noexcept\"],\r\n\t[\"property\", \"cxx_nonstatic_member_init\"],\r\n\t[\"property\", \"cxx_nullptr\"],\r\n\t[\"property\", \"cxx_override\"],\r\n\t[\"property\", \"cxx_range_for\"],\r\n\t[\"property\", \"cxx_raw_string_literals\"],\r\n\t[\"property\", \"cxx_reference_qualified_functions\"],\r\n\t[\"property\", \"cxx_relaxed_constexpr\"],\r\n\t[\"property\", \"cxx_return_type_deduction\"],\r\n\t[\"property\", \"cxx_right_angle_brackets\"],\r\n\t[\"property\", \"cxx_rvalue_references\"],\r\n\t[\"property\", \"cxx_sizeof_member\"],\r\n\t[\"property\", \"cxx_static_assert\"],\r\n\t[\"property\", \"cxx_strong_enums\"],\r\n\t[\"property\", \"cxx_thread_local\"],\r\n\t[\"property\", \"cxx_trailing_return_types\"],\r\n\t[\"property\", \"cxx_unicode_literals\"],\r\n\t[\"property\", \"cxx_uniform_initialization\"],\r\n\t[\"property\", \"cxx_unrestricted_unions\"],\r\n\t[\"property\", \"cxx_user_literals\"],\r\n\t[\"property\", \"cxx_variable_templates\"],\r\n\t[\"property\", \"cxx_variadic_macros\"],\r\n\t[\"property\", \"cxx_variadic_templates\"],\r\n\t[\"property\", \"cxx_template_template_parameters\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all properties."
  },
  {
    "path": "tests/languages/cmake/punctuation_feature.test",
    "content": "${}\n$<>\n()\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"${\"], [\"punctuation\", \"}\"],\n\t[\"punctuation\", \"$<\"], [\"punctuation\", \">\"],\n\t[\"punctuation\", \"(\"], [\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation."
  },
  {
    "path": "tests/languages/cmake/string_feature.test",
    "content": "\"This is a string\"\n\"This is \nmulti\nline\nstring\"\n\"${VAR}with${BAR}\"\n\"${FOO} with ${BAR}\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", [\"\\\"This is a string\\\"\"]],\n\t[\"string\", [\"\\\"This is \\r\\nmulti\\r\\nline\\r\\nstring\\\"\"]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"${\"],\n\t\t\t[\"variable\", \"VAR\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t\"with\",\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"${\"],\n\t\t\t[\"variable\", \"BAR\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"${\"],\n\t\t\t[\"variable\", \"FOO\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t\" with \",\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"${\"],\n\t\t\t[\"variable\", \"BAR\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t\"\\\"\"\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/cmake/variable_feature.test",
    "content": "WHATEVER_BINARY_DIR\r\nWHATEVER_DESCRIPTION\r\nWHATEVER_HOMEPAGE_URL\r\nWHATEVER_SOURCE_DIR\r\nWHATEVER_VERSION\r\nWHATEVER_VERSION_MAJOR\r\nWHATEVER_VERSION_MINOR\r\nWHATEVER_VERSION_PATCH\r\nWHATEVER_VERSION_TWEAK\r\nWHATEVER_ROOT\r\nANDROID\r\nAPPLE\r\nBORLAND\r\nBUILD_SHARED_LIBS\r\nCACHE\r\nCMAKE_WHATEVER_POSTFIX\r\nCMAKE_WHATEVER_ANDROID_TOOLCHAIN_MACHINE\r\nCMAKE_WHATEVER_ANDROID_TOOLCHAIN_PREFIX\r\nCMAKE_WHATEVER_ANDROID_TOOLCHAIN_SUFFIX\r\nCMAKE_WHATEVER_ARCHIVE_APPEND\r\nCMAKE_WHATEVER_ARCHIVE_CREATE\r\nCMAKE_WHATEVER_ARCHIVE_FINISH\r\nCMAKE_WHATEVER_CLANG_TIDY\r\nCMAKE_WHATEVER_COMPILER\r\nCMAKE_WHATEVER_COMPILER_ABI\r\nCMAKE_WHATEVER_COMPILER_AR\r\nCMAKE_WHATEVER_COMPILER_ARCHITECTURE_ID\r\nCMAKE_WHATEVER_COMPILER_EXTERNAL_TOOLCHAIN\r\nCMAKE_WHATEVER_COMPILER_ID\r\nCMAKE_WHATEVER_COMPILER_LAUNCHER\r\nCMAKE_WHATEVER_COMPILER_LOADED\r\nCMAKE_WHATEVER_COMPILER_PREDEFINES_COMMAND\r\nCMAKE_WHATEVER_COMPILER_RANLIB\r\nCMAKE_WHATEVER_COMPILER_TARGET\r\nCMAKE_WHATEVER_COMPILER_VERSION\r\nCMAKE_WHATEVER_COMPILER_VERSION_INTERNAL\r\nCMAKE_WHATEVER_COMPILE_OBJECT\r\nCMAKE_WHATEVER_CPPCHECK\r\nCMAKE_WHATEVER_CPPLINT\r\nCMAKE_WHATEVER_CREATE_SHARED_LIBRARY\r\nCMAKE_WHATEVER_CREATE_SHARED_MODULE\r\nCMAKE_WHATEVER_CREATE_STATIC_LIBRARY\r\nCMAKE_WHATEVER_FLAGS\r\nCMAKE_WHATEVER\r\nCMAKE_WHATEVER_INIT\r\nCMAKE_WHATEVER_FLAGS_DEBUG\r\nCMAKE_WHATEVER_FLAGS_DEBUG_INIT\r\nCMAKE_WHATEVER_FLAGS_INIT\r\nCMAKE_WHATEVER_FLAGS_MINSIZEREL\r\nCMAKE_WHATEVER_FLAGS_MINSIZEREL_INIT\r\nCMAKE_WHATEVER_FLAGS_RELEASE\r\nCMAKE_WHATEVER_FLAGS_RELEASE_INIT\r\nCMAKE_WHATEVER_FLAGS_RELWITHDEBINFO\r\nCMAKE_WHATEVER_FLAGS_RELWITHDEBINFO_INIT\r\nCMAKE_WHATEVER_IGNORE_EXTENSIONS\r\nCMAKE_WHATEVER_IMPLICIT_INCLUDE_DIRECTORIES\r\nCMAKE_WHATEVER_IMPLICIT_LINK_DIRECTORIES\r\nCMAKE_WHATEVER_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES\r\nCMAKE_WHATEVER_IMPLICIT_LINK_LIBRARIES\r\nCMAKE_WHATEVER_INCLUDE_WHAT_YOU_USE\r\nCMAKE_WHATEVER_LIBRARY_ARCHITECTURE\r\nCMAKE_WHATEVER_LINKER_PREFERENCE\r\nCMAKE_WHATEVER_LINKER_PREFERENCE_PROPAGATES\r\nCMAKE_WHATEVER_LINKER_WRAPPER_FLAG\r\nCMAKE_WHATEVER_LINKER_WRAPPER_FLAG_SEP\r\nCMAKE_WHATEVER_LINK_EXECUTABLE\r\nCMAKE_WHATEVER_OUTPUT_EXTENSION\r\nCMAKE_WHATEVER_PLATFORM_ID\r\nCMAKE_WHATEVER_SIMULATE_ID\r\nCMAKE_WHATEVER_SIMULATE_VERSION\r\nCMAKE_WHATEVER_SIZEOF_DATA_PTR\r\nCMAKE_WHATEVER_SOURCE_FILE_EXTENSIONS\r\nCMAKE_WHATEVER_STANDARD_INCLUDE_DIRECTORIES\r\nCMAKE_WHATEVER_STANDARD_LIBRARIES\r\nCMAKE_WHATEVER_VISIBILITY_PRESET\r\nCMAKE_ABSOLUTE_DESTINATION_FILES\r\nCMAKE_ANDROID_ANT_ADDITIONAL_OPTIONS\r\nCMAKE_ANDROID_API\r\nCMAKE_ANDROID_API_MIN\r\nCMAKE_ANDROID_ARCH\r\nCMAKE_ANDROID_ARCH_ABI\r\nCMAKE_ANDROID_ARM_MODE\r\nCMAKE_ANDROID_ARM_NEON\r\nCMAKE_ANDROID_ASSETS_DIRECTORIES\r\nCMAKE_ANDROID_GUI\r\nCMAKE_ANDROID_JAR_DEPENDENCIES\r\nCMAKE_ANDROID_JAR_DIRECTORIES\r\nCMAKE_ANDROID_JAVA_SOURCE_DIR\r\nCMAKE_ANDROID_NATIVE_LIB_DEPENDENCIES\r\nCMAKE_ANDROID_NATIVE_LIB_DIRECTORIES\r\nCMAKE_ANDROID_NDK\r\nCMAKE_ANDROID_NDK_DEPRECATED_HEADERS\r\nCMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG\r\nCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION\r\nCMAKE_ANDROID_PROCESS_MAX\r\nCMAKE_ANDROID_PROGUARD\r\nCMAKE_ANDROID_PROGUARD_CONFIG_PATH\r\nCMAKE_ANDROID_SECURE_PROPS_PATH\r\nCMAKE_ANDROID_SKIP_ANT_STEP\r\nCMAKE_ANDROID_STANDALONE_TOOLCHAIN\r\nCMAKE_ANDROID_STL_TYPE\r\nCMAKE_APPBUNDLE_PATH\r\nCMAKE_AR\r\nCMAKE_ARCHIVE_OUTPUT_DIRECTORY\r\nCMAKE_ARCHIVE_OUTPUT_DIRECTORY_WHATEVER\r\nCMAKE_ARGC\r\nCMAKE_ARGV0\r\nCMAKE_AUTOGEN_ORIGIN_DEPENDS\r\nCMAKE_AUTOGEN_PARALLEL\r\nCMAKE_AUTOGEN_VERBOSE\r\nCMAKE_AUTOMOC\r\nCMAKE_AUTOMOC_COMPILER_PREDEFINES\r\nCMAKE_AUTOMOC_DEPEND_FILTERS\r\nCMAKE_AUTOMOC_MACRO_NAMES\r\nCMAKE_AUTOMOC_MOC_OPTIONS\r\nCMAKE_AUTOMOC_RELAXED_MODE\r\nCMAKE_AUTORCC\r\nCMAKE_AUTORCC_OPTIONS\r\nCMAKE_AUTOUIC\r\nCMAKE_AUTOUIC_OPTIONS\r\nCMAKE_AUTOUIC_SEARCH_PATHS\r\nCMAKE_BACKWARDS_COMPATIBILITY\r\nCMAKE_BINARY_DIR\r\nCMAKE_BUILD_RPATH\r\nCMAKE_BUILD_RPATH_USE_ORIGIN\r\nCMAKE_BUILD_TOOL\r\nCMAKE_BUILD_TYPE\r\nCMAKE_BUILD_WITH_INSTALL_NAME_DIR\r\nCMAKE_BUILD_WITH_INSTALL_RPATH\r\nCMAKE_CACHEFILE_DIR\r\nCMAKE_CACHE_MAJOR_VERSION\r\nCMAKE_CACHE_MINOR_VERSION\r\nCMAKE_CACHE_PATCH_VERSION\r\nCMAKE_CFG_INTDIR\r\nCMAKE_CL_64\r\nCMAKE_CODEBLOCKS_COMPILER_ID\r\nCMAKE_CODEBLOCKS_EXCLUDE_EXTERNAL_FILES\r\nCMAKE_CODELITE_USE_TARGETS\r\nCMAKE_COLOR_MAKEFILE\r\nCMAKE_COMMAND\r\nCMAKE_COMPILER_2005\r\nCMAKE_COMPILER_IS_GNUCC\r\nCMAKE_COMPILER_IS_GNUCXX\r\nCMAKE_COMPILER_IS_GNUG77\r\nCMAKE_COMPILE_PDB_OUTPUT_DIRECTORY\r\nCMAKE_COMPILE_PDB_OUTPUT_DIRECTORY_WHATEVER\r\nCMAKE_CONFIGURATION_TYPES\r\nCMAKE_CPACK_COMMAND\r\nCMAKE_CROSSCOMPILING\r\nCMAKE_CROSSCOMPILING_EMULATOR\r\nCMAKE_CTEST_COMMAND\r\nCMAKE_CUDA_EXTENSIONS\r\nCMAKE_CUDA_HOST_COMPILER\r\nCMAKE_CUDA_SEPARABLE_COMPILATION\r\nCMAKE_CUDA_STANDARD\r\nCMAKE_CUDA_STANDARD_REQUIRED\r\nCMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES\r\nCMAKE_CURRENT_BINARY_DIR\r\nCMAKE_CURRENT_LIST_DIR\r\nCMAKE_CURRENT_LIST_FILE\r\nCMAKE_CURRENT_LIST_LINE\r\nCMAKE_CURRENT_SOURCE_DIR\r\nCMAKE_CXX_COMPILE_FEATURES\r\nCMAKE_CXX_EXTENSIONS\r\nCMAKE_CXX_STANDARD\r\nCMAKE_CXX_STANDARD_REQUIRED\r\nCMAKE_C_COMPILE_FEATURES\r\nCMAKE_C_EXTENSIONS\r\nCMAKE_C_STANDARD\r\nCMAKE_C_STANDARD_REQUIRED\r\nCMAKE_DEBUG_POSTFIX\r\nCMAKE_DEBUG_TARGET_PROPERTIES\r\nCMAKE_DEPENDS_IN_PROJECT_ONLY\r\nCMAKE_DIRECTORY_LABELS\r\nCMAKE_DISABLE_FIND_PACKAGE_WHATEVER\r\nCMAKE_DL_LIBS\r\nCMAKE_DOTNET_TARGET_FRAMEWORK_VERSION\r\nCMAKE_ECLIPSE_GENERATE_LINKED_RESOURCES\r\nCMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT\r\nCMAKE_ECLIPSE_MAKE_ARGUMENTS\r\nCMAKE_ECLIPSE_VERSION\r\nCMAKE_EDIT_COMMAND\r\nCMAKE_ENABLE_EXPORTS\r\nCMAKE_ERROR_DEPRECATED\r\nCMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION\r\nCMAKE_EXECUTABLE_SUFFIX\r\nCMAKE_EXE_LINKER_FLAGS\r\nCMAKE_EXE_LINKER_FLAGS_WHATEVER\r\nCMAKE_EXE_LINKER_FLAGS_WHATEVER_INIT\r\nCMAKE_EXE_LINKER_FLAGS_INIT\r\nCMAKE_EXPORT_COMPILE_COMMANDS\r\nCMAKE_EXPORT_NO_PACKAGE_REGISTRY\r\nCMAKE_EXTRA_GENERATOR\r\nCMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES\r\nCMAKE_FIND_APPBUNDLE\r\nCMAKE_FIND_FRAMEWORK\r\nCMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX\r\nCMAKE_FIND_LIBRARY_PREFIXES\r\nCMAKE_FIND_LIBRARY_SUFFIXES\r\nCMAKE_FIND_NO_INSTALL_PREFIX\r\nCMAKE_FIND_PACKAGE_NAME\r\nCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY\r\nCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY\r\nCMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS\r\nCMAKE_FIND_PACKAGE_SORT_DIRECTION\r\nCMAKE_FIND_PACKAGE_SORT_ORDER\r\nCMAKE_FIND_PACKAGE_WARN_NO_MODULE\r\nCMAKE_FIND_ROOT_PATH\r\nCMAKE_FIND_ROOT_PATH_MODE_INCLUDE\r\nCMAKE_FIND_ROOT_PATH_MODE_LIBRARY\r\nCMAKE_FIND_ROOT_PATH_MODE_PACKAGE\r\nCMAKE_FIND_ROOT_PATH_MODE_PROGRAM\r\nCMAKE_FOLDER\r\nCMAKE_FRAMEWORK_PATH\r\nCMAKE_Fortran_FORMAT\r\nCMAKE_Fortran_MODDIR_DEFAULT\r\nCMAKE_Fortran_MODDIR_FLAG\r\nCMAKE_Fortran_MODOUT_FLAG\r\nCMAKE_Fortran_MODULE_DIRECTORY\r\nCMAKE_GENERATOR\r\nCMAKE_GENERATOR_INSTANCE\r\nCMAKE_GENERATOR_PLATFORM\r\nCMAKE_GENERATOR_TOOLSET\r\nCMAKE_GHS_NO_SOURCE_GROUP_FILE\r\nCMAKE_GLOBAL_AUTOGEN_TARGET\r\nCMAKE_GLOBAL_AUTOGEN_TARGET_NAME\r\nCMAKE_GLOBAL_AUTORCC_TARGET\r\nCMAKE_GLOBAL_AUTORCC_TARGET_NAME\r\nCMAKE_GNUtoMS\r\nCMAKE_HOME_DIRECTORY\r\nCMAKE_HOST_APPLE\r\nCMAKE_HOST_SOLARIS\r\nCMAKE_HOST_SYSTEM\r\nCMAKE_HOST_SYSTEM_NAME\r\nCMAKE_HOST_SYSTEM_PROCESSOR\r\nCMAKE_HOST_SYSTEM_VERSION\r\nCMAKE_HOST_UNIX\r\nCMAKE_HOST_WIN32\r\nCMAKE_IGNORE_PATH\r\nCMAKE_IMPORT_LIBRARY_PREFIX\r\nCMAKE_IMPORT_LIBRARY_SUFFIX\r\nCMAKE_INCLUDE_CURRENT_DIR\r\nCMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE\r\nCMAKE_INCLUDE_DIRECTORIES_BEFORE\r\nCMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE\r\nCMAKE_INCLUDE_PATH\r\nCMAKE_INSTALL_DEFAULT_COMPONENT_NAME\r\nCMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS\r\nCMAKE_INSTALL_MESSAGE\r\nCMAKE_INSTALL_NAME_DIR\r\nCMAKE_INSTALL_PREFIX\r\nCMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT\r\nCMAKE_INSTALL_RPATH\r\nCMAKE_INSTALL_RPATH_USE_LINK_PATH\r\nCMAKE_INTERNAL_PLATFORM_ABI\r\nCMAKE_INTERPROCEDURAL_OPTIMIZATION\r\nCMAKE_INTERPROCEDURAL_OPTIMIZATION_WHATEVER\r\nCMAKE_IOS_INSTALL_COMBINED\r\nCMAKE_JOB_POOLS\r\nCMAKE_JOB_POOL_COMPILE\r\nCMAKE_JOB_POOL_LINK\r\nCMAKE_LIBRARY_ARCHITECTURE\r\nCMAKE_LIBRARY_ARCHITECTURE_REGEX\r\nCMAKE_LIBRARY_OUTPUT_DIRECTORY\r\nCMAKE_LIBRARY_OUTPUT_DIRECTORY_WHATEVER\r\nCMAKE_LIBRARY_PATH\r\nCMAKE_LIBRARY_PATH_FLAG\r\nCMAKE_LINK_DEF_FILE_FLAG\r\nCMAKE_LINK_DEPENDS_NO_SHARED\r\nCMAKE_LINK_DIRECTORIES_BEFORE\r\nCMAKE_LINK_INTERFACE_LIBRARIES\r\nCMAKE_LINK_LIBRARY_FILE_FLAG\r\nCMAKE_LINK_LIBRARY_FLAG\r\nCMAKE_LINK_LIBRARY_SUFFIX\r\nCMAKE_LINK_SEARCH_END_STATIC\r\nCMAKE_LINK_SEARCH_START_STATIC\r\nCMAKE_LINK_WHAT_YOU_USE\r\nCMAKE_MACOSX_BUNDLE\r\nCMAKE_MACOSX_RPATH\r\nCMAKE_MAJOR_VERSION\r\nCMAKE_MAKE_PROGRAM\r\nCMAKE_MAP_IMPORTED_CONFIG_WHATEVER\r\nCMAKE_MATCH_WHATEVER\r\nCMAKE_MATCH_COUNT\r\nCMAKE_MAXIMUM_RECURSION_DEPTH\r\nCMAKE_MFC_FLAG\r\nCMAKE_MINIMUM_REQUIRED_VERSION\r\nCMAKE_MINOR_VERSION\r\nCMAKE_MODULE_LINKER_FLAGS\r\nCMAKE_MODULE_LINKER_FLAGS_WHATEVER\r\nCMAKE_MODULE_LINKER_FLAGS_WHATEVER_INIT\r\nCMAKE_MODULE_LINKER_FLAGS_INIT\r\nCMAKE_MODULE_PATH\r\nCMAKE_MSVCIDE_RUN_PATH\r\nCMAKE_NETRC\r\nCMAKE_NETRC_FILE\r\nCMAKE_NINJA_OUTPUT_PATH_PREFIX\r\nCMAKE_NOT_USING_CONFIG_FLAGS\r\nCMAKE_NO_BUILTIN_CHRPATH\r\nCMAKE_NO_SYSTEM_FROM_IMPORTED\r\nCMAKE_OBJECT_PATH_MAX\r\nCMAKE_OSX_ARCHITECTURES\r\nCMAKE_OSX_DEPLOYMENT_TARGET\r\nCMAKE_OSX_SYSROOT\r\nCMAKE_PARENT_LIST_FILE\r\nCMAKE_PATCH_VERSION\r\nCMAKE_PDB_OUTPUT_DIRECTORY\r\nCMAKE_PDB_OUTPUT_DIRECTORY_WHATEVER\r\nCMAKE_POLICY_DEFAULT_CMPWHATEVER\r\nCMAKE_POLICY_WARNING_CMPWHATEVER\r\nCMAKE_POSITION_INDEPENDENT_CODE\r\nCMAKE_PREFIX_PATH\r\nCMAKE_PROGRAM_PATH\r\nCMAKE_PROJECT_WHATEVER_INCLUDE\r\nCMAKE_PROJECT_DESCRIPTION\r\nCMAKE_PROJECT_HOMEPAGE_URL\r\nCMAKE_PROJECT_NAME\r\nCMAKE_PROJECT_VERSION\r\nCMAKE_PROJECT_VERSION_MAJOR\r\nCMAKE_PROJECT_VERSION_MINOR\r\nCMAKE_PROJECT_VERSION_PATCH\r\nCMAKE_PROJECT_VERSION_TWEAK\r\nCMAKE_RANLIB\r\nCMAKE_ROOT\r\nCMAKE_RULE_MESSAGES\r\nCMAKE_RUNTIME_OUTPUT_DIRECTORY\r\nCMAKE_RUNTIME_OUTPUT_DIRECTORY_WHATEVER\r\nCMAKE_SCRIPT_MODE_FILE\r\nCMAKE_SHARED_LIBRARY_PREFIX\r\nCMAKE_SHARED_LIBRARY_SUFFIX\r\nCMAKE_SHARED_LINKER_FLAGS\r\nCMAKE_SHARED_LINKER_FLAGS_WHATEVER\r\nCMAKE_SHARED_LINKER_FLAGS_WHATEVER_INIT\r\nCMAKE_SHARED_LINKER_FLAGS_INIT\r\nCMAKE_SHARED_MODULE_PREFIX\r\nCMAKE_SHARED_MODULE_SUFFIX\r\nCMAKE_SIZEOF_VOID_P\r\nCMAKE_SKIP_BUILD_RPATH\r\nCMAKE_SKIP_INSTALL_ALL_DEPENDENCY\r\nCMAKE_SKIP_INSTALL_RPATH\r\nCMAKE_SKIP_INSTALL_RULES\r\nCMAKE_SKIP_RPATH\r\nCMAKE_SOURCE_DIR\r\nCMAKE_STAGING_PREFIX\r\nCMAKE_STATIC_LIBRARY_PREFIX\r\nCMAKE_STATIC_LIBRARY_SUFFIX\r\nCMAKE_STATIC_LINKER_FLAGS\r\nCMAKE_STATIC_LINKER_FLAGS_WHATEVER\r\nCMAKE_STATIC_LINKER_FLAGS_WHATEVER_INIT\r\nCMAKE_STATIC_LINKER_FLAGS_INIT\r\nCMAKE_SUBLIME_TEXT_2_ENV_SETTINGS\r\nCMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE\r\nCMAKE_SUPPRESS_REGENERATION\r\nCMAKE_SYSROOT\r\nCMAKE_SYSROOT_COMPILE\r\nCMAKE_SYSROOT_LINK\r\nCMAKE_SYSTEM\r\nCMAKE_SYSTEM_APPBUNDLE_PATH\r\nCMAKE_SYSTEM_FRAMEWORK_PATH\r\nCMAKE_SYSTEM_IGNORE_PATH\r\nCMAKE_SYSTEM_INCLUDE_PATH\r\nCMAKE_SYSTEM_LIBRARY_PATH\r\nCMAKE_SYSTEM_NAME\r\nCMAKE_SYSTEM_PREFIX_PATH\r\nCMAKE_SYSTEM_PROCESSOR\r\nCMAKE_SYSTEM_PROGRAM_PATH\r\nCMAKE_SYSTEM_VERSION\r\nCMAKE_Swift_LANGUAGE_VERSION\r\nCMAKE_TOOLCHAIN_FILE\r\nCMAKE_TRY_COMPILE_CONFIGURATION\r\nCMAKE_TRY_COMPILE_PLATFORM_VARIABLES\r\nCMAKE_TRY_COMPILE_TARGET_TYPE\r\nCMAKE_TWEAK_VERSION\r\nCMAKE_USER_MAKE_RULES_OVERRIDE\r\nCMAKE_USER_MAKE_RULES_OVERRIDE_WHATEVER\r\nCMAKE_USE_RELATIVE_PATHS\r\nCMAKE_VERBOSE_MAKEFILE\r\nCMAKE_VERSION\r\nCMAKE_VISIBILITY_INLINES_HIDDEN\r\nCMAKE_VS_DEVENV_COMMAND\r\nCMAKE_VS_GLOBALS\r\nCMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD\r\nCMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD\r\nCMAKE_VS_INTEL_Fortran_PROJECT_VERSION\r\nCMAKE_VS_MSBUILD_COMMAND\r\nCMAKE_VS_NsightTegra_VERSION\r\nCMAKE_VS_PLATFORM_NAME\r\nCMAKE_VS_PLATFORM_TOOLSET\r\nCMAKE_VS_PLATFORM_TOOLSET_CUDA\r\nCMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE\r\nCMAKE_VS_PLATFORM_TOOLSET_VERSION\r\nCMAKE_VS_SDK_EXCLUDE_DIRECTORIES\r\nCMAKE_VS_SDK_EXECUTABLE_DIRECTORIES\r\nCMAKE_VS_SDK_INCLUDE_DIRECTORIES\r\nCMAKE_VS_SDK_LIBRARY_DIRECTORIES\r\nCMAKE_VS_SDK_LIBRARY_WINRT_DIRECTORIES\r\nCMAKE_VS_SDK_REFERENCE_DIRECTORIES\r\nCMAKE_VS_SDK_SOURCE_DIRECTORIES\r\nCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION\r\nCMAKE_VS_WINRT_BY_DEFAULT\r\nCMAKE_WARN_DEPRECATED\r\nCMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION\r\nCMAKE_WIN32_EXECUTABLE\r\nCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS\r\nCMAKE_XCODE_ATTRIBUTE_WHATEVER\r\nCMAKE_XCODE_GENERATE_SCHEME\r\nCMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY\r\nCMAKE_XCODE_PLATFORM_TOOLSET\r\nCMAKE_XCODE_SCHEME_ADDRESS_SANITIZER\r\nCMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN\r\nCMAKE_XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER\r\nCMAKE_XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS\r\nCMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE\r\nCMAKE_XCODE_SCHEME_GUARD_MALLOC\r\nCMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP\r\nCMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES\r\nCMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE\r\nCMAKE_XCODE_SCHEME_MALLOC_STACK\r\nCMAKE_XCODE_SCHEME_THREAD_SANITIZER\r\nCMAKE_XCODE_SCHEME_THREAD_SANITIZER_STOP\r\nCMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER\r\nCMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP\r\nCMAKE_XCODE_SCHEME_ZOMBIE_OBJECTS\r\nCPACK_ABSOLUTE_DESTINATION_FILES\r\nCPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY\r\nCPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION\r\nCPACK_INCLUDE_TOPLEVEL_DIRECTORY\r\nCPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS\r\nCPACK_INSTALL_SCRIPT\r\nCPACK_PACKAGING_INSTALL_PREFIX\r\nCPACK_SET_DESTDIR\r\nCPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION\r\nCTEST_BINARY_DIRECTORY\r\nCTEST_BUILD_COMMAND\r\nCTEST_BUILD_NAME\r\nCTEST_BZR_COMMAND\r\nCTEST_BZR_UPDATE_OPTIONS\r\nCTEST_CHANGE_ID\r\nCTEST_CHECKOUT_COMMAND\r\nCTEST_CONFIGURATION_TYPE\r\nCTEST_CONFIGURE_COMMAND\r\nCTEST_COVERAGE_COMMAND\r\nCTEST_COVERAGE_EXTRA_FLAGS\r\nCTEST_CURL_OPTIONS\r\nCTEST_CUSTOM_COVERAGE_EXCLUDE\r\nCTEST_CUSTOM_ERROR_EXCEPTION\r\nCTEST_CUSTOM_ERROR_MATCH\r\nCTEST_CUSTOM_ERROR_POST_CONTEXT\r\nCTEST_CUSTOM_ERROR_PRE_CONTEXT\r\nCTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE\r\nCTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS\r\nCTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS\r\nCTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE\r\nCTEST_CUSTOM_MEMCHECK_IGNORE\r\nCTEST_CUSTOM_POST_MEMCHECK\r\nCTEST_CUSTOM_POST_TEST\r\nCTEST_CUSTOM_PRE_MEMCHECK\r\nCTEST_CUSTOM_PRE_TEST\r\nCTEST_CUSTOM_TESTS_IGNORE\r\nCTEST_CUSTOM_WARNING_EXCEPTION\r\nCTEST_CUSTOM_WARNING_MATCH\r\nCTEST_CVS_CHECKOUT\r\nCTEST_CVS_COMMAND\r\nCTEST_CVS_UPDATE_OPTIONS\r\nCTEST_DROP_LOCATION\r\nCTEST_DROP_METHOD\r\nCTEST_DROP_SITE\r\nCTEST_DROP_SITE_CDASH\r\nCTEST_DROP_SITE_PASSWORD\r\nCTEST_DROP_SITE_USER\r\nCTEST_EXTRA_COVERAGE_GLOB\r\nCTEST_GIT_COMMAND\r\nCTEST_GIT_INIT_SUBMODULES\r\nCTEST_GIT_UPDATE_CUSTOM\r\nCTEST_GIT_UPDATE_OPTIONS\r\nCTEST_HG_COMMAND\r\nCTEST_HG_UPDATE_OPTIONS\r\nCTEST_LABELS_FOR_SUBPROJECTS\r\nCTEST_MEMORYCHECK_COMMAND\r\nCTEST_MEMORYCHECK_COMMAND_OPTIONS\r\nCTEST_MEMORYCHECK_SANITIZER_OPTIONS\r\nCTEST_MEMORYCHECK_SUPPRESSIONS_FILE\r\nCTEST_MEMORYCHECK_TYPE\r\nCTEST_NIGHTLY_START_TIME\r\nCTEST_P4_CLIENT\r\nCTEST_P4_COMMAND\r\nCTEST_P4_OPTIONS\r\nCTEST_P4_UPDATE_OPTIONS\r\nCTEST_RUN_CURRENT_SCRIPT\r\nCTEST_SCP_COMMAND\r\nCTEST_SITE\r\nCTEST_SOURCE_DIRECTORY\r\nCTEST_SUBMIT_URL\r\nCTEST_SVN_COMMAND\r\nCTEST_SVN_OPTIONS\r\nCTEST_SVN_UPDATE_OPTIONS\r\nCTEST_TEST_LOAD\r\nCTEST_TEST_TIMEOUT\r\nCTEST_TRIGGER_SITE\r\nCTEST_UPDATE_COMMAND\r\nCTEST_UPDATE_OPTIONS\r\nCTEST_UPDATE_VERSION_ONLY\r\nCTEST_USE_LAUNCHERS\r\nCYGWIN\r\nENV\r\nEXECUTABLE_OUTPUT_PATH\r\nGHS-MULTI\r\nIOS\r\nLIBRARY_OUTPUT_PATH\r\nMINGW\r\nMSVC\r\nMSVC10\r\nMSVC11\r\nMSVC12\r\nMSVC14\r\nMSVC60\r\nMSVC70\r\nMSVC71\r\nMSVC80\r\nMSVC90\r\nMSVC_IDE\r\nMSVC_TOOLSET_VERSION\r\nMSVC_VERSION\r\nMSYS\r\nPROJECT_BINARY_DIR\r\nPROJECT_DESCRIPTION\r\nPROJECT_HOMEPAGE_URL\r\nPROJECT_NAME\r\nPROJECT_SOURCE_DIR\r\nPROJECT_VERSION\r\nPROJECT_VERSION_MAJOR\r\nPROJECT_VERSION_MINOR\r\nPROJECT_VERSION_PATCH\r\nPROJECT_VERSION_TWEAK\r\nUNIX\r\nWIN32\r\nWINCE\r\nWINDOWS_PHONE\r\nWINDOWS_STORE\r\nXCODE\r\nXCODE_VERSION\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"WHATEVER_BINARY_DIR\"],\r\n\t[\"variable\", \"WHATEVER_DESCRIPTION\"],\r\n\t[\"variable\", \"WHATEVER_HOMEPAGE_URL\"],\r\n\t[\"variable\", \"WHATEVER_SOURCE_DIR\"],\r\n\t[\"variable\", \"WHATEVER_VERSION\"],\r\n\t[\"variable\", \"WHATEVER_VERSION_MAJOR\"],\r\n\t[\"variable\", \"WHATEVER_VERSION_MINOR\"],\r\n\t[\"variable\", \"WHATEVER_VERSION_PATCH\"],\r\n\t[\"variable\", \"WHATEVER_VERSION_TWEAK\"],\r\n\t[\"variable\", \"WHATEVER_ROOT\"],\r\n\t[\"variable\", \"ANDROID\"],\r\n\t[\"variable\", \"APPLE\"],\r\n\t[\"variable\", \"BORLAND\"],\r\n\t[\"variable\", \"BUILD_SHARED_LIBS\"],\r\n\t[\"variable\", \"CACHE\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_POSTFIX\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_ANDROID_TOOLCHAIN_MACHINE\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_ANDROID_TOOLCHAIN_PREFIX\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_ANDROID_TOOLCHAIN_SUFFIX\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_ARCHIVE_APPEND\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_ARCHIVE_CREATE\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_ARCHIVE_FINISH\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_CLANG_TIDY\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_ABI\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_AR\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_ARCHITECTURE_ID\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_EXTERNAL_TOOLCHAIN\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_ID\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_LAUNCHER\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_LOADED\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_PREDEFINES_COMMAND\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_RANLIB\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_TARGET\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_VERSION\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILER_VERSION_INTERNAL\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_COMPILE_OBJECT\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_CPPCHECK\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_CPPLINT\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_CREATE_SHARED_LIBRARY\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_CREATE_SHARED_MODULE\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_CREATE_STATIC_LIBRARY\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_FLAGS\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_INIT\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_FLAGS_DEBUG\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_FLAGS_DEBUG_INIT\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_FLAGS_INIT\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_FLAGS_MINSIZEREL\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_FLAGS_MINSIZEREL_INIT\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_FLAGS_RELEASE\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_FLAGS_RELEASE_INIT\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_FLAGS_RELWITHDEBINFO\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_FLAGS_RELWITHDEBINFO_INIT\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_IGNORE_EXTENSIONS\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_IMPLICIT_INCLUDE_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_IMPLICIT_LINK_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_IMPLICIT_LINK_LIBRARIES\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_INCLUDE_WHAT_YOU_USE\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_LIBRARY_ARCHITECTURE\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_LINKER_PREFERENCE\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_LINKER_PREFERENCE_PROPAGATES\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_LINKER_WRAPPER_FLAG\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_LINKER_WRAPPER_FLAG_SEP\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_LINK_EXECUTABLE\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_OUTPUT_EXTENSION\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_PLATFORM_ID\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_SIMULATE_ID\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_SIMULATE_VERSION\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_SIZEOF_DATA_PTR\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_SOURCE_FILE_EXTENSIONS\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_STANDARD_INCLUDE_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_STANDARD_LIBRARIES\"],\r\n\t[\"variable\", \"CMAKE_WHATEVER_VISIBILITY_PRESET\"],\r\n\t[\"variable\", \"CMAKE_ABSOLUTE_DESTINATION_FILES\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_ANT_ADDITIONAL_OPTIONS\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_API\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_API_MIN\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_ARCH\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_ARCH_ABI\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_ARM_MODE\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_ARM_NEON\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_ASSETS_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_GUI\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_JAR_DEPENDENCIES\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_JAR_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_JAVA_SOURCE_DIR\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_NATIVE_LIB_DEPENDENCIES\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_NATIVE_LIB_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_NDK\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_NDK_DEPRECATED_HEADERS\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_PROCESS_MAX\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_PROGUARD\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_PROGUARD_CONFIG_PATH\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_SECURE_PROPS_PATH\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_SKIP_ANT_STEP\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_STANDALONE_TOOLCHAIN\"],\r\n\t[\"variable\", \"CMAKE_ANDROID_STL_TYPE\"],\r\n\t[\"variable\", \"CMAKE_APPBUNDLE_PATH\"],\r\n\t[\"variable\", \"CMAKE_AR\"],\r\n\t[\"variable\", \"CMAKE_ARCHIVE_OUTPUT_DIRECTORY\"],\r\n\t[\"variable\", \"CMAKE_ARCHIVE_OUTPUT_DIRECTORY_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_ARGC\"],\r\n\t[\"variable\", \"CMAKE_ARGV0\"],\r\n\t[\"variable\", \"CMAKE_AUTOGEN_ORIGIN_DEPENDS\"],\r\n\t[\"variable\", \"CMAKE_AUTOGEN_PARALLEL\"],\r\n\t[\"variable\", \"CMAKE_AUTOGEN_VERBOSE\"],\r\n\t[\"variable\", \"CMAKE_AUTOMOC\"],\r\n\t[\"variable\", \"CMAKE_AUTOMOC_COMPILER_PREDEFINES\"],\r\n\t[\"variable\", \"CMAKE_AUTOMOC_DEPEND_FILTERS\"],\r\n\t[\"variable\", \"CMAKE_AUTOMOC_MACRO_NAMES\"],\r\n\t[\"variable\", \"CMAKE_AUTOMOC_MOC_OPTIONS\"],\r\n\t[\"variable\", \"CMAKE_AUTOMOC_RELAXED_MODE\"],\r\n\t[\"variable\", \"CMAKE_AUTORCC\"],\r\n\t[\"variable\", \"CMAKE_AUTORCC_OPTIONS\"],\r\n\t[\"variable\", \"CMAKE_AUTOUIC\"],\r\n\t[\"variable\", \"CMAKE_AUTOUIC_OPTIONS\"],\r\n\t[\"variable\", \"CMAKE_AUTOUIC_SEARCH_PATHS\"],\r\n\t[\"variable\", \"CMAKE_BACKWARDS_COMPATIBILITY\"],\r\n\t[\"variable\", \"CMAKE_BINARY_DIR\"],\r\n\t[\"variable\", \"CMAKE_BUILD_RPATH\"],\r\n\t[\"variable\", \"CMAKE_BUILD_RPATH_USE_ORIGIN\"],\r\n\t[\"variable\", \"CMAKE_BUILD_TOOL\"],\r\n\t[\"variable\", \"CMAKE_BUILD_TYPE\"],\r\n\t[\"variable\", \"CMAKE_BUILD_WITH_INSTALL_NAME_DIR\"],\r\n\t[\"variable\", \"CMAKE_BUILD_WITH_INSTALL_RPATH\"],\r\n\t[\"variable\", \"CMAKE_CACHEFILE_DIR\"],\r\n\t[\"variable\", \"CMAKE_CACHE_MAJOR_VERSION\"],\r\n\t[\"variable\", \"CMAKE_CACHE_MINOR_VERSION\"],\r\n\t[\"variable\", \"CMAKE_CACHE_PATCH_VERSION\"],\r\n\t[\"variable\", \"CMAKE_CFG_INTDIR\"],\r\n\t[\"variable\", \"CMAKE_CL_64\"],\r\n\t[\"variable\", \"CMAKE_CODEBLOCKS_COMPILER_ID\"],\r\n\t[\"variable\", \"CMAKE_CODEBLOCKS_EXCLUDE_EXTERNAL_FILES\"],\r\n\t[\"variable\", \"CMAKE_CODELITE_USE_TARGETS\"],\r\n\t[\"variable\", \"CMAKE_COLOR_MAKEFILE\"],\r\n\t[\"variable\", \"CMAKE_COMMAND\"],\r\n\t[\"variable\", \"CMAKE_COMPILER_2005\"],\r\n\t[\"variable\", \"CMAKE_COMPILER_IS_GNUCC\"],\r\n\t[\"variable\", \"CMAKE_COMPILER_IS_GNUCXX\"],\r\n\t[\"variable\", \"CMAKE_COMPILER_IS_GNUG77\"],\r\n\t[\"variable\", \"CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY\"],\r\n\t[\"variable\", \"CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_CONFIGURATION_TYPES\"],\r\n\t[\"variable\", \"CMAKE_CPACK_COMMAND\"],\r\n\t[\"variable\", \"CMAKE_CROSSCOMPILING\"],\r\n\t[\"variable\", \"CMAKE_CROSSCOMPILING_EMULATOR\"],\r\n\t[\"variable\", \"CMAKE_CTEST_COMMAND\"],\r\n\t[\"variable\", \"CMAKE_CUDA_EXTENSIONS\"],\r\n\t[\"variable\", \"CMAKE_CUDA_HOST_COMPILER\"],\r\n\t[\"variable\", \"CMAKE_CUDA_SEPARABLE_COMPILATION\"],\r\n\t[\"variable\", \"CMAKE_CUDA_STANDARD\"],\r\n\t[\"variable\", \"CMAKE_CUDA_STANDARD_REQUIRED\"],\r\n\t[\"variable\", \"CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_CURRENT_BINARY_DIR\"],\r\n\t[\"variable\", \"CMAKE_CURRENT_LIST_DIR\"],\r\n\t[\"variable\", \"CMAKE_CURRENT_LIST_FILE\"],\r\n\t[\"variable\", \"CMAKE_CURRENT_LIST_LINE\"],\r\n\t[\"variable\", \"CMAKE_CURRENT_SOURCE_DIR\"],\r\n\t[\"variable\", \"CMAKE_CXX_COMPILE_FEATURES\"],\r\n\t[\"variable\", \"CMAKE_CXX_EXTENSIONS\"],\r\n\t[\"variable\", \"CMAKE_CXX_STANDARD\"],\r\n\t[\"variable\", \"CMAKE_CXX_STANDARD_REQUIRED\"],\r\n\t[\"variable\", \"CMAKE_C_COMPILE_FEATURES\"],\r\n\t[\"variable\", \"CMAKE_C_EXTENSIONS\"],\r\n\t[\"variable\", \"CMAKE_C_STANDARD\"],\r\n\t[\"variable\", \"CMAKE_C_STANDARD_REQUIRED\"],\r\n\t[\"variable\", \"CMAKE_DEBUG_POSTFIX\"],\r\n\t[\"variable\", \"CMAKE_DEBUG_TARGET_PROPERTIES\"],\r\n\t[\"variable\", \"CMAKE_DEPENDS_IN_PROJECT_ONLY\"],\r\n\t[\"variable\", \"CMAKE_DIRECTORY_LABELS\"],\r\n\t[\"variable\", \"CMAKE_DISABLE_FIND_PACKAGE_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_DL_LIBS\"],\r\n\t[\"variable\", \"CMAKE_DOTNET_TARGET_FRAMEWORK_VERSION\"],\r\n\t[\"variable\", \"CMAKE_ECLIPSE_GENERATE_LINKED_RESOURCES\"],\r\n\t[\"variable\", \"CMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT\"],\r\n\t[\"variable\", \"CMAKE_ECLIPSE_MAKE_ARGUMENTS\"],\r\n\t[\"variable\", \"CMAKE_ECLIPSE_VERSION\"],\r\n\t[\"variable\", \"CMAKE_EDIT_COMMAND\"],\r\n\t[\"variable\", \"CMAKE_ENABLE_EXPORTS\"],\r\n\t[\"variable\", \"CMAKE_ERROR_DEPRECATED\"],\r\n\t[\"variable\", \"CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION\"],\r\n\t[\"variable\", \"CMAKE_EXECUTABLE_SUFFIX\"],\r\n\t[\"variable\", \"CMAKE_EXE_LINKER_FLAGS\"],\r\n\t[\"variable\", \"CMAKE_EXE_LINKER_FLAGS_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_EXE_LINKER_FLAGS_WHATEVER_INIT\"],\r\n\t[\"variable\", \"CMAKE_EXE_LINKER_FLAGS_INIT\"],\r\n\t[\"variable\", \"CMAKE_EXPORT_COMPILE_COMMANDS\"],\r\n\t[\"variable\", \"CMAKE_EXPORT_NO_PACKAGE_REGISTRY\"],\r\n\t[\"variable\", \"CMAKE_EXTRA_GENERATOR\"],\r\n\t[\"variable\", \"CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES\"],\r\n\t[\"variable\", \"CMAKE_FIND_APPBUNDLE\"],\r\n\t[\"variable\", \"CMAKE_FIND_FRAMEWORK\"],\r\n\t[\"variable\", \"CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX\"],\r\n\t[\"variable\", \"CMAKE_FIND_LIBRARY_PREFIXES\"],\r\n\t[\"variable\", \"CMAKE_FIND_LIBRARY_SUFFIXES\"],\r\n\t[\"variable\", \"CMAKE_FIND_NO_INSTALL_PREFIX\"],\r\n\t[\"variable\", \"CMAKE_FIND_PACKAGE_NAME\"],\r\n\t[\"variable\", \"CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY\"],\r\n\t[\"variable\", \"CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY\"],\r\n\t[\"variable\", \"CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS\"],\r\n\t[\"variable\", \"CMAKE_FIND_PACKAGE_SORT_DIRECTION\"],\r\n\t[\"variable\", \"CMAKE_FIND_PACKAGE_SORT_ORDER\"],\r\n\t[\"variable\", \"CMAKE_FIND_PACKAGE_WARN_NO_MODULE\"],\r\n\t[\"variable\", \"CMAKE_FIND_ROOT_PATH\"],\r\n\t[\"variable\", \"CMAKE_FIND_ROOT_PATH_MODE_INCLUDE\"],\r\n\t[\"variable\", \"CMAKE_FIND_ROOT_PATH_MODE_LIBRARY\"],\r\n\t[\"variable\", \"CMAKE_FIND_ROOT_PATH_MODE_PACKAGE\"],\r\n\t[\"variable\", \"CMAKE_FIND_ROOT_PATH_MODE_PROGRAM\"],\r\n\t[\"variable\", \"CMAKE_FOLDER\"],\r\n\t[\"variable\", \"CMAKE_FRAMEWORK_PATH\"],\r\n\t[\"variable\", \"CMAKE_Fortran_FORMAT\"],\r\n\t[\"variable\", \"CMAKE_Fortran_MODDIR_DEFAULT\"],\r\n\t[\"variable\", \"CMAKE_Fortran_MODDIR_FLAG\"],\r\n\t[\"variable\", \"CMAKE_Fortran_MODOUT_FLAG\"],\r\n\t[\"variable\", \"CMAKE_Fortran_MODULE_DIRECTORY\"],\r\n\t[\"variable\", \"CMAKE_GENERATOR\"],\r\n\t[\"variable\", \"CMAKE_GENERATOR_INSTANCE\"],\r\n\t[\"variable\", \"CMAKE_GENERATOR_PLATFORM\"],\r\n\t[\"variable\", \"CMAKE_GENERATOR_TOOLSET\"],\r\n\t[\"variable\", \"CMAKE_GHS_NO_SOURCE_GROUP_FILE\"],\r\n\t[\"variable\", \"CMAKE_GLOBAL_AUTOGEN_TARGET\"],\r\n\t[\"variable\", \"CMAKE_GLOBAL_AUTOGEN_TARGET_NAME\"],\r\n\t[\"variable\", \"CMAKE_GLOBAL_AUTORCC_TARGET\"],\r\n\t[\"variable\", \"CMAKE_GLOBAL_AUTORCC_TARGET_NAME\"],\r\n\t[\"variable\", \"CMAKE_GNUtoMS\"],\r\n\t[\"variable\", \"CMAKE_HOME_DIRECTORY\"],\r\n\t[\"variable\", \"CMAKE_HOST_APPLE\"],\r\n\t[\"variable\", \"CMAKE_HOST_SOLARIS\"],\r\n\t[\"variable\", \"CMAKE_HOST_SYSTEM\"],\r\n\t[\"variable\", \"CMAKE_HOST_SYSTEM_NAME\"],\r\n\t[\"variable\", \"CMAKE_HOST_SYSTEM_PROCESSOR\"],\r\n\t[\"variable\", \"CMAKE_HOST_SYSTEM_VERSION\"],\r\n\t[\"variable\", \"CMAKE_HOST_UNIX\"],\r\n\t[\"variable\", \"CMAKE_HOST_WIN32\"],\r\n\t[\"variable\", \"CMAKE_IGNORE_PATH\"],\r\n\t[\"variable\", \"CMAKE_IMPORT_LIBRARY_PREFIX\"],\r\n\t[\"variable\", \"CMAKE_IMPORT_LIBRARY_SUFFIX\"],\r\n\t[\"variable\", \"CMAKE_INCLUDE_CURRENT_DIR\"],\r\n\t[\"variable\", \"CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE\"],\r\n\t[\"variable\", \"CMAKE_INCLUDE_DIRECTORIES_BEFORE\"],\r\n\t[\"variable\", \"CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE\"],\r\n\t[\"variable\", \"CMAKE_INCLUDE_PATH\"],\r\n\t[\"variable\", \"CMAKE_INSTALL_DEFAULT_COMPONENT_NAME\"],\r\n\t[\"variable\", \"CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS\"],\r\n\t[\"variable\", \"CMAKE_INSTALL_MESSAGE\"],\r\n\t[\"variable\", \"CMAKE_INSTALL_NAME_DIR\"],\r\n\t[\"variable\", \"CMAKE_INSTALL_PREFIX\"],\r\n\t[\"variable\", \"CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT\"],\r\n\t[\"variable\", \"CMAKE_INSTALL_RPATH\"],\r\n\t[\"variable\", \"CMAKE_INSTALL_RPATH_USE_LINK_PATH\"],\r\n\t[\"variable\", \"CMAKE_INTERNAL_PLATFORM_ABI\"],\r\n\t[\"variable\", \"CMAKE_INTERPROCEDURAL_OPTIMIZATION\"],\r\n\t[\"variable\", \"CMAKE_INTERPROCEDURAL_OPTIMIZATION_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_IOS_INSTALL_COMBINED\"],\r\n\t[\"variable\", \"CMAKE_JOB_POOLS\"],\r\n\t[\"variable\", \"CMAKE_JOB_POOL_COMPILE\"],\r\n\t[\"variable\", \"CMAKE_JOB_POOL_LINK\"],\r\n\t[\"variable\", \"CMAKE_LIBRARY_ARCHITECTURE\"],\r\n\t[\"variable\", \"CMAKE_LIBRARY_ARCHITECTURE_REGEX\"],\r\n\t[\"variable\", \"CMAKE_LIBRARY_OUTPUT_DIRECTORY\"],\r\n\t[\"variable\", \"CMAKE_LIBRARY_OUTPUT_DIRECTORY_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_LIBRARY_PATH\"],\r\n\t[\"variable\", \"CMAKE_LIBRARY_PATH_FLAG\"],\r\n\t[\"variable\", \"CMAKE_LINK_DEF_FILE_FLAG\"],\r\n\t[\"variable\", \"CMAKE_LINK_DEPENDS_NO_SHARED\"],\r\n\t[\"variable\", \"CMAKE_LINK_DIRECTORIES_BEFORE\"],\r\n\t[\"variable\", \"CMAKE_LINK_INTERFACE_LIBRARIES\"],\r\n\t[\"variable\", \"CMAKE_LINK_LIBRARY_FILE_FLAG\"],\r\n\t[\"variable\", \"CMAKE_LINK_LIBRARY_FLAG\"],\r\n\t[\"variable\", \"CMAKE_LINK_LIBRARY_SUFFIX\"],\r\n\t[\"variable\", \"CMAKE_LINK_SEARCH_END_STATIC\"],\r\n\t[\"variable\", \"CMAKE_LINK_SEARCH_START_STATIC\"],\r\n\t[\"variable\", \"CMAKE_LINK_WHAT_YOU_USE\"],\r\n\t[\"variable\", \"CMAKE_MACOSX_BUNDLE\"],\r\n\t[\"variable\", \"CMAKE_MACOSX_RPATH\"],\r\n\t[\"variable\", \"CMAKE_MAJOR_VERSION\"],\r\n\t[\"variable\", \"CMAKE_MAKE_PROGRAM\"],\r\n\t[\"variable\", \"CMAKE_MAP_IMPORTED_CONFIG_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_MATCH_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_MATCH_COUNT\"],\r\n\t[\"variable\", \"CMAKE_MAXIMUM_RECURSION_DEPTH\"],\r\n\t[\"variable\", \"CMAKE_MFC_FLAG\"],\r\n\t[\"variable\", \"CMAKE_MINIMUM_REQUIRED_VERSION\"],\r\n\t[\"variable\", \"CMAKE_MINOR_VERSION\"],\r\n\t[\"variable\", \"CMAKE_MODULE_LINKER_FLAGS\"],\r\n\t[\"variable\", \"CMAKE_MODULE_LINKER_FLAGS_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_MODULE_LINKER_FLAGS_WHATEVER_INIT\"],\r\n\t[\"variable\", \"CMAKE_MODULE_LINKER_FLAGS_INIT\"],\r\n\t[\"variable\", \"CMAKE_MODULE_PATH\"],\r\n\t[\"variable\", \"CMAKE_MSVCIDE_RUN_PATH\"],\r\n\t[\"variable\", \"CMAKE_NETRC\"],\r\n\t[\"variable\", \"CMAKE_NETRC_FILE\"],\r\n\t[\"variable\", \"CMAKE_NINJA_OUTPUT_PATH_PREFIX\"],\r\n\t[\"variable\", \"CMAKE_NOT_USING_CONFIG_FLAGS\"],\r\n\t[\"variable\", \"CMAKE_NO_BUILTIN_CHRPATH\"],\r\n\t[\"variable\", \"CMAKE_NO_SYSTEM_FROM_IMPORTED\"],\r\n\t[\"variable\", \"CMAKE_OBJECT_PATH_MAX\"],\r\n\t[\"variable\", \"CMAKE_OSX_ARCHITECTURES\"],\r\n\t[\"variable\", \"CMAKE_OSX_DEPLOYMENT_TARGET\"],\r\n\t[\"variable\", \"CMAKE_OSX_SYSROOT\"],\r\n\t[\"variable\", \"CMAKE_PARENT_LIST_FILE\"],\r\n\t[\"variable\", \"CMAKE_PATCH_VERSION\"],\r\n\t[\"variable\", \"CMAKE_PDB_OUTPUT_DIRECTORY\"],\r\n\t[\"variable\", \"CMAKE_PDB_OUTPUT_DIRECTORY_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_POLICY_DEFAULT_CMPWHATEVER\"],\r\n\t[\"variable\", \"CMAKE_POLICY_WARNING_CMPWHATEVER\"],\r\n\t[\"variable\", \"CMAKE_POSITION_INDEPENDENT_CODE\"],\r\n\t[\"variable\", \"CMAKE_PREFIX_PATH\"],\r\n\t[\"variable\", \"CMAKE_PROGRAM_PATH\"],\r\n\t[\"variable\", \"CMAKE_PROJECT_WHATEVER_INCLUDE\"],\r\n\t[\"variable\", \"CMAKE_PROJECT_DESCRIPTION\"],\r\n\t[\"variable\", \"CMAKE_PROJECT_HOMEPAGE_URL\"],\r\n\t[\"variable\", \"CMAKE_PROJECT_NAME\"],\r\n\t[\"variable\", \"CMAKE_PROJECT_VERSION\"],\r\n\t[\"variable\", \"CMAKE_PROJECT_VERSION_MAJOR\"],\r\n\t[\"variable\", \"CMAKE_PROJECT_VERSION_MINOR\"],\r\n\t[\"variable\", \"CMAKE_PROJECT_VERSION_PATCH\"],\r\n\t[\"variable\", \"CMAKE_PROJECT_VERSION_TWEAK\"],\r\n\t[\"variable\", \"CMAKE_RANLIB\"],\r\n\t[\"variable\", \"CMAKE_ROOT\"],\r\n\t[\"variable\", \"CMAKE_RULE_MESSAGES\"],\r\n\t[\"variable\", \"CMAKE_RUNTIME_OUTPUT_DIRECTORY\"],\r\n\t[\"variable\", \"CMAKE_RUNTIME_OUTPUT_DIRECTORY_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_SCRIPT_MODE_FILE\"],\r\n\t[\"variable\", \"CMAKE_SHARED_LIBRARY_PREFIX\"],\r\n\t[\"variable\", \"CMAKE_SHARED_LIBRARY_SUFFIX\"],\r\n\t[\"variable\", \"CMAKE_SHARED_LINKER_FLAGS\"],\r\n\t[\"variable\", \"CMAKE_SHARED_LINKER_FLAGS_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_SHARED_LINKER_FLAGS_WHATEVER_INIT\"],\r\n\t[\"variable\", \"CMAKE_SHARED_LINKER_FLAGS_INIT\"],\r\n\t[\"variable\", \"CMAKE_SHARED_MODULE_PREFIX\"],\r\n\t[\"variable\", \"CMAKE_SHARED_MODULE_SUFFIX\"],\r\n\t[\"variable\", \"CMAKE_SIZEOF_VOID_P\"],\r\n\t[\"variable\", \"CMAKE_SKIP_BUILD_RPATH\"],\r\n\t[\"variable\", \"CMAKE_SKIP_INSTALL_ALL_DEPENDENCY\"],\r\n\t[\"variable\", \"CMAKE_SKIP_INSTALL_RPATH\"],\r\n\t[\"variable\", \"CMAKE_SKIP_INSTALL_RULES\"],\r\n\t[\"variable\", \"CMAKE_SKIP_RPATH\"],\r\n\t[\"variable\", \"CMAKE_SOURCE_DIR\"],\r\n\t[\"variable\", \"CMAKE_STAGING_PREFIX\"],\r\n\t[\"variable\", \"CMAKE_STATIC_LIBRARY_PREFIX\"],\r\n\t[\"variable\", \"CMAKE_STATIC_LIBRARY_SUFFIX\"],\r\n\t[\"variable\", \"CMAKE_STATIC_LINKER_FLAGS\"],\r\n\t[\"variable\", \"CMAKE_STATIC_LINKER_FLAGS_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_STATIC_LINKER_FLAGS_WHATEVER_INIT\"],\r\n\t[\"variable\", \"CMAKE_STATIC_LINKER_FLAGS_INIT\"],\r\n\t[\"variable\", \"CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS\"],\r\n\t[\"variable\", \"CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE\"],\r\n\t[\"variable\", \"CMAKE_SUPPRESS_REGENERATION\"],\r\n\t[\"variable\", \"CMAKE_SYSROOT\"],\r\n\t[\"variable\", \"CMAKE_SYSROOT_COMPILE\"],\r\n\t[\"variable\", \"CMAKE_SYSROOT_LINK\"],\r\n\t[\"variable\", \"CMAKE_SYSTEM\"],\r\n\t[\"variable\", \"CMAKE_SYSTEM_APPBUNDLE_PATH\"],\r\n\t[\"variable\", \"CMAKE_SYSTEM_FRAMEWORK_PATH\"],\r\n\t[\"variable\", \"CMAKE_SYSTEM_IGNORE_PATH\"],\r\n\t[\"variable\", \"CMAKE_SYSTEM_INCLUDE_PATH\"],\r\n\t[\"variable\", \"CMAKE_SYSTEM_LIBRARY_PATH\"],\r\n\t[\"variable\", \"CMAKE_SYSTEM_NAME\"],\r\n\t[\"variable\", \"CMAKE_SYSTEM_PREFIX_PATH\"],\r\n\t[\"variable\", \"CMAKE_SYSTEM_PROCESSOR\"],\r\n\t[\"variable\", \"CMAKE_SYSTEM_PROGRAM_PATH\"],\r\n\t[\"variable\", \"CMAKE_SYSTEM_VERSION\"],\r\n\t[\"variable\", \"CMAKE_Swift_LANGUAGE_VERSION\"],\r\n\t[\"variable\", \"CMAKE_TOOLCHAIN_FILE\"],\r\n\t[\"variable\", \"CMAKE_TRY_COMPILE_CONFIGURATION\"],\r\n\t[\"variable\", \"CMAKE_TRY_COMPILE_PLATFORM_VARIABLES\"],\r\n\t[\"variable\", \"CMAKE_TRY_COMPILE_TARGET_TYPE\"],\r\n\t[\"variable\", \"CMAKE_TWEAK_VERSION\"],\r\n\t[\"variable\", \"CMAKE_USER_MAKE_RULES_OVERRIDE\"],\r\n\t[\"variable\", \"CMAKE_USER_MAKE_RULES_OVERRIDE_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_USE_RELATIVE_PATHS\"],\r\n\t[\"variable\", \"CMAKE_VERBOSE_MAKEFILE\"],\r\n\t[\"variable\", \"CMAKE_VERSION\"],\r\n\t[\"variable\", \"CMAKE_VISIBILITY_INLINES_HIDDEN\"],\r\n\t[\"variable\", \"CMAKE_VS_DEVENV_COMMAND\"],\r\n\t[\"variable\", \"CMAKE_VS_GLOBALS\"],\r\n\t[\"variable\", \"CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD\"],\r\n\t[\"variable\", \"CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD\"],\r\n\t[\"variable\", \"CMAKE_VS_INTEL_Fortran_PROJECT_VERSION\"],\r\n\t[\"variable\", \"CMAKE_VS_MSBUILD_COMMAND\"],\r\n\t[\"variable\", \"CMAKE_VS_NsightTegra_VERSION\"],\r\n\t[\"variable\", \"CMAKE_VS_PLATFORM_NAME\"],\r\n\t[\"variable\", \"CMAKE_VS_PLATFORM_TOOLSET\"],\r\n\t[\"variable\", \"CMAKE_VS_PLATFORM_TOOLSET_CUDA\"],\r\n\t[\"variable\", \"CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE\"],\r\n\t[\"variable\", \"CMAKE_VS_PLATFORM_TOOLSET_VERSION\"],\r\n\t[\"variable\", \"CMAKE_VS_SDK_EXCLUDE_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_VS_SDK_EXECUTABLE_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_VS_SDK_INCLUDE_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_VS_SDK_LIBRARY_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_VS_SDK_LIBRARY_WINRT_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_VS_SDK_REFERENCE_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_VS_SDK_SOURCE_DIRECTORIES\"],\r\n\t[\"variable\", \"CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION\"],\r\n\t[\"variable\", \"CMAKE_VS_WINRT_BY_DEFAULT\"],\r\n\t[\"variable\", \"CMAKE_WARN_DEPRECATED\"],\r\n\t[\"variable\", \"CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION\"],\r\n\t[\"variable\", \"CMAKE_WIN32_EXECUTABLE\"],\r\n\t[\"variable\", \"CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS\"],\r\n\t[\"variable\", \"CMAKE_XCODE_ATTRIBUTE_WHATEVER\"],\r\n\t[\"variable\", \"CMAKE_XCODE_GENERATE_SCHEME\"],\r\n\t[\"variable\", \"CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY\"],\r\n\t[\"variable\", \"CMAKE_XCODE_PLATFORM_TOOLSET\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_GUARD_MALLOC\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_MALLOC_STACK\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_THREAD_SANITIZER\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_THREAD_SANITIZER_STOP\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP\"],\r\n\t[\"variable\", \"CMAKE_XCODE_SCHEME_ZOMBIE_OBJECTS\"],\r\n\t[\"variable\", \"CPACK_ABSOLUTE_DESTINATION_FILES\"],\r\n\t[\"variable\", \"CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY\"],\r\n\t[\"variable\", \"CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION\"],\r\n\t[\"variable\", \"CPACK_INCLUDE_TOPLEVEL_DIRECTORY\"],\r\n\t[\"variable\", \"CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS\"],\r\n\t[\"variable\", \"CPACK_INSTALL_SCRIPT\"],\r\n\t[\"variable\", \"CPACK_PACKAGING_INSTALL_PREFIX\"],\r\n\t[\"variable\", \"CPACK_SET_DESTDIR\"],\r\n\t[\"variable\", \"CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION\"],\r\n\t[\"variable\", \"CTEST_BINARY_DIRECTORY\"],\r\n\t[\"variable\", \"CTEST_BUILD_COMMAND\"],\r\n\t[\"variable\", \"CTEST_BUILD_NAME\"],\r\n\t[\"variable\", \"CTEST_BZR_COMMAND\"],\r\n\t[\"variable\", \"CTEST_BZR_UPDATE_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_CHANGE_ID\"],\r\n\t[\"variable\", \"CTEST_CHECKOUT_COMMAND\"],\r\n\t[\"variable\", \"CTEST_CONFIGURATION_TYPE\"],\r\n\t[\"variable\", \"CTEST_CONFIGURE_COMMAND\"],\r\n\t[\"variable\", \"CTEST_COVERAGE_COMMAND\"],\r\n\t[\"variable\", \"CTEST_COVERAGE_EXTRA_FLAGS\"],\r\n\t[\"variable\", \"CTEST_CURL_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_COVERAGE_EXCLUDE\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_ERROR_EXCEPTION\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_ERROR_MATCH\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_ERROR_POST_CONTEXT\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_ERROR_PRE_CONTEXT\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_MEMCHECK_IGNORE\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_POST_MEMCHECK\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_POST_TEST\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_PRE_MEMCHECK\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_PRE_TEST\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_TESTS_IGNORE\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_WARNING_EXCEPTION\"],\r\n\t[\"variable\", \"CTEST_CUSTOM_WARNING_MATCH\"],\r\n\t[\"variable\", \"CTEST_CVS_CHECKOUT\"],\r\n\t[\"variable\", \"CTEST_CVS_COMMAND\"],\r\n\t[\"variable\", \"CTEST_CVS_UPDATE_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_DROP_LOCATION\"],\r\n\t[\"variable\", \"CTEST_DROP_METHOD\"],\r\n\t[\"variable\", \"CTEST_DROP_SITE\"],\r\n\t[\"variable\", \"CTEST_DROP_SITE_CDASH\"],\r\n\t[\"variable\", \"CTEST_DROP_SITE_PASSWORD\"],\r\n\t[\"variable\", \"CTEST_DROP_SITE_USER\"],\r\n\t[\"variable\", \"CTEST_EXTRA_COVERAGE_GLOB\"],\r\n\t[\"variable\", \"CTEST_GIT_COMMAND\"],\r\n\t[\"variable\", \"CTEST_GIT_INIT_SUBMODULES\"],\r\n\t[\"variable\", \"CTEST_GIT_UPDATE_CUSTOM\"],\r\n\t[\"variable\", \"CTEST_GIT_UPDATE_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_HG_COMMAND\"],\r\n\t[\"variable\", \"CTEST_HG_UPDATE_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_LABELS_FOR_SUBPROJECTS\"],\r\n\t[\"variable\", \"CTEST_MEMORYCHECK_COMMAND\"],\r\n\t[\"variable\", \"CTEST_MEMORYCHECK_COMMAND_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_MEMORYCHECK_SANITIZER_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_MEMORYCHECK_SUPPRESSIONS_FILE\"],\r\n\t[\"variable\", \"CTEST_MEMORYCHECK_TYPE\"],\r\n\t[\"variable\", \"CTEST_NIGHTLY_START_TIME\"],\r\n\t[\"variable\", \"CTEST_P4_CLIENT\"],\r\n\t[\"variable\", \"CTEST_P4_COMMAND\"],\r\n\t[\"variable\", \"CTEST_P4_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_P4_UPDATE_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_RUN_CURRENT_SCRIPT\"],\r\n\t[\"variable\", \"CTEST_SCP_COMMAND\"],\r\n\t[\"variable\", \"CTEST_SITE\"],\r\n\t[\"variable\", \"CTEST_SOURCE_DIRECTORY\"],\r\n\t[\"variable\", \"CTEST_SUBMIT_URL\"],\r\n\t[\"variable\", \"CTEST_SVN_COMMAND\"],\r\n\t[\"variable\", \"CTEST_SVN_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_SVN_UPDATE_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_TEST_LOAD\"],\r\n\t[\"variable\", \"CTEST_TEST_TIMEOUT\"],\r\n\t[\"variable\", \"CTEST_TRIGGER_SITE\"],\r\n\t[\"variable\", \"CTEST_UPDATE_COMMAND\"],\r\n\t[\"variable\", \"CTEST_UPDATE_OPTIONS\"],\r\n\t[\"variable\", \"CTEST_UPDATE_VERSION_ONLY\"],\r\n\t[\"variable\", \"CTEST_USE_LAUNCHERS\"],\r\n\t[\"variable\", \"CYGWIN\"],\r\n\t[\"variable\", \"ENV\"],\r\n\t[\"variable\", \"EXECUTABLE_OUTPUT_PATH\"],\r\n\t[\"variable\", \"GHS-MULTI\"],\r\n\t[\"variable\", \"IOS\"],\r\n\t[\"variable\", \"LIBRARY_OUTPUT_PATH\"],\r\n\t[\"variable\", \"MINGW\"],\r\n\t[\"variable\", \"MSVC\"],\r\n\t[\"variable\", \"MSVC10\"],\r\n\t[\"variable\", \"MSVC11\"],\r\n\t[\"variable\", \"MSVC12\"],\r\n\t[\"variable\", \"MSVC14\"],\r\n\t[\"variable\", \"MSVC60\"],\r\n\t[\"variable\", \"MSVC70\"],\r\n\t[\"variable\", \"MSVC71\"],\r\n\t[\"variable\", \"MSVC80\"],\r\n\t[\"variable\", \"MSVC90\"],\r\n\t[\"variable\", \"MSVC_IDE\"],\r\n\t[\"variable\", \"MSVC_TOOLSET_VERSION\"],\r\n\t[\"variable\", \"MSVC_VERSION\"],\r\n\t[\"variable\", \"MSYS\"],\r\n\t[\"variable\", \"PROJECT_BINARY_DIR\"],\r\n\t[\"variable\", \"PROJECT_DESCRIPTION\"],\r\n\t[\"variable\", \"PROJECT_HOMEPAGE_URL\"],\r\n\t[\"variable\", \"PROJECT_NAME\"],\r\n\t[\"variable\", \"PROJECT_SOURCE_DIR\"],\r\n\t[\"variable\", \"PROJECT_VERSION\"],\r\n\t[\"variable\", \"PROJECT_VERSION_MAJOR\"],\r\n\t[\"variable\", \"PROJECT_VERSION_MINOR\"],\r\n\t[\"variable\", \"PROJECT_VERSION_PATCH\"],\r\n\t[\"variable\", \"PROJECT_VERSION_TWEAK\"],\r\n\t[\"variable\", \"UNIX\"],\r\n\t[\"variable\", \"WIN32\"],\r\n\t[\"variable\", \"WINCE\"],\r\n\t[\"variable\", \"WINDOWS_PHONE\"],\r\n\t[\"variable\", \"WINDOWS_STORE\"],\r\n\t[\"variable\", \"XCODE\"],\r\n\t[\"variable\", \"XCODE_VERSION\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all variables."
  },
  {
    "path": "tests/languages/cobol/boolean_feature.test",
    "content": "false False FALSE\r\ntrue True TRUE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"false\"], [\"boolean\", \"False\"], [\"boolean\", \"FALSE\"],\r\n\t[\"boolean\", \"true\"], [\"boolean\", \"True\"], [\"boolean\", \"TRUE\"]\r\n]"
  },
  {
    "path": "tests/languages/cobol/class-name_feature.test",
    "content": "PIC 99/99/9999 SOURCE sales-date.\nPIC $$$$9.99 SOURCE sales-amount.\nPIC X(34) SOURCE sales-record.\n\npic 9 usage computational value is 5.\npic 99 value is 10.\n\npic x(2)\npic a(20).\n\ngreeting pic x(12) value is \"Hello World\".\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"PIC\"],\n\t[\"class-name\", [\"99/99/9999\"]],\n\t[\"keyword\", \"SOURCE\"],\n\t\" sales-date\",\n\t[\"punctuation\", \".\"],\n\n\t[\"keyword\", \"PIC\"],\n\t[\"class-name\", [\"$$$$9.99\"]],\n\t[\"keyword\", \"SOURCE\"],\n\t\" sales-amount\",\n\t[\"punctuation\", \".\"],\n\n\t[\"keyword\", \"PIC\"],\n\t[\"class-name\", [\n\t\t\"X\",\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"number\", \"34\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"keyword\", \"SOURCE\"],\n\t\" sales-record\",\n\t[\"punctuation\", \".\"],\n\n\t[\"keyword\", \"pic\"],\n\t[\"class-name\", [\"9\"]],\n\t[\"keyword\", \"usage\"],\n\t[\"keyword\", \"computational\"],\n\t[\"keyword\", \"value\"],\n\t[\"keyword\", \"is\"],\n\t[\"number\", \"5\"],\n\t[\"punctuation\", \".\"],\n\n\t[\"keyword\", \"pic\"],\n\t[\"class-name\", [\"99\"]],\n\t[\"keyword\", \"value\"],\n\t[\"keyword\", \"is\"],\n\t[\"number\", \"10\"],\n\t[\"punctuation\", \".\"],\n\n\t[\"keyword\", \"pic\"],\n\t[\"class-name\", [\n\t\t\"x\",\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"number\", \"2\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"keyword\", \"pic\"],\n\t[\"class-name\", [\n\t\t\"a\",\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"number\", \"20\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \".\"],\n\n\t\"\\r\\n\\r\\ngreeting \",\n\t[\"keyword\", \"pic\"],\n\t[\"class-name\", [\n\t\t\"x\",\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"number\", \"12\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"keyword\", \"value\"],\n\t[\"keyword\", \"is\"],\n\t[\"string\", \"\\\"Hello World\\\"\"],\n\t[\"punctuation\", \".\"]\n]\n"
  },
  {
    "path": "tests/languages/cobol/comment_feature.test",
    "content": "*> comment\r\n\r\n* temporary variables in computational usage.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"*> comment\"],\r\n\r\n\t[\"comment\", \"* temporary variables in computational usage.\"]\r\n]"
  },
  {
    "path": "tests/languages/cobol/level_feature.test",
    "content": "01 ServiceRecord.\r\n   05 SSN                        pic 9(9).\r\n   05 Name.\r\n      10 GivenName               pic a(20).\r\n      10 FamilyName              pic a(20).\r\n   05 Rank.\r\n      10 RankType                pic a(1)\r\n         88 ValidRankType        value 'O' 'E' 'W'.\r\n         88 Enlisted             value 'E'.\r\n         88 WarrantOfficer       value 'W'.\r\n         88 CommissionedOfficer  value 'W'.\r\n      10 Grade                   pic x(2)\r\n         88 ValidGrade           value '1' '2' '3' '4' '5' '6' '7' '8' '9' '10' '1E' '2E' '3E'.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"level\", \"01\"],\r\n\t\" ServiceRecord\",\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"level\", \"05\"],\r\n\t\" SSN                        \",\r\n\t[\"keyword\", \"pic\"],\r\n\t[\"class-name\", [\r\n\t\t\"9\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"9\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"level\", \"05\"],\r\n\t\" Name\",\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"level\", \"10\"],\r\n\t\" GivenName               \",\r\n\t[\"keyword\", \"pic\"],\r\n\t[\"class-name\", [\r\n\t\t\"a\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"20\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"level\", \"10\"],\r\n\t\" FamilyName              \",\r\n\t[\"keyword\", \"pic\"],\r\n\t[\"class-name\", [\r\n\t\t\"a\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"20\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"level\", \"05\"],\r\n\t\" Rank\",\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"level\", \"10\"],\r\n\t\" RankType                \",\r\n\t[\"keyword\", \"pic\"],\r\n\t[\"class-name\", [\r\n\t\t\"a\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"level\", \"88\"],\r\n\t\" ValidRankType        \",\r\n\t[\"keyword\", \"value\"],\r\n\t[\"string\", \"'O'\"],\r\n\t[\"string\", \"'E'\"],\r\n\t[\"string\", \"'W'\"],\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"level\", \"88\"],\r\n\t\" Enlisted             \",\r\n\t[\"keyword\", \"value\"],\r\n\t[\"string\", \"'E'\"],\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"level\", \"88\"],\r\n\t\" WarrantOfficer       \",\r\n\t[\"keyword\", \"value\"],\r\n\t[\"string\", \"'W'\"],\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"level\", \"88\"],\r\n\t\" CommissionedOfficer  \",\r\n\t[\"keyword\", \"value\"],\r\n\t[\"string\", \"'W'\"],\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"level\", \"10\"],\r\n\t\" Grade                   \",\r\n\t[\"keyword\", \"pic\"],\r\n\t[\"class-name\", [\r\n\t\t\"x\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"level\", \"88\"],\r\n\t\" ValidGrade           \",\r\n\t[\"keyword\", \"value\"],\r\n\t[\"string\", \"'1'\"],\r\n\t[\"string\", \"'2'\"],\r\n\t[\"string\", \"'3'\"],\r\n\t[\"string\", \"'4'\"],\r\n\t[\"string\", \"'5'\"],\r\n\t[\"string\", \"'6'\"],\r\n\t[\"string\", \"'7'\"],\r\n\t[\"string\", \"'8'\"],\r\n\t[\"string\", \"'9'\"],\r\n\t[\"string\", \"'10'\"],\r\n\t[\"string\", \"'1E'\"],\r\n\t[\"string\", \"'2E'\"],\r\n\t[\"string\", \"'3E'\"],\r\n\t[\"punctuation\", \".\"]\r\n]"
  },
  {
    "path": "tests/languages/cobol/number_feature.test",
    "content": "zero Zero ZERO\r\n\r\n= 0\r\n= 123\r\n= .4e-5\r\n= +3e5\r\n= -43\r\n\r\nx\"ff\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"zero\"], [\"number\", \"Zero\"], [\"number\", \"ZERO\"],\r\n\r\n\t[\"operator\", \"=\"], [\"number\", \"0\"],\r\n\t[\"operator\", \"=\"], [\"number\", \"123\"],\r\n\t[\"operator\", \"=\"], [\"number\", \".4e-5\"],\r\n\t[\"operator\", \"=\"], [\"number\", \"+3e5\"],\r\n\t[\"operator\", \"=\"], [\"number\", \"-43\"],\r\n\r\n\t[\"string\", \"x\\\"ff\\\"\"]\r\n]"
  },
  {
    "path": "tests/languages/cobol/operator_feature.test",
    "content": "+ - * /\r\n= <> < <= > >=\r\n&\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"<>\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\r\n\t[\"operator\", \"&\"]\r\n]"
  },
  {
    "path": "tests/languages/cobol/punctuation_feature.test",
    "content": "( )\r\n. : ,\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \".\"], [\"punctuation\", \":\"], [\"punctuation\", \",\"]\r\n]"
  },
  {
    "path": "tests/languages/cobol/string_feature.test",
    "content": "\"\"\r\n''\r\n\"foo\"\"bar\"\r\n'foo''bar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"\\\"foo\\\"\\\"bar\\\"\"],\r\n\t[\"string\", \"'foo''bar'\"]\r\n]"
  },
  {
    "path": "tests/languages/coffeescript/block-regex_feature.test",
    "content": "///foo[bar]///\r\n///foo\r\n[bar]///\r\n///foo\r\nb#{ar}baz///\r\n///foo #bar\r\nbaz///\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"block-regex\", [\r\n        \"///foo[bar]///\"\r\n    ]],\r\n    [\"block-regex\", [\r\n        \"///foo\\r\\n[bar]///\"\r\n    ]],\r\n    [\"block-regex\", [\r\n        \"///foo\\r\\nb\",\r\n        [\"interpolation\", \"#{ar}\"],\r\n        \"baz///\"\r\n    ]],\r\n    [\"block-regex\", [\r\n        \"///foo \",\r\n        [\"comment\", \"#bar\"],\r\n        \"\\r\\nbaz///\"\r\n    ]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for block regex.\r\nAlso checks for comments and interpolations inside block regex."
  },
  {
    "path": "tests/languages/coffeescript/class-member_feature.test",
    "content": "@name\r\n@foo_bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"class-member\", \"@name\"],\r\n\t[\"class-member\", \"@foo_bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class members."
  },
  {
    "path": "tests/languages/coffeescript/comment_feature.test",
    "content": "#foo\r\n# foo bar\r\n### foo bar\r\nbaz ###\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#foo\"],\r\n\t[\"comment\", \"# foo bar\"],\r\n\t[\"multiline-comment\", \"### foo bar\\r\\nbaz ###\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments."
  },
  {
    "path": "tests/languages/coffeescript/inline-javascript_feature.test",
    "content": "`/* JS here */`\r\n`/*\r\nJS here */`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"inline-javascript\", [\r\n\t\t[\"delimiter\", \"`\"],\r\n\t\t[\"script\", [\r\n\t\t\t[\"comment\", \"/* JS here */\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"`\"]\r\n\t]],\r\n\t[\"inline-javascript\", [\r\n\t\t[\"delimiter\", \"`\"],\r\n\t\t[\"script\", [\r\n\t\t\t[\"comment\", \"/*\\r\\nJS here */\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"`\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for inline JavaScript.\r\n"
  },
  {
    "path": "tests/languages/coffeescript/keyword_feature.test",
    "content": "and break by catch\r\nclass;\r\ncontinue debugger delete\r\ndo each else extend\r\nextends;\r\nfalse finally for if in\r\ninstanceof;\r\nis isnt let\r\nloop namespace\r\nnew;\r\nno not null of off on\r\nor own return super\r\nswitch then this throw\r\ntrue try typeof undefined\r\nunless until when while\r\nwindow with yes yield\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"and\"], [\"keyword\", \"break\"], [\"keyword\", \"by\"], [\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"keyword\", \"debugger\"], [\"keyword\", \"delete\"],\r\n\t[\"keyword\", \"do\"], [\"keyword\", \"each\"], [\"keyword\", \"else\"], [\"keyword\", \"extend\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"false\"], [\"keyword\", \"finally\"], [\"keyword\", \"for\"], [\"keyword\", \"if\"], [\"keyword\", \"in\"],\r\n\t[\"keyword\", \"instanceof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"is\"], [\"keyword\", \"isnt\"], [\"keyword\", \"let\"],\r\n\t[\"keyword\", \"loop\"], [\"keyword\", \"namespace\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"no\"], [\"keyword\", \"not\"], [\"keyword\", \"null\"], [\"keyword\", \"of\"], [\"keyword\", \"off\"], [\"keyword\", \"on\"],\r\n\t[\"keyword\", \"or\"], [\"keyword\", \"own\"], [\"keyword\", \"return\"], [\"keyword\", \"super\"],\r\n\t[\"keyword\", \"switch\"], [\"keyword\", \"then\"], [\"keyword\", \"this\"], [\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"true\"], [\"keyword\", \"try\"], [\"keyword\", \"typeof\"], [\"keyword\", \"undefined\"],\r\n\t[\"keyword\", \"unless\"], [\"keyword\", \"until\"], [\"keyword\", \"when\"], [\"keyword\", \"while\"],\r\n\t[\"keyword\", \"window\"], [\"keyword\", \"with\"], [\"keyword\", \"yes\"], [\"keyword\", \"yield\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/coffeescript/property_feature.test",
    "content": "foo:\r\nfoo_bar :\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"foo\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"property\", \"foo_bar\"],\r\n\t[\"operator\", \":\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for object properties.\r\n"
  },
  {
    "path": "tests/languages/coffeescript/string_feature.test",
    "content": "''\r\n'foo'\r\n'foo\\\r\nbar'\r\n\"\"\r\n\"foo\"\r\n\"foo\\\r\nbar\"\r\n\"foo #{interpolation} bar\"\r\n''''''\r\n'''foo'''\r\n'''foo\r\nbar'''\r\n\r\n\"\"\"\"\"\"\r\n\"\"\"foo\"\"\"\r\n\"\"\"foo\r\nbar\"\"\"\r\n\"\"\"foo #{interpolation} bar\"\"\"\r\n\"foo # comment bar\"\r\n'foo # bar'\r\n\"\"\"foo\r\n#comment\r\nbar\"\"\"\r\n'''foo\r\n#comment\r\nbar'''\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'foo'\"],\r\n\t[\"string\", \"'foo\\\\\\r\\nbar'\"],\r\n\t[\"string\", [\"\\\"\\\"\"]],\r\n\t[\"string\", [\"\\\"foo\\\"\"]],\r\n\t[\"string\", [\"\\\"foo\\\\\\r\\nbar\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"\\\"foo \",\r\n\t\t[\"interpolation\", \"#{interpolation}\"],\r\n\t\t\" bar\\\"\"\r\n\t]],\r\n\r\n\t[\"multiline-string\", \"''''''\"],\r\n\t[\"multiline-string\", \"'''foo'''\"],\r\n\t[\"multiline-string\", \"'''foo\\r\\nbar'''\"],\r\n\t[\"multiline-string\", [\"\\\"\\\"\\\"\\\"\\\"\\\"\"]],\r\n\t[\"multiline-string\", [\"\\\"\\\"\\\"foo\\\"\\\"\\\"\"]],\r\n\t[\"multiline-string\", [\"\\\"\\\"\\\"foo\\r\\nbar\\\"\\\"\\\"\"]],\r\n\t[\"multiline-string\", [\r\n\t\t\"\\\"\\\"\\\"foo \",\r\n\t\t[\"interpolation\", \"#{interpolation}\"],\r\n\t\t\" bar\\\"\\\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\"\\\"foo # comment bar\\\"\"]],\r\n\t[\"string\", \"'foo # bar'\"],\r\n\t[\"multiline-string\", [\"\\\"\\\"\\\"foo\\r\\n#comment\\r\\nbar\\\"\\\"\\\"\"]],\r\n\t[\"multiline-string\", \"'''foo\\r\\n#comment\\r\\nbar'''\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line strings and block strings.\r\nAlso checks for string interpolation inside double-quoted strings."
  },
  {
    "path": "tests/languages/coffeescript+haml/coffeescript_inclusion.test",
    "content": ":coffee\r\n\t'This is coffee script'\r\n\r\n~\r\n\t:coffee\r\n\t  'This is coffee script'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-coffee\", [\r\n\t\t[\"filter-name\", \":coffee\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"string\", \"'This is coffee script'\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"~\"],\r\n\t[\"filter-coffee\", [\r\n\t\t[\"filter-name\", \":coffee\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"string\", \"'This is coffee script'\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for CoffeeScript filter in Haml. The tilde serves only as a separator.\r\n"
  },
  {
    "path": "tests/languages/coffeescript+pug/coffeescript_inclusion.test",
    "content": ":coffee\r\n\t\"#{foo}\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-coffee\", [\r\n\t\t[\"filter-name\", \":coffee\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"\",\r\n\t\t\t\t[\"interpolation\", \"#{foo}\"],\r\n\t\t\t\t\"\\\"\"\r\n\t\t\t]]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for coffee filter (CoffeeScript) in pug.\r\n"
  },
  {
    "path": "tests/languages/concurnas/annotation_feature.test",
    "content": "@Deprecated(SUBSYSTEM_DEPRECATED)\r\n@SetUp\r\n@Suppress\r\ncopyMe@\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"annotation\", \"@Deprecated\"], [\"punctuation\", \"(\"], \"SUBSYSTEM_DEPRECATED\", [\"punctuation\", \")\"],\r\n\t[\"annotation\", \"@SetUp\"],\r\n\t[\"annotation\", \"@Suppress\"],\r\n\t\"\\r\\ncopyMe\",\r\n\t[\"annotation\",\"@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for annotations."
  },
  {
    "path": "tests/languages/concurnas/comment_feature.test",
    "content": "// comment\n/*\ncomment\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// comment\"],\n\t[\"comment\", \"/*\\r\\ncomment\\r\\n*/\"]\n]\n"
  },
  {
    "path": "tests/languages/concurnas/function_feature.test",
    "content": "def myfunc() => 12\r\nmyfunc()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"def\"],\r\n\t[\"function\", \"myfunc\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"number\", \"12\"],\r\n\r\n\t\"\\r\\nmyfunc\",\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/concurnas/keyword_feature.test",
    "content": "abstract\r\nactor\r\nalso\r\nannotation\r\nassert\r\nasync\r\nawait\r\nbool\r\nboolean\r\nbreak\r\nbyte\r\ncase\r\ncatch\r\nchanged\r\nchar\r\nclass\r\nclosed\r\nconstant\r\ncontinue\r\ndef\r\ndefault\r\ndel\r\ndouble\r\nelif\r\nelse\r\nenum\r\nevery\r\nextends\r\nfalse\r\nfinally\r\nfloat\r\nfor\r\nfrom\r\nglobal\r\ngpudef\r\ngpukernel\r\nif\r\nimport\r\nin\r\ninit\r\ninject\r\nint\r\nlambda\r\nlocal\r\nlong\r\nloop\r\nmatch\r\nnew\r\nnodefault\r\nnull\r\nof\r\nonchange\r\nopen\r\nout\r\noverride\r\npackage\r\nparfor\r\nparforsync\r\npost\r\npre\r\nprivate\r\nprotected\r\nprovide\r\nprovider\r\npublic\r\nreturn\r\nshared\r\nshort\r\nsingle\r\nsize_t\r\nsizeof\r\nsuper\r\nsync\r\nthis\r\nthrow\r\ntrait\r\ntrans\r\ntransient\r\ntrue\r\ntry\r\ntypedef\r\nunchecked\r\nusing\r\nval\r\nvar\r\nvoid\r\nwhile\r\nwith\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"actor\"],\r\n\t[\"keyword\", \"also\"],\r\n\t[\"keyword\", \"annotation\"],\r\n\t[\"keyword\", \"assert\"],\r\n\t[\"keyword\", \"async\"],\r\n\t[\"keyword\", \"await\"],\r\n\t[\"keyword\", \"bool\"],\r\n\t[\"keyword\", \"boolean\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"byte\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"changed\"],\r\n\t[\"keyword\", \"char\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"closed\"],\r\n\t[\"keyword\", \"constant\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"def\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"del\"],\r\n\t[\"keyword\", \"double\"],\r\n\t[\"keyword\", \"elif\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"every\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"keyword\", \"false\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"float\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"keyword\", \"global\"],\r\n\t[\"keyword\", \"gpudef\"],\r\n\t[\"keyword\", \"gpukernel\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"init\"],\r\n\t[\"keyword\", \"inject\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"keyword\", \"lambda\"],\r\n\t[\"keyword\", \"local\"],\r\n\t[\"keyword\", \"long\"],\r\n\t[\"keyword\", \"loop\"],\r\n\t[\"keyword\", \"match\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"nodefault\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"onchange\"],\r\n\t[\"keyword\", \"open\"],\r\n\t[\"keyword\", \"out\"],\r\n\t[\"keyword\", \"override\"],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"parfor\"],\r\n\t[\"keyword\", \"parforsync\"],\r\n\t[\"keyword\", \"post\"],\r\n\t[\"keyword\", \"pre\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"provide\"],\r\n\t[\"keyword\", \"provider\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"shared\"],\r\n\t[\"keyword\", \"short\"],\r\n\t[\"keyword\", \"single\"],\r\n\t[\"keyword\", \"size_t\"],\r\n\t[\"keyword\", \"sizeof\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"sync\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"trait\"],\r\n\t[\"keyword\", \"trans\"],\r\n\t[\"keyword\", \"transient\"],\r\n\t[\"keyword\", \"true\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"typedef\"],\r\n\t[\"keyword\", \"unchecked\"],\r\n\t[\"keyword\", \"using\"],\r\n\t[\"keyword\", \"val\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/concurnas/langext_feature.test",
    "content": "myAPL || x[⍋x←6?40] ||\nSimpleLisp||(+ 1 2 (* 3 3 ) )||\n\n || invalid ||\n\n----------------------------------------------------\n\n[\n\t[\"langext\", [\n\t\t[\"class-name\", \"myAPL\"],\n\t\t[\"punctuation\", \"||\"],\n\t\t[\"string\", \" x[⍋x←6?40] \"],\n\t\t[\"punctuation\", \"||\"]\n\t]],\n\t[\"langext\", [\n\t\t[\"class-name\", \"SimpleLisp\"],\n\t\t[\"punctuation\", \"||\"],\n\t\t[\"string\", \"(+ 1 2 (* 3 3 ) )\"],\n\t\t[\"punctuation\", \"||\"]\n\t]],\n\n\t\"\\r\\n\\r\\n || invalid ||\"\n]\n"
  },
  {
    "path": "tests/languages/concurnas/number_feature.test",
    "content": "123\r\n123L\r\n123l\r\n12s\r\n12S\r\n0x0F\r\n0b00001011\r\n123.5\r\n123.5e10\r\n123.5e-10\r\n123.5e+10\r\n123.5f\r\n123.5F\r\n123_456\r\n123_456L\r\n0X01AB_23CD\r\n0B1001_1101\r\n12E34_56\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"123L\"],\r\n\t[\"number\", \"123l\"],\r\n\t[\"number\", \"12s\"],\r\n\t[\"number\", \"12S\"],\r\n\t[\"number\", \"0x0F\"],\r\n\t[\"number\", \"0b00001011\"],\r\n\t[\"number\", \"123.5\"],\r\n\t[\"number\", \"123.5e10\"],\r\n\t[\"number\", \"123.5e-10\"],\r\n\t[\"number\", \"123.5e+10\"],\r\n\t[\"number\", \"123.5f\"],\r\n\t[\"number\", \"123.5F\"],\r\n\t[\"number\", \"123_456\"],\r\n\t[\"number\", \"123_456L\"],\r\n\t[\"number\", \"0X01AB_23CD\"],\r\n\t[\"number\", \"0B1001_1101\"],\r\n\t[\"number\", \"12E34_56\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/concurnas/operator_feature.test",
    "content": "+ ++ +=\r\n- -- -=\r\n= == <>\r\n&== &<>\r\nisnot\r\nis as\r\ncomp\r\n/ /= * *=\r\nmod mod=\r\n< <== > >==\r\nand or\r\nband bor bxor\r\n^ ~\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"+=\"],\r\n\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"operator\", \"-=\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"<>\"],\r\n\r\n\t[\"operator\", \"&==\"],\r\n\t[\"operator\", \"&<>\"],\r\n\r\n\t[\"operator\", \"isnot\"],\r\n\r\n\t[\"operator\", \"is\"],\r\n\t[\"operator\", \"as\"],\r\n\r\n\t[\"operator\", \"comp\"],\r\n\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"*=\"],\r\n\r\n\t[\"operator\", \"mod\"],\r\n\t[\"operator\", \"mod=\"],\r\n\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<==\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">==\"],\r\n\r\n\t[\"operator\", \"and\"],\r\n\t[\"operator\", \"or\"],\r\n\r\n\t[\"operator\", \"band\"],\r\n\t[\"operator\", \"bor\"],\r\n\t[\"operator\", \"bxor\"],\r\n\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"~\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/concurnas/regex_feature.test",
    "content": "r'say'\nr\"hello\"\n\n----------------------------------------------------\n\n[\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"r'say'\"]\n\t]],\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"r\\\"hello\\\"\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/concurnas/string_feature.test",
    "content": "\"hi\"\r\n\"addition result: {1+2}\"\r\n'hi'\r\n'contains: \"'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"hi\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"addition result: \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"operator\", \"+\"],\r\n\t\t\t[\"number\", \"2\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"'hi'\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"'contains: \\\"'\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for raw strings.\r\n"
  },
  {
    "path": "tests/languages/cooklang/comment_feature.test",
    "content": "-- a single line comment\n[- a multi line comment on a single line -]\n[- a multi\nline comment 1 -]\n[- a multi\nline comment 2 \n-]\n[- \na multi\nline comment 3 -]\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"-- a single line comment\"],\n\t[\"comment\", \"[- a multi line comment on a single line -]\"],\n\t[\"comment\", \"[- a multi\\r\\nline comment 1 -]\"],\n\t[\"comment\", \"[- a multi\\r\\nline comment 2 \\r\\n-]\"],\n\t[\"comment\", \"[- \\r\\na multi\\r\\nline comment 3 -]\"]\n]\n"
  },
  {
    "path": "tests/languages/cooklang/cookware_feature.test",
    "content": "#spoon\n#spoon and more #spoon\n#spoon is good but more #spoon are better\n#more spoon{}\n#even more spoon{1}\n#spoon{1%set}\n#spoon{2*%kg}\n#spoon{3|1%set}\n#spoon{3*set}\n#spoon{3|set}\n#spoon{3%*set}\n#spoon{3%*%set}\n\n----------------------------------------------------\n\n[\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"]\n\t]],\n\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"]\n\t]],\n\t\" and more \",\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"]\n\t]],\n\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"]\n\t]],\n\t\" is good but more \",\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"]\n\t]],\n\t\" are better\\r\\n\",\n\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"more spoon\"],\n\t\t[\"quantity-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"even more spoon\"],\n\t\t[\"quantity-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"quantity\", \"1\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"],\n\t\t[\"quantity-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"quantity\", \"1%set\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"],\n\t\t[\"quantity-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"quantity\", \"2*%kg\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"],\n\t\t[\"quantity-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"quantity\", \"3|1%set\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"],\n\t\t[\"quantity-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"quantity\", \"3*set\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"],\n\t\t[\"quantity-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"quantity\", \"3|set\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"],\n\t\t[\"quantity-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"quantity\", \"3%*set\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"cookware-group\", [\n\t\t[\"cookware-keyword\", \"#\"],\n\t\t[\"cookware\", \"spoon\"],\n\t\t[\"quantity-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"quantity\", \"3%*%set\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/cooklang/ingredient_feature.test",
    "content": "@milk\n@milk and more @milk\n@milk is good but more @milk is better\n@more milk{}\n@even more milk{1}\n@milk{1%l}\n@milk{2*%kg}\n@milk{3|1%L}\n@milk{3*L} must not match amount-group\n@milk{3|L} \n@milk{3%*L}\n@milk{3%*%L}\n\n----------------------------------------------------\n\n[\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"]\n\t]],\n\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"]\n\t]],\n\t\" and more \",\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"]\n\t]],\n\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"]\n\t]],\n\t\" is good but more \",\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"]\n\t]],\n\t\" is better\\r\\n\",\n\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"more milk\"],\n\t\t[\"amount-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"even more milk\"],\n\t\t[\"amount-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"amount\", \"1\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"],\n\t\t[\"amount-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"amount\", \"1\"],\n\t\t\t[\"unit-separator\", \"%\"],\n\t\t\t[\"unit\", \"l\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"],\n\t\t[\"amount-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"amount\", \"2\"],\n\t\t\t[\"servings-scaler\", \"*\"],\n\t\t\t[\"unit-separator\", \"%\"],\n\t\t\t[\"unit\", \"kg\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"],\n\t\t[\"amount-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"amount\", \"3\"],\n\t\t\t[\"servings-alternative-separator\", \"|\"],\n\t\t\t[\"amount\", \"1\"],\n\t\t\t[\"unit-separator\", \"%\"],\n\t\t\t[\"unit\", \"L\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"],\n\t\t[\"amount-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"amount\", \"3\"],\n\t\t\t[\"servings-scaler\", \"*\"],\n\t\t\t\"L\",\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\t\" must not match amount-group\\r\\n\",\n\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"],\n\t\t[\"amount-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"amount\", \"3\"],\n\t\t\t[\"servings-alternative-separator\", \"|\"],\n\t\t\t[\"amount\", \"L\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"],\n\t\t[\"amount-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"amount\", \"3\"],\n\t\t\t[\"unit-separator\", \"%\"],\n\t\t\t[\"unit\", \"*L\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"ingredient-group\", [\n\t\t[\"ingredient-keyword\", \"@\"],\n\t\t[\"ingredient\", \"milk\"],\n\t\t[\"amount-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"amount\", \"3\"],\n\t\t\t[\"unit-separator\", \"%\"],\n\t\t\t[\"unit\", \"*%L\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/cooklang/meta_feature.test",
    "content": ">> servings: 1|2|3\n>> servings: 3\n>> meta without colon must not match\n\n----------------------------------------------------\n\n[\n\t[\"meta\", [\n\t\t\">> \",\n\t\t[\"property\", \"servings\"],\n\t\t\": 1|2|3\"\n\t]],\n\t[\"meta\", [\n\t\t\">> \",\n\t\t[\"property\", \"servings\"],\n\t\t\": 3\"\n\t]],\n\t\"\\r\\n>> meta without colon must not match\"\n]\n"
  },
  {
    "path": "tests/languages/cooklang/timer_feature.test",
    "content": "~{25%minutes}\n~eggs{25%minutes}\n~{abc%minutes} must not match\n~eggs{2%hours}\n~eggs{2%h}\n\n----------------------------------------------------\n\n[\n\t[\"timer-group\", [\n\t\t[\"timer-keyword\", \"~\"],\n\t\t[\"duration-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"duration\", \"25\"],\n\t\t\t[\"operator\", \"%\"],\n\t\t\t[\"unit\", \"minutes\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"timer-group\", [\n\t\t[\"timer-keyword\", \"~\"],\n\t\t[\"timer\", \"eggs\"],\n\t\t[\"duration-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"duration\", \"25\"],\n\t\t\t[\"operator\", \"%\"],\n\t\t\t[\"unit\", \"minutes\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"timer-group\", [\n\t\t[\"timer-keyword\", \"~\"],\n\t\t[\"duration-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t\"abc\",\n\t\t\t[\"operator\", \"%\"],\n\t\t\t[\"unit\", \"minutes\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\t\" must not match\\r\\n\",\n\n\t[\"timer-group\", [\n\t\t[\"timer-keyword\", \"~\"],\n\t\t[\"timer\", \"eggs\"],\n\t\t[\"duration-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"duration\", \"2\"],\n\t\t\t[\"operator\", \"%\"],\n\t\t\t[\"unit\", \"hours\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"timer-group\", [\n\t\t[\"timer-keyword\", \"~\"],\n\t\t[\"timer\", \"eggs\"],\n\t\t[\"duration-group\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"duration\", \"2\"],\n\t\t\t[\"operator\", \"%\"],\n\t\t\t[\"unit\", \"h\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/coq/attribute_feature.test",
    "content": "#[program]\r\n#[program=yes]\r\n#[deprecated(since=\"8.9.0\")]\r\n#[local, universes(polymorphic)]\r\n#[universes(polymorphic(foo,bar))]\r\n#[canonical=yes, canonical=no]\r\n#[ export ]\r\n\r\n(* legacy *)\r\nCumulative\r\nGlobal\r\nLocal\r\nMonomorphic\r\nNonCumulative\r\nPolymorphic\r\nPrivate\r\nProgram\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"attribute\", [\r\n\t\t[\"punctuation\", \"#[\"],\r\n\t\t\"program\",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"attribute\", [\r\n\t\t[\"punctuation\", \"#[\"],\r\n\t\t\"program\",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\"yes\",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"attribute\", [\r\n\t\t[\"punctuation\", \"#[\"],\r\n\t\t\"deprecated\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"since\",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"8.9.0\\\"\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"attribute\", [\r\n\t\t[\"punctuation\", \"#[\"],\r\n\t\t\"local\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" universes\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"polymorphic\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"attribute\", [\r\n\t\t[\"punctuation\", \"#[\"],\r\n\t\t\"universes\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"polymorphic\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"foo\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\"bar\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"attribute\", [\r\n\t\t[\"punctuation\", \"#[\"],\r\n\t\t\"canonical\",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\"yes\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" canonical\",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\"no\",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"attribute\", [\r\n\t\t[\"punctuation\", \"#[\"],\r\n\t\t\" export \",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t[\"comment\", \"(* legacy *)\"],\r\n\t[\"attribute\", \"Cumulative\"],\r\n\t[\"attribute\", \"Global\"],\r\n\t[\"attribute\", \"Local\"],\r\n\t[\"attribute\", \"Monomorphic\"],\r\n\t[\"attribute\", \"NonCumulative\"],\r\n\t[\"attribute\", \"Polymorphic\"],\r\n\t[\"attribute\", \"Private\"],\r\n\t[\"attribute\", \"Program\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/coq/comment_feature.test",
    "content": "(**)\r\n(* comment *)\r\n(*\r\n comment\r\n *)\r\n\r\n(* comments (* can be (* nested *) *) *)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"(**)\"],\r\n\t[\"comment\", \"(* comment *)\"],\r\n\t[\"comment\", \"(*\\r\\n comment\\r\\n *)\"],\r\n\r\n\t[\"comment\", \"(* comments (* can be (* nested *) *) *)\"]\r\n]"
  },
  {
    "path": "tests/languages/coq/keyword_feature.test",
    "content": "_\r\nAbort\r\nAbout\r\nAdd\r\nAdmit\r\nAdmitted\r\nAll\r\napply\r\nArguments\r\nas\r\nAs\r\nAssumptions\r\nat\r\nAxiom\r\nAxioms\r\nBack\r\nBackTo\r\nBacktrace\r\nBind\r\nBinOp\r\nBinOpSpec\r\nBinRel\r\nBlacklist\r\nby\r\nCanonical\r\nCase\r\nCd\r\nCheck\r\nClass\r\nClasses\r\nClose\r\nCoercion\r\nCoercions\r\ncofix\r\nCoFixpoint\r\nCoInductive\r\nCollection\r\nCombined\r\nCompute\r\nConjecture\r\nConjectures\r\nConstant\r\nConstants\r\nConstraint\r\nConstructors\r\nContext\r\nCorollary\r\nCreate\r\nCstOp\r\nCustom\r\nCut\r\nDebug\r\nDeclare\r\nDefined\r\nDefinition\r\nDelimit\r\nDependencies\r\nDependent\r\nDerive\r\nDiffs\r\nDrop\r\nElimination\r\nelse\r\nend\r\nEnd\r\nEntry\r\nEquality\r\nEval\r\nExample\r\nExistential\r\nExistentials\r\nExisting\r\nexists\r\nexists2\r\nExport\r\nExtern\r\nExtraction\r\nFact\r\nFail\r\nField\r\nFile\r\nFirstorder\r\nfix\r\nFixpoint\r\nFlags\r\nFocus\r\nfor\r\nforall\r\nFrom\r\nfun\r\nFunclass\r\nFunction\r\nFunctional\r\nGC\r\nGeneralizable\r\nGoal\r\nGrab\r\nGrammar\r\nGraph\r\nGuarded\r\nHaskell\r\nHeap\r\nHide\r\nHint\r\nHintDb\r\nHints\r\nHypotheses\r\nHypothesis\r\nIdentity\r\nif\r\nIF\r\nImmediate\r\nImplicit\r\nImplicits\r\nImport\r\nin\r\nInclude\r\nInduction\r\nInductive\r\nInfix\r\nInfo\r\nInitial\r\nInjTyp\r\nInline\r\nInspect\r\nInstance\r\nInstances\r\nIntro\r\nIntros\r\nInversion\r\nInversion_clear\r\nJSON\r\nLanguage\r\nLeft\r\nLemma\r\nlet\r\nLet\r\nLia\r\nLibraries\r\nLibrary\r\nLoad\r\nLoadPath\r\nLocate\r\nLtac\r\nLtac2\r\nmatch\r\nMatch\r\nmeasure\r\nMethod\r\nMinimality\r\nML\r\nModule\r\nModules\r\nMorphism\r\nmove\r\nNext\r\nNoInline\r\nNotation\r\nNumber\r\nObligation\r\nObligations\r\nOCaml\r\nOpaque\r\nOpen\r\nOptimize\r\nParameter\r\nParameters\r\nParametric\r\nPath\r\nPaths\r\nPrenex\r\nPreterm\r\nPrimitive\r\nPrint\r\nProfile\r\nProjections\r\nProof\r\nProp\r\nPropBinOp\r\nProperty\r\nPropOp\r\nProposition\r\nPropUOp\r\nPwd\r\nQed\r\nQuit\r\nRec\r\nRecord\r\nRecursive\r\nRedirect\r\nReduction\r\nRegister\r\nRelation\r\nRemark\r\nRemove\r\nremoved\r\nRequire\r\nReserved\r\nReset\r\nResolve\r\nRestart\r\nreturn\r\nRewrite\r\nRight\r\nRing\r\nRings\r\nSaturate\r\nSave\r\nScheme\r\nScope\r\nScopes\r\nSearch\r\nSearchHead\r\nSearchPattern\r\nSearchRewrite\r\nSection\r\nSeparate\r\nSet\r\nSetoid\r\nShow\r\nSignatures\r\nSolve\r\nSolver\r\nSort\r\nSortclass\r\nSorted\r\nSpec\r\nSProp\r\nStep\r\nStrategies\r\nStrategy\r\nString\r\nstruct\r\nStructure\r\nSubClass\r\nSubgraph\r\nSuchThat\r\nTactic\r\nTerm\r\nTestCompile\r\nthen\r\nTheorem\r\nTime\r\nTimeout\r\nTo\r\nTransparent\r\nType\r\nTypeclasses\r\nTypes\r\nTyping\r\nUndelimit\r\nUndo\r\nUnfocus\r\nUnfocused\r\nUnfold\r\nUniverse\r\nUniverses\r\nUnOp\r\nUnOpSpec\r\nUnshelve\r\nusing\r\nVariable\r\nVariables\r\nVariant\r\nVerbose\r\nView\r\nVisibility\r\nwf\r\nwhere\r\nwith\r\nZify\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"_\"],\r\n\t[\"keyword\", \"Abort\"],\r\n\t[\"keyword\", \"About\"],\r\n\t[\"keyword\", \"Add\"],\r\n\t[\"keyword\", \"Admit\"],\r\n\t[\"keyword\", \"Admitted\"],\r\n\t[\"keyword\", \"All\"],\r\n\t[\"keyword\", \"apply\"],\r\n\t[\"keyword\", \"Arguments\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"As\"],\r\n\t[\"keyword\", \"Assumptions\"],\r\n\t[\"keyword\", \"at\"],\r\n\t[\"keyword\", \"Axiom\"],\r\n\t[\"keyword\", \"Axioms\"],\r\n\t[\"keyword\", \"Back\"],\r\n\t[\"keyword\", \"BackTo\"],\r\n\t[\"keyword\", \"Backtrace\"],\r\n\t[\"keyword\", \"Bind\"],\r\n\t[\"keyword\", \"BinOp\"],\r\n\t[\"keyword\", \"BinOpSpec\"],\r\n\t[\"keyword\", \"BinRel\"],\r\n\t[\"keyword\", \"Blacklist\"],\r\n\t[\"keyword\", \"by\"],\r\n\t[\"keyword\", \"Canonical\"],\r\n\t[\"keyword\", \"Case\"],\r\n\t[\"keyword\", \"Cd\"],\r\n\t[\"keyword\", \"Check\"],\r\n\t[\"keyword\", \"Class\"],\r\n\t[\"keyword\", \"Classes\"],\r\n\t[\"keyword\", \"Close\"],\r\n\t[\"keyword\", \"Coercion\"],\r\n\t[\"keyword\", \"Coercions\"],\r\n\t[\"keyword\", \"cofix\"],\r\n\t[\"keyword\", \"CoFixpoint\"],\r\n\t[\"keyword\", \"CoInductive\"],\r\n\t[\"keyword\", \"Collection\"],\r\n\t[\"keyword\", \"Combined\"],\r\n\t[\"keyword\", \"Compute\"],\r\n\t[\"keyword\", \"Conjecture\"],\r\n\t[\"keyword\", \"Conjectures\"],\r\n\t[\"keyword\", \"Constant\"],\r\n\t[\"keyword\", \"Constants\"],\r\n\t[\"keyword\", \"Constraint\"],\r\n\t[\"keyword\", \"Constructors\"],\r\n\t[\"keyword\", \"Context\"],\r\n\t[\"keyword\", \"Corollary\"],\r\n\t[\"keyword\", \"Create\"],\r\n\t[\"keyword\", \"CstOp\"],\r\n\t[\"keyword\", \"Custom\"],\r\n\t[\"keyword\", \"Cut\"],\r\n\t[\"keyword\", \"Debug\"],\r\n\t[\"keyword\", \"Declare\"],\r\n\t[\"keyword\", \"Defined\"],\r\n\t[\"keyword\", \"Definition\"],\r\n\t[\"keyword\", \"Delimit\"],\r\n\t[\"keyword\", \"Dependencies\"],\r\n\t[\"keyword\", \"Dependent\"],\r\n\t[\"keyword\", \"Derive\"],\r\n\t[\"keyword\", \"Diffs\"],\r\n\t[\"keyword\", \"Drop\"],\r\n\t[\"keyword\", \"Elimination\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"End\"],\r\n\t[\"keyword\", \"Entry\"],\r\n\t[\"keyword\", \"Equality\"],\r\n\t[\"keyword\", \"Eval\"],\r\n\t[\"keyword\", \"Example\"],\r\n\t[\"keyword\", \"Existential\"],\r\n\t[\"keyword\", \"Existentials\"],\r\n\t[\"keyword\", \"Existing\"],\r\n\t[\"keyword\", \"exists\"],\r\n\t[\"keyword\", \"exists2\"],\r\n\t[\"keyword\", \"Export\"],\r\n\t[\"keyword\", \"Extern\"],\r\n\t[\"keyword\", \"Extraction\"],\r\n\t[\"keyword\", \"Fact\"],\r\n\t[\"keyword\", \"Fail\"],\r\n\t[\"keyword\", \"Field\"],\r\n\t[\"keyword\", \"File\"],\r\n\t[\"keyword\", \"Firstorder\"],\r\n\t[\"keyword\", \"fix\"],\r\n\t[\"keyword\", \"Fixpoint\"],\r\n\t[\"keyword\", \"Flags\"],\r\n\t[\"keyword\", \"Focus\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"forall\"],\r\n\t[\"keyword\", \"From\"],\r\n\t[\"keyword\", \"fun\"],\r\n\t[\"keyword\", \"Funclass\"],\r\n\t[\"keyword\", \"Function\"],\r\n\t[\"keyword\", \"Functional\"],\r\n\t[\"keyword\", \"GC\"],\r\n\t[\"keyword\", \"Generalizable\"],\r\n\t[\"keyword\", \"Goal\"],\r\n\t[\"keyword\", \"Grab\"],\r\n\t[\"keyword\", \"Grammar\"],\r\n\t[\"keyword\", \"Graph\"],\r\n\t[\"keyword\", \"Guarded\"],\r\n\t[\"keyword\", \"Haskell\"],\r\n\t[\"keyword\", \"Heap\"],\r\n\t[\"keyword\", \"Hide\"],\r\n\t[\"keyword\", \"Hint\"],\r\n\t[\"keyword\", \"HintDb\"],\r\n\t[\"keyword\", \"Hints\"],\r\n\t[\"keyword\", \"Hypotheses\"],\r\n\t[\"keyword\", \"Hypothesis\"],\r\n\t[\"keyword\", \"Identity\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"IF\"],\r\n\t[\"keyword\", \"Immediate\"],\r\n\t[\"keyword\", \"Implicit\"],\r\n\t[\"keyword\", \"Implicits\"],\r\n\t[\"keyword\", \"Import\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"Include\"],\r\n\t[\"keyword\", \"Induction\"],\r\n\t[\"keyword\", \"Inductive\"],\r\n\t[\"keyword\", \"Infix\"],\r\n\t[\"keyword\", \"Info\"],\r\n\t[\"keyword\", \"Initial\"],\r\n\t[\"keyword\", \"InjTyp\"],\r\n\t[\"keyword\", \"Inline\"],\r\n\t[\"keyword\", \"Inspect\"],\r\n\t[\"keyword\", \"Instance\"],\r\n\t[\"keyword\", \"Instances\"],\r\n\t[\"keyword\", \"Intro\"],\r\n\t[\"keyword\", \"Intros\"],\r\n\t[\"keyword\", \"Inversion\"],\r\n\t[\"keyword\", \"Inversion_clear\"],\r\n\t[\"keyword\", \"JSON\"],\r\n\t[\"keyword\", \"Language\"],\r\n\t[\"keyword\", \"Left\"],\r\n\t[\"keyword\", \"Lemma\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"Let\"],\r\n\t[\"keyword\", \"Lia\"],\r\n\t[\"keyword\", \"Libraries\"],\r\n\t[\"keyword\", \"Library\"],\r\n\t[\"keyword\", \"Load\"],\r\n\t[\"keyword\", \"LoadPath\"],\r\n\t[\"keyword\", \"Locate\"],\r\n\t[\"keyword\", \"Ltac\"],\r\n\t[\"keyword\", \"Ltac2\"],\r\n\t[\"keyword\", \"match\"],\r\n\t[\"keyword\", \"Match\"],\r\n\t[\"keyword\", \"measure\"],\r\n\t[\"keyword\", \"Method\"],\r\n\t[\"keyword\", \"Minimality\"],\r\n\t[\"keyword\", \"ML\"],\r\n\t[\"keyword\", \"Module\"],\r\n\t[\"keyword\", \"Modules\"],\r\n\t[\"keyword\", \"Morphism\"],\r\n\t[\"keyword\", \"move\"],\r\n\t[\"keyword\", \"Next\"],\r\n\t[\"keyword\", \"NoInline\"],\r\n\t[\"keyword\", \"Notation\"],\r\n\t[\"keyword\", \"Number\"],\r\n\t[\"keyword\", \"Obligation\"],\r\n\t[\"keyword\", \"Obligations\"],\r\n\t[\"keyword\", \"OCaml\"],\r\n\t[\"keyword\", \"Opaque\"],\r\n\t[\"keyword\", \"Open\"],\r\n\t[\"keyword\", \"Optimize\"],\r\n\t[\"keyword\", \"Parameter\"],\r\n\t[\"keyword\", \"Parameters\"],\r\n\t[\"keyword\", \"Parametric\"],\r\n\t[\"keyword\", \"Path\"],\r\n\t[\"keyword\", \"Paths\"],\r\n\t[\"keyword\", \"Prenex\"],\r\n\t[\"keyword\", \"Preterm\"],\r\n\t[\"keyword\", \"Primitive\"],\r\n\t[\"keyword\", \"Print\"],\r\n\t[\"keyword\", \"Profile\"],\r\n\t[\"keyword\", \"Projections\"],\r\n\t[\"keyword\", \"Proof\"],\r\n\t[\"keyword\", \"Prop\"],\r\n\t[\"keyword\", \"PropBinOp\"],\r\n\t[\"keyword\", \"Property\"],\r\n\t[\"keyword\", \"PropOp\"],\r\n\t[\"keyword\", \"Proposition\"],\r\n\t[\"keyword\", \"PropUOp\"],\r\n\t[\"keyword\", \"Pwd\"],\r\n\t[\"keyword\", \"Qed\"],\r\n\t[\"keyword\", \"Quit\"],\r\n\t[\"keyword\", \"Rec\"],\r\n\t[\"keyword\", \"Record\"],\r\n\t[\"keyword\", \"Recursive\"],\r\n\t[\"keyword\", \"Redirect\"],\r\n\t[\"keyword\", \"Reduction\"],\r\n\t[\"keyword\", \"Register\"],\r\n\t[\"keyword\", \"Relation\"],\r\n\t[\"keyword\", \"Remark\"],\r\n\t[\"keyword\", \"Remove\"],\r\n\t[\"keyword\", \"removed\"],\r\n\t[\"keyword\", \"Require\"],\r\n\t[\"keyword\", \"Reserved\"],\r\n\t[\"keyword\", \"Reset\"],\r\n\t[\"keyword\", \"Resolve\"],\r\n\t[\"keyword\", \"Restart\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"Rewrite\"],\r\n\t[\"keyword\", \"Right\"],\r\n\t[\"keyword\", \"Ring\"],\r\n\t[\"keyword\", \"Rings\"],\r\n\t[\"keyword\", \"Saturate\"],\r\n\t[\"keyword\", \"Save\"],\r\n\t[\"keyword\", \"Scheme\"],\r\n\t[\"keyword\", \"Scope\"],\r\n\t[\"keyword\", \"Scopes\"],\r\n\t[\"keyword\", \"Search\"],\r\n\t[\"keyword\", \"SearchHead\"],\r\n\t[\"keyword\", \"SearchPattern\"],\r\n\t[\"keyword\", \"SearchRewrite\"],\r\n\t[\"keyword\", \"Section\"],\r\n\t[\"keyword\", \"Separate\"],\r\n\t[\"keyword\", \"Set\"],\r\n\t[\"keyword\", \"Setoid\"],\r\n\t[\"keyword\", \"Show\"],\r\n\t[\"keyword\", \"Signatures\"],\r\n\t[\"keyword\", \"Solve\"],\r\n\t[\"keyword\", \"Solver\"],\r\n\t[\"keyword\", \"Sort\"],\r\n\t[\"keyword\", \"Sortclass\"],\r\n\t[\"keyword\", \"Sorted\"],\r\n\t[\"keyword\", \"Spec\"],\r\n\t[\"keyword\", \"SProp\"],\r\n\t[\"keyword\", \"Step\"],\r\n\t[\"keyword\", \"Strategies\"],\r\n\t[\"keyword\", \"Strategy\"],\r\n\t[\"keyword\", \"String\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"Structure\"],\r\n\t[\"keyword\", \"SubClass\"],\r\n\t[\"keyword\", \"Subgraph\"],\r\n\t[\"keyword\", \"SuchThat\"],\r\n\t[\"keyword\", \"Tactic\"],\r\n\t[\"keyword\", \"Term\"],\r\n\t[\"keyword\", \"TestCompile\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"Theorem\"],\r\n\t[\"keyword\", \"Time\"],\r\n\t[\"keyword\", \"Timeout\"],\r\n\t[\"keyword\", \"To\"],\r\n\t[\"keyword\", \"Transparent\"],\r\n\t[\"keyword\", \"Type\"],\r\n\t[\"keyword\", \"Typeclasses\"],\r\n\t[\"keyword\", \"Types\"],\r\n\t[\"keyword\", \"Typing\"],\r\n\t[\"keyword\", \"Undelimit\"],\r\n\t[\"keyword\", \"Undo\"],\r\n\t[\"keyword\", \"Unfocus\"],\r\n\t[\"keyword\", \"Unfocused\"],\r\n\t[\"keyword\", \"Unfold\"],\r\n\t[\"keyword\", \"Universe\"],\r\n\t[\"keyword\", \"Universes\"],\r\n\t[\"keyword\", \"UnOp\"],\r\n\t[\"keyword\", \"UnOpSpec\"],\r\n\t[\"keyword\", \"Unshelve\"],\r\n\t[\"keyword\", \"using\"],\r\n\t[\"keyword\", \"Variable\"],\r\n\t[\"keyword\", \"Variables\"],\r\n\t[\"keyword\", \"Variant\"],\r\n\t[\"keyword\", \"Verbose\"],\r\n\t[\"keyword\", \"View\"],\r\n\t[\"keyword\", \"Visibility\"],\r\n\t[\"keyword\", \"wf\"],\r\n\t[\"keyword\", \"where\"],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"keyword\", \"Zify\"]\r\n]"
  },
  {
    "path": "tests/languages/coq/number_feature.test",
    "content": "0\r\n123\r\n123.456\r\n123.456e65\r\n123.456e+65\r\n1_2_3.4_5_6e-6_5\r\n1_2_3e-6_5\r\n\r\n0x0\r\n0X0\r\n0xbad.345e\r\n0xbad.345ep54\r\n0xbad.345ep+54\r\n0xb_a_d.3_4_5_ep-5_4\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"123.456\"],\r\n\t[\"number\", \"123.456e65\"],\r\n\t[\"number\", \"123.456e+65\"],\r\n\t[\"number\", \"1_2_3.4_5_6e-6_5\"],\r\n\t[\"number\", \"1_2_3e-6_5\"],\r\n\r\n\t[\"number\", \"0x0\"],\r\n\t[\"number\", \"0X0\"],\r\n\t[\"number\", \"0xbad.345e\"],\r\n\t[\"number\", \"0xbad.345ep54\"],\r\n\t[\"number\", \"0xbad.345ep+54\"],\r\n\t[\"number\", \"0xb_a_d.3_4_5_ep-5_4\"]\r\n]"
  },
  {
    "path": "tests/languages/coq/operator_feature.test",
    "content": "->\r\n+\r\n<\r\n<-\r\n<->\r\n<:\r\n<+\r\n<<:\r\n<=\r\n=\r\n=>\r\n>\r\n>->\r\n>=\r\n|\r\n|-\r\n||\r\n@\r\n*\r\n**\r\n/\r\n/\\\r\n\\/\r\n&\r\n%\r\n-\r\n!\r\n?\r\n^\r\n~\r\n\r\n..\r\n...\r\n\r\n::=\r\n:=\r\n=\r\n\r\n'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"->\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<-\"],\r\n\t[\"operator\", \"<->\"],\r\n\t[\"operator\", \"<:\"],\r\n\t[\"operator\", \"<+\"],\r\n\t[\"operator\", \"<<:\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">->\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|-\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"@\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"**\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"/\\\\\"],\r\n\t[\"operator\", \"\\\\/\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"~\"],\r\n\r\n\t[\"operator\", \"..\"],\r\n\t[\"operator\", \"...\"],\r\n\r\n\t[\"operator\", \"::=\"],\r\n\t[\"operator\", \":=\"],\r\n\t[\"operator\", \"=\"],\r\n\r\n\t[\"operator\", \"'\"]\r\n]"
  },
  {
    "path": "tests/languages/coq/punctuation_feature.test",
    "content": ", ; .\r\n( ) .( `(\r\n{ } @{ } `{ } {| }\r\n[ ] [= ]\r\n\r\n: :>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \".(\"],\r\n\t[\"punctuation\", \"`(\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punct\", \"@{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"`{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punct\", \"{|\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punct\", \"[=\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \":\"], [\"punct\", \":>\"]\r\n]"
  },
  {
    "path": "tests/languages/coq/string_feature.test",
    "content": "\"\"\r\n\"foo\"\"bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\\\"bar\\\"\"]\r\n]"
  },
  {
    "path": "tests/languages/cpp/base-clause_feature.test",
    "content": "struct Base {};\r\nstruct Derived : Base {};\r\nstruct Derived : private Base;\r\nclass X : public virtual B {};\r\nclass Y : virtual public B {};\r\nclass Y : virtual baz::B {};\r\nclass Z : public B<foo::T>;\r\nstruct AA : X, Y, foo::bar::Z {};\r\n\r\nclass service : private Transport // comment\r\n{};\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"class-name\", \"Base\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"class-name\", \"Derived\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"base-clause\", [\r\n\t\t[\"class-name\", \"Base\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"class-name\", \"Derived\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"base-clause\", [\r\n\t\t[\"keyword\", \"private\"],\r\n\t\t[\"class-name\", \"Base\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", \"X\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"base-clause\", [\r\n\t\t[\"keyword\", \"public\"],\r\n\t\t[\"keyword\", \"virtual\"],\r\n\t\t[\"class-name\", \"B\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", \"Y\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"base-clause\", [\r\n\t\t[\"keyword\", \"virtual\"],\r\n\t\t[\"keyword\", \"public\"],\r\n\t\t[\"class-name\", \"B\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", \"Y\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"base-clause\", [\r\n\t\t[\"keyword\", \"virtual\"],\r\n\t\t\" baz\",\r\n\t\t[\"double-colon\", \"::\"],\r\n\t\t[\"class-name\", \"B\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", \"Z\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"base-clause\", [\r\n\t\t[\"keyword\", \"public\"],\r\n\t\t[\"class-name\", \"B\"],\r\n\t\t[\"operator\", \"<\"],\r\n\t\t\"foo\",\r\n\t\t[\"double-colon\", \"::\"],\r\n\t\t[\"class-name\", \"T\"],\r\n\t\t[\"operator\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"class-name\", \"AA\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"base-clause\", [\r\n\t\t[\"class-name\", \"X\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Y\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" foo\",\r\n\t\t[\"double-colon\", \"::\"],\r\n\t\t\"bar\",\r\n\t\t[\"double-colon\", \"::\"],\r\n\t\t[\"class-name\", \"Z\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", \"service\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"base-clause\", [\r\n\t\t[\"keyword\", \"private\"],\r\n\t\t[\"class-name\", \"Transport\"],\r\n\t\t[\"comment\", \"// comment\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for the base clauses of classes and structs.\r\n"
  },
  {
    "path": "tests/languages/cpp/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/cpp/class-name_feature.test",
    "content": "class Foo\r\nclass Foo_bar\r\nconcept Foo_bar\r\nstruct foo\r\nenum bar\r\nenum class FooBar\r\n\r\ntemplate<typename FooBar>\r\n\r\nvoid Foo::bar() {}\r\nFoo::~Foo() {}\r\nvoid Foo<int>::bar() {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"], [\"class-name\", \"Foo\"],\r\n\t[\"keyword\", \"class\"], [\"class-name\", \"Foo_bar\"],\r\n\t[\"keyword\", \"concept\"], [\"class-name\", \"Foo_bar\"],\r\n\t[\"keyword\", \"struct\"], [\"class-name\", \"foo\"],\r\n\t[\"keyword\", \"enum\"], [\"class-name\", \"bar\"],\r\n\t[\"keyword\", \"enum\"], [\"keyword\", \"class\"], [\"class-name\", \"FooBar\"],\r\n\r\n\t[\"keyword\", \"template\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"keyword\", \"typename\"],\r\n\t[\"class-name\", \"FooBar\"],\r\n\t[\"operator\", \">\"],\r\n\r\n\t[\"keyword\", \"void\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"double-colon\", \"::\"],\r\n\t[\"function\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"double-colon\", \"::\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"function\", \"Foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"void\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"double-colon\", \"::\"],\r\n\t[\"function\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names.\r\n"
  },
  {
    "path": "tests/languages/cpp/comment_feature.test",
    "content": "//\r\n// comment\r\n// the comment \\\r\n   continues!\r\n\r\n/**/\r\n/*\r\n * comment\r\n */\r\n\r\n/* open-ended comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// comment\"],\r\n\t[\"comment\", \"// the comment \\\\\\r\\n   continues!\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/*\\r\\n * comment\\r\\n */\"],\r\n\t[\"comment\", \"/* open-ended comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/cpp/function_feature.test",
    "content": "foo();\r\nline.substr(0, separator_index);\r\nboost::trim(key);\r\nbpo::value<std::string>()\r\nbpo::value<std::vector<std::string>>()->multitoken()\r\nstd::make_unique<service::UniqueMap>(std::move(entries));\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\nline\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"substr\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" separator_index\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\nboost\",\r\n\t[\"double-colon\", \"::\"],\r\n\t[\"function\", \"trim\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"key\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\nbpo\",\r\n\t[\"double-colon\", \"::\"],\r\n\t[\"generic-function\", [\r\n\t\t[\"function\", \"value\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"operator\", \"<\"],\r\n\t\t\t\"std\",\r\n\t\t\t[\"double-colon\", \"::\"],\r\n\t\t\t\"string\",\r\n\t\t\t[\"operator\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\nbpo\",\r\n\t[\"double-colon\", \"::\"],\r\n\t[\"generic-function\", [\r\n\t\t[\"function\", \"value\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"operator\", \"<\"],\r\n\t\t\t\"std\",\r\n\t\t\t[\"double-colon\", \"::\"],\r\n\t\t\t\"vector\",\r\n\t\t\t[\"operator\", \"<\"],\r\n\t\t\t\"std\",\r\n\t\t\t[\"double-colon\", \"::\"],\r\n\t\t\t\"string\",\r\n\t\t\t[\"operator\", \">>\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"function\", \"multitoken\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\nstd\",\r\n\t[\"double-colon\", \"::\"],\r\n\t[\"generic-function\", [\r\n\t\t[\"function\", \"make_unique\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"operator\", \"<\"],\r\n\t\t\t\"service\",\r\n\t\t\t[\"double-colon\", \"::\"],\r\n\t\t\t\"UniqueMap\",\r\n\t\t\t[\"operator\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"std\",\r\n\t[\"double-colon\", \"::\"],\r\n\t[\"function\", \"move\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"entries\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]"
  },
  {
    "path": "tests/languages/cpp/issue2347.test",
    "content": "class MainWindow : public QMainWindow\n{\n  Q_OBJECT\n\n private slots:\n  void changeWindowTitle();\n};\nvoid MainWindow::changeWindowTitle()\n{\n  setWindowTitle(plainTextEdit->currentFile.split(\"/\").last() + \" - Notepanda\");\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"MainWindow\"],\n\t[\"operator\", \":\"],\n\t[\"base-clause\", [\n\t\t[\"keyword\", \"public\"],\n\t\t[\"class-name\", \"QMainWindow\"]\n\t]],\n\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n  Q_OBJECT\\r\\n\\r\\n \",\n\n\t[\"keyword\", \"private\"],\n\t\" slots\",\n\t[\"operator\", \":\"],\n\n\t[\"keyword\", \"void\"],\n\t[\"function\", \"changeWindowTitle\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"void\"],\n\t[\"class-name\", \"MainWindow\"],\n\t[\"double-colon\", \"::\"],\n\t[\"function\", \"changeWindowTitle\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"function\", \"setWindowTitle\"],\n\t[\"punctuation\", \"(\"],\n\t\"plainTextEdit\",\n\t[\"operator\", \"->\"],\n\t\"currentFile\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"split\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"/\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"last\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"+\"],\n\t[\"string\", \"\\\" - Notepanda\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/cpp/issue3042.test",
    "content": "class Foo\n{\npublic:\n\n\tfriend bool operator== (const Foo& f1, const Foo& f2);\n\tfriend bool operator!= (const Foo& f1, const Foo& f2);\n\n\tfriend bool operator< (const Foo& f1, const Foo& f2);\n\tfriend bool operator> (const Foo& f1, const Foo& f2);\n\n\tfriend bool operator<= (const Foo& f1, const Foo& f2);\n\tfriend bool operator>= (const Foo& f1, const Foo& f2);\n};\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"class\"], [\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"keyword\", \"public\"], [\"operator\", \":\"],\n\n\t[\"keyword\", \"friend\"],\n\t[\"keyword\", \"bool\"],\n\t[\"keyword\", \"operator\"],\n\t[\"operator\", \"==\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f1\",\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f2\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"friend\"],\n\t[\"keyword\", \"bool\"],\n\t[\"keyword\", \"operator\"],\n\t[\"operator\", \"!=\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f1\",\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f2\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"friend\"],\n\t[\"keyword\", \"bool\"],\n\t[\"keyword\", \"operator\"],\n\t[\"operator\", \"<\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f1\",\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f2\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"friend\"],\n\t[\"keyword\", \"bool\"],\n\t[\"keyword\", \"operator\"],\n\t[\"operator\", \">\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f1\",\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f2\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"friend\"],\n\t[\"keyword\", \"bool\"],\n\t[\"keyword\", \"operator\"],\n\t[\"operator\", \"<=\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f1\",\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f2\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"friend\"],\n\t[\"keyword\", \"bool\"],\n\t[\"keyword\", \"operator\"],\n\t[\"operator\", \">=\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f1\",\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"const\"],\n\t\" Foo\",\n\t[\"operator\", \"&\"],\n\t\" f2\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/cpp/keyword_feature.test",
    "content": "alignas\r\nalignof\r\nasm\r\nauto\r\nbool\r\nbreak\r\ncase\r\ncatch\r\nchar\r\nchar8_t\r\nchar16_t\r\nchar32_t\r\nclass;\r\ncompl\r\nconcept\r\nconst\r\nconsteval\r\nconstexpr\r\nconstinit\r\nconst_cast\r\ncontinue\r\nco_await\r\nco_return\r\nco_yield\r\ndecltype\r\ndefault\r\ndelete\r\ndo\r\ndouble\r\ndynamic_cast\r\nelse\r\nenum;\r\nexplicit\r\nexport\r\nextern\r\nfinal\r\nfloat\r\nfor\r\nfriend\r\ngoto\r\nif\r\nimport;\r\ninline\r\nint\r\nlong\r\nmodule;\r\nmutable\r\nnamespace\r\nnew\r\nnoexcept\r\nnullptr\r\noperator\r\noverride\r\nprivate\r\nprotected\r\npublic\r\nregister\r\nreinterpret_cast\r\nrequires\r\nreturn\r\nshort\r\nsigned\r\nsizeof\r\nstatic\r\nstatic_assert\r\nstatic_cast\r\nstruct;\r\nswitch\r\ntemplate\r\nthis\r\nthread_local\r\nthrow\r\ntry\r\ntypedef\r\ntypeid\r\ntypename\r\nunion\r\nunsigned\r\nusing\r\nvirtual\r\nvoid\r\nvolatile\r\nwchar_t\r\nwhile\r\nint8_t\r\nint16_t\r\nint32_t\r\nint64_t\r\nuint8_t\r\nuint16_t\r\nuint32_t\r\nuint64_t\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"alignas\"],\r\n\t[\"keyword\", \"alignof\"],\r\n\t[\"keyword\", \"asm\"],\r\n\t[\"keyword\", \"auto\"],\r\n\t[\"keyword\", \"bool\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"char\"],\r\n\t[\"keyword\", \"char8_t\"],\r\n\t[\"keyword\", \"char16_t\"],\r\n\t[\"keyword\", \"char32_t\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"compl\"],\r\n\t[\"keyword\", \"concept\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"consteval\"],\r\n\t[\"keyword\", \"constexpr\"],\r\n\t[\"keyword\", \"constinit\"],\r\n\t[\"keyword\", \"const_cast\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"co_await\"],\r\n\t[\"keyword\", \"co_return\"],\r\n\t[\"keyword\", \"co_yield\"],\r\n\t[\"keyword\", \"decltype\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"delete\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"double\"],\r\n\t[\"keyword\", \"dynamic_cast\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"explicit\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"float\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"friend\"],\r\n\t[\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"inline\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"keyword\", \"long\"],\r\n\t[\"keyword\", \"module\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"mutable\"],\r\n\t[\"keyword\", \"namespace\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"noexcept\"],\r\n\t[\"keyword\", \"nullptr\"],\r\n\t[\"keyword\", \"operator\"],\r\n\t[\"keyword\", \"override\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"register\"],\r\n\t[\"keyword\", \"reinterpret_cast\"],\r\n\t[\"keyword\", \"requires\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"short\"],\r\n\t[\"keyword\", \"signed\"],\r\n\t[\"keyword\", \"sizeof\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"static_assert\"],\r\n\t[\"keyword\", \"static_cast\"],\r\n\t[\"keyword\", \"struct\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"template\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"thread_local\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"typedef\"],\r\n\t[\"keyword\", \"typeid\"],\r\n\t[\"keyword\", \"typename\"],\r\n\t[\"keyword\", \"union\"],\r\n\t[\"keyword\", \"unsigned\"],\r\n\t[\"keyword\", \"using\"],\r\n\t[\"keyword\", \"virtual\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"keyword\", \"volatile\"],\r\n\t[\"keyword\", \"wchar_t\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"int8_t\"],\r\n\t[\"keyword\", \"int16_t\"],\r\n\t[\"keyword\", \"int32_t\"],\r\n\t[\"keyword\", \"int64_t\"],\r\n\t[\"keyword\", \"uint8_t\"],\r\n\t[\"keyword\", \"uint16_t\"],\r\n\t[\"keyword\", \"uint32_t\"],\r\n\t[\"keyword\", \"uint64_t\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/cpp/module_feature.test",
    "content": "export module speech;\r\n\r\nexport const char* get_phrase_en() {\r\n    return \"Hello, world!\";\r\n}\r\n\r\nexport module speech;\r\n\r\nexport import :english;\r\nexport import :spanish;\r\n\r\nexport module speech:english;\r\n\r\nimport speech;\r\nimport :PrivWidget;\r\n\r\nimport <iostream>;\r\nimport <cstdlib>;\r\nimport \"foo.h\";\r\nimport <baz.h>;\r\n\r\nmodule : private;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"module\", [\"speech\"]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"char\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"function\", \"get_phrase_en\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"string\", \"\\\"Hello, world!\\\"\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"module\", [\"speech\"]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"module\", [\r\n\t\t[\"operator\", \":\"],\r\n\t\t\"english\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"module\", [\r\n\t\t[\"operator\", \":\"],\r\n\t\t\"spanish\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"module\", [\r\n\t\t\"speech\",\r\n\t\t[\"operator\", \":\"],\r\n\t\t\"english\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"module\", [\"speech\"]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"module\", [\r\n\t\t[\"operator\", \":\"],\r\n\t\t\"PrivWidget\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"module\", [\r\n\t\t[\"string\", \"<iostream>\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"module\", [\r\n\t\t[\"string\", \"<cstdlib>\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"module\", [\r\n\t\t[\"string\", \"\\\"foo.h\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"module\", [\r\n\t\t[\"string\", \"<baz.h>\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"module\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"punctuation\", \";\"]\r\n]"
  },
  {
    "path": "tests/languages/cpp/number_feature.test",
    "content": "42\r\n3.14159\r\n4e10\r\n2.1e-10\r\n0.4e+2\r\n0xbabe\r\n0xBABE\r\n0x1.2\r\n0x0.3p-3\r\n0x0.3p4L\r\n42f\r\n42F\r\n42u\r\n42U\r\n42l\r\n42L\r\n0b0101\r\n0B0101\r\n\r\n18446744073709550592ull\r\n18'446'744'073'709'550'592llu\r\n1844'6744'0737'0955'0592uLL\r\n184467'440737'0'95505'92LLU\r\n1'048'576\r\n0x10'0000\r\n0'004'000'000\r\n1.602'176'565e-19\r\n0b010'01010\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"4e10\"],\r\n\t[\"number\", \"2.1e-10\"],\r\n\t[\"number\", \"0.4e+2\"],\r\n\t[\"number\", \"0xbabe\"],\r\n\t[\"number\", \"0xBABE\"],\r\n\t[\"number\", \"0x1.2\"],\r\n\t[\"number\", \"0x0.3p-3\"],\r\n\t[\"number\", \"0x0.3p4L\"],\r\n\t[\"number\", \"42f\"],\r\n\t[\"number\", \"42F\"],\r\n\t[\"number\", \"42u\"],\r\n\t[\"number\", \"42U\"],\r\n\t[\"number\", \"42l\"],\r\n\t[\"number\", \"42L\"],\r\n\t[\"number\", \"0b0101\"],\r\n\t[\"number\", \"0B0101\"],\r\n\t[\"number\", \"18446744073709550592ull\"],\r\n\t[\"number\", \"18'446'744'073'709'550'592llu\"],\r\n\t[\"number\", \"1844'6744'0737'0955'0592uLL\"],\r\n\t[\"number\", \"184467'440737'0'95505'92LLU\"],\r\n\t[\"number\", \"1'048'576\"],\r\n\t[\"number\", \"0x10'0000\"],\r\n\t[\"number\", \"0'004'000'000\"],\r\n\t[\"number\", \"1.602'176'565e-19\"],\r\n\t[\"number\", \"0b010'01010\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for binary, decimal, and hexadecimal numbers.\r\n"
  },
  {
    "path": "tests/languages/cpp/operator_feature.test",
    "content": "+ - * / % -- ++\n>> <<\n~ & | ^\n+= -= *= /= %= >>= <<= &= |= ^=\n! && ||\n->\n? :\n= == != < > <= >= <=>\nand and_eq bitand bitor not not_eq or or_eq xor xor_eq\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"--\"],\n\t[\"operator\", \"++\"],\n\n\t[\"operator\", \">>\"],\n\t[\"operator\", \"<<\"],\n\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"^\"],\n\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"%=\"],\n\t[\"operator\", \">>=\"],\n\t[\"operator\", \"<<=\"],\n\t[\"operator\", \"&=\"],\n\t[\"operator\", \"|=\"],\n\t[\"operator\", \"^=\"],\n\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\n\t[\"operator\", \"->\"],\n\n\t[\"operator\", \"?\"],\n\t[\"operator\", \":\"],\n\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<=>\"],\n\n\t[\"operator\", \"and\"],\n\t[\"operator\", \"and_eq\"],\n\t[\"operator\", \"bitand\"],\n\t[\"operator\", \"bitor\"],\n\t[\"operator\", \"not\"],\n\t[\"operator\", \"not_eq\"],\n\t[\"operator\", \"or\"],\n\t[\"operator\", \"or_eq\"],\n\t[\"operator\", \"xor\"],\n\t[\"operator\", \"xor_eq\"]\n]\n\n----------------------------------------------------\n\nChecks for all operators.\n"
  },
  {
    "path": "tests/languages/cpp/punctuation_feature.test",
    "content": "( ) [ ] { }\r\n, ; . ::\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"double-colon\", \"::\"]\r\n]"
  },
  {
    "path": "tests/languages/cpp/raw_string_feature.test",
    "content": "R\"raw(\r\ntest\r\n)raw\"\r\nR\"(no delimiter)\"\r\nR\"(foo)\"R\"(bar)\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"raw-string\", \"R\\\"raw(\\r\\ntest\\r\\n)raw\\\"\"],\r\n\t[\"raw-string\", \"R\\\"(no delimiter)\\\"\"],\r\n\t[\"raw-string\", \"R\\\"(foo)\\\"\"],\r\n\t[\"raw-string\", \"R\\\"(bar)\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for the C++11 raw string feature"
  },
  {
    "path": "tests/languages/cpp+pure/cpp_inclusion.test",
    "content": "%< -*- C++ -*-\r\nalignas\r\n%>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"inline-lang-cpp\", [\r\n\t\t[\"delimiter\", \"%< \"],\r\n\t\t[\"lang\", \"-*- C++ -*-\"],\r\n\t\t[\"keyword\", \"alignas\"],\r\n\t\t[\"delimiter\", \"%>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for C++ in Pure."
  },
  {
    "path": "tests/languages/crystal/attribute_feature.test",
    "content": "@[AlwaysInline]\n@[CallConvention(\"X86_StdCall\")]\n@[MyAnnotation(key: \"value\", value: 123)]\n@[MyAnnotation(\"foo\", 123, false)]\n\n----------------------------------------------------\n\n[\n\t[\"attribute\", [\n\t\t[\"delimiter\", \"@[\"],\n\t\t[\"attribute\", \"AlwaysInline\"],\n\t\t[\"delimiter\", \"]\"]\n\t]],\n\t[\"attribute\", [\n\t\t[\"delimiter\", \"@[\"],\n\t\t[\"attribute\", \"CallConvention\"],\n\t\t[\"args\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string-literal\", [\n\t\t\t\t[\"string\", \"\\\"X86_StdCall\\\"\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"delimiter\", \"]\"]\n\t]],\n\t[\"attribute\", [\n\t\t[\"delimiter\", \"@[\"],\n\t\t[\"attribute\", \"MyAnnotation\"],\n\t\t[\"args\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"symbol\", \"key\"],\n\t\t\t[\"operator\", \":\"],\n\t\t\t[\"string-literal\", [\n\t\t\t\t[\"string\", \"\\\"value\\\"\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"symbol\", \"value\"],\n\t\t\t[\"operator\", \":\"],\n\t\t\t[\"number\", \"123\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"delimiter\", \"]\"]\n\t]],\n\t[\"attribute\", [\n\t\t[\"delimiter\", \"@[\"],\n\t\t[\"attribute\", \"MyAnnotation\"],\n\t\t[\"args\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string-literal\", [\n\t\t\t\t[\"string\", \"\\\"foo\\\"\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"123\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"boolean\", \"false\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"delimiter\", \"]\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for attributes.\n"
  },
  {
    "path": "tests/languages/crystal/char_feature.test",
    "content": "'a'\n'z'\n'0'\n'_'\n'あ'\n'\\''         # single quote\n'\\\\'         # backslash\n'\\a'         # alert\n'\\b'         # backspace\n'\\e'         # escape\n'\\f'         # form feed\n'\\n'         # newline\n'\\r'         # carriage return\n'\\t'         # tab\n'\\v'         # vertical tab\n'\\0'         # null character\n'\\uFFFF'     # hexadecimal unicode character\n'\\u{10FFFF}' # hexadecimal unicode character\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"],\n\t[\"char\", \"'z'\"],\n\t[\"char\", \"'0'\"],\n\t[\"char\", \"'_'\"],\n\t[\"char\", \"'あ'\"],\n\t[\"char\", \"'\\\\''\"], [\"comment\", \"# single quote\"],\n\t[\"char\", \"'\\\\\\\\'\"], [\"comment\", \"# backslash\"],\n\t[\"char\", \"'\\\\a'\"], [\"comment\", \"# alert\"],\n\t[\"char\", \"'\\\\b'\"], [\"comment\", \"# backspace\"],\n\t[\"char\", \"'\\\\e'\"], [\"comment\", \"# escape\"],\n\t[\"char\", \"'\\\\f'\"], [\"comment\", \"# form feed\"],\n\t[\"char\", \"'\\\\n'\"], [\"comment\", \"# newline\"],\n\t[\"char\", \"'\\\\r'\"], [\"comment\", \"# carriage return\"],\n\t[\"char\", \"'\\\\t'\"], [\"comment\", \"# tab\"],\n\t[\"char\", \"'\\\\v'\"], [\"comment\", \"# vertical tab\"],\n\t[\"char\", \"'\\\\0'\"], [\"comment\", \"# null character\"],\n\t[\"char\", \"'\\\\uFFFF'\"], [\"comment\", \"# hexadecimal unicode character\"],\n\t[\"char\", \"'\\\\u{10FFFF}'\"], [\"comment\", \"# hexadecimal unicode character\"]\n]\n"
  },
  {
    "path": "tests/languages/crystal/expansion_feature.test",
    "content": "{{ 1_u32 }}\n{% 2_u32 %}\n{{ { 3_u32 } }}\n{% % 4_u32 % %}\n\n----------------------------------------------------\n\n[\n\t[\"expansion\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"content\", [\n\t\t\t[\"number\", \"1_u32\"]\n\t\t]],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"expansion\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"content\", [\n\t\t\t[\"number\", \"2_u32\"]\n\t\t]],\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\t[\"expansion\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"content\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"number\", \"3_u32\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"expansion\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"content\", [\n\t\t\t[\"operator\", \"%\"],\n\t\t\t[\"number\", \"4_u32\"],\n\t\t\t[\"operator\", \"%\"]\n\t\t]],\n\t\t[\"delimiter\", \"%}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for macro expansions.\n"
  },
  {
    "path": "tests/languages/crystal/keyword_feature.test",
    "content": ".is_a?\r\n.responds_to?\r\nabstract\r\nalias\r\nannotation;\r\nas\r\nasm\r\nbegin\r\nbreak\r\ncase\r\nclass;\r\ndef;\r\ndo\r\nelse\r\nelsif\r\nend\r\nensure\r\nenum\r\nextend\r\nfor\r\nfun\r\nif\r\nifdef\r\ninclude\r\ninstance_sizeof\r\nlib\r\nmacro\r\nmodule;\r\nnext\r\nof\r\nout\r\npointerof\r\nprivate\r\nprotected\r\nptr\r\nrequire\r\nrescue\r\nreturn\r\nselect\r\nself\r\nsizeof\r\nstruct\r\nsuper\r\nthen\r\ntype\r\ntypeof\r\nundef\r\nuninitialized\r\nunion\r\nunless\r\nuntil\r\nwhen\r\nwhile\r\nwith\r\nyield\r\n\r\n__DIR__\r\n__END_LINE__\r\n__FILE__\r\n__LINE__\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \".\"], [\"keyword\", \"is_a?\"],\r\n\t[\"punctuation\", \".\"], [\"keyword\", \"responds_to?\"],\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"alias\"],\r\n\t[\"keyword\", \"annotation\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"asm\"],\r\n\t[\"keyword\", \"begin\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"def\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"elsif\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"ensure\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"extend\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"fun\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"ifdef\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"instance_sizeof\"],\r\n\t[\"keyword\", \"lib\"],\r\n\t[\"keyword\", \"macro\"],\r\n\t[\"keyword\", \"module\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"next\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"out\"],\r\n\t[\"keyword\", \"pointerof\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"ptr\"],\r\n\t[\"keyword\", \"require\"],\r\n\t[\"keyword\", \"rescue\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"select\"],\r\n\t[\"keyword\", \"self\"],\r\n\t[\"keyword\", \"sizeof\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"typeof\"],\r\n\t[\"keyword\", \"undef\"],\r\n\t[\"keyword\", \"uninitialized\"],\r\n\t[\"keyword\", \"union\"],\r\n\t[\"keyword\", \"unless\"],\r\n\t[\"keyword\", \"until\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"keyword\", \"yield\"],\r\n\r\n\t[\"keyword\", \"__DIR__\"],\r\n\t[\"keyword\", \"__END_LINE__\"],\r\n\t[\"keyword\", \"__FILE__\"],\r\n\t[\"keyword\", \"__LINE__\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/crystal/number_feature.test",
    "content": "1\n1_1\n1_1_1\n0b10_01\n0o1_2_3\n0x123456789abcdef\n012_345.678_9e+10_f64\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"1\"],\n\t[\"number\", \"1_1\"],\n\t[\"number\", \"1_1_1\"],\n\t[\"number\", \"0b10_01\"],\n\t[\"number\", \"0o1_2_3\"],\n\t[\"number\", \"0x123456789abcdef\"],\n\t[\"number\", \"012_345.678_9e+10_f64\"]\n]\n\n----------------------------------------------------\n\nChecks for number literals.\n"
  },
  {
    "path": "tests/languages/crystal/operator_feature.test",
    "content": "+ - * / % **\n+= -= *= /= %= **=\n\n== != < > <= >= <=> ===\n!~ =~\n=\n& | ^ ~ << >>\n&= |= ^= <<= >>=\n&& || !\n&&= ||=\n\n=>\n->\n\n&.\n\n? :\n.. ...\n\nand or not\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"**\"],\n\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"%=\"],\n\t[\"operator\", \"**=\"],\n\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<=>\"],\n\t[\"operator\", \"===\"],\n\n\t[\"operator\", \"!~\"],\n\t[\"operator\", \"=~\"],\n\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \">>\"],\n\n\t[\"operator\", \"&=\"],\n\t[\"operator\", \"|=\"],\n\t[\"operator\", \"^=\"],\n\t[\"operator\", \"<<=\"],\n\t[\"operator\", \">>=\"],\n\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\t[\"operator\", \"!\"],\n\n\t[\"operator\", \"&&=\"],\n\t[\"operator\", \"||=\"],\n\n\t[\"operator\", \"=>\"],\n\t[\"operator\", \"->\"],\n\n\t[\"operator\", \"&.\"],\n\n\t[\"operator\", \"?\"], [\"operator\", \":\"],\n\t[\"operator\", \"..\"], [\"operator\", \"...\"],\n\n\t\"\\r\\n\\r\\nand or not\"\n]\n"
  },
  {
    "path": "tests/languages/crystal/punctuation_feature.test",
    "content": "( ) [ ] { }\n, .\n:: \\\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \".\"],\n\n\t[\"double-colon\", \"::\"],\n\t[\"punctuation\", \"\\\\\"]\n]\n"
  },
  {
    "path": "tests/languages/crystal/regex_feature.test",
    "content": "/foo|bar/\n/h(e+)llo/\n/\\d+/\n/あ/\n\n/\\//         # slash\n/\\\\/         # backslash\n/\\b/         # backspace\n/\\e/         # escape\n/\\f/         # form feed\n/\\n/         # newline\n/\\r/         # carriage return\n/\\t/         # tab\n/\\v/         # vertical tab\n/\\NNN/       # octal ASCII character\n/\\xNN/       # hexadecimal ASCII character\n/\\x{FFFF}/   # hexadecimal unicode character\n/\\x{10FFFF}/ # hexadecimal unicode character\n\n/foo/i.match(\"FOO\")         # => #<Regex::MatchData \"FOO\">\n/foo/m.match(\"bar\\nfoo\")    # => #<Regex::MatchData \"foo\">\n/foo /x.match(\"foo\")        # => #<Regex::MatchData \"foo\">\n/foo /imx.match(\"bar\\nFOO\") # => #<Regex::MatchData \"FOO\">\n\n%r((/)) # => /(\\/)/\n%r[[/]] # => /[\\/]/\n%r{{/}} # => /{\\/}/\n%r<</>> # => /<\\/>/\n%r|/|   # => /\\//\n\n----------------------------------------------------\n\n[\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/foo|bar/\"]\n\t]],\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/h(e+)llo/\"]\n\t]],\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\d+/\"]\n\t]],\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/あ/\"]\n\t]],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\//\"]\n\t]],\n\t[\"comment\", \"# slash\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\\\\\/\"]\n\t]],\n\t[\"comment\", \"# backslash\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\b/\"]\n\t]],\n\t[\"comment\", \"# backspace\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\e/\"]\n\t]],\n\t[\"comment\", \"# escape\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\f/\"]\n\t]],\n\t[\"comment\", \"# form feed\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\n/\"]\n\t]],\n\t[\"comment\", \"# newline\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\r/\"]\n\t]],\n\t[\"comment\", \"# carriage return\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\t/\"]\n\t]],\n\t[\"comment\", \"# tab\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\v/\"]\n\t]],\n\t[\"comment\", \"# vertical tab\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\NNN/\"]\n\t]],\n\t[\"comment\", \"# octal ASCII character\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\xNN/\"]\n\t]],\n\t[\"comment\", \"# hexadecimal ASCII character\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\x{FFFF}/\"]\n\t]],\n\t[\"comment\", \"# hexadecimal unicode character\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/\\\\x{10FFFF}/\"]\n\t]],\n\t[\"comment\", \"# hexadecimal unicode character\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/foo/i\"]\n\t]],\n\t[\"punctuation\", \".\"],\n\t\"match\",\n\t[\"punctuation\", \"(\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"FOO\\\"\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"comment\", \"# => #<Regex::MatchData \\\"FOO\\\">\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/foo/m\"]\n\t]],\n\t[\"punctuation\", \".\"],\n\t\"match\",\n\t[\"punctuation\", \"(\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"bar\\\\nfoo\\\"\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"comment\", \"# => #<Regex::MatchData \\\"foo\\\">\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/foo /x\"]\n\t]],\n\t[\"punctuation\", \".\"],\n\t\"match\",\n\t[\"punctuation\", \"(\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"foo\\\"\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"comment\", \"# => #<Regex::MatchData \\\"foo\\\">\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"/foo /imx\"]\n\t]],\n\t[\"punctuation\", \".\"],\n\t\"match\",\n\t[\"punctuation\", \"(\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"bar\\\\nFOO\\\"\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"comment\", \"# => #<Regex::MatchData \\\"FOO\\\">\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"%r((/))\"]\n\t]],\n\t[\"comment\", \"# => /(\\\\/)/\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"%r[[/]]\"]\n\t]],\n\t[\"comment\", \"# => /[\\\\/]/\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"%r{{/}}\"]\n\t]],\n\t[\"comment\", \"# => /{\\\\/}/\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"%r<</>>\"]\n\t]],\n\t[\"comment\", \"# => /<\\\\/>/\"],\n\n\t[\"regex-literal\", [\n\t\t[\"regex\", \"%r|/|\"]\n\t]],\n\t[\"comment\", \"# => /\\\\//\"]\n]\n"
  },
  {
    "path": "tests/languages/crystal/string_feature.test",
    "content": "\"hello world\"\n\n\"\\\"\"                  # double quote\n\"\\\\\"                  # backslash\n\"\\#\"                  # hash character (to escape interpolation)\n\"\\a\"                  # alert\n\"\\b\"                  # backspace\n\"\\e\"                  # escape\n\"\\f\"                  # form feed\n\"\\n\"                  # newline\n\"\\r\"                  # carriage return\n\"\\t\"                  # tab\n\"\\v\"                  # vertical tab\n\"\\377\"                # octal ASCII character\n\"\\xFF\"                # hexadecimal ASCII character\n\"\\uFFFF\"              # hexadecimal unicode character\n\"\\u{0}\"..\"\\u{10FFFF}\" # hexadecimal unicode character\n\n\"\\101\" # => \"A\"\n\"\\123\" # => \"S\"\n\"\\12\"  # => \"\\n\"\n\"\\1\"   # string with one character with code point 1\n\n\"\\u{48 45 4C 4C 4F}\" # => \"HELLO\"\n\n\"sum: #{a} + #{b} = #{a + b}\"\n\n\"\\#{a + b}\"  # => \"#{a + b}\"\n%q(#{a + b}) # => \"#{a + b}\"\n\n%(hello (\"world\")) # => \"hello (\\\"world\\\")\"\n%[hello [\"world\"]] # => \"hello [\\\"world\\\"]\"\n%{hello {\"world\"}} # => \"hello {\\\"world\\\"}\"\n%<hello <\"world\">> # => \"hello <\\\"world\\\">\"\n%|hello \"world\"|   # => \"hello \\\"world\\\"\"\n\nname = \"world\"\n%q(hello \\n #{name}) # => \"hello \\\\n \\#{name}\"\n%Q(hello \\n #{name}) # => \"hello \\n world\"\n\n%w(foo bar baz)  # => [\"foo\", \"bar\", \"baz\"]\n%w(foo\\nbar baz) # => [\"foo\\\\nbar\", \"baz\"]\n%w(foo(bar) baz) # => [\"foo(bar)\", \"baz\"]\n\n%w(foo\\ bar baz) # => [\"foo bar\", \"baz\"]\n\n\"hello \" \\\n\"world, \" \\\n\"no newlines\" # same as \"hello world, no newlines\"\n\n\"hello \\\n     world, \\\n     no newlines\" # same as \"hello world, no newlines\"\n\n<<-XML\n<parent>\n  <child />\n</parent>\nXML\n\n----------------------------------------------------\n\n[\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"hello world\\\"\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\\\\"\\\"\"]\n\t]],\n\t[\"comment\", \"# double quote\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\\\\\\\\"\"]\n\t]],\n\t[\"comment\", \"# backslash\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\#\\\"\"]\n\t]],\n\t[\"comment\", \"# hash character (to escape interpolation)\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\a\\\"\"]\n\t]],\n\t[\"comment\", \"# alert\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\b\\\"\"]\n\t]],\n\t[\"comment\", \"# backspace\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\e\\\"\"]\n\t]],\n\t[\"comment\", \"# escape\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\f\\\"\"]\n\t]],\n\t[\"comment\", \"# form feed\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\n\\\"\"]\n\t]],\n\t[\"comment\", \"# newline\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\r\\\"\"]\n\t]],\n\t[\"comment\", \"# carriage return\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\t\\\"\"]\n\t]],\n\t[\"comment\", \"# tab\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\v\\\"\"]\n\t]],\n\t[\"comment\", \"# vertical tab\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\377\\\"\"]\n\t]],\n\t[\"comment\", \"# octal ASCII character\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\xFF\\\"\"]\n\t]],\n\t[\"comment\", \"# hexadecimal ASCII character\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\uFFFF\\\"\"]\n\t]],\n\t[\"comment\", \"# hexadecimal unicode character\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\u{0}\\\"\"]\n\t]],\n\t[\"operator\", \"..\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\u{10FFFF}\\\"\"]\n\t]],\n\t[\"comment\", \"# hexadecimal unicode character\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\101\\\"\"]\n\t]],\n\t[\"comment\", \"# => \\\"A\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\123\\\"\"]\n\t]],\n\t[\"comment\", \"# => \\\"S\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\12\\\"\"]\n\t]],\n\t[\"comment\", \"# => \\\"\\\\n\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\1\\\"\"]\n\t]],\n\t[\"comment\", \"# string with one character with code point 1\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\u{48 45 4C 4C 4F}\\\"\"]\n\t]],\n\t[\"comment\", \"# => \\\"HELLO\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"sum: \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\"a\"]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"string\", \" + \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\"b\"]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"string\", \" = \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\n\t\t\t\t\"a \",\n\t\t\t\t[\"operator\", \"+\"],\n\t\t\t\t\" b\"\n\t\t\t]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\#{a + b}\\\"\"]\n\t]],\n\t[\"comment\", \"# => \\\"#{a + b}\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%q(\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\n\t\t\t\t\"a \",\n\t\t\t\t[\"operator\", \"+\"],\n\t\t\t\t\" b\"\n\t\t\t]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"string\", \")\"]\n\t]],\n\t[\"comment\", \"# => \\\"#{a + b}\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%(hello (\\\"world\\\"))\"]\n\t]],\n\t[\"comment\", \"# => \\\"hello (\\\\\\\"world\\\\\\\")\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%[hello [\\\"world\\\"]]\"]\n\t]],\n\t[\"comment\", \"# => \\\"hello [\\\\\\\"world\\\\\\\"]\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%{hello {\\\"world\\\"}}\"]\n\t]],\n\t[\"comment\", \"# => \\\"hello {\\\\\\\"world\\\\\\\"}\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%<hello <\\\"world\\\">>\"]\n\t]],\n\t[\"comment\", \"# => \\\"hello <\\\\\\\"world\\\\\\\">\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%|hello \\\"world\\\"|\"]\n\t]],\n\t[\"comment\", \"# => \\\"hello \\\\\\\"world\\\\\\\"\\\"\"],\n\n\t\"\\r\\n\\r\\nname \",\n\t[\"operator\", \"=\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"world\\\"\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%q(hello \\\\n \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\"name\"]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"string\", \")\"]\n\t]],\n\t[\"comment\", \"# => \\\"hello \\\\\\\\n \\\\#{name}\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%Q(hello \\\\n \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\"name\"]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"string\", \")\"]\n\t]],\n\t[\"comment\", \"# => \\\"hello \\\\n world\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%w(foo bar baz)\"]\n\t]],\n\t[\"comment\", \"# => [\\\"foo\\\", \\\"bar\\\", \\\"baz\\\"]\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%w(foo\\\\nbar baz)\"]\n\t]],\n\t[\"comment\", \"# => [\\\"foo\\\\\\\\nbar\\\", \\\"baz\\\"]\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%w(foo(bar) baz)\"]\n\t]],\n\t[\"comment\", \"# => [\\\"foo(bar)\\\", \\\"baz\\\"]\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"%w(foo\\\\ bar baz)\"]\n\t]],\n\t[\"comment\", \"# => [\\\"foo bar\\\", \\\"baz\\\"]\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"hello \\\"\"]\n\t]],\n\t[\"punctuation\", \"\\\\\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"world, \\\"\"]\n\t]],\n\t[\"punctuation\", \"\\\\\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"no newlines\\\"\"]\n\t]],\n\t[\"comment\", \"# same as \\\"hello world, no newlines\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"hello \\\\\\r\\n     world, \\\\\\r\\n     no newlines\\\"\"]\n\t]],\n\t[\"comment\", \"# same as \\\"hello world, no newlines\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"delimiter\", [\n\t\t\t[\"punctuation\", \"<<-\"],\n\t\t\t[\"symbol\", \"XML\"]\n\t\t]],\n\t\t[\"string\", \"\\r\\n<parent>\\r\\n  <child />\\r\\n</parent>\\r\\n\"],\n\t\t[\"delimiter\", [\n\t\t\t[\"symbol\", \"XML\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/crystal/symbol_feature.test",
    "content": ":unquoted_symbol\n:\"quoted symbol\"\n:\"a\" # identical to :a\n:あ\n:question?\n:exclamation!\n\n----------------------------------------------------\n\n[\n\t[\"symbol\", \":unquoted_symbol\"],\n\t[\"symbol\", \":\\\"quoted symbol\\\"\"],\n\t[\"symbol\", \":\\\"a\\\"\"], [\"comment\", \"# identical to :a\"],\n\t[\"symbol\", \":あ\"],\n\t[\"symbol\", \":question?\"],\n\t[\"symbol\", \":exclamation!\"]\n]\n"
  },
  {
    "path": "tests/languages/csharp/attribute_feature.test",
    "content": "[Foo]\n[Foo(1, 2)]\n[Foo(1, 2, Name = \"bar\")]\n[Foo, Bar]\n[Foo(\"()\"), Bar(\"[]\"), Baz]\n\n[return: MaybeNull]\n[assembly: InternalsVisibleTo(\"Tests\")]\n\n[assembly: Foo]\n[module: Foo]\n[field: Foo]\n[event: Foo]\n[method: Foo]\n[param: Foo]\n[property: Foo]\n[return: Foo]\n[type: Foo]\n\n// not attributes\n\nvar a = d\n[Foo];\nvar b = new Foo<int>?[Count];\nvar c = new (int, int)[Count];\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"class-name\", [\"Foo\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"class-name\", [\"Foo\"]],\n\t\t[\"attribute-arguments\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"number\", \"1\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"2\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"class-name\", [\"Foo\"]],\n\t\t[\"attribute-arguments\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"number\", \"1\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"2\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" Name \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"string\", \"\\\"bar\\\"\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"class-name\", [\"Foo\"]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\"Bar\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"class-name\", [\"Foo\"]],\n\t\t[\"attribute-arguments\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"()\\\"\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\"Bar\"]],\n\t\t[\"attribute-arguments\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"[]\\\"\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\"Baz\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"target\", \"return\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"class-name\", [\"MaybeNull\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"target\", \"assembly\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"class-name\", [\"InternalsVisibleTo\"]],\n\t\t[\"attribute-arguments\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"Tests\\\"\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"target\", \"assembly\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"class-name\", [\"Foo\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"target\", \"module\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"class-name\", [\"Foo\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"target\", \"field\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"class-name\", [\"Foo\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"target\", \"event\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"class-name\", [\"Foo\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"target\", \"method\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"class-name\", [\"Foo\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"target\", \"param\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"class-name\", [\"Foo\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"target\", \"property\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"class-name\", [\"Foo\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"target\", \"return\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"class-name\", [\"Foo\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"attribute\", [\n\t\t[\"target\", \"type\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"class-name\", [\"Foo\"]]\n\t]],\n\t[\"punctuation\", \"]\"],\n\n\t[\"comment\", \"// not attributes\"],\n\n\t[\"class-name\", [\n\t\t[\"keyword\", \"var\"]\n\t]],\n\t\" a \",\n\t[\"operator\", \"=\"],\n\t\" d\\r\\n\",\n\n\t[\"punctuation\", \"[\"],\n\t\"Foo\",\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\n\t\t[\"keyword\", \"var\"]\n\t]],\n\t\" b \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"new\"],\n\t[\"constructor-invocation\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"keyword\", \"int\"],\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \"?\"]\n\t]],\n\t[\"punctuation\", \"[\"],\n\t\"Count\",\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\n\t\t[\"keyword\", \"var\"]\n\t]],\n\t\" c \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"new\"],\n\t[\"constructor-invocation\", [\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"keyword\", \"int\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"keyword\", \"int\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \"[\"],\n\t\"Count\",\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for class names of attributes.\n"
  },
  {
    "path": "tests/languages/csharp/char_feature.test",
    "content": "'a'\n'\\''\n'\\\\'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"],\n\t[\"char\", \"'\\\\''\"],\n\t[\"char\", \"'\\\\\\\\'\"]\n]\n"
  },
  {
    "path": "tests/languages/csharp/class-name-declaration_feature.test",
    "content": "class Foo\ninterface BarBaz\nstruct Foo\nenum Foo\nrecord Foo\nclass Foo<A, B>\ninterface Bar<out T>\nrecord Foo<A, B>\n\nrecord TestData(string Name);\n\n// not variables\npublic static RGBColor FromRainbow(Rainbow colorBand) =>\n\tcolorBand switch\n\t{\n\t\tRainbow.Red => new RGBColor(0xFF, 0x00, 0x00),\n\t\t_           => throw new ArgumentException(message: \"invalid enum value\", paramName: nameof(colorBand)),\n\t};\n\ntry {} catch (ArgumentException e) {}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t[\"keyword\", \"interface\"],\n\t[\"class-name\", [\"BarBaz\"]],\n\n\t[\"keyword\", \"struct\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t[\"keyword\", \"enum\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t[\"keyword\", \"record\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"A\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" B\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"keyword\", \"interface\"],\n\t[\"class-name\", [\n\t\t\"Bar\",\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"keyword\", \"out\"],\n\t\t\" T\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"keyword\", \"record\"],\n\t[\"class-name\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"A\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" B\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"keyword\", \"record\"],\n\t[\"class-name\", [\"TestData\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"string\"]\n\t]],\n\t\" Name\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// not variables\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"static\"],\n\t[\"return-type\", [\"RGBColor\"]],\n\t[\"function\", \"FromRainbow\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\"Rainbow\"]],\n\t\" colorBand\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=>\"],\n\n\t\"\\r\\n\\tcolorBand \",\n\t[\"keyword\", \"switch\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n\\t\\tRainbow\",\n\t[\"punctuation\", \".\"],\n\t\"Red \",\n\t[\"operator\", \"=>\"],\n\t[\"keyword\", \"new\"],\n\t[\"constructor-invocation\", [\"RGBColor\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"0xFF\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0x00\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0x00\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n\\t\\t_           \",\n\t[\"operator\", \"=>\"],\n\t[\"keyword\", \"throw\"],\n\t[\"keyword\", \"new\"],\n\t[\"constructor-invocation\", [\"ArgumentException\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"named-parameter\", \"message\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"\\\"invalid enum value\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"named-parameter\", \"paramName\"],\n\t[\"punctuation\", \":\"],\n\t[\"keyword\", \"nameof\"],\n\t[\"punctuation\", \"(\"],\n\t\"colorBand\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"try\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"keyword\", \"catch\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\"ArgumentException\"]],\n\t\" e\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for class names at the class declaration.\n"
  },
  {
    "path": "tests/languages/csharp/class-name-variables-parameters_feature.test",
    "content": "int a;\r\nFoo b;\r\nFoo @new_var;\r\nFoo<Bar> c = null;\r\nstatic Foo<(Bar, int)>[,,] d;\r\nvoid Foo(Foo a, Bar<Foo> b, Bar[, ] c, Foo<(int, int)> d);\r\nBar<Foo> Abc => 0;\r\nBar<Foo>.FooBar<IFoo> Abc;\r\n\r\nif (foo is Bar)\r\nif (foo is not Bar)\r\nif (foo is null)\r\nif (foo is not null)\r\nif (t is (int, string))\r\nif ((e1, e2) is (0, int i) or (int i, 0))\r\nvar baz = foo as Bar;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"int\"]\r\n\t]],\r\n\t\" a\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t\"Foo\"\r\n\t]],\r\n\t\" b\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t\"Foo\"\r\n\t]],\r\n\t\" @new_var\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"Bar\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" c \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"class-name\", [\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Bar\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"keyword\", \"int\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \">\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t\" d\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"return-type\", [\r\n\t\t[\"keyword\", \"void\"]\r\n\t]],\r\n\t[\"function\", \"Foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t\"Foo\"\r\n\t]],\r\n\t\" a\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", [\r\n\t\t\"Bar\",\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" b\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", [\r\n\t\t\"Bar\",\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t\" c\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", [\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"keyword\", \"int\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"keyword\", \"int\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" d\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"return-type\", [\r\n\t\t\"Bar\",\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" Abc \",\r\n\t[\"operator\", \"=>\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t\"Bar\",\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \">\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"FooBar\",\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"IFoo\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" Abc\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo \",\r\n\t[\"keyword\", \"is\"],\r\n\t[\"class-name\", [\r\n\t\t\"Bar\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo \",\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"class-name\", [\r\n\t\t\"Bar\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo \",\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo \",\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"t \",\r\n\t[\"keyword\", \"is\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"e1\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" e2\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"is\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"int\"]\r\n\t]],\r\n\t\" i\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"int\"]\r\n\t]],\r\n\t\" i\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"var\"]\r\n\t]],\r\n\t\" baz \",\r\n\t[\"operator\", \"=\"],\r\n\t\" foo \",\r\n\t[\"keyword\", \"as\"],\r\n\t[\"class-name\", [\r\n\t\t\"Bar\"\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names in variables and parameters.\r\n"
  },
  {
    "path": "tests/languages/csharp/constructor-invocation_feature.test",
    "content": "new Foo();\nnew Foo<A, B<C>>();\nnew Foo<A, B<C>>[0];\nnew Foo<A, B<C>>[] {};\nnew Foo<A, B<C>> {};\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"new\"],\n\t[\"constructor-invocation\", [\"Foo\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"new\"],\n\t[\"constructor-invocation\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"A\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" B\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"C\",\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"new\"],\n\t[\"constructor-invocation\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"A\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" B\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"C\",\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"new\"],\n\t[\"constructor-invocation\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"A\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" B\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"C\",\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"new\"],\n\t[\"constructor-invocation\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"A\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" B\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"C\",\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for different constructor invocations styles.\n"
  },
  {
    "path": "tests/languages/csharp/for_feature.test",
    "content": "for (Int32 i = 0; i < count; i++)\r\nforeach (Foo e in Elements)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"for\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\"Int32\"]],\r\n\t\" i \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \";\"],\r\n\t\" i \",\r\n\t[\"operator\", \"<\"],\r\n\t\" count\",\r\n\t[\"punctuation\", \";\"],\r\n\t\" i\",\r\n\t[\"operator\", \"++\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\"Foo\"]],\r\n\t\" e \",\r\n\t[\"keyword\", \"in\"],\r\n\t\" Elements\",\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n\r\n----------------------------------------------------\r\n\r\nChecks for `for` and `foreach` loops.\r\n"
  },
  {
    "path": "tests/languages/csharp/generic-constraint_feature.test",
    "content": "void abc<U, V>() where U : struct, IFoo where V : IFoo<U> {}\ndelegate void F<U>(U u) where U : class, IFoo<Bar>;\nclass Foo<T> where T : IFoo<int> {}\nreadonly struct Foo<T> where T : unmanaged {}\n\n----------------------------------------------------\n\n[\n\t[\"return-type\", [\n\t\t[\"keyword\", \"void\"]\n\t]],\n\t[\"generic-method\", [\n\t\t[\"function\", \"abc\"],\n\t\t[\"generic\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"U\",\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" V\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"U\"],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"keyword\", \"struct\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\n\t\t\t\"IFoo\"\n\t\t]]\n\t]],\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"V\"],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"class-name\", [\n\t\t\t\"IFoo\",\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"U\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"delegate\"],\n\t[\"return-type\", [\n\t\t[\"keyword\", \"void\"]\n\t]],\n\t[\"generic-method\", [\n\t\t[\"function\", \"F\"],\n\t\t[\"generic\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"U\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t\"U\"\n\t]],\n\t\" u\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"U\"],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"keyword\", \"class\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\n\t\t\t\"IFoo\",\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"Bar\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"T\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"T\"],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"class-name\", [\n\t\t\t\"IFoo\",\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t[\"keyword\", \"int\"],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"readonly\"],\n\t[\"keyword\", \"struct\"],\n\t[\"class-name\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"T\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"T\"],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"keyword\", \"unmanaged\"]\n\t]],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for class names and keywords in generic constraints.\n"
  },
  {
    "path": "tests/languages/csharp/generic_feature.test",
    "content": "void method<T, U>();\r\nmethod<int, char>();\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"return-type\", [\r\n\t\t[\"keyword\", \"void\"]\r\n\t]],\r\n\t[\"generic-method\", [\r\n\t\t[\"function\", \"method\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"T\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\" U\",\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"generic-method\", [\r\n\t\t[\"function\", \"method\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"keyword\", \"int\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"keyword\", \"char\"],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for generic methods\r\n"
  },
  {
    "path": "tests/languages/csharp/interpolation-string_feature.test",
    "content": "$\"Hello, {{ {name} }}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.\"\n@$\"Hello, {{ {name} }}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.\"\n$\"{a,5} and {b + \"\" /* foo \":} */:format} {h(a, b)}\"\n$\"{1}{2}{3}\"\n\n@$\"\n\"\n$@\"\n\"\n\n$@\"{\n\t1 + 2 // some comment \":}{}\n}\"\n\n----------------------------------------------------\n\n[\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"$\\\"Hello, {{ \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\"name\"]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \" }}! Today is \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\n\t\t\t\t\"date\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"DayOfWeek\"\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \", it's \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\"date\"]],\n\t\t\t[\"format-string\", [\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\"HH:mm\"\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \" now.\\\"\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"@$\\\"Hello, {{ \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\"name\"]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \" }}! Today is \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\n\t\t\t\t\"date\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"DayOfWeek\"\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \", it's \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\"date\"]],\n\t\t\t[\"format-string\", [\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\"HH:mm\"\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \" now.\\\"\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"$\\\"\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\n\t\t\t\t\"a\",\n\t\t\t\t[\"punctuation\", \",\"],\n\t\t\t\t[\"number\", \"5\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \" and \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\n\t\t\t\t\"b \",\n\t\t\t\t[\"operator\", \"+\"],\n\t\t\t\t[\"string\", \"\\\"\\\"\"],\n\t\t\t\t[\"comment\", \"/* foo \\\":} */\"]\n\t\t\t]],\n\t\t\t[\"format-string\", [\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\"format\"\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \" \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"function\", \"h\"],\n\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t\"a\",\n\t\t\t\t[\"punctuation\", \",\"],\n\t\t\t\t\" b\",\n\t\t\t\t[\"punctuation\", \")\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"$\\\"\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"number\", \"1\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"number\", \"2\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"number\", \"3\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"@$\\\"\\r\\n\\\"\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"$@\\\"\\r\\n\\\"\"]\n\t]],\n\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"$@\\\"\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"number\", \"1\"],\n\t\t\t\t[\"operator\", \"+\"],\n\t\t\t\t[\"number\", \"2\"],\n\t\t\t\t[\"comment\", \"// some comment \\\":}{}\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for string interpolation.\n"
  },
  {
    "path": "tests/languages/csharp/issue1091.test",
    "content": "@\"file:///\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"@\\\"file:///\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that three slashes inside a string do not break highlighting.\r\nSee #1091."
  },
  {
    "path": "tests/languages/csharp/issue1365.test",
    "content": "interface ILogger {\r\n\tvoid Init(SomeClass file);\r\n\tvoid LogInfo(string message);\r\n}\r\npublic class SomeClass : BaseClass {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"class-name\", [\r\n\t\t\"ILogger\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"return-type\", [\r\n\t\t[\"keyword\", \"void\"]\r\n\t]],\r\n\t[\"function\", \"Init\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t\"SomeClass\"\r\n\t]],\r\n\t\" file\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"return-type\", [\r\n\t\t[\"keyword\", \"void\"]\r\n\t]],\r\n\t[\"function\", \"LogInfo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"string\"]\r\n\t]],\r\n\t\" message\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"SomeClass\"\r\n\t]],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"type-list\", [\r\n\t\t[\"class-name\", [\r\n\t\t\t\"BaseClass\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names. See #1365\r\n"
  },
  {
    "path": "tests/languages/csharp/issue1371.test",
    "content": "container.Register<Car>();\r\ncontainer.Register<IJuice, Juice>();\r\nvar container = new Container(f =>\r\n{\r\n\tf.For<IFoo>().Use<Foo>();\r\n});\r\nclass LandAnimal {\r\n\tpublic void Move() => Run(); }\r\nclass Dog : LandAnimal {\r\n\tpublic new void Move() => Run(); }\r\nclass Works : LandAnimal {\r\n\tpublic override void Move() => Run(); }\r\n[Required]\r\n[RequiredAttribute()]\r\n[Range(1, 10)]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"container\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"generic-method\", [\r\n\t\t[\"function\", \"Register\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"Car\",\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t\"\\r\\ncontainer\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"generic-method\", [\r\n\t\t[\"function\", \"Register\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"IJuice\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\" Juice\",\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"keyword\", \"var\"]\r\n\t]],\r\n\t\" container \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"constructor-invocation\", [\r\n\t\t\"Container\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"f \",\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\"\\r\\n\\tf\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"generic-method\", [\r\n\t\t[\"function\", \"For\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"IFoo\",\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"generic-method\", [\r\n\t\t[\"function\", \"Use\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\"Foo\",\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"LandAnimal\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"return-type\", [\r\n\t\t[\"keyword\", \"void\"]\r\n\t]],\r\n\t[\"function\", \"Move\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"function\", \"Run\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"Dog\"\r\n\t]],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"type-list\", [\r\n\t\t[\"class-name\", [\r\n\t\t\t\"LandAnimal\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"return-type\", [\r\n\t\t[\"keyword\", \"void\"]\r\n\t]],\r\n\t[\"function\", \"Move\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"function\", \"Run\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"Works\"\r\n\t]],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"type-list\", [\r\n\t\t[\"class-name\", [\r\n\t\t\t\"LandAnimal\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"override\"],\r\n\t[\"return-type\", [\r\n\t\t[\"keyword\", \"void\"]\r\n\t]],\r\n\t[\"function\", \"Move\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"function\", \"Run\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"attribute\", [\r\n\t\t[\"class-name\", [\r\n\t\t\t\"Required\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"attribute\", [\r\n\t\t[\"class-name\", [\r\n\t\t\t\"RequiredAttribute\"\r\n\t\t]],\r\n\t\t[\"attribute-arguments\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"attribute\", [\r\n\t\t[\"class-name\", [\r\n\t\t\t\"Range\"\r\n\t\t]],\r\n\t\t[\"attribute-arguments\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"10\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for various cases of class names. See #1371\r\n"
  },
  {
    "path": "tests/languages/csharp/issue2968.test",
    "content": "func(from: \"America\", to: \"Asia\"); // Prism incorrectly highlights \"from\" as a keyword\n\nfrom element in list; // no issues here\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"func\"],\n\t[\"punctuation\", \"(\"],\n\t[\"named-parameter\", \"from\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"\\\"America\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"named-parameter\", \"to\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"\\\"Asia\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"comment\", \"// Prism incorrectly highlights \\\"from\\\" as a keyword\"],\n\n\t[\"keyword\", \"from\"],\n\t\" element \",\n\t[\"keyword\", \"in\"],\n\t\" list\",\n\t[\"punctuation\", \";\"],\n\t[\"comment\", \"// no issues here\"]\n]\n"
  },
  {
    "path": "tests/languages/csharp/issue806.test",
    "content": "0.3f\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0.3f\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that \"f\" prefix is properly highlighted as part of the number.\r\nSee #806."
  },
  {
    "path": "tests/languages/csharp/keyword_feature.test",
    "content": "abstract\r\nadd\r\nalias\r\nand\r\nas\r\nascending\r\nasync\r\nawait\r\nbase\r\nbool\r\nbreak\r\nby\r\nbyte\r\ncase\r\ncatch\r\nchar\r\nchecked\r\nclass;\r\nconst\r\ncontinue\r\ndecimal\r\ndefault\r\ndelegate\r\ndescending\r\ndo\r\ndouble\r\ndynamic\r\nelse\r\nenum;\r\nevent\r\nexplicit\r\nextern\r\nfinally\r\nfixed\r\nfloat\r\nfor\r\nforeach\r\nfrom foo;\r\nget\r\nglobal\r\ngoto\r\ngroup\r\nif\r\nimplicit\r\nin\r\ninit;\r\nint;\r\ninterface;\r\ninternal\r\ninto\r\nis\r\njoin\r\nlet\r\nlock\r\nlong\r\nnameof\r\nnamespace;\r\nnew;\r\nnot\r\nnotnull\r\nnull\r\nobject\r\non\r\noperator\r\nor\r\norderby\r\nout\r\noverride\r\nparams\r\npartial\r\nprivate\r\nprotected\r\npublic\r\nreadonly\r\nrecord;\r\nref\r\nremove\r\nreturn\r\nsbyte\r\nsealed\r\nselect\r\nset\r\nshort\r\nsizeof\r\nstackalloc\r\nstatic\r\nstring;\r\nstruct;\r\nswitch\r\nthis\r\nthrow\r\ntry\r\ntypeof\r\nuint\r\nulong\r\nunchecked\r\nunmanaged\r\nunsafe\r\nushort\r\nusing\r\nvalue\r\nvar\r\nvirtual\r\nvoid\r\nvolatile\r\nwhen\r\nwhere;\r\nwhile\r\nyield\r\n\r\n// very contextual keywords:\r\nPerson person2 = person1 with { FirstName = \"John\" };\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"add\"],\r\n\t[\"keyword\", \"alias\"],\r\n\t[\"keyword\", \"and\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"ascending\"],\r\n\t[\"keyword\", \"async\"],\r\n\t[\"keyword\", \"await\"],\r\n\t[\"keyword\", \"base\"],\r\n\t[\"keyword\", \"bool\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"by\"],\r\n\t[\"keyword\", \"byte\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"char\"],\r\n\t[\"keyword\", \"checked\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"decimal\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"delegate\"],\r\n\t[\"keyword\", \"descending\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"double\"],\r\n\t[\"keyword\", \"dynamic\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"event\"],\r\n\t[\"keyword\", \"explicit\"],\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"fixed\"],\r\n\t[\"keyword\", \"float\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"keyword\", \"from\"], \" foo\", [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"keyword\", \"global\"],\r\n\t[\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"group\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"implicit\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"init\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"internal\"],\r\n\t[\"keyword\", \"into\"],\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"join\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"lock\"],\r\n\t[\"keyword\", \"long\"],\r\n\t[\"keyword\", \"nameof\"],\r\n\t[\"keyword\", \"namespace\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"notnull\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"object\"],\r\n\t[\"keyword\", \"on\"],\r\n\t[\"keyword\", \"operator\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"orderby\"],\r\n\t[\"keyword\", \"out\"],\r\n\t[\"keyword\", \"override\"],\r\n\t[\"keyword\", \"params\"],\r\n\t[\"keyword\", \"partial\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"readonly\"],\r\n\t[\"keyword\", \"record\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"ref\"],\r\n\t[\"keyword\", \"remove\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"sbyte\"],\r\n\t[\"keyword\", \"sealed\"],\r\n\t[\"keyword\", \"select\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"keyword\", \"short\"],\r\n\t[\"keyword\", \"sizeof\"],\r\n\t[\"keyword\", \"stackalloc\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"string\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"struct\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"typeof\"],\r\n\t[\"keyword\", \"uint\"],\r\n\t[\"keyword\", \"ulong\"],\r\n\t[\"keyword\", \"unchecked\"],\r\n\t[\"keyword\", \"unmanaged\"],\r\n\t[\"keyword\", \"unsafe\"],\r\n\t[\"keyword\", \"ushort\"],\r\n\t[\"keyword\", \"using\"],\r\n\t[\"keyword\", \"value\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"virtual\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"keyword\", \"volatile\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"where\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"yield\"],\r\n\r\n\t[\"comment\", \"// very contextual keywords:\"],\r\n\r\n\t[\"class-name\", [\"Person\"]],\r\n\t\" person2 \",\r\n\t[\"operator\", \"=\"],\r\n\t\" person1 \",\r\n\t[\"keyword\", \"with\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" FirstName \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"John\\\"\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/csharp/named-parameter_feature.test",
    "content": "Foo(abc: 4, xyz: 6);\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"Foo\"],\n\t[\"punctuation\", \"(\"],\n\t[\"named-parameter\", \"abc\"],\n\t[\"punctuation\", \":\"],\n\t[\"number\", \"4\"],\n\t[\"punctuation\", \",\"],\n\t[\"named-parameter\", \"xyz\"],\n\t[\"punctuation\", \":\"],\n\t[\"number\", \"6\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for named method parameters.\n"
  },
  {
    "path": "tests/languages/csharp/namespace_feature.test",
    "content": "namespace Foo {}\nnamespace Foo.Bar {}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"namespace\"],\n\t[\"namespace\", [\"Foo\"]],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"namespace\"],\n\t[\"namespace\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Bar\"\n\t]],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]\n\n\n----------------------------------------------------\n\nChecks for namespace declarations.\n"
  },
  {
    "path": "tests/languages/csharp/number_feature.test",
    "content": "42\r\n3.14159\r\n3.14159f\r\n3.14159e-23\r\n.1f\r\n1234L\r\n1234u\r\n700000000000ul\r\n700000000000Lu\r\n0xFFFFFFFFFFFFFFFFul\r\n0xbabe\r\n0XBABE\r\n1_000_000\r\n1_2_3_4.5_6e-7_8\r\n0X_BA_BE\r\n0b_1_0000_0000_0000_0000_0000_0000_0000_0000\r\n\r\n0.06m\r\n0.06M\r\n0.06f\r\n0.06F\r\n0.06d\r\n0.06D\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3.14159f\"],\r\n\t[\"number\", \"3.14159e-23\"],\r\n\t[\"number\", \".1f\"],\r\n\t[\"number\", \"1234L\"],\r\n\t[\"number\", \"1234u\"],\r\n\t[\"number\", \"700000000000ul\"],\r\n\t[\"number\", \"700000000000Lu\"],\r\n\t[\"number\", \"0xFFFFFFFFFFFFFFFFul\"],\r\n\t[\"number\", \"0xbabe\"],\r\n\t[\"number\", \"0XBABE\"],\r\n\t[\"number\", \"1_000_000\"],\r\n\t[\"number\", \"1_2_3_4.5_6e-7_8\"],\r\n\t[\"number\", \"0X_BA_BE\"],\r\n\t[\"number\", \"0b_1_0000_0000_0000_0000_0000_0000_0000_0000\"],\r\n\r\n\t[\"number\", \"0.06m\"],\r\n\t[\"number\", \"0.06M\"],\r\n\t[\"number\", \"0.06f\"],\r\n\t[\"number\", \"0.06F\"],\r\n\t[\"number\", \"0.06d\"],\r\n\t[\"number\", \"0.06D\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal and hexadecimal numbers.\r\n"
  },
  {
    "path": "tests/languages/csharp/operator_feature.test",
    "content": "+ - * / % -- ++\r\n>> <<\r\n~ & | ^\r\n+= -= *= /= %= >>= <<= &= |= ^=\r\n! && ||\r\n-> =>\r\n= == != < > <= >=\r\n?? ??=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"operator\", \"++\"],\r\n\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \"<<\"],\r\n\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"^\"],\r\n\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"|=\"],\r\n\t[\"operator\", \"^=\"],\r\n\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\r\n\t[\"operator\", \"->\"],\r\n\t[\"operator\", \"=>\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">=\"],\r\n\r\n\t[\"operator\", \"??\"],\r\n\t[\"operator\", \"??=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/csharp/preprocessor_feature.test",
    "content": "#define DEBUG\r\n#if DEBUG\r\n#endif\r\n\r\n#elif\r\n#else\r\n#endregion\r\n#error\r\n#line\r\n#nullable\r\n#pragma\r\n#region\r\n#undef\r\n#warning\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"define\"], \" DEBUG\"]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"if\"], \" DEBUG\"]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"endif\"]]],\r\n\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"elif\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"else\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"endregion\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"error\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"line\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"nullable\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"pragma\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"region\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"undef\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"warning\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for preprocessor directives.\r\n"
  },
  {
    "path": "tests/languages/csharp/punctuation_feature.test",
    "content": ". , ; : ::\n? ?.\n[ ] { } ( )\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"::\"],\n\n\t[\"punctuation\", \"?\"],\n\t[\"punctuation\", \"?.\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/csharp/range_feature.test",
    "content": "list[2..^3];\nlist[..^3];\nlist[2..];\nlist[..];\n\n----------------------------------------------------\n\n[\n\t\"list\",\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"2\"],\n\t[\"range\", \"..\"],\n\t[\"operator\", \"^\"],\n\t[\"number\", \"3\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\nlist\",\n\t[\"punctuation\", \"[\"],\n\t[\"range\", \"..\"],\n\t[\"operator\", \"^\"],\n\t[\"number\", \"3\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\nlist\",\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"2\"],\n\t[\"range\", \"..\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\nlist\",\n\t[\"punctuation\", \"[\"],\n\t[\"range\", \"..\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for ranges.\n"
  },
  {
    "path": "tests/languages/csharp/return-type_feature.test",
    "content": "Foo Bar();\nFoo<IFoo> Bar<A>();\nFoo<IFoo>[,] Bar<A>();\nnew Foo<IFoo>[,] Bar<A>();\n(int, long)? Foo<int>();\n(int, long)? Foo => null;\nBaz?[,]? Foo { get; set } = null;\nint[]? this[int index] => null;\nint[]? IInterface.this[int index] => null;\n\n----------------------------------------------------\n\n[\n\t[\"return-type\", [\n\t\t\"Foo\"\n\t]],\n\t[\"function\", \"Bar\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"return-type\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"IFoo\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"generic-method\", [\n\t\t[\"function\", \"Bar\"],\n\t\t[\"generic\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"A\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"return-type\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"IFoo\",\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"generic-method\", [\n\t\t[\"function\", \"Bar\"],\n\t\t[\"generic\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"A\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"new\"],\n\t[\"return-type\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"IFoo\",\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"generic-method\", [\n\t\t[\"function\", \"Bar\"],\n\t\t[\"generic\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"A\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"return-type\", [\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"keyword\", \"int\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"keyword\", \"long\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \"?\"]\n\t]],\n\t[\"generic-method\", [\n\t\t[\"function\", \"Foo\"],\n\t\t[\"generic\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t[\"keyword\", \"int\"],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"return-type\", [\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"keyword\", \"int\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"keyword\", \"long\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \"?\"]\n\t]],\n\t\" Foo \",\n\t[\"operator\", \"=>\"],\n\t[\"keyword\", \"null\"],\n\t[\"punctuation\", \";\"],\n\t[\"return-type\", [\n\t\t\"Baz\",\n\t\t[\"punctuation\", \"?\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"punctuation\", \"]\"],\n\t\t[\"punctuation\", \"?\"]\n\t]],\n\t\" Foo \",\n\t[\"punctuation\", \"{\"],\n\t[\"keyword\", \"get\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"set\"],\n\t[\"punctuation\", \"}\"],\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"null\"],\n\t[\"punctuation\", \";\"],\n\t[\"return-type\", [\n\t\t[\"keyword\", \"int\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"punctuation\", \"]\"],\n\t\t[\"punctuation\", \"?\"]\n\t]],\n\t[\"keyword\", \"this\"],\n\t[\"punctuation\", \"[\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"int\"]\n\t]],\n\t\" index\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"=>\"],\n\t[\"keyword\", \"null\"],\n\t[\"punctuation\", \";\"],\n\t[\"return-type\", [\n\t\t[\"keyword\", \"int\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"punctuation\", \"]\"],\n\t\t[\"punctuation\", \"?\"]\n\t]],\n\t\" IInterface\",\n\t[\"punctuation\", \".\"],\n\t[\"keyword\", \"this\"],\n\t[\"punctuation\", \"[\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"int\"]\n\t]],\n\t\" index\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"=>\"],\n\t[\"keyword\", \"null\"],\n\t[\"punctuation\", \";\"]\n]\n\n\n----------------------------------------------------\n\nChecks for the return type.\n"
  },
  {
    "path": "tests/languages/csharp/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n\r\n@\"\"\r\n@\"foo\"\r\n@\"fo\"\"o\"\r\n@\"foo\r\nbar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\r\n\t[\"string\", \"@\\\"\\\"\"],\r\n\t[\"string\", \"@\\\"foo\\\"\"],\r\n\t[\"string\", \"@\\\"fo\\\"\\\"o\\\"\"],\r\n\t[\"string\", \"@\\\"foo\\r\\nbar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for normal and verbatim strings.\r\n"
  },
  {
    "path": "tests/languages/csharp/switch_feature.test",
    "content": "public static decimal CalculateToll(object vehicle) =>\n\tvehicle switch\n\t{\n\t\tDeliveryTruck t when t.GrossWeightClass > 5000 => 10.00m + 5.00m,\n\t\tDeliveryTruck t when t.GrossWeightClass < 3000 => 10.00m - 2.00m,\n\t\tDeliveryTruck _ => 10.00m,\n\t\t_ => throw new ArgumentException(\"Not a known vehicle type\", nameof(vehicle))\n\t};\n\nDeliveryTruck t when t.GrossWeightClass switch\n{\n\t> 5000 => 10.00m + 5.00m,\n\t< 3000 => 10.00m - 2.00m,\n\t_ => 10.00m,\n},\nDeliveryTruck t when t.GrossWeightClass switch\n{\n\t< 3000 => 10.00m - 2.00m,\n\t>= 3000 and <= 5000 => 10.00m,\n\t> 5000 => 10.00m + 5.00m,\n},\n\nswitch (DateTime.Now.DayOfWeek)\n{\n\tcase DayOfWeek.Sunday:\n\tcase DayOfWeek.Saturday:\n\t\tConsole.WriteLine(\"The weekend\");\n\t\tbreak;\n\tcase DayOfWeek.Monday:\n\t\tConsole.WriteLine(\"The first day of the work week.\");\n\t\tbreak;\n\tcase DayOfWeek.Friday:\n\t\tConsole.WriteLine(\"The last day of the work week.\");\n\t\tbreak;\n\tdefault:\n\t\tConsole.WriteLine(\"The middle of the work week.\");\n\t\tbreak;\n}\n\nswitch (str)\n{\n\tcase \"1\":\n\tcase \"small\":\n\t\tcost += 25;\n\t\tbreak;\n\tcase \"2\":\n\tcase \"medium\":\n\t\tcost += 25;\n\t\tgoto case \"1\";\n\tcase \"3\":\n\tcase \"large\":\n\t\tcost += 50;\n\t\tgoto case \"1\";\n\tdefault:\n\t\tConsole.WriteLine(\"Invalid selection. Please select 1, 2, or 3.\");\n\t\tbreak;\n}\n\nswitch (sh)\n{\n\t// Note that this code never evaluates to true.\n\tcase Shape shape when shape == null:\n\t\tbreak;\n\tcase null:\n\t\tbreak;\n\tcase Rectangle r when r.Length == r.Width && r.Area > 0:\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n}\n\nswitch (coll)\n{\n\tcase Array arr:\n\t\tbreak;\n\tcase IEnumerable<int> ieInt:\n\t\tbreak;\n\tcase object o:\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n}\n\nbool IsValidPercentage(object x) => x is\n\t>= 0 and <= 100 or    // integer tests\n\t>= 0F and <= 100F or  // float tests\n\t>= 0D and <= 100D;    // double tests\n\nbool isSmallByte(object o) => o is byte and < 100;\n\ncase (0, int x):\ncase (int x, 0):\n\tConsole.WriteLine(x);\n\ncase < 2: break;\ncase 0 or 1 or 2 or 3 or 4 or 5: break;\n\nint x = b switch { <100 => 0, 100 => 1, 101 => 2, >101 => 3 };\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"static\"],\n\t[\"return-type\", [\n\t\t[\"keyword\", \"decimal\"]\n\t]],\n\t[\"function\", \"CalculateToll\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"object\"]\n\t]],\n\t\" vehicle\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=>\"],\n\n\t\"\\r\\n\\tvehicle \",\n\t[\"keyword\", \"switch\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"class-name\", [\"DeliveryTruck\"]],\n\t\" t \",\n\t[\"keyword\", \"when\"],\n\t\" t\",\n\t[\"punctuation\", \".\"],\n\t\"GrossWeightClass \",\n\t[\"operator\", \">\"],\n\t[\"number\", \"5000\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"10.00m\"],\n\t[\"operator\", \"+\"],\n\t[\"number\", \"5.00m\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"class-name\", [\"DeliveryTruck\"]],\n\t\" t \",\n\t[\"keyword\", \"when\"],\n\t\" t\",\n\t[\"punctuation\", \".\"],\n\t\"GrossWeightClass \",\n\t[\"operator\", \"<\"],\n\t[\"number\", \"3000\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"10.00m\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"2.00m\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"return-type\", [\"DeliveryTruck\"]],\n\t\" _ \",\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"10.00m\"],\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n\\t\\t_ \",\n\t[\"operator\", \"=>\"],\n\t[\"keyword\", \"throw\"],\n\t[\"keyword\", \"new\"],\n\t[\"constructor-invocation\", [\"ArgumentException\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Not a known vehicle type\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"nameof\"],\n\t[\"punctuation\", \"(\"],\n\t\"vehicle\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\"DeliveryTruck\"]],\n\t\" t \",\n\t[\"keyword\", \"when\"],\n\t\" t\",\n\t[\"punctuation\", \".\"],\n\t\"GrossWeightClass \",\n\t[\"keyword\", \"switch\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"operator\", \">\"],\n\t[\"number\", \"5000\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"10.00m\"],\n\t[\"operator\", \"+\"],\n\t[\"number\", \"5.00m\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"operator\", \"<\"],\n\t[\"number\", \"3000\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"10.00m\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"2.00m\"],\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n\\t_ \",\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"10.00m\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"class-name\", [\"DeliveryTruck\"]],\n\t\" t \",\n\t[\"keyword\", \"when\"],\n\t\" t\",\n\t[\"punctuation\", \".\"],\n\t\"GrossWeightClass \",\n\t[\"keyword\", \"switch\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"operator\", \"<\"],\n\t[\"number\", \"3000\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"10.00m\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"2.00m\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"operator\", \">=\"],\n\t[\"number\", \"3000\"],\n\t[\"keyword\", \"and\"],\n\t[\"operator\", \"<=\"],\n\t[\"number\", \"5000\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"10.00m\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"operator\", \">\"],\n\t[\"number\", \"5000\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"10.00m\"],\n\t[\"operator\", \"+\"],\n\t[\"number\", \"5.00m\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"keyword\", \"switch\"],\n\t[\"punctuation\", \"(\"],\n\t\"DateTime\",\n\t[\"punctuation\", \".\"],\n\t\"Now\",\n\t[\"punctuation\", \".\"],\n\t\"DayOfWeek\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"case\"],\n\t\" DayOfWeek\",\n\t[\"punctuation\", \".\"],\n\t\"Sunday\",\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"case\"],\n\t\" DayOfWeek\",\n\t[\"punctuation\", \".\"],\n\t\"Saturday\",\n\t[\"punctuation\", \":\"],\n\n\t\"\\r\\n\\t\\tConsole\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"WriteLine\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"The weekend\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t\" DayOfWeek\",\n\t[\"punctuation\", \".\"],\n\t\"Monday\",\n\t[\"punctuation\", \":\"],\n\n\t\"\\r\\n\\t\\tConsole\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"WriteLine\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"The first day of the work week.\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t\" DayOfWeek\",\n\t[\"punctuation\", \".\"],\n\t\"Friday\",\n\t[\"punctuation\", \":\"],\n\n\t\"\\r\\n\\t\\tConsole\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"WriteLine\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"The last day of the work week.\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"default\"],\n\t[\"punctuation\", \":\"],\n\n\t\"\\r\\n\\t\\tConsole\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"WriteLine\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"The middle of the work week.\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"switch\"],\n\t[\"punctuation\", \"(\"],\n\t\"str\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"string\", \"\\\"1\\\"\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"string\", \"\\\"small\\\"\"],\n\t[\"punctuation\", \":\"],\n\n\t\"\\r\\n\\t\\tcost \",\n\t[\"operator\", \"+=\"],\n\t[\"number\", \"25\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"string\", \"\\\"2\\\"\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"string\", \"\\\"medium\\\"\"],\n\t[\"punctuation\", \":\"],\n\n\t\"\\r\\n\\t\\tcost \",\n\t[\"operator\", \"+=\"],\n\t[\"number\", \"25\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"goto\"],\n\t[\"keyword\", \"case\"],\n\t[\"string\", \"\\\"1\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"string\", \"\\\"3\\\"\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"string\", \"\\\"large\\\"\"],\n\t[\"punctuation\", \":\"],\n\n\t\"\\r\\n\\t\\tcost \",\n\t[\"operator\", \"+=\"],\n\t[\"number\", \"50\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"goto\"],\n\t[\"keyword\", \"case\"],\n\t[\"string\", \"\\\"1\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"default\"],\n\t[\"punctuation\", \":\"],\n\n\t\"\\r\\n\\t\\tConsole\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"WriteLine\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Invalid selection. Please select 1, 2, or 3.\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"switch\"],\n\t[\"punctuation\", \"(\"],\n\t\"sh\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"comment\", \"// Note that this code never evaluates to true.\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"class-name\", [\"Shape\"]],\n\t\" shape \",\n\t[\"keyword\", \"when\"],\n\t\" shape \",\n\t[\"operator\", \"==\"],\n\t[\"keyword\", \"null\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"null\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"class-name\", [\"Rectangle\"]],\n\t\" r \",\n\t[\"keyword\", \"when\"],\n\t\" r\",\n\t[\"punctuation\", \".\"],\n\t\"Length \",\n\t[\"operator\", \"==\"],\n\t\" r\",\n\t[\"punctuation\", \".\"],\n\t\"Width \",\n\t[\"operator\", \"&&\"],\n\t\" r\",\n\t[\"punctuation\", \".\"],\n\t\"Area \",\n\t[\"operator\", \">\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"default\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"switch\"],\n\t[\"punctuation\", \"(\"],\n\t\"coll\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"class-name\", [\"Array\"]],\n\t\" arr\",\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"class-name\", [\n\t\t\"IEnumerable\",\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"keyword\", \"int\"],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\" ieInt\",\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"object\"]\n\t]],\n\t\" o\",\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"default\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"return-type\", [\n\t\t[\"keyword\", \"bool\"]\n\t]],\n\t[\"function\", \"IsValidPercentage\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"object\"]\n\t]],\n\t\" x\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=>\"],\n\t\" x \",\n\t[\"keyword\", \"is\"],\n\n\t[\"operator\", \">=\"],\n\t[\"number\", \"0\"],\n\t[\"keyword\", \"and\"],\n\t[\"operator\", \"<=\"],\n\t[\"number\", \"100\"],\n\t[\"keyword\", \"or\"],\n\t[\"comment\", \"// integer tests\"],\n\n\t[\"operator\", \">=\"],\n\t[\"number\", \"0F\"],\n\t[\"keyword\", \"and\"],\n\t[\"operator\", \"<=\"],\n\t[\"number\", \"100F\"],\n\t[\"keyword\", \"or\"],\n\t[\"comment\", \"// float tests\"],\n\n\t[\"operator\", \">=\"],\n\t[\"number\", \"0D\"],\n\t[\"keyword\", \"and\"],\n\t[\"operator\", \"<=\"],\n\t[\"number\", \"100D\"],\n\t[\"punctuation\", \";\"],\n\t[\"comment\", \"// double tests\"],\n\n\t[\"return-type\", [\n\t\t[\"keyword\", \"bool\"]\n\t]],\n\t[\"function\", \"isSmallByte\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"object\"]\n\t]],\n\t\" o\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=>\"],\n\t\" o \",\n\t[\"keyword\", \"is\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"byte\"]\n\t]],\n\t[\"keyword\", \"and\"],\n\t[\"operator\", \"<\"],\n\t[\"number\", \"100\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"int\"]\n\t]],\n\t\" x\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"int\"]\n\t]],\n\t\" x\",\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \":\"],\n\n\t\"\\r\\n\\tConsole\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"WriteLine\"],\n\t[\"punctuation\", \"(\"],\n\t\"x\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"operator\", \"<\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \":\"],\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"number\", \"0\"],\n\t[\"keyword\", \"or\"],\n\t[\"number\", \"1\"],\n\t[\"keyword\", \"or\"],\n\t[\"number\", \"2\"],\n\t[\"keyword\", \"or\"],\n\t[\"number\", \"3\"],\n\t[\"keyword\", \"or\"],\n\t[\"number\", \"4\"],\n\t[\"keyword\", \"or\"],\n\t[\"number\", \"5\"],\n\t[\"punctuation\", \":\"],\n\t[\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\n\t\t[\"keyword\", \"int\"]\n\t]],\n\t\" x \",\n\t[\"operator\", \"=\"],\n\t\" b \",\n\t[\"keyword\", \"switch\"],\n\t[\"punctuation\", \"{\"],\n\t[\"operator\", \"<\"],\n\t[\"number\", \"100\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"100\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"101\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \">\"],\n\t[\"number\", \"101\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"3\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for switch statements and expressions.\n"
  },
  {
    "path": "tests/languages/csharp/type-expression_feature.test",
    "content": "default(int)\ndefault(Foo)\ntypeof(Foo)\ntypeof((int, long))\ndefault(Foo<Bar, IFoo<Bar>>)\nsizeof(int)\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"default\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type-expression\", [\n\t\t[\"keyword\", \"int\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"default\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type-expression\", [\n\t\t\"Foo\"\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"typeof\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type-expression\", [\n\t\t\"Foo\"\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"typeof\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type-expression\", [\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"keyword\", \"int\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"keyword\", \"long\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"default\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type-expression\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"Bar\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" IFoo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"Bar\",\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"sizeof\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type-expression\", [\n\t\t[\"keyword\", \"int\"]\n\t]],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for class names of type expressions.\n"
  },
  {
    "path": "tests/languages/csharp/type-list_feature.test",
    "content": "class Foo<T> : Bar<IList<Bar>, T>, IBar<Bar, T>, IFoo\n\twhere T : class, IBar<IFoo>, IFoo<Bar> {}\n\npublic class Foo : IBar<int> {}\n\npublic delegate ErrorCode GetInfoMethod<H, A, I>(H handle, A value, I paramName,\n\tSize_t paramValueSize, IntPtr paramValue, out Size_t paramValueSizeRet)\n\twhere H : unmanaged, IInfoHandle<A, I> where A : unmanaged where I : unmanaged, Enum;\n\n// the \"new()\" constraint\nvoid Foo<A, B>()\n\twhere A : IFoo, new()\n\twhere B : new(), IFoo;\n\n// records are kinda difficult to handle\npublic abstract record Person(string FirstName, string LastName);\npublic record Teacher(string FirstName, string LastName, int Grade)\n\t: Person(FirstName, LastName), IFoo<int>;\npublic record Student(string FirstName, string LastName, int Grade)\n\t: Person(FirstName, LastName);\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"T\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"class-name\", [\n\t\t\t\"Bar\",\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"IList\",\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"Bar\",\n\t\t\t[\"punctuation\", \">\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" T\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\n\t\t\t\"IBar\",\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"Bar\",\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" T\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\"IFoo\"]]\n\t]],\n\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"T\"],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"keyword\", \"class\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\n\t\t\t\"IBar\",\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"IFoo\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\n\t\t\t\"IFoo\",\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"Bar\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"Foo\"]],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"class-name\", [\n\t\t\t\"IBar\",\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t[\"keyword\", \"int\"],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"delegate\"],\n\t[\"return-type\", [\"ErrorCode\"]],\n\t[\"generic-method\", [\n\t\t[\"function\", \"GetInfoMethod\"],\n\t\t[\"generic\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"H\",\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" A\",\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" I\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\"H\"]],\n\t\" handle\",\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\"A\"]],\n\t[\"keyword\", \"value\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\"I\"]],\n\t\" paramName\",\n\t[\"punctuation\", \",\"],\n\n\t[\"class-name\", [\"Size_t\"]],\n\t\" paramValueSize\",\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\"IntPtr\"]],\n\t\" paramValue\",\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"out\"],\n\t[\"class-name\", [\"Size_t\"]],\n\t\" paramValueSizeRet\",\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"H\"],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"keyword\", \"unmanaged\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\n\t\t\t\"IInfoHandle\",\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"A\",\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" I\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"A\"],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"keyword\", \"unmanaged\"]\n\t]],\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"I\"],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"keyword\", \"unmanaged\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\"Enum\"]]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// the \\\"new()\\\" constraint\"],\n\n\t[\"return-type\", [\n\t\t[\"keyword\", \"void\"]\n\t]],\n\t[\"generic-method\", [\n\t\t[\"function\", \"Foo\"],\n\t\t[\"generic\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\"A\",\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" B\",\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"A\"],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"class-name\", [\"IFoo\"]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"keyword\", \"new\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"B\"],\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"keyword\", \"new\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\"IFoo\"]]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// records are kinda difficult to handle\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"abstract\"],\n\t[\"keyword\", \"record\"],\n\t[\"class-name\", [\"Person\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"string\"]\n\t]],\n\t\" FirstName\",\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"string\"]\n\t]],\n\t\" LastName\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"record\"],\n\t[\"class-name\", [\"Teacher\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"string\"]\n\t]],\n\t\" FirstName\",\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"string\"]\n\t]],\n\t\" LastName\",\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"int\"]\n\t]],\n\t\" Grade\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"class-name\", [\"Person\"]],\n\t\t[\"record-arguments\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"FirstName\",\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" LastName\",\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", [\n\t\t\t\"IFoo\",\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t[\"keyword\", \"int\"],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"record\"],\n\t[\"class-name\", [\"Student\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"string\"]\n\t]],\n\t\" FirstName\",\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"string\"]\n\t]],\n\t\" LastName\",\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"int\"]\n\t]],\n\t\" Grade\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t[\"type-list\", [\n\t\t[\"class-name\", [\"Person\"]],\n\t\t[\"record-arguments\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"FirstName\",\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" LastName\",\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for type lists of inheritance or generic constraints.\n"
  },
  {
    "path": "tests/languages/csharp/using-directive_feature.test",
    "content": "using System;\nusing System.IO;\nusing static System.Math;\nusing static Foo.Bar<IFoo>.FooBar<IFoo>;\nusing FooBar = Foo.Bar;\nusing FooBar = Foo.Bar<IFoo>.FooBar<IFoo>;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"using\"],\n\t[\"namespace\", [\"System\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"using\"],\n\t[\"namespace\", [\n\t\t\"System\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"IO\"\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"using\"],\n\t[\"keyword\", \"static\"],\n\t[\"class-name\", [\n\t\t\"System\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Math\"\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"using\"],\n\t[\"keyword\", \"static\"],\n\t[\"class-name\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Bar\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"IFoo\",\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \".\"],\n\t\t\"FooBar\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"IFoo\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"using\"],\n\t[\"class-name\", \"FooBar\"],\n\t[\"operator\", \"=\"],\n\t[\"class-name\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Bar\"\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"using\"],\n\t[\"class-name\", \"FooBar\"],\n\t[\"operator\", \"=\"],\n\t[\"class-name\", [\n\t\t\"Foo\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Bar\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"IFoo\",\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \".\"],\n\t\t\"FooBar\",\n\t\t[\"punctuation\", \"<\"],\n\t\t\"IFoo\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"punctuation\", \";\"]\n]\n\n\n----------------------------------------------------\n\nChecks for using directives.\n"
  },
  {
    "path": "tests/languages/csharp!+xml-doc/inclusion.test",
    "content": "/// <summary>\r\n/// Class level summary documentation goes here.\r\n/// </summary>\r\n/// <remarks>\r\n/// Longer comments can be associated with a type or member through\r\n/// the remarks tag.\r\n/// </remarks>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"doc-comment\", [\r\n\t\t\"/// \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"summary\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"doc-comment\", [\"/// Class level summary documentation goes here.\"]],\r\n\t[\"doc-comment\", [\r\n\t\t\"/// \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"summary\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"doc-comment\", [\r\n\t\t\"/// \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"remarks\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"doc-comment\", [\"/// Longer comments can be associated with a type or member through\"]],\r\n\t[\"doc-comment\", [\"/// the remarks tag.\"]],\r\n\t[\"doc-comment\", [\r\n\t\t\"/// \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"remarks\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for XML documentation comments.\r\n"
  },
  {
    "path": "tests/languages/csharp+aspnet/directive_feature.test",
    "content": "<%: Page.Title %>\r\n<%#:Item.ProductID%>\r\n<a href=\"ProductDetails.aspx?productID=<%#:Item.ProductID%>\">\r\n<% if(foo) { %>\r\n\tfoobar\r\n<% } %>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", [\r\n\t\t[\"directive\", \"<%:\"],\r\n\t\t\" Page\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Title \",\r\n\t\t[\"directive\", \"%>\"]\r\n\t]],\r\n\t[\"directive\", [\r\n\t\t[\"directive\", \"<%#:\"],\r\n\t\t\"Item\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"ProductID\",\r\n\t\t[\"directive\", \"%>\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"attr-name\", [\"href\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"ProductDetails.aspx?productID=\",\r\n\t\t\t[\"directive\", [\r\n\t\t\t\t[\"directive\", \"<%#:\"],\r\n\t\t\t\t\"Item\",\r\n\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\"ProductID\",\r\n\t\t\t\t[\"directive\", \"%>\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"directive\", [\r\n\t\t[\"directive\", \"<%\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"foo\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"directive\", \"%>\"]\r\n\t]],\r\n\t\"\\r\\n\\tfoobar\\r\\n\",\r\n\t[\"directive\", [\r\n\t\t[\"directive\", \"<%\"],\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"directive\", \"%>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directives.\r\n"
  },
  {
    "path": "tests/languages/cshtml/block_feature.test",
    "content": "@for (var i = 0; i < people.Length; i++)\n{\n    var person = people[i];\n    <text>Name: @person.Name</text>\n}\n\n@if (value % 2 == 0)\n{\n    <p>The value was even.</p>\n}\n\n@if (value % 2 == 0)\n{\n    <p>The value was even.</p>\n}\nelse if (value >= 1337)\n{\n    <p>The value is large.</p>\n}\nelse\n{\n    <p>The value is odd and small.</p>\n}\n\n@switch (value)\n{\n    case 1:\n        <p>The value is 1!</p>\n        break;\n    case 1337:\n        <p>Your number is 1337!</p>\n        break;\n    default:\n        <p>Your number wasn't 1 or 1337.</p>\n        break;\n}\n\n@for (var i = 0; i < people.Length; i++)\n{\n    var person = people[i];\n    <p>Name: @person.Name</p>\n    <p>Age: @person.Age</p>\n}\n\n@foreach (var person in people)\n{\n    <p>Name: @person.Name</p>\n    <p>Age: @person.Age</p>\n}\n\n@{ var i = 0; }\n@while (i < people.Length)\n{\n    var person = people[i];\n    <p>Name: @person.Name</p>\n    <p>Age: @person.Age</p>\n\n    i++;\n}\n\n@{ var i = 0; }\n@do\n{\n    var person = people[i];\n    <p>Name: @person.Name</p>\n    <p>Age: @person.Age</p>\n\n    i++;\n} while (i < people.Length);\n\n@using (Html.BeginForm())\n{\n    <div>\n        Email: <input type=\"email\" id=\"Email\" value=\"\">\n        <button>Register</button>\n    </div>\n}\n\n@try\n{\n    throw new InvalidOperationException(\"You did something invalid.\");\n}\ncatch (Exception ex)\n{\n    <p>The exception message: @ex.Message</p>\n}\nfinally\n{\n    <p>The finally statement.</p>\n}\n\n@lock (SomeLock)\n{\n    // Do critical section work\n}\n\n@helper TrialHelper(string name) {\n    // some code\n}\n\n----------------------------------------------------\n\n[\n\t[\"block\", [\n\t\t[\"keyword\", \"@for\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" i \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"number\", \"0\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t\" i \",\n\t\t\t[\"operator\", \"<\"],\n\t\t\t\" people\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"Length\",\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t\" i\",\n\t\t\t[\"operator\", \"++\"],\n\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" person \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t\" people\",\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"i\",\n\t\t\t[\"punctuation\", \"]\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"text\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Name: \",\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t\"person\",\n\t\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\t\"Name\"\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"text\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@if\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"keyword\", \"value\"],\n\t\t\t[\"operator\", \"%\"],\n\t\t\t[\"number\", \"2\"],\n\t\t\t[\"operator\", \"==\"],\n\t\t\t[\"number\", \"0\"],\n\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"The value was even.\",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@if\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"keyword\", \"value\"],\n\t\t\t[\"operator\", \"%\"],\n\t\t\t[\"number\", \"2\"],\n\t\t\t[\"operator\", \"==\"],\n\t\t\t[\"number\", \"0\"],\n\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"The value was even.\",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"keyword\", \"else\"],\n\t\t\t[\"keyword\", \"if\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"keyword\", \"value\"],\n\t\t\t[\"operator\", \">=\"],\n\t\t\t[\"number\", \"1337\"],\n\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"The value is large.\",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"keyword\", \"else\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"The value is odd and small.\",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@switch\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"keyword\", \"value\"],\n\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"keyword\", \"case\"],\n\t\t\t[\"number\", \"1\"],\n\t\t\t[\"punctuation\", \":\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"The value is 1!\",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"keyword\", \"break\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"keyword\", \"case\"],\n\t\t\t[\"number\", \"1337\"],\n\t\t\t[\"punctuation\", \":\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Your number is 1337!\",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"keyword\", \"break\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"keyword\", \"default\"],\n\t\t\t[\"punctuation\", \":\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Your number wasn't 1 or 1337.\",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"keyword\", \"break\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@for\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" i \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"number\", \"0\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t\" i \",\n\t\t\t[\"operator\", \"<\"],\n\t\t\t\" people\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"Length\",\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t\" i\",\n\t\t\t[\"operator\", \"++\"],\n\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" person \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t\" people\",\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"i\",\n\t\t\t[\"punctuation\", \"]\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Name: \",\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t\"person\",\n\t\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\t\"Name\"\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Age: \",\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t\"person\",\n\t\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\t\"Age\"\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@foreach\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" person \",\n\t\t\t[\"keyword\", \"in\"],\n\t\t\t\" people\",\n\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Name: \",\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t\"person\",\n\t\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\t\"Name\"\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Age: \",\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t\"person\",\n\t\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\t\"Age\"\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" i \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"number\", \"0\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@while\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"i \",\n\t\t\t[\"operator\", \"<\"],\n\t\t\t\" people\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"Length\",\n\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" person \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t\" people\",\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"i\",\n\t\t\t[\"punctuation\", \"]\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Name: \",\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t\"person\",\n\t\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\t\"Name\"\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Age: \",\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t\"person\",\n\t\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\t\"Age\"\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t\"\\r\\n\\r\\n    i\", [\"operator\", \"++\"], [\"punctuation\", \";\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" i \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"number\", \"0\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@do\"],\n\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" person \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t\" people\",\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t\"i\",\n\t\t\t[\"punctuation\", \"]\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Name: \",\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t\"person\",\n\t\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\t\"Name\"\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Age: \",\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t\"person\",\n\t\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\t\"Age\"\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t\"\\r\\n\\r\\n    i\",\n\t\t\t[\"operator\", \"++\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"punctuation\", \"}\"],\n\t\t\t[\"keyword\", \"while\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"i \",\n\t\t\t[\"operator\", \"<\"],\n\t\t\t\" people\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"Length\",\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@using\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"Html\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"BeginForm\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"div\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\n\t\t\t\t\"\\r\\n        Email: \",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"input\"]],\n\t\t\t\t\t[\"attr-name\", [\"type\"]],\n\t\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\t\"email\",\n\t\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t\t]],\n\t\t\t\t\t[\"attr-name\", [\"id\"]],\n\t\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\t\"Email\",\n\t\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t\t]],\n\t\t\t\t\t[\"attr-name\", [\"value\"]],\n\t\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t\t]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"button\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Register\",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"button\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"div\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@try\"],\n\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"keyword\", \"throw\"],\n\t\t\t[\"keyword\", \"new\"],\n\t\t\t[\"constructor-invocation\", [\"InvalidOperationException\"]],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"You did something invalid.\\\"\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"keyword\", \"catch\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"class-name\", [\"Exception\"]],\n\t\t\t\" ex\",\n\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"The exception message: \",\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t\"ex\",\n\t\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\t\"Message\"\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"keyword\", \"finally\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"The finally statement.\",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@lock\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"], \"SomeLock\", [\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"comment\", \"// Do critical section work\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@helper\"],\n\t\t[\"csharp\", [\n\t\t\t[\"function\", \"TrialHelper\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"string\"]\n\t\t\t]],\n\t\t\t\" name\",\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"comment\", \"// some code\"],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/cshtml/code-block_feature.test",
    "content": "@{\n    var quote = \"The future depends on what you do today. - Mahatma Gandhi\";\n}\n\n<p>@quote</p>\n\n@{\n    quote = \"Hate cannot drive out hate, only love can do that. - Martin Luther King, Jr.\";\n}\n\n<p>@quote</p>\n\n@{\n    void RenderName(string name)\n    {\n        <p>Name: <strong>@name</strong></p>\n    }\n\n    RenderName(\"Mahatma Gandhi\");\n    RenderName(\"Martin Luther King, Jr.\");\n}\n\n@{\n    var inCSharp = true;\n    <p>Now in HTML, was in C# @inCSharp</p>\n}\n\n@{\n    Func<dynamic, object> petTemplate = @<p>You have a pet named <strong>@item.Name</strong>.</p>;\n\n    var pets = new List<Pet>\n    {\n        new Pet { Name = \"Rin Tin Tin\" },\n        new Pet { Name = \"Mr. Bigglesworth\" },\n        new Pet { Name = \"K-9\" }\n    };\n}\n\n----------------------------------------------------\n\n[\n\t[\"block\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" quote \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"string\", \"\\\"The future depends on what you do today. - Mahatma Gandhi\\\"\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\"quote\"]]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t\"\\r\\n    quote \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"string\", \"\\\"Hate cannot drive out hate, only love can do that. - Martin Luther King, Jr.\\\"\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\"quote\"]]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"return-type\", [\n\t\t\t\t[\"keyword\", \"void\"]\n\t\t\t]],\n\t\t\t[\"function\", \"RenderName\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"string\"]\n\t\t\t]],\n\t\t\t\" name\",\n\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Name: \",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"strong\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\"name\"]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"strong\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"function\", \"RenderName\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"Mahatma Gandhi\\\"\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"function\", \"RenderName\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"Martin Luther King, Jr.\\\"\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" inCSharp \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"boolean\", \"true\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"Now in HTML, was in C# \",\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\"inCSharp\"]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t\"Func\",\n\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t[\"keyword\", \"dynamic\"],\n\t\t\t\t[\"punctuation\", \",\"],\n\t\t\t\t[\"keyword\", \"object\"],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]],\n\t\t\t\" petTemplate \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"html\", [\n\t\t\t\t[\"delegate-operator\", \"@\"],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"You have a pet named \",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"strong\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t\"item\",\n\t\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\t\"Name\"\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"strong\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\".\",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" pets \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"keyword\", \"new\"],\n\t\t\t[\"constructor-invocation\", [\n\t\t\t\t\"List\",\n\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\"Pet\",\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"keyword\", \"new\"],\n\t\t\t[\"constructor-invocation\", [\"Pet\"]],\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t\" Name \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"string\", \"\\\"Rin Tin Tin\\\"\"],\n\t\t\t[\"punctuation\", \"}\"],\n\t\t\t[\"punctuation\", \",\"],\n\n\t\t\t[\"keyword\", \"new\"],\n\t\t\t[\"constructor-invocation\", [\"Pet\"]],\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t\" Name \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"string\", \"\\\"Mr. Bigglesworth\\\"\"],\n\t\t\t[\"punctuation\", \"}\"],\n\t\t\t[\"punctuation\", \",\"],\n\n\t\t\t[\"keyword\", \"new\"],\n\t\t\t[\"constructor-invocation\", [\"Pet\"]],\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t\" Name \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"string\", \"\\\"K-9\\\"\"],\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"punctuation\", \"}\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/cshtml/comment_feature.test",
    "content": "@{\n    /* C# comment */\n    // Another C# comment\n}\n<!-- HTML comment -->\n\n@*\n    @{\n        /* C# comment */\n        // Another C# comment\n    }\n    <!-- HTML comment -->\n*@\n\n----------------------------------------------------\n\n[\n\t[\"block\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"comment\", \"/* C# comment */\"],\n\t\t\t[\"comment\", \"// Another C# comment\"],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\t[\"comment\", \"<!-- HTML comment -->\"],\n\n\t[\"razor-comment\", \"@*\\r\\n    @{\\r\\n        /* C# comment */\\r\\n        // Another C# comment\\r\\n    }\\r\\n    <!-- HTML comment -->\\r\\n*@\"]\n]\n"
  },
  {
    "path": "tests/languages/cshtml/issue3354.test",
    "content": "<input type=\"text\" placeholder=\"@Localize.GetLabelHtml(\"PLACEHOLDER\")\"/>\n\n<h1>\n    @Localize.GetLabelHtml(\"TITLE\")\n</h1>\n\n@{\n    var man = \"Federico\";\n    var text = string.Concat(\"Nice to meet you\", \" \", man);\n}\n\n@helper TrialHelper(string name) {\n    var text = string.Concat(\"Hello\", \" \", name);\n    <h1>\n        @(text + \", how's going?\")\n    </h1>\n    <p>\n        Hello World!\n    </p>\n}\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"input\"]],\n\t\t[\"attr-name\", [\"type\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\"text\",\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"attr-name\", [\"placeholder\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t[\"value\", [\n\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\"Localize\",\n\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t[\"function\", \"GetLabelHtml\"],\n\t\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t\t[\"string\", \"\\\"PLACEHOLDER\\\"\"],\n\t\t\t\t\t[\"punctuation\", \")\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"punctuation\", \"/>\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"h1\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t\"Localize\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"GetLabelHtml\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"TITLE\\\"\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"h1\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" man \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"string\", \"\\\"Federico\\\"\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" text \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"keyword\", \"string\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"Concat\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"Nice to meet you\\\"\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"string\", \"\\\" \\\"\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" man\",\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@helper\"],\n\t\t[\"csharp\", [\n\t\t\t[\"function\", \"TrialHelper\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"string\"]\n\t\t\t]],\n\t\t\t\" name\",\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" text \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"keyword\", \"string\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"Concat\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"Hello\\\"\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"string\", \"\\\" \\\"\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" name\",\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"h1\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"keyword\", \"@\"],\n\t\t\t\t\t[\"csharp\", [\n\t\t\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t\t\t\"text \",\n\t\t\t\t\t\t[\"operator\", \"+\"],\n\t\t\t\t\t\t[\"string\", \"\\\", how's going?\\\"\"],\n\t\t\t\t\t\t[\"punctuation\", \")\"]\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"h1\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"html\", [\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]],\n\t\t\t\t\"\\r\\n        Hello World!\\r\\n    \",\n\t\t\t\t[\"tag\", [\n\t\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t\t[\"tag\", [\"p\"]],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/cshtml/value_feature.test",
    "content": "<p>@@Username</p>\n<p>@Username</p>\n\n<p>@DateTime.Now</p>\n<p>@DateTime.IsLeapYear(2016)</p>\n\n<p>@await DoSomething(\"hello\", \"world\")</p>\n\n<p>@GenericMethod<int>()</p>\n\n<p>Last week this time: @(DateTime.Now - TimeSpan.FromDays(7))</p>\n<p>Last week: @DateTime.Now - TimeSpan.FromDays(7)</p>\n<p>Last week: 7/7/2016 4:39:52 PM - TimeSpan.FromDays(7)</p>\n\n@{\n    var joe = new Person(\"Joe\", 33);\n}\n\n<p>Age@(joe.Age)</p>\n\n<p>@(GenericMethod<int>())</p>\n\n@(\"<span>Hello World</span>\")\n\n@Html.Raw(\"<span>Hello World</span>\")\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\"@@Username\",\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\"Username\"]]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t\"DateTime\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"Now\"\n\t\t]]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t\"DateTime\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"IsLeapYear\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"number\", \"2016\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"keyword\", \"await\"],\n\t\t\t[\"function\", \"DoSomething\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"hello\\\"\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"string\", \"\\\"world\\\"\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"generic-method\", [\n\t\t\t\t[\"function\", \"GenericMethod\"],\n\t\t\t\t[\"generic\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"keyword\", \"int\"],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\"Last week this time: \",\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"DateTime\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"Now \",\n\t\t\t[\"operator\", \"-\"],\n\t\t\t\" TimeSpan\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"FromDays\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"number\", \"7\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\"Last week: \",\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t\"DateTime\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"Now\"\n\t\t]]\n\t]],\n\t\" - TimeSpan.FromDays(7)\",\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\"Last week: 7/7/2016 4:39:52 PM - TimeSpan.FromDays(7)\",\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"block\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"class-name\", [\n\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t]],\n\t\t\t\" joe \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"keyword\", \"new\"],\n\t\t\t[\"constructor-invocation\", [\"Person\"]],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"Joe\\\"\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"33\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\"Age\",\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"joe\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"Age\",\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"generic-method\", [\n\t\t\t\t[\"function\", \"GenericMethod\"],\n\t\t\t\t[\"generic\", [\n\t\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t\t[\"keyword\", \"int\"],\n\t\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"<span>Hello World</span>\\\"\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\n\t[\"value\", [\n\t\t[\"keyword\", \"@\"],\n\t\t[\"csharp\", [\n\t\t\t\"Html\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"Raw\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"<span>Hello World</span>\\\"\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/csp/directive_no_value_feature.test",
    "content": "upgrade-insecure-requests;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"upgrade-insecure-requests\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for a \"void\" CSP directive followed by semicolon.\r\n"
  },
  {
    "path": "tests/languages/csp/directive_with_source_expression_feature.test",
    "content": "input-protection tolerance=50; input-protection-clip before=60; input-protection-selectors div; policy-uri https://example.com; script-src example.com; script-src-attr 'none'; style-src-elem 'none';\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"input-protection\"],\r\n\t\" tolerance=50\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"directive\", \"input-protection-clip\"],\r\n\t\" before=60\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"directive\", \"input-protection-selectors\"],\r\n\t\" div\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"directive\", \"policy-uri\"],\r\n\t[\"host\", [\"https://example.com\"]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"directive\", \"script-src\"],\r\n\t[\"host\", [\"example.com\"]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"directive\", \"script-src-attr\"],\r\n\t[\"none\", \"'none'\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"directive\", \"style-src-elem\"],\r\n\t[\"none\", \"'none'\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for CSP directive followed by a source expression.\r\n"
  },
  {
    "path": "tests/languages/csp/hash_feature.test",
    "content": "style-src 'sha256-EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4='\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"style-src\"],\n\t[\"hash\", \"'sha256-EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4='\"]\n]\n"
  },
  {
    "path": "tests/languages/csp/host_feature.test",
    "content": "default-src trusted.com *.trusted.com;\nimg-src *;\nmedia-src media1.com media2.com;\nscript-src userscripts.example.com;\nframe-ancestors https://alice https://bob;\nframe-ancestors https://example.com/;\n\nsandbox allow-scripts;\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"default-src\"],\n\t[\"host\", [\"trusted.com\"]],\n\t[\"host\", [\n\t\t[\"important\", \"*\"],\n\t\t\".trusted.com\"\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"img-src\"],\n\t[\"host\", [\n\t\t[\"important\", \"*\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"media-src\"],\n\t[\"host\", [\"media1.com\"]],\n\t[\"host\", [\"media2.com\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"script-src\"],\n\t[\"host\", [\"userscripts.example.com\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"frame-ancestors\"],\n\t[\"host\", [\"https://alice\"]],\n\t[\"host\", [\"https://bob\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"frame-ancestors\"],\n\t[\"host\", [\"https://example.com/\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"sandbox\"], \" allow-scripts\", [\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/csp/issue2661.test",
    "content": "default-src-is-a-fake; fake-default-src;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"default-src-is-a-fake\",\r\n\t[\"punctuation\", \";\"],\r\n\t\" fake-default-src\",\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directive names with adjacent hyphens.\r\n"
  },
  {
    "path": "tests/languages/csp/keyword_safe_feature.html.test",
    "content": "default-src 'report-sample';\nstyle-src 'self' 'strict-dynamic';\n\n----------------------------------------------------\n\n<span class=\"token directive property\">default-src</span>\n<span class=\"token keyword safe\">'report-sample'</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token directive property\">style-src</span>\n<span class=\"token keyword safe\">'self'</span>\n<span class=\"token keyword safe\">'strict-dynamic'</span>\n<span class=\"token punctuation\">;</span>\n\n----------------------------------------------------\n\nChecks for source expressions classified as safe.\n"
  },
  {
    "path": "tests/languages/csp/keyword_unsafe_feature.html.test",
    "content": "navigate-to 'unsafe-allow-redirects';\nscript-src 'unsafe-dynamic' 'unsafe-eval' 'unsafe-hash-attributes' 'unsafe-hashed-attributes' 'unsafe-hashes' 'unsafe-inline';\n\n----------------------------------------------------\n\n<span class=\"token directive property\">navigate-to</span>\n<span class=\"token keyword unsafe\">'unsafe-allow-redirects'</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token directive property\">script-src</span>\n<span class=\"token keyword unsafe\">'unsafe-dynamic'</span>\n<span class=\"token keyword unsafe\">'unsafe-eval'</span>\n<span class=\"token keyword unsafe\">'unsafe-hash-attributes'</span>\n<span class=\"token keyword unsafe\">'unsafe-hashed-attributes'</span>\n<span class=\"token keyword unsafe\">'unsafe-hashes'</span>\n<span class=\"token keyword unsafe\">'unsafe-inline'</span>\n<span class=\"token punctuation\">;</span>\n\n----------------------------------------------------\n\nChecks for source expressions classified as unsafe.\n"
  },
  {
    "path": "tests/languages/csp/nonce_feature.test",
    "content": "style-src 'nonce-yeah';\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"style-src\"],\n\t[\"nonce\", \"'nonce-yeah'\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/csp/none_feature.test",
    "content": "sandbox 'none'\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"sandbox\"],\n\t[\"none\", \"'none'\"]\n]\n"
  },
  {
    "path": "tests/languages/csp/scheme_feature.test",
    "content": "default-src https: 'unsafe-inline' 'unsafe-eval'\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"default-src\"],\n\t[\"scheme\", \"https:\"],\n\t[\"keyword\", \"'unsafe-inline'\"],\n\t[\"keyword\", \"'unsafe-eval'\"]\n]\n"
  },
  {
    "path": "tests/languages/css/atrule_feature.test",
    "content": "@import url(foo.css);\r\n@media print {}\r\n@media (min-width: 640px) and (min-height: 1000px) {}\r\n@supports (top: 50vmax)\r\n\tor (top: 50vw) {}\r\n@main-color: red;\r\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"atrule\", [\r\n\t\t[\"rule\", \"@import\"],\r\n\t\t[\"url\", [\r\n\t\t\t[\"function\", \"url\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"foo.css\",\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\r\n\t[\"atrule\", [\r\n\t\t[\"rule\", \"@media\"],\r\n\t\t\" print\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"atrule\", [\r\n\t\t[\"rule\", \"@media\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"property\", \"min-width\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 640px\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"keyword\", \"and\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"property\", \"min-height\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 1000px\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"atrule\", [\r\n\t\t[\"rule\", \"@supports\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"property\", \"top\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 50vmax\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"or\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"property\", \"top\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 50vw\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"atrule\", [\r\n\t\t[\"rule\", \"@main-color\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" red\",\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\r\n\t[\"atrule\", [\r\n\t\t[\"rule\", \"@import\"],\r\n\t\t[\"url\", [\r\n\t\t\t[\"function\", \"url\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for at-rules.\r\nAlso checks for LESS variables.\r\n"
  },
  {
    "path": "tests/languages/css/atrule_selector-function-argument_feature.test",
    "content": "@supports selector(::-webkit-foo) {\r\n\t/* style to apply when the `::-webkit-foo` selector is actually supported,\r\n\t * instead of just being parsed as matching nothing because of Selectors 4\r\n\t * § Appendix B: https://drafts.csswg.org/selectors-4/#compat */\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"atrule\", [\r\n\t\t[\"rule\", \"@supports\"],\r\n\t\t[\"function\", \"selector\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"selector-function-argument\", \"::-webkit-foo\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"comment\", \"/* style to apply when the `::-webkit-foo` selector is actually supported,\\r\\n\\t * instead of just being parsed as matching nothing because of Selectors 4\\r\\n\\t * § Appendix B: https://drafts.csswg.org/selectors-4/#compat */\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for the selector function in @supports rules.\r\n"
  },
  {
    "path": "tests/languages/css/comment_feature.test",
    "content": "/**/\r\n/* foo */\r\n/* foo\r\nbar */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo */\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for empty comment, single-line comment and multi-line comment."
  },
  {
    "path": "tests/languages/css/function_feature.test",
    "content": "transform: translate(-50%);\r\nbackground: rgba(0, 0, 0, 0.2);\r\nfilter: opacity(alpha=0);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"transform\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"function\", \"translate\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"-50%\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"property\", \"background\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"function\", \"rgba\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"0\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" 0\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" 0\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" 0.2\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"property\", \"filter\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"function\", \"opacity\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"alpha=0\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/css/important_feature.test",
    "content": "color: red !important;\r\npadding: 10px 20px 30px !important;\r\nposition:absolute!important;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"color\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" red \",\r\n\t[\"important\", \"!important\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"property\", \"padding\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" 10px 20px 30px \",\r\n\t[\"important\", \"!important\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"property\", \"position\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\"absolute\",\r\n\t[\"important\", \"!important\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for !important rule.\r\n"
  },
  {
    "path": "tests/languages/css/property_feature.test",
    "content": "color: red;\r\nbackground-color: blue;\r\n-webkit-transform: none;\r\n--ötökkä: 2;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"color\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" red\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"property\", \"background-color\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" blue\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"property\", \"-webkit-transform\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" none\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"variable\", \"--ötökkä\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" 2\",\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties.\r\n"
  },
  {
    "path": "tests/languages/css/selector_feature.test",
    "content": "foo{\r\n\r\nfoo + bar {\r\n\r\nfoo:first-child:hover {\r\n\r\n* {\r\n\r\nfoo,\r\nbar{\r\n\r\n[foo=\"{\\\"}\"] {\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"selector\", \"foo\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"selector\", \"foo + bar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"selector\", \"foo:first-child:hover\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"selector\", \"*\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"selector\", \"foo,\\r\\nbar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"selector\", \"[foo=\\\"{\\\\\\\"}\\\"]\"],\r\n\t[\"punctuation\", \"{\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line selectors.\r\n"
  },
  {
    "path": "tests/languages/css/string_feature.test",
    "content": "\"f\\\"oo\"\r\n'f\\'oo'\r\n\"foo\\\r\nbar\"\r\n'foo\\\r\nbar'\r\n\"foo /* bar\" /* and out */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"f\\\\\\\"oo\\\"\"],\r\n\t[\"string\", \"'f\\\\'oo'\"],\r\n\t[\"string\", \"\\\"foo\\\\\\r\\nbar\\\"\"],\r\n    [\"string\", \"'foo\\\\\\r\\nbar'\"],\r\n    [\"string\", \"\\\"foo /* bar\\\"\"],\r\n    [\"comment\", \"/* and out */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-quoted and double-quoted strings."
  },
  {
    "path": "tests/languages/css/url_feature.test",
    "content": "url(foo.png)\r\nurl(close\\)parens)\r\nurl('foo.png')\r\nurl(\"foo.png\")\r\nurl('foo\\\r\nbar.png')\r\nurl(\"foo\\\r\nbar.png\")\r\n\r\n@import url(\"https://cdn.jsdelivr.net/npm/prismj1.19.0/themes/prism-dark.css\");\r\n@import url(\"https://cdn.jsdelivr.net/npm/prismjs/themes/prism-dark.css\");\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"url\", [\r\n\t\t[\"function\", \"url\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"foo.png\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"function\", \"url\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"close\\\\)parens\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"function\", \"url\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"'foo.png'\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"function\", \"url\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"\\\"foo.png\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"function\", \"url\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"'foo\\\\\\r\\nbar.png'\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"function\", \"url\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"\\\"foo\\\\\\r\\nbar.png\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"atrule\", [\r\n\t\t[\"rule\", \"@import\"],\r\n\t\t[\"url\", [\r\n\t\t\t[\"function\", \"url\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"\\\"https://cdn.jsdelivr.net/npm/prismj1.19.0/themes/prism-dark.css\\\"\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"atrule\", [\r\n\t\t[\"rule\", \"@import\"],\r\n\t\t[\"url\", [\r\n\t\t\t[\"function\", \"url\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"\\\"https://cdn.jsdelivr.net/npm/prismjs/themes/prism-dark.css\\\"\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for url(), unquoted, single-quoted and double-quoted.\r\n"
  },
  {
    "path": "tests/languages/css!+css-extras/atrule_selector-function-argument_feature.test",
    "content": "@supports selector(::-webkit-foo) {\r\n\t/* style to apply when the `::-webkit-foo` selector is actually supported,\r\n\t * instead of just being parsed as matching nothing because of Selectors 4\r\n\t * § Appendix B: https://drafts.csswg.org/selectors-4/#compat */\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"atrule\", [\r\n\t\t[\"rule\", \"@supports\"],\r\n\t\t[\"function\", \"selector\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"selector-function-argument\", [\r\n\t\t\t[\"pseudo-element\", \"::-webkit-foo\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"comment\", \"/* style to apply when the `::-webkit-foo` selector is actually supported,\\r\\n\\t * instead of just being parsed as matching nothing because of Selectors 4\\r\\n\\t * § Appendix B: https://drafts.csswg.org/selectors-4/#compat */\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for the selector function in @supports rules.\r\n"
  },
  {
    "path": "tests/languages/css!+css-extras/color_feature.test",
    "content": "AliceBlue\nAntiqueWhite\nAqua\nAquamarine\nAzure\nBeige\nBisque\nBlack\nBlanchedAlmond\nBlue\nBlueViolet\nBrown\nBurlyWood\nCadetBlue\nChartreuse\nChocolate\nCoral\nCornflowerBlue\nCornsilk\nCrimson\nCyan\nDarkBlue\nDarkCyan\nDarkGoldenRod\nDarkGrey\nDarkGreen\nDarkKhaki\nDarkMagenta\nDarkOliveGreen\nDarkOrange\nDarkOrchid\nDarkRed\nDarkSalmon\nDarkSeaGreen\nDarkSlateBlue\nDarkSlateGrey\nDarkTurquoise\nDarkViolet\nDeepPink\nDeepSkyBlue\nDimGrey\nDodgerBlue\nFireBrick\nFloralWhite\nForestGreen\nFuchsia\nGainsboro\nGhostWhite\nGold\nGoldenRod\nGrey\nGreen\nGreenYellow\nHoneyDew\nHotPink\nIndianRed\nIndigo\nIvory\nKhaki\nLavender\nLavenderBlush\nLawnGreen\nLemonChiffon\nLightBlue\nLightCoral\nLightCyan\nLightGoldenRodYellow\nLightGrey\nLightGreen\nLightPink\nLightSalmon\nLightSeaGreen\nLightSkyBlue\nLightSlateGrey\nLightSteelBlue\nLightYellow\nLime\nLimeGreen\nLinen\nMagenta\nMaroon\nMediumAquaMarine\nMediumBlue\nMediumOrchid\nMediumPurple\nMediumSeaGreen\nMediumSlateBlue\nMediumSpringGreen\nMediumTurquoise\nMediumVioletRed\nMidnightBlue\nMintCream\nMistyRose\nMoccasin\nNavajoWhite\nNavy\nOldLace\nOlive\nOliveDrab\nOrange\nOrangeRed\nOrchid\nPaleGoldenRod\nPaleGreen\nPaleTurquoise\nPaleVioletRed\nPapayaWhip\nPeachPuff\nPeru\nPink\nPlum\nPowderBlue\nPurple\nRebeccaPurple\nRed\nRosyBrown\nRoyalBlue\nSaddleBrown\nSalmon\nSandyBrown\nSeaGreen\nSeaShell\nSienna\nSilver\nSkyBlue\nSlateBlue\nSlateGrey\nSnow\nSpringGreen\nSteelBlue\nTan\nTeal\nThistle\nTomato\nTransparent\nTurquoise\nViolet\nWheat\nWhite\nWhiteSmoke\nYellow\nYellowGreen\n\nrgb(0,0,0)\nrgba(0  ,  255  ,  0,  0.123)\nhsl(170, 50%, 45%)\nhsla(120,100%,50%,0.3)\n\n----------------------------------------------------\n\n[\n\t[\"color\", \"AliceBlue\"],\n\t[\"color\", \"AntiqueWhite\"],\n\t[\"color\", \"Aqua\"],\n\t[\"color\", \"Aquamarine\"],\n\t[\"color\", \"Azure\"],\n\t[\"color\", \"Beige\"],\n\t[\"color\", \"Bisque\"],\n\t[\"color\", \"Black\"],\n\t[\"color\", \"BlanchedAlmond\"],\n\t[\"color\", \"Blue\"],\n\t[\"color\", \"BlueViolet\"],\n\t[\"color\", \"Brown\"],\n\t[\"color\", \"BurlyWood\"],\n\t[\"color\", \"CadetBlue\"],\n\t[\"color\", \"Chartreuse\"],\n\t[\"color\", \"Chocolate\"],\n\t[\"color\", \"Coral\"],\n\t[\"color\", \"CornflowerBlue\"],\n\t[\"color\", \"Cornsilk\"],\n\t[\"color\", \"Crimson\"],\n\t[\"color\", \"Cyan\"],\n\t[\"color\", \"DarkBlue\"],\n\t[\"color\", \"DarkCyan\"],\n\t[\"color\", \"DarkGoldenRod\"],\n\t[\"color\", \"DarkGrey\"],\n\t[\"color\", \"DarkGreen\"],\n\t[\"color\", \"DarkKhaki\"],\n\t[\"color\", \"DarkMagenta\"],\n\t[\"color\", \"DarkOliveGreen\"],\n\t[\"color\", \"DarkOrange\"],\n\t[\"color\", \"DarkOrchid\"],\n\t[\"color\", \"DarkRed\"],\n\t[\"color\", \"DarkSalmon\"],\n\t[\"color\", \"DarkSeaGreen\"],\n\t[\"color\", \"DarkSlateBlue\"],\n\t[\"color\", \"DarkSlateGrey\"],\n\t[\"color\", \"DarkTurquoise\"],\n\t[\"color\", \"DarkViolet\"],\n\t[\"color\", \"DeepPink\"],\n\t[\"color\", \"DeepSkyBlue\"],\n\t[\"color\", \"DimGrey\"],\n\t[\"color\", \"DodgerBlue\"],\n\t[\"color\", \"FireBrick\"],\n\t[\"color\", \"FloralWhite\"],\n\t[\"color\", \"ForestGreen\"],\n\t[\"color\", \"Fuchsia\"],\n\t[\"color\", \"Gainsboro\"],\n\t[\"color\", \"GhostWhite\"],\n\t[\"color\", \"Gold\"],\n\t[\"color\", \"GoldenRod\"],\n\t[\"color\", \"Grey\"],\n\t[\"color\", \"Green\"],\n\t[\"color\", \"GreenYellow\"],\n\t[\"color\", \"HoneyDew\"],\n\t[\"color\", \"HotPink\"],\n\t[\"color\", \"IndianRed\"],\n\t[\"color\", \"Indigo\"],\n\t[\"color\", \"Ivory\"],\n\t[\"color\", \"Khaki\"],\n\t[\"color\", \"Lavender\"],\n\t[\"color\", \"LavenderBlush\"],\n\t[\"color\", \"LawnGreen\"],\n\t[\"color\", \"LemonChiffon\"],\n\t[\"color\", \"LightBlue\"],\n\t[\"color\", \"LightCoral\"],\n\t[\"color\", \"LightCyan\"],\n\t[\"color\", \"LightGoldenRodYellow\"],\n\t[\"color\", \"LightGrey\"],\n\t[\"color\", \"LightGreen\"],\n\t[\"color\", \"LightPink\"],\n\t[\"color\", \"LightSalmon\"],\n\t[\"color\", \"LightSeaGreen\"],\n\t[\"color\", \"LightSkyBlue\"],\n\t[\"color\", \"LightSlateGrey\"],\n\t[\"color\", \"LightSteelBlue\"],\n\t[\"color\", \"LightYellow\"],\n\t[\"color\", \"Lime\"],\n\t[\"color\", \"LimeGreen\"],\n\t[\"color\", \"Linen\"],\n\t[\"color\", \"Magenta\"],\n\t[\"color\", \"Maroon\"],\n\t[\"color\", \"MediumAquaMarine\"],\n\t[\"color\", \"MediumBlue\"],\n\t[\"color\", \"MediumOrchid\"],\n\t[\"color\", \"MediumPurple\"],\n\t[\"color\", \"MediumSeaGreen\"],\n\t[\"color\", \"MediumSlateBlue\"],\n\t[\"color\", \"MediumSpringGreen\"],\n\t[\"color\", \"MediumTurquoise\"],\n\t[\"color\", \"MediumVioletRed\"],\n\t[\"color\", \"MidnightBlue\"],\n\t[\"color\", \"MintCream\"],\n\t[\"color\", \"MistyRose\"],\n\t[\"color\", \"Moccasin\"],\n\t[\"color\", \"NavajoWhite\"],\n\t[\"color\", \"Navy\"],\n\t[\"color\", \"OldLace\"],\n\t[\"color\", \"Olive\"],\n\t[\"color\", \"OliveDrab\"],\n\t[\"color\", \"Orange\"],\n\t[\"color\", \"OrangeRed\"],\n\t[\"color\", \"Orchid\"],\n\t[\"color\", \"PaleGoldenRod\"],\n\t[\"color\", \"PaleGreen\"],\n\t[\"color\", \"PaleTurquoise\"],\n\t[\"color\", \"PaleVioletRed\"],\n\t[\"color\", \"PapayaWhip\"],\n\t[\"color\", \"PeachPuff\"],\n\t[\"color\", \"Peru\"],\n\t[\"color\", \"Pink\"],\n\t[\"color\", \"Plum\"],\n\t[\"color\", \"PowderBlue\"],\n\t[\"color\", \"Purple\"],\n\t[\"color\", \"RebeccaPurple\"],\n\t[\"color\", \"Red\"],\n\t[\"color\", \"RosyBrown\"],\n\t[\"color\", \"RoyalBlue\"],\n\t[\"color\", \"SaddleBrown\"],\n\t[\"color\", \"Salmon\"],\n\t[\"color\", \"SandyBrown\"],\n\t[\"color\", \"SeaGreen\"],\n\t[\"color\", \"SeaShell\"],\n\t[\"color\", \"Sienna\"],\n\t[\"color\", \"Silver\"],\n\t[\"color\", \"SkyBlue\"],\n\t[\"color\", \"SlateBlue\"],\n\t[\"color\", \"SlateGrey\"],\n\t[\"color\", \"Snow\"],\n\t[\"color\", \"SpringGreen\"],\n\t[\"color\", \"SteelBlue\"],\n\t[\"color\", \"Tan\"],\n\t[\"color\", \"Teal\"],\n\t[\"color\", \"Thistle\"],\n\t[\"color\", \"Tomato\"],\n\t[\"color\", \"Transparent\"],\n\t[\"color\", \"Turquoise\"],\n\t[\"color\", \"Violet\"],\n\t[\"color\", \"Wheat\"],\n\t[\"color\", \"White\"],\n\t[\"color\", \"WhiteSmoke\"],\n\t[\"color\", \"Yellow\"],\n\t[\"color\", \"YellowGreen\"],\n\n\t[\"color\", [\n\t\t[\"function\", \"rgb\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"number\", \"0\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"number\", \"0\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"number\", \"0\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"color\", [\n\t\t[\"function\", \"rgba\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"number\", \"0\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"number\", \"255\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"number\", \"0\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"number\", \"0.123\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"color\", [\n\t\t[\"function\", \"hsl\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"number\", \"170\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"number\", \"50\"],\n\t\t[\"unit\", \"%\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"number\", \"45\"],\n\t\t[\"unit\", \"%\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"color\", [\n\t\t[\"function\", \"hsla\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"number\", \"120\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"number\", \"100\"],\n\t\t[\"unit\", \"%\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"number\", \"50\"],\n\t\t[\"unit\", \"%\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"number\", \"0.3\"],\n\t\t[\"punctuation\", \")\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/css!+css-extras/entity_feature.test",
    "content": "\\0022\r\n\\20B9\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"entity\", \"\\\\0022\"],\r\n\t[\"entity\", \"\\\\20B9\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for entities."
  },
  {
    "path": "tests/languages/css!+css-extras/hexcode_feature.test",
    "content": "#ff0000\r\n#BADA55\r\n#4dd\r\n#D0C\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"hexcode\", \"#ff0000\"],\r\n\t[\"hexcode\", \"#BADA55\"],\r\n\t[\"hexcode\", \"#4dd\"],\r\n\t[\"hexcode\", \"#D0C\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hexadecimal colors."
  },
  {
    "path": "tests/languages/css!+css-extras/number_feature.test",
    "content": "42\r\n3.14159\r\n-42\r\n-3.14159\r\n.5\r\n-.5\r\n\r\n/* complex example */\r\nfoo {\r\n\tfoo: 0 1em 2ch;\r\n\tbar:-0px 3px;\r\n\tbaz:calc(100% - 5px - -4em);\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"-42\"],\r\n\t[\"number\", \"-3.14159\"],\r\n\t[\"number\", \".5\"],\r\n\t[\"number\", \"-.5\"],\r\n\r\n\t[\"comment\", \"/* complex example */\"],\r\n\t[\"selector\", [\r\n\t\t\"foo\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"foo\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"unit\", \"em\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"unit\", \"ch\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"property\", \"bar\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"-0\"],\r\n\t[\"unit\", \"px\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"unit\", \"px\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"property\", \"baz\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"function\", \"calc\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"100\"],\r\n\t[\"unit\", \"%\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"5\"],\r\n\t[\"unit\", \"px\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"-4\"],\r\n\t[\"unit\", \"em\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/css!+css-extras/operator_feature.test",
    "content": "width: calc(100% + 20px);\r\nwidth: calc(100% - 20px);\r\nwidth: calc(5px * 2);\r\nwidth: calc(10px / 2);\r\nheight: -20px;\r\ncontent: 'this - is not an operator';\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"width\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"function\", \"calc\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"100\"],\r\n\t[\"unit\", \"%\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"number\", \"20\"],\r\n\t[\"unit\", \"px\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"property\", \"width\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"function\", \"calc\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"100\"],\r\n\t[\"unit\", \"%\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"20\"],\r\n\t[\"unit\", \"px\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"property\", \"width\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"function\", \"calc\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"5\"],\r\n\t[\"unit\", \"px\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"property\", \"width\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"function\", \"calc\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"10\"],\r\n\t[\"unit\", \"px\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"property\", \"height\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"-20\"],\r\n\t[\"unit\", \"px\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"property\", \"content\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"string\", \"'this - is not an operator'\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/css!+css-extras/selector_attribute_feature.test",
    "content": "[attr] {}\r\n\r\n[attr=val] {}\r\n[attr=\"val\"] {}\r\n[attr='val'] {}\r\n[attr|=val] {}\r\n[attr~=val] {}\r\n[attr|=val] {}\r\n[attr^=val] {}\r\n[attr$=val] {}\r\n[attr*=val] {}\r\n\r\n[foo|attr][*|attr][|attr] {}\r\n[foo|attr|=val] {}\r\n\r\n[attr=val i] {}\r\n[attr=\"val\" S] {}\r\n\r\n[ attr ] {}\r\n[ attr = val ] {}\r\n[ attr = val   i] {}\r\n\r\n[attr=\"i#m :not(a.class)\"] {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"val\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"\\\"val\\\"\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"'val'\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"|=\"],\r\n\t\t\t[\"attr-value\", \"val\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"~=\"],\r\n\t\t\t[\"attr-value\", \"val\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"|=\"],\r\n\t\t\t[\"attr-value\", \"val\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"^=\"],\r\n\t\t\t[\"attr-value\", \"val\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"$=\"],\r\n\t\t\t[\"attr-value\", \"val\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"*=\"],\r\n\t\t\t[\"attr-value\", \"val\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"namespace\", [\r\n\t\t\t\t\"foo\",\r\n\t\t\t\t[\"punctuation\", \"|\"]\r\n\t\t\t]],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"namespace\", [\r\n\t\t\t\t\"*\",\r\n\t\t\t\t[\"punctuation\", \"|\"]\r\n\t\t\t]],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"namespace\", [\r\n\t\t\t\t[\"punctuation\", \"|\"]\r\n\t\t\t]],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"namespace\", [\r\n\t\t\t\t\"foo\",\r\n\t\t\t\t[\"punctuation\", \"|\"]\r\n\t\t\t]],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"|=\"],\r\n\t\t\t[\"attr-value\", \"val\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"val\"],\r\n\t\t\t[\"case-sensitivity\", \"i\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"\\\"val\\\"\"],\r\n\t\t\t[\"case-sensitivity\", \"S\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"val\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"val\"],\r\n\t\t\t[\"case-sensitivity\", \"i\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"attr-name\", \"attr\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"attr-value\", \"\\\"i#m :not(a.class)\\\"\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for attributes inside selectors."
  },
  {
    "path": "tests/languages/css!+css-extras/selector_feature.test",
    "content": "foo:after {\r\nfoo::first-letter {\r\n\r\nfoo.bar.baz {\r\n\r\nfoo#bar.baz {\r\n\r\n#foo > .bar:hover:after {\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"selector\", [\r\n\t\t\"foo\",\r\n\t\t[\"pseudo-element\", \":after\"]\r\n\t]], [\"punctuation\", \"{\"],\r\n\r\n\t[\"selector\", [\r\n\t\t\"foo\",\r\n\t\t[\"pseudo-element\", \"::first-letter\"]\r\n\t]], [\"punctuation\", \"{\"],\r\n\r\n\t[\"selector\", [\r\n\t\t\"foo\",\r\n\t\t[\"class\", \".bar\"],\r\n\t\t[\"class\", \".baz\"]\r\n\t]], [\"punctuation\", \"{\"],\r\n\r\n\t[\"selector\", [\r\n\t\t\"foo\",\r\n\t\t[\"id\", \"#bar\"],\r\n\t\t[\"class\", \".baz\"]\r\n\t]], [\"punctuation\", \"{\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"id\", \"#foo\"],\r\n\t\t[\"combinator\", \">\"],\r\n\t\t[\"class\", \".bar\"],\r\n\t\t[\"pseudo-class\", \":hover\"],\r\n\t\t[\"pseudo-element\", \":after\"]\r\n\t]], [\"punctuation\", \"{\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for pseudo-elements, pseudo-classes, classes and ids inside selectors.\r\n"
  },
  {
    "path": "tests/languages/css!+css-extras/selector_n-th_feature.test",
    "content": ":nth-child(2n+1) {}\r\n:nth-child(+2n - 1) {}\r\n:nth-child(2n) {}\r\n:nth-child(+5) {}\r\n:nth-child(even) {}\r\n:nth-child(odd) {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"selector\", [\r\n\t\t[\"pseudo-class\", \":nth-child\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"n-th\", [\r\n\t\t\t\t[\"number\", \"2n\"],\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"number\", \"1\"]\r\n\t\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"pseudo-class\", \":nth-child\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"n-th\", [\r\n\t\t\t[\"operator\", \"+\"],\r\n\t\t\t[\"number\", \"2n\"],\r\n\t\t\t[\"operator\", \"-\"],\r\n\t\t\t[\"number\", \"1\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"pseudo-class\", \":nth-child\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"n-th\", [\r\n\t\t\t[\"number\", \"2n\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"pseudo-class\", \":nth-child\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"n-th\", [\r\n\t\t\t[\"operator\", \"+\"],\r\n\t\t\t[\"number\", \"5\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"pseudo-class\", \":nth-child\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"n-th\", \"even\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"pseudo-class\", \":nth-child\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"n-th\", \"odd\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for n-th expressions.\r\n"
  },
  {
    "path": "tests/languages/css!+css-extras/selector_pseudo-class_feature.test",
    "content": "foo:hover {}\r\n\r\n:lang(en) {}\r\n\r\n.bar:not(baz:hover):not(.foo) {}\r\n\r\n:where(p:not(.class)) {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"selector\", [\r\n\t\t\"foo\",\r\n\t\t[\"pseudo-class\", \":hover\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"pseudo-class\", \":lang\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"en\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"class\", \".bar\"],\r\n\t\t[\"pseudo-class\", \":not\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"baz\",\r\n\t\t[\"pseudo-class\", \":hover\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"pseudo-class\", \":not\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class\", \".foo\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"selector\", [\r\n\t\t[\"pseudo-class\", \":where\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"p\",\r\n\t\t[\"pseudo-class\", \":not\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class\", \".class\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for pseudo-classes inside selectors.\r\n"
  },
  {
    "path": "tests/languages/css!+css-extras/unit_feature.test",
    "content": "100%\r\n1rem\r\n500ms\r\n.5s\r\n-3px\r\n-0.618vw\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"100\"], [\"unit\", \"%\"],\r\n\t[\"number\", \"1\"], [\"unit\", \"rem\"],\r\n\t[\"number\", \"500\"], [\"unit\", \"ms\"],\r\n\t[\"number\", \".5\"], [\"unit\", \"s\"],\r\n\t[\"number\", \"-3\"], [\"unit\", \"px\"],\r\n\t[\"number\", \"-0.618\"], [\"unit\", \"vw\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for units.\r\n"
  },
  {
    "path": "tests/languages/css!+css-extras/variable_feature.test",
    "content": "element {\r\n\t--foo: green;\r\n}\r\n\r\nvar(--color-primary)\r\nvar(--level-3)\r\nvar(--foo, red)\r\ncalc(100% - var(--margin-size) * 2)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"selector\", [\"element\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"variable\", \"--foo\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"color\", \"green\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"var\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"--color-primary\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"var\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"--level-3\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"var\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"--foo\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"color\", \"red\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"calc\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"100\"],\r\n\t[\"unit\", \"%\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"function\", \"var\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"--margin-size\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables.\r\n"
  },
  {
    "path": "tests/languages/css+css-extras+sass/issue2992.test",
    "content": ".lucidagrande-normal-black-14px\n  color: var(--black)\n  font-family: var(--font-family-lucidagrande)\n  font-size: var(--font-size-m)\n  --foo: black\n\n----------------------------------------------------\n\n[\n\t[\"selector\", \".lucidagrande-normal-black-14px\"],\n\t[\"property-line\", [\n\t\t[\"property\", \"color\"],\n\t\t[\"punctuation\", \":\"],\n\t\t\" var(--black)\"\n\t]],\n\t[\"property-line\", [\n\t\t[\"property\", \"font-family\"],\n\t\t[\"punctuation\", \":\"],\n\t\t\" var(--font-family-lucidagrande)\"\n\t]],\n\t[\"property-line\", [\n\t\t[\"property\", \"font-size\"],\n\t\t[\"punctuation\", \":\"],\n\t\t\" var(--font-size-m)\"\n\t]],\n\t[\"property-line\", [\n\t\t[\"property\", \"--foo\"],\n\t\t[\"punctuation\", \":\"],\n\t\t\" black\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/css+haml/css+haml_usage.test",
    "content": ":css\r\n\t.test {}\r\n\r\n~\r\n\t:css\r\n\t  .test {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-css\", [\r\n\t\t[\"filter-name\", \":css\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"selector\", \".test\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"~\"],\r\n\t[\"filter-css\", [\r\n\t\t[\"filter-name\", \":css\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"selector\", \".test\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for CSS filter in Haml. The tilde serves only as a separator.\r\n"
  },
  {
    "path": "tests/languages/css+http/css_inclusion.test",
    "content": "Content-type: text/css\r\n\r\na.link:hover {\r\n\tcolor: red;\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"Content-type\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"text/css\"]\r\n\t]],\r\n\r\n\t[\"text-css\", [\r\n\t\t[\"selector\", \"a.link:hover\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t[\"property\", \"color\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" red\",\r\n\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for JavaScript content in HTTP.\r\n"
  },
  {
    "path": "tests/languages/css+textile/css_inclusion.test",
    "content": "h3{color: red}. Baz\r\n\r\nh4[fr]{text-decoration:underline;}(#bar). Foobar\r\n\r\n*{color:red}bold*\r\n\"(foo)[en]{color:blue;}Foo\":bar\r\n\r\n#[fr](#foo){background:pink} Foobar\r\n\r\n!(foo)[en]{border:1px solid #ccc}foo.png!\r\n\r\n{color: blue}.|{font-weight:bold}.Baz|\r\n(foo#bar){font-style:italic}[fr].|{background:red;}(bar#baz)[en].Baz|\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"h3\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"css\", [[\"punctuation\", \"{\"], [\"property\", \"color\"], [\"punctuation\", \":\"], \" red\", [\"punctuation\", \"}\"]]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Baz\"\r\n\t]],\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"h4\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"[\"], [\"lang\", \"fr\"], [\"punctuation\", \"]\"],\r\n\t\t\t\t[\"css\", [[\"punctuation\", \"{\"], [\"property\", \"text-decoration\"], [\"punctuation\", \":\"], \"underline\", [\"punctuation\", \";\"], [\"punctuation\", \"}\"]]],\r\n\t\t\t\t[\"punctuation\", \"(\"], [\"class-id\", \"#bar\"], [\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Foobar\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"css\", [[\"punctuation\", \"{\"], [\"property\", \"color\"], [\"punctuation\", \":\"], \"red\", [\"punctuation\", \"}\"]]]\r\n\t\t\t]],\r\n\t\t\t[\"bold\", [\"bold\"]],\r\n\t\t\t[\"punctuation\", \"*\"]\r\n\t\t]],\r\n\t\t[\"link\", [\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"], [\"class-id\", \"foo\"], [\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"[\"], [\"lang\", \"en\"], [\"punctuation\", \"]\"],\r\n\t\t\t\t[\"css\", [[\"punctuation\", \"{\"], [\"property\", \"color\"], [\"punctuation\", \":\"], \"blue\", [\"punctuation\", \";\"], [\"punctuation\", \"}\"]]]\r\n\t\t\t]],\r\n\t\t\t[\"text\", \"Foo\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"], [\"punctuation\", \":\"],\r\n\t\t\t[\"url\", \"bar\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"list\", [\r\n\t\t\t[\"punctuation\", \"#\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"[\"], [\"lang\", \"fr\"], [\"punctuation\", \"]\"],\r\n\t\t\t\t[\"punctuation\", \"(\"], [\"class-id\", \"#foo\"], [\"punctuation\", \")\"],\r\n\t\t\t\t[\"css\", [[\"punctuation\", \"{\"], [\"property\", \"background\"], [\"punctuation\", \":\"], \"pink\", [\"punctuation\", \"}\"]]]\r\n\t\t\t]],\r\n\t\t\t\" Foobar\"\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"image\", [\r\n\t\t\t[\"punctuation\", \"!\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"], [\"class-id\", \"foo\"], [\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"[\"], [\"lang\", \"en\"], [\"punctuation\", \"]\"],\r\n\t\t\t\t[\"css\", [[\"punctuation\", \"{\"], [\"property\", \"border\"], [\"punctuation\", \":\"], \"1px solid #ccc\", [\"punctuation\", \"}\"]]]\r\n\t\t\t]],\r\n\t\t\t[\"source\", \"foo.png\"],\r\n\t\t\t[\"punctuation\", \"!\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"table\", [\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"css\", [[\"punctuation\", \"{\"], [\"property\", \"color\"], [\"punctuation\", \":\"], \" blue\", [\"punctuation\", \"}\"]]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"], [\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"css\", [[\"punctuation\", \"{\"], [\"property\", \"font-weight\"], [\"punctuation\", \":\"], \"bold\", [\"punctuation\", \"}\"]]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"], \"Baz\", [\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"], [\"class-id\", \"foo#bar\"], [\"punctuation\", \")\"],\r\n\t\t\t\t[\"css\", [[\"punctuation\", \"{\"], [\"property\", \"font-style\"], [\"punctuation\", \":\"], \"italic\", [\"punctuation\", \"}\"]]],\r\n\t\t\t\t[\"punctuation\", \"[\"], [\"lang\", \"fr\"], [\"punctuation\", \"]\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"], [\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"css\", [[\"punctuation\", \"{\"], [\"property\", \"background\"], [\"punctuation\", \":\"], \"red\", [\"punctuation\", \";\"], [\"punctuation\", \"}\"]]],\r\n\t\t\t\t[\"punctuation\", \"(\"], [\"class-id\", \"bar#baz\"], [\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"[\"], [\"lang\", \"en\"], [\"punctuation\", \"]\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"], \"Baz\", [\"punctuation\", \"|\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for CSS modifier."
  },
  {
    "path": "tests/languages/css-selector/token-types_feature.test",
    "content": ".foo\n#bar\n:hover\n::before\n::selection\n> + ~ ||\n:nth-child(2n+1)\n:nth-child(even)\n[type=\"text\" i]\n[data-lang|='en']\n[data-count=items]\n[svg|href$=\"icon\" s]\n[attr*=value]\n[attr^=\"start\"]\n[attr~=token]\n[attr|=lang]\n[attr=value s]\nul#menu > li.item:not(:first-child) + li[data-role=\"cta\"]::before\n\n----------------------------------------------------\n\n[\n\t[\"class\", \".foo\"],\n\n\t[\"id\", \"#bar\"],\n\n\t[\"pseudo-class\", \":hover\"],\n\n\t[\"pseudo-element\", \"::before\"],\n\n\t[\"pseudo-element\", \"::selection\"],\n\n\t[\"combinator\", \">\"],\n\t[\"combinator\", \"+\"],\n\t[\"combinator\", \"~\"],\n\t[\"combinator\", \"||\"],\n\n\t[\"pseudo-class\", \":nth-child\"],\n\t[\"punctuation\", \"(\"],\n\t[\"n-th\", [\n\t\t[\"number\", \"2n\"],\n\t\t[\"operator\", \"+\"],\n\t\t[\"number\", \"1\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\n\t[\"pseudo-class\", \":nth-child\"],\n\t[\"punctuation\", \"(\"],\n\t[\"n-th\", \"even\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-name\", \"type\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"attr-value\", \"\\\"text\\\"\"],\n\t\t[\"case-sensitivity\", \"i\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-name\", \"data-lang\"],\n\t\t[\"operator\", \"|=\"],\n\t\t[\"attr-value\", \"'en'\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-name\", \"data-count\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"attr-value\", \"items\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"namespace\", [\n\t\t\t\"svg\",\n\t\t\t[\"punctuation\", \"|\"]\n\t\t]],\n\t\t[\"attr-name\", \"href\"],\n\t\t[\"operator\", \"$=\"],\n\t\t[\"attr-value\", \"\\\"icon\\\"\"],\n\t\t[\"case-sensitivity\", \"s\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-name\", \"attr\"],\n\t\t[\"operator\", \"*=\"],\n\t\t[\"attr-value\", \"value\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-name\", \"attr\"],\n\t\t[\"operator\", \"^=\"],\n\t\t[\"attr-value\", \"\\\"start\\\"\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-name\", \"attr\"],\n\t\t[\"operator\", \"~=\"],\n\t\t[\"attr-value\", \"token\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-name\", \"attr\"],\n\t\t[\"operator\", \"|=\"],\n\t\t[\"attr-value\", \"lang\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-name\", \"attr\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"attr-value\", \"value\"],\n\t\t[\"case-sensitivity\", \"s\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t\"\\r\\nul\",\n\t[\"id\", \"#menu\"],\n\t[\"combinator\", \">\"],\n\t\" li\",\n\t[\"class\", \".item\"],\n\t[\"pseudo-class\", \":not\"],\n\t[\"punctuation\", \"(\"],\n\t[\"pseudo-class\", \":first-child\"],\n\t[\"punctuation\", \")\"],\n\t[\"combinator\", \"+\"],\n\t\" li\",\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"attr-name\", \"data-role\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"attr-value\", \"\\\"cta\\\"\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"pseudo-element\", \"::before\"]\n]\n\n----------------------------------------------------\n\nTest the core css-selector token types.\n"
  },
  {
    "path": "tests/languages/csv/value.test",
    "content": "aaa,bbb,ccc\r\nzzz,yyy,xxx\r\n\r\n\"aaa\",\"bbb\",\"ccc\"\r\n\r\n\"aaa\",\"b\r\nbb\",\"ccc\"\r\n\r\n\"aaa\",\"b\"\"bb\",\"ccc\"\r\n\r\nYear,Make,Model,Description,Price\r\n1997,Ford,E350,\"ac, abs, moon\",3000.00\r\n1999,Chevy,\"Venture \"\"Extended Edition\"\"\",\"\",4900.00\r\n1999,Chevy,\"Venture \"\"Extended Edition, Very Large\"\"\",,5000.00\r\n1996,Jeep,Grand Cherokee,\"MUST SELL!\r\nair, moon roof, loaded\",4799.00\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"value\", \"aaa\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"bbb\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"ccc\"],\r\n\r\n\t[\"value\", \"zzz\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"yyy\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"xxx\"],\r\n\r\n\t[\"value\", \"\\\"aaa\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"\\\"bbb\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"\\\"ccc\\\"\"],\r\n\r\n\t[\"value\", \"\\\"aaa\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"\\\"b\\r\\nbb\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"\\\"ccc\\\"\"],\r\n\r\n\t[\"value\", \"\\\"aaa\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"\\\"b\\\"\\\"bb\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"\\\"ccc\\\"\"],\r\n\r\n\t[\"value\", \"Year\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"Make\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"Model\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"Description\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"Price\"],\r\n\r\n\t[\"value\", \"1997\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"Ford\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"E350\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"\\\"ac, abs, moon\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"3000.00\"],\r\n\r\n\t[\"value\", \"1999\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"Chevy\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"\\\"Venture \\\"\\\"Extended Edition\\\"\\\"\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"\\\"\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"4900.00\"],\r\n\r\n\t[\"value\", \"1999\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"Chevy\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"\\\"Venture \\\"\\\"Extended Edition, Very Large\\\"\\\"\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"5000.00\"],\r\n\r\n\t[\"value\", \"1996\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"Jeep\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"Grand Cherokee\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"\\\"MUST SELL!\\r\\nair, moon roof, loaded\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"value\", \"4799.00\"]\r\n]"
  },
  {
    "path": "tests/languages/cue/attribute_feature.test",
    "content": "@protobuf(proto3)\n@jsonschema(id=\"https://example.org/mystruct1.json\")\n\n----------------------------------------------------\n\n[\n\t[\"attribute\", \"@protobuf\"],\n\t[\"punctuation\", \"(\"],\n\t\"proto3\",\n\t[\"punctuation\", \")\"],\n\n\t[\"attribute\", \"@jsonschema\"],\n\t[\"punctuation\", \"(\"],\n\t\"id\",\n\t[\"operator\", \"=\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"https://example.org/mystruct1.json\\\"\"]\n\t]],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/cue/boolean_feature.test",
    "content": "true\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n"
  },
  {
    "path": "tests/languages/cue/builtin_feature.test",
    "content": "// Types\nnull      // The null type and value\nbool      // All boolean values\nint       // All integral numbers\nfloat     // All decimal floating-point numbers\nstring    // Any valid UTF-8 sequence\nbytes     // Any valid byte sequence\n\n// Derived   Value\nnumber    // int | float\nuint      // >=0\nuint8     // >=0 & <=255\nint8      // >=-128 & <=127\nuint16    // >=0 & <=65536\nint16     // >=-32_768 & <=32_767\nrune      // >=0 & <=0x10FFFF\nuint32    // >=0 & <=4_294_967_296\nint32     // >=-2_147_483_648 & <=2_147_483_647\nuint64    // >=0 & <=18_446_744_073_709_551_615\nint64     // >=-9_223_372_036_854_775_808 & <=9_223_372_036_854_775_807\nuint128   // >=0 & <=340_282_366_920_938_463_463_374_607_431_768_211_455\nint128    // >=-170_141_183_460_469_231_731_687_303_715_884_105_728 &\n          //  <=170_141_183_460_469_231_731_687_303_715_884_105_727\nfloat32   // >=-3.40282346638528859811704183484516925440e+38 &\n          // <=3.40282346638528859811704183484516925440e+38\nfloat64   // >=-1.797693134862315708145274237317043567981e+308 &\n          // <=1.797693134862315708145274237317043567981e+308\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// Types\"],\n\t[\"keyword\", \"null\"], [\"comment\", \"// The null type and value\"],\n\t[\"builtin\", \"bool\"], [\"comment\", \"// All boolean values\"],\n\t[\"builtin\", \"int\"], [\"comment\", \"// All integral numbers\"],\n\t[\"builtin\", \"float\"], [\"comment\", \"// All decimal floating-point numbers\"],\n\t[\"builtin\", \"string\"], [\"comment\", \"// Any valid UTF-8 sequence\"],\n\t[\"builtin\", \"bytes\"], [\"comment\", \"// Any valid byte sequence\"],\n\n\t[\"comment\", \"// Derived   Value\"],\n\t[\"builtin\", \"number\"],\n\t[\"comment\", \"// int | float\"],\n\t[\"builtin\", \"uint\"],\n\t[\"comment\", \"// >=0\"],\n\t[\"builtin\", \"uint8\"],\n\t[\"comment\", \"// >=0 & <=255\"],\n\t[\"builtin\", \"int8\"],\n\t[\"comment\", \"// >=-128 & <=127\"],\n\t[\"builtin\", \"uint16\"],\n\t[\"comment\", \"// >=0 & <=65536\"],\n\t[\"builtin\", \"int16\"],\n\t[\"comment\", \"// >=-32_768 & <=32_767\"],\n\t[\"builtin\", \"rune\"],\n\t[\"comment\", \"// >=0 & <=0x10FFFF\"],\n\t[\"builtin\", \"uint32\"],\n\t[\"comment\", \"// >=0 & <=4_294_967_296\"],\n\t[\"builtin\", \"int32\"],\n\t[\"comment\", \"// >=-2_147_483_648 & <=2_147_483_647\"],\n\t[\"builtin\", \"uint64\"],\n\t[\"comment\", \"// >=0 & <=18_446_744_073_709_551_615\"],\n\t[\"builtin\", \"int64\"],\n\t[\"comment\", \"// >=-9_223_372_036_854_775_808 & <=9_223_372_036_854_775_807\"],\n\t[\"builtin\", \"uint128\"],\n\t[\"comment\", \"// >=0 & <=340_282_366_920_938_463_463_374_607_431_768_211_455\"],\n\t[\"builtin\", \"int128\"],\n\t[\"comment\", \"// >=-170_141_183_460_469_231_731_687_303_715_884_105_728 &\"],\n\t[\"comment\", \"//  <=170_141_183_460_469_231_731_687_303_715_884_105_727\"],\n\t[\"builtin\", \"float32\"],\n\t[\"comment\", \"// >=-3.40282346638528859811704183484516925440e+38 &\"],\n\t[\"comment\", \"// <=3.40282346638528859811704183484516925440e+38\"],\n\t[\"builtin\", \"float64\"],\n\t[\"comment\", \"// >=-1.797693134862315708145274237317043567981e+308 &\"],\n\t[\"comment\", \"// <=1.797693134862315708145274237317043567981e+308\"]\n]\n"
  },
  {
    "path": "tests/languages/cue/comment_feature.test",
    "content": "// comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// comment\"]\n]\n"
  },
  {
    "path": "tests/languages/cue/function_feature.test",
    "content": "math.Sin(x)\n\n----------------------------------------------------\n\n[\n\t\"math\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"Sin\"],\n\t[\"punctuation\", \"(\"],\n\t\"x\",\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/cue/keyword_feature.test",
    "content": "for\nif\nimport\nin\nlet\nnull\npackage\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"let\"],\n\t[\"keyword\", \"null\"],\n\t[\"keyword\", \"package\"]\n]\n"
  },
  {
    "path": "tests/languages/cue/number_feature.test",
    "content": "42\n1.5G    // 1_000_000_000\n1.3Ki   // 1.3 * 1024 = trunc(1331.2) = 1331\n170_141_183_460_469_231_731_687_303_715_884_105_727\n0xBad_Face\n0o755\n0b0101_0001\n\n0.\n72.40\n072.40  // == 72.40\n2.71828\n1.e+0\n6.67428e-11\n1E6\n.25\n.12345E+5\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"42\"],\n\t[\"number\", \"1.5G\"], [\"comment\", \"// 1_000_000_000\"],\n\t[\"number\", \"1.3Ki\"], [\"comment\", \"// 1.3 * 1024 = trunc(1331.2) = 1331\"],\n\t[\"number\", \"170_141_183_460_469_231_731_687_303_715_884_105_727\"],\n\t[\"number\", \"0xBad_Face\"],\n\t[\"number\", \"0o755\"],\n\t[\"number\", \"0b0101_0001\"],\n\n\t[\"number\", \"0.\"],\n\t[\"number\", \"72.40\"],\n\t[\"number\", \"072.40\"], [\"comment\", \"// == 72.40\"],\n\t[\"number\", \"2.71828\"],\n\t[\"number\", \"1.e+0\"],\n\t[\"number\", \"6.67428e-11\"],\n\t[\"number\", \"1E6\"],\n\t[\"number\", \".25\"],\n\t[\"number\", \".12345E+5\"]\n]\n"
  },
  {
    "path": "tests/languages/cue/operator_feature.test",
    "content": "+ - * /\n< <= > >= == != =~ !~\n\n&& || & |\n! ? =\n\n_|_\n...\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"=~\"],\n\t[\"operator\", \"!~\"],\n\n\t[\"operator\", \"&&\"], [\"operator\", \"||\"], [\"operator\", \"&\"], [\"operator\", \"|\"],\n\t[\"operator\", \"!\"], [\"operator\", \"?\"], [\"operator\", \"=\"],\n\n\t[\"operator\", \"_|_\"],\n\t[\"operator\", \"...\"]\n]\n"
  },
  {
    "path": "tests/languages/cue/punctuation_feature.test",
    "content": "( ) [ ] { }\n, . :\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"]\n]\n"
  },
  {
    "path": "tests/languages/cue/string_feature.test",
    "content": "'a\\000\\xab'\n'\\007'\n'\\377'\n'\\xa'        // illegal: too few hexadecimal digits\n\"\\n\"\n\"\\\"\"\n'Hello, world!\\n'\n\"Hello, \\( name )!\"\n\"日本語\"\n\"\\u65e5本\\U00008a9e\"\n'\\xff\\u00FF'\n\"\\uD800\"             // illegal: surrogate half (TODO: probably should allow)\n\"\\U00110000\"         // illegal: invalid Unicode code point\n\n#\"This is not an \\(interpolation)\"#\n#\"This is an \\#(interpolation)\"#\n#\"The sequence \"\\U0001F604\" renders as \\#U0001F604.\"#\n\n\"日本語\"                                 // UTF-8 input text\n'日本語'                                 // UTF-8 input text as byte sequence\n\"\\u65e5\\u672c\\u8a9e\"                    // the explicit Unicode code points\n\"\\U000065e5\\U0000672c\\U00008a9e\"        // the explicit Unicode code points\n'\\xe6\\x97\\xa5\\xe6\\x9c\\xac\\xe8\\xaa\\x9e'  // the explicit UTF-8 bytes\n\n\"\"\"\n    lily:\n    out of the water\n    out of itself\n\n    bass\n    picking bugs\n    off the moon\n        — Nick Virgilio, Selected Haiku, 1988\n    \"\"\"\n\n----------------------------------------------------\n\n[\n\t[\"string-literal\", [\n\t\t[\"string\", \"'a\"],\n\t\t[\"escape\", \"\\\\000\"],\n\t\t[\"escape\", \"\\\\xab\"],\n\t\t[\"string\", \"'\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"'\"],\n\t\t[\"escape\", \"\\\\007\"],\n\t\t[\"string\", \"'\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"'\"],\n\t\t[\"escape\", \"\\\\377\"],\n\t\t[\"string\", \"'\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"'\"],\n\t\t[\"escape\", \"\\\\xa\"],\n\t\t[\"string\", \"'\"]\n\t]],\n\t[\"comment\", \"// illegal: too few hexadecimal digits\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"escape\", \"\\\\n\"],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"escape\", \"\\\\\\\"\"],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"'Hello, world!\"],\n\t\t[\"escape\", \"\\\\n\"],\n\t\t[\"string\", \"'\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"Hello, \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"\\\\(\"],\n\t\t\t[\"expression\", [\" name \"]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"string\", \"!\\\"\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"日本語\\\"\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"escape\", \"\\\\u65e5\"],\n\t\t[\"string\", \"本\"],\n\t\t[\"escape\", \"\\\\U00008a9e\"],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"'\"],\n\t\t[\"escape\", \"\\\\xff\"],\n\t\t[\"escape\", \"\\\\u00FF\"],\n\t\t[\"string\", \"'\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"escape\", \"\\\\uD800\"],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"comment\", \"// illegal: surrogate half (TODO: probably should allow)\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"escape\", \"\\\\U00110000\"],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"comment\", \"// illegal: invalid Unicode code point\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"#\\\"This is not an \\\\(interpolation)\\\"#\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"#\\\"This is an \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"\\\\#(\"],\n\t\t\t[\"expression\", [\"interpolation\"]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"string\", \"\\\"#\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"#\\\"The sequence \\\"\\\\U0001F604\\\" renders as \"],\n\t\t[\"escape\", \"\\\\#U0001F604\"],\n\t\t[\"string\", \".\\\"#\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"日本語\\\"\"]\n\t]],\n\t[\"comment\", \"// UTF-8 input text\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"'日本語'\"]\n\t]],\n\t[\"comment\", \"// UTF-8 input text as byte sequence\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"escape\", \"\\\\u65e5\"],\n\t\t[\"escape\", \"\\\\u672c\"],\n\t\t[\"escape\", \"\\\\u8a9e\"],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"comment\", \"// the explicit Unicode code points\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"escape\", \"\\\\U000065e5\"],\n\t\t[\"escape\", \"\\\\U0000672c\"],\n\t\t[\"escape\", \"\\\\U00008a9e\"],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"comment\", \"// the explicit Unicode code points\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"'\"],\n\t\t[\"escape\", \"\\\\xe6\"],\n\t\t[\"escape\", \"\\\\x97\"],\n\t\t[\"escape\", \"\\\\xa5\"],\n\t\t[\"escape\", \"\\\\xe6\"],\n\t\t[\"escape\", \"\\\\x9c\"],\n\t\t[\"escape\", \"\\\\xac\"],\n\t\t[\"escape\", \"\\\\xe8\"],\n\t\t[\"escape\", \"\\\\xaa\"],\n\t\t[\"escape\", \"\\\\x9e\"],\n\t\t[\"string\", \"'\"]\n\t]],\n\t[\"comment\", \"// the explicit UTF-8 bytes\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\"\\\"\\r\\n    lily:\\r\\n    out of the water\\r\\n    out of itself\\r\\n\\r\\n    bass\\r\\n    picking bugs\\r\\n    off the moon\\r\\n        — Nick Virgilio, Selected Haiku, 1988\\r\\n    \\\"\\\"\\\"\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/cypher/boolean_feature.test",
    "content": "true TRUE\nfalse FALSE\nnull\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"TRUE\"],\n\t[\"boolean\", \"false\"],\n\t[\"boolean\", \"FALSE\"],\n\t[\"boolean\", \"null\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans and null.\n"
  },
  {
    "path": "tests/languages/cypher/class-name_feature.test",
    "content": "(p:Student)\n(p:Student { name: \"John\" })\n(:`Student`)\n(:`Student` { name: \"John\"})\n\n(p:Student:Teacher)\n(p:Student { name: \"John\" }:Teacher)\n(:`Student`:`Teacher`)\n(:`Student` { name: \"John\"}:`Teacher` { classes: \"...\" })\n\n// no class names but still interesting cases\n\n(p { name: \"John\" })\n({ name: \"John\" })\n()\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t\"p\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Student\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t\"p\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Student\"],\n\t[\"punctuation\", \"{\"],\n\t\" name\",\n\t[\"operator\", \":\"],\n\t[\"string\", \"\\\"John\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"`Student`\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"`Student`\"],\n\t[\"punctuation\", \"{\"],\n\t\" name\",\n\t[\"operator\", \":\"],\n\t[\"string\", \"\\\"John\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t\"p\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Student\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Teacher\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t\"p\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Student\"],\n\t[\"punctuation\", \"{\"],\n\t\" name\",\n\t[\"operator\", \":\"],\n\t[\"string\", \"\\\"John\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Teacher\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"`Student`\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"`Teacher`\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"`Student`\"],\n\t[\"punctuation\", \"{\"],\n\t\" name\",\n\t[\"operator\", \":\"],\n\t[\"string\", \"\\\"John\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"`Teacher`\"],\n\t[\"punctuation\", \"{\"],\n\t\" classes\",\n\t[\"operator\", \":\"],\n\t[\"string\", \"\\\"...\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"comment\", \"// no class names but still interesting cases\"],\n\n\t[\"punctuation\", \"(\"],\n\t\"p \",\n\t[\"punctuation\", \"{\"],\n\t\" name\",\n\t[\"operator\", \":\"],\n\t[\"string\", \"\\\"John\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \"{\"],\n\t\" name\",\n\t[\"operator\", \":\"],\n\t[\"string\", \"\\\"John\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for class names.\n"
  },
  {
    "path": "tests/languages/cypher/comment_feature.test",
    "content": "//comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"//comment\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/cypher/function_feature.test",
    "content": "foo()\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for function names.\n"
  },
  {
    "path": "tests/languages/cypher/keyword_feature.test",
    "content": "ADD\nALL\nAND\nAS\nASC\nASCENDING\nASSERT\nCALL\nCASE\nCOMMIT\nCONSTRAINT\nCONTAINS\nCREATE\nCSV\nDELETE\nDESC\nDESCENDING\nDETACH\nDISTINCT\nDO\nDROP\nELSE\nEND\nENDS\nEXISTS\nFOR\nFOREACH\nIN\nINDEX\nIS\nJOIN\nKEY\nLIMIT\nLOAD\nMANDATORY\nMATCH\nMERGE\nNODE\nNOT\nOF\nON\nOPTIONAL\nOR\nORDER BY\nPERIODIC\nREMOVE\nREQUIRE\nRETURN\nSCALAR\nSCAN\nSET\nSKIP\nSTART\nSTARTS\nTHEN\nUNION\nUNIQUE\nUNWIND\nUSING\nWHEN\nWHERE\nWITH\nXOR\nYIELD\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"ADD\"],\n\t[\"keyword\", \"ALL\"],\n\t[\"keyword\", \"AND\"],\n\t[\"keyword\", \"AS\"],\n\t[\"keyword\", \"ASC\"],\n\t[\"keyword\", \"ASCENDING\"],\n\t[\"keyword\", \"ASSERT\"],\n\t[\"keyword\", \"CALL\"],\n\t[\"keyword\", \"CASE\"],\n\t[\"keyword\", \"COMMIT\"],\n\t[\"keyword\", \"CONSTRAINT\"],\n\t[\"keyword\", \"CONTAINS\"],\n\t[\"keyword\", \"CREATE\"],\n\t[\"keyword\", \"CSV\"],\n\t[\"keyword\", \"DELETE\"],\n\t[\"keyword\", \"DESC\"],\n\t[\"keyword\", \"DESCENDING\"],\n\t[\"keyword\", \"DETACH\"],\n\t[\"keyword\", \"DISTINCT\"],\n\t[\"keyword\", \"DO\"],\n\t[\"keyword\", \"DROP\"],\n\t[\"keyword\", \"ELSE\"],\n\t[\"keyword\", \"END\"],\n\t[\"keyword\", \"ENDS\"],\n\t[\"keyword\", \"EXISTS\"],\n\t[\"keyword\", \"FOR\"],\n\t[\"keyword\", \"FOREACH\"],\n\t[\"keyword\", \"IN\"],\n\t[\"keyword\", \"INDEX\"],\n\t[\"keyword\", \"IS\"],\n\t[\"keyword\", \"JOIN\"],\n\t[\"keyword\", \"KEY\"],\n\t[\"keyword\", \"LIMIT\"],\n\t[\"keyword\", \"LOAD\"],\n\t[\"keyword\", \"MANDATORY\"],\n\t[\"keyword\", \"MATCH\"],\n\t[\"keyword\", \"MERGE\"],\n\t[\"keyword\", \"NODE\"],\n\t[\"keyword\", \"NOT\"],\n\t[\"keyword\", \"OF\"],\n\t[\"keyword\", \"ON\"],\n\t[\"keyword\", \"OPTIONAL\"],\n\t[\"keyword\", \"OR\"],\n\t[\"keyword\", \"ORDER\"],\n\t[\"keyword\", \"BY\"],\n\t[\"keyword\", \"PERIODIC\"],\n\t[\"keyword\", \"REMOVE\"],\n\t[\"keyword\", \"REQUIRE\"],\n\t[\"keyword\", \"RETURN\"],\n\t[\"keyword\", \"SCALAR\"],\n\t[\"keyword\", \"SCAN\"],\n\t[\"keyword\", \"SET\"],\n\t[\"keyword\", \"SKIP\"],\n\t[\"keyword\", \"START\"],\n\t[\"keyword\", \"STARTS\"],\n\t[\"keyword\", \"THEN\"],\n\t[\"keyword\", \"UNION\"],\n\t[\"keyword\", \"UNIQUE\"],\n\t[\"keyword\", \"UNWIND\"],\n\t[\"keyword\", \"USING\"],\n\t[\"keyword\", \"WHEN\"],\n\t[\"keyword\", \"WHERE\"],\n\t[\"keyword\", \"WITH\"],\n\t[\"keyword\", \"XOR\"],\n\t[\"keyword\", \"YIELD\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/cypher/number_feature.test",
    "content": "123\n123E45\n\n3.14\n6.022E23\n\n0x13af\n0xFC3A9\n0x66eff\n\n01372\n02127\n05671\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"123\"],\n\t[\"number\", \"123E45\"],\n\n\t[\"number\", \"3.14\"],\n\t[\"number\", \"6.022E23\"],\n\n\t[\"number\", \"0x13af\"],\n\t[\"number\", \"0xFC3A9\"],\n\t[\"number\", \"0x66eff\"],\n\n\t[\"number\", \"01372\"],\n\t[\"number\", \"02127\"],\n\t[\"number\", \"05671\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers.\n"
  },
  {
    "path": "tests/languages/cypher/operator_feature.test",
    "content": "+ - * / % ^\n\n= <> > >= < <=\n\n=~ | : ..\n\n- ->\n<- -\n- -\n--\n<--\n-->\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"^\"],\n\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"<>\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\n\t[\"operator\", \"=~\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \":\"],\n\t[\"operator\", \"..\"],\n\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"->\"],\n\t[\"operator\", \"<-\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"--\"],\n\t[\"operator\", \"<--\"],\n\t[\"operator\", \"-->\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/cypher/punctuation_feature.test",
    "content": "( ) [ ] { } ; , .\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \".\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/cypher/relationship_feature.test",
    "content": "-[r:REL_TYPE]->\n\n-[:REL_TYPE]->\n\n<-[:LIKES]-\n\n-[{blocked: false}]->\n\n-[:KNOWS*1..2]-\n\n-[*]->\n\n-[*3..5]->\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"-\"],\n\t[\"punctuation\", \"[\"],\n\t\"r\",\n\t[\"operator\", \":\"],\n\t[\"relationship\", \"REL_TYPE\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"->\"],\n\n\t[\"operator\", \"-\"],\n\t[\"punctuation\", \"[\"],\n\t[\"operator\", \":\"],\n\t[\"relationship\", \"REL_TYPE\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"->\"],\n\n\t[\"operator\", \"<-\"],\n\t[\"punctuation\", \"[\"],\n\t[\"operator\", \":\"],\n\t[\"relationship\", \"LIKES\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"-\"],\n\n\t[\"operator\", \"-\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"{\"],\n\t\"blocked\",\n\t[\"operator\", \":\"],\n\t[\"boolean\", \"false\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"->\"],\n\n\t[\"operator\", \"-\"],\n\t[\"punctuation\", \"[\"],\n\t[\"operator\", \":\"],\n\t[\"relationship\", \"KNOWS\"],\n\t[\"operator\", \"*\"],\n\t[\"number\", \"1\"],\n\t[\"operator\", \"..\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"-\"],\n\n\t[\"operator\", \"-\"],\n\t[\"punctuation\", \"[\"],\n\t[\"operator\", \"*\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"->\"],\n\n\t[\"operator\", \"-\"],\n\t[\"punctuation\", \"[\"],\n\t[\"operator\", \"*\"],\n\t[\"number\", \"3\"],\n\t[\"operator\", \"..\"],\n\t[\"number\", \"5\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"->\"]\n]\n\n----------------------------------------------------\n\nChecks for relationships.\n"
  },
  {
    "path": "tests/languages/cypher/string_feature.test",
    "content": "\"\"\n\"foo\"\n''\n'foo'\n\"\\foo//'\\bar\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"''\"],\n\t[\"string\", \"'foo'\"],\n\t[\"string\", \"\\\"\\\\foo//'\\\\bar\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/cypher/variable_feature.test",
    "content": "$name\na.$name\n\n----------------------------------------------------\n\n[\n\t[\"variable\", \"$name\"],\n\t\"\\r\\na\", [\"punctuation\", \".\"], [\"variable\", \"$name\"]\n]\n\n----------------------------------------------------\n\nChecks for variables.\n"
  },
  {
    "path": "tests/languages/d/char_feature.test",
    "content": "'a'\n'\\''\n'\\\\'\n'\\n'\n'\\xFF'\n'\\377'\n'\\uFFFF'\n'\\U0010FFFF'\n'\\quot'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"],\n\t[\"char\", \"'\\\\''\"],\n\t[\"char\", \"'\\\\\\\\'\"],\n\t[\"char\", \"'\\\\n'\"],\n\t[\"char\", \"'\\\\xFF'\"],\n\t[\"char\", \"'\\\\377'\"],\n\t[\"char\", \"'\\\\uFFFF'\"],\n\t[\"char\", \"'\\\\U0010FFFF'\"],\n\t[\"char\", \"'\\\\quot'\"]\n]\n"
  },
  {
    "path": "tests/languages/d/comment_feature.test",
    "content": "#!/usr/bin/env rdmd\r\n\r\n/++/\r\n/+ foo\r\nbar +/\r\n/+ foo\r\n\t/+\r\n\tbar +/\r\nbaz +/\r\n// This q{is} a comment\r\n// This /* is a */ comment\r\n/*\r\ncomment\r\n*/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#!/usr/bin/env rdmd\"],\r\n\t[\"comment\", \"/++/\"],\r\n\t[\"comment\", \"/+ foo\\r\\nbar +/\"],\r\n\t[\"comment\", \"/+ foo\\r\\n\\t/+\\r\\n\\tbar +/\\r\\nbaz +/\"],\r\n\t[\"comment\", \"// This q{is} a comment\"],\r\n\t[\"comment\", \"// This /* is a */ comment\"],\r\n\t[\"comment\", \"/*\\r\\ncomment\\r\\n*/\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for shebang and nestable multi-line comments.\r\nOther comments are tested in clike.\r\n"
  },
  {
    "path": "tests/languages/d/issue2027.test",
    "content": "string foo = \"It's\";\r\nfoo = \"It's\";\r\nfoo = \"It's\";\r\n\r\nstring bar = `It's`;\r\nbar = `It's`;\r\nbar = `It's`;\r\nbar = `It's`;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"string\"],\r\n\t\" foo \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"It's\\\"\"],\r\n\t[\"punctuation\", \";\"],\r\n\t\"\\r\\nfoo \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"It's\\\"\"],\r\n\t[\"punctuation\", \";\"],\r\n\t\"\\r\\nfoo \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"It's\\\"\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"string\"],\r\n\t\" bar \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"`It's`\"],\r\n\t[\"punctuation\", \";\"],\r\n\t\"\\r\\nbar \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"`It's`\"],\r\n\t[\"punctuation\", \";\"],\r\n\t\"\\r\\nbar \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"`It's`\"],\r\n\t[\"punctuation\", \";\"],\r\n\t\"\\r\\nbar \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"`It's`\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for issue #2027 which was about strings not being matched correctly.\r\n"
  },
  {
    "path": "tests/languages/d/keyword_feature.test",
    "content": "$\r\nabstract\r\nalias\r\nalign\r\nasm\r\nassert\r\nauto\r\nbody\r\nbool\r\nbreak\r\nbyte\r\ncase\r\ncast\r\ncatch\r\ncdouble\r\ncent\r\ncfloat\r\nchar\r\nclass;\r\nconst\r\ncontinue\r\ncreal\r\ndchar\r\ndebug\r\ndefault\r\ndelegate\r\ndelete\r\ndeprecated\r\ndo\r\ndouble\r\nelse\r\nenum\r\nexport\r\nextern\r\nfalse\r\nfinal\r\nfinally\r\nfloat\r\nfor\r\nforeach\r\nforeach_reverse\r\nfunction\r\ngoto\r\nidouble\r\nif\r\nifloat\r\nimmutable\r\nimport\r\ninout\r\nint\r\ninterface;\r\ninvariant\r\nireal\r\nlazy\r\nlong\r\nmacro\r\nmixin\r\nmodule\r\nnew;\r\nnothrow\r\nnull\r\nout\r\noverride\r\npackage\r\npragma\r\nprivate\r\nprotected\r\npublic\r\npure\r\nreal\r\nref\r\nreturn\r\nscope\r\nshared\r\nshort\r\nstatic\r\nstruct\r\nsuper\r\nswitch\r\nsynchronized\r\ntemplate\r\nthis\r\nthrow\r\ntrue\r\ntry\r\ntypedef\r\ntypeid\r\ntypeof\r\nubyte\r\nucent\r\nuint\r\nulong\r\nunion\r\nunittest\r\nushort\r\nversion\r\nvoid\r\nvolatile\r\nwchar\r\nwhile\r\nwith\r\n__FILE__\r\n__MODULE__\r\n__LINE__\r\n__FUNCTION__\r\n__PRETTY_FUNCTION__\r\n__DATE__\r\n__EOF__\r\n__TIME__\r\n__TIMESTAMP__\r\n__VENDOR__\r\n__VERSION__\r\n__gshared\r\n__traits\r\n__vector\r\n__parameters\r\nstring\r\nwstring\r\ndstring\r\nsize_t\r\nptrdiff_t\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"$\"],\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"alias\"],\r\n\t[\"keyword\", \"align\"],\r\n\t[\"keyword\", \"asm\"],\r\n\t[\"keyword\", \"assert\"],\r\n\t[\"keyword\", \"auto\"],\r\n\t[\"keyword\", \"body\"],\r\n\t[\"keyword\", \"bool\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"byte\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"cast\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"cdouble\"],\r\n\t[\"keyword\", \"cent\"],\r\n\t[\"keyword\", \"cfloat\"],\r\n\t[\"keyword\", \"char\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"creal\"],\r\n\t[\"keyword\", \"dchar\"],\r\n\t[\"keyword\", \"debug\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"delegate\"],\r\n\t[\"keyword\", \"delete\"],\r\n\t[\"keyword\", \"deprecated\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"double\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"false\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"float\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"keyword\", \"foreach_reverse\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"idouble\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"ifloat\"],\r\n\t[\"keyword\", \"immutable\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"inout\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"invariant\"],\r\n\t[\"keyword\", \"ireal\"],\r\n\t[\"keyword\", \"lazy\"],\r\n\t[\"keyword\", \"long\"],\r\n\t[\"keyword\", \"macro\"],\r\n\t[\"keyword\", \"mixin\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"nothrow\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"out\"],\r\n\t[\"keyword\", \"override\"],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"pragma\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"pure\"],\r\n\t[\"keyword\", \"real\"],\r\n\t[\"keyword\", \"ref\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"scope\"],\r\n\t[\"keyword\", \"shared\"],\r\n\t[\"keyword\", \"short\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"synchronized\"],\r\n\t[\"keyword\", \"template\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"true\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"typedef\"],\r\n\t[\"keyword\", \"typeid\"],\r\n\t[\"keyword\", \"typeof\"],\r\n\t[\"keyword\", \"ubyte\"],\r\n\t[\"keyword\", \"ucent\"],\r\n\t[\"keyword\", \"uint\"],\r\n\t[\"keyword\", \"ulong\"],\r\n\t[\"keyword\", \"union\"],\r\n\t[\"keyword\", \"unittest\"],\r\n\t[\"keyword\", \"ushort\"],\r\n\t[\"keyword\", \"version\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"keyword\", \"volatile\"],\r\n\t[\"keyword\", \"wchar\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"keyword\", \"__FILE__\"],\r\n\t[\"keyword\", \"__MODULE__\"],\r\n\t[\"keyword\", \"__LINE__\"],\r\n\t[\"keyword\", \"__FUNCTION__\"],\r\n\t[\"keyword\", \"__PRETTY_FUNCTION__\"],\r\n\t[\"keyword\", \"__DATE__\"],\r\n\t[\"keyword\", \"__EOF__\"],\r\n\t[\"keyword\", \"__TIME__\"],\r\n\t[\"keyword\", \"__TIMESTAMP__\"],\r\n\t[\"keyword\", \"__VENDOR__\"],\r\n\t[\"keyword\", \"__VERSION__\"],\r\n\t[\"keyword\", \"__gshared\"],\r\n\t[\"keyword\", \"__traits\"],\r\n\t[\"keyword\", \"__vector\"],\r\n\t[\"keyword\", \"__parameters\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"keyword\", \"wstring\"],\r\n\t[\"keyword\", \"dstring\"],\r\n\t[\"keyword\", \"size_t\"],\r\n\t[\"keyword\", \"ptrdiff_t\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for $, keywords, special tokens and globally defined symbols."
  },
  {
    "path": "tests/languages/d/number_feature.test",
    "content": "42\r\n42_000\r\n42L\r\n42U\r\n42UL\r\n3.14_15_9\r\n3.2e8\r\n0.4e-7\r\n62.14e+4\r\n\r\n0xBAD_FACE\r\n0xFFU\r\n0xfaL\r\n0x42UL\r\n0x2.AFp4\r\n0xFp-3\r\n0xFBp+9\r\n\r\n0b0000_1111\r\n\r\n6.3i\r\n6.3fi\r\n6.3Li\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"42_000\"],\r\n\t[\"number\", \"42L\"],\r\n\t[\"number\", \"42U\"],\r\n\t[\"number\", \"42UL\"],\r\n\t[\"number\", \"3.14_15_9\"],\r\n\t[\"number\", \"3.2e8\"],\r\n\t[\"number\", \"0.4e-7\"],\r\n\t[\"number\", \"62.14e+4\"],\r\n\r\n\t[\"number\", \"0xBAD_FACE\"],\r\n\t[\"number\", \"0xFFU\"],\r\n\t[\"number\", \"0xfaL\"],\r\n\t[\"number\", \"0x42UL\"],\r\n\t[\"number\", \"0x2.AFp4\"],\r\n\t[\"number\", \"0xFp-3\"],\r\n\t[\"number\", \"0xFBp+9\"],\r\n\r\n\t[\"number\", \"0b0000_1111\"],\r\n\r\n\t[\"number\", \"6.3i\"],\r\n\t[\"number\", \"6.3fi\"],\r\n\t[\"number\", \"6.3Li\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/d/operator_feature.test",
    "content": "||\r\n&&\r\n++\r\n--\r\n.. ...\r\n=>\r\nin is\r\n!in !is\r\n<< <<=\r\n>> >>> >>= >>>=\r\n^^ ^^=\r\n<> !<> <>= !<>=\r\n!< !<=\r\n!> !>=\r\n+ +=\r\n- -=\r\n* *=\r\n/ /=\r\n% %=\r\n& &=\r\n| |=\r\n^ ^=\r\n~ ~=\r\n= ==\r\n! !=\r\n< <=\r\n> >=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"operator\", \"..\"], [\"operator\", \"...\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"operator\", \"in\"], [\"operator\", \"is\"],\r\n\t[\"operator\", \"!in\"], [\"operator\", \"!is\"],\r\n\t[\"operator\", \"<<\"], [\"operator\", \"<<=\"],\r\n\t[\"operator\", \">>\"], [\"operator\", \">>>\"], [\"operator\", \">>=\"], [\"operator\", \">>>=\"],\r\n\t[\"operator\", \"^^\"], [\"operator\", \"^^=\"],\r\n\t[\"operator\", \"<>\"], [\"operator\", \"!<>\"], [\"operator\", \"<>=\"], [\"operator\", \"!<>=\"],\r\n\t[\"operator\", \"!<\"], [\"operator\", \"!<=\"],\r\n\t[\"operator\", \"!>\"], [\"operator\", \"!>=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"|=\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \"~\"], [\"operator\", \"~=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/d/property_feature.test",
    "content": "@property int data()\r\n@disable this();\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"@property\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"function\", \"data\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"property\", \"@disable\"],\r\n\t[\"keyword\", \"this\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nCheck for properties."
  },
  {
    "path": "tests/languages/d/register_feature.test",
    "content": "AL AH AX EAX\r\nBL BH BX EBX\r\nCL CH CX ECX\r\nDL DH DX EDX\r\nBP EBP\r\nSP ESP\r\nDI EDI\r\nSI ESI\r\nES CS SS DS GS FS\r\nCR0 CR2 CR3 CR4\r\nDR0 DR1 DR2 DR3 DR6 DR7\r\nTR3 TR4 TR5 TR6 TR7\r\nST\r\nST(0) ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)\r\nMM0  MM1  MM2  MM3  MM4  MM5  MM6  MM7\r\nXMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7\r\n\r\nRAX  RBX  RCX  RDX\r\nBPL  RBP\r\nSPL  RSP\r\nDIL  RDI\r\nSIL  RSI\r\nR8B  R8W  R8D  R8\r\nR9B  R9W  R9D  R9\r\nR10B R10W R10D R10\r\nR11B R11W R11D R11\r\nR12B R12W R12D R12\r\nR13B R13W R13D R13\r\nR14B R14W R14D R14\r\nR15B R15W R15D R15\r\nXMM8 XMM9 XMM10 XMM11 XMM12 XMM13 XMM14 XMM15\r\nYMM0 YMM1 YMM2  YMM3  YMM4  YMM5  YMM6  YMM7\r\nYMM8 YMM9 YMM10 YMM11 YMM12 YMM13 YMM14 YMM15\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"register\", \"AL\"], [\"register\", \"AH\"], [\"register\", \"AX\"], [\"register\", \"EAX\"],\r\n\t[\"register\", \"BL\"], [\"register\", \"BH\"], [\"register\", \"BX\"], [\"register\", \"EBX\"],\r\n\t[\"register\", \"CL\"], [\"register\", \"CH\"], [\"register\", \"CX\"], [\"register\", \"ECX\"],\r\n\t[\"register\", \"DL\"], [\"register\", \"DH\"], [\"register\", \"DX\"], [\"register\", \"EDX\"],\r\n\t[\"register\", \"BP\"], [\"register\", \"EBP\"],\r\n\t[\"register\", \"SP\"], [\"register\", \"ESP\"],\r\n\t[\"register\", \"DI\"], [\"register\", \"EDI\"],\r\n\t[\"register\", \"SI\"], [\"register\", \"ESI\"],\r\n\t[\"register\", \"ES\"], [\"register\", \"CS\"], [\"register\", \"SS\"], [\"register\", \"DS\"], [\"register\", \"GS\"], [\"register\", \"FS\"],\r\n\t[\"register\", \"CR0\"], [\"register\", \"CR2\"], [\"register\", \"CR3\"], [\"register\", \"CR4\"],\r\n\t[\"register\", \"DR0\"], [\"register\", \"DR1\"], [\"register\", \"DR2\"], [\"register\", \"DR3\"], [\"register\", \"DR6\"], [\"register\", \"DR7\"],\r\n\t[\"register\", \"TR3\"], [\"register\", \"TR4\"], [\"register\", \"TR5\"], [\"register\", \"TR6\"], [\"register\", \"TR7\"],\r\n\t[\"register\", \"ST\"],\r\n\t[\"register\", \"ST(0)\"], [\"register\", \"ST(1)\"], [\"register\", \"ST(2)\"], [\"register\", \"ST(3)\"], [\"register\", \"ST(4)\"], [\"register\", \"ST(5)\"], [\"register\", \"ST(6)\"], [\"register\", \"ST(7)\"],\r\n\t[\"register\", \"MM0\"],  [\"register\", \"MM1\"],  [\"register\", \"MM2\"],  [\"register\", \"MM3\"],  [\"register\", \"MM4\"],  [\"register\", \"MM5\"],  [\"register\", \"MM6\"],  [\"register\", \"MM7\"],\r\n\t[\"register\", \"XMM0\"], [\"register\", \"XMM1\"], [\"register\", \"XMM2\"], [\"register\", \"XMM3\"], [\"register\", \"XMM4\"], [\"register\", \"XMM5\"], [\"register\", \"XMM6\"], [\"register\", \"XMM7\"],\r\n\r\n\t[\"register\", \"RAX\"],  [\"register\", \"RBX\"],  [\"register\", \"RCX\"],  [\"register\", \"RDX\"],\r\n\t[\"register\", \"BPL\"],  [\"register\", \"RBP\"],\r\n\t[\"register\", \"SPL\"],  [\"register\", \"RSP\"],\r\n\t[\"register\", \"DIL\"],  [\"register\", \"RDI\"],\r\n\t[\"register\", \"SIL\"],  [\"register\", \"RSI\"],\r\n\t[\"register\", \"R8B\"],  [\"register\", \"R8W\"],  [\"register\", \"R8D\"],  [\"register\", \"R8\"],\r\n\t[\"register\", \"R9B\"],  [\"register\", \"R9W\"],  [\"register\", \"R9D\"],  [\"register\", \"R9\"],\r\n\t[\"register\", \"R10B\"], [\"register\", \"R10W\"], [\"register\", \"R10D\"], [\"register\", \"R10\"],\r\n\t[\"register\", \"R11B\"], [\"register\", \"R11W\"], [\"register\", \"R11D\"], [\"register\", \"R11\"],\r\n\t[\"register\", \"R12B\"], [\"register\", \"R12W\"], [\"register\", \"R12D\"], [\"register\", \"R12\"],\r\n\t[\"register\", \"R13B\"], [\"register\", \"R13W\"], [\"register\", \"R13D\"], [\"register\", \"R13\"],\r\n\t[\"register\", \"R14B\"], [\"register\", \"R14W\"], [\"register\", \"R14D\"], [\"register\", \"R14\"],\r\n\t[\"register\", \"R15B\"], [\"register\", \"R15W\"], [\"register\", \"R15D\"], [\"register\", \"R15\"],\r\n\t[\"register\", \"XMM8\"], [\"register\", \"XMM9\"], [\"register\", \"XMM10\"], [\"register\", \"XMM11\"], [\"register\", \"XMM12\"], [\"register\", \"XMM13\"], [\"register\", \"XMM14\"], [\"register\", \"XMM15\"],\r\n\t[\"register\", \"YMM0\"], [\"register\", \"YMM1\"], [\"register\", \"YMM2\"],  [\"register\", \"YMM3\"],  [\"register\", \"YMM4\"],  [\"register\", \"YMM5\"],  [\"register\", \"YMM6\"],  [\"register\", \"YMM7\"],\r\n\t[\"register\", \"YMM8\"], [\"register\", \"YMM9\"], [\"register\", \"YMM10\"], [\"register\", \"YMM11\"], [\"register\", \"YMM12\"], [\"register\", \"YMM13\"], [\"register\", \"YMM14\"], [\"register\", \"YMM15\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Iasm registers."
  },
  {
    "path": "tests/languages/d/string_feature.test",
    "content": "r\"\" x\"\"\r\nr\"fo\\\"o\"c x\"00 FBCD\"w r\"baz\"d\r\n\r\nq\"[fo\"o\r\nbar]\"\r\nq\"(fo\"o\r\nbar)\"\r\nq\"<fo\"o\r\nbar>\"\r\nq\"{fo\"o\r\nbar}\"\r\n\r\nq\"FOO\r\nBar \"baz\"\r\nFOO\"\r\n\r\nq\"/fo\"o\r\nbar/\"\r\nq\"|fo\"o\r\nbar|\"\r\n\r\n\"\"\r\n\"foo\"c \"bar\"w \"baz\"d\r\n\"fo\\\"o\r\nbar\"\r\n`foo`\r\n\r\nq{foo}\r\nq{ q{bar} }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"r\\\"\\\"\"],\r\n\t[\"string\", \"x\\\"\\\"\"],\r\n\r\n\t[\"string\", \"r\\\"fo\\\\\\\"o\\\"c\"],\r\n\t[\"string\", \"x\\\"00 FBCD\\\"w\"],\r\n\t[\"string\", \"r\\\"baz\\\"d\"],\r\n\r\n\t[\"string\", \"q\\\"[fo\\\"o\\r\\nbar]\\\"\"],\r\n\t[\"string\", \"q\\\"(fo\\\"o\\r\\nbar)\\\"\"],\r\n\t[\"string\", \"q\\\"<fo\\\"o\\r\\nbar>\\\"\"],\r\n\t[\"string\", \"q\\\"{fo\\\"o\\r\\nbar}\\\"\"],\r\n\r\n\t[\"string\", \"q\\\"FOO\\r\\nBar \\\"baz\\\"\\r\\nFOO\\\"\"],\r\n\r\n\t[\"string\", \"q\\\"/fo\\\"o\\r\\nbar/\\\"\"],\r\n\t[\"string\", \"q\\\"|fo\\\"o\\r\\nbar|\\\"\"],\r\n\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"c\"], [\"string\", \"\\\"bar\\\"w\"], [\"string\", \"\\\"baz\\\"d\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\r\\nbar\\\"\"],\r\n\t[\"string\", \"`foo`\"],\r\n\r\n\t[\"string\", \"q{foo}\"],\r\n\t[\"string\", \"q{ q{bar} }\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and token strings.\r\n"
  },
  {
    "path": "tests/languages/dart/class-name_feature.test",
    "content": "class Foo with ns.Bar {\r\n    const Foo(this.bar);\r\n\r\n    final Bar bar;\r\n\r\n    Baz<ns.Bat> baz(ns.Bat bat) {\r\n        return Baz<ns.Bat>(bat);\r\n    }\r\n\r\n}\r\n\r\nclass MyWidget extends SingleChildStatelessWidget {\r\n  MyWidget({Key key, Widget child}): super(key: key, child: child);\r\n\r\n  @override\r\n  Widget buildWithChild(BuildContext context, Widget child) {\r\n    return SomethingWidget(child: child);\r\n  }\r\n}\r\n\r\nvar copy = Foo.Bar.from(foo);\r\nID foo = something();\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"Foo\"]],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"class-name\", [\r\n\t\t[\"namespace\", [\r\n\t\t\t\"ns\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\"Bar\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", [\"Foo\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"bar\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"final\"], [\"class-name\", [\"Bar\"]], \" bar\", [\"punctuation\", \";\"],\r\n\r\n\t[\"class-name\", [\"Baz\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\r\n\t\t\t[\"namespace\", [\r\n\t\t\t\t\"ns\",\r\n\t\t\t\t[\"punctuation\", \".\"]\r\n\t\t\t]],\r\n\t\t\t\"Bat\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", \"baz\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t[\"namespace\", [\r\n\t\t\t\"ns\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\"Bat\"\r\n\t]],\r\n\t\" bat\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"class-name\", [\"Baz\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\r\n\t\t\t[\"namespace\", [\r\n\t\t\t\t\"ns\",\r\n\t\t\t\t[\"punctuation\", \".\"]\r\n\t\t\t]],\r\n\t\t\t\"Bat\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"bat\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"MyWidget\"]],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\"SingleChildStatelessWidget\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"class-name\", [\"MyWidget\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"class-name\", [\"Key\"]],\r\n\t\" key\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", [\"Widget\"]],\r\n\t\" child\",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"key\",\r\n\t[\"punctuation\", \":\"],\r\n\t\" key\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" child\",\r\n\t[\"punctuation\", \":\"],\r\n\t\" child\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"metadata\", \"@override\"],\r\n\r\n\t[\"class-name\", [\"Widget\"]],\r\n\t[\"function\", \"buildWithChild\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\"BuildContext\"]],\r\n\t\" context\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", [\"Widget\"]],\r\n\t\" child\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"class-name\", [\"SomethingWidget\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"child\",\r\n\t[\"punctuation\", \":\"],\r\n\t\" child\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t\" copy \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"class-name\", [\"Foo.Bar\"]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"from\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"class-name\", [\"ID\"]],\r\n\t\" foo \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"function\", \"something\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks class names and generics\r\n"
  },
  {
    "path": "tests/languages/dart/keyword_feature.test",
    "content": "async* sync* yield*\r\nabstract assert async await\r\nbreak case catch\r\nclass;\r\nconst\r\ncontinue covariant default deferred\r\ndo dynamic else enum\r\nexport extension external\r\nextends;\r\nfactory final finally for\r\nget hide if\r\nimplements;\r\ninterface;\r\nimport\r\nin\r\nlibrary\r\nmixin\r\nnew;\r\nnull\r\non operator part rethrow return\r\nset show static super switch sync this\r\nthrow try typedef var\r\nvoid while with yield\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"async*\"], [\"keyword\", \"sync*\"], [\"keyword\", \"yield*\"],\r\n\t[\"keyword\", \"abstract\"], [\"keyword\", \"assert\"], [\"keyword\", \"async\"], [\"keyword\", \"await\"],\r\n\t[\"keyword\", \"break\"], [\"keyword\", \"case\"], [\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"continue\"], [\"keyword\", \"covariant\"], [\"keyword\", \"default\"], [\"keyword\", \"deferred\"],\r\n\t[\"keyword\", \"do\"], [\"keyword\", \"dynamic\"], [\"keyword\", \"else\"], [\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"export\"], [\"keyword\", \"extension\"], [\"keyword\", \"external\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"factory\"], [\"keyword\", \"final\"], [\"keyword\", \"finally\"], [\"keyword\", \"for\"],\r\n\t[\"keyword\", \"get\"], [\"keyword\", \"hide\"], [\"keyword\", \"if\"],\r\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"in\"], [\"keyword\", \"library\"],\r\n\t[\"keyword\", \"mixin\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"on\"], [\"keyword\", \"operator\"], [\"keyword\", \"part\"], [\"keyword\", \"rethrow\"], [\"keyword\", \"return\"],\r\n\t[\"keyword\", \"set\"], [\"keyword\", \"show\"], [\"keyword\", \"static\"], [\"keyword\", \"super\"], [\"keyword\", \"switch\"],  [\"keyword\", \"sync\"], [\"keyword\", \"this\"],\r\n\t[\"keyword\", \"throw\"], [\"keyword\", \"try\"], [\"keyword\", \"typedef\"], [\"keyword\", \"var\"],\r\n\t[\"keyword\", \"void\"], [\"keyword\", \"while\"], [\"keyword\", \"with\"], [\"keyword\", \"yield\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/dart/metadata_feature.test",
    "content": "@deprecated\r\n@override\r\n@ToDo('seth', 'make this do something')\r\n\r\n@DataTable(\"sale_orders\")\r\nclass SaleOrder {\r\n  @DataColumn(\"sale_order_date\")\r\n  DateTime date;\r\n}\r\n\r\n@table\r\nclass Product {\r\n  @column\r\n  String name;\r\n}\r\n\r\nconst DataColumn column = const DataColumn();\r\n\r\nconst DataTable table = const DataTable();\r\n\r\nclass DataTable {\r\n  final String name;\r\n\r\n  const DataTable([this.name]);\r\n}\r\n\r\nclass DataColumn {\r\n  final String name;\r\n\r\n  const DataColumn([this.name]);\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"metadata\", \"@deprecated\"],\r\n\r\n\t[\"metadata\", \"@override\"],\r\n\r\n\t[\"metadata\", \"@ToDo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"'seth'\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"'make this do something'\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"metadata\", \"@DataTable\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"sale_orders\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"SaleOrder\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"metadata\", \"@DataColumn\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"sale_order_date\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"class-name\", [\"DateTime\"]],\r\n\t\" date\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"metadata\", \"@table\"],\r\n\t[\"keyword\", \"class\"], [\"class-name\", [\"Product\"]], [\"punctuation\", \"{\"],\r\n\t[\"metadata\", \"@column\"],\r\n\t[\"class-name\", [\"String\"]], \" name\", [\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", [\"DataColumn\"]],\r\n\t\" column \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", [\"DataColumn\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", [\"DataTable\"]],\r\n\t\" table \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", [\"DataTable\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"DataTable\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"final\"],\r\n\t[\"class-name\", [\"String\"]],\r\n\t\" name\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", [\"DataTable\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"name\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"DataColumn\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"final\"],\r\n\t[\"class-name\", [\"String\"]],\r\n\t\" name\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", [\"DataColumn\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"name\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for metadata.\r\n"
  },
  {
    "path": "tests/languages/dart/operator_feature.test",
    "content": "++ --\r\n* / % ~/\r\n+ - ! ~\r\n< << <= <<=\r\n> >> >= >>=\r\n& ^ | ?\r\nas is is!\r\n== != && ||\r\n= *= /= ~/=\r\n%= += -=\r\n&= ^= |=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"++\"], [\"operator\", \"--\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"%\"], [\"operator\", \"~/\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"!\"], [\"operator\", \"~\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<=\"], [\"operator\", \"<<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">=\"], [\"operator\", \">>=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"^\"], [\"operator\", \"|\"], [\"operator\", \"?\"],\r\n\t[\"operator\", \"as\"], [\"operator\", \"is\"], [\"operator\", \"is!\"],\r\n\t[\"operator\", \"==\"], [\"operator\", \"!=\"], [\"operator\", \"&&\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"*=\"], [\"operator\", \"/=\"], [\"operator\", \"~/=\"],\r\n\t[\"operator\", \"%=\"], [\"operator\", \"+=\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"&=\"], [\"operator\", \"^=\"], [\"operator\", \"|=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/dart/string_feature.test",
    "content": "\"\" ''\r\nr\"\" r''\r\n\"\"\"\"\"\" ''''''\r\nr\"\"\"\"\"\" r''''''\r\n\"fo\\\"o\" 'fo\\'o'\r\n\"\"\"foo\r\nbar\"\"\"\r\n'''foo\r\nbar'''\r\n\r\n'$string has ${string.length} letters'\r\n\"cookie has ${cookie.number_of_chips} chips\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"''\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"r\\\"\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"r''\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"\\\"\\\"\\\"\\\"\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"''''''\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"r\\\"\\\"\\\"\\\"\\\"\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"r''''''\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"'fo\\\\'o'\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"\\\"\\\"foo\\r\\nbar\\\"\\\"\\\"\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"'''foo\\r\\nbar'''\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"'\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"expression\", [\"string\"]]\r\n\t\t]],\r\n\t\t[\"string\", \" has \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t\"string\",\r\n\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\"length\"\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \" letters'\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"cookie has \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t\"cookie\",\r\n\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\"number_of_chips\"\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \" chips\\\"\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single quoted and double quoted strings,\r\nmulti-line strings and \"raw\" strings.\r\n"
  },
  {
    "path": "tests/languages/dataweave/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\nCheck for boolean"
  },
  {
    "path": "tests/languages/dataweave/comment_feature.test",
    "content": "// Line comment \"\"\t\r\n\t/* Block comment */\r\n\t/**\r\n\t* MultiLine Comment\r\n\t**/\r\n/* \"\" */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// Line comment \\\"\\\"\\t\"],\r\n\t[\"comment\", \"/* Block comment */\"],\r\n\t[\"comment\", \"/**\\r\\n\\t* MultiLine Comment\\r\\n\\t**/\"],\r\n\t[\"comment\", \"/* \\\"\\\" */\"]\r\n]\r\n----------------------------------------------------\r\nCheck for comments"
  },
  {
    "path": "tests/languages/dataweave/dates_feature.test",
    "content": "|12-12-2001-T12:00:00|\r\n|12-12-2001-T12:00:00+03:00|\r\n|12-12-2001-T12:00:00Z|\r\n|12-12-2001|\r\n|12:00:00|\r\n|12:00:00Z|\r\n|12:00:00-03:00|\r\n|P1D|\r\n|P1Y1D|\r\n|P1Y1D2H3M5S|\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"date\", \"|12-12-2001-T12:00:00|\"],\r\n\t[\"date\", \"|12-12-2001-T12:00:00+03:00|\"],\r\n\t[\"date\", \"|12-12-2001-T12:00:00Z|\"],\r\n\t[\"date\", \"|12-12-2001|\"],\r\n\t[\"date\", \"|12:00:00|\"],\r\n\t[\"date\", \"|12:00:00Z|\"],\r\n\t[\"date\", \"|12:00:00-03:00|\"],\r\n\t[\"date\", \"|P1D|\"],\r\n\t[\"date\", \"|P1Y1D|\"],\r\n\t[\"date\", \"|P1Y1D2H3M5S|\"]\r\n]\r\n----------------------------------------------------\r\nCheck for date"
  },
  {
    "path": "tests/languages/dataweave/functions_feature.test",
    "content": "myfunction(a, b,123)\npayload.myFunction(1,2,3)\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"myfunction\"],\n\t[\"punctuation\", \"(\"],\n\t\"a\",\n\t[\"punctuation\", \",\"],\n\t\" b\",\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"123\"],\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\npayload\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"myFunction\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"3\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nCheck for functions\n"
  },
  {
    "path": "tests/languages/dataweave/keywords_feature.test",
    "content": "%dw 2.0\ninput payalod application/json\nns ns0 http://localhost.com\nvar a = 123\ntype T = String\nfun test(a: Number) = a + 123\noutput application/json\n---\n{} match {\n    case a is String -> x as String\n}\nupdate {\n    case a at .name ->\n}\nif(true or false and not true) do {\n\n}\nelse\npayload match {\n    case a is String ->  x as String\n}\n\nnull\nunless\nusing\n\n----------------------------------------------------\n\n[\n\t\"%dw \",\n\t[\"number\", \"2.0\"],\n\n\t[\"keyword\", \"input\"],\n\t\" payalod \",\n\t[\"mime-type\", \"application/json\"],\n\n\t[\"keyword\", \"ns\"],\n\t\" ns0 \",\n\t[\"url\", \"http://localhost.com\"],\n\n\t[\"keyword\", \"var\"],\n\t\" a \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"123\"],\n\n\t[\"keyword\", \"type\"],\n\t\" T \",\n\t[\"operator\", \"=\"],\n\t\" String\\r\\n\",\n\n\t[\"keyword\", \"fun\"],\n\t[\"function\", \"test\"],\n\t[\"punctuation\", \"(\"],\n\t[\"property\", \"a\"],\n\t[\"punctuation\", \":\"],\n\t\" Number\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=\"],\n\t\" a \",\n\t[\"operator\", \"+\"],\n\t[\"number\", \"123\"],\n\n\t[\"keyword\", \"output\"],\n\t[\"mime-type\", \"application/json\"],\n\n\t[\"operator\", \"---\"],\n\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"keyword\", \"match\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"case\"],\n\t\" a \",\n\t[\"keyword\", \"is\"],\n\t\" String \",\n\t[\"operator\", \"->\"],\n\t\" x \",\n\t[\"keyword\", \"as\"],\n\t\" String\\r\\n\",\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"update\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"case\"],\n\t\" a \",\n\t[\"keyword\", \"at\"],\n\t[\"punctuation\", \".\"],\n\t\"name \",\n\t[\"operator\", \"->\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"if\"],\n\t[\"punctuation\", \"(\"],\n\t[\"boolean\", \"true\"],\n\t[\"keyword\", \"or\"],\n\t[\"boolean\", \"false\"],\n\t[\"keyword\", \"and\"],\n\t[\"keyword\", \"not\"],\n\t[\"boolean\", \"true\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"do\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"else\"],\n\n\t\"\\r\\npayload \",\n\t[\"keyword\", \"match\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"case\"],\n\t\" a \",\n\t[\"keyword\", \"is\"],\n\t\" String \",\n\t[\"operator\", \"->\"],\n\t\"  x \",\n\t[\"keyword\", \"as\"],\n\t\" String\\r\\n\",\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"null\"],\n\t[\"keyword\", \"unless\"],\n\t[\"keyword\", \"using\"]\n]\n\n----------------------------------------------------\n\nCheck for keywords\n"
  },
  {
    "path": "tests/languages/dataweave/null_feature.test",
    "content": "null\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"null\"]\r\n]\r\n----------------------------------------------------\r\nCheck for null"
  },
  {
    "path": "tests/languages/dataweave/number_feature.test",
    "content": "0\r\n123\r\n3.14159\r\n5.0e8\r\n0.2E+2\r\n47e-5\r\n-1.23\r\n-2.34E33\r\n-4.34E-33\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"5.0e8\"],\r\n\t[\"number\", \"0.2E+2\"],\r\n\t[\"number\", \"47e-5\"],\r\n\t[\"number\", \"-1.23\"],\r\n\t[\"number\", \"-2.34E33\"],\r\n\t[\"number\", \"-4.34E-33\"]\r\n]\r\n----------------------------------------------------\r\nCheck for number"
  },
  {
    "path": "tests/languages/dataweave/operators_feature.test",
    "content": "a > b\nc < d\na = 1\na << 1\nb >> 2\nd <= 2\ne >= 3\nf != 4\ng ~= 4\nh == 1\n(a) -> 1\na ++ b\nc -- d\npayload.name!\npayload.name?\n\n----------------------------------------------------\n\n[\n\t\"a \",\n\t[\"operator\", \">\"],\n\t\" b\\r\\nc \",\n\t[\"operator\", \"<\"],\n\t\" d\\r\\na \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1\"],\n\n\t\"\\r\\na \",\n\t[\"operator\", \"<<\"],\n\t[\"number\", \"1\"],\n\n\t\"\\r\\nb \",\n\t[\"operator\", \">>\"],\n\t[\"number\", \"2\"],\n\n\t\"\\r\\nd \",\n\t[\"operator\", \"<=\"],\n\t[\"number\", \"2\"],\n\n\t\"\\r\\ne \",\n\t[\"operator\", \">=\"],\n\t[\"number\", \"3\"],\n\n\t\"\\r\\nf \",\n\t[\"operator\", \"!=\"],\n\t[\"number\", \"4\"],\n\n\t\"\\r\\ng \",\n\t[\"operator\", \"~=\"],\n\t[\"number\", \"4\"],\n\n\t\"\\r\\nh \",\n\t[\"operator\", \"==\"],\n\t[\"number\", \"1\"],\n\n\t[\"punctuation\", \"(\"],\n\t\"a\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"->\"],\n\t[\"number\", \"1\"],\n\n\t\"\\r\\na \",\n\t[\"operator\", \"++\"],\n\t\" b\\r\\nc \",\n\t[\"operator\", \"--\"],\n\t\" d\\r\\npayload\",\n\t[\"punctuation\", \".\"],\n\t\"name\",\n\t[\"operator\", \"!\"],\n\n\t\"\\r\\npayload\",\n\t[\"punctuation\", \".\"],\n\t\"name\",\n\t[\"operator\", \"?\"]\n]\n\n----------------------------------------------------\n\nCheck for operators\n"
  },
  {
    "path": "tests/languages/dataweave/property_feature.test",
    "content": "{\r\n\ta: 123,\r\n\t\"My Name\": true,\r\n\tt#test : true,\r\n\t\"test\" @(a: true): 2,\r\n\ttest#\"test\" @(a: true): 3\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"a\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"123\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"property\", \"\\\"My Name\\\"\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"property\", \"t#test\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"property\", \"\\\"test\\\"\"],\r\n\t[\"punctuation\", \"@\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"property\", \"a\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"property\", \"test#\\\"test\\\"\"],\r\n\t[\"punctuation\", \"@\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"property\", \"a\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"3\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n----------------------------------------------------\r\nCheck for properties"
  },
  {
    "path": "tests/languages/dataweave/regex_feature.test",
    "content": "/(asd)+?[a-Z]/\r\n/ /\r\n/\\w+\\/\\s*/\r\n/([0-1]?[0-9]):([0-5]?[0-9]):([0-5]?[0-9])/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"regex\", \"/(asd)+?[a-Z]/\"],\r\n\t[\"regex\", \"/ /\"],\r\n\t[\"regex\", \"/\\\\w+\\\\/\\\\s*/\"],\r\n\t[\"regex\", \"/([0-1]?[0-9]):([0-5]?[0-9]):([0-5]?[0-9])/\"]\r\n]\r\n----------------------------------------------------\r\nCheck for regex"
  },
  {
    "path": "tests/languages/dataweave/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n\"foo\\\"bar\\\"baz\"\r\n\"\\u2642\\\\\"\r\n`hello`\r\n'test'\r\n\"this is a multiline\r\ntest\r\nthat \r\ncan \r\nbe long\"\r\n\"This string \\r\\n Should also \\\\ \\t\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\\\\\"bar\\\\\\\"baz\\\"\"],\r\n\t[\"string\", \"\\\"\\\\u2642\\\\\\\\\\\"\"],\r\n\t[\"string\", \"`hello`\"],\r\n\t[\"string\", \"'test'\"],\r\n\t[\"string\", \"\\\"this is a multiline\\r\\ntest\\r\\nthat \\r\\ncan \\r\\nbe long\\\"\"],\r\n\t[\"string\", \"\\\"This string \\\\r\\\\n Should also \\\\\\\\ \\\\t\\\"\"]\r\n]\r\n----------------------------------------------------\r\nCheck for strings"
  },
  {
    "path": "tests/languages/dax/boolean_feature.test",
    "content": "TRUE\r\nFALSE\r\nNULL\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"TRUE\"],\r\n\t[\"boolean\", \"FALSE\"],\r\n\t[\"boolean\", \"NULL\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/dax/comment_feature.test",
    "content": "/**/\r\n/* foo\r\nbar */\r\n//\r\n// foo\r\n--\r\n-- foo\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foo\"],\r\n\t[\"comment\", \"--\"],\r\n\t[\"comment\", \"-- foo\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/dax/datafield_feature.test",
    "content": "'table'[field]\r\n'table name'[field]\r\n'ta\"\"ble'[field]\r\n'ta''ble'[field]\r\n'table'[field name]\r\n'table name'[field name]\r\ntable[field]\r\ntable[field name]\r\n'table'\r\n'こんにちは'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"data-field\", \"'table'[field]\"],\r\n\t[\"data-field\", \"'table name'[field]\"],\r\n\t[\"data-field\", \"'ta\\\"\\\"ble'[field]\"],\r\n\t[\"data-field\", \"'ta''ble'[field]\"],\r\n\t[\"data-field\", \"'table'[field name]\"],\r\n\t[\"data-field\", \"'table name'[field name]\"],\r\n\t[\"data-field\", \"table[field]\"],\r\n\t[\"data-field\", \"table[field name]\"],\r\n\t[\"data-field\", \"'table'\"],\r\n\t[\"data-field\", \"'こんにちは'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for datafield tokens."
  },
  {
    "path": "tests/languages/dax/function_feature.test",
    "content": "ABS (\r\nABS(\r\nACOS(\r\nACOSH(\r\nACOT(\r\nACOTH(\r\nADDCOLUMNS(\r\nADDMISSINGITEMS(\r\nALL(\r\nALLCROSSFILTERED(\r\nALLEXCEPT(\r\nALLNOBLANKROW(\r\nALLSELECTED(\r\nAND(\r\nAPPROXIMATEDISTINCTCOUNT(\r\nASIN(\r\nASINH(\r\nATAN(\r\nATANH(\r\nAVERAGE(\r\nAVERAGEA(\r\nAVERAGEX(\r\nBETA.DIST(\r\nBETA.INV(\r\nBLANK(\r\nCALCULATE(\r\nCALCULATETABLE(\r\nCALENDAR(\r\nCALENDARAUTO(\r\nCEILING(\r\nCHISQ.DIST(\r\nCHISQ.DIST.RT(\r\nCHISQ.INV(\r\nCHISQ.INV.RT(\r\nCLOSINGBALANCEMONTH(\r\nCLOSINGBALANCEQUARTER(\r\nCLOSINGBALANCEYEAR(\r\nCOALESCE(\r\nCOMBIN(\r\nCOMBINA(\r\nCOMBINEVALUES(\r\nCONCATENATE(\r\nCONCATENATEX(\r\nCONFIDENCE.NORM(\r\nCONFIDENCE.T(\r\nCONTAINS(\r\nCONTAINSROW(\r\nCONTAINSSTRING(\r\nCONTAINSSTRINGEXACT(\r\nCONVERT(\r\nCOS(\r\nCOSH(\r\nCOT(\r\nCOTH(\r\nCOUNT(\r\nCOUNTA(\r\nCOUNTAX(\r\nCOUNTBLANK(\r\nCOUNTROWS(\r\nCOUNTX(\r\nCROSSFILTER(\r\nCROSSJOIN(\r\nCURRENCY(\r\nCURRENTGROUP(\r\nCUSTOMDATA(\r\nDATATABLE(\r\nDATE(\r\nDATEADD(\r\nDATEDIFF(\r\nDATESBETWEEN(\r\nDATESINPERIOD(\r\nDATESMTD(\r\nDATESQTD(\r\nDATESYTD(\r\nDATEVALUE(\r\nDAY(\r\nDEGREES(\r\nDETAILROWS(\r\nDISTINCT(\r\nDISTINCTCOUNT(\r\nDISTINCTCOUNTNOBLANK(\r\nDIVIDE(\r\nEARLIER(\r\nEARLIEST(\r\nEDATE(\r\nENDOFMONTH(\r\nENDOFQUARTER(\r\nENDOFYEAR(\r\nEOMONTH(\r\nERROR(\r\nEVEN(\r\nEXACT(\r\nEXCEPT(\r\nEXP(\r\nEXPON.DIST(\r\nFACT(\r\nFALSE(\r\nFILTER(\r\nFILTERS(\r\nFIND(\r\nFIRSTDATE(\r\nFIRSTNONBLANK(\r\nFIRSTNONBLANKVALUE(\r\nFIXED(\r\nFLOOR(\r\nFORMAT(\r\nGCD(\r\nGENERATE(\r\nGENERATEALL(\r\nGENERATESERIES(\r\nGEOMEAN(\r\nGEOMEANX(\r\nGROUPBY(\r\nHASONEFILTER(\r\nHASONEVALUE(\r\nHOUR(\r\nIF(\r\nIF.EAGER(\r\nIFERROR(\r\nIGNORE(\r\nINT(\r\nINTERSECT(\r\nISBLANK(\r\nISCROSSFILTERED(\r\nISEMPTY(\r\nISERROR(\r\nISEVEN(\r\nISFILTERED(\r\nISINSCOPE(\r\nISLOGICAL(\r\nISNONTEXT(\r\nISNUMBER(\r\nISO.CEILING(\r\nISODD(\r\nISONORAFTER(\r\nISSELECTEDMEASURE(\r\nISSUBTOTAL(\r\nISTEXT(\r\nKEEPFILTERS(\r\nKEYWORDMATCH(\r\nLASTDATE(\r\nLASTNONBLANK(\r\nLASTNONBLANKVALUE(\r\nLCM(\r\nLEFT(\r\nLEN(\r\nLN(\r\nLOG(\r\nLOG10(\r\nLOOKUPVALUE(\r\nLOWER(\r\nMAX(\r\nMAXA(\r\nMAXX(\r\nMEDIAN(\r\nMEDIANX(\r\nMID(\r\nMIN(\r\nMINA(\r\nMINUTE(\r\nMINX(\r\nMOD(\r\nMONTH(\r\nMROUND(\r\nNATURALINNERJOIN(\r\nNATURALLEFTOUTERJOIN(\r\nNEXTDAY(\r\nNEXTMONTH(\r\nNEXTQUARTER(\r\nNEXTYEAR(\r\nNONVISUAL(\r\nNORM.DIST(\r\nNORM.INV(\r\nNORM.S.DIST(\r\nNORM.S.INV(\r\nNOT(\r\nNOW(\r\nODD(\r\nOPENINGBALANCEMONTH(\r\nOPENINGBALANCEQUARTER(\r\nOPENINGBALANCEYEAR(\r\nOR(\r\nPARALLELPERIOD(\r\nPATH(\r\nPATHCONTAINS(\r\nPATHITEM(\r\nPATHITEMREVERSE(\r\nPATHLENGTH(\r\nPERCENTILE.EXC(\r\nPERCENTILE.INC(\r\nPERCENTILEX.EXC(\r\nPERCENTILEX.INC(\r\nPERMUT(\r\nPI(\r\nPOISSON.DIST(\r\nPOWER(\r\nPREVIOUSDAY(\r\nPREVIOUSMONTH(\r\nPREVIOUSQUARTER(\r\nPREVIOUSYEAR(\r\nPRODUCT(\r\nPRODUCTX(\r\nQUARTER(\r\nQUOTIENT(\r\nRADIANS(\r\nRAND(\r\nRANDBETWEEN(\r\nRANK.EQ(\r\nRANKX(\r\nRELATED(\r\nRELATEDTABLE(\r\nREMOVEFILTERS(\r\nREPLACE(\r\nREPT(\r\nRIGHT(\r\nROLLUP(\r\nROLLUPADDISSUBTOTAL(\r\nROLLUPGROUP(\r\nROLLUPISSUBTOTAL(\r\nROUND(\r\nROUNDDOWN(\r\nROUNDUP(\r\nROW(\r\nSAMEPERIODLASTYEAR(\r\nSAMPLE(\r\nSEARCH(\r\nSECOND(\r\nSELECTCOLUMNS(\r\nSELECTEDMEASURE(\r\nSELECTEDMEASUREFORMATSTRING(\r\nSELECTEDMEASURENAME(\r\nSELECTEDVALUE(\r\nSIGN(\r\nSIN(\r\nSINH(\r\nSQRT(\r\nSQRTPI(\r\nSTARTOFMONTH(\r\nSTARTOFQUARTER(\r\nSTARTOFYEAR(\r\nSTDEV.P(\r\nSTDEV.S(\r\nSTDEVX.P(\r\nSTDEVX.S(\r\nSUBSTITUTE(\r\nSUBSTITUTEWITHINDEX(\r\nSUM(\r\nSUMMARIZE(\r\nSUMMARIZECOLUMNS(\r\nSUMX(\r\nSWITCH(\r\nT.DIST(\r\nT.DIST.2T(\r\nT.DIST.RT(\r\nT.INV(\r\nT.INV.2T(\r\nTAN(\r\nTANH(\r\nTIME(\r\nTIMEVALUE(\r\nTODAY(\r\nTOPN(\r\nTOPNPERLEVEL(\r\nTOPNSKIP(\r\nTOTALMTD(\r\nTOTALQTD(\r\nTOTALYTD(\r\nTREATAS(\r\nTRIM(\r\nTRUE(\r\nTRUNC(\r\nUNICHAR(\r\nUNICODE(\r\nUNION(\r\nUPPER(\r\nUSERELATIONSHIP(\r\nUSERNAME(\r\nUSEROBJECTID(\r\nUSERPRINCIPALNAME(\r\nUTCNOW(\r\nUTCTODAY(\r\nVALUE(\r\nVALUES(\r\nVAR.P(\r\nVAR.S(\r\nVARX.P(\r\nVARX.S(\r\nWEEKDAY(\r\nWEEKNUM(\r\nXIRR(\r\nXNPV(\r\nYEAR(\r\nYEARFRAC(\r\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"ABS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ABS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ACOS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ACOSH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ACOT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ACOTH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ADDCOLUMNS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ADDMISSINGITEMS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ALL\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ALLCROSSFILTERED\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ALLEXCEPT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ALLNOBLANKROW\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ALLSELECTED\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"AND\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"APPROXIMATEDISTINCTCOUNT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ASIN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ASINH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ATAN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ATANH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"AVERAGE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"AVERAGEA\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"AVERAGEX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"BETA.DIST\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"BETA.INV\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"BLANK\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CALCULATE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CALCULATETABLE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CALENDAR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CALENDARAUTO\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CEILING\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CHISQ.DIST\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CHISQ.DIST.RT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CHISQ.INV\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CHISQ.INV.RT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CLOSINGBALANCEMONTH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CLOSINGBALANCEQUARTER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CLOSINGBALANCEYEAR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COALESCE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COMBIN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COMBINA\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COMBINEVALUES\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CONCATENATE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CONCATENATEX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CONFIDENCE.NORM\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CONFIDENCE.T\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CONTAINS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CONTAINSROW\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CONTAINSSTRING\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CONTAINSSTRINGEXACT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CONVERT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COSH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COTH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COUNT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COUNTA\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COUNTAX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COUNTBLANK\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COUNTROWS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"COUNTX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CROSSFILTER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CROSSJOIN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CURRENCY\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CURRENTGROUP\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"CUSTOMDATA\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DATATABLE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DATE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DATEADD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DATEDIFF\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DATESBETWEEN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DATESINPERIOD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DATESMTD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DATESQTD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DATESYTD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DATEVALUE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DAY\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DEGREES\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DETAILROWS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DISTINCT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DISTINCTCOUNT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DISTINCTCOUNTNOBLANK\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"DIVIDE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"EARLIER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"EARLIEST\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"EDATE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ENDOFMONTH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ENDOFQUARTER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ENDOFYEAR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"EOMONTH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ERROR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"EVEN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"EXACT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"EXCEPT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"EXP\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"EXPON.DIST\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"FACT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"FALSE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"FILTER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"FILTERS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"FIND\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"FIRSTDATE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"FIRSTNONBLANK\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"FIRSTNONBLANKVALUE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"FIXED\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"FLOOR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"FORMAT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"GCD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"GENERATE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"GENERATEALL\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"GENERATESERIES\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"GEOMEAN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"GEOMEANX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"GROUPBY\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"HASONEFILTER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"HASONEVALUE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"HOUR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"IF\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"IF.EAGER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"IFERROR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"IGNORE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"INT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"INTERSECT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISBLANK\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISCROSSFILTERED\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISEMPTY\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISERROR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISEVEN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISFILTERED\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISINSCOPE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISLOGICAL\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISNONTEXT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISNUMBER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISO.CEILING\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISODD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISONORAFTER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISSELECTEDMEASURE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISSUBTOTAL\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ISTEXT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"KEEPFILTERS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"KEYWORDMATCH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"LASTDATE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"LASTNONBLANK\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"LASTNONBLANKVALUE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"LCM\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"LEFT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"LEN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"LN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"LOG\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"LOG10\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"LOOKUPVALUE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"LOWER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MAX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MAXA\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MAXX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MEDIAN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MEDIANX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MID\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MIN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MINA\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MINUTE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MINX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MOD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MONTH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"MROUND\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NATURALINNERJOIN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NATURALLEFTOUTERJOIN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NEXTDAY\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NEXTMONTH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NEXTQUARTER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NEXTYEAR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NONVISUAL\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NORM.DIST\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NORM.INV\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NORM.S.DIST\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NORM.S.INV\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NOT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"NOW\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ODD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"OPENINGBALANCEMONTH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"OPENINGBALANCEQUARTER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"OPENINGBALANCEYEAR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"OR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PARALLELPERIOD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PATH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PATHCONTAINS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PATHITEM\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PATHITEMREVERSE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PATHLENGTH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PERCENTILE.EXC\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PERCENTILE.INC\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PERCENTILEX.EXC\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PERCENTILEX.INC\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PERMUT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PI\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"POISSON.DIST\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"POWER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PREVIOUSDAY\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PREVIOUSMONTH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PREVIOUSQUARTER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PREVIOUSYEAR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PRODUCT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"PRODUCTX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"QUARTER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"QUOTIENT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"RADIANS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"RAND\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"RANDBETWEEN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"RANK.EQ\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"RANKX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"RELATED\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"RELATEDTABLE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"REMOVEFILTERS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"REPLACE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"REPT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"RIGHT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ROLLUP\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ROLLUPADDISSUBTOTAL\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ROLLUPGROUP\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ROLLUPISSUBTOTAL\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ROUND\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ROUNDDOWN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ROUNDUP\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"ROW\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SAMEPERIODLASTYEAR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SAMPLE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SEARCH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SECOND\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SELECTCOLUMNS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SELECTEDMEASURE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SELECTEDMEASUREFORMATSTRING\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SELECTEDMEASURENAME\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SELECTEDVALUE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SIGN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SIN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SINH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SQRT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SQRTPI\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"STARTOFMONTH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"STARTOFQUARTER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"STARTOFYEAR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"STDEV.P\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"STDEV.S\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"STDEVX.P\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"STDEVX.S\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SUBSTITUTE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SUBSTITUTEWITHINDEX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SUM\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SUMMARIZE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SUMMARIZECOLUMNS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SUMX\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"SWITCH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"T.DIST\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"T.DIST.2T\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"T.DIST.RT\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"T.INV\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"T.INV.2T\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TAN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TANH\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TIME\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TIMEVALUE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TODAY\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TOPN\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TOPNPERLEVEL\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TOPNSKIP\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TOTALMTD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TOTALQTD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TOTALYTD\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TREATAS\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TRIM\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TRUE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"TRUNC\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"UNICHAR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"UNICODE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"UNION\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"UPPER\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"USERELATIONSHIP\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"USERNAME\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"USEROBJECTID\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"USERPRINCIPALNAME\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"UTCNOW\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"UTCTODAY\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"VALUE\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"VALUES\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"VAR.P\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"VAR.S\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"VARX.P\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"VARX.S\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"WEEKDAY\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"WEEKNUM\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"XIRR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"XNPV\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"YEAR\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"YEARFRAC\"], [\"punctuation\",\"(\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/dax/keyword_feature.test",
    "content": "DEFINE\r\nMEASURE\r\nEVALUATE\r\nORDER BY\r\nORDER\tBY\r\nORDER\r\nBY\r\nRETURN\r\nVAR\r\nSTART AT\r\nSTART\tAT\r\nSTART\r\nAT\r\nASC\r\nDESC\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"DEFINE\"],\r\n\t[\"keyword\", \"MEASURE\"],\r\n\t[\"keyword\", \"EVALUATE\"],\r\n\t[\"keyword\", \"ORDER BY\"],\r\n\t[\"keyword\", \"ORDER\\tBY\"],\r\n\t[\"keyword\", \"ORDER\\r\\nBY\"],\t\r\n\t[\"keyword\", \"RETURN\"],\r\n\t[\"keyword\", \"VAR\"],\r\n\t[\"keyword\", \"START AT\"],\r\n\t[\"keyword\", \"START\\tAT\"],\t\r\n\t[\"keyword\", \"START\\r\\nAT\"],\r\n\t[\"keyword\", \"ASC\"],\r\n\t[\"keyword\", \"DESC\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/dax/measure_feature.test",
    "content": "[measure]\r\n[measure name]\r\n[こんにちは]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"measure\", \"[measure]\"],\r\n\t[\"measure\", \"[measure name]\"],\t\r\n\t[\"measure\", \"[こんにちは]\"]\t\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for measure tokens."
  },
  {
    "path": "tests/languages/dax/number_feature.test",
    "content": "42\r\n0.154\r\n.123\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"0.154\"],\r\n\t[\"number\", \".123\"]\t\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal numbers."
  },
  {
    "path": "tests/languages/dax/operator_feature.test",
    "content": "+ - * / ^\r\n= > >= < <= <> \r\n& && ||\r\n:=\r\n\r\nIN\r\nNOT\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"^\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<>\"],     \r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \":=\"],\r\n\r\n\t[\"operator\", \"IN\"],\r\n\t[\"operator\", \"NOT\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/dax/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n\"foo\r\nbar\"\r\n\"foo\"\"bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\\\"bar\\\"\"]\t\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/dhall/boolean_feature.test",
    "content": "False\nTrue\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"False\"],\n\t[\"boolean\", \"True\"]\n]\n\n----------------------------------------------------\n\nChecks for Bool literals.\n"
  },
  {
    "path": "tests/languages/dhall/builtin_feature.test",
    "content": "Some\nNone\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"Some\"],\n\t[\"builtin\", \"None\"]\n]\n"
  },
  {
    "path": "tests/languages/dhall/comment_feature.test",
    "content": "-- comment\n\n{-\n\tcomment\n\t{-\n\t\tnested comment\n\t-}\n-}\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"-- comment\"],\n\n\t[\"comment\", \"{-\\r\\n\\tcomment\\r\\n\\t{-\\r\\n\\t\\tnested comment\\r\\n\\t-}\\r\\n-}\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/dhall/env_feature.test",
    "content": "env:DHALL_PRELUDE\nenv:\"Quotes variable\"\n\n----------------------------------------------------\n\n[\n\t[\"env\", [\n\t\t[\"function\", \"env\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"variable\", \"DHALL_PRELUDE\"]\n\t]],\n\t[\"env\", [\n\t\t[\"function\", \"env\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"variable\", \"\\\"Quotes variable\\\"\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for environment variables.\n"
  },
  {
    "path": "tests/languages/dhall/hash_feature.test",
    "content": "sha256:33f7f4c3aff62e5ecf4848f964363133452d420dcde045784518fb59fa970037\n\n----------------------------------------------------\n\n[\n\t[\"hash\", [\n\t\t[\"function\", \"sha256\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"number\", \"33f7f4c3aff62e5ecf4848f964363133452d420dcde045784518fb59fa970037\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for sha256 hashes.\n"
  },
  {
    "path": "tests/languages/dhall/keyword_feature.test",
    "content": "as\nassert\nelse\nforall\nif\nin\nlet\nmerge\nmissing\nthen\ntoMap\nusing\nwith\n\n∀\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"as\"],\n\t[\"keyword\", \"assert\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"forall\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"let\"],\n\t[\"keyword\", \"merge\"],\n\t[\"keyword\", \"missing\"],\n\t[\"keyword\", \"then\"],\n\t[\"keyword\", \"toMap\"],\n\t[\"keyword\", \"using\"],\n\t[\"keyword\", \"with\"],\n\n\t[\"keyword\", \"∀\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/dhall/label_feature.test",
    "content": "`\"foo\"'s 123`\n\n----------------------------------------------------\n\n[\n\t[\"label\", \"`\\\"foo\\\"'s 123`\"]\n]\n\n----------------------------------------------------\n\nChecks for escaped labels.\n"
  },
  {
    "path": "tests/languages/dhall/number_feature.test",
    "content": "0\n123\n123e-5\n-123e+2\n123.456\n+123.456e-7\n0xFF\n-0xFF\n+0xFF\n\nInfinity\n-Infinity\nNaN\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"123\"],\n\t[\"number\", \"123e-5\"],\n\t[\"number\", \"-123e+2\"],\n\t[\"number\", \"123.456\"],\n\t[\"number\", \"+123.456e-7\"],\n\t[\"number\", \"0xFF\"],\n\t[\"number\", \"-0xFF\"],\n\t[\"number\", \"+0xFF\"],\n\n\t[\"number\", \"Infinity\"],\n\t[\"number\", \"-Infinity\"],\n\t[\"number\", \"NaN\"]\n]\n\n----------------------------------------------------\n\nChecks for numeric literals.\n"
  },
  {
    "path": "tests/languages/dhall/operator_feature.test",
    "content": "/\\ //\\\\ && || != == == // -> ++ ::\n\n+ * # | = : ? < > | \\\n\n∧ ⩓ ≡ ⫽ λ →\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"/\\\\\"],\n\t[\"operator\", \"//\\\\\\\\\"],\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"//\"],\n\t[\"operator\", \"->\"],\n\t[\"operator\", \"++\"],\n\t[\"operator\", \"::\"],\n\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"#\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \":\"],\n\t[\"operator\", \"?\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"\\\\\"],\n\n\t[\"operator\", \"∧\"],\n\t[\"operator\", \"⩓\"],\n\t[\"operator\", \"≡\"],\n\t[\"operator\", \"⫽\"],\n\t[\"operator\", \"λ\"],\n\t[\"operator\", \"→\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/dhall/punctuation_feature.test",
    "content": ". .. /\n\n{ } [ ] ( ) ,\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \"..\"],\n\t[\"punctuation\", \"/\"],\n\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/dhall/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"\\\"\"\n\n\"foo/${bar}\"\n\n''foo''\n''bar'''baz''\n\n''\nfoo/${bar}\n''\n\n----------------------------------------------------\n\n[\n\t[\"string\", [\"\\\"\\\"\"]],\n\t[\"string\", [\"\\\"foo\\\"\"]],\n\t[\"string\", [\"\\\"\\\\\\\"\\\"\"]],\n\n\t[\"string\", [\n\t\t\"\\\"foo/\",\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"${\"],\n\t\t\t[\"expression\", [\"bar\"]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t\"\\\"\"\n\t]],\n\n\t[\"string\", [\"''foo''\"]],\n\t[\"string\", [\"''bar'''baz''\"]],\n\n\t[\"string\", [\n\t\t\"''\\r\\nfoo/\",\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"${\"],\n\t\t\t[\"expression\", [\"bar\"]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\n\t\t\"\\r\\n''\"\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/dhall/url_feature.test",
    "content": "https://prelude.dhall-lang.org/Natural/sum\n\n----------------------------------------------------\n\n[\n\t[\"url\", \"https://prelude.dhall-lang.org/Natural/sum\"]\n]\n\n----------------------------------------------------\n\nChecks for URL literals.\n"
  },
  {
    "path": "tests/languages/diff/coord_feature.test",
    "content": "7c7\r\n\r\n*** 4,8 ****\r\n--- 4,8 ----\r\n\r\n@@ -4,5 +4,5 @@\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"coord\", \"7c7\"],\r\n\r\n\t[\"coord\", \"*** 4,8 ****\"],\r\n\t[\"coord\", \"--- 4,8 ----\"],\r\n\r\n\t[\"coord\", \"@@ -4,5 +4,5 @@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for coords."
  },
  {
    "path": "tests/languages/diff/diff_feature.test",
    "content": "!     qt: core\r\n\r\n  unchanged\r\n\r\n-    qt: core\r\n+    qt: core gui\r\n\r\n< qt: core\r\n> qt: core quick\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"diff\", [\r\n\t\t[\"prefix\", \"!\"],\r\n\t\t\"     qt: core\\r\\n\"\r\n\t]],\r\n\r\n\t[\"unchanged\", [\r\n\t\t[\"prefix\", \" \"],\r\n\t\t\" unchanged\\r\\n\"\r\n\t]],\r\n\r\n\t[\"deleted-sign\", [\r\n\t\t[\"prefix\", \"-\"],\r\n\t\t\"    qt: core\\r\\n\"\r\n\t]],\r\n\t[\"inserted-sign\", [\r\n\t\t[\"prefix\", \"+\"],\r\n\t\t\"    qt: core gui\\r\\n\"\r\n\t]],\r\n\r\n\t[\"deleted-arrow\", [\r\n\t\t[\"prefix\", \"<\"],\r\n\t\t\" qt: core\\r\\n\"\r\n\t]],\r\n\t[\"inserted-arrow\", [\r\n\t\t[\"prefix\", \">\"],\r\n\t\t\" qt: core quick\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for deleted, inserted and different lines.\r\n"
  },
  {
    "path": "tests/languages/django/boolean_feature.test",
    "content": "{% true false none True False None %}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"true\"],\r\n\t\t[\"boolean\", \"false\"],\r\n\t\t[\"boolean\", \"none\"],\r\n\t\t[\"boolean\", \"True\"],\r\n\t\t[\"boolean\", \"False\"],\r\n\t\t[\"boolean\", \"None\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans and none."
  },
  {
    "path": "tests/languages/django/comment_feature.test",
    "content": "{##}\r\n{# This a Django template example #}\r\n{# Multi-line\r\ncomment #}\r\n{# {{ }} {% %} #}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"django\", [\r\n\t\t[\"comment\", \"{##}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"comment\", \"{# This a Django template example #}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"comment\", \"{# Multi-line\\r\\ncomment #}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"comment\", \"{# {{ }} {% %} #}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/django/delimiter_feature.test",
    "content": "{%%}\r\n{%+ %}\r\n{%- -%}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%+\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%-\"],\r\n\t\t[\"delimiter\", \"-%}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for delimiters."
  },
  {
    "path": "tests/languages/django/filter_feature.test",
    "content": "{{ foo|cut|bar:5 }}\r\n{{ foo|bar('baz') }}\r\n\r\n{{ my_date|date:\"Y-m-d\" }}\r\n{{ value|truncatechars:9 }}\r\n{{ name|striptags|title }}\r\n{{ listx|join(', ') }}\r\n{{ \"%s - %s\"|format(\"Hello?\", \"Foo!\") }}\r\n{{ users|join(', ', attribute='username') }}\r\n{{ mytext|urlize(40, true) }}\r\n{{ [1, 2, -3]|max }}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"cut\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"bar\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"5\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"bar\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"'baz'\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"my_date\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"date\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"string\", \"\\\"Y-m-d\\\"\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"value\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"truncatechars\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"9\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"name\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"striptags\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"title\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"listx\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"join\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"', '\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", \"\\\"%s - %s\\\"\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"format\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"\\\"Hello?\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"string\", \"\\\"Foo!\\\"\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"users\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"join\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"', '\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"variable\", \"attribute\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"'username'\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"mytext\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"urlize\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"40\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"operator\", \"-\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"filter\", \"max\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for filters."
  },
  {
    "path": "tests/languages/django/for-loop_feature.test",
    "content": "{% for value in values recursive %}\r\n    {% if loop.previtem is defined and value > loop.previtem %}\r\n        The value just increased!\r\n    {% endif %}\r\n    {{ value }}\r\n    {% if loop.nextitem is defined and loop.nextitem > value %}\r\n        The value will increase even more!\r\n    {% endif %}\r\n{% endfor %}\r\n\r\n{% for user in users if not user.hidden %}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"for\"],\r\n\t\t[\"variable\", \"value\"],\r\n\t\t[\"keyword\", \"in\"],\r\n\t\t[\"variable\", \"values\"],\r\n\t\t[\"keyword\", \"recursive\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"if\"],\r\n\t\t[\"keyword\", \"loop\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"previtem\"],\r\n\t\t[\"keyword\", \"is\"],\r\n\t\t[\"test\", \"defined\"],\r\n\t\t[\"keyword\", \"and\"],\r\n\t\t[\"variable\", \"value\"],\r\n\t\t[\"operator\", \">\"],\r\n\t\t[\"keyword\", \"loop\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"previtem\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t\"\\r\\n        The value just increased!\\r\\n    \",\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"endif\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"value\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"if\"],\r\n\t\t[\"keyword\", \"loop\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"nextitem\"],\r\n\t\t[\"keyword\", \"is\"],\r\n\t\t[\"test\", \"defined\"],\r\n\t\t[\"keyword\", \"and\"],\r\n\t\t[\"keyword\", \"loop\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"nextitem\"],\r\n\t\t[\"operator\", \">\"],\r\n\t\t[\"variable\", \"value\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t\"\\r\\n        The value will increase even more!\\r\\n    \",\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"endif\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"endfor\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"for\"],\r\n\t\t[\"variable\", \"user\"],\r\n\t\t[\"keyword\", \"in\"],\r\n\t\t[\"variable\", \"users\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"keyword\", \"not\"],\r\n\t\t[\"variable\", \"user\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"hidden\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for for-loop related features."
  },
  {
    "path": "tests/languages/django/function_feature.test",
    "content": "<img src=\"{{ static('path/to/company-logo.png') }}\" alt=\"Company Logo\">\r\n<a href=\"{{ url('admin:index') }}\">Administration</a>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"img\"]],\r\n\t\t[\"attr-name\", [\"src\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"django\", [\r\n\t\t\t\t[\"delimiter\", \"{{\"],\r\n\t\t\t\t[\"function\", \"static\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"string\", \"'path/to/company-logo.png'\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"delimiter\", \"}}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"alt\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"Company Logo\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"attr-name\", [\"href\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"django\", [\r\n\t\t\t\t[\"delimiter\", \"{{\"],\r\n\t\t\t\t[\"function\", \"url\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"string\", \"'admin:index'\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"delimiter\", \"}}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\"Administration\",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/django/keyword_feature.test",
    "content": "{% some_tag\r\n\r\nand\r\nas\r\nby\r\nelse\r\nfor\r\nif\r\nimport\r\nin\r\nis\r\nloop\r\nnot\r\nor\r\nrecursive\r\nwith\r\nwithout\r\n\r\n%}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"some_tag\"],\r\n\r\n\t\t[\"keyword\", \"and\"],\r\n\t\t[\"keyword\", \"as\"],\r\n\t\t[\"keyword\", \"by\"],\r\n\t\t[\"keyword\", \"else\"],\r\n\t\t[\"keyword\", \"for\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t[\"keyword\", \"in\"],\r\n\t\t[\"keyword\", \"is\"],\r\n\t\t[\"test\", \"loop\"],\r\n\t\t[\"keyword\", \"not\"],\r\n\t\t[\"keyword\", \"or\"],\r\n\t\t[\"keyword\", \"recursive\"],\r\n\t\t[\"keyword\", \"with\"],\r\n\t\t[\"keyword\", \"without\"],\r\n\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/django/operator_feature.test",
    "content": "{%\n\n+ - * / %\n+= -= *= /= %=\n** **=\n// //=\n== != < <= > >= <>\n=\n<< >>\n& | ^ ~\n\n%}\n\n----------------------------------------------------\n\n[\n\t[\"django\", [\n\t\t[\"delimiter\", \"{%\"],\n\n\t\t[\"operator\", \"+\"],\n\t\t[\"operator\", \"-\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"operator\", \"/\"],\n\t\t[\"operator\", \"%\"],\n\n\t\t[\"operator\", \"+=\"],\n\t\t[\"operator\", \"-=\"],\n\t\t[\"operator\", \"*=\"],\n\t\t[\"operator\", \"/=\"],\n\t\t[\"operator\", \"%=\"],\n\n\t\t[\"operator\", \"**\"],\n\t\t[\"operator\", \"**=\"],\n\n\t\t[\"operator\", \"//\"],\n\t\t[\"operator\", \"//=\"],\n\n\t\t[\"operator\", \"==\"],\n\t\t[\"operator\", \"!=\"],\n\t\t[\"operator\", \"<\"],\n\t\t[\"operator\", \"<=\"],\n\t\t[\"operator\", \">\"],\n\t\t[\"operator\", \">=\"],\n\t\t[\"operator\", \"<>\"],\n\n\t\t[\"operator\", \"=\"],\n\n\t\t[\"operator\", \"<<\"],\n\t\t[\"operator\", \">>\"],\n\n\t\t[\"operator\", \"&\"],\n\t\t[\"operator\", \"|\"],\n\t\t[\"operator\", \"^\"],\n\t\t[\"operator\", \"~\"],\n\n\t\t[\"delimiter\", \"%}\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/django/tag_feature.test",
    "content": "{% block %}\r\n{% endif %}\r\n{% foo %}\r\n{% foo_bar some.variable %}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"block\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"endif\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"foo\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"foo_bar\"],\r\n\t\t[\"variable\", \"some\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"variable\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags."
  },
  {
    "path": "tests/languages/django/test_feature.test",
    "content": "{% if foo is defined and bar is not baz %}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag\", \"if\"],\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"keyword\", \"is\"],\r\n\t\t[\"test\", \"defined\"],\r\n\t\t[\"keyword\", \"and\"],\r\n\t\t[\"variable\", \"bar\"],\r\n\t\t[\"keyword\", \"is\"],\r\n\t\t[\"keyword\", \"not\"],\r\n\t\t[\"test\", \"baz\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tests."
  },
  {
    "path": "tests/languages/django/variable_feature.test",
    "content": "{{ foo.bar['baz'] }}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"django\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"bar\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"string\", \"'baz'\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/django!+css/inclusion.test",
    "content": "<style>\r\na {\r\n{% if setColor %}\r\n\tcolor: {{ bar }};\r\n{% endif %}\r\n}\r\n</style>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"style\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"style\", [\r\n\t\t[\"language-css\", [\r\n\t\t\t[\"selector\", \"a\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t\t[\"django\", [\r\n\t\t\t\t[\"delimiter\", \"{%\"],\r\n\t\t\t\t[\"tag\", \"if\"],\r\n\t\t\t\t[\"variable\", \"setColor\"],\r\n\t\t\t\t[\"delimiter\", \"%}\"]\r\n\t\t\t]],\r\n\r\n\t\t\t[\"property\", \"color\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"django\", [\r\n\t\t\t\t[\"delimiter\", \"{{\"],\r\n\t\t\t\t[\"variable\", \"bar\"],\r\n\t\t\t\t[\"delimiter\", \"}}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t\t[\"django\", [\r\n\t\t\t\t[\"delimiter\", \"{%\"],\r\n\t\t\t\t[\"tag\", \"endif\"],\r\n\t\t\t\t[\"delimiter\", \"%}\"]\r\n\t\t\t]],\r\n\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"style\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Django/Jinja2 code inside <style> elements.\r\n"
  },
  {
    "path": "tests/languages/django!+javascript/inclusion.test",
    "content": "<script>\r\n{% if foo %}\r\nvar foo = {{ bar }};\r\n{% endif %}\r\n</script>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"script\", [\r\n\t\t[\"language-javascript\", [\r\n\t\t\t[\"django\", [\r\n\t\t\t\t[\"delimiter\", \"{%\"],\r\n\t\t\t\t[\"tag\", \"if\"],\r\n\t\t\t\t[\"variable\", \"foo\"],\r\n\t\t\t\t[\"delimiter\", \"%}\"]\r\n\t\t\t]],\r\n\r\n\t\t\t[\"keyword\", \"var\"],\r\n\t\t\t\" foo \",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"django\", [\r\n\t\t\t\t[\"delimiter\", \"{{\"],\r\n\t\t\t\t[\"variable\", \"bar\"],\r\n\t\t\t\t[\"delimiter\", \"}}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t\t[\"django\", [\r\n\t\t\t\t[\"delimiter\", \"{%\"],\r\n\t\t\t\t[\"tag\", \"endif\"],\r\n\t\t\t\t[\"delimiter\", \"%}\"]\r\n\t\t\t]]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Django/Jinja2 code inside <script> elements.\r\n"
  },
  {
    "path": "tests/languages/dns-zone-file/class_feature.test",
    "content": "IN\nCH\nCS\nHS\n\n----------------------------------------------------\n\n[\n\t[\"class\", \"IN\"],\n\t[\"class\", \"CH\"],\n\t[\"class\", \"CS\"],\n\t[\"class\", \"HS\"]\n]\n\n----------------------------------------------------\n\nChecks for all resource record classes.\n"
  },
  {
    "path": "tests/languages/dns-zone-file/comment_feature.test",
    "content": "; comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"; comment\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/dns-zone-file/string_feature.test",
    "content": "\"foo\"\n\"\\\"\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"\\\\\\\"\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/dns-zone-file/type_featrue.test",
    "content": "A\nA6\nAAAA\nAFSDB\nAPL\nATMA\nCAA\nCDNSKEY\nCDS\nCERT\nCNAME\nDHCID\nDLV\nDNAME\nDNSKEY\nDS\nEID\nGID\nGPOS\nHINFO\nHIP\nIPSECKEY\nISDN\nKEY\nKX\nLOC\nMAILA\nMAILB\nMB\nMD\nMF\nMG\nMINFO\nMR\nMX\nNAPTR\nNB\nNBSTAT\nNIMLOC\nNINFO\nNS\nNSAP\nNSAP-PTR\nNSEC\nNSEC3\nNSEC3PARAM\nNULL\nNXT\nOPENPGPKEY\nPTR\nPX\nRKEY\nRP\nRRSIG\nRT\nSIG\nSINK\nSMIMEA\nSOA\nSPF\nSRV\nSSHFP\nTA\nTKEY\nTLSA\nTSIG\nTXT\nUID\nUINFO\nUNSPEC\nURI\nWKS\nX25\n\n----------------------------------------------------\n\n[\n\t[\"type\", \"A\"],\n\t[\"type\", \"A6\"],\n\t[\"type\", \"AAAA\"],\n\t[\"type\", \"AFSDB\"],\n\t[\"type\", \"APL\"],\n\t[\"type\", \"ATMA\"],\n\t[\"type\", \"CAA\"],\n\t[\"type\", \"CDNSKEY\"],\n\t[\"type\", \"CDS\"],\n\t[\"type\", \"CERT\"],\n\t[\"type\", \"CNAME\"],\n\t[\"type\", \"DHCID\"],\n\t[\"type\", \"DLV\"],\n\t[\"type\", \"DNAME\"],\n\t[\"type\", \"DNSKEY\"],\n\t[\"type\", \"DS\"],\n\t[\"type\", \"EID\"],\n\t[\"type\", \"GID\"],\n\t[\"type\", \"GPOS\"],\n\t[\"type\", \"HINFO\"],\n\t[\"type\", \"HIP\"],\n\t[\"type\", \"IPSECKEY\"],\n\t[\"type\", \"ISDN\"],\n\t[\"type\", \"KEY\"],\n\t[\"type\", \"KX\"],\n\t[\"type\", \"LOC\"],\n\t[\"type\", \"MAILA\"],\n\t[\"type\", \"MAILB\"],\n\t[\"type\", \"MB\"],\n\t[\"type\", \"MD\"],\n\t[\"type\", \"MF\"],\n\t[\"type\", \"MG\"],\n\t[\"type\", \"MINFO\"],\n\t[\"type\", \"MR\"],\n\t[\"type\", \"MX\"],\n\t[\"type\", \"NAPTR\"],\n\t[\"type\", \"NB\"],\n\t[\"type\", \"NBSTAT\"],\n\t[\"type\", \"NIMLOC\"],\n\t[\"type\", \"NINFO\"],\n\t[\"type\", \"NS\"],\n\t[\"type\", \"NSAP\"],\n\t[\"type\", \"NSAP-PTR\"],\n\t[\"type\", \"NSEC\"],\n\t[\"type\", \"NSEC3\"],\n\t[\"type\", \"NSEC3PARAM\"],\n\t[\"type\", \"NULL\"],\n\t[\"type\", \"NXT\"],\n\t[\"type\", \"OPENPGPKEY\"],\n\t[\"type\", \"PTR\"],\n\t[\"type\", \"PX\"],\n\t[\"type\", \"RKEY\"],\n\t[\"type\", \"RP\"],\n\t[\"type\", \"RRSIG\"],\n\t[\"type\", \"RT\"],\n\t[\"type\", \"SIG\"],\n\t[\"type\", \"SINK\"],\n\t[\"type\", \"SMIMEA\"],\n\t[\"type\", \"SOA\"],\n\t[\"type\", \"SPF\"],\n\t[\"type\", \"SRV\"],\n\t[\"type\", \"SSHFP\"],\n\t[\"type\", \"TA\"],\n\t[\"type\", \"TKEY\"],\n\t[\"type\", \"TLSA\"],\n\t[\"type\", \"TSIG\"],\n\t[\"type\", \"TXT\"],\n\t[\"type\", \"UID\"],\n\t[\"type\", \"UINFO\"],\n\t[\"type\", \"UNSPEC\"],\n\t[\"type\", \"URI\"],\n\t[\"type\", \"WKS\"],\n\t[\"type\", \"X25\"]\n]\n\n----------------------------------------------------\n\nChecks for all resource record types.\n"
  },
  {
    "path": "tests/languages/dns-zone-file/variable_feature.test",
    "content": "$ORIGIN foo.bar.com\n@\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"$ORIGIN\"],\n\t[\"variable\", \"foo.bar.com\"],\n\t[\"variable\", \"@\"]\n]\n\n----------------------------------------------------\n\nChecks for variables.\n"
  },
  {
    "path": "tests/languages/docker/comment_feature.test",
    "content": "#\r\n# foobar\r\n# \"foo\" 'bar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"],\r\n\t[\"comment\", \"# \\\"foo\\\" 'bar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/docker/instruction_feature.test",
    "content": "RUN apt-get \\\r\nupdate && apt-get \\\r\n#comment\r\n#\r\n\\\r\n\\\r\n\r\n\r\ninstall git -y #not-a-comment \\\r\nsomething\r\n\r\nRUN echo hello \\\r\n# comment\r\nworld\r\n\r\n        # this is a comment-line\r\n    RUN echo hello\r\nRUN echo world\r\n\r\nRUN echo \"\\\r\n     hello\\\r\n     world\"\r\n\r\nLABEL multi.label1=\"value1\" \\\r\n      multi.label2=\"value2\" \\\r\n      other=\"value3\"\r\n\r\nEXPOSE 80/udp\r\n\r\nENV MY_NAME=\"John Doe\"\r\nENV MY_NAME=\"John Doe\" MY_DOG=Rex\\ The\\ Dog \\\r\n    MY_CAT=fluffy\r\n\r\nADD hom?.txt /mydir/\r\n\r\nENTRYPOINT [\"executable\", \"param1\", \"param2\"]\r\n\r\nFROM debian:stable\r\nRUN apt-get update && apt-get install -y --force-yes apache2\r\nEXPOSE 80 443\r\nVOLUME [\"/var/www\", \"/var/log/apache2\", \"/etc/apache2\"]\r\nENTRYPOINT [\"/usr/sbin/apache2ctl\", \"-D\", \"FOREGROUND\"]\r\n\r\nENTRYPOINT [ \"/path/myprocess\", \\\r\n             \"arg1\",            \\\r\n             \"arg2\"             \\\r\n]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"], \" apt-get \", [\"operator\", \"\\\\\"],\r\n\t\t\"\\r\\nupdate && apt-get \", [\"operator\", \"\\\\\"],\r\n\t\t[\"comment\", \"#comment\"],\r\n\t\t[\"comment\", \"#\"],\r\n\t\t[\"operator\", \"\\\\\"],\r\n\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t\"\\r\\n\\r\\n\\r\\ninstall git -y #not-a-comment \", [\"operator\", \"\\\\\"],\r\n\t\t\"\\r\\nsomething\"\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"], \" echo hello \", [\"operator\", \"\\\\\"],\r\n\t\t[\"comment\", \"# comment\"],\r\n\t\t\"\\r\\nworld\"\r\n\t]],\r\n\r\n\t[\"comment\", \"# this is a comment-line\"],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" echo hello\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" echo world\"\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" echo \",\r\n\t\t[\"string\", \"\\\"\\\\\\r\\n     hello\\\\\\r\\n     world\\\"\"]\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"LABEL\"],\r\n\t\t\" multi.label1=\",\r\n\t\t[\"string\", \"\\\"value1\\\"\"],\r\n\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t\"\\r\\n      multi.label2=\",\r\n\t\t[\"string\", \"\\\"value2\\\"\"],\r\n\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t\"\\r\\n      other=\",\r\n\t\t[\"string\", \"\\\"value3\\\"\"]\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"EXPOSE\"],\r\n\t\t\" 80/udp\"\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ENV\"],\r\n\t\t\" MY_NAME=\",\r\n\t\t[\"string\", \"\\\"John Doe\\\"\"]\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ENV\"],\r\n\t\t\" MY_NAME=\",\r\n\t\t[\"string\", \"\\\"John Doe\\\"\"],\r\n\t\t\" MY_DOG=Rex\\\\ The\\\\ Dog \",\r\n\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t\"\\r\\n    MY_CAT=fluffy\"\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ADD\"],\r\n\t\t\" hom?.txt /mydir/\"\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ENTRYPOINT\"],\r\n\t\t\" [\",\r\n\t\t[\"string\", \"\\\"executable\\\"\"],\r\n\t\t\", \",\r\n\t\t[\"string\", \"\\\"param1\\\"\"],\r\n\t\t\", \",\r\n\t\t[\"string\", \"\\\"param2\\\"\"],\r\n\t\t\"]\"\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"FROM\"],\r\n\t\t\" debian:stable\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" apt-get update && apt-get install -y --force-yes apache2\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"EXPOSE\"],\r\n\t\t\" 80 443\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"VOLUME\"],\r\n\t\t\" [\",\r\n\t\t[\"string\", \"\\\"/var/www\\\"\"],\r\n\t\t\", \",\r\n\t\t[\"string\", \"\\\"/var/log/apache2\\\"\"],\r\n\t\t\", \",\r\n\t\t[\"string\", \"\\\"/etc/apache2\\\"\"],\r\n\t\t\"]\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ENTRYPOINT\"],\r\n\t\t\" [\",\r\n\t\t[\"string\", \"\\\"/usr/sbin/apache2ctl\\\"\"],\r\n\t\t\", \",\r\n\t\t[\"string\", \"\\\"-D\\\"\"],\r\n\t\t\", \",\r\n\t\t[\"string\", \"\\\"FOREGROUND\\\"\"],\r\n\t\t\"]\"\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ENTRYPOINT\"],\r\n\t\t\" [ \",\r\n\t\t[\"string\", \"\\\"/path/myprocess\\\"\"],\r\n\t\t\", \",\r\n\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t[\"string\", \"\\\"arg1\\\"\"],\r\n\t\t\",            \",\r\n\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t[\"string\", \"\\\"arg2\\\"\"],\r\n\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t\"\\r\\n]\"\r\n\t]]\r\n]"
  },
  {
    "path": "tests/languages/docker/keyword_feature.test",
    "content": "ONBUILD ADD . /app/src\r\nFROM ubuntu\r\nFROM ubuntu AS build\r\nMAINTAINER SvenDowideit@home.org.au\r\nRUN cd /tmp\r\nEXPOSE 5900\r\nENV myName John Doe\r\nCOPY hom* /mydir/\r\nVOLUME /myvol\r\nUSER daemon\r\nWORKDIR /a\r\nHEALTHCHECK CMD echo \"foo\"\r\nHEALTHCHECK NONE\r\nLABEL version=\"1.0\"\r\nENTRYPOINT [\"top\", \"-b\"]\r\nARG user1\r\nSHELL [\"powershell\", \"-command\"]\r\nSTOPSIGNAL signal\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ONBUILD\"],\r\n\t\t[\"keyword\", \"ADD\"],\r\n\t\t\" . /app/src\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"FROM\"],\r\n\t\t\" ubuntu\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"FROM\"],\r\n\t\t\" ubuntu \",\r\n\t\t[\"keyword\", \"AS\"],\r\n\t\t\" build\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"MAINTAINER\"],\r\n\t\t\" SvenDowideit@home.org.au\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" cd /tmp\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"EXPOSE\"],\r\n\t\t\" 5900\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ENV\"],\r\n\t\t\" myName John Doe\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"COPY\"],\r\n\t\t\" hom* /mydir/\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"VOLUME\"],\r\n\t\t\" /myvol\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"USER\"],\r\n\t\t\" daemon\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"WORKDIR\"],\r\n\t\t\" /a\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"HEALTHCHECK\"],\r\n\t\t[\"keyword\", \"CMD\"],\r\n\t\t\" echo \",\r\n\t\t[\"string\", \"\\\"foo\\\"\"]\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"HEALTHCHECK\"],\r\n\t\t[\"keyword\", \"NONE\"]\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"LABEL\"],\r\n\t\t\" version=\",\r\n\t\t[\"string\", \"\\\"1.0\\\"\"]\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ENTRYPOINT\"],\r\n\t\t\" [\",\r\n\t\t[\"string\", \"\\\"top\\\"\"],\r\n\t\t\", \",\r\n\t\t[\"string\", \"\\\"-b\\\"\"],\r\n\t\t\"]\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ARG\"],\r\n\t\t\" user1\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"SHELL\"],\r\n\t\t\" [\",\r\n\t\t[\"string\", \"\\\"powershell\\\"\"],\r\n\t\t\", \",\r\n\t\t[\"string\", \"\\\"-command\\\"\"],\r\n\t\t\"]\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"STOPSIGNAL\"],\r\n\t\t\" signal\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/docker/options_feature.test",
    "content": "ADD --chown=1 files* /somedir/\r\nCOPY --chown=1 files* /somedir/\r\n\r\nHEALTHCHECK --interval=5m --timeout=3s \\\r\n  CMD foo\r\n\r\nONBUILD HEALTHCHECK --interval=5m --timeout=3s \\\r\n  CMD foo\r\n\r\nHEALTHCHECK \\\r\n  --interval=5m \\\r\n  --timeout=3s \\\r\n  CMD foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ADD\"],\r\n\t\t[\"options\", [\r\n\t\t\t[\"property\", \"--chown\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"string\", \"1\"]\r\n\t\t]],\r\n\t\t\" files* /somedir/\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"COPY\"],\r\n\t\t[\"options\", [\r\n\t\t\t[\"property\", \"--chown\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"string\", \"1\"]\r\n\t\t]],\r\n\t\t\" files* /somedir/\"\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"HEALTHCHECK\"],\r\n\t\t[\"options\", [\r\n\t\t\t[\"property\", \"--interval\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"string\", \"5m\"],\r\n\t\t\t[\"property\", \"--timeout\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"string\", \"3s\"]\r\n\t\t]],\r\n\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t[\"keyword\", \"CMD\"],\r\n\t\t\" foo\"\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ONBUILD\"],\r\n\t\t[\"keyword\", \"HEALTHCHECK\"],\r\n\t\t[\"options\", [\r\n\t\t\t[\"property\", \"--interval\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"string\", \"5m\"],\r\n\t\t\t[\"property\", \"--timeout\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"string\", \"3s\"]\r\n\t\t]],\r\n\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t[\"keyword\", \"CMD\"],\r\n\t\t\" foo\"\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"HEALTHCHECK\"],\r\n\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t[\"options\", [\r\n\t\t\t[\"property\", \"--interval\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"string\", \"5m\"],\r\n\t\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t\t[\"property\", \"--timeout\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"string\", \"3s\"]\r\n\t\t]],\r\n\t\t[\"operator\", \"\\\\\"],\r\n\r\n\t\t[\"keyword\", \"CMD\"],\r\n\t\t\" foo\"\r\n\t]]\r\n]"
  },
  {
    "path": "tests/languages/docker/string_feature.test",
    "content": "RUN echo \"\"\r\nRUN echo \"fo\\\"obar\"\r\nRUN echo \"foo\\\r\nbar\"\r\n\r\nRUN echo ''\r\nRUN echo 'fo\\'obar'\r\nRUN echo 'foo\\\r\nbar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" echo \",\r\n\t\t[\"string\", \"\\\"\\\"\"]\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" echo \",\r\n\t\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"]\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" echo \",\r\n\t\t[\"string\", \"\\\"foo\\\\\\r\\nbar\\\"\"]\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" echo \",\r\n\t\t[\"string\", \"''\"]\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" echo \",\r\n\t\t[\"string\", \"'fo\\\\'obar'\"]\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" echo \",\r\n\t\t[\"string\", \"'foo\\\\\\r\\nbar'\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/docker/variable_feature.test",
    "content": "FROM busybox\r\nUSER ${user:-some_user}\r\nARG user\r\nUSER $user\r\nRUN echo $CONT_IMG_VER\r\n\r\nARG  CODE_VERSION=latest\r\nFROM base:${CODE_VERSION}\r\nCMD  /code/run-app\r\n\r\nFROM extras:${CODE_VERSION}\r\nCMD  /code/run-extras\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"FROM\"],\r\n\t\t\" busybox\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"USER\"],\r\n\t\t[\"variable\", \"${user:-some_user}\"]\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ARG\"],\r\n\t\t\" user\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"USER\"],\r\n\t\t[\"variable\", \"$user\"]\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"RUN\"],\r\n\t\t\" echo \",\r\n\t\t[\"variable\", \"$CONT_IMG_VER\"]\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"ARG\"],\r\n\t\t\"  CODE_VERSION=latest\"\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"FROM\"],\r\n\t\t\" base:\",\r\n\t\t[\"variable\", \"${CODE_VERSION}\"]\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"CMD\"],\r\n\t\t\"  /code/run-app\"\r\n\t]],\r\n\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"FROM\"],\r\n\t\t\" extras:\",\r\n\t\t[\"variable\", \"${CODE_VERSION}\"]\r\n\t]],\r\n\t[\"instruction\", [\r\n\t\t[\"keyword\", \"CMD\"],\r\n\t\t\"  /code/run-extras\"\r\n\t]]\r\n]"
  },
  {
    "path": "tests/languages/dot/attribute_feature.test",
    "content": "[foo=bar]\r\n\r\n[\r\n\tfoo = 123;\r\n\t\"graph\" = \"\r\nsome\r\nvalue\", 123 = bar baz = 123\r\n]\r\n\r\n[label=<\r\n<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\">\r\n  <TR><TD>left</TD><TD PORT=\"f1\">mid dle</TD><TD PORT=\"f2\">right</TD></TR>\r\n</TABLE>>]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"attr-name\", [\"foo\"]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"attr-value\", [\"bar\"]],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\r\n\t[\"attr-name\", [\"foo\"]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"attr-value\", [\"123\"]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"attr-name\", [\"\\\"graph\\\"\"]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"attr-value\", [\"\\\"\\r\\nsome\\r\\nvalue\\\"\"]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"attr-name\", [\"123\"]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"attr-value\", [\"bar\"]],\r\n\t[\"attr-name\", [\"baz\"]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"attr-value\", [\"123\"]],\r\n\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"attr-name\", [\"label\"]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"attr-value\", [\r\n\t\t\"<\",\r\n\t\t[\"markup\", \"\\r\\n<TABLE BORDER=\\\"0\\\" CELLBORDER=\\\"1\\\" CELLSPACING=\\\"0\\\">\\r\\n  <TR><TD>left</TD><TD PORT=\\\"f1\\\">mid dle</TD><TD PORT=\\\"f2\\\">right</TD></TR>\\r\\n</TABLE>\"],\r\n\t\t\">\"\r\n\t]],\r\n\t[\"punctuation\", \"]\"]\r\n]"
  },
  {
    "path": "tests/languages/dot/comment_feature.test",
    "content": "// comment\r\n/*\r\ncomment\r\n*/\r\n\r\n# not really a comment but ignored\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// comment\"],\r\n\t[\"comment\", \"/*\\r\\ncomment\\r\\n*/\"],\r\n\r\n\t[\"comment\", \"# not really a comment but ignored\"]\r\n]"
  },
  {
    "path": "tests/languages/dot/graph-name_feature.test",
    "content": "graph ethane {}\r\ndigraph foo {}\r\nsubgraph bar {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"graph\"],\r\n\t[\"graph-name\", [\"ethane\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"digraph\"],\r\n\t[\"graph-name\", [\"foo\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"subgraph\"],\r\n\t[\"graph-name\", [\"bar\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]"
  },
  {
    "path": "tests/languages/dot/keyword_feature.test",
    "content": "digraph;\r\nedge;\r\ngraph;\r\nnode;\r\nstrict;\r\nsubgraph;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"digraph\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"edge\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"graph\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"node\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"strict\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"subgraph\"], [\"punctuation\", \";\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/dot/node_feature.test",
    "content": "struct1:f1 -> struct2:f0;\r\nstruct1:f2 -> struct3:here;\r\n\r\nA:ne -> B:sw\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"node\", [\"struct1\"]],\r\n\t[\"operator\", \":\"],\r\n\t[\"node\", [\"f1\"]],\r\n\t[\"operator\", \"->\"],\r\n\t[\"node\", [\"struct2\"]],\r\n\t[\"operator\", \":\"],\r\n\t[\"node\", [\"f0\"]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"node\", [\"struct1\"]],\r\n\t[\"operator\", \":\"],\r\n\t[\"node\", [\"f2\"]],\r\n\t[\"operator\", \"->\"],\r\n\t[\"node\", [\"struct3\"]],\r\n\t[\"operator\", \":\"],\r\n\t[\"node\", [\"here\"]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"node\", [\"A\"]],\r\n\t[\"operator\", \":\"],\r\n\t[\"compass-point\", \"ne\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"node\", [\"B\"]],\r\n\t[\"operator\", \":\"],\r\n\t[\"compass-point\", \"sw\"]\r\n]"
  },
  {
    "path": "tests/languages/dot/operator_feature.test",
    "content": "-- ->\r\n= :\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"--\"], [\"operator\", \"->\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \":\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/dot/punctuation_feature.test",
    "content": "[ ] { } ; ,\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \",\"]\r\n]"
  },
  {
    "path": "tests/languages/dot!+markup/attribute_feature.test",
    "content": "[label=<\r\n<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\">\r\n  <TR><TD>left</TD><TD PORT=\"f1\">mid dle</TD><TD PORT=\"f2\">right</TD></TR>\r\n</TABLE>>]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"attr-name\", [\"label\"]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"attr-value\", [\r\n\t\t\"<\",\r\n\t\t[\"markup\", [\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"TABLE\"]],\r\n\t\t\t\t[\"attr-name\", [\"BORDER\"]],\r\n\t\t\t\t[\"attr-value\", [\r\n\t\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t\t\"0\",\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"attr-name\", [\"CELLBORDER\"]],\r\n\t\t\t\t[\"attr-value\", [\r\n\t\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t\t\"1\",\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"attr-name\", [\"CELLSPACING\"]],\r\n\t\t\t\t[\"attr-value\", [\r\n\t\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t\t\"0\",\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"TR\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"TD\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t\"left\",\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"TD\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"TD\"]],\r\n\t\t\t\t[\"attr-name\", [\"PORT\"]],\r\n\t\t\t\t[\"attr-value\", [\r\n\t\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t\t\"f1\",\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t\"mid dle\",\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"TD\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"TD\"]],\r\n\t\t\t\t[\"attr-name\", [\"PORT\"]],\r\n\t\t\t\t[\"attr-value\", [\r\n\t\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t\t\"f2\",\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t\"right\",\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"TD\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"TR\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"TABLE\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t\">\"\r\n\t]],\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/ebnf/comment_feature.test",
    "content": "(* comment *)\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"(* comment *)\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/ebnf/definition_feature.test",
    "content": "foo bar = 'a' ;\n\n----------------------------------------------------\n\n[\n\t[\"definition\", \"foo bar\"],\n\t[\"operator\", \"=\"],\n\t[\"string\", \"'a'\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for rules.\n"
  },
  {
    "path": "tests/languages/ebnf/operator_feature.test",
    "content": "| / !\n*\n-\n=\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"=\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/ebnf/punctuation_feature.test",
    "content": "; .\n,\n()\n[] (//)\n{} (::)\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"],\n\n\t[\"punctuation\", \",\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"(/\"],\n\t[\"punctuation\", \"/)\"],\n\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"(:\"],\n\t[\"punctuation\", \":)\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/ebnf/rule_feature.test",
    "content": "foo bar;\n\n----------------------------------------------------\n\n[\n\t[\"rule\", \"foo bar\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for rules.\n"
  },
  {
    "path": "tests/languages/ebnf/special_feature.test",
    "content": "? special characters ?\n\n----------------------------------------------------\n\n[\n\t[\"special\", \"? special characters ?\"]\n]\n\n----------------------------------------------------\n\nChecks for special sequences.\n"
  },
  {
    "path": "tests/languages/ebnf/string_feature.test",
    "content": "\"\"\n''\n\"foo's\"\n'\"bar;'\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"''\"],\n\t[\"string\", \"\\\"foo's\\\"\"],\n\t[\"string\", \"'\\\"bar;'\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/editorconfig/comment_feature.test",
    "content": ";\r\n; comment\r\n# comment can also contain ; and #\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \";\"],\r\n\t[\"comment\", \"; comment\"],\r\n\t[\"comment\", \"# comment can also contain ; and #\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/editorconfig/key_value_feature.test",
    "content": "foo = Bar Baz\r\nfoobar = 42\r\n  another_value = with_indent\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"key\", \"foo\"],\r\n\t[\"value\", [\r\n\t\t[\"punctuation\", \"=\"],\r\n\t\t\" Bar Baz\"\r\n\t]],\r\n\t[\"key\", \"foobar\"],\r\n\t[\"value\", [\r\n\t\t[\"punctuation\", \"=\"],\r\n\t\t\" 42\"\r\n\t]],\r\n\t[\"key\", \"another_value\"],\r\n\t[\"value\", [\r\n\t\t[\"punctuation\", \"=\"],\r\n\t\t\" with_indent\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for key/value pairs.\r\n"
  },
  {
    "path": "tests/languages/editorconfig/section_feature.test",
    "content": "[*]\r\n[**.kt]\r\n[{**.kt, **.kts}]\r\n[?[!seq].log.{0..9}]\r\n[\\\\**.log]\r\n  [Section with indent]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"section\", [\r\n\t\t[\"punctuation\", \"[\"], [\"operator\", \"*\"], [\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"section\", [\r\n\t\t[\"punctuation\", \"[\"], [\"operator\", \"**\"], \".kt\", [\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"section\", [\r\n\t\t[\"punctuation\", \"[\"],  [\"punctuation\", \"{\"],\r\n\t\t[\"operator\", \"**\"], \".kt\", [\"punctuation\", \",\"], [\"operator\", \"**\"], \".kts\",\r\n\t\t[\"punctuation\", \"}\"], [\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"section\", [\r\n\t\t[\"punctuation\", \"[\"], [\"operator\", \"?\"],\r\n\t\t[\"punctuation\", \"[\"], [\"operator\", \"!\"], \"seq\", [\"punctuation\", \"]\"],\r\n\t\t\".log.\", [\"punctuation\", \"{\"], \"0\", [\"operator\", \"..\"], \"9\", [\"punctuation\", \"}\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"section\", [\r\n    \t[\"punctuation\", \"[\"], [\"regex\", \"\\\\\\\\*\"], [\"operator\", \"*\"], \".log\", [\"punctuation\", \"]\"]\r\n    ]],\r\n\t[\"section\", [\r\n    \t[\"punctuation\", \"[\"], \"Section with indent\", [\"punctuation\", \"]\"]\r\n    ]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for section titles."
  },
  {
    "path": "tests/languages/eiffel/boolean_feature.test",
    "content": "True\r\nFalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"True\"],\r\n\t[\"boolean\", \"False\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/eiffel/char_feature.test",
    "content": "'a'\r\n'%''\r\n'%/123/'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"char\", \"'a'\"],\r\n\t[\"char\", \"'%''\"],\r\n\t[\"char\", \"'%/123/'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for chars."
  },
  {
    "path": "tests/languages/eiffel/class-name_feature.test",
    "content": "A\r\nFOO\r\nB4D_F4C3\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"class-name\", \"A\"],\r\n\t[\"class-name\", \"FOO\"],\r\n\t[\"class-name\", \"B4D_F4C3\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names."
  },
  {
    "path": "tests/languages/eiffel/comment_feature.test",
    "content": "--\r\n-- foo bar\r\n-- \"foo\" bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"--\"],\r\n\t[\"comment\", \"-- foo bar\"],\r\n\t[\"comment\", \"-- \\\"foo\\\" bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/eiffel/keyword_feature.test",
    "content": "across agent alias all and\r\nattached as assign attribute\r\ncheck class convert create\r\nCurrent debug deferred detachable\r\ndo else elseif end ensure\r\nexpanded export external\r\nfeature from frozen if\r\nimplies inherit inspect\r\ninvariant like local loop\r\nnot note obsolete old\r\nonce or Precursor redefine\r\nrename require rescue Result\r\nretry select separate some\r\nthen undefine until variant\r\nVoid when xor\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"across\"], [\"keyword\", \"agent\"], [\"keyword\", \"alias\"], [\"keyword\", \"all\"], [\"keyword\", \"and\"],\r\n\t[\"keyword\", \"attached\"], [\"keyword\", \"as\"], [\"keyword\", \"assign\"], [\"keyword\", \"attribute\"],\r\n\t[\"keyword\", \"check\"], [\"keyword\", \"class\"], [\"keyword\", \"convert\"], [\"keyword\", \"create\"],\r\n\t[\"keyword\", \"Current\"], [\"keyword\", \"debug\"], [\"keyword\", \"deferred\"], [\"keyword\", \"detachable\"],\r\n\t[\"keyword\", \"do\"], [\"keyword\", \"else\"], [\"keyword\", \"elseif\"], [\"keyword\", \"end\"], [\"keyword\", \"ensure\"],\r\n\t[\"keyword\", \"expanded\"], [\"keyword\", \"export\"], [\"keyword\", \"external\"],\r\n\t[\"keyword\", \"feature\"], [\"keyword\", \"from\"], [\"keyword\", \"frozen\"], [\"keyword\", \"if\"],\r\n\t[\"keyword\", \"implies\"], [\"keyword\", \"inherit\"], [\"keyword\", \"inspect\"],\r\n\t[\"keyword\", \"invariant\"], [\"keyword\", \"like\"], [\"keyword\", \"local\"], [\"keyword\", \"loop\"],\r\n\t[\"keyword\", \"not\"], [\"keyword\", \"note\"], [\"keyword\", \"obsolete\"], [\"keyword\", \"old\"],\r\n\t[\"keyword\", \"once\"], [\"keyword\", \"or\"], [\"keyword\", \"Precursor\"], [\"keyword\", \"redefine\"],\r\n\t[\"keyword\", \"rename\"], [\"keyword\", \"require\"], [\"keyword\", \"rescue\"], [\"keyword\", \"Result\"],\r\n\t[\"keyword\", \"retry\"], [\"keyword\", \"select\"], [\"keyword\", \"separate\"], [\"keyword\", \"some\"],\r\n\t[\"keyword\", \"then\"], [\"keyword\", \"undefine\"], [\"keyword\", \"until\"], [\"keyword\", \"variant\"],\r\n\t[\"keyword\", \"Void\"], [\"keyword\", \"when\"], [\"keyword\", \"xor\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords"
  },
  {
    "path": "tests/languages/eiffel/number_feature.test",
    "content": "0xbabe\r\n0xBAD_A55\r\n0c7654_1234\r\n0b1111_0000_0101\r\n42\r\n42.\r\n.42\r\n1_845.123_456\r\n3.14e+4\r\n4_2.5_7e-1_0\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0xbabe\"],\r\n\t[\"number\", \"0xBAD_A55\"],\r\n\t[\"number\", \"0c7654_1234\"],\r\n\t[\"number\", \"0b1111_0000_0101\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"42.\"],\r\n\t[\"number\", \".42\"],\r\n\t[\"number\", \"1_845.123_456\"],\r\n\t[\"number\", \"3.14e+4\"],\r\n\t[\"number\", \"4_2.5_7e-1_0\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hexadecimal, octal, binary and decimal numbers.\r\n"
  },
  {
    "path": "tests/languages/eiffel/operator_feature.test",
    "content": "\\\\ |..| .. //\r\n/~ / /=\r\n< <= > >=\r\n+ - *\r\n^ = ~\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"\\\\\\\\\"], [\"operator\", \"|..|\"], [\"operator\", \"..\"], [\"operator\", \"//\"],\r\n\t[\"operator\", \"/~\"], [\"operator\", \"/\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"=\"], [\"operator\", \"~\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators"
  },
  {
    "path": "tests/languages/eiffel/punctuation_feature.test",
    "content": ":= << >> (| |) ->\n\n.foo\n\n{ } [ ] ; ( ) , : ?\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \":=\"],\n\t[\"punctuation\", \"<<\"],\n\t[\"punctuation\", \">>\"],\n\t[\"punctuation\", \"(|\"],\n\t[\"punctuation\", \"|)\"],\n\t[\"punctuation\", \"->\"],\n\n\t[\"punctuation\", \".\"], \"foo\\r\\n\\r\\n\",\n\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"?\"]\n]\n"
  },
  {
    "path": "tests/languages/eiffel/string_feature.test",
    "content": "\"\"\r\n\"fo%\"o\"\r\n\"foo%\r\n%bar\"\r\n\r\n\"[]\"\r\n\"[fo\"o\r\nbar]\"\r\n\"!-[fo\"o[]\r\nbar]!-\"\r\n\"{}\"\r\n\"{fo\"o\r\nbar}\"\r\n\"*?{fo\"o{}\r\nbar}*?\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo%\\\"o\\\"\"],\r\n\t[\"string\", \"\\\"foo%\\r\\n%bar\\\"\"],\r\n\r\n\t[\"string\", \"\\\"[]\\\"\"],\r\n\t[\"string\", \"\\\"[fo\\\"o\\r\\nbar]\\\"\"],\r\n\t[\"string\", \"\\\"!-[fo\\\"o[]\\r\\nbar]!-\\\"\"],\r\n\t[\"string\", \"\\\"{}\\\"\"],\r\n\t[\"string\", \"\\\"{fo\\\"o\\r\\nbar}\\\"\"],\r\n\t[\"string\", \"\\\"*?{fo\\\"o{}\\r\\nbar}*?\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings, multi-line strings, and aligned and non aligned verbatim strings."
  },
  {
    "path": "tests/languages/ejs/comment_feature.test",
    "content": "<%#foo\nbar%>\n\n----------------------------------------------------\n\n[\n\t[\"ejs-comment\", \"<%#foo\\r\\nbar%>\"]\n]\n\n----------------------------------------------------\n\nChecks for EJS comments.\n"
  },
  {
    "path": "tests/languages/ejs/ejs_feature.test",
    "content": "<% var foo = ''\n     , bar = false; %>\n\n<% if (bar) { %>\n  <%= foo + 'It\\'s ' + output %>\n<% } %>\n\n----------------------------------------------------\n\n[\n\t[\"ejs\", [\n\t\t[\"delimiter\", \"<%\"],\n\t\t[\"language-javascript\", [\n\t\t\t[\"keyword\", \"var\"],\n\t\t\t\" foo \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"string\", \"''\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t\" bar \",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"boolean\", \"false\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\n\t[\"ejs\", [\n\t\t[\"delimiter\", \"<%\"],\n\t\t[\"language-javascript\", [\n\t\t\t[\"keyword\", \"if\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"bar\",\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \"{\"]\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\n\t[\"ejs\", [\n\t\t[\"delimiter\", \"<%=\"],\n\t\t[\"language-javascript\", [\n\t\t\t\" foo \",\n\t\t\t[\"operator\", \"+\"],\n\t\t\t[\"string\", \"'It\\\\'s '\"],\n\t\t\t[\"operator\", \"+\"],\n\t\t\t\" output \"\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\n\t[\"ejs\", [\n\t\t[\"delimiter\", \"<%\"],\n\t\t[\"language-javascript\", [\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for EJS.\n"
  },
  {
    "path": "tests/languages/ejs/escape_feature.test",
    "content": "<%% %%>\n\n----------------------------------------------------\n\n[\n\t[\"escape\", \"<%%\"],\n\t[\"escape\", \"%%>\"]\n]\n"
  },
  {
    "path": "tests/languages/ejs/markup_feature.test",
    "content": "<% if (user) { %>\n  <h2><%= user.name %></h2>\n<% } %>\n\n----------------------------------------------------\n\n[\n\t[\"ejs\", [\n\t\t[\"delimiter\", \"<%\"],\n\t\t[\"language-javascript\", [\n\t\t\t[\"keyword\", \"if\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"user\",\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \"{\"]\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"h2\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"ejs\", [\n\t\t[\"delimiter\", \"<%=\"],\n\t\t[\"language-javascript\", [\n\t\t\t\" user\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"name \"\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"h2\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"ejs\", [\n\t\t[\"delimiter\", \"<%\"],\n\t\t[\"language-javascript\", [\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/ejs+pug/ejs_inclusion.test",
    "content": ":ejs\n\t<% var foo = '', bar = false; %>\n\n----------------------------------------------------\n\n[\n\t[\"filter-ejs\", [\n\t\t[\"filter-name\", \":ejs\"],\n\t\t[\"text\", [\n\t\t\t[\"ejs\", [\n\t\t\t\t[\"delimiter\", \"<%\"],\n\t\t\t\t[\"language-javascript\", [\n\t\t\t\t\t[\"keyword\", \"var\"],\n\t\t\t\t\t\" foo \",\n\t\t\t\t\t[\"operator\", \"=\"],\n\t\t\t\t\t[\"string\", \"''\"],\n\t\t\t\t\t[\"punctuation\", \",\"],\n\t\t\t\t\t\" bar \",\n\t\t\t\t\t[\"operator\", \"=\"],\n\t\t\t\t\t[\"boolean\", \"false\"],\n\t\t\t\t\t[\"punctuation\", \";\"]\n\t\t\t\t]],\n\t\t\t\t[\"delimiter\", \"%>\"]\n\t\t\t]]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/elixir/atom_feature.test",
    "content": ":true\r\n:false\r\n:FooBar42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"atom\", \":true\"],\r\n\t[\"atom\", \":false\"],\r\n\t[\"atom\", \":FooBar42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for atoms."
  },
  {
    "path": "tests/languages/elixir/attr-name_feature.test",
    "content": "[a: 1, b: 2]\r\ndo: :this, else: :that\r\nwhere: foo,\r\nselect: bar,\r\nattr?: a\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"attr-name\", \"a:\"],\r\n\t[\"number\", \"1\"], [\"punctuation\", \",\"],\r\n\t[\"attr-name\", \"b:\"],\r\n\t[\"number\", \"2\"], [\"punctuation\", \"]\"],\r\n\r\n\t[\"attr-name\", \"do:\"], [\"atom\", \":this\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"attr-name\", \"else:\"], [\"atom\", \":that\"],\r\n\t[\"attr-name\", \"where:\"], \" foo\", [\"punctuation\", \",\"],\r\n\t[\"attr-name\", \"select:\"], \" bar\", [\"punctuation\", \",\"],\r\n\t[\"attr-name\", \"attr?:\"], \" a\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keyword list keys.\r\n"
  },
  {
    "path": "tests/languages/elixir/attribute_feature.test",
    "content": "@vsn 2\r\n@moduledoc \"\"\"\r\nfoobar\r\n\"\"\"\r\n@tag :external\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"attribute\", \"@vsn\"], [\"number\", \"2\"],\r\n\t[\"doc\", [ [\"attribute\", \"@moduledoc\" ], [ \"string\", \"\\\"\\\"\\\"\\r\\nfoobar\\r\\n\\\"\\\"\\\"\" ] ] ],\r\n\t[\"attribute\", \"@tag\"], [\"atom\", \":external\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for module attributes.\r\n"
  },
  {
    "path": "tests/languages/elixir/boolean_feature.test",
    "content": "true\r\nfalse\r\nnil\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"],\r\n\t[\"boolean\", \"nil\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans and nil."
  },
  {
    "path": "tests/languages/elixir/capture_feature.test",
    "content": "&Math.zero?(0)\r\nfun = &Math.zero?/1\r\n(&is_function/1).(fun)\r\nfun = &(&1 + 1)\r\n&List.flatten(&1, &2)\r\n\r\nfun = &Math.zero?/invalid\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"&\"],\r\n\t[\"module\", \"Math\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"zero?\" ],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \")\"],\r\n\t\"\\r\\nfun \", [\"operator\", \"=\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"module\", \"Math\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"zero?\" ],\r\n\t[\"operator\", \"/\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"function\", \"is_function\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \"(\"], \"fun\", [\"punctuation\", \")\"],\r\n\t\"\\r\\nfun \", [\"operator\", \"=\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"punctuation\", \"(\"], [\"argument\", \"&1\"],\r\n\t[\"operator\", \"+\"], [\"number\", \"1\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"module\", \"List\"],\r\n\t[\"punctuation\", \".\"], [\"function\", \"flatten\"],\r\n\t[\"punctuation\", \"(\"], [\"argument\", \"&1\"],\r\n\t[\"punctuation\", \",\"], [\"argument\", \"&2\"],\r\n\t[\"punctuation\", \")\"],\r\n\t\"\\r\\n\\r\\nfun \",\r\n\t[ \"operator\", \"=\" ],\r\n\t[ \"operator\", \"&\" ],\r\n\t[ \"module\", \"Math\" ],\r\n\t[ \"punctuation\", \".\" ],\r\n\t\"zero?\",\r\n\t[ \"operator\", \"/\" ],\r\n\t\"invalid\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for function capturing and arguments.\r\n"
  },
  {
    "path": "tests/languages/elixir/comment_feature.test",
    "content": "#\r\n# Foobar\r\n#{ This is a comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# Foobar\"],\r\n\t[\"comment\", \"#{ This is a comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/elixir/doc_feature.test",
    "content": "@doc \"single\"\n@doc 'single'\n@doc \"\"\"triple\"\"\"\n@doc '''triple'''\n@doc '''\nmultiline\n'''\n@doc \"\"\"\nmultiline\n\"\"\"\n@doc since: \"1.3.0\"\n@doc deprecated: \"phased out\"\n\n@moduledoc \"single\"\n@moduledoc 'single'\n@moduledoc \"\"\"triple\"\"\"\n@moduledoc '''triple'''\n@moduledoc '''\nmultiline\n'''\n@moduledoc \"\"\"\nmultiline\n\"\"\"\n@moduledoc since: \"1.3.0\"\n@moduledoc deprecated: \"phased out\"\n\n----------------------------------------------------\n\n[\n\t[\"doc\", [\n\t\t[\"attribute\", \"@doc\"],\n\t\t[\"string\", \"\\\"single\\\"\"]\n\t]],\n\n\t[\"doc\", [\n\t\t[\"attribute\", \"@doc\"],\n\t\t[\"string\", \"'single'\"]\n\t]],\n\n\t[\"doc\", [\n\t\t[\"attribute\", \"@doc\"],\n\t\t[\"string\", \"\\\"\\\"\\\"triple\\\"\\\"\\\"\"]\n\t]],\n\n\t[\"doc\", [\n\t\t[\"attribute\", \"@doc\"],\n\t\t[\"string\", \"'''triple'''\"]\n\t]],\n\n\t[\"doc\", [\n\t\t[\"attribute\", \"@doc\"],\n\t\t[\"string\", \"'''\\r\\nmultiline\\r\\n'''\"]\n\t]],\n\n\t[\"doc\", [\n\t\t[\"attribute\", \"@doc\"],\n\t\t[\"string\", \"\\\"\\\"\\\"\\r\\nmultiline\\r\\n\\\"\\\"\\\"\"]\n\t]],\n\n\t[\"attribute\", \"@doc\"],\n\t[\"attr-name\", \"since:\"],\n\t[\"string\", [\"\\\"1.3.0\\\"\"]],\n\n\t[\"attribute\", \"@doc\"],\n\t[\"attr-name\", \"deprecated:\"],\n\t[\"string\", [\"\\\"phased out\\\"\"]],\n\n\t[\"doc\", [\n\t\t[\"attribute\", \"@moduledoc\"],\n\t\t[\"string\", \"\\\"single\\\"\"]\n\t]],\n\n\t[\"doc\", [\n\t\t[\"attribute\", \"@moduledoc\"],\n\t\t[\"string\", \"'single'\"]\n\t]],\n\n\t[\"doc\", [\n\t\t[\"attribute\", \"@moduledoc\"],\n\t\t[\"string\", \"\\\"\\\"\\\"triple\\\"\\\"\\\"\"]\n\t]],\n\n\t[\"doc\", [\n\t\t[\"attribute\", \"@moduledoc\"],\n\t\t[\"string\", \"'''triple'''\"]\n\t]],\n\n\t[\"doc\", [\n\t\t[\"attribute\", \"@moduledoc\"],\n\t\t[\"string\", \"'''\\r\\nmultiline\\r\\n'''\"]\n\t]],\n\n\t[\"doc\", [\n\t\t[\"attribute\", \"@moduledoc\"],\n\t\t[\"string\", \"\\\"\\\"\\\"\\r\\nmultiline\\r\\n\\\"\\\"\\\"\"]\n\t]],\n\n\t[\"attribute\", \"@moduledoc\"],\n\t[\"attr-name\", \"since:\"],\n\t[\"string\", [\"\\\"1.3.0\\\"\"]],\n\n\t[\"attribute\", \"@moduledoc\"],\n\t[\"attr-name\", \"deprecated:\"],\n\t[\"string\", [\"\\\"phased out\\\"\"]]\n]\n"
  },
  {
    "path": "tests/languages/elixir/issue1392.test",
    "content": "String.upcase(@fixed)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"module\", \"String\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"upcase\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"attribute\", \"@fixed\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nEnsure module attributes don't consume punctuation.\r\n"
  },
  {
    "path": "tests/languages/elixir/issue775.test",
    "content": "@doc \"\"\"\r\n## Parameters\r\n\"\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\r\n\t\t\"doc\",\r\n\t\t[\r\n\t\t\t[ \"attribute\", \"@doc\" ],\r\n\t\t\t[ \"string\", \"\\\"\\\"\\\"\\r\\n## Parameters\\r\\n\\\"\\\"\\\"\" ]\r\n\t\t]\r\n\t]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nEnsures that markdown headers are not highlighted as comments inside strings.\r\nSee #775 for details.\r\n"
  },
  {
    "path": "tests/languages/elixir/keyword_feature.test",
    "content": "after alias and case\ncatch cond def\ndefcallback\ndefexception\ndefimpl defmodule\ndefp\ndefprotocol\ndefdelegate\ndefmacro quote unquote\ndefn defnp\ndefstruct do else\nend fn for if\nimport not or\nraise require rescue try\nunless use when\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"after\"], [\"keyword\", \"alias\"], [\"keyword\", \"and\"], [\"keyword\", \"case\"],\n\t[\"keyword\", \"catch\"], [\"keyword\", \"cond\"], [\"keyword\", \"def\"],\n\t[\"keyword\", \"defcallback\"],\n\t[\"keyword\", \"defexception\"],\n\t[\"keyword\", \"defimpl\"], [\"keyword\", \"defmodule\"],\n\t[\"keyword\", \"defp\"],\n\t[\"keyword\", \"defprotocol\"],\n\t[\"keyword\", \"defdelegate\"],\n\t[\"keyword\", \"defmacro\"], [\"keyword\", \"quote\"], [\"keyword\", \"unquote\"],\n\t[\"keyword\", \"defn\"], [\"keyword\", \"defnp\"],\n\t[\"keyword\", \"defstruct\"], [\"keyword\", \"do\"], [\"keyword\", \"else\"],\n\t[\"keyword\", \"end\"], [\"keyword\", \"fn\"], [\"keyword\", \"for\"], [\"keyword\", \"if\"],\n\t[\"keyword\", \"import\"], [\"keyword\", \"not\"], [\"keyword\", \"or\"],\n\t[\"keyword\", \"raise\"], [\"keyword\", \"require\"], [\"keyword\", \"rescue\"], [\"keyword\", \"try\"],\n\t[\"keyword\", \"unless\"], [\"keyword\", \"use\"], [\"keyword\", \"when\"]\n]\n\n----------------------------------------------------\n\nChecks for all keywords.\n"
  },
  {
    "path": "tests/languages/elixir/module_feature.test",
    "content": "defmodule Math do\n  def sum(a, b) do\n    a + b\n  end\nend\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"defmodule\"],\n\t[\"module\", \"Math\"],\n\t[\"keyword\", \"do\"],\n\n\t[\"keyword\", \"def\"],\n\t[\"function\", \"sum\"],\n\t[\"punctuation\", \"(\"],\n\t\"a\",\n\t[\"punctuation\", \",\"],\n\t\" b\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"do\"],\n\n\t\"\\r\\n    a \",\n\t[\"operator\", \"+\"],\n\t\" b\\r\\n  \",\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"end\"]\n]\n\n----------------------------------------------------\n\nChecks for all keywords.\n"
  },
  {
    "path": "tests/languages/elixir/number_feature.test",
    "content": "0b1111_0000\r\n0o754_123\r\n0xBadFace\r\n42\r\n42_000\r\n3.14159\r\n2e6\r\n3.241_753E-7\r\n0.7e+15\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0b1111_0000\"],\r\n\t[\"number\", \"0o754_123\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"42_000\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2e6\"],\r\n\t[\"number\", \"3.241_753E-7\"],\r\n\t[\"number\", \"0.7e+15\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for binary, octal, hexadecimal and decimal numbers."
  },
  {
    "path": "tests/languages/elixir/operator_feature.test",
    "content": "in\r\n\\\\\r\n::\r\n..\r\n...\r\n+ ++\r\n- -- ->\r\n*\r\n/\r\n^\r\n& &&\r\n| || |>\r\n< <= <> <-\r\n> >=\r\n! != !==\r\n= =~ == === =>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"in\"],\r\n\t[\"operator\", \"\\\\\\\\\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"operator\", \"..\"],\r\n\t[\"operator\", \"...\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"->\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"], [\"operator\", \"|>\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<>\"], [\"operator\", \"<-\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"], [\"operator\", \"!==\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"=~\"], [\"operator\", \"==\"], [\"operator\", \"===\"], [\"operator\", \"=>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/elixir/regex_feature.test",
    "content": "~r\"\"\"foobar\"\"\"im\r\n~R'''foobar'''ux\r\n~r/fo\\/obar/smfr\r\n~R|fo\\|obar|uismxfr\r\n~r\"fo\\\"obar\"x\r\n~R'fo\\'obar's\r\n~r(fo\\)obar)\r\n~R[fo\\]obar]\r\n~r{fo\\}obar}\r\n~R<fo\\>obar>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"regex\", \"~r\\\"\\\"\\\"foobar\\\"\\\"\\\"im\"],\r\n\t[\"regex\", \"~R'''foobar'''ux\"],\r\n\t[\"regex\", \"~r/fo\\\\/obar/smfr\"],\r\n\t[\"regex\", \"~R|fo\\\\|obar|uismxfr\"],\r\n\t[\"regex\", \"~r\\\"fo\\\\\\\"obar\\\"x\"],\r\n\t[\"regex\", \"~R'fo\\\\'obar's\"],\r\n\t[\"regex\", \"~r(fo\\\\)obar)\"],\r\n\t[\"regex\", \"~R[fo\\\\]obar]\"],\r\n\t[\"regex\", \"~r{fo\\\\}obar}\"],\r\n\t[\"regex\", \"~R<fo\\\\>obar>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for regexes."
  },
  {
    "path": "tests/languages/elixir/string_feature.test",
    "content": "~s/foobar/\r\n~s/foo#{42}bar/\r\n~S|foobar|\r\n~c\"foobar\"\r\n~c\"foo#{42}bar\"\r\n~C'foobar'\r\n~w(foobar)c\r\n~w(foo#{42}bar)s\r\n~W[foobar]a\r\n~s{foobar}\r\n~s{foo#{42}bar}\r\n~S<foobar>\r\n\r\n\"\"\"\r\nFoo bar\r\n\"\"\"\r\n\r\n'''\r\nFoo bar\r\n'''\r\n\r\n~S\"\"\"\r\nFoo bar\r\n\"\"\"\r\n\r\n~c\"\"\"\r\nFoo bar\r\n\"\"\"\r\n\r\n~w\"\"\"\r\nFoo bar\r\n\"\"\"\r\n\r\n\"\"\r\n\"foo\"\r\n\"fo\\\"o\\\r\n#{42}bar\"\r\n''\r\n'foo'\r\n'fo\\'o\\\r\nbar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"~s/foobar/\"]],\r\n\t[\"string\", [\r\n\t\t\"~s/foo\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"number\", \"42\"],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t\"bar/\"\r\n\t]],\r\n\t[\"string\", [\"~S|foobar|\"]],\r\n\t[\"string\", [\"~c\\\"foobar\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"~c\\\"foo\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"number\", \"42\"],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t\"bar\\\"\"\r\n\t]],\r\n\t[\"string\", [\"~C'foobar'\"]],\r\n\t[\"string\", [\"~w(foobar)c\"]],\r\n\t[\"string\", [\r\n\t\t\"~w(foo\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"number\", \"42\"],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t\"bar)s\"\r\n\t]],\r\n\t[\"string\", [\"~W[foobar]a\"]],\r\n\t[\"string\", [\"~s{foobar}\"]],\r\n\t[\"string\", [\r\n\t\t\"~s{foo\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"number\", \"42\"],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t\"bar}\"\r\n\t]],\r\n\t[\"string\", [\"~S<foobar>\"]],\r\n\r\n\t[\"string\", [\"\\\"\\\"\\\"\\r\\nFoo bar\\r\\n\\\"\\\"\\\"\"]],\r\n\t[\"string\", [\"'''\\r\\nFoo bar\\r\\n'''\"]],\r\n\t[\"string\", [\"~S\\\"\\\"\\\"\\r\\nFoo bar\\r\\n\\\"\\\"\\\"\"]],\r\n\t[\"string\", [\"~c\\\"\\\"\\\"\\r\\nFoo bar\\r\\n\\\"\\\"\\\"\"]],\r\n\t[\"string\", [\"~w\\\"\\\"\\\"\\r\\nFoo bar\\r\\n\\\"\\\"\\\"\"]],\r\n\r\n\t[\"string\", [\"\\\"\\\"\"]],\r\n\t[\"string\", [\"\\\"foo\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"\\\"fo\\\\\\\"o\\\\\\r\\n\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"number\", \"42\"],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t\"bar\\\"\"\r\n\t]],\r\n\t[\"string\", [\"''\"]],\r\n\t[\"string\", [\"'foo'\"]],\r\n\t[\"string\", [\"'fo\\\\'o\\\\\\r\\nbar'\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/elm/builtin_feature.test",
    "content": "abs acos always asin atan atan2\r\nceiling clamp compare cos curry\r\ndegrees e flip floor fromPolar\r\nidentity isInfinite isNaN\r\nlogBase max min negate never\r\nnot pi radians rem round sin\r\nsqrt tan toFloat toPolar toString\ntruncate turns uncurry xor\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"abs\"], [\"builtin\", \"acos\"], [\"builtin\", \"always\"], [\"builtin\", \"asin\"], [\"builtin\", \"atan\"], [\"builtin\", \"atan2\"],\r\n\t[\"builtin\", \"ceiling\"], [\"builtin\", \"clamp\"], [\"builtin\", \"compare\"], [\"builtin\", \"cos\"], [\"builtin\", \"curry\"],\r\n\t[\"builtin\", \"degrees\"], [\"builtin\", \"e\"], [\"builtin\", \"flip\"], [\"builtin\", \"floor\"], [\"builtin\", \"fromPolar\"],\r\n\t[\"builtin\", \"identity\"], [\"builtin\", \"isInfinite\"], [\"builtin\", \"isNaN\"],\r\n\t[\"builtin\", \"logBase\"], [\"builtin\", \"max\"], [\"builtin\", \"min\"], [\"builtin\", \"negate\"], [\"builtin\", \"never\"],\r\n\t[\"builtin\", \"not\"], [\"builtin\", \"pi\"], [\"builtin\", \"radians\"], [\"builtin\", \"rem\"], [\"builtin\", \"round\"], [\"builtin\", \"sin\"],\r\n\t[\"builtin\", \"sqrt\"], [\"builtin\", \"tan\"], [\"builtin\", \"toFloat\"], [\"builtin\", \"toPolar\"], [\"builtin\", \"toString\"],\r\n\t[\"builtin\", \"truncate\"], [\"builtin\", \"turns\"], [\"builtin\", \"uncurry\"], [\"builtin\", \"xor\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all builtin.\r\n"
  },
  {
    "path": "tests/languages/elm/char_feature.test",
    "content": "'a'\r\n'\\''\r\n'\\n'\r\n'\\23'\r\n'\\xFE'\r\n'\\u{0000}'\r\n'\\u{1F648}'\r\n'\\u{10FFFF}'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"char\", \"'a'\"],\r\n\t[\"char\", \"'\\\\''\"],\r\n\t[\"char\", \"'\\\\n'\"],\r\n\t[\"char\", \"'\\\\23'\"],\r\n\t[\"char\", \"'\\\\xFE'\"],\r\n\t[\"char\", \"'\\\\u{0000}'\"],\r\n\t[\"char\", \"'\\\\u{1F648}'\"],\r\n\t[\"char\", \"'\\\\u{10FFFF}'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for chars.\r\n"
  },
  {
    "path": "tests/languages/elm/comment_feature.test",
    "content": "-- foo\r\n{- foo\r\nbar -}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"-- foo\"],\r\n\t[\"comment\", \"{- foo\\r\\nbar -}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments."
  },
  {
    "path": "tests/languages/elm/constant_feature.test",
    "content": "Foo\r\nFoo.Bar\r\nBaz.Foobar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"Foo\"],\r\n\t[\"constant\", \"Foo.Bar\"],\r\n\t[\"constant\", \"Baz.Foobar_42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants."
  },
  {
    "path": "tests/languages/elm/hvariable_feature.test",
    "content": "foo\r\nFoo.bar\r\nBaz.foobar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"hvariable\", \"foo\"],\r\n\t[\"hvariable\", \"Foo.bar\"],\r\n\t[\"hvariable\", \"Baz.foobar_42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hvariables."
  },
  {
    "path": "tests/languages/elm/import-statement_feature.test",
    "content": "import Foo\r\nimport Foo_42.Bar as Foobar\r\nimport Foo.Bar as Foo.Baz\r\nimport List exposing (map)\r\nimport Json.Decode as Json exposing (Decoder)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" Foo\"\r\n\t]],\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" Foo_42.Bar \",\r\n\t\t[\"keyword\", \"as\"],\r\n\t\t\" Foobar\"\r\n\t]],\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" Foo.Bar \",\r\n\t\t[\"keyword\", \"as\"],\r\n\t\t\" Foo.Baz\"\r\n\t]],\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" List \",\r\n\t\t[\"keyword\", \"exposing\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"hvariable\", \"map\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" Json.Decode \",\r\n\t\t[\"keyword\", \"as\"],\r\n\t\t\" Json \",\r\n\t\t[\"keyword\", \"exposing\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"constant\", \"Decoder\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for import statement.\r\n"
  },
  {
    "path": "tests/languages/elm/keyword_feature.test",
    "content": "alias as case else\r\nexposing if in\r\ninfixl infixr let\r\nmodule of then\r\ntype\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"alias\"], [\"keyword\", \"as\"], [\"keyword\", \"case\"], [\"keyword\", \"else\"],\r\n\t[\"keyword\", \"exposing\"], [\"keyword\", \"if\"], [\"keyword\", \"in\"],\r\n\t[\"keyword\", \"infixl\"], [\"keyword\", \"infixr\"], [\"keyword\", \"let\"],\r\n\t[\"keyword\", \"module\"], [\"keyword\", \"of\"], [\"keyword\", \"then\"],\r\n\t[\"keyword\", \"type\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/elm/number_feature.test",
    "content": "42\r\n3.14159\r\n2E3\r\n1.2e-4\r\n0.9e+1\r\n0xBadFace\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2E3\"],\r\n\t[\"number\", \"1.2e-4\"],\r\n\t[\"number\", \"0.9e+1\"],\r\n\t[\"number\", \"0xBadFace\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal and hexadecimal numbers.\r\n"
  },
  {
    "path": "tests/languages/elm/operator_feature.test",
    "content": "..\r\nreverse . sort\r\n+ - * /\r\n^ ^^ **\r\n&& ||\r\n< <= == /=\r\n>= > |\r\n++ : !!\r\n<- ->\r\n= :: =>\r\n>> >>= >@>\r\n~ ! @\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"..\"],\r\n\t[\"hvariable\", \"reverse\"], [\"operator\", \" . \"], [\"hvariable\", \"sort\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^^\"], [\"operator\", \"**\"],\r\n\t[\"operator\", \"&&\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"==\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \">=\"], [\"operator\", \">\"], [\"operator\", \"|\"],\r\n\t[\"operator\", \"++\"], [\"operator\", \":\"], [\"operator\", \"!!\"],\r\n\t[\"operator\", \"<-\"], [\"operator\", \"->\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"::\"], [\"operator\", \"=>\"],\r\n\t[\"operator\", \">>\"], [\"operator\", \">>=\"], [\"operator\", \">@>\"],\r\n\t[\"operator\", \"~\"], [\"operator\", \"!\"], [\"operator\", \"@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/elm/string_feature.test",
    "content": "\"\"\r\n\"regular string\"\r\n\"fo\\\"o\"\r\n\"\"\"foo\r\n   bar\"\"\"\r\n\"\"\"foo -- comment\r\n   bar\"\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"regular string\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"\\\"\\\"\\\"foo\\r\\n   bar\\\"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"\\\"\\\"foo -- comment\\r\\n   bar\\\"\\\"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/erb/erb_feature.test",
    "content": "<%# comment %>\r\n<%= render @products || \"empty_list\" %>\r\n<% @books.each do |book| %>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"erb\", [\r\n\t\t[\"delimiter\", \"<%\"],\r\n\t\t[\"ruby\", [\r\n\t\t\t[\"comment\", \"# comment \"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"%>\"]\r\n\t]],\r\n\t[\"erb\", [\r\n\t\t[\"delimiter\", \"<%=\"],\r\n\t\t[\"ruby\", [\r\n\t\t\t\" render \",\r\n\t\t\t[\"variable\", \"@products\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"string-literal\", [\r\n\t\t\t\t[\"string\", \"\\\"empty_list\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"%>\"]\r\n\t]],\r\n\t[\"erb\", [\r\n\t\t[\"delimiter\", \"<%\"],\r\n\t\t[\"ruby\", [\r\n\t\t\t[\"variable\", \"@books\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"keyword\", \"each\"],\r\n\t\t\t[\"keyword\", \"do\"],\r\n\t\t\t[\"operator\", \"|\"],\r\n\t\t\t\"book\",\r\n\t\t\t[\"operator\", \"|\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"%>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for ERB tags.\r\n"
  },
  {
    "path": "tests/languages/erb/erb_in_markup_feature.test",
    "content": "<div class=\"<%= Time.now.strftime('%A') %>\">\r\n___ERB1___<%= 1 %>___ERB2___<%= 2 %>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"erb\", [\r\n\t\t\t\t[\"delimiter\", \"<%=\"],\r\n\t\t\t\t[\"ruby\", [\r\n\t\t\t\t\t[\"builtin\", \"Time\"],\r\n\t\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\t\"now\",\r\n\t\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\t\"strftime\",\r\n\t\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t\t[\"string-literal\", [\r\n\t\t\t\t\t\t[\"string\", \"'%A'\"]\r\n\t\t\t\t\t]],\r\n\t\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"delimiter\", \"%>\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n___ERB1___\",\r\n\t[\"erb\", [\r\n\t\t[\"delimiter\", \"<%=\"],\r\n\t\t[\"ruby\", [\r\n\t\t\t[\"number\", \"1\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"%>\"]\r\n\t]],\r\n\t\"___ERB2___\",\r\n\t[\"erb\", [\r\n\t\t[\"delimiter\", \"<%=\"],\r\n\t\t[\"ruby\", [\r\n\t\t\t[\"number\", \"2\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"%>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for ERB inside Markup\r\n"
  },
  {
    "path": "tests/languages/erb/issue1767.test",
    "content": "<%# this is a block comment %>\n<%\n=begin %>\n\tblock comment\n\t(both lines of both the begin and end tags must be at the start of their lines)\n<%\n=end %>\n\n<%# this is not %>\n\t<%\n\t=begin %>\n\tnot a comment\n\t<%\n\t=end %>\n\n----------------------------------------------------\n\n[\n\t[\"erb\", [\n\t\t[\"delimiter\", \"<%\"],\n\t\t[\"ruby\", [\n\t\t\t[\"comment\", \"# this is a block comment \"]\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\t[\"erb\", [\n\t\t[\"delimiter\", \"<%\"],\n\t\t[\"ruby\", [\n\t\t\t[\"comment\", \"=begin %>\\r\\n\\tblock comment\\r\\n\\t(both lines of both the begin and end tags must be at the start of their lines)\\r\\n<%\\r\\n=end\"]\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\n\t[\"erb\", [\n\t\t[\"delimiter\", \"<%\"],\n\t\t[\"ruby\", [\n\t\t\t[\"comment\", \"# this is not \"]\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\t[\"erb\", [\n\t\t[\"delimiter\", \"<%\"],\n\t\t[\"ruby\", [\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"keyword\", \"begin\"]\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\t\"\\r\\n\\tnot a comment\\r\\n\\t\",\n\t[\"erb\", [\n\t\t[\"delimiter\", \"<%\"],\n\t\t[\"ruby\", [\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"keyword\", \"end\"]\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for block comments (#1767).\n"
  },
  {
    "path": "tests/languages/erb+haml/erb_inclusion.test",
    "content": ":erb\n\t<%= render @products || \"empty_list\" %>\n\n~\n\t:erb\n\t\t<%= render @products || \"empty_list\" %>\n\n----------------------------------------------------\n\n[\n\t[\"filter-erb\", [\n\t\t[\"filter-name\", \":erb\"],\n\t\t[\"text\", [\n\t\t\t[\"erb\", [\n\t\t\t\t[\"delimiter\", \"<%=\"],\n\t\t\t\t[\"ruby\", [\n\t\t\t\t\t\" render \",\n\t\t\t\t\t[\"variable\", \"@products\"],\n\t\t\t\t\t[\"operator\", \"||\"],\n\t\t\t\t\t[\"string-literal\", [\n\t\t\t\t\t\t[\"string\", \"\\\"empty_list\\\"\"]\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"delimiter\", \"%>\"]\n\t\t\t]]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"~\"],\n\t[\"filter-erb\", [\n\t\t[\"filter-name\", \":erb\"],\n\t\t[\"text\", [\n\t\t\t[\"erb\", [\n\t\t\t\t[\"delimiter\", \"<%=\"],\n\t\t\t\t[\"ruby\", [\n\t\t\t\t\t\" render \",\n\t\t\t\t\t[\"variable\", \"@products\"],\n\t\t\t\t\t[\"operator\", \"||\"],\n\t\t\t\t\t[\"string-literal\", [\n\t\t\t\t\t\t[\"string\", \"\\\"empty_list\\\"\"]\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"delimiter\", \"%>\"]\n\t\t\t]]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/erlang/atom_feature.test",
    "content": "foo\r\nfoo@_bar\r\n'foo bar'\r\n'\\'\\\\'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"atom\", \"foo\"],\r\n\t[\"atom\", \"foo@_bar\"],\r\n\t[\"quoted-atom\", \"'foo bar'\"],\r\n\t[\"quoted-atom\", \"'\\\\'\\\\\\\\'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for atoms and quoted atoms.\r\n"
  },
  {
    "path": "tests/languages/erlang/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/erlang/comment_feature.test",
    "content": "% foo bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"% foo bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/erlang/function_feature.test",
    "content": "spawn(\r\nfoo@_bar(\r\n'foo bar'(\r\n'\\'\\\\'(\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"spawn\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo@_bar\"], [\"punctuation\", \"(\"],\r\n\t[\"quoted-function\", \"'foo bar'\"], [\"punctuation\", \"(\"],\r\n\t[\"quoted-function\", \"'\\\\'\\\\\\\\'\"], [\"punctuation\", \"(\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions and quoted functions."
  },
  {
    "path": "tests/languages/erlang/keyword_feature.test",
    "content": "fun when case of\r\nbegin end if receive\r\nafter try catch\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"fun\"], [\"keyword\", \"when\"], [\"keyword\", \"case\"], [\"keyword\", \"of\"],\r\n\t[\"keyword\", \"begin\"], [\"keyword\", \"end\"], [\"keyword\", \"if\"], [\"keyword\", \"receive\"],\r\n\t[\"keyword\", \"after\"], [\"keyword\", \"try\"], [\"keyword\", \"catch\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/erlang/number_feature.test",
    "content": "42\r\n2#101\r\n16#1f\r\n2.3\r\n2.3e3\r\n2.3e-3\r\n$A\r\n$\\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"2#101\"],\r\n\t[\"number\", \"16#1f\"],\r\n\t[\"number\", \"2.3\"],\r\n\t[\"number\", \"2.3e3\"],\r\n\t[\"number\", \"2.3e-3\"],\r\n\t[\"number\", \"$A\"],\r\n\t[\"number\", \"$\\\\n\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers and character codes."
  },
  {
    "path": "tests/languages/erlang/operator_feature.test",
    "content": "== /= >= :=\r\n=:= =/=\r\n+ ++ - --\r\n= * / !\r\n<= < >\r\nbnot div rem band\r\nbor bxor bsl bsr\r\nnot and or xor\r\norelse andalso\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"==\"], [\"operator\", \"/=\"], [\"operator\", \">=\"], [\"operator\", \":=\"],\r\n\t[\"operator\", \"=:=\"], [\"operator\", \"=/=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"-\"], [\"operator\", \"--\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"!\"],\r\n\t[\"operator\", \"<=\"], [\"operator\", \"<\"], [\"operator\", \">\"],\r\n\t[\"operator\", \"bnot\"], [\"operator\", \"div\"], [\"operator\", \"rem\"], [\"operator\", \"band\"],\r\n\t[\"operator\", \"bor\"], [\"operator\", \"bxor\"], [\"operator\", \"bsl\"], [\"operator\", \"bsr\"],\r\n\t[\"operator\", \"not\"], [\"operator\", \"and\"], [\"operator\", \"or\"], [\"operator\", \"xor\"],\r\n\t[\"operator\", \"orelse\"], [\"operator\", \"andalso\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/erlang/string_feature.test",
    "content": "\"\"\r\n\"foo bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo bar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/erlang/variable_feature.test",
    "content": "Foo\r\n?Bar\r\n_\r\nFoo@_bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"Foo\"],\r\n\t[\"variable\", \"?Bar\"],\r\n\t[\"variable\", \"_\"],\r\n\t[\"variable\", \"Foo@_bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/etlua/delimiter_feature.test",
    "content": "<% lua_code %>\n<%= lua_expression %>\n<%- lua_expression %>\n<%= 'hello' -%>\n\n----------------------------------------------------\n\n[\n\t[\"etlua\", [\n\t\t[\"delimiter\", \"<%\"],\n\t\t[\"language-lua\", [\n\t\t\t\" lua_code \"\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\t[\"etlua\", [\n\t\t[\"delimiter\", \"<%=\"],\n\t\t[\"language-lua\", [\n\t\t\t\" lua_expression \"\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\t[\"etlua\", [\n\t\t[\"delimiter\", \"<%-\"],\n\t\t[\"language-lua\", [\n\t\t\t\" lua_expression \"\n\t\t]],\n\t\t[\"delimiter\", \"%>\"]\n\t]],\n\t[\"etlua\", [\n\t\t[\"delimiter\", \"<%=\"],\n\t\t[\"language-lua\", [\n\t\t\t[\"string\", \"'hello'\"]\n\t\t]],\n\t\t[\"delimiter\", \"-%>\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for different delimiters.\n"
  },
  {
    "path": "tests/languages/excel-formula/cell_feature.test",
    "content": "B1\r\nBBB1111\r\n\r\n$B2\r\nB$2\r\n$B$2\r\n\r\n$b2\r\nb$2\r\n$b$2\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"cell\", \"B1\"],\r\n\t[\"cell\", \"BBB1111\"],\r\n\t[\"cell\", \"$B2\"],\r\n\t[\"cell\", \"B$2\"],\r\n\t[\"cell\", \"$B$2\"],\r\n\t[\"cell\", \"$b2\"],\r\n\t[\"cell\", \"b$2\"],\r\n\t[\"cell\", \"$b$2\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for cells.\r\n"
  },
  {
    "path": "tests/languages/excel-formula/comment_feature.test",
    "content": "N(\"comment\")\n\n----------------------------------------------------\n\n[\n\t[\"function-name\", \"N\"],\n\t[\"punctuation\", \"(\"],\n\t[\"comment\", \"\\\"comment\\\"\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/excel-formula/function_feature.test",
    "content": "SUM()\r\nFOO()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function-name\", \"SUM\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"function-name\", \"FOO\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/excel-formula/number_feature.test",
    "content": "123\r\n123e11\r\n123e+11\r\n123e-11\r\n\r\n123.123\r\n123.123e11\r\n123.123e+11\r\n123.123e-11\r\n\r\n.123\r\n.123e11\r\n.123e+11\r\n.123e-11\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"123e11\"],\r\n\t[\"number\", \"123e+11\"],\r\n\t[\"number\", \"123e-11\"],\r\n\r\n\t[\"number\", \"123.123\"],\r\n\t[\"number\", \"123.123e11\"],\r\n\t[\"number\", \"123.123e+11\"],\r\n\t[\"number\", \"123.123e-11\"],\r\n\r\n\t[\"number\", \".123\"],\r\n\t[\"number\", \".123e11\"],\r\n\t[\"number\", \".123e+11\"],\r\n\t[\"number\", \".123e-11\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/excel-formula/operator_feature.test",
    "content": "+ - * / ^ %\r\n= <> < <= > >=\r\n&\r\n,\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"<>\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \",\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/excel-formula/punctuation_feature.test",
    "content": "( ; )\r\n{ | }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"|\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for punctuation.\r\n"
  },
  {
    "path": "tests/languages/excel-formula/range_feature.test",
    "content": "$B$2:$B$4\r\n$B2:B$4\r\nB$2:$B4\r\nB2:B4\r\n\r\n$B:$B\r\n$B:B\r\nB:$B\r\nB:B\r\n\r\n$2:$4\r\n$2:4\r\n2:$4\r\n2:4\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"range\", [\r\n\t\t[\"cell\", \"$B$2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"cell\", \"$B$4\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"cell\", \"$B2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"cell\", \"B$4\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"cell\", \"B$2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"cell\", \"$B4\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"cell\", \"B2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"cell\", \"B4\"]\r\n\t]],\r\n\r\n\t[\"range\", [\r\n\t\t[\"column\", \"$B\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"column\", \"$B\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"column\", \"$B\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"column\", \"B\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"column\", \"B\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"column\", \"$B\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"column\", \"B\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"column\", \"B\"]\r\n\t]],\r\n\r\n\t[\"range\", [\r\n\t\t[\"row\", \"$2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"row\", \"$4\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"row\", \"$2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"row\", \"4\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"row\", \"2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"row\", \"$4\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"row\", \"2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"row\", \"4\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for ranges.\r\n"
  },
  {
    "path": "tests/languages/excel-formula/reference_feature.test",
    "content": "Sales!B2\r\n'Winter sales'!B2\r\n[Sales.xlsx]Jan!B2:B5\r\nD:\\Reports\\[Sales.xlsx]Jan!B2:B5\r\n'[Sales.xlsx]Jan sales'!B2:B5\r\n'D:\\Reports\\[Sales.xlsx]Jan sales'!B2:B5\r\n\r\nSUM([Sales.xlsx]Jan!Jan_sales)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"reference\", [\r\n\t\t[\"sheet\", \"Sales\"],\r\n\t\t[\"operator\", \"!\"]\r\n\t]],\r\n\t[\"cell\", \"B2\"],\r\n\t[\"reference\", [\r\n\t\t[\"punctuation\", \"'\"],\r\n\t\t[\"sheet\", \"Winter sales\"],\r\n\t\t[\"punctuation\", \"'\"],\r\n\t\t[\"operator\", \"!\"]\r\n\t]],\r\n\t[\"cell\", \"B2\"],\r\n\t[\"reference\", [\r\n\t\t[\"file\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Sales.xlsx\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"sheet\", \"Jan\"],\r\n\t\t[\"operator\", \"!\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"cell\", \"B2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"cell\", \"B5\"]\r\n\t]],\r\n\t[\"reference\", [\r\n\t\t[\"path\", \"D:\\\\Reports\\\\\"],\r\n\t\t[\"file\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Sales.xlsx\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"sheet\", \"Jan\"],\r\n\t\t[\"operator\", \"!\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"cell\", \"B2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"cell\", \"B5\"]\r\n\t]],\r\n\t[\"reference\", [\r\n\t\t[\"punctuation\", \"'\"],\r\n\t\t[\"file\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Sales.xlsx\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"sheet\", \"Jan sales\"],\r\n\t\t[\"punctuation\", \"'\"],\r\n\t\t[\"operator\", \"!\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"cell\", \"B2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"cell\", \"B5\"]\r\n\t]],\r\n\t[\"reference\", [\r\n\t\t[\"punctuation\", \"'\"],\r\n\t\t[\"path\", \"D:\\\\Reports\\\\\"],\r\n\t\t[\"file\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Sales.xlsx\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"sheet\", \"Jan sales\"],\r\n\t\t[\"punctuation\", \"'\"],\r\n\t\t[\"operator\", \"!\"]\r\n\t]],\r\n\t[\"range\", [\r\n\t\t[\"cell\", \"B2\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"cell\", \"B5\"]\r\n\t]],\r\n\t[\"function-name\", \"SUM\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"reference\", [\r\n\t\t[\"file\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Sales.xlsx\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"sheet\", \"Jan\"],\r\n\t\t[\"operator\", \"!\"]\r\n\t]],\r\n\t\"Jan_sales\",\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for references.\r\n"
  },
  {
    "path": "tests/languages/excel-formula/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n\"foo\r\nbar\"\r\n\"foo\"\"bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\\\"bar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/factor/builtin_words_feature.test",
    "content": "and not with map filter\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[ \"kernel-builtin\", \"and\" ],\r\n\t[ \"kernel-builtin\", \"not\" ],\r\n\t[ \"combinators\", \"with\" ],\r\n\t[ \"combinators\", \"map\" ],\r\n\t[ \"combinators\", \"filter\" ]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nsome builtins\r\n"
  },
  {
    "path": "tests/languages/factor/colon_words_feature.test",
    "content": ": a ( -- ) ;\r\n:: ; ! ; is not a word name\r\n:: ;a ! ;a is a word name\r\nUSING: a b c ;\r\nUSE: a\r\nIN: a.b\r\nCHAR: a\r\n#: a\r\nGENERIC#: a\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[ \"colon-syntax\", \": a\" ],\r\n\r\n\t[ \"stack-effect-delimiter\", \"(\" ],\r\n\t[ \"stack-effect-delimiter\", \"--\" ],\r\n\t[ \"stack-effect-delimiter\", \")\" ],\r\n\r\n\t[ \"semicolon-or-setlocal\", \";\" ],\r\n\r\n\t[ \"normal-word\", \"::\" ],\r\n\t[ \"semicolon-or-setlocal\", \";\" ],\r\n\t[ \"comment\", [ \"! ; is not a word name\" ] ],\r\n\r\n\t[ \"colon-syntax\", \":: ;a\" ],\r\n\t[ \"comment\", [ \"! ;a is a word name\" ] ],\r\n\r\n\t[ \"special-using\",\r\n\t\t[ \"USING: \",\r\n\t\t\t[ \"string\", \"a\" ],\r\n\t\t\t[ \"string\", \"b\" ],\r\n\t\t\t[ \"string\", \"c\" ]\r\n\t\t]\r\n\t],\r\n\t[ \"semicolon-or-setlocal\", \";\" ],\r\n\t[ \"colon-syntax\", \"USE: a\" ],\r\n\t[ \"colon-syntax\", \"IN: a.b\" ],\r\n\t[ \"colon-syntax\", \"CHAR: a\" ],\r\n\t[ \"normal-word\", \"#:\" ],\r\n\t[ \"normal-word\", \"a\" ],\r\n\t[ \"colon-syntax\", \"GENERIC#: a\" ]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\ncolon-ended parsing words\r\n"
  },
  {
    "path": "tests/languages/factor/comments_feature.test",
    "content": "a! ! word\r\n!a ! word\r\n! comment\r\n! TODO: something\r\n!\tbad\r\n! \tfine\r\n! \"also a comment\"\r\n! : ( -- ) ;\r\n! ! leading comment-like token\r\n   ! whitespace before\r\nwords blah ! comment after code on a line\r\n\r\n![[ comment ]]\r\n\"![[ string ]]\"\r\n![[ \"comment\" ]]\r\n\r\n![[ comment]]\r\n![==[ comment ]==]\r\n![==[ comment]==]\r\n![=[word ]=]\r\n![=======[ words ]=======]\r\n\r\n/* com\r\nment */\r\n/* com\r\nment*/\r\n/*word */\r\n\r\n/* \"comment\" */\r\n\"/* \"strings\" */\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"conventionally-named-word\", \"a!\"],\r\n\t[\"comment\", [\"! word\"]],\r\n\t[\"normal-word\", \"!a\"],\r\n\t[\"comment\", [\"! word\"]],\r\n\t[\"comment\", [\"! comment\"]],\r\n\t[\"comment\", [\r\n\t\t\"! \",\r\n\t\t[\"function\", \"TODO\"],\r\n\t\t\": something\"\r\n\t]],\r\n\t[\"normal-word\", \"!\"],\r\n\t[\"normal-word\", \"bad\"],\r\n\t[\"comment\", [\"! \\tfine\"]],\r\n\t[\"comment\", [\"! \\\"also a comment\\\"\"]],\r\n\t[\"comment\", [\"! : ( -- ) ;\"]],\r\n\t[\"comment\", [\"! ! leading comment-like token\"]],\r\n\t[\"comment\", [\"! whitespace before\"]],\r\n\t[\"normal-word\", \"words\"],\r\n\t[\"normal-word\", \"blah\"],\r\n\t[\"comment\", [\"! comment after code on a line\"]],\r\n\r\n\t[\"comment\", [\"![[ comment ]]\"]],\r\n\t[\"string\", [\"\\\"![[ string ]]\\\"\"]],\r\n\t[\"comment\", [\"![[ \\\"comment\\\" ]]\"]],\r\n\r\n\t[\"comment\", [\"![[ comment]]\"]],\r\n\t[\"comment\", [\"![==[ comment ]==]\"]],\r\n\t[\"comment\", [\"![==[ comment]==]\"]],\r\n\t[\"normal-word\", \"![=[word\"],\r\n\t[\"normal-word\", \"]=]\"],\r\n\t[\"normal-word\", \"![=======[\"],\r\n\t[\"normal-word\", \"words\"],\r\n\t[\"normal-word\", \"]=======]\"],\r\n\r\n\t[\"comment\", [\"/* com\\r\\nment */\"]],\r\n\t[\"comment\", [\"/* com\\r\\nment*/\"]],\r\n\t[\"normal-word\", \"/*word\"], [\"normal-word\", \"*/\"],\r\n\r\n\t[\"comment\", [\"/* \\\"comment\\\" */\"]],\r\n\t[\"string\", [\"\\\"/* \\\"\"]], \"strings\", [\"string\", [\"\\\" */\\\"\"]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/factor/constructors_feature.test",
    "content": "<array> <byte-array> <string>\r\n\r\n<=> <-->\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[ \"constructor-word\", \"<array>\" ],\r\n\t[ \"constructor-word\", \"<byte-array>\" ],\r\n\t[ \"constructor-word\", \"<string>\" ],\r\n\r\n\t[ \"conventionally-named-word\", \"<=>\" ],\r\n\t[ \"conventionally-named-word\", \"<-->\" ]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nctors\r\n"
  },
  {
    "path": "tests/languages/factor/normal_words_feature.test",
    "content": "commas, primes'\r\nset-x\r\nchange-x\r\nwith-x\r\nnew-x\r\n>string\r\nbase>\r\nstring>number\r\n+symbol+\r\nque?\r\n?of\r\n?of*\r\nreader>>\r\n>>setter\r\nwriter<<\r\n(detail)\r\nmutater!\r\nvariant*\r\nprettyprint.\r\n$help\r\n\r\n\"no\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[ \"normal-word\", \"commas,\" ],\r\n\t[ \"normal-word\", \"primes'\" ],\r\n\t[ \"conventionally-named-word\", \"set-x\" ],\r\n\t[ \"conventionally-named-word\", \"change-x\" ],\r\n\t[ \"conventionally-named-word\", \"with-x\" ],\r\n\t[ \"conventionally-named-word\", \"new-x\" ],\r\n\t[ \"conventionally-named-word\", \">string\" ],\r\n\t[ \"conventionally-named-word\", \"base>\" ],\r\n\t[ \"conventionally-named-word\", \"string>number\" ],\r\n\t[ \"conventionally-named-word\", \"+symbol+\" ],\r\n\t[ \"conventionally-named-word\", \"que?\" ],\r\n\t[ \"conventionally-named-word\", \"?of\" ],\r\n\t[ \"conventionally-named-word\", \"?of*\" ],\r\n\t[ \"conventionally-named-word\", \"reader>>\" ],\r\n\t[ \"conventionally-named-word\", \">>setter\" ],\r\n\t[ \"conventionally-named-word\", \"writer<<\" ],\r\n\t[ \"conventionally-named-word\", \"(detail)\" ],\r\n\t[ \"conventionally-named-word\", \"mutater!\" ],\r\n\t[ \"conventionally-named-word\", \"variant*\" ],\r\n\t[ \"conventionally-named-word\", \"prettyprint.\" ],\r\n\t[ \"conventionally-named-word\", \"$help\" ],\r\n\t\"\\r\\n\\r\\n\\\"no\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\n\"Normal\" words are not builtin well-known ones like \"not\", \"and\", \"<=>\", though they may be in the standard library or user-defined.\r\nThey may start with any character except `\"` (double-quote), but may contain or end with double-quotes or any other non-whitespace character.\r\n\r\nConventionally named words follow the conventions outlined in prism-factor.js.\r\n"
  },
  {
    "path": "tests/languages/factor/numbers_feature.test",
    "content": "5 1/5 +9 -9 +1/5 -1/5 23+1/5 -23-1/5 23-1/5 ! last one = word\r\n\r\n0.01 0e0 3E4 3e-4 3E-4 030 0xd 0o30 0b1100\r\n-0 -0.01 -0e0 -3E4 -3E-4 -030 -0xd -0o30 -0b1100\r\n\r\n348756424956392657834385437598743583648756332457\r\n-348756424956392657834385437598743583648756332457\r\n\r\nNAN: 80000deadbeef\r\n\r\n0x1.0p3\r\n0b1.010p2\r\n0x1.p1\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"5\"],\r\n\t[\"number\", \"1/5\"],\r\n\t[\"number\", \"+9\"],\r\n\t[\"number\", \"-9\"],\r\n\t[\"number\", \"+1/5\"],\r\n\t[\"number\", \"-1/5\"],\r\n\t[\"number\", \"23+1/5\"],\r\n\t[\"number\", \"-23-1/5\"],\r\n\t[\"normal-word\", \"23-1/5\"],\r\n\t[\"comment\", [\"! last one = word\"]],\r\n\r\n\t[\"number\", \"0.01\"],\r\n\t[\"number\", \"0e0\"],\r\n\t[\"number\", \"3E4\"],\r\n\t[\"number\", \"3e-4\"],\r\n\t[\"number\", \"3E-4\"],\r\n\t[\"number\", \"030\"],\r\n\t[\"number\", \"0xd\"],\r\n\t[\"number\", \"0o30\"],\r\n\t[\"number\", \"0b1100\"],\r\n\r\n\t[\"number\", \"-0\"],\r\n\t[\"number\", \"-0.01\"],\r\n\t[\"number\", \"-0e0\"],\r\n\t[\"number\", \"-3E4\"],\r\n\t[\"number\", \"-3E-4\"],\r\n\t[\"number\", \"-030\"],\r\n\t[\"number\", \"-0xd\"],\r\n\t[\"number\", \"-0o30\"],\r\n\t[\"number\", \"-0b1100\"],\r\n\r\n\t[\"number\", \"348756424956392657834385437598743583648756332457\"],\r\n\t[\"number\", \"-348756424956392657834385437598743583648756332457\"],\r\n\r\n\t[\"number\", \"NAN: 80000deadbeef\"],\r\n\r\n\t[\"number\", \"0x1.0p3\"],\r\n\t[\"number\", \"0b1.010p2\"],\r\n\t[\"number\", \"0x1.p1\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nnumbers\r\n"
  },
  {
    "path": "tests/languages/factor/other_builtin_parsing_words_feature.test",
    "content": "<PRIVATE\r\n:>\r\nPRIVATE>\r\n$[ some code ]\r\n<< some code >>\r\n\\ M\\\r\n\r\n--------------------------------------------------\r\n\r\n[\r\n\t[ \"other-builtin-syntax\", \"<PRIVATE\" ],\r\n\t[ \"semicolon-or-setlocal\", \":>\" ],\r\n\t[ \"other-builtin-syntax\", \"PRIVATE>\" ],\r\n\t[ \"other-builtin-syntax\", \"$[\" ],\r\n\t[ \"normal-word\", \"some\" ],\r\n\t[ \"normal-word\", \"code\" ],\r\n\t[ \"quotation-delimiter\", \"]\" ],\r\n\t[ \"other-builtin-syntax\", \"<<\" ],\r\n\t[ \"normal-word\", \"some\" ],\r\n\t[ \"normal-word\", \"code\" ],\r\n\t[ \"other-builtin-syntax\", \">>\" ],\r\n\t[ \"other-builtin-syntax\", \"\\\\\" ],\r\n\t[ \"other-builtin-syntax\", \"M\\\\\" ]\r\n]\r\n\r\n\r\n--------------------------------------------------\r\n\r\nvarious builtin parsing words from the syntax and kernel vocabs\r\n"
  },
  {
    "path": "tests/languages/factor/quotations_feature.test",
    "content": "] [ x y z and ] [\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"normal-word\", \"]\"],\r\n\t[\"quotation-delimiter\", \"[\"],\r\n\t[\"normal-word\", \"x\" ],\r\n\t[\"normal-word\", \"y\"],\r\n\t[\"normal-word\", \"z\"],\r\n\t[\"kernel-builtin\", \"and\"],\r\n\t[\"quotation-delimiter\", \"]\"],\r\n\t[\"normal-word\", \"[\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nquotation syntax\r\n] at the beginning, and [ at the end of the file should not be highlighted as delimiters\r\n"
  },
  {
    "path": "tests/languages/factor/regexps_feature.test",
    "content": "R/  abcde/i-r\r\nR/\r\nabcde?.+\\?\\*\\+/\r\nR/ \\\\/\r\nR/ \\//idmsr\r\nR/ \\/idmsr/\r\n\r\n-----------------------------\r\n\r\n[\r\n\t[ \"regexp\", [ \"R/  abcde/\", [ \"operator\", \"i-r\" ] ] ],\r\n\t[ \"regexp\", [\r\n\t\t\"R/\\r\\nabcde\",\r\n\t\t[ \"keyword\", \"?\" ],\r\n\t\t[ \"keyword\", \".\" ],\r\n\t\t[ \"keyword\", \"+\" ],\r\n\t\t[ \"variable\", \"\\\\?\" ],\r\n\t\t[ \"variable\", \"\\\\*\" ],\r\n\t\t[ \"variable\", \"\\\\+\" ],\r\n\t\t\"/\"\r\n\t] ],\r\n\t[ \"regexp\", [ \"R/ \", [ \"variable\", \"\\\\\\\\\"], \"/\"] ],\r\n\t[ \"regexp\", [ \"R/ \", [ \"variable\", \"\\\\/\" ], \"/\", [ \"operator\", \"idmsr\" ] ] ],\r\n\t[ \"regexp\", [ \"R/ \", [ \"variable\", \"\\\\/\" ], \"idmsr/\" ] ]\r\n]\r\n\r\n-----------------------------\r\n"
  },
  {
    "path": "tests/languages/factor/sequences_feature.test",
    "content": "}\r\n{ 1 2 3 4 }\r\n{ a b c d e f }\r\n{ \"a\" \"b\" \"c\" }\r\n\r\n{ { a b } { c d } }\r\nH{ { a b } { c d } }\r\nH{ { \"a\" \"b\" } { \"c\" \"d\" } }\r\nV{ 1 2 3 4 }\r\nV{ \"1\" \"2\" \"3\" \"4\" }\r\nBV{ 1 2 3 4 }\r\n{\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"normal-word\", \"}\"],\r\n\t[\"curly-brace-literal-delimiter\", \"{\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\r\n\t[\"curly-brace-literal-delimiter\", \"{\"],\r\n\t[\"normal-word\", \"a\"],\r\n\t[\"normal-word\", \"b\"],\r\n\t[\"normal-word\", \"c\"],\r\n\t[\"normal-word\", \"d\"],\r\n\t[\"normal-word\", \"e\"],\r\n\t[\"boolean\", \"f\"],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\r\n\t[\"curly-brace-literal-delimiter\", \"{\"],\r\n\t[\"string\", [\"\\\"a\\\"\"] ],\r\n\t[\"string\", [\"\\\"b\\\"\"] ],\r\n\t[\"string\", [\"\\\"c\\\"\"] ],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\r\n\t[\"curly-brace-literal-delimiter\", \"{\"],\r\n\t[\"curly-brace-literal-delimiter\", \"{\"],\r\n\t[\"normal-word\", \"a\"],\r\n\t[\"normal-word\", \"b\"],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\t[\"curly-brace-literal-delimiter\", \"{\"],\r\n\t[\"normal-word\", \"c\"],\r\n\t[\"normal-word\", \"d\"],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\r\n\t[\"curly-brace-literal-delimiter\", \"H{\"],\r\n\t[\"curly-brace-literal-delimiter\", \"{\"],\r\n\t[\"normal-word\", \"a\"],\r\n\t[\"normal-word\", \"b\"],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\t[\"curly-brace-literal-delimiter\", \"{\"],\r\n\t[\"normal-word\", \"c\"],\r\n\t[\"normal-word\", \"d\"],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\r\n\t[\"curly-brace-literal-delimiter\", \"H{\"],\r\n\t[\"curly-brace-literal-delimiter\", \"{\"],\r\n\t[\"string\", [\"\\\"a\\\"\"]],\r\n\t[\"string\", [\"\\\"b\\\"\"]],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\t[\"curly-brace-literal-delimiter\", \"{\"],\r\n\t[\"string\", [\"\\\"c\\\"\"]],\r\n\t[\"string\", [\"\\\"d\\\"\"]],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\r\n\t[\"curly-brace-literal-delimiter\", \"V{\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\r\n\t[\"curly-brace-literal-delimiter\", \"V{\"],\r\n\t[\"string\", [\"\\\"1\\\"\"]],\r\n\t[\"string\", [\"\\\"2\\\"\"]],\r\n\t[\"string\", [\"\\\"3\\\"\"]],\r\n\t[\"string\", [\"\\\"4\\\"\"]],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\r\n\t[\"curly-brace-literal-delimiter\", \"BV{\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"curly-brace-literal-delimiter\", \"}\"],\r\n\t[\"normal-word\", \"{\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\n} / { at the front / EOF are not delimiters\r\n"
  },
  {
    "path": "tests/languages/factor/stack_effects_feature.test",
    "content": "( -- )\r\n( a b -- c )\r\n( a: integer b: string -- c: word )\r\n( x y quot: ( ..a -- ..a ) -- ..a )\r\ncall( -- )\r\ncall( x -- y )\r\nexecute( x -- y )\r\neval( x -- y )\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[ \"stack-effect-delimiter\", \"(\" ],\r\n\t[ \"stack-effect-delimiter\", \"--\" ],\r\n\t[ \"stack-effect-delimiter\", \")\" ],\r\n\r\n\t[ \"stack-effect-delimiter\", \"(\" ],\r\n\t[ \"normal-word\", \"a\" ],\r\n\t[ \"normal-word\", \"b\" ],\r\n\t[ \"stack-effect-delimiter\", \"--\" ],\r\n\t[ \"normal-word\", \"c\" ],\r\n\t[ \"stack-effect-delimiter\", \")\" ],\r\n\r\n\t[ \"stack-effect-delimiter\", \"(\" ],\r\n\t[ \"normal-word\", \"a:\" ],\r\n\t[ \"math-builtin\", \"integer\" ],\r\n\t[ \"normal-word\", \"b:\" ],\r\n\t[ \"normal-word\", \"string\" ],\r\n\t[ \"stack-effect-delimiter\", \"--\" ],\r\n\t[ \"normal-word\", \"c:\" ],\r\n\t[ \"normal-word\", \"word\" ],\r\n\t[ \"stack-effect-delimiter\", \")\" ],\r\n\r\n\t[ \"stack-effect-delimiter\", \"(\" ],\r\n\t[ \"normal-word\", \"x\" ],\r\n\t[ \"normal-word\", \"y\" ],\r\n\t[ \"normal-word\", \"quot:\" ],\r\n\r\n\t[ \"stack-effect-delimiter\", \"(\" ],\r\n\t[ \"normal-word\", \"..a\" ],\r\n\t[ \"stack-effect-delimiter\", \"--\" ],\r\n\t[ \"normal-word\", \"..a\" ],\r\n\t[ \"stack-effect-delimiter\", \")\" ],\r\n\r\n\t[ \"stack-effect-delimiter\", \"--\" ],\r\n\t[ \"normal-word\", \"..a\" ],\r\n\t[ \"stack-effect-delimiter\", \")\" ],\r\n\r\n\t[ \"stack-effect-delimiter\", \"call(\" ],\r\n\t[ \"stack-effect-delimiter\", \"--\" ],\r\n\t[ \"stack-effect-delimiter\", \")\" ],\r\n\r\n\t[ \"stack-effect-delimiter\", \"call(\" ],\r\n\t[ \"normal-word\", \"x\" ],\r\n\t[ \"stack-effect-delimiter\", \"--\" ],\r\n\t[ \"normal-word\", \"y\" ],\r\n\t[ \"stack-effect-delimiter\", \")\" ],\r\n\r\n\t[ \"stack-effect-delimiter\", \"execute(\" ],\r\n\t[ \"normal-word\", \"x\" ],\r\n\t[ \"stack-effect-delimiter\", \"--\" ],\r\n\t[ \"normal-word\", \"y\" ],\r\n\t[ \"stack-effect-delimiter\", \")\" ],\r\n\r\n\t[ \"stack-effect-delimiter\", \"eval(\" ],\r\n\t[ \"normal-word\", \"x\" ],\r\n\t[ \"stack-effect-delimiter\", \"--\" ],\r\n\t[ \"normal-word\", \"y\" ],\r\n\t[ \"stack-effect-delimiter\", \")\" ]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nstack effect syntax\r\n"
  },
  {
    "path": "tests/languages/factor/strings_feature.test",
    "content": "\"s\" word\"word\" ! word: word\"word\"\r\n\"adjacent\"\"strings\"\r\n\" ! str not comment\" ! comment\r\n\"!\"\r\n\" ! \"\r\n\"! \"\r\n\r\n\"\\\"\"\r\n\"'\"\r\n\"\\n\"\r\n\"\\\\\"\r\n\r\n\"str\"5\r\n\"str\"[ ]\r\n\"str\"{ }\r\n{ \"a\"}\r\n\"5\"\r\n\"1/5\"\r\n\"+5\"\r\n\"-5\"\r\n\r\n\"sssssh\" \"(\" \")\" surround .\r\n\r\nHEREDOC: marker\r\ntext \\n\r\nmarker\r\n\r\nSTRING: name\r\ntext \\n\r\n;\r\n\r\n[[ string ]]\r\n[[ string]]\r\n[==[ string ]==]\r\n[==[ string]==]\r\n\r\n[[word ]]\r\n\r\nURL\" \" URL\"\"\r\nSBUF\" \" SBUF\"\"\r\nP\" \" P\"\"\r\n\r\nP\" as\\\\\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"s\\\"\"]],\r\n\t[\"normal-word\", \"word\\\"word\\\"\"],\r\n\t[\"comment\", [\"! word: word\\\"word\\\"\"]],\r\n\t[\"string\", [\"\\\"adjacent\\\"\"]],\r\n\t[\"string\", [\"\\\"strings\\\"\"]],\r\n\t[\"string\", [\"\\\" ! str not comment\\\"\"]],\r\n\t[\"comment\", [\"! comment\"]],\r\n\t[\"string\", [\"\\\"!\\\"\"]],\r\n\t[\"string\", [\"\\\" ! \\\"\"]],\r\n\t[\"string\", [\"\\\"! \\\"\"]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"number\", \"\\\\\\\"\"],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\"\\\"'\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"number\", \"\\\\n\"],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"number\", \"\\\\\\\\\"],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\"\\\"str\\\"\"]], \"5\\r\\n\",\r\n\t[\"string\", [\"\\\"str\\\"\"]], \"[ \", [\"quotation-delimiter\", \"]\"],\r\n\t[\"string\", [\"\\\"str\\\"\"]], \"{ \", [\"curly-brace-literal-delimiter\", \"}\"],\r\n\t[\"curly-brace-literal-delimiter\", \"{\"], [\"string\", [\"\\\"a\\\"\"]], \"}\\r\\n\",\r\n\t[\"string\", [\"\\\"5\\\"\"]],\r\n\t[\"string\", [\"\\\"1/5\\\"\"]],\r\n\t[\"string\", [\"\\\"+5\\\"\"]],\r\n\t[\"string\", [\"\\\"-5\\\"\"]],\r\n\r\n\t[\"string\", [\"\\\"sssssh\\\"\"]],\r\n\t[\"string\", [\"\\\"(\\\"\"]],\r\n\t[\"string\", [\"\\\")\\\"\"]],\r\n\t[\"sequences-builtin\", \"surround\"],\r\n\t[\"normal-word\", \".\"],\r\n\r\n\t[\"multiline-string\", [\r\n\t\t\"HEREDOC: marker\\r\\ntext \", [\"number\", \"\\\\n\"],\r\n\t\t\"\\r\\nmarker\"\r\n\t]],\r\n\r\n\t[\"multiline-string\", [\r\n\t\t\"STRING: name\\r\\ntext \", [\"number\", \"\\\\n\"],\r\n\t\t[\"semicolon-or-setlocal\", \";\"]\r\n\t]],\r\n\r\n\t[\"multiline-string\", [\"[[ string ]]\"]],\r\n\t[\"multiline-string\", [\"[[ string]]\"]],\r\n\t[\"multiline-string\", [\"[==[ string ]==]\"]],\r\n\t[\"multiline-string\", [\"[==[ string]==]\"]],\r\n\r\n\t[\"normal-word\", \"[[word\"], [\"normal-word\", \"]]\"],\r\n\r\n\t[\"custom-string\", [\"URL\\\" \\\"\"]], [\"normal-word\", \"URL\\\"\\\"\"],\r\n\t[\"custom-string\", [\"SBUF\\\" \\\"\"]], [\"normal-word\", \"SBUF\\\"\\\"\"],\r\n\t[\"custom-string\", [\"P\\\" \\\"\"]], [\"normal-word\", \"P\\\"\\\"\"],\r\n\r\n\t[\"custom-string\", [\r\n\t\t\"P\\\" as\",\r\n\t\t[\"number\", \"\\\\\\\\\"],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t\"\\\"\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nstring kinds\r\n"
  },
  {
    "path": "tests/languages/false/assembler_code_feature.test",
    "content": "0`\n65535`\n\n----------------------------------------------------\n\n[\n\t[\"assembler-code\", \"0`\"],\n\t[\"assembler-code\", \"65535`\"]\n]\n\n----------------------------------------------------\n\nChecks for assembler codes.\n"
  },
  {
    "path": "tests/languages/false/character_code_feature.test",
    "content": "'\n'\t\n' \n''\n\n----------------------------------------------------\n\n[\n\t[\"character-code\", \"'\\r\\n\"], [\"character-code\", \"'\\t\"],\n\t[\"character-code\", \"' \"],\n\t[\"character-code\", \"''\"]\n]\n\n----------------------------------------------------\n\nChecks for character codes.\n"
  },
  {
    "path": "tests/languages/false/comment_feature.test",
    "content": "{\n}\n{!#$%&'*+,-./:;=>?@[\\]^_`|~ßø}\n{\"\"}\n{foo}\n{{}\n{}\n{}{}\n{}}\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"{\\r\\n}\"],\n\t[\"comment\", \"{!#$%&'*+,-./:;=>?@[\\\\]^_`|~ßø}\"],\n\t[\"comment\", \"{\\\"\\\"}\"],\n\t[\"comment\", \"{foo}\"],\n\t[\"comment\", \"{{}\"],\n\t[\"comment\", \"{}\"],\n\t[\"comment\", \"{}\"], [\"comment\", \"{}\"],\n\t[\"comment\", \"{}\"], \"}\"\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/false/non-standard_feature.test",
    "content": "( ) < B D O ®\n\n----------------------------------------------------\n\n[\n\t[\"non-standard\", \"(\"],\n\t[\"non-standard\", \")\"],\n\t[\"non-standard\", \"<\"],\n\t[\"non-standard\", \"B\"],\n\t[\"non-standard\", \"D\"],\n\t[\"non-standard\", \"O\"],\n\t[\"non-standard\", \"®\"]\n]\n"
  },
  {
    "path": "tests/languages/false/operator_feature.test",
    "content": "!\n#\n$\n%\n&\n*\n+\n,\n-\n.\n/\n:\n;\n=\n>\n?\n@\n\\\n^\n_\n`\n|\n~\nß\nø\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"#\"],\n\t[\"operator\", \"$\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \",\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \".\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \":\"],\n\t[\"operator\", \";\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"?\"],\n\t[\"operator\", \"@\"],\n\t[\"operator\", \"\\\\\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"_\"],\n\t[\"operator\", \"`\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"ß\"],\n\t[\"operator\", \"ø\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/false/punctuation_feature.test",
    "content": "[\n]\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation marks.\n"
  },
  {
    "path": "tests/languages/false/string_feature.test",
    "content": "\"\n\"\n\"!#$%&'*+,-./:;=>?@[\\]^_`|~ßø\"\n\"\"\n\"\"\"\"\n\"foo\"\n\"{}\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\r\\n\\\"\"],\n\t[\"string\", \"\\\"!#$%&'*+,-./:;=>?@[\\\\]^_`|~ßø\\\"\"],\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"\\\"\"], [\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"{}\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/false/variable_feature.test",
    "content": "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nw\nx\ny\nz\nzzz\n\n----------------------------------------------------\n\n[\n\t[\"variable\", \"a\"],\n\t[\"variable\", \"b\"],\n\t[\"variable\", \"c\"],\n\t[\"variable\", \"d\"],\n\t[\"variable\", \"e\"],\n\t[\"variable\", \"f\"],\n\t[\"variable\", \"g\"],\n\t[\"variable\", \"h\"],\n\t[\"variable\", \"i\"],\n\t[\"variable\", \"j\"],\n\t[\"variable\", \"k\"],\n\t[\"variable\", \"l\"],\n\t[\"variable\", \"m\"],\n\t[\"variable\", \"n\"],\n\t[\"variable\", \"o\"],\n\t[\"variable\", \"p\"],\n\t[\"variable\", \"q\"],\n\t[\"variable\", \"r\"],\n\t[\"variable\", \"s\"],\n\t[\"variable\", \"t\"],\n\t[\"variable\", \"u\"],\n\t[\"variable\", \"v\"],\n\t[\"variable\", \"w\"],\n\t[\"variable\", \"x\"],\n\t[\"variable\", \"y\"],\n\t[\"variable\", \"z\"],\n\t[\"variable\", \"z\"], [\"variable\", \"z\"], [\"variable\", \"z\"]\n]\n\n----------------------------------------------------\n\nChecks for variables.\n"
  },
  {
    "path": "tests/languages/firestore-security-rules/comment_feature.test",
    "content": "// comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/firestore-security-rules/keyword_feature.test",
    "content": "allow\r\nfunction\r\nif\r\nmatch\r\nnull\r\nreturn\r\nrules_version\r\nservice\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"allow\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"match\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"rules_version\"],\r\n\t[\"keyword\", \"service\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/firestore-security-rules/method_feature.test",
    "content": "allow read;\r\nallow read, write: if false;\r\nallow get, list, update;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"allow\"],\r\n\t[\"method\", [\r\n\t\t\"read\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"allow\"],\r\n\t[\"method\", [\r\n\t\t\"read\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" write\"\r\n\t]],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"boolean\", \"false\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"allow\"],\r\n\t[\"method\", [\r\n\t\t\"get\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" list\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" update\"\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for methods.\r\n"
  },
  {
    "path": "tests/languages/firestore-security-rules/number_feature.test",
    "content": "123\r\n1.23\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"1.23\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/firestore-security-rules/operator_feature.test",
    "content": "+ - * / %\r\n< > <= >= != ==\r\n! && ||\r\n\r\nin is\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\r\n\t[\"operator\", \"in\"],\r\n\t[\"operator\", \"is\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/firestore-security-rules/path_feature.test",
    "content": "/databases/foo\r\n\r\n/foo/{wildcard}\r\n/foo/{wildcard}/bar\r\n/foo/{x}/{y}/{z}/bar\r\n\r\n/foo/$(x)/$(y)/bar/$(request.auth.uid)\r\n/cities/{document=**}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"path\", [\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t\"databases\",\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t\"foo\"\r\n\t]],\r\n\r\n\t[\"path\", [\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t\"foo\",\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"wildcard\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t\"foo\",\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"wildcard\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t\"bar\"\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t\"foo\",\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"x\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"y\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"z\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t\"bar\"\r\n\t]],\r\n\r\n\t[\"path\", [\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t\"foo\",\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"x\",\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"y\",\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t\"bar\",\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"request\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"auth\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"uid\",\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t\"cities\",\r\n\t\t[\"punctuation\", \"/\"],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"document\",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"keyword\", \"**\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for paths.\r\n"
  },
  {
    "path": "tests/languages/firestore-security-rules/punctuation_feature.test",
    "content": ". : , ;\r\n[ ] ( ) { }\r\n\r\n[0:2]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"[\"],\r\n\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for punctuation.\r\n"
  },
  {
    "path": "tests/languages/firestore-security-rules/string_feature.test",
    "content": "''\r\n'foo'\r\n\"\"\r\n\"foo\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'foo'\"],\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/flow/flow-punctuation_feature.test",
    "content": "{| foo : string |}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"flow-punctuation\", \"{|\"], \" foo \", [\"operator\", \":\"],\r\n\t[\"type\", \"string\"], [\"flow-punctuation\", \"|}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Flow specific punctuation.\r\n"
  },
  {
    "path": "tests/languages/flow/function-variable_feature.test",
    "content": "foo = (a: number) : number => {}\r\nbar = () : string => {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function-variable\", \"foo\"], [\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"], \"a\", [\"operator\", \":\"],\r\n\t[\"type\", \"number\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", \":\"], [\"type\", \"number\"],\r\n\t[\"operator\", \"=>\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"function-variable\", \"bar\"], [\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"operator\", \":\"], [\"type\", \"string\"],\r\n\t[\"operator\", \"=>\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for function variables containing types.\r\n"
  },
  {
    "path": "tests/languages/flow/keyword_feature.test",
    "content": "type\r\nopaque\r\ndeclare\r\nClass\r\n$await\r\n$Diff\r\n$Exact\r\n$Keys\r\n$ObjMap\r\n$PropertyType\r\n$Shape\r\n$Record\r\n$Supertype\r\n$Subtype\r\n$Enum\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"opaque\"],\r\n\t[\"keyword\", \"declare\"],\r\n\t[\"keyword\", \"Class\"],\r\n\t[\"keyword\", \"$await\"],\r\n\t[\"keyword\", \"$Diff\"],\r\n\t[\"keyword\", \"$Exact\"],\r\n\t[\"keyword\", \"$Keys\"],\r\n\t[\"keyword\", \"$ObjMap\"],\r\n\t[\"keyword\", \"$PropertyType\"],\r\n\t[\"keyword\", \"$Shape\"],\r\n\t[\"keyword\", \"$Record\"],\r\n\t[\"keyword\", \"$Supertype\"],\r\n\t[\"keyword\", \"$Subtype\"],\r\n\t[\"keyword\", \"$Enum\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/flow/type_feature.test",
    "content": "Number\r\nnumber\r\nString\r\nstring\r\nBoolean\r\nboolean\r\nSymbol\r\nsymbol\r\nFunction\r\nany\r\nmixed\r\nnull\r\nvoid\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"type\", \"Number\"],\r\n\t[\"type\", \"number\"],\r\n\t[\"type\", \"String\"],\r\n\t[\"type\", \"string\"],\r\n\t[\"type\", \"Boolean\"],\r\n\t[\"type\", \"boolean\"],\r\n\t[\"type\", \"Symbol\"],\r\n\t[\"type\", \"symbol\"],\r\n\t[\"type\", \"Function\"],\r\n\t[\"type\", \"any\"],\r\n\t[\"type\", \"mixed\"],\r\n\t[\"type\", \"null\"],\r\n\t[\"type\", \"void\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for types.\r\n"
  },
  {
    "path": "tests/languages/fortran/boolean_feature.test",
    "content": ".TRUE.\r\n.false.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \".TRUE.\"],\r\n\t[\"boolean\", \".false.\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for boolean."
  },
  {
    "path": "tests/languages/fortran/comment_feature.test",
    "content": "!\r\n! foobar\r\n! This \"string\" should not be highlighted\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"!\"],\r\n\t[\"comment\", \"! foobar\"],\r\n\t[\"comment\", \"! This \\\"string\\\" should not be highlighted\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/fortran/keyword_feature.test",
    "content": "INTEGER\r\nREAL\r\nDOUBLE PRECISION\r\nDOUBLEPRECISION\r\nCOMPLEX\r\nCHARACTER\r\nLOGICAL\r\n\r\nALLOCATABLE\r\nALLOCATE\r\nBACKSPACE\r\nCALL\r\nCASE\r\nCLOSE\r\nCOMMON\r\nCONTAINS\r\nCONTINUE\r\nCYCLE\r\nDATA\r\nDEALLOCATE\r\nDIMENSION\r\nDO\r\nEND\r\nEQUIVALENCE\r\nEXIT\r\nEXTERNAL\r\nFORMAT\r\nGO TO\r\nGOTO\r\nIMPLICIT\r\nIMPLICIT NONE\r\nINQUIRE\r\nINTENT\r\nINTRINSIC\r\nMODULE PROCEDURE\r\nNAMELIST\r\nNULLIFY\r\nOPEN\r\nOPTIONAL\r\nPARAMETER\r\nPOINTER\r\nPRINT\r\nPRIVATE\r\nPUBLIC\r\nREAD\r\nRETURN\r\nREWIND\r\nSAVE\r\nSELECT\r\nSTOP\r\nTARGET\r\nWHILE\r\nWRITE\r\n\r\nBLOCK DATA\r\nBLOCKDATA\r\nEND BLOCK DATA\r\nENDBLOCKDATA\r\nDO\r\nENDDO\r\nFILE\r\nFORALL\r\nFUNCTION\r\nIF\r\nEND IF\r\nINTERFACE\r\nMODULE\r\nPROGRAM\r\nSELECT\r\nSUBROUTINE\r\nTYPE\r\nWHERE\r\n\r\nASSIGNMENT\r\nDEFAULT\r\nELEMENTAL\r\nELSE\r\nELSEWHERE\r\nELSEIF\r\nENTRY\r\nIN\r\nINCLUDE\r\nINOUT\r\nKIND\r\nNULL\r\nONLY\r\nOPERATOR\r\nOUT\r\nPURE\r\nRECURSIVE\r\nRESULT\r\nSEQUENCE\r\nSTAT\r\nTHEN\r\nUSE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"INTEGER\"],\r\n\t[\"keyword\", \"REAL\"],\r\n\t[\"keyword\", \"DOUBLE PRECISION\"],\r\n\t[\"keyword\", \"DOUBLEPRECISION\"],\r\n\t[\"keyword\", \"COMPLEX\"],\r\n\t[\"keyword\", \"CHARACTER\"],\r\n\t[\"keyword\", \"LOGICAL\"],\r\n\r\n\t[\"keyword\", \"ALLOCATABLE\"],\r\n\t[\"keyword\", \"ALLOCATE\"],\r\n\t[\"keyword\", \"BACKSPACE\"],\r\n\t[\"keyword\", \"CALL\"],\r\n\t[\"keyword\", \"CASE\"],\r\n\t[\"keyword\", \"CLOSE\"],\r\n\t[\"keyword\", \"COMMON\"],\r\n\t[\"keyword\", \"CONTAINS\"],\r\n\t[\"keyword\", \"CONTINUE\"],\r\n\t[\"keyword\", \"CYCLE\"],\r\n\t[\"keyword\", \"DATA\"],\r\n\t[\"keyword\", \"DEALLOCATE\"],\r\n\t[\"keyword\", \"DIMENSION\"],\r\n\t[\"keyword\", \"DO\"],\r\n\t[\"keyword\", \"END\"],\r\n\t[\"keyword\", \"EQUIVALENCE\"],\r\n\t[\"keyword\", \"EXIT\"],\r\n\t[\"keyword\", \"EXTERNAL\"],\r\n\t[\"keyword\", \"FORMAT\"],\r\n\t[\"keyword\", \"GO TO\"],\r\n\t[\"keyword\", \"GOTO\"],\r\n\t[\"keyword\", \"IMPLICIT\"],\r\n\t[\"keyword\", \"IMPLICIT NONE\"],\r\n\t[\"keyword\", \"INQUIRE\"],\r\n\t[\"keyword\", \"INTENT\"],\r\n\t[\"keyword\", \"INTRINSIC\"],\r\n\t[\"keyword\", \"MODULE PROCEDURE\"],\r\n\t[\"keyword\", \"NAMELIST\"],\r\n\t[\"keyword\", \"NULLIFY\"],\r\n\t[\"keyword\", \"OPEN\"],\r\n\t[\"keyword\", \"OPTIONAL\"],\r\n\t[\"keyword\", \"PARAMETER\"],\r\n\t[\"keyword\", \"POINTER\"],\r\n\t[\"keyword\", \"PRINT\"],\r\n\t[\"keyword\", \"PRIVATE\"],\r\n\t[\"keyword\", \"PUBLIC\"],\r\n\t[\"keyword\", \"READ\"],\r\n\t[\"keyword\", \"RETURN\"],\r\n\t[\"keyword\", \"REWIND\"],\r\n\t[\"keyword\", \"SAVE\"],\r\n\t[\"keyword\", \"SELECT\"],\r\n\t[\"keyword\", \"STOP\"],\r\n\t[\"keyword\", \"TARGET\"],\r\n\t[\"keyword\", \"WHILE\"],\r\n\t[\"keyword\", \"WRITE\"],\r\n\r\n\t[\"keyword\", \"BLOCK DATA\"],\r\n\t[\"keyword\", \"BLOCKDATA\"],\r\n\t[\"keyword\", \"END BLOCK DATA\"],\r\n\t[\"keyword\", \"ENDBLOCKDATA\"],\r\n\t[\"keyword\", \"DO\"],\r\n\t[\"keyword\", \"ENDDO\"],\r\n\t[\"keyword\", \"FILE\"],\r\n\t[\"keyword\", \"FORALL\"],\r\n\t[\"keyword\", \"FUNCTION\"],\r\n\t[\"keyword\", \"IF\"],\r\n\t[\"keyword\", \"END IF\"],\r\n\t[\"keyword\", \"INTERFACE\"],\r\n\t[\"keyword\", \"MODULE\"],\r\n\t[\"keyword\", \"PROGRAM\"],\r\n\t[\"keyword\", \"SELECT\"],\r\n\t[\"keyword\", \"SUBROUTINE\"],\r\n\t[\"keyword\", \"TYPE\"],\r\n\t[\"keyword\", \"WHERE\"],\r\n\r\n\t[\"keyword\", \"ASSIGNMENT\"],\r\n\t[\"keyword\", \"DEFAULT\"],\r\n\t[\"keyword\", \"ELEMENTAL\"],\r\n\t[\"keyword\", \"ELSE\"],\r\n\t[\"keyword\", \"ELSEWHERE\"],\r\n\t[\"keyword\", \"ELSEIF\"],\r\n\t[\"keyword\", \"ENTRY\"],\r\n\t[\"keyword\", \"IN\"],\r\n\t[\"keyword\", \"INCLUDE\"],\r\n\t[\"keyword\", \"INOUT\"],\r\n\t[\"keyword\", \"KIND\"],\r\n\t[\"keyword\", \"NULL\"],\r\n\t[\"keyword\", \"ONLY\"],\r\n\t[\"keyword\", \"OPERATOR\"],\r\n\t[\"keyword\", \"OUT\"],\r\n\t[\"keyword\", \"PURE\"],\r\n\t[\"keyword\", \"RECURSIVE\"],\r\n\t[\"keyword\", \"RESULT\"],\r\n\t[\"keyword\", \"SEQUENCE\"],\r\n\t[\"keyword\", \"STAT\"],\r\n\t[\"keyword\", \"THEN\"],\r\n\t[\"keyword\", \"USE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/fortran/number_feature.test",
    "content": "473\r\n21_2\r\n21_SHORT\r\n1976354279568241_8\r\n1.6E3\r\n0.45E-4\r\n10.93E7_QUAD\r\n3E4\r\nB'01110'\r\nB\"010\"\r\nO'047'\r\nO\"642\"\r\nZ'F41A'\r\nZ\"00BC\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"473\"],\r\n\t[\"number\", \"21_2\"],\r\n\t[\"number\", \"21_SHORT\"],\r\n\t[\"number\", \"1976354279568241_8\"],\r\n\t[\"number\", \"1.6E3\"],\r\n\t[\"number\", \"0.45E-4\"],\r\n\t[\"number\", \"10.93E7_QUAD\"],\r\n\t[\"number\", \"3E4\"],\r\n\t[\"quoted-number\", \"B'01110'\"],\r\n    [\"quoted-number\", \"B\\\"010\\\"\"],\r\n    [\"quoted-number\", \"O'047'\"],\r\n    [\"quoted-number\", \"O\\\"642\\\"\"],\r\n    [\"quoted-number\", \"Z'F41A'\"],\r\n    [\"quoted-number\", \"Z\\\"00BC\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers and quoted numbers."
  },
  {
    "path": "tests/languages/fortran/operator_feature.test",
    "content": "** // =>\r\n== /= ::\r\n< <= > >=\r\n+ - * / = %\r\n.EQ. .NE. .LT. .LE.\r\n.GT. .GE. .NOT. .AND.\r\n.OR. .EQV. .NEQV.\r\n.foobar.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"**\"], [\"operator\", \"//\"], [\"operator\", \"=>\"],\r\n\t[\"operator\", \"==\"], [\"operator\", \"/=\"], [\"operator\", \"::\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"=\"], [\"operator\", \"%\"],\r\n\t[\"operator\", \".EQ.\"], [\"operator\", \".NE.\"], [\"operator\", \".LT.\"], [\"operator\", \".LE.\"],\r\n\t[\"operator\", \".GT.\"], [\"operator\", \".GE.\"], [\"operator\", \".NOT.\"], [\"operator\", \".AND.\"],\r\n\t[\"operator\", \".OR.\"], [\"operator\", \".EQV.\"], [\"operator\", \".NEQV.\"],\r\n\t[\"operator\", \".foobar.\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/fortran/punctuation_feature.test",
    "content": "(/ /)\n( ) , ; : &\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(/\"],\n\t[\"punctuation\", \"/)\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"&\"]\n]\n"
  },
  {
    "path": "tests/languages/fortran/string_feature.test",
    "content": "\"\"\r\n''\r\n\"foo \"\"bar\"\" baz\"\r\n'foo ''bar'' baz'\r\nITALICS_'foobar'\r\n\"foo &\r\n\t&bar\"\r\n\"foo &\r\n\t! Comment\r\n\t&bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"\\\"\"]],\r\n\t[\"string\", [\"''\"]],\r\n\t[\"string\", [\"\\\"foo \\\"\\\"bar\\\"\\\" baz\\\"\"]],\r\n\t[\"string\", [\"'foo ''bar'' baz'\"]],\r\n\t[\"string\", [\"ITALICS_'foobar'\"]],\r\n\t[\"string\", [\"\\\"foo &\\r\\n\\t&bar\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"\\\"foo &\\r\\n\\t\",\r\n\t\t[\"comment\", \"! Comment\"],\r\n\t\t\"\\r\\n\\t&bar\\\"\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and line continuation.\r\nAlso checks for comments inside strings."
  },
  {
    "path": "tests/languages/fortran+pure/fortran_inclusion.test",
    "content": "%< -*- Fortran90 -*-\r\n21_SHORT\r\n%>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"inline-lang-fortran\", [\r\n\t\t[\"delimiter\", \"%< \"],\r\n\t\t[\"lang\", \"-*- Fortran90 -*-\"],\r\n\t\t[\"number\", \"21_SHORT\"],\r\n\t\t[\"delimiter\", \"%>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Fortran in Pure."
  },
  {
    "path": "tests/languages/fsharp/annotation_feature.test",
    "content": "[<Foo>]\n[<Bar(\"bar\"); Foo(1, 2)>]\n\n----------------------------------------------------\n\n[\n\t[\"annotation\", [\n\t\t[\"punctuation\", \"[<\"],\n\t\t[\"class-name\", \"Foo\"],\n\t\t[\"punctuation\", \">]\"]\n\t]],\n\t[\"annotation\", [\n\t\t[\"punctuation\", \"[<\"],\n\t\t[\"class-name\", \"Bar\"],\n\t\t[\"annotation-content\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", \"\\\"bar\\\"\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]],\n\t\t[\"class-name\", \"Foo\"],\n\t\t[\"annotation-content\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"number\", \"1\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"2\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"punctuation\", \">]\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for annotations.\n"
  },
  {
    "path": "tests/languages/fsharp/char_feature.test",
    "content": "'a'\n'a'B\n'\\''\n'\\\\'\n'\\231'\n'\\x41'\n'\\u0041'\n'\\U0001F47D'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"],\n\t[\"char\", \"'a'B\"],\n\t[\"char\", \"'\\\\''\"],\n\t[\"char\", \"'\\\\\\\\'\"],\n\t[\"char\", \"'\\\\231'\"],\n\t[\"char\", \"'\\\\x41'\"],\n\t[\"char\", \"'\\\\u0041'\"],\n\t[\"char\", \"'\\\\U0001F47D'\"]\n]\n"
  },
  {
    "path": "tests/languages/fsharp/class-name_feature.test",
    "content": "let func : HttpFunc = handler (Some >> Task.FromResult)\n\ntype Base1() =\n    abstract member F : unit -> unit\n    default u.F() =\n        printfn \"F Base1\"\n\ntype Derived1() =\n    inherit Base1()\n    override u.F() =\n        printfn \"F Derived1\"\n\nlet d1 : Derived1 = Derived1()\n\nlet base1 = d1 :> Base1\nlet derived1 = base1 :?> Derived1\n\ntype PersonName =\n    | FirstOnly of string\n    | LastOnly of string\n    | FirstLast of string * string\n\ntype Shape =\n    | Rectangle of height : float * width : float\n    | Circle of radius : float\n\ntype MyInterface =\n   abstract member Add: int -> int -> int\n   abstract member Pi : float\n\nexception Error1 of string\nexception Error2 of string * int\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"let\"],\n\t\" func \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"HttpFunc\"]],\n\t[\"operator\", \"=\"],\n\t\" handler \",\n\t[\"punctuation\", \"(\"],\n\t\"Some \",\n\t[\"operator\", \">>\"],\n\t\" Task\",\n\t[\"punctuation\", \".\"],\n\t\"FromResult\",\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"type\"],\n\t[\"class-name\", [\"Base1\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=\"],\n\n\t[\"keyword\", \"abstract\"],\n\t[\"keyword\", \"member\"],\n\t\" F \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t\"unit \",\n\t\t[\"operator\", \"->\"],\n\t\t\" unit\"\n\t]],\n\n\t[\"keyword\", \"default\"],\n\t\" u\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"F\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=\"],\n\n\t\"\\r\\n        printfn \",\n\t[\"string\", \"\\\"F Base1\\\"\"],\n\n\t[\"keyword\", \"type\"],\n\t[\"class-name\", [\"Derived1\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=\"],\n\n\t[\"keyword\", \"inherit\"],\n\t[\"class-name\", [\"Base1\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"override\"],\n\t\" u\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"F\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=\"],\n\n\t\"\\r\\n        printfn \",\n\t[\"string\", \"\\\"F Derived1\\\"\"],\n\n\t[\"keyword\", \"let\"],\n\t\" d1 \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"Derived1\"]],\n\t[\"operator\", \"=\"],\n\t[\"function\", \"Derived1\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"let\"],\n\t\" base1 \",\n\t[\"operator\", \"=\"],\n\t\" d1 \",\n\t[\"operator\", \":>\"],\n\t[\"class-name\", [\"Base1\"]],\n\n\t[\"keyword\", \"let\"],\n\t\" derived1 \",\n\t[\"operator\", \"=\"],\n\t\" base1 \",\n\t[\"operator\", \":?>\"],\n\t[\"class-name\", [\"Derived1\"]],\n\n\t[\"keyword\", \"type\"],\n\t[\"class-name\", [\"PersonName\"]],\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \"|\"],\n\t\" FirstOnly \",\n\t[\"keyword\", \"of\"],\n\t[\"class-name\", [\"string\"]],\n\n\t[\"operator\", \"|\"],\n\t\" LastOnly \",\n\t[\"keyword\", \"of\"],\n\t[\"class-name\", [\"string\"]],\n\n\t[\"operator\", \"|\"],\n\t\" FirstLast \",\n\t[\"keyword\", \"of\"],\n\t[\"class-name\", [\n\t\t\"string \",\n\t\t[\"operator\", \"*\"],\n\t\t\" string\"\n\t]],\n\n\t[\"keyword\", \"type\"],\n\t[\"class-name\", [\"Shape\"]],\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \"|\"],\n\t\" Rectangle \",\n\t[\"keyword\", \"of\"],\n\t\" height \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"float\"]],\n\t[\"operator\", \"*\"],\n\t\" width \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"float\"]],\n\n\t[\"operator\", \"|\"],\n\t\" Circle \",\n\t[\"keyword\", \"of\"],\n\t\" radius \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"float\"]],\n\n\t[\"keyword\", \"type\"],\n\t[\"class-name\", [\"MyInterface\"]],\n\t[\"operator\", \"=\"],\n\n\t[\"keyword\", \"abstract\"],\n\t[\"keyword\", \"member\"],\n\t\" Add\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t\"int \",\n\t\t[\"operator\", \"->\"],\n\t\t\" int \",\n\t\t[\"operator\", \"->\"],\n\t\t\" int\"\n\t]],\n\n\t[\"keyword\", \"abstract\"],\n\t[\"keyword\", \"member\"],\n\t\" Pi \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"float\"]],\n\n\t[\"keyword\", \"exception\"],\n\t[\"class-name\", [\"Error1\"]],\n\t[\"keyword\", \"of\"],\n\t[\"class-name\", [\"string\"]],\n\n\t[\"keyword\", \"exception\"],\n\t[\"class-name\", [\"Error2\"]],\n\t[\"keyword\", \"of\"],\n\t[\"class-name\", [\n\t\t\"string \",\n\t\t[\"operator\", \"*\"],\n\t\t\" int\"\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for class-names.\n"
  },
  {
    "path": "tests/languages/fsharp/comment_feature.test",
    "content": "// foobar\r\n(**)\r\n(* foo\r\nbar *)\r\n\r\n// the next one is not a comment\r\n(*) (*)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// foobar\"],\r\n\t[\"comment\", \"(**)\"],\r\n\t[\"comment\", \"(* foo\\r\\nbar *)\"],\r\n\r\n\t[\"comment\", \"// the next one is not a comment\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments.\r\n"
  },
  {
    "path": "tests/languages/fsharp/computation-expression_feature.test",
    "content": "async {}\ntask {}\nseq {}\nfoo {}\n\n----------------------------------------------------\n\n[\n\t[\"computation-expression\", \"async\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\n\t[\"computation-expression\", \"task\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\n\t[\"computation-expression\", \"seq\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\n\t[\"computation-expression\", \"foo\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for computation expressions.\n"
  },
  {
    "path": "tests/languages/fsharp/issue1480.test",
    "content": "let foo' = failWith \"foo\"\r\n\r\nlet bar' = failWith \"bar\"\r\n\r\nlet map (f: 'a -> 'b) (xs: 'a list): 'b list = failWith \"not implemented\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"let\"], \" foo' \", [\"operator\", \"=\"], \" failWith \", [\"string\", \"\\\"foo\\\"\"],\r\n\t[\"keyword\", \"let\"], \" bar' \", [\"operator\", \"=\"], \" failWith \", [\"string\", \"\\\"bar\\\"\"],\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" map \",\r\n\t[\"punctuation\", \"(\"],\r\n\t\"f\",\r\n\t[\"punctuation\", \":\"],\r\n\t\" 'a \",\r\n\t[\"operator\", \"->\"],\r\n\t\" 'b\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"xs\",\r\n\t[\"punctuation\", \":\"],\r\n\t\" 'a list\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t\" 'b list \",\r\n\t[\"operator\", \"=\"],\r\n\t\" failWith \",\r\n\t[\"string\", \"\\\"not implemented\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for apostrophes in names. See #1480.\r\n"
  },
  {
    "path": "tests/languages/fsharp/issue2696.test",
    "content": "let score category (dice:Die list) =\r\n    let iDice = dice |> List.map int |> List.sortDescending\r\n    let diced = iDice |> List.countBy id |> List.sortByDescending snd\r\n    let countScore cat = dice |> List.filter (fun d -> d=cat) |> List.length |> (*) (int cat)\r\n    let isStraight = iDice.[0] - iDice.[4] = 4\r\n\r\n    match category  , List.map snd diced  with\r\n    | Yacht         , [5]         -> 50\r\n    | Ones          , _           -> countScore Die.One\r\n    | Twos          , _           -> countScore Die.Two\r\n    | Threes        , _           -> countScore Die.Three\r\n    | Fours         , _           -> countScore Die.Four\r\n    | Fives         , _           -> countScore Die.Five\r\n    | Sixes         , _           -> countScore Die.Six\r\n    | FourOfAKind   , [4;1]\r\n    | FourOfAKind   , [5]         -> iDice |> List.head |> (*) 4\r\n    | LittleStraight, [1;1;1;1;1] when isStraight && iDice.[0] = 5 -> 30\r\n    | BigStraight   , [1;1;1;1;1] when isStraight && iDice.[0] = 6 -> 30\r\n    | FullHouse     , [3;2]\r\n    | Choice        , _           -> iDice |> List.sum\r\n    | _             , _           -> 0\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"let\"],\r\n\t\" score category \",\r\n\t[\"punctuation\", \"(\"],\r\n\t\"dice\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\"Die\"]],\r\n\t\" list\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=\"],\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" iDice \",\r\n\t[\"operator\", \"=\"],\r\n\t\" dice \",\r\n\t[\"operator\", \"|>\"],\r\n\t\" List\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"map int \",\r\n\t[\"operator\", \"|>\"],\r\n\t\" List\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"sortDescending\\r\\n    \",\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" diced \",\r\n\t[\"operator\", \"=\"],\r\n\t\" iDice \",\r\n\t[\"operator\", \"|>\"],\r\n\t\" List\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"countBy id \",\r\n\t[\"operator\", \"|>\"],\r\n\t\" List\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"sortByDescending snd\\r\\n    \",\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" countScore cat \",\r\n\t[\"operator\", \"=\"],\r\n\t\" dice \",\r\n\t[\"operator\", \"|>\"],\r\n\t\" List\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"filter \",\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"fun\"],\r\n\t\" d \",\r\n\t[\"operator\", \"->\"],\r\n\t\" d\",\r\n\t[\"operator\", \"=\"],\r\n\t\"cat\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"|>\"],\r\n\t\" List\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"length \",\r\n\t[\"operator\", \"|>\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"int cat\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" isStraight \",\r\n\t[\"operator\", \"=\"],\r\n\t\" iDice\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"-\"],\r\n\t\" iDice\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"4\"],\r\n\r\n\t[\"keyword\", \"match\"],\r\n\t\" category  \",\r\n\t[\"punctuation\", \",\"],\r\n\t\" List\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"map snd diced  \",\r\n\t[\"keyword\", \"with\"],\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" Yacht         \",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"5\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"number\", \"50\"],\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" Ones          \",\r\n\t[\"punctuation\", \",\"],\r\n\t\" _           \",\r\n\t[\"operator\", \"->\"],\r\n\t\" countScore Die\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"One\\r\\n    \",\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" Twos          \",\r\n\t[\"punctuation\", \",\"],\r\n\t\" _           \",\r\n\t[\"operator\", \"->\"],\r\n\t\" countScore Die\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"Two\\r\\n    \",\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" Threes        \",\r\n\t[\"punctuation\", \",\"],\r\n\t\" _           \",\r\n\t[\"operator\", \"->\"],\r\n\t\" countScore Die\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"Three\\r\\n    \",\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" Fours         \",\r\n\t[\"punctuation\", \",\"],\r\n\t\" _           \",\r\n\t[\"operator\", \"->\"],\r\n\t\" countScore Die\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"Four\\r\\n    \",\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" Fives         \",\r\n\t[\"punctuation\", \",\"],\r\n\t\" _           \",\r\n\t[\"operator\", \"->\"],\r\n\t\" countScore Die\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"Five\\r\\n    \",\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" Sixes         \",\r\n\t[\"punctuation\", \",\"],\r\n\t\" _           \",\r\n\t[\"operator\", \"->\"],\r\n\t\" countScore Die\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"Six\\r\\n    \",\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" FourOfAKind   \",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" FourOfAKind   \",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"5\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"->\"],\r\n\t\" iDice \",\r\n\t[\"operator\", \"|>\"],\r\n\t\" List\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"head \",\r\n\t[\"operator\", \"|>\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"number\", \"4\"],\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" LittleStraight\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"keyword\", \"when\"],\r\n\t\" isStraight \",\r\n\t[\"operator\", \"&&\"],\r\n\t\" iDice\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"5\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"number\", \"30\"],\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" BigStraight   \",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"keyword\", \"when\"],\r\n\t\" isStraight \",\r\n\t[\"operator\", \"&&\"],\r\n\t\" iDice\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"6\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"number\", \"30\"],\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" FullHouse     \",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" Choice        \",\r\n\t[\"punctuation\", \",\"],\r\n\t\" _           \",\r\n\t[\"operator\", \"->\"],\r\n\t\" iDice \",\r\n\t[\"operator\", \"|>\"],\r\n\t\" List\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"sum\\r\\n    \",\r\n\r\n\t[\"operator\", \"|\"],\r\n\t\" _             \",\r\n\t[\"punctuation\", \",\"],\r\n\t\" _           \",\r\n\t[\"operator\", \"->\"],\r\n\t[\"number\", \"0\"]\r\n]"
  },
  {
    "path": "tests/languages/fsharp/keyword_feature.test",
    "content": "abstract and as assert\r\nbase begin\r\nclass;\r\ndefault\r\ndelegate do done downcast\r\ndownto elif else end\r\nexception;\r\nextern false finally\r\nfor fun function global\r\nif in inherit; inline\r\ninterface;\r\ninternal lazy let\r\nlet! match member module\r\nmutable namespace\r\nnew;\r\nnot\r\nnull of; open or override\r\nprivate public rec return\r\nreturn! select static struct\r\nthen to true try type;\r\nupcast use use! val void\r\nwhen while with yield\r\nyield! asr land lor lsl\r\nlsr lxor mod sig atomic\r\nbreak checked component\r\nconst constraint constructor\r\ncontinue eager event external\r\nfixed functor include method\r\nmixin object parallel process\r\nprotected pure sealed tailcall\r\ntrait;\r\nvirtual volatile\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"], [\"keyword\", \"and\"], [\"keyword\", \"as\"], [\"keyword\", \"assert\"],\r\n\t[\"keyword\", \"base\"], [\"keyword\", \"begin\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"delegate\"], [\"keyword\", \"do\"], [\"keyword\", \"done\"], [\"keyword\", \"downcast\"],\r\n\t[\"keyword\", \"downto\"], [\"keyword\", \"elif\"], [\"keyword\", \"else\"], [\"keyword\", \"end\"],\r\n\t[\"keyword\", \"exception\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"extern\"], [\"keyword\", \"false\"], [\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"for\"], [\"keyword\", \"fun\"], [\"keyword\", \"function\"], [\"keyword\", \"global\"],\r\n\t[\"keyword\", \"if\"], [\"keyword\", \"in\"], [\"keyword\", \"inherit\"], [\"punctuation\", \";\"], [\"keyword\", \"inline\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"internal\"], [\"keyword\", \"lazy\"], [\"keyword\", \"let\"],\r\n\t[\"keyword\", \"let!\"], [\"keyword\", \"match\"], [\"keyword\", \"member\"], [\"keyword\", \"module\"],\r\n\t[\"keyword\", \"mutable\"], [\"keyword\", \"namespace\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"null\"], [\"keyword\", \"of\"], [\"punctuation\", \";\"], [\"keyword\", \"open\"], [\"keyword\", \"or\"], [\"keyword\", \"override\"],\r\n\t[\"keyword\", \"private\"], [\"keyword\", \"public\"], [\"keyword\", \"rec\"], [\"keyword\", \"return\"],\r\n\t[\"keyword\", \"return!\"], [\"keyword\", \"select\"], [\"keyword\", \"static\"], [\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"then\"], [\"keyword\", \"to\"], [\"keyword\", \"true\"], [\"keyword\", \"try\"], [\"keyword\", \"type\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"upcast\"], [\"keyword\", \"use\"], [\"keyword\", \"use!\"], [\"keyword\", \"val\"], [\"keyword\", \"void\"],\r\n\t[\"keyword\", \"when\"], [\"keyword\", \"while\"], [\"keyword\", \"with\"], [\"keyword\", \"yield\"],\r\n\t[\"keyword\", \"yield!\"], [\"keyword\", \"asr\"], [\"keyword\", \"land\"], [\"keyword\", \"lor\"], [\"keyword\", \"lsl\"],\r\n\t[\"keyword\", \"lsr\"], [\"keyword\", \"lxor\"], [\"keyword\", \"mod\"], [\"keyword\", \"sig\"], [\"keyword\", \"atomic\"],\r\n\t[\"keyword\", \"break\"], [\"keyword\", \"checked\"], [\"keyword\", \"component\"],\r\n\t[\"keyword\", \"const\"], [\"keyword\", \"constraint\"], [\"keyword\", \"constructor\"],\r\n\t[\"keyword\", \"continue\"], [\"keyword\", \"eager\"], [\"keyword\", \"event\"], [\"keyword\", \"external\"],\r\n\t[\"keyword\", \"fixed\"], [\"keyword\", \"functor\"], [\"keyword\", \"include\"], [\"keyword\", \"method\"],\r\n\t[\"keyword\", \"mixin\"], [\"keyword\", \"object\"], [\"keyword\", \"parallel\"], [\"keyword\", \"process\"],\r\n\t[\"keyword\", \"protected\"], [\"keyword\", \"pure\"], [\"keyword\", \"sealed\"], [\"keyword\", \"tailcall\"],\r\n\t[\"keyword\", \"trait\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"virtual\"], [\"keyword\", \"volatile\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/fsharp/number_feature.test",
    "content": "0xbabe\r\n0xBABEun\r\n0xflf\r\n0xfLF\r\n\r\n0b1001\r\n0b1001y\r\n0b1001uy\r\n\r\n42\r\n1.5\r\n2.3E+32\r\n2.3e-32\r\n4.14F\r\n4.14f\r\n0.7833M\r\n0.7833m\r\n\r\n86y\r\n86uy\r\n86s\r\n86us\r\n86l\r\n86u\r\n86ul\r\n86L\r\n86UL\r\n9999999999999999999999999999I\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0xbabe\"],\r\n\t[\"number\", \"0xBABEun\"],\r\n\t[\"number\", \"0xflf\"],\r\n\t[\"number\", \"0xfLF\"],\r\n\r\n\t[\"number\", \"0b1001\"],\r\n\t[\"number\", \"0b1001y\"],\r\n\t[\"number\", \"0b1001uy\"],\r\n\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"1.5\"],\r\n\t[\"number\", \"2.3E+32\"],\r\n\t[\"number\", \"2.3e-32\"],\r\n\t[\"number\", \"4.14F\"],\r\n\t[\"number\", \"4.14f\"],\r\n\t[\"number\", \"0.7833M\"],\r\n\t[\"number\", \"0.7833m\"],\r\n\r\n\t[\"number\", \"86y\"],\r\n\t[\"number\", \"86uy\"],\r\n\t[\"number\", \"86s\"],\r\n\t[\"number\", \"86us\"],\r\n\t[\"number\", \"86l\"],\r\n\t[\"number\", \"86u\"],\r\n\t[\"number\", \"86ul\"],\r\n\t[\"number\", \"86L\"],\r\n\t[\"number\", \"86UL\"],\r\n\t[\"number\", \"9999999999999999999999999999I\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal, hexadecimal and binary numbers, with all possible suffixes."
  },
  {
    "path": "tests/languages/fsharp/operator_feature.test",
    "content": " >=   <=   <>   >   <   =   +   -   *   /   %\n >=?  <=?  <>?  >?  <?  =?  +?  -?  *?  /?  %?\n?>=? ?<=? ?<>? ?>? ?<? ?=? ?+? ?-? ?*? ?/? ?%?\n?>=  ?<=  ?<>  ?>  ?<  ?=  ?+  ?-  ?*  ?/  ?%\n\n**\n\n<- ->\n..\n::\n:=\n:> :? :?>\n<< >>\n<<< >>> ~~~ ^^^ &&& |||\n| ||\n<| <|| <|||\n|> ||> |||>\n~~ ~- ~+\n\n? ^ !\n!= ==\n& &&\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \">=\"], [\"operator\", \"<=\"], [\"operator\", \"<>\"], [\"operator\", \">\"], [\"operator\", \"<\"], [\"operator\", \"=\"], [\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"%\"],\n\t[\"operator\", \">=?\"], [\"operator\", \"<=?\"], [\"operator\", \"<>?\"], [\"operator\", \">?\"], [\"operator\", \"<?\"], [\"operator\", \"=?\"], [\"operator\", \"+?\"], [\"operator\", \"-?\"], [\"operator\", \"*?\"], [\"operator\", \"/?\"], [\"operator\", \"%?\"],\n\t[\"operator\", \"?>=?\"], [\"operator\", \"?<=?\"], [\"operator\", \"?<>?\"], [\"operator\", \"?>?\"], [\"operator\", \"?<?\"], [\"operator\", \"?=?\"], [\"operator\", \"?+?\"], [\"operator\", \"?-?\"], [\"operator\", \"?*?\"], [\"operator\", \"?/?\"], [\"operator\", \"?%?\"],\n\t[\"operator\", \"?>=\"], [\"operator\", \"?<=\"], [\"operator\", \"?<>\"], [\"operator\", \"?>\"], [\"operator\", \"?<\"], [\"operator\", \"?=\"], [\"operator\", \"?+\"], [\"operator\", \"?-\"], [\"operator\", \"?*\"], [\"operator\", \"?/\"], [\"operator\", \"?%\"],\n\n\t[\"operator\", \"**\"],\n\n\t[\"operator\", \"<-\"], [\"operator\", \"->\"],\n\t[\"operator\", \"..\"],\n\t[\"operator\", \"::\"],\n\t[\"operator\", \":=\"],\n\t[\"operator\", \":>\"], [\"operator\", \":?\"], [\"operator\", \":?>\"],\n\t[\"operator\", \"<<\"], [\"operator\", \">>\"],\n\t[\"operator\", \"<<<\"], [\"operator\", \">>>\"], [\"operator\", \"~~~\"], [\"operator\", \"^^^\"], [\"operator\", \"&&&\"], [\"operator\", \"|||\"],\n\t[\"operator\", \"|\"], [\"operator\", \"||\"],\n\t[\"operator\", \"<|\"], [\"operator\", \"<||\"], [\"operator\", \"<|||\"],\n\t[\"operator\", \"|>\"], [\"operator\", \"||>\"], [\"operator\", \"|||>\"],\n\t[\"operator\", \"~~\"], [\"operator\", \"~-\"], [\"operator\", \"~+\"],\n\n\t[\"operator\", \"?\"], [\"operator\", \"^\"], [\"operator\", \"!\"],\n\t[\"operator\", \"!=\"], [\"operator\", \"==\"],\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/fsharp/preprocessor_feature.test",
    "content": "#if foo\r\n#else\r\n#endif\r\n\r\n#light\r\n#line\r\n#nowarn\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"if\"], \" foo\"]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"else\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"endif\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"light\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"line\"]]],\r\n\t[\"preprocessor\", [\"#\", [\"directive\", \"nowarn\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for preprocessor directives."
  },
  {
    "path": "tests/languages/fsharp/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n\"foo\\\r\nbar\"\r\n\"foo\"B\r\n\r\n@\"\"\r\n@\"foo\"\r\n@\"fo\"\"o\"\r\n@\"foo\"B\r\n\r\n\"\"\"\"\"\"\r\n\"\"\"fo\"\"o\"\r\nbar\"\"\"\r\n\"\"\"foo\"\"\"B\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\\\\r\\nbar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"B\"],\r\n\r\n\t[\"string\", \"@\\\"\\\"\"],\r\n\t[\"string\", \"@\\\"foo\\\"\"],\r\n\t[\"string\", \"@\\\"fo\\\"\\\"o\\\"\"],\r\n\t[\"string\", \"@\\\"foo\\\"B\"],\r\n\r\n\t[\"string\", \"\\\"\\\"\\\"\\\"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"\\\"\\\"fo\\\"\\\"o\\\"\\r\\nbar\\\"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"\\\"\\\"foo\\\"\\\"\\\"B\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for normal strings, verbatim strings, and triple-quoted strings.\r\n"
  },
  {
    "path": "tests/languages/fsharp!+xml-doc/inclusion.test",
    "content": "/// <summary>\r\n/// Class level summary documentation goes here.\r\n/// </summary>\r\n/// <remarks>\r\n/// Longer comments can be associated with a type or member through\r\n/// the remarks tag.\r\n/// </remarks>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"doc-comment\", [\r\n\t\t\"/// \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"summary\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"doc-comment\", [\"/// Class level summary documentation goes here.\"]],\r\n\t[\"doc-comment\", [\r\n\t\t\"/// \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"summary\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"doc-comment\", [\r\n\t\t\"/// \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"remarks\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"doc-comment\", [\"/// Longer comments can be associated with a type or member through\"]],\r\n\t[\"doc-comment\", [\"/// the remarks tag.\"]],\r\n\t[\"doc-comment\", [\r\n\t\t\"/// \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"remarks\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for XML documentation comments.\r\n"
  },
  {
    "path": "tests/languages/ftl/boolean_feature.test",
    "content": "${true == !false}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"ftl-interpolation\", [\r\n\t\t[\"punctuation\", \"${\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"==\"],\r\n\t\t\t[\"operator\", \"!\"],\r\n\t\t\t[\"boolean\", \"false\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/ftl/builtin-function_feature.test",
    "content": "${testString?upper_case}\r\n${testString?html}\r\n${testString?upper_case?html}\r\n\r\n${testSequence?size}\r\n${testSequence?join(\", \")}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"ftl-interpolation\", [\r\n\t\t[\"punctuation\", \"${\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"testString\",\r\n\t\t\t[\"operator\", \"?\"],\r\n\t\t\t[\"builtin-function\", \"upper_case\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\t[\"ftl-interpolation\", [\r\n\t\t[\"punctuation\", \"${\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"testString\",\r\n\t\t\t[\"operator\", \"?\"],\r\n\t\t\t[\"builtin-function\", \"html\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\t[\"ftl-interpolation\", [\r\n\t\t[\"punctuation\", \"${\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"testString\",\r\n\t\t\t[\"operator\", \"?\"],\r\n\t\t\t[\"builtin-function\", \"upper_case\"],\r\n\t\t\t[\"operator\", \"?\"],\r\n\t\t\t[\"builtin-function\", \"html\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\r\n\t[\"ftl-interpolation\", [\r\n\t\t[\"punctuation\", \"${\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"testSequence\",\r\n\t\t\t[\"operator\", \"?\"],\r\n\t\t\t[\"builtin-function\", \"size\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\t[\"ftl-interpolation\", [\r\n\t\t[\"punctuation\", \"${\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"testSequence\",\r\n\t\t\t[\"operator\", \"?\"],\r\n\t\t\t[\"builtin-function\", \"join\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", [\"\\\", \\\"\"]],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for builtin functions.\r\n"
  },
  {
    "path": "tests/languages/ftl/comment_feature.test",
    "content": "<#-- comment -->\r\n\r\n<#assign x <#-- A comment --> = 123 <#-- A comment -->>\r\n<#function f(x <#-- A comment -->, y <#-- A comment -->)>\r\n\t<#return <#-- A comment --> 1 <#-- A comment -->>\r\n</#function>\r\n<#assign someHash = {\r\n\t\"foo\": 123, <#-- A comment -->\r\n\t\"bar\": x <#-- A comment --> + 1,\r\n\t<#-- A comment -->\r\n\t\"baaz\": f(1 <#-- A comment -->, 2 <#-- A comment -->)\r\n} <#-- A comment -->>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"ftl-comment\", \"<#-- comment -->\"],\r\n\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"#assign\"],\r\n\t\t[\"content\", [\r\n\t\t\t\" x \",\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"number\", \"123\"],\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"#function\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"function\", \"f\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"x \",\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\" y \",\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"#return\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"directive\", \"#function\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"#assign\"],\r\n\t\t[\"content\", [\r\n\t\t\t\" someHash \",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t\t[\"string\", [\"\\\"foo\\\"\"]],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"number\", \"123\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"],\r\n\r\n\t\t\t[\"string\", [\"\\\"bar\\\"\"]],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\" x \",\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"],\r\n\t\t\t[\"operator\", \"+\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"],\r\n\r\n\t\t\t[\"string\", [\"\\\"baaz\\\"\"]],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"function\", \"f\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"2\"],\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"comment\", \"<#-- A comment -->\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/ftl/directive_feature.test",
    "content": "<#import \"/libs/commons.ftl\" as com>\r\n\r\n<#if a < b>\r\n\ta is less than b\r\n<#elseif (a > b)>\r\n\ta is greater than b\r\n<#else>\r\n\ta is equal to by\r\n</#if>\r\n\r\n<@foo></@foo>\r\n<@foo/>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"#import\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"string\", [\"\\\"/libs/commons.ftl\\\"\"]],\r\n\t\t\t[\"keyword\", \"as\"],\r\n\t\t\t\" com\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"#if\"],\r\n\t\t[\"content\", [\r\n\t\t\t\" a \",\r\n\t\t\t[\"operator\", \"<\"],\r\n\t\t\t\" b\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\"\\r\\n\\ta is less than b\\r\\n\",\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"#elseif\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"a \",\r\n\t\t\t[\"operator\", \">\"],\r\n\t\t\t\" b\",\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\"\\r\\n\\ta is greater than b\\r\\n\",\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"#else\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\"\\r\\n\\ta is equal to by\\r\\n\",\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"directive\", \"#if\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"@foo\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"directive\", \"@foo\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"@foo\"],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directive. This includes both predefined and user-defined ones.\r\n"
  },
  {
    "path": "tests/languages/ftl/function_feature.test",
    "content": "${min(1,2)}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"ftl-interpolation\", [\r\n\t\t[\"punctuation\", \"${\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"function\", \"min\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"2\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/ftl/interpolation_feature.test",
    "content": "<a href=\"${link}\">${text}</a>\r\n\r\n${ \"{}foo${bar}\" }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"attr-name\", [\"href\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"ftl-interpolation\", [\r\n\t\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\t[\"content\", [\"link\"]],\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"ftl-interpolation\", [\r\n\t\t[\"punctuation\", \"${\"],\r\n\t\t[\"content\", [\"text\"]],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"ftl-interpolation\", [\r\n\t\t[\"punctuation\", \"${\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"{}foo\",\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\"bar\",\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\"\\\"\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for template interpolation.\r\n"
  },
  {
    "path": "tests/languages/ftl/number_feature.test",
    "content": "${\r\n\t0\r\n\t08\r\n\t0.2\r\n\t1233.42234\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"ftl-interpolation\", [\r\n\t\t[\"punctuation\", \"${\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"number\", \"0\"],\r\n\t\t\t[\"number\", \"08\"],\r\n\t\t\t[\"number\", \"0.2\"],\r\n\t\t\t[\"number\", \"1233.42234\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/ftl/operator.test",
    "content": "<@foo (\r\n\r\n+ - * / %\r\n+= -= *= /= %=\r\n++ --\r\n\r\n== != >= <= > <\r\ngt gte lt lte\r\n\r\n! && ||\r\n\r\n? ??\r\n\r\n->\r\n\r\n.. ..* ..< ..!\r\n\r\n)/>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"@foo\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\r\n\t\t\t[\"operator\", \"+\"],\r\n\t\t\t[\"operator\", \"-\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t[\"operator\", \"/\"],\r\n\t\t\t[\"operator\", \"%\"],\r\n\r\n\t\t\t[\"operator\", \"+=\"],\r\n\t\t\t[\"operator\", \"-=\"],\r\n\t\t\t[\"operator\", \"*=\"],\r\n\t\t\t[\"operator\", \"/=\"],\r\n\t\t\t[\"operator\", \"%=\"],\r\n\r\n\t\t\t[\"operator\", \"++\"],\r\n\t\t\t[\"operator\", \"--\"],\r\n\r\n\t\t\t[\"operator\", \"==\"],\r\n\t\t\t[\"operator\", \"!=\"],\r\n\t\t\t[\"operator\", \">=\"],\r\n\t\t\t[\"operator\", \"<=\"],\r\n\t\t\t[\"operator\", \">\"],\r\n\t\t\t[\"operator\", \"<\"],\r\n\r\n\t\t\t[\"operator\", \"gt\"],\r\n\t\t\t[\"operator\", \"gte\"],\r\n\t\t\t[\"operator\", \"lt\"],\r\n\t\t\t[\"operator\", \"lte\"],\r\n\r\n\t\t\t[\"operator\", \"!\"], [\"operator\", \"&&\"], [\"operator\", \"||\"],\r\n\r\n\t\t\t[\"operator\", \"?\"], [\"operator\", \"??\"],\r\n\r\n\t\t\t[\"operator\", \"->\"],\r\n\r\n\t\t\t[\"operator\", \"..\"],\r\n\t\t\t[\"operator\", \"..*\"],\r\n\t\t\t[\"operator\", \"..<\"],\r\n\t\t\t[\"operator\", \"..!\"],\r\n\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/ftl/punctuation_feature.test",
    "content": "<@foo\r\n\r\n() [] {}\r\n, ; . :\r\n\r\n/>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"@foo\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for punctuation.\r\n"
  },
  {
    "path": "tests/languages/ftl/string_feature.test",
    "content": "<@foo (\r\n\r\n\"foo'\\\"'\r\n\\\"\\\\\"\r\n'foo\\'\r\n'\r\n\r\nr\"foo${bar}\"\r\nr'foo${bar}'\r\n\r\n\"foo${bar}\"\r\n'foo${bar + \"foo}\" + '}'}'\r\n\r\n)/>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"ftl-directive\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"directive\", \"@foo\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\r\n\t\t\t[\"string\", [\"\\\"foo'\\\\\\\"'\\r\\n\\\\\\\"\\\\\\\\\\\"\"]],\r\n\t\t\t[\"string\", [\"'foo\\\\'\\r\\n'\"]],\r\n\r\n\t\t\t[\"string\", \"r\\\"foo${bar}\\\"\"],\r\n\t\t\t[\"string\", \"r'foo${bar}'\"],\r\n\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"foo\",\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\"bar\",\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\"\\\"\"\r\n\t\t\t]],\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"'foo\",\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\"bar \",\r\n\t\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t\t[\"string\", [\"\\\"foo}\\\"\"]],\r\n\t\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t\t[\"string\", [\"'}'\"]],\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\"'\"\r\n\t\t\t]],\r\n\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings, raw string, and string with interpolations.\r\n"
  },
  {
    "path": "tests/languages/gap/boolean_feature.test",
    "content": "false\ntrue\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"false\"],\n\t[\"boolean\", \"true\"]\n]\n"
  },
  {
    "path": "tests/languages/gap/comment_feature.test",
    "content": "# comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"# comment\"]\n]\n"
  },
  {
    "path": "tests/languages/gap/keyword_feature.test",
    "content": "Assert;\nInfo;\nIsBound;\nQUIT;\nTryNextMethod;\nUnbind;\nand;\natomic;\nbreak;\ncontinue;\ndo;\nelif;\nelse;\nend;\nfi;\nfor;\nfunction;\nif;\nin;\nlocal;\nmod;\nnot;\nod;\nor;\nquit;\nreadonly;\nreadwrite;\nrec;\nrepeat;\nreturn;\nthen;\nuntil;\nwhile;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"Assert\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"Info\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"IsBound\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"QUIT\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"TryNextMethod\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"Unbind\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"and\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"atomic\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"do\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"elif\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"end\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"fi\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"function\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"local\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"mod\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"not\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"od\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"or\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"quit\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"readonly\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"readwrite\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"rec\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"repeat\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"then\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"until\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/gap/number_feature.test",
    "content": "0\n123134523423423412345132123123432744839127384723987497\n+123123\n-245435\n\n66/123\n66/-123\n\n3.14\n6.62606896e-34\n.1\n.1e1\n-.999\n1._\n1._l\n\n[1..100]\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"123134523423423412345132123123432744839127384723987497\"],\n\t[\"operator\", \"+\"], [\"number\", \"123123\"],\n\t[\"operator\", \"-\"], [\"number\", \"245435\"],\n\n\t[\"number\", \"66\"], [\"operator\", \"/\"], [\"number\", \"123\"],\n\t[\"number\", \"66\"], [\"operator\", \"/\"], [\"operator\", \"-\"], [\"number\", \"123\"],\n\n\t[\"number\", \"3.14\"],\n\t[\"number\", \"6.62606896e-34\"],\n\t[\"number\", \".1\"],\n\t[\"number\", \".1e1\"],\n\t[\"operator\", \"-\"], [\"number\", \".999\"],\n\t[\"number\", \"1._\"],\n\t[\"number\", \"1._l\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"1\"],\n\t[\"operator\", \"..\"],\n\t[\"number\", \"100\"],\n\t[\"punctuation\", \"]\"]\n]\n"
  },
  {
    "path": "tests/languages/gap/operator_feature.test",
    "content": "+ - * / ^ ~\n= <> < > <= >=\n:= .. ->\n\n!. ![ !{\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"~\"],\n\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"<>\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">=\"],\n\n\t[\"operator\", \":=\"],\n\t[\"operator\", \"..\"],\n\t[\"operator\", \"->\"],\n\n\t[\"operator\", \"!\"],\n\t[\"punctuation\", \".\"],\n\t[\"operator\", \"!\"],\n\t[\"punctuation\", \"[\"],\n\t[\"operator\", \"!\"],\n\t[\"punctuation\", \"{\"]\n]\n"
  },
  {
    "path": "tests/languages/gap/punctuation_feature.test",
    "content": "( ) [ ] { }\n, ; . :\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"]\n]\n"
  },
  {
    "path": "tests/languages/gap/shell_feature.test",
    "content": "gap> i := 0;; s := 0;;\ngap> while s <= 200 do\n>    i := i + 1; s := s + i^2;\n>  od;\ngap> s;\n204\ngap> l := [ 1, 2, 3, 4, 5, 6 ];;\ngap> for i in l do\n>    Print( i, \" \" );\n>    l := [];\n> od; Print( \"\\n\" );\n1 2 3 4 5 6\ngap> g := Group((1,2,3),(1,2));\nGroup([ (1,2,3), (1,2) ])\ngap> for x in g do\n> if Order(x) = 3 then\n> continue;\n> fi; Print(x,\"\\n\"); od;\n()\n(2,3)\n(1,3)\n(1,2)\ngap> continue;\nSyntax error: 'continue' statement not enclosed in a loop\n\n----------------------------------------------------\n\n[\n\t[\"shell\", [\n\t\t[\"punctuation\", \"gap>\"],\n\t\t[\"gap\", [\n\t\t\t\" i \",\n\t\t\t[\"operator\", \":=\"],\n\t\t\t[\"number\", \"0\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t\" s \",\n\t\t\t[\"operator\", \":=\"],\n\t\t\t[\"number\", \"0\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]]\n\t]],\n\t[\"shell\", [\n\t\t[\"punctuation\", \"gap>\"],\n\t\t[\"gap\", [\n\t\t\t[\"keyword\", \"while\"],\n\t\t\t\" s \",\n\t\t\t[\"operator\", \"<=\"],\n\t\t\t[\"number\", \"200\"],\n\t\t\t[\"keyword\", \"do\"],\n\n\t\t\t[\"continuation\", \">\"],\n\t\t\t\"    i \",\n\t\t\t[\"operator\", \":=\"],\n\t\t\t\" i \",\n\t\t\t[\"operator\", \"+\"],\n\t\t\t[\"number\", \"1\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t\" s \",\n\t\t\t[\"operator\", \":=\"],\n\t\t\t\" s \",\n\t\t\t[\"operator\", \"+\"],\n\t\t\t\" i\",\n\t\t\t[\"operator\", \"^\"],\n\t\t\t[\"number\", \"2\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"continuation\", \">\"],\n\t\t\t[\"keyword\", \"od\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]]\n\t]],\n\t[\"shell\", [\n\t\t[\"punctuation\", \"gap>\"],\n\t\t[\"gap\", [\n\t\t\t\" s\",\n\t\t\t[\"punctuation\", \";\"]\n\t\t]],\n\n\t\t\"\\r\\n204\\r\\n\"\n\t]],\n\t[\"shell\", [\n\t\t[\"punctuation\", \"gap>\"],\n\t\t[\"gap\", [\n\t\t\t\" l \",\n\t\t\t[\"operator\", \":=\"],\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"number\", \"1\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"2\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"3\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"4\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"5\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"6\"],\n\t\t\t[\"punctuation\", \"]\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]]\n\t]],\n\t[\"shell\", [\n\t\t[\"punctuation\", \"gap>\"],\n\t\t[\"gap\", [\n\t\t\t[\"keyword\", \"for\"],\n\t\t\t\" i \",\n\t\t\t[\"keyword\", \"in\"],\n\t\t\t\" l \",\n\t\t\t[\"keyword\", \"do\"],\n\n\t\t\t[\"continuation\", \">\"],\n\t\t\t[\"function\", \"Print\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\" i\",\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"string\", [\"\\\" \\\"\"]],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"continuation\", \">\"],\n\t\t\t\"    l \",\n\t\t\t[\"operator\", \":=\"],\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"punctuation\", \"]\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"continuation\", \">\"],\n\t\t\t[\"keyword\", \"od\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t[\"function\", \"Print\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"string\", [\"\\\"\\\\n\\\"\"]],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]],\n\n\t\t\"\\r\\n1 2 3 4 5 6\\r\\n\"\n\t]],\n\t[\"shell\", [\n\t\t[\"punctuation\", \"gap>\"],\n\t\t[\"gap\", [\n\t\t\t\" g \",\n\t\t\t[\"operator\", \":=\"],\n\t\t\t[\"function\", \"Group\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"number\", \"1\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"2\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"3\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"number\", \"1\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"2\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]],\n\n\t\t\"\\r\\nGroup([ (1,2,3), (1,2) ])\\r\\n\"\n\t]],\n\t[\"shell\", [\n\t\t[\"punctuation\", \"gap>\"],\n\t\t[\"gap\", [\n\t\t\t[\"keyword\", \"for\"],\n\t\t\t\" x \",\n\t\t\t[\"keyword\", \"in\"],\n\t\t\t\" g \",\n\t\t\t[\"keyword\", \"do\"],\n\n\t\t\t[\"continuation\", \">\"],\n\t\t\t[\"keyword\", \"if\"],\n\t\t\t[\"function\", \"Order\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"x\",\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"operator\", \"=\"],\n\t\t\t[\"number\", \"3\"],\n\t\t\t[\"keyword\", \"then\"],\n\n\t\t\t[\"continuation\", \">\"],\n\t\t\t[\"keyword\", \"continue\"],\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"continuation\", \">\"],\n\t\t\t[\"keyword\", \"fi\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t[\"function\", \"Print\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"x\",\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"string\", [\"\\\"\\\\n\\\"\"]],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t[\"keyword\", \"od\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]],\n\n\t\t\"\\r\\n()\\r\\n(2,3)\\r\\n(1,3)\\r\\n(1,2)\\r\\n\"\n\t]],\n\t[\"shell\", [\n\t\t[\"punctuation\", \"gap>\"],\n\t\t[\"gap\", [\n\t\t\t[\"keyword\", \"continue\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]],\n\n\t\t\"\\r\\nSyntax error: 'continue' statement not enclosed in a loop\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/gap/string_feature.test",
    "content": "'f'\n'\\n'\n\n\"\"\n\"foo\"\n\"\\\"\"\n\n\"\"\"\"\"\"\n\"\"\" foo \"\"\"\n\"\"\"\nfoo\n\"\"\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", [\"'f'\"]],\n\t[\"string\", [\"'\\\\n'\"]],\n\n\t[\"string\", [\"\\\"\\\"\"]],\n\t[\"string\", [\"\\\"foo\\\"\"]],\n\t[\"string\", [\"\\\"\\\\\\\"\\\"\"]],\n\n\t[\"string\", [\"\\\"\\\"\\\"\\\"\\\"\\\"\"]],\n\t[\"string\", [\"\\\"\\\"\\\" foo \\\"\\\"\\\"\"]],\n\t[\"string\", [\"\\\"\\\"\\\"\\r\\nfoo\\r\\n\\\"\\\"\\\"\"]]\n]\n"
  },
  {
    "path": "tests/languages/gcode/checksum_feature.test",
    "content": "G28*22\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"G28\"],\n\t[\"punctuation\", \"*\"],\n\t[\"checksum\", \"22\"]\n]\n\n----------------------------------------------------\n\nChecks for checksums.\n"
  },
  {
    "path": "tests/languages/gcode/comment_feature.test",
    "content": "; foo\n(Home some axes)\nG28 (here come the axes to be homed) X\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"; foo\"],\n\n\t[\"comment\", \"(Home some axes)\"],\n\n\t[\"keyword\", \"G28\"],\n\t[\"comment\", \"(here come the axes to be homed)\"],\n\t[\"property\", \"X\"]\n\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/gcode/keyword_feature.test",
    "content": "G00\nG200\nG84.1\n\nM00\nM123\nM52.4\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"G00\"],\n\t[\"keyword\", \"G200\"],\n\t[\"keyword\", \"G84.1\"],\n\n\t[\"keyword\", \"M00\"],\n\t[\"keyword\", \"M123\"],\n\t[\"keyword\", \"M52.4\"]\n]\n\n----------------------------------------------------\n\nChecks for G- and M-codes.\n"
  },
  {
    "path": "tests/languages/gcode/property_feature.test",
    "content": "X123\nY0.2\nZ-3.1415\nE420:420\n\n----------------------------------------------------\n\n[\n\t[\"property\", \"X\"], \"123\\r\\n\",\n\t[\"property\", \"Y\"], \"0.2\\r\\n\",\n\t[\"property\", \"Z\"], \"-3.1415\\r\\n\",\n\t[\"property\", \"E\"], \"420\", [\"punctuation\", \":\"], \"420\"\n]\n\n----------------------------------------------------\n\nChecks for all other codes except G- and M-codes.\n"
  },
  {
    "path": "tests/languages/gcode/string_feature.test",
    "content": "M587 S\"MYROUTER\" P\"ABCxyz;\"\" 123\"\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"M587\"],\n\n\t[\"property\", \"S\"],\n\t[\"string\", \"\\\"MYROUTER\\\"\"],\n\n\t[\"property\", \"P\"],\n\t[\"string\", \"\\\"ABCxyz;\\\"\\\" 123\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/gdscript/class-name_feature.test",
    "content": "class_name Foo\nextends Bar\n\nclass InnerClass:\n\nexport(int) var baz\nexport(int, 0) var i\n\nreturn foo as Node\n\nconst FOO: int = 9\nvar bar: bool = true\n\nfunc add(reference: Item, amount: int) -> Item:\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"class_name\"], [\"class-name\", \"Foo\"],\n\t[\"keyword\", \"extends\"], [\"class-name\", \"Bar\"],\n\n\t[\"keyword\", \"class\"], [\"class-name\", \"InnerClass\"], [\"punctuation\", \":\"],\n\n\t[\"keyword\", \"export\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", \"int\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"var\"],\n\t\" baz\\r\\n\",\n\n\t[\"keyword\", \"export\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", \"int\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"var\"],\n\t\" i\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"return\"], \" foo \", [\"keyword\", \"as\"], [\"class-name\", \"Node\"],\n\n\t[\"keyword\", \"const\"],\n\t[\"constant\", \"FOO\"],\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"int\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"9\"],\n\n\t[\"keyword\", \"var\"],\n\t\" bar\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"bool\"],\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\n\t[\"keyword\", \"func\"],\n\t[\"function\", \"add\"],\n\t[\"punctuation\", \"(\"],\n\t\"reference\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"Item\"],\n\t[\"punctuation\", \",\"],\n\t\" amount\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"int\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"->\"],\n\t[\"class-name\", \"Item\"],\n\t[\"punctuation\", \":\"]\n]\n\n----------------------------------------------------\n\nChecks for class names.\n"
  },
  {
    "path": "tests/languages/gdscript/keyword_feature.test",
    "content": "and\nas\nassert\nbreak\nbreakpoint\nclass\nclass_name\nconst\ncontinue\nelif\nelse\nenum\nexport\nextends\nfor\nfunc\nif\nin\nis\nmaster\nmastersync\nmatch\nnot\nnull\nonready\nor\npass\npreload\npuppet\npuppetsync\nremote\nremotesync\nreturn\nself\nsetget\nsignal\nstatic\ntool\nvar\nwhile\nyield\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"and\"],\n\t[\"keyword\", \"as\"],\n\t[\"keyword\", \"assert\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"breakpoint\"],\n\t[\"keyword\", \"class\"],\n\t[\"keyword\", \"class_name\"],\n\t[\"keyword\", \"const\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"elif\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"enum\"],\n\t[\"keyword\", \"export\"],\n\t[\"keyword\", \"extends\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"func\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"is\"],\n\t[\"keyword\", \"master\"],\n\t[\"keyword\", \"mastersync\"],\n\t[\"keyword\", \"match\"],\n\t[\"keyword\", \"not\"],\n\t[\"keyword\", \"null\"],\n\t[\"keyword\", \"onready\"],\n\t[\"keyword\", \"or\"],\n\t[\"keyword\", \"pass\"],\n\t[\"keyword\", \"preload\"],\n\t[\"keyword\", \"puppet\"],\n\t[\"keyword\", \"puppetsync\"],\n\t[\"keyword\", \"remote\"],\n\t[\"keyword\", \"remotesync\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"self\"],\n\t[\"keyword\", \"setget\"],\n\t[\"keyword\", \"signal\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"tool\"],\n\t[\"keyword\", \"var\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"yield\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/gdscript/number_feature.test",
    "content": "123\n-123\n123.456\n.5\n1.2e-34\n\n0xBadFace\n0b01010101\n\n1_000_000_000_000\n0xBAD_FACE\n0b_0010_0010_0100_0100\n\nINF NAN PI TAU\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"123\"],\n\t[\"operator\", \"-\"], [\"number\", \"123\"],\n\t[\"number\", \"123.456\"],\n\t[\"number\", \".5\"],\n\t[\"number\", \"1.2e-34\"],\n\n\t[\"number\", \"0xBadFace\"],\n\t[\"number\", \"0b01010101\"],\n\n\t[\"number\", \"1_000_000_000_000\"],\n\t[\"number\", \"0xBAD_FACE\"],\n\t[\"number\", \"0b_0010_0010_0100_0100\"],\n\n\t[\"number\", \"INF\"], [\"number\", \"NAN\"], [\"number\", \"PI\"], [\"number\", \"TAU\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers.\n"
  },
  {
    "path": "tests/languages/gdscript/operator_feature.test",
    "content": "+ - * / %\n& | ~ ^ >> <<\n&& || !\n> < = == != >= <=\n:=\n->\n+= -= *= /= %= &= |=\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \">>\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\t[\"operator\", \"!\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \":=\"],\n\t[\"operator\", \"->\"],\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"%=\"],\n\t[\"operator\", \"&=\"],\n\t[\"operator\", \"|=\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/gdscript/punctuation_feature.test",
    "content": ". : , ; [] () {}\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/gdscript/string_feature.test",
    "content": "\"foo\"\n'bar'\n\"\\\"'foo'\\\"\"\n'\"\\'bar\\'\"'\n\n\"\"\"\n\"baz\"\n\"\"\"\n\n@\"foo\"\n@'bar'\n@\"\"\"baz\"\"\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"'bar'\"],\n\t[\"string\", \"\\\"\\\\\\\"'foo'\\\\\\\"\\\"\"],\n\t[\"string\", \"'\\\"\\\\'bar\\\\'\\\"'\"],\n\n\t[\"string\", \"\\\"\\\"\\\"\\r\\n\\\"baz\\\"\\r\\n\\\"\\\"\\\"\"],\n\n\t[\"string\", \"@\\\"foo\\\"\"],\n\t[\"string\", \"@'bar'\"],\n\t[\"string\", \"@\\\"\\\"\\\"baz\\\"\\\"\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/gedcom/level_feature.test",
    "content": "0 HEAD\r\n1 CHAR ASCII\r\n99 FOO bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"level\", \"0\"],\r\n\t[\"record\", \"HEAD\"],\r\n\t[\"level\", \"1\"],\r\n\t[\"record\", \"CHAR\"],\r\n\t[\"line-value\", [\"ASCII\"]],\r\n\t[\"level\", \"99\"],\r\n\t[\"record\", \"FOO\"],\r\n\t[\"line-value\", [\"bar\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for levels.\r\n"
  },
  {
    "path": "tests/languages/gedcom/line-value_feature.test",
    "content": "1 CHIL @CHILD1@\r\n2 PLAC ÁĆÉǴÍ,ḰĹḾŃÓ,ṔŔŚÚẂ,ÝŹáćé,ǵíḱĺḿ,ńóṕŕś,úẃýź\r\n1 NAME code: 0313/COMMA ABOVE/\r\n2 DATE @#DGREGORIAN@ 31 DEC 1997\r\n2 CONT Copyright gedcom@@gedcom.org\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"level\", \"1\"],\r\n\t[\"record\", \"CHIL\"],\r\n\t[\"line-value\", [[\"pointer\", \"@CHILD1@\"]]],\r\n\t[\"level\", \"2\"],\r\n\t[\"record\", \"PLAC\"],\r\n\t[\"line-value\", [\"ÁĆÉǴÍ,ḰĹḾŃÓ,ṔŔŚÚẂ,ÝŹáćé,ǵíḱĺḿ,ńóṕŕś,úẃýź\"]],\r\n\t[\"level\", \"1\"],\r\n\t[\"record\", \"NAME\"],\r\n\t[\"line-value\", [\"code: 0313/COMMA ABOVE/\"]],\r\n\t[\"level\", \"2\"],\r\n\t[\"record\", \"DATE\"],\r\n\t[\"line-value\", [\"@#DGREGORIAN@ 31 DEC 1997\"]],\r\n\t[\"level\", \"2\"],\r\n\t[\"record\", \"CONT\"],\r\n\t[\"line-value\", [\"Copyright gedcom@@gedcom.org\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for line values.\r\n"
  },
  {
    "path": "tests/languages/gedcom/pointer_feature.test",
    "content": "@f!@\r\n@foo_Bar@\r\n@_$!\"$%&'()*+,-./:;<=>?[\\]^`{|}~ #foobar@\r\n0 @SUBMITTER@ SUBM\r\n1 FAMS @FAMILY@\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"pointer\", \"@f!@\"],\r\n\t[\"pointer\", \"@foo_Bar@\"],\r\n\t[\"pointer\", \"@_$!\\\"$%&'()*+,-./:;<=>?[\\\\]^`{|}~ #foobar@\"],\r\n\t[\"level\", \"0\"],\r\n\t[\"pointer\", \"@SUBMITTER@\"],\r\n\t[\"record\", \"SUBM\"],\r\n\t[\"level\", \"1\"],\r\n\t[\"record\", \"FAMS\"],\r\n\t[\"line-value\", [[\"pointer\", \"@FAMILY@\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for pointers.\r\n"
  },
  {
    "path": "tests/languages/gedcom/record_feature.test",
    "content": "0 HEAD\n1 foo_bar\n2 _\n3 @pointer@ _Sometag42\n4 247\n\n----------------------------------------------------\n\n[\n\t[\"level\", \"0\"],\n\t[\"record\", \"HEAD\"],\n\t[\"level\", \"1\"],\n\t[\"record\", \"foo_bar\"],\n\t[\"level\", \"2\"],\n\t[\"record\", \"_\"],\n\t[\"level\", \"3\"],\n\t[\"pointer\", \"@pointer@\"],\n\t[\"record\", \"_Sometag42\"],\n\t[\"level\", \"4\"],\n\t[\"record\", \"247\"]\n]\n\n----------------------------------------------------\n\nChecks for records.\n"
  },
  {
    "path": "tests/languages/gettext/comment_feature.html.test",
    "content": "#  translator-comments\n#. extracted-comments\n#: reference…\n#, flag…\n#| msgid previous-untranslated-string\n\n----------------------------------------------------\n\n<span class=\"token comment translator-comment\">#  translator-comments</span>\n<span class=\"token comment extracted-comment\">#. extracted-comments</span>\n<span class=\"token comment reference-comment\">#: reference…</span>\n<span class=\"token comment flag-comment\">#, flag…</span>\n<span class=\"token comment previously-untranslated-comment\">\n\t#| msgid previous-untranslated-string\n</span>\n"
  },
  {
    "path": "tests/languages/gettext/keyword_feature.test",
    "content": "msgid\nmsgid_plural\nmsgstr\nmsgctxt\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"msgid\"],\n\t[\"keyword\", \"msgid_plural\"],\n\t[\"keyword\", \"msgstr\"],\n\t[\"keyword\", \"msgctxt\"]\n]\n"
  },
  {
    "path": "tests/languages/gettext/number_feature.test",
    "content": "0\n1\n123\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"1\"],\n\t[\"number\", \"123\"]\n]\n"
  },
  {
    "path": "tests/languages/gettext/punctuation_feature.test",
    "content": "[ ]\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"]\n]\n"
  },
  {
    "path": "tests/languages/gettext/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"\\\"\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"\\\\\\\"\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/gherkin/atrule_feature.test",
    "content": "Scenario: foo\r\n\t'ach foobar\r\n\t'a foobar\r\n\t'ej foobar\r\n\t7 foobar\r\n\ta foobar\r\n\tA také foobar\r\n\tA taktiež foobar\r\n\tA tiež foobar\r\n\tA zároveň foobar\r\n\tAber foobar\r\n\tAc foobar\r\n\tAdott foobar\r\n\tAkkor foobar\r\n\tAk foobar\r\n\tAleshores foobar\r\n\tAle foobar\r\n\tAli foobar\r\n\tAllora foobar\r\n\tAlors foobar\r\n\tAls foobar\r\n\tAma foobar\r\n\tAmennyiben foobar\r\n\tAmikor foobar\r\n\tAmpak foobar\r\n\tan foobar\r\n\tAN foobar\r\n\tAnanging foobar\r\n\tAnd y'all foobar\r\n\tAnd foobar\r\n\tAngenommen foobar\r\n\tAnrhegedig a foobar\r\n\tAn foobar\r\n\tApabila foobar\r\n\tAtès foobar\r\n\tAtesa foobar\r\n\tAtunci foobar\r\n\tAvast! foobar\r\n\tAye foobar\r\n\tA foobar\r\n\tawer foobar\r\n\tBagi foobar\r\n\tBanjur foobar\r\n\tBet foobar\r\n\tBiết foobar\r\n\tBlimey! foobar\r\n\tBuh foobar\r\n\tBut at the end of the day I reckon foobar\r\n\tBut y'all foobar\r\n\tBut foobar\r\n\tBUT foobar\r\n\tCal foobar\r\n\tCând foobar\r\n\tCando foobar\r\n\tCand foobar\r\n\tCe foobar\r\n\tCuando foobar\r\n\tČe foobar\r\n\tÐa ðe foobar\r\n\tÐa foobar\r\n\tDadas foobar\r\n\tDada foobar\r\n\tDados foobar\r\n\tDado foobar\r\n\tDaH ghu' bejlu' foobar\r\n\tdann foobar\r\n\tDann foobar\r\n\tDano foobar\r\n\tDan foobar\r\n\tDar foobar\r\n\tDat fiind foobar\r\n\tData foobar\r\n\tDate fiind foobar\r\n\tDate foobar\r\n\tDati fiind foobar\r\n\tDati foobar\r\n\tDaţi fiind foobar\r\n\tDați fiind foobar\r\n\tDato foobar\r\n\tDEN foobar\r\n\tDen youse gotta foobar\r\n\tDengan foobar\r\n\tDe foobar\r\n\tDiberi foobar\r\n\tDiyelim ki foobar\r\n\tDonada foobar\r\n\tDonat foobar\r\n\tDonitaĵo foobar\r\n\tDo foobar\r\n\tDun foobar\r\n\tDuota foobar\r\n\tÐurh foobar\r\n\tEeldades foobar\r\n\tEf foobar\r\n\tEğer ki foobar\r\n\tEntao foobar\r\n\tEntão foobar\r\n\tEntón foobar\r\n\tEntonces foobar\r\n\tEn foobar\r\n\tEpi foobar\r\n\tE foobar\r\n\tÉs foobar\r\n\tEtant donnée foobar\r\n\tEtant donné foobar\r\n\tEt foobar\r\n\tÉtant données foobar\r\n\tÉtant donnée foobar\r\n\tÉtant donné foobar\r\n\tEtant données foobar\r\n\tEtant donnés foobar\r\n\tÉtant donnés foobar\r\n\tFakat foobar\r\n\tGangway! foobar\r\n\tGdy foobar\r\n\tGegeben seien foobar\r\n\tGegeben sei foobar\r\n\tGegeven foobar\r\n\tGegewe foobar\r\n\tghu' noblu' foobar\r\n\tGitt foobar\r\n\tGiven y'all foobar\r\n\tGiven foobar\r\n\tGivet foobar\r\n\tGivun foobar\r\n\tHa foobar\r\n\tCho foobar\r\n\tI CAN HAZ foobar\r\n\tIn foobar\r\n\tIr foobar\r\n\tIt's just unbelievable foobar\r\n\tI foobar\r\n\tJa foobar\r\n\tJeśli foobar\r\n\tJeżeli foobar\r\n\tKadar foobar\r\n\tKada foobar\r\n\tKad foobar\r\n\tKai foobar\r\n\tKaj foobar\r\n\tKdyž foobar\r\n\tKeď foobar\r\n\tKemudian foobar\r\n\tKetika foobar\r\n\tKhi foobar\r\n\tKiedy foobar\r\n\tKo foobar\r\n\tKuid foobar\r\n\tKui foobar\r\n\tKun foobar\r\n\tLan foobar\r\n\tlatlh foobar\r\n\tLe sa a foobar\r\n\tLet go and haul foobar\r\n\tLe foobar\r\n\tLè sa a foobar\r\n\tLè foobar\r\n\tLogo foobar\r\n\tLorsqu'< foobar\r\n\tLorsque foobar\r\n\tmä foobar\r\n\tMaar foobar\r\n\tMais foobar\r\n\tMając foobar\r\n\tMajd foobar\r\n\tMaka foobar\r\n\tManawa foobar\r\n\tMas foobar\r\n\tMa foobar\r\n\tMenawa foobar\r\n\tMen foobar\r\n\tMutta foobar\r\n\tNalikaning foobar\r\n\tNalika foobar\r\n\tNanging foobar\r\n\tNår foobar\r\n\tNär foobar\r\n\tNato foobar\r\n\tNhưng foobar\r\n\tNiin foobar\r\n\tNjuk foobar\r\n\tO zaman foobar\r\n\tOg foobar\r\n\tOch foobar\r\n\tOletetaan foobar\r\n\tOnda foobar\r\n\tOnd foobar\r\n\tOraz foobar\r\n\tPak foobar\r\n\tPero foobar\r\n\tPerò foobar\r\n\tPodano foobar\r\n\tPokiaľ foobar\r\n\tPokud foobar\r\n\tPotem foobar\r\n\tPotom foobar\r\n\tPrivzeto foobar\r\n\tPryd foobar\r\n\tqaSDI' foobar\r\n\tQuando foobar\r\n\tQuand foobar\r\n\tQuan foobar\r\n\tSå foobar\r\n\tSed foobar\r\n\tSe foobar\r\n\tSiis foobar\r\n\tSipoze ke foobar\r\n\tSipoze Ke foobar\r\n\tSipoze foobar\r\n\tSi foobar\r\n\tŞi foobar\r\n\tȘi foobar\r\n\tSoit foobar\r\n\tStel foobar\r\n\tTada foobar\r\n\tTad foobar\r\n\tTakrat foobar\r\n\tTak foobar\r\n\tTapi foobar\r\n\tTer foobar\r\n\tTetapi foobar\r\n\tTha the foobar\r\n\tTha foobar\r\n\tThen y'all foobar\r\n\tThen foobar\r\n\tThì foobar\r\n\tThurh foobar\r\n\tToda foobar\r\n\tToo right foobar\r\n\tugeholl foobar\r\n\tUnd foobar\r\n\tUn foobar\r\n\tVà foobar\r\n\tvaj foobar\r\n\tVendar foobar\r\n\tVe foobar\r\n\twann foobar\r\n\tWanneer foobar\r\n\tWEN foobar\r\n\tWenn foobar\r\n\tWhen y'all foobar\r\n\tWhen foobar\r\n\tWtedy foobar\r\n\tWun foobar\r\n\tY'know foobar\r\n\tYeah nah foobar\r\n\tYna foobar\r\n\tYouse know like when foobar\r\n\tYouse know when youse got foobar\r\n\tY foobar\r\n\tZa predpokladu foobar\r\n\tZa předpokladu foobar\r\n\tZadani foobar\r\n\tZadano foobar\r\n\tZadan foobar\r\n\tZadate foobar\r\n\tZadato foobar\r\n\tZakładając foobar\r\n\tZaradi foobar\r\n\tZatati foobar\r\n\tÞa foobar\r\n\tÞá foobar\r\n\tÞa þe foobar\r\n\tÞegar foobar\r\n\tÞurh foobar\r\n\tΑλλά foobar\r\n\tΔεδομένου foobar\r\n\tΚαι foobar\r\n\tΌταν foobar\r\n\tΤότε foobar\r\n\tА також foobar\r\n\tАгар foobar\r\n\tАле foobar\r\n\tАли foobar\r\n\tАммо foobar\r\n\tА foobar\r\n\tӘгәр foobar\r\n\tӘйтик foobar\r\n\tӘмма foobar\r\n\tБирок foobar\r\n\tВа foobar\r\n\tВә foobar\r\n\tДадено foobar\r\n\tДано foobar\r\n\tДопустим foobar\r\n\tЕсли foobar\r\n\tЗадате foobar\r\n\tЗадати foobar\r\n\tЗадато foobar\r\n\tИ foobar\r\n\tІ foobar\r\n\tК тому же foobar\r\n\tКада foobar\r\n\tКад foobar\r\n\tКогато foobar\r\n\tКогда foobar\r\n\tКоли foobar\r\n\tЛәкин foobar\r\n\tЛекин foobar\r\n\tНәтиҗәдә foobar\r\n\tНехай foobar\r\n\tНо foobar\r\n\tОнда foobar\r\n\tПрипустимо, що foobar\r\n\tПрипустимо foobar\r\n\tПусть foobar\r\n\tТакже foobar\r\n\tТа foobar\r\n\tТогда foobar\r\n\tТоді foobar\r\n\tТо foobar\r\n\tУнда foobar\r\n\tҺәм foobar\r\n\tЯкщо foobar\r\n\tאבל foobar\r\n\tאזי foobar\r\n\tאז foobar\r\n\tבהינתן foobar\r\n\tוגם foobar\r\n\tכאשר foobar\r\n\tآنگاه foobar\r\n\tاذاً foobar\r\n\tاگر foobar\r\n\tاما foobar\r\n\tاور foobar\r\n\tبا فرض foobar\r\n\tبالفرض foobar\r\n\tبفرض foobar\r\n\tپھر foobar\r\n\tتب foobar\r\n\tثم foobar\r\n\tجب foobar\r\n\tعندما foobar\r\n\tفرض کیا foobar\r\n\tلكن foobar\r\n\tلیکن foobar\r\n\tمتى foobar\r\n\tهنگامی foobar\r\n\tو foobar\r\n\tअगर foobar\r\n\tऔर foobar\r\n\tकदा foobar\r\n\tकिन्तु foobar\r\n\tचूंकि foobar\r\n\tजब foobar\r\n\tतथा foobar\r\n\tतदा foobar\r\n\tतब foobar\r\n\tपरन्तु foobar\r\n\tपर foobar\r\n\tयदि foobar\r\n\tਅਤੇ foobar\r\n\tਜਦੋਂ foobar\r\n\tਜਿਵੇਂ ਕਿ foobar\r\n\tਜੇਕਰ foobar\r\n\tਤਦ foobar\r\n\tਪਰ foobar\r\n\tఅప్పుడు foobar\r\n\tఈ పరిస్థితిలో foobar\r\n\tకాని foobar\r\n\tచెప్పబడినది foobar\r\n\tమరియు foobar\r\n\tಆದರೆ foobar\r\n\tನಂತರ foobar\r\n\tನೀಡಿದ foobar\r\n\tಮತ್ತು foobar\r\n\tಸ್ಥಿತಿಯನ್ನು foobar\r\n\tกำหนดให้ foobar\r\n\tดังนั้น foobar\r\n\tแต่ foobar\r\n\tเมื่อ foobar\r\n\tและ foobar\r\n\t그러면< foobar\r\n\t그리고< foobar\r\n\t단< foobar\r\n\t만약< foobar\r\n\t만일< foobar\r\n\t먼저< foobar\r\n\t조건< foobar\r\n\t하지만< foobar\r\n\tかつ< foobar\r\n\tしかし< foobar\r\n\tただし< foobar\r\n\tならば< foobar\r\n\tもし< foobar\r\n\t並且< foobar\r\n\t但し< foobar\r\n\t但是< foobar\r\n\t假如< foobar\r\n\t假定< foobar\r\n\t假設< foobar\r\n\t假设< foobar\r\n\t前提< foobar\r\n\t同时< foobar\r\n\t同時< foobar\r\n\t并且< foobar\r\n\t当< foobar\r\n\t當< foobar\r\n\t而且< foobar\r\n\t那么< foobar\r\n\t那麼< foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"scenario\", [[\"keyword\", \"Scenario:\"], [\"important\", \" foo\"]]],\r\n\t[\"atrule\", \"'ach\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"'a\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"'ej\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"7\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"a\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"A také\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"A taktiež\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"A tiež\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"A zároveň\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Aber\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ac\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Adott\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Akkor\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ak\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Aleshores\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ale\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ali\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Allora\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Alors\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Als\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ama\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Amennyiben\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Amikor\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ampak\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"an\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"AN\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ananging\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"And y'all\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"And\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Angenommen\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Anrhegedig a\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"An\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Apabila\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Atès\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Atesa\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Atunci\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Avast!\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Aye\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"A\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"awer\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Bagi\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Banjur\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Bet\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Biết\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Blimey!\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Buh\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"But at the end of the day I reckon\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"But y'all\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"But\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"BUT\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Cal\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Când\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Cando\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Cand\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ce\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Cuando\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Če\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ða ðe\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ða\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dadas\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dada\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dados\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dado\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"DaH ghu' bejlu'\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"dann\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dann\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dano\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dan\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dar\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dat fiind\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Data\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Date fiind\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Date\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dati fiind\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dati\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Daţi fiind\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dați fiind\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dato\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"DEN\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Den youse gotta\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dengan\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"De\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Diberi\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Diyelim ki\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Donada\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Donat\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Donitaĵo\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Do\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Dun\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Duota\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ðurh\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Eeldades\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ef\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Eğer ki\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Entao\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Então\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Entón\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Entonces\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"En\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Epi\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"E\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"És\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Etant donnée\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Etant donné\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Et\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Étant données\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Étant donnée\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Étant donné\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Etant données\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Etant donnés\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Étant donnés\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Fakat\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Gangway!\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Gdy\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Gegeben seien\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Gegeben sei\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Gegeven\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Gegewe\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ghu' noblu'\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Gitt\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Given y'all\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Given\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Givet\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Givun\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ha\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Cho\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"I CAN HAZ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"In\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ir\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"It's just unbelievable\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"I\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ja\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Jeśli\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Jeżeli\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Kadar\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Kada\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Kad\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Kai\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Kaj\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Když\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Keď\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Kemudian\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ketika\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Khi\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Kiedy\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ko\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Kuid\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Kui\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Kun\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Lan\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"latlh\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Le sa a\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Let go and haul\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Le\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Lè sa a\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Lè\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Logo\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Lorsqu'<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Lorsque\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"mä\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Maar\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Mais\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Mając\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Majd\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Maka\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Manawa\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Mas\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ma\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Menawa\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Men\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Mutta\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Nalikaning\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Nalika\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Nanging\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Når\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"När\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Nato\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Nhưng\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Niin\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Njuk\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"O zaman\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Og\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Och\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Oletetaan\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Onda\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ond\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Oraz\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Pak\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Pero\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Però\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Podano\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Pokiaľ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Pokud\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Potem\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Potom\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Privzeto\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Pryd\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"qaSDI'\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Quando\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Quand\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Quan\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Så\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Sed\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Se\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Siis\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Sipoze ke\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Sipoze Ke\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Sipoze\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Si\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Şi\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Și\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Soit\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Stel\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Tada\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Tad\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Takrat\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Tak\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Tapi\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ter\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Tetapi\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Tha the\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Tha\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Then y'all\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Then\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Thì\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Thurh\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Toda\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Too right\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ugeholl\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Und\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Un\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Và\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"vaj\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Vendar\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ve\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"wann\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Wanneer\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"WEN\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Wenn\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"When y'all\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"When\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Wtedy\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Wun\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Y'know\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Yeah nah\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Yna\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Youse know like when\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Youse know when youse got\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Y\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Za predpokladu\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Za předpokladu\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Zadani\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Zadano\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Zadan\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Zadate\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Zadato\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Zakładając\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Zaradi\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Zatati\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Þa\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Þá\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Þa þe\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Þegar\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Þurh\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Αλλά\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Δεδομένου\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Και\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Όταν\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Τότε\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"А також\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Агар\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Але\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Али\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Аммо\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"А\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Әгәр\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Әйтик\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Әмма\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Бирок\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ва\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Вә\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Дадено\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Дано\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Допустим\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Если\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Задате\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Задати\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Задато\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"И\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"І\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"К тому же\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Када\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Кад\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Когато\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Когда\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Коли\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Ләкин\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Лекин\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Нәтиҗәдә\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Нехай\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Но\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Онда\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Припустимо, що\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Припустимо\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Пусть\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Также\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Та\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Тогда\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Тоді\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"То\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Унда\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Һәм\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"Якщо\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"אבל\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"אזי\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"אז\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"בהינתן\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"וגם\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"כאשר\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"آنگاه\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"اذاً\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"اگر\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"اما\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"اور\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"با فرض\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"بالفرض\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"بفرض\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"پھر\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"تب\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ثم\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"جب\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"عندما\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"فرض کیا\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"لكن\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"لیکن\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"متى\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"هنگامی\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"و\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"अगर\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"और\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"कदा\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"किन्तु\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"चूंकि\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"जब\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"तथा\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"तदा\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"तब\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"परन्तु\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"पर\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"यदि\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ਅਤੇ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ਜਦੋਂ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ਜਿਵੇਂ ਕਿ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ਜੇਕਰ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ਤਦ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ਪਰ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"అప్పుడు\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ఈ పరిస్థితిలో\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"కాని\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"చెప్పబడినది\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"మరియు\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ಆದರೆ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ನಂತರ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ನೀಡಿದ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ಮತ್ತು\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ಸ್ಥಿತಿಯನ್ನು\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"กำหนดให้\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ดังนั้น\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"แต่\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"เมื่อ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"และ\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"그러면<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"그리고<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"단<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"만약<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"만일<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"먼저<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"조건<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"하지만<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"かつ<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"しかし<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ただし<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"ならば<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"もし<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"並且<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"但し<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"但是<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"假如<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"假定<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"假設<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"假设<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"前提<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"同时<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"同時<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"并且<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"当<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"當<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"而且<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"那么<\"],\r\n\t\" foobar\\r\\n\\t\",\r\n\t[\"atrule\", \"那麼<\"],\r\n\t\" foobar\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for at-rules in all languages."
  },
  {
    "path": "tests/languages/gherkin/comment_feature.test",
    "content": "#\r\n# foo bar\r\n\t# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foo bar\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/gherkin/feature_feature.test",
    "content": "Ability: foobar\r\nbaz\r\nAhoy matey!:\r\nArwedd: foobar\r\nAspekt: foobar\r\nBesigheid Behoefte: foobar\r\nBusiness Need: foobar\r\nCaracteristica: foobar\r\nCaracterística: foobar\r\nEgenskab: foobar\r\nEgenskap: foobar\r\nEiginleiki: foobar\r\nFeature: foobar\r\nFīča: foobar\r\nFitur: foobar\r\nFonctionnalité: foobar\r\nFonksyonalite: foobar\r\nFuncionalidade: foobar\r\nFuncionalitat: foobar\r\nFunctionalitate: foobar\r\nFuncţionalitate: foobar\r\nFuncționalitate: foobar\r\nFunctionaliteit: foobar\r\nFungsi: foobar\r\nFunkcia: foobar\r\nFunkcija: foobar\r\nFunkcionalitāte: foobar\r\nFunkcionalnost: foobar\r\nFunkcja: foobar\r\nFunksie: foobar\r\nFunktionalität: foobar\r\nFunktionalitéit: foobar\r\nFunzionalità: foobar\r\nHwaet: foobar\r\nHwæt: foobar\r\nJellemző: foobar\r\nKarakteristik: foobar\r\nlaH: foobar\r\nLastnost: foobar\r\nMak: foobar\r\nMogucnost: foobar\r\nMogućnost: foobar\r\nMoznosti: foobar\r\nMožnosti: foobar\r\nOH HAI: foobar\r\nOmadus: foobar\r\nOminaisuus: foobar\r\nOsobina: foobar\r\nÖzellik: foobar\r\nperbogh: foobar\r\npoQbogh malja': foobar\r\nPotrzeba biznesowa: foobar\r\nPožadavek: foobar\r\nPožiadavka: foobar\r\nPretty much: foobar\r\nQap: foobar\r\nQu'meH 'ut: foobar\r\nSavybė: foobar\r\nTính năng: foobar\r\nTrajto: foobar\r\nVermoë: foobar\r\nVlastnosť: foobar\r\nWłaściwość: foobar\r\nZnačilnost: foobar\r\nΔυνατότητα: foobar\r\nΛειτουργία: foobar\r\nМогућност: foobar\r\nМөмкинлек: foobar\r\nОсобина: foobar\r\nСвойство: foobar\r\nҮзенчәлеклелек: foobar\r\nФункционал: foobar\r\nФункционалност: foobar\r\nФункция: foobar\r\nФункціонал: foobar\r\nתכונה: foobar\r\nخاصية: foobar\r\nخصوصیت: foobar\r\nصلاحیت: foobar\r\nکاروبار کی ضرورت: foobar\r\nوِیژگی: foobar\r\nरूप लेख: foobar\r\nਖਾਸੀਅਤ: foobar\r\nਨਕਸ਼ ਨੁਹਾਰ: foobar\r\nਮੁਹਾਂਦਰਾ: foobar\r\nగుణము: foobar\r\nಹೆಚ್ಚಳ: foobar\r\nความต้องการทางธุรกิจ: foobar\r\nความสามารถ: foobar\r\nโครงหลัก: foobar\r\n기능: foobar\r\nフィーチャ: foobar\r\n功能: foobar\r\n機能: foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"feature\", [[\"keyword\", \"Ability:\"], [\"important\", \" foobar\"], \"\\r\\nbaz\\r\\n\"]],\r\n\t[\"feature\", [[\"keyword\", \"Ahoy matey!:\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Arwedd:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Aspekt:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Besigheid Behoefte:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Business Need:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Caracteristica:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Característica:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Egenskab:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Egenskap:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Eiginleiki:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Feature:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Fīča:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Fitur:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Fonctionnalité:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Fonksyonalite:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funcionalidade:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funcionalitat:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Functionalitate:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funcţionalitate:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funcționalitate:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Functionaliteit:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Fungsi:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funkcia:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funkcija:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funkcionalitāte:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funkcionalnost:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funkcja:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funksie:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funktionalität:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funktionalitéit:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Funzionalità:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Hwaet:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Hwæt:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Jellemző:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Karakteristik:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"laH:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Lastnost:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Mak:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Mogucnost:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Mogućnost:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Moznosti:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Možnosti:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"OH HAI:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Omadus:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Ominaisuus:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Osobina:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Özellik:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"perbogh:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"poQbogh malja':\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Potrzeba biznesowa:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Požadavek:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Požiadavka:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Pretty much:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Qap:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Qu'meH 'ut:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Savybė:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Tính năng:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Trajto:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Vermoë:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Vlastnosť:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Właściwość:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Značilnost:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Δυνατότητα:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Λειτουργία:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Могућност:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Мөмкинлек:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Особина:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Свойство:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Үзенчәлеклелек:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Функционал:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Функционалност:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Функция:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"Функціонал:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"תכונה:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"خاصية:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"خصوصیت:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"صلاحیت:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"کاروبار کی ضرورت:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"وِیژگی:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"रूप लेख:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"ਖਾਸੀਅਤ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"ਨਕਸ਼ ਨੁਹਾਰ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"ਮੁਹਾਂਦਰਾ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"గుణము:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"ಹೆಚ್ಚಳ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"ความต้องการทางธุรกิจ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"ความสามารถ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"โครงหลัก:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"기능:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"フィーチャ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"功能:\"], [\"important\", \" foobar\"]]],\r\n\t[\"feature\", [[\"keyword\", \"機能:\"], [\"important\", \" foobar\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for features in all languages."
  },
  {
    "path": "tests/languages/gherkin/outline_feature.test",
    "content": "<foobar>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"outline\", \"<foobar>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single outlines."
  },
  {
    "path": "tests/languages/gherkin/pystring_feature.test",
    "content": "\"\"\"\r\nfoo\r\nbar\r\n\"\"\"\r\n\r\n'''\r\nfoo\r\nbar\r\n'''\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"pystring\", \"\\\"\\\"\\\"\\r\\nfoo\\r\\nbar\\r\\n\\\"\\\"\\\"\"],\r\n\t[\"pystring\", \"'''\\r\\nfoo\\r\\nbar\\r\\n'''\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for pystrings."
  },
  {
    "path": "tests/languages/gherkin/scenario_feature.test",
    "content": "Abstract Scenario: foobar\r\nAbstrakt Scenario: foobar\r\nAchtergrond: foobar\r\nAer: foobar\r\nÆr: foobar\r\nAgtergrond: foobar\r\nAll y'all: foobar\r\nAntecedentes: foobar\r\nAntecedents: foobar\r\nAtburðarás: foobar\r\nAtburðarásir: foobar\r\nAwww, look mate: foobar\r\nB4: foobar\r\nBackground: foobar\r\nBaggrund: foobar\r\nBakgrund: foobar\r\nBakgrunn: foobar\r\nBakgrunnur: foobar\r\nBeispiele: foobar\r\nBeispiller: foobar\r\nBối cảnh: foobar\r\nCefndir: foobar\r\nCenario: foobar\r\nCenário: foobar\r\nCenario de Fundo: foobar\r\nCenário de Fundo: foobar\r\nCenarios: foobar\r\nCenários: foobar\r\nContesto: foobar\r\nContext: foobar\r\nContexte: foobar\r\nContexto: foobar\r\nConto: foobar\r\nContoh: foobar\r\nContone: foobar\r\nDæmi: foobar\r\nDasar: foobar\r\nDead men tell no tales: foobar\r\nDelineacao do Cenario: foobar\r\nDelineação do Cenário: foobar\r\nDis is what went down: foobar\r\nDữ liệu: foobar\r\nDyagram senaryo: foobar\r\nDyagram Senaryo: foobar\r\nEgzanp: foobar\r\nEjemplos: foobar\r\nEksempler: foobar\r\nEkzemploj: foobar\r\nEnghreifftiau: foobar\r\nEsbozo do escenario: foobar\r\nEscenari: foobar\r\nEscenario: foobar\r\nEsempi: foobar\r\nEsquema de l'escenari: foobar\r\nEsquema del escenario: foobar\r\nEsquema do Cenario: foobar\r\nEsquema do Cenário: foobar\r\nExamples: foobar\r\nEXAMPLZ: foobar\r\nExempel: foobar\r\nExemple: foobar\r\nExemples: foobar\r\nExemplos: foobar\r\nFirst off: foobar\r\nFono: foobar\r\nForgatókönyv: foobar\r\nForgatókönyv vázlat: foobar\r\nFundo: foobar\r\nGeçmiş: foobar\r\nghantoH: foobar\r\nGrundlage: foobar\r\nHannergrond: foobar\r\nHáttér: foobar\r\nHeave to: foobar\r\nIstorik: foobar\r\nJuhtumid: foobar\r\nKeadaan: foobar\r\nKhung kịch bản: foobar\r\nKhung tình huống: foobar\r\nKịch bản: foobar\r\nKoncept: foobar\r\nKonsep skenario: foobar\r\nKontèks: foobar\r\nKontekst: foobar\r\nKontekstas: foobar\r\nKonteksts: foobar\r\nKontext: foobar\r\nKonturo de la scenaro: foobar\r\nLatar Belakang: foobar\r\nlut: foobar\r\nlut chovnatlh: foobar\r\nlutmey: foobar\r\nLýsing Atburðarásar: foobar\r\nLýsing Dæma: foobar\r\nMenggariskan Senario: foobar\r\nMISHUN: foobar\r\nMISHUN SRSLY: foobar\r\nmo': foobar\r\nNáčrt Scenára: foobar\r\nNáčrt Scénáře: foobar\r\nNáčrt Scenáru: foobar\r\nOris scenarija: foobar\r\nÖrnekler: foobar\r\nOsnova: foobar\r\nOsnova Scenára: foobar\r\nOsnova scénáře: foobar\r\nOsnutek: foobar\r\nOzadje: foobar\r\nParaugs: foobar\r\nPavyzdžiai: foobar\r\nPéldák: foobar\r\nPiemēri: foobar\r\nPlan du scénario: foobar\r\nPlan du Scénario: foobar\r\nPlan senaryo: foobar\r\nPlan Senaryo: foobar\r\nPlang vum Szenario: foobar\r\nPozadí: foobar\r\nPozadie: foobar\r\nPozadina: foobar\r\nPríklady: foobar\r\nPříklady: foobar\r\nPrimer: foobar\r\nPrimeri: foobar\r\nPrimjeri: foobar\r\nPrzykłady: foobar\r\nRaamstsenaarium: foobar\r\nReckon it's like: foobar\r\nRerefons: foobar\r\nScenár: foobar\r\nScénář: foobar\r\nScenarie: foobar\r\nScenarij: foobar\r\nScenarijai: foobar\r\nScenarijaus šablonas: foobar\r\nScenariji: foobar\r\nScenārijs: foobar\r\nScenārijs pēc parauga: foobar\r\nScenarijus: foobar\r\nScenario: foobar\r\nScénario: foobar\r\nScenario Amlinellol: foobar\r\nScenario Outline: foobar\r\nScenario Template: foobar\r\nScenariomal: foobar\r\nScenariomall: foobar\r\nScenarios: foobar\r\nScenariu: foobar\r\nScenariusz: foobar\r\nScenaro: foobar\r\nSchema dello scenario: foobar\r\nSe ðe: foobar\r\nSe the: foobar\r\nSe þe: foobar\r\nSenario: foobar\r\nSenaryo: foobar\r\nSenaryo deskripsyon: foobar\r\nSenaryo Deskripsyon: foobar\r\nSenaryo taslağı: foobar\r\nShiver me timbers: foobar\r\nSituācija: foobar\r\nSituai: foobar\r\nSituasie: foobar\r\nSituasie Uiteensetting: foobar\r\nSkenario: foobar\r\nSkenario konsep: foobar\r\nSkica: foobar\r\nStructura scenariu: foobar\r\nStructură scenariu: foobar\r\nStruktura scenarija: foobar\r\nStsenaarium: foobar\r\nSwa: foobar\r\nSwa hwaer swa: foobar\r\nSwa hwær swa: foobar\r\nSzablon scenariusza: foobar\r\nSzenario: foobar\r\nSzenariogrundriss: foobar\r\nTapaukset: foobar\r\nTapaus: foobar\r\nTapausaihio: foobar\r\nTaust: foobar\r\nTausta: foobar\r\nTemplate Keadaan: foobar\r\nTemplate Senario: foobar\r\nTemplate Situai: foobar\r\nThe thing of it is: foobar\r\nTình huống: foobar\r\nVariantai: foobar\r\nVoorbeelde: foobar\r\nVoorbeelden: foobar\r\nWharrimean is: foobar\r\nYo-ho-ho: foobar\r\nYou'll wanna: foobar\r\nZałożenia: foobar\r\nΠαραδείγματα: foobar\r\nΠεριγραφή Σεναρίου: foobar\r\nΣενάρια: foobar\r\nΣενάριο: foobar\r\nΥπόβαθρο: foobar\r\nКереш: foobar\r\nКонтекст: foobar\r\nКонцепт: foobar\r\nМисаллар: foobar\r\nМисоллар: foobar\r\nОснова: foobar\r\nПередумова: foobar\r\nПозадина: foobar\r\nПредистория: foobar\r\nПредыстория: foobar\r\nПриклади: foobar\r\nПример: foobar\r\nПримери: foobar\r\nПримеры: foobar\r\nРамка на сценарий: foobar\r\nСкица: foobar\r\nСтруктура сценарија: foobar\r\nСтруктура сценария: foobar\r\nСтруктура сценарію: foobar\r\nСценарий: foobar\r\nСценарий структураси: foobar\r\nСценарийның төзелеше: foobar\r\nСценарији: foobar\r\nСценарио: foobar\r\nСценарій: foobar\r\nТарих: foobar\r\nҮрнәкләр: foobar\r\nדוגמאות: foobar\r\nרקע: foobar\r\nתבנית תרחיש: foobar\r\nתרחיש: foobar\r\nالخلفية: foobar\r\nالگوی سناریو: foobar\r\nامثلة: foobar\r\nپس منظر: foobar\r\nزمینه: foobar\r\nسناریو: foobar\r\nسيناريو: foobar\r\nسيناريو مخطط: foobar\r\nمثالیں: foobar\r\nمنظر نامے کا خاکہ: foobar\r\nمنظرنامہ: foobar\r\nنمونه ها: foobar\r\nउदाहरण: foobar\r\nपरिदृश्य: foobar\r\nपरिदृश्य रूपरेखा: foobar\r\nपृष्ठभूमि: foobar\r\nਉਦਾਹਰਨਾਂ: foobar\r\nਪਟਕਥਾ: foobar\r\nਪਟਕਥਾ ਢਾਂਚਾ: foobar\r\nਪਟਕਥਾ ਰੂਪ ਰੇਖਾ: foobar\r\nਪਿਛੋਕੜ: foobar\r\nఉదాహరణలు: foobar\r\nకథనం: foobar\r\nనేపథ్యం: foobar\r\nసన్నివేశం: foobar\r\nಉದಾಹರಣೆಗಳು: foobar\r\nಕಥಾಸಾರಾಂಶ: foobar\r\nವಿವರಣೆ: foobar\r\nಹಿನ್ನೆಲೆ: foobar\r\nโครงสร้างของเหตุการณ์: foobar\r\nชุดของตัวอย่าง: foobar\r\nชุดของเหตุการณ์: foobar\r\nแนวคิด: foobar\r\nสรุปเหตุการณ์: foobar\r\nเหตุการณ์: foobar\r\n배경: foobar\r\n시나리오: foobar\r\n시나리오 개요: foobar\r\n예: foobar\r\nサンプル: foobar\r\nシナリオ: foobar\r\nシナリオアウトライン: foobar\r\nシナリオテンプレ: foobar\r\nシナリオテンプレート: foobar\r\nテンプレ: foobar\r\n例: foobar\r\n例子: foobar\r\n剧本: foobar\r\n剧本大纲: foobar\r\n劇本: foobar\r\n劇本大綱: foobar\r\n场景: foobar\r\n场景大纲: foobar\r\n場景: foobar\r\n場景大綱: foobar\r\n背景: foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"scenario\", [[\"keyword\", \"Abstract Scenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Abstrakt Scenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Achtergrond:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Aer:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Ær:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Agtergrond:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"All y'all:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Antecedentes:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Antecedents:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Atburðarás:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Atburðarásir:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Awww, look mate:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"B4:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Background:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Baggrund:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Bakgrund:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Bakgrunn:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Bakgrunnur:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Beispiele:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Beispiller:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Bối cảnh:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Cefndir:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Cenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Cenário:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Cenario de Fundo:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Cenário de Fundo:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Cenarios:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Cenários:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Contesto:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Context:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Contexte:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Contexto:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Conto:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Contoh:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Contone:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Dæmi:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Dasar:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Dead men tell no tales:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Delineacao do Cenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Delineação do Cenário:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Dis is what went down:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Dữ liệu:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Dyagram senaryo:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Dyagram Senaryo:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Egzanp:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Ejemplos:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Eksempler:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Ekzemploj:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Enghreifftiau:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Esbozo do escenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Escenari:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Escenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Esempi:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Esquema de l'escenari:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Esquema del escenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Esquema do Cenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Esquema do Cenário:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Examples:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"EXAMPLZ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Exempel:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Exemple:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Exemples:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Exemplos:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"First off:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Fono:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Forgatókönyv:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Forgatókönyv vázlat:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Fundo:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Geçmiş:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ghantoH:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Grundlage:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Hannergrond:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Háttér:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Heave to:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Istorik:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Juhtumid:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Keadaan:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Khung kịch bản:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Khung tình huống:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Kịch bản:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Koncept:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Konsep skenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Kontèks:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Kontekst:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Kontekstas:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Konteksts:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Kontext:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Konturo de la scenaro:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Latar Belakang:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"lut:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"lut chovnatlh:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"lutmey:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Lýsing Atburðarásar:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Lýsing Dæma:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Menggariskan Senario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"MISHUN:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"MISHUN SRSLY:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"mo':\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Náčrt Scenára:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Náčrt Scénáře:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Náčrt Scenáru:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Oris scenarija:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Örnekler:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Osnova:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Osnova Scenára:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Osnova scénáře:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Osnutek:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Ozadje:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Paraugs:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Pavyzdžiai:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Példák:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Piemēri:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Plan du scénario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Plan du Scénario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Plan senaryo:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Plan Senaryo:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Plang vum Szenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Pozadí:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Pozadie:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Pozadina:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Príklady:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Příklady:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Primer:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Primeri:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Primjeri:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Przykłady:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Raamstsenaarium:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Reckon it's like:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Rerefons:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenár:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scénář:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenarie:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenarij:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenarijai:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenarijaus šablonas:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenariji:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenārijs:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenārijs pēc parauga:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenarijus:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scénario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenario Amlinellol:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenario Outline:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenario Template:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenariomal:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenariomall:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenarios:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenariu:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenariusz:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Scenaro:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Schema dello scenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Se ðe:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Se the:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Se þe:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Senario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Senaryo:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Senaryo deskripsyon:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Senaryo Deskripsyon:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Senaryo taslağı:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Shiver me timbers:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Situācija:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Situai:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Situasie:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Situasie Uiteensetting:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Skenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Skenario konsep:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Skica:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Structura scenariu:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Structură scenariu:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Struktura scenarija:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Stsenaarium:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Swa:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Swa hwaer swa:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Swa hwær swa:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Szablon scenariusza:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Szenario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Szenariogrundriss:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Tapaukset:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Tapaus:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Tapausaihio:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Taust:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Tausta:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Template Keadaan:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Template Senario:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Template Situai:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"The thing of it is:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Tình huống:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Variantai:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Voorbeelde:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Voorbeelden:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Wharrimean is:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Yo-ho-ho:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"You'll wanna:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Założenia:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Παραδείγματα:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Περιγραφή Σεναρίου:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Σενάρια:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Σενάριο:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Υπόβαθρο:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Кереш:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Контекст:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Концепт:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Мисаллар:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Мисоллар:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Основа:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Передумова:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Позадина:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Предистория:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Предыстория:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Приклади:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Пример:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Примери:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Примеры:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Рамка на сценарий:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Скица:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Структура сценарија:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Структура сценария:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Структура сценарію:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Сценарий:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Сценарий структураси:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Сценарийның төзелеше:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Сценарији:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Сценарио:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Сценарій:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Тарих:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"Үрнәкләр:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"דוגמאות:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"רקע:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"תבנית תרחיש:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"תרחיש:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"الخلفية:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"الگوی سناریو:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"امثلة:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"پس منظر:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"زمینه:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"سناریو:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"سيناريو:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"سيناريو مخطط:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"مثالیں:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"منظر نامے کا خاکہ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"منظرنامہ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"نمونه ها:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"उदाहरण:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"परिदृश्य:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"परिदृश्य रूपरेखा:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"पृष्ठभूमि:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ਉਦਾਹਰਨਾਂ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ਪਟਕਥਾ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ਪਟਕਥਾ ਢਾਂਚਾ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ਪਿਛੋਕੜ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ఉదాహరణలు:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"కథనం:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"నేపథ్యం:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"సన్నివేశం:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ಉದಾಹರಣೆಗಳು:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ಕಥಾಸಾರಾಂಶ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ವಿವರಣೆ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ಹಿನ್ನೆಲೆ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"โครงสร้างของเหตุการณ์:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ชุดของตัวอย่าง:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"ชุดของเหตุการณ์:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"แนวคิด:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"สรุปเหตุการณ์:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"เหตุการณ์:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"배경:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"시나리오:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"시나리오 개요:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"예:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"サンプル:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"シナリオ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"シナリオアウトライン:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"シナリオテンプレ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"シナリオテンプレート:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"テンプレ:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"例:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"例子:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"剧本:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"剧本大纲:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"劇本:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"劇本大綱:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"场景:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"场景大纲:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"場景:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"場景大綱:\"], [\"important\", \" foobar\"]]],\r\n\t[\"scenario\", [[\"keyword\", \"背景:\"], [\"important\", \" foobar\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for scenarios in all languages."
  },
  {
    "path": "tests/languages/gherkin/string_feature.test",
    "content": "\"\"\r\n\"foobar\"\r\n\"foo<bar>baz\"\r\n''\r\n'foobar'\r\n'foo<bar>baz'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"\\\"\"]],\r\n\t[\"string\", [\"\\\"foobar\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"\\\"foo\",\r\n\t\t[\"outline\", \"<bar>\"],\r\n\t\t\"baz\\\"\"\r\n\t]],\r\n\t[\"string\", [\"''\"]],\r\n\t[\"string\", [\"'foobar'\"]],\r\n\t[\"string\", [\r\n        \"'foo\",\r\n        [\"outline\", \"<bar>\"],\r\n        \"baz'\"\r\n    ]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for double-quoted and single-quoted strings."
  },
  {
    "path": "tests/languages/gherkin/table_feature.test",
    "content": "Examples: foo\r\n| start  | eat | left |\r\n|  <foo> |  5  |  7   |\r\n\t|  20    |  5  |  15  |\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"scenario\", [[\"keyword\", \"Examples:\"], [\"important\", \" foo\"]]],\r\n\t[\"table-head\", [\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"th\", \" start  \"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"th\", \" eat \"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"th\", \" left \"],\r\n\t\t[\"punctuation\", \"|\"]\r\n\t]],\r\n\t[\"table-body\", [\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"outline\", \"<foo>\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"td\", \"  5  \"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"td\", \"  7   \"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"td\", \"  20    \"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"td\", \"  5  \"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"td\", \"  15  \"],\r\n\t\t[\"punctuation\", \"|\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for table heads and table bodies.\r\n"
  },
  {
    "path": "tests/languages/gherkin/tag_feature.test",
    "content": "@important\r\n@billing @bicker @annoy\r\n\t@foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", \"@important\"],\r\n\t[\"tag\", \"@billing\"],\r\n\t[\"tag\", \"@bicker\"],\r\n\t[\"tag\", \"@annoy\"],\r\n\t[\"tag\", \"@foo\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags."
  },
  {
    "path": "tests/languages/git/command_feature.test",
    "content": "$ git add file.txt\r\nfoo@foobar ~ $ git diff --cached\r\n$ git log -p -i\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"command\", [\"$ git add file.txt\"]],\r\n\t[\"command\", [\"foo@foobar ~ $ git diff\", [\"parameter\", \" --cached\"]]],\r\n\t[\"command\", [\"$ git log\", [\"parameter\", \" -p\"], [\"parameter\", \" -i\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for git commands, with and without parameters."
  },
  {
    "path": "tests/languages/git/comment_feature.test",
    "content": "# On branch gh-pages\r\n# Changes to be committed:\r\n#   (use \"git reset HEAD <file>...\" to unstage)\r\n#\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"# On branch gh-pages\"],\r\n\t[\"comment\", \"# Changes to be committed:\"],\r\n\t[\"comment\", \"#   (use \\\"git reset HEAD <file>...\\\" to unstage)\"],\r\n\t[\"comment\", \"#\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/git/commit-sha1_feature.test",
    "content": "commit a11a14ef7e26f2ca62d4b35eac455ce636d0dc09\r\ncommit 87edc4ad8c71b95f6e46f736eb98b742859abd95\r\ncommit 3102416a90c431400d2e2a14e707fb7fd6d9e06d\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"commit-sha1\", \"commit a11a14ef7e26f2ca62d4b35eac455ce636d0dc09\"],\r\n\t[\"commit-sha1\", \"commit 87edc4ad8c71b95f6e46f736eb98b742859abd95\"],\r\n\t[\"commit-sha1\", \"commit 3102416a90c431400d2e2a14e707fb7fd6d9e06d\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for commit SHA1.\r\n"
  },
  {
    "path": "tests/languages/git/coord_feature.test",
    "content": "@@ -1 +1,2 @@\r\n@@@ -98,20 -98,12 +98,20 @@@\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"coord\", \"@@ -1 +1,2 @@\"],\r\n\t[\"coord\", \"@@@ -98,20 -98,12 +98,20 @@@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for coords."
  },
  {
    "path": "tests/languages/git/diff_feature.test",
    "content": "-Here's my tetx file\r\n+Here's my text file\r\n+And this is the second line\r\n\r\n––– a/web/js/lazy.js\r\n+++ b/web/js/lazy.js\r\n\r\n-      if (url !== null && url !== '' && typeof url !== 'undefined') {\r\n+      if (url === null || url === '' || typeof url === 'undefined') {\r\n+        return;\r\n+      }\r\n+\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"deleted\", \"-Here's my tetx file\"],\r\n\t[\"inserted\", \"+Here's my text file\"],\r\n\t[\"inserted\", \"+And this is the second line\"],\r\n\t[\"deleted\", \"––– a/web/js/lazy.js\"],\r\n\t[\"inserted\", \"+++ b/web/js/lazy.js\"],\r\n\t[\"deleted\", \"-      if (url !== null && url !== '' && typeof url !== 'undefined') {\"],\r\n\t[\"inserted\", \"+      if (url === null || url === '' || typeof url === 'undefined') {\"],\r\n\t[\"inserted\", \"+        return;\"],\r\n\t[\"inserted\", \"+      }\"],\r\n\t[\"inserted\", \"+\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for inserted and deleted lines in git diff output."
  },
  {
    "path": "tests/languages/git/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n''\r\n'bar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'bar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for double-quoted and single-quoted strings."
  },
  {
    "path": "tests/languages/glsl/comment_feature.test",
    "content": "/**/\r\n/* foo\r\nbar */\r\n//\r\n// foo\r\n// foo\\\r\nbar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foo\"],\r\n\t[\"comment\", \"// foo\\\\\\r\\nbar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/glsl/keyword_feature.test",
    "content": "attribute\r\nconst\r\nuniform\r\nvarying\r\nbuffer\r\nshared\r\ncoherent\r\nvolatile\r\nrestrict\r\nreadonly\r\nwriteonly\r\natomic_uint\r\nlayout\r\ncentroid\r\nflat\r\nsmooth\r\nnoperspective\r\npatch\r\nsample\r\nbreak\r\ncontinue\r\ndo\r\nfor\r\nwhile\r\nswitch\r\ncase\r\ndefault\r\nif\r\nelse\r\nsubroutine\r\nin\r\nout\r\ninout\r\nfloat\r\ndouble\r\nint\r\nvoid\r\nbool\r\ntrue\r\nfalse\r\ninvariant\r\nprecise\r\ndiscard\r\nreturn\r\nmat2 mat3 mat4\r\nmat2x2 mat2x3 mat2x4\r\nmat3x2 mat3x3 mat3x4\r\nmat4x2 mat4x3 mat4x4\r\ndmat2 dmat3 dmat4\r\ndmat2x2 dmat2x3 dmat2x4\r\ndmat3x2 dmat3x3 dmat3x4\r\ndmat4x2 dmat4x3 dmat4x4\r\nvec2 vec3 vec4\r\nivec2 ivec3 ivec4\r\nbvec2 bvec3 bvec4\r\ndvec2 dvec3 dvec4\r\nuvec2 uvec3 uvec4\r\nuint\r\nlowp\r\nmediump\r\nhighp\r\nprecision\r\nsampler1D sampler2D sampler3D\r\nisampler1D isampler2D isampler3D\r\nusampler1D usampler2D usampler3D\r\nsamplerCube isamplerCube usamplerCube\r\nsampler1DShadow sampler2DShadow\r\nsamplerCubeShadow\r\nsampler1DArray sampler2DArray\r\nisampler1DArray isampler2DArray\r\nusampler1DArray usampler2DArray\r\nsampler1DArrayShadow sampler2DArrayShadow\r\nsampler2DRect isampler2DRect usampler2DRect\r\nsampler2DRectShadow\r\nsamplerBuffer isamplerBuffer usamplerBuffer\r\nsampler2DMS isampler2DMS usampler2DMS\r\nsampler2DMSArray isampler2DMSArray usampler2DMSArray\r\nsamplerCubeArray isamplerCubeArray usamplerCubeArray\r\nsamplerCubeArrayShadow\r\nimage1D image2D image3D\r\niimage1D iimage2D iimage3D\r\nuimage1D uimage2D uimage3D\r\nimage2DRect iimage2DRect uimage2DRect\r\nimageCube iimageCube uimageCube\r\nimageBuffer iimageBuffer uimageBuffer\r\nimage1DArray image2DArray\r\niimage1DArray iimage2DArray\r\nuimage1DArray uimage2DArray\r\nimageCubeArray iimageCubeArray uimageCubeArray\r\nimage2DMS iimage2DMS uimage2DMS\r\nimage2DMSArray iimage2DMSArray uimage2DMSArray\r\nstruct;\r\ncommon\r\npartition\r\nactive\r\nasm\r\nclass;\r\nunion\r\nenum;\r\ntypedef;\r\ntemplate\r\nthis\r\nresource\r\ngoto\r\ninline\r\nnoinline\r\npublic\r\nstatic\r\nextern\r\nexternal\r\ninterface;\r\nlong\r\nshort\r\nhalf\r\nfixed\r\nunsigned\r\nsuperp\r\ninput\r\noutput\r\nhvec2 hvec3 hvec4\r\nfvec2 fvec3 fvec4\r\nsampler3DRect\r\nfilter\r\nsizeof\r\ncast\r\nnamespace\r\nusing\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"attribute\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"uniform\"],\r\n\t[\"keyword\", \"varying\"],\r\n\t[\"keyword\", \"buffer\"],\r\n\t[\"keyword\", \"shared\"],\r\n\t[\"keyword\", \"coherent\"],\r\n\t[\"keyword\", \"volatile\"],\r\n\t[\"keyword\", \"restrict\"],\r\n\t[\"keyword\", \"readonly\"],\r\n\t[\"keyword\", \"writeonly\"],\r\n\t[\"keyword\", \"atomic_uint\"],\r\n\t[\"keyword\", \"layout\"],\r\n\t[\"keyword\", \"centroid\"],\r\n\t[\"keyword\", \"flat\"],\r\n\t[\"keyword\", \"smooth\"],\r\n\t[\"keyword\", \"noperspective\"],\r\n\t[\"keyword\", \"patch\"],\r\n\t[\"keyword\", \"sample\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"subroutine\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"out\"],\r\n\t[\"keyword\", \"inout\"],\r\n\t[\"keyword\", \"float\"],\r\n\t[\"keyword\", \"double\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"keyword\", \"bool\"],\r\n\t[\"keyword\", \"true\"],\r\n\t[\"keyword\", \"false\"],\r\n\t[\"keyword\", \"invariant\"],\r\n\t[\"keyword\", \"precise\"],\r\n\t[\"keyword\", \"discard\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"mat2\"], [\"keyword\", \"mat3\"], [\"keyword\", \"mat4\"],\r\n\t[\"keyword\", \"mat2x2\"], [\"keyword\", \"mat2x3\"], [\"keyword\", \"mat2x4\"],\r\n\t[\"keyword\", \"mat3x2\"], [\"keyword\", \"mat3x3\"], [\"keyword\", \"mat3x4\"],\r\n\t[\"keyword\", \"mat4x2\"], [\"keyword\", \"mat4x3\"], [\"keyword\", \"mat4x4\"],\r\n\t[\"keyword\", \"dmat2\"], [\"keyword\", \"dmat3\"], [\"keyword\", \"dmat4\"],\r\n\t[\"keyword\", \"dmat2x2\"], [\"keyword\", \"dmat2x3\"], [\"keyword\", \"dmat2x4\"],\r\n\t[\"keyword\", \"dmat3x2\"], [\"keyword\", \"dmat3x3\"], [\"keyword\", \"dmat3x4\"],\r\n\t[\"keyword\", \"dmat4x2\"], [\"keyword\", \"dmat4x3\"], [\"keyword\", \"dmat4x4\"],\r\n\t[\"keyword\", \"vec2\"], [\"keyword\", \"vec3\"], [\"keyword\", \"vec4\"],\r\n\t[\"keyword\", \"ivec2\"], [\"keyword\", \"ivec3\"], [\"keyword\", \"ivec4\"],\r\n\t[\"keyword\", \"bvec2\"], [\"keyword\", \"bvec3\"], [\"keyword\", \"bvec4\"],\r\n\t[\"keyword\", \"dvec2\"], [\"keyword\", \"dvec3\"], [\"keyword\", \"dvec4\"],\r\n\t[\"keyword\", \"uvec2\"], [\"keyword\", \"uvec3\"], [\"keyword\", \"uvec4\"],\r\n\t[\"keyword\", \"uint\"],\r\n\t[\"keyword\", \"lowp\"],\r\n\t[\"keyword\", \"mediump\"],\r\n\t[\"keyword\", \"highp\"],\r\n\t[\"keyword\", \"precision\"],\r\n\t[\"keyword\", \"sampler1D\"], [\"keyword\", \"sampler2D\"], [\"keyword\", \"sampler3D\"],\r\n\t[\"keyword\", \"isampler1D\"], [\"keyword\", \"isampler2D\"], [\"keyword\", \"isampler3D\"],\r\n\t[\"keyword\", \"usampler1D\"], [\"keyword\", \"usampler2D\"], [\"keyword\", \"usampler3D\"],\r\n\t[\"keyword\", \"samplerCube\"], [\"keyword\", \"isamplerCube\"], [\"keyword\", \"usamplerCube\"],\r\n\t[\"keyword\", \"sampler1DShadow\"], [\"keyword\", \"sampler2DShadow\"],\r\n\t[\"keyword\", \"samplerCubeShadow\"],\r\n\t[\"keyword\", \"sampler1DArray\"], [\"keyword\", \"sampler2DArray\"],\r\n\t[\"keyword\", \"isampler1DArray\"], [\"keyword\", \"isampler2DArray\"],\r\n\t[\"keyword\", \"usampler1DArray\"], [\"keyword\", \"usampler2DArray\"],\r\n\t[\"keyword\", \"sampler1DArrayShadow\"], [\"keyword\", \"sampler2DArrayShadow\"],\r\n\t[\"keyword\", \"sampler2DRect\"], [\"keyword\", \"isampler2DRect\"], [\"keyword\", \"usampler2DRect\"],\r\n\t[\"keyword\", \"sampler2DRectShadow\"],\r\n\t[\"keyword\", \"samplerBuffer\"], [\"keyword\", \"isamplerBuffer\"], [\"keyword\", \"usamplerBuffer\"],\r\n\t[\"keyword\", \"sampler2DMS\"], [\"keyword\", \"isampler2DMS\"], [\"keyword\", \"usampler2DMS\"],\r\n\t[\"keyword\", \"sampler2DMSArray\"], [\"keyword\", \"isampler2DMSArray\"], [\"keyword\", \"usampler2DMSArray\"],\r\n\t[\"keyword\", \"samplerCubeArray\"], [\"keyword\", \"isamplerCubeArray\"], [\"keyword\", \"usamplerCubeArray\"],\r\n\t[\"keyword\", \"samplerCubeArrayShadow\"],\r\n\t[\"keyword\", \"image1D\"], [\"keyword\", \"image2D\"], [\"keyword\", \"image3D\"],\r\n\t[\"keyword\", \"iimage1D\"], [\"keyword\", \"iimage2D\"], [\"keyword\", \"iimage3D\"],\r\n\t[\"keyword\", \"uimage1D\"], [\"keyword\", \"uimage2D\"], [\"keyword\", \"uimage3D\"],\r\n\t[\"keyword\", \"image2DRect\"], [\"keyword\", \"iimage2DRect\"], [\"keyword\", \"uimage2DRect\"],\r\n\t[\"keyword\", \"imageCube\"], [\"keyword\", \"iimageCube\"], [\"keyword\", \"uimageCube\"],\r\n\t[\"keyword\", \"imageBuffer\"], [\"keyword\", \"iimageBuffer\"], [\"keyword\", \"uimageBuffer\"],\r\n\t[\"keyword\", \"image1DArray\"], [\"keyword\", \"image2DArray\"],\r\n\t[\"keyword\", \"iimage1DArray\"], [\"keyword\", \"iimage2DArray\"],\r\n\t[\"keyword\", \"uimage1DArray\"], [\"keyword\", \"uimage2DArray\"],\r\n\t[\"keyword\", \"imageCubeArray\"], [\"keyword\", \"iimageCubeArray\"], [\"keyword\", \"uimageCubeArray\"],\r\n\t[\"keyword\", \"image2DMS\"], [\"keyword\", \"iimage2DMS\"], [\"keyword\", \"uimage2DMS\"],\r\n\t[\"keyword\", \"image2DMSArray\"], [\"keyword\", \"iimage2DMSArray\"], [\"keyword\", \"uimage2DMSArray\"],\r\n\t[\"keyword\", \"struct\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"common\"],\r\n\t[\"keyword\", \"partition\"],\r\n\t[\"keyword\", \"active\"],\r\n\t[\"keyword\", \"asm\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"union\"],\r\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"typedef\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"template\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"resource\"],\r\n\t[\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"inline\"],\r\n\t[\"keyword\", \"noinline\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"external\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"long\"],\r\n\t[\"keyword\", \"short\"],\r\n\t[\"keyword\", \"half\"],\r\n\t[\"keyword\", \"fixed\"],\r\n\t[\"keyword\", \"unsigned\"],\r\n\t[\"keyword\", \"superp\"],\r\n\t[\"keyword\", \"input\"],\r\n\t[\"keyword\", \"output\"],\r\n\t[\"keyword\", \"hvec2\"], [\"keyword\", \"hvec3\"], [\"keyword\", \"hvec4\"],\r\n\t[\"keyword\", \"fvec2\"], [\"keyword\", \"fvec3\"], [\"keyword\", \"fvec4\"],\r\n\t[\"keyword\", \"sampler3DRect\"],\r\n\t[\"keyword\", \"filter\"],\r\n\t[\"keyword\", \"sizeof\"],\r\n\t[\"keyword\", \"cast\"],\r\n\t[\"keyword\", \"namespace\"],\r\n\t[\"keyword\", \"using\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/glsl/macro_feature.test",
    "content": "#define\r\n#undef\r\n#if\r\n#ifdef\r\n#ifndef\r\n#else\r\n#elif\r\n#endif\r\n#error\r\n#pragma\r\n#extension\r\n#version\r\n#line\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"define\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"undef\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"if\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"ifdef\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"ifndef\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"else\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"elif\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"endif\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"error\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"pragma\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"extension\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"version\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive-hash\", \"#\"],\r\n\t\t[\"directive\", \"line\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for preprocessor instructions.\r\n"
  },
  {
    "path": "tests/languages/glsl/number_feature.test",
    "content": "0xBadFace\r\n42\r\n3.14159\r\n3e8\r\n3.6e-7\r\n4.7E+12\r\n4u\r\n42U\r\n3.1l\r\n42f\r\n2.0LF\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3e8\"],\r\n\t[\"number\", \"3.6e-7\"],\r\n\t[\"number\", \"4.7E+12\"],\r\n\t[\"number\", \"4u\"],\r\n\t[\"number\", \"42U\"],\r\n\t[\"number\", \"3.1l\"],\r\n\t[\"number\", \"42f\"],\r\n\t[\"number\", \"2.0LF\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/gml/function_feature.test",
    "content": "buff = buffer_create(16384, buffer_grow, 2);\nini_open(\"Save.ini\");\nvar str = ini_read_string(\"Save\", \"Slot1\", \"\");\nbuffer_base64_decode_ext(buff, str, 0);\nini_close();\n\n----------------------------------------------------\n\n[\n\t\"buff \",\n\t[\"operator\", \"=\"],\n\t[\"function\", \"buffer_create\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"16384\"],\n\t[\"punctuation\", \",\"],\n\t[\"constant\", \"buffer_grow\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"ini_open\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Save.ini\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"var\"],\n\t\" str \",\n\t[\"operator\", \"=\"],\n\t[\"function\", \"ini_read_string\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Save\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"Slot1\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"buffer_base64_decode_ext\"],\n\t[\"punctuation\", \"(\"],\n\t\"buff\",\n\t[\"punctuation\", \",\"],\n\t\" str\",\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"ini_close\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/gml/keyword_feature.test",
    "content": "if\nelse\nswitch\ncase\ndefault\nbreak\nfor\nrepeat\nwhile\ndo\nuntil\ncontinue\nexit\nreturn\nglobalvar\nvar\nenum\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"switch\"],\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"default\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"repeat\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"do\"],\n\t[\"keyword\", \"until\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"exit\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"globalvar\"],\n\t[\"keyword\", \"var\"],\n\t[\"keyword\", \"enum\"]\n]\n"
  },
  {
    "path": "tests/languages/gml/number_feature.test",
    "content": "0\n123\n123.456\n123.\n.456\n1e5\n1.2e-5f\n\n0xFF\n0xFFul\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"123\"],\n\t[\"number\", \"123.456\"],\n\t[\"number\", \"123.\"],\n\t[\"number\", \".456\"],\n\t[\"number\", \"1e5\"],\n\t[\"number\", \"1.2e-5f\"],\n\n\t[\"number\", \"0xFF\"],\n\t[\"number\", \"0xFFul\"]\n]\n"
  },
  {
    "path": "tests/languages/gml/operator_feature.test",
    "content": "+  -  %  *  **  /\n+= -= %= *= **= /=\n>> << ++ --\n\n=\n== != <>\n< <= => >\n\n& | ^ ~\n&& || ^^\n\nor\nand\nnot\nwith\nat\nxor\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"**\"],\n\t[\"operator\", \"/\"],\n\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"%=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"**=\"],\n\t[\"operator\", \"/=\"],\n\n\t[\"operator\", \">>\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \"++\"],\n\t[\"operator\", \"--\"],\n\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<>\"],\n\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">\"],\n\n\t[\"operator\", \"&\"], [\"operator\", \"|\"], [\"operator\", \"^\"], [\"operator\", \"~\"],\n\t[\"operator\", \"&&\"], [\"operator\", \"||\"], [\"operator\", \"^^\"],\n\n\t[\"operator\", \"or\"],\n\t[\"operator\", \"and\"],\n\t[\"operator\", \"not\"],\n\t[\"operator\", \"with\"],\n\t[\"operator\", \"at\"],\n\t[\"operator\", \"xor\"]\n]\n"
  },
  {
    "path": "tests/languages/gml/variable_feature.test",
    "content": "if browser_height > window_get_height() || browser_width > window_get_width()\n\t{\n\tvar xx, yy;\n\tif browser_width > window_get_width()\n\t\t{\n\t\txx = (browser_width - window_get_width()) / 2;\n\t\t}\n\telse\n\t\t{\n\t\txx = 0;\n\t\t}\n\tif browser_height > window_get_height()\n\t\t{\n\t\tyy = (browser_height - window_get_height()) / 2;\n\t\t}\n\telse\n\t\t{\n\t\tyy = 0;\n\t\t}\n\twindow_set_position(xx, yy);\n\t}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"if\"],\n\t[\"variable\", \"browser_height\"],\n\t[\"operator\", \">\"],\n\t[\"function\", \"window_get_height\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"||\"],\n\t[\"variable\", \"browser_width\"],\n\t[\"operator\", \">\"],\n\t[\"function\", \"window_get_width\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"var\"],\n\t\" xx\",\n\t[\"punctuation\", \",\"],\n\t\" yy\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"if\"],\n\t[\"variable\", \"browser_width\"],\n\t[\"operator\", \">\"],\n\t[\"function\", \"window_get_width\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n\\t\\txx \",\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"browser_width\"],\n\t[\"operator\", \"-\"],\n\t[\"function\", \"window_get_width\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"/\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"else\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n\\t\\txx \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"if\"],\n\t[\"variable\", \"browser_height\"],\n\t[\"operator\", \">\"],\n\t[\"function\", \"window_get_height\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n\\t\\tyy \",\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"browser_height\"],\n\t[\"operator\", \"-\"],\n\t[\"function\", \"window_get_height\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"/\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"else\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n\\t\\tyy \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"function\", \"window_set_position\"],\n\t[\"punctuation\", \"(\"],\n\t\"xx\",\n\t[\"punctuation\", \",\"],\n\t\" yy\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/gn/boolean_feature.test",
    "content": "true false\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n"
  },
  {
    "path": "tests/languages/gn/builtin-function_feature.test",
    "content": "assert()\ndefined()\nforeach()\nimport()\npool()\nprint()\ntemplate()\ntool()\ntoolchain()\n\n----------------------------------------------------\n\n[\n\t[\"builtin-function\", \"assert\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"builtin-function\", \"defined\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"builtin-function\", \"foreach\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"builtin-function\", \"import\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"builtin-function\", \"pool\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"builtin-function\", \"print\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"builtin-function\", \"template\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"builtin-function\", \"tool\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"builtin-function\", \"toolchain\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/gn/comment_feature.test",
    "content": "# comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"# comment\"]\n]\n"
  },
  {
    "path": "tests/languages/gn/constant_feature.test",
    "content": "current_cpu\ncurrent_os\ncurrent_toolchain\ndefault_toolchain\nhost_cpu\nhost_os\nroot_build_dir\nroot_gen_dir\nroot_out_dir\ntarget_cpu\ntarget_gen_dir\ntarget_os\ntarget_out_dir\n\n----------------------------------------------------\n\n[\n\t[\"constant\", \"current_cpu\"],\n\t[\"constant\", \"current_os\"],\n\t[\"constant\", \"current_toolchain\"],\n\t[\"constant\", \"default_toolchain\"],\n\t[\"constant\", \"host_cpu\"],\n\t[\"constant\", \"host_os\"],\n\t[\"constant\", \"root_build_dir\"],\n\t[\"constant\", \"root_gen_dir\"],\n\t[\"constant\", \"root_out_dir\"],\n\t[\"constant\", \"target_cpu\"],\n\t[\"constant\", \"target_gen_dir\"],\n\t[\"constant\", \"target_os\"],\n\t[\"constant\", \"target_out_dir\"]\n]\n"
  },
  {
    "path": "tests/languages/gn/function_feature.test",
    "content": "foo()\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/gn/keyword_feature.test",
    "content": "if\nelse\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"else\"]\n]\n"
  },
  {
    "path": "tests/languages/gn/number_feature.test",
    "content": "0\n123\n-123\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"123\"],\n\t[\"number\", \"-123\"]\n]\n"
  },
  {
    "path": "tests/languages/gn/operator_feature.test",
    "content": "+ +=\n- -=\n== != < > <= =>\n! =\n&& ||\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"+=\"],\n\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"-=\"],\n\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \">\"],\n\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"]\n]\n"
  },
  {
    "path": "tests/languages/gn/punctuation_feature.test",
    "content": "( ) [ ] { }\n, .\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \".\"]\n]\n"
  },
  {
    "path": "tests/languages/gn/string_feature.test",
    "content": "\"\"\n\"foo\"\n\".$output_extension\"\n\"$0xFF\"\n\"$var_one/$var_two\"\n\"${var_one}\"\n\"$root_out_dir/lib${_output_name}${_shlib_extension}\"\n\n----------------------------------------------------\n\n[\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"foo\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\".\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"variable\", \"$output_extension\"]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"number\", \"$0xFF\"]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"variable\", \"$var_one\"]\n\t\t]],\n\t\t[\"string\", \"/\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"variable\", \"$var_two\"]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"${\"],\n\t\t\t[\"expression\", [\"var_one\"]],\n\t\t\t[\"interpolation-punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"variable\", \"$root_out_dir\"]\n\t\t]],\n\t\t[\"string\", \"/lib\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"${\"],\n\t\t\t[\"expression\", [\"_output_name\"]],\n\t\t\t[\"interpolation-punctuation\", \"}\"]\n\t\t]],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"${\"],\n\t\t\t[\"expression\", [\"_shlib_extension\"]],\n\t\t\t[\"interpolation-punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/go/boolean_feature.test",
    "content": "_\r\niota\r\nnil\r\ntrue\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"_\"],\r\n\t[\"boolean\", \"iota\"],\r\n\t[\"boolean\", \"nil\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all boolean values."
  },
  {
    "path": "tests/languages/go/builtin_feature.test",
    "content": "bool\r\nbyte\r\ncomplex64\r\ncomplex128\r\nerror\r\nfloat32\r\nfloat64\r\nrune\r\nstring\r\nint\r\nint8\r\nint16\r\nint32\r\nint64\r\nuint\r\nuint8\r\nuint16\r\nuint32\r\nuint64\r\nuintptr\r\nappend\r\ncap\r\nclose\r\ncomplex\r\ncopy\r\ndelete\r\nimag\r\nlen\r\nmake\r\nnew\r\npanic\r\nprint\r\nprintln\r\nreal\r\nrecover\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"bool\"],\r\n\t[\"builtin\", \"byte\"],\r\n\t[\"builtin\", \"complex64\"],\r\n\t[\"builtin\", \"complex128\"],\r\n\t[\"builtin\", \"error\"],\r\n\t[\"builtin\", \"float32\"],\r\n\t[\"builtin\", \"float64\"],\r\n\t[\"builtin\", \"rune\"],\r\n\t[\"builtin\", \"string\"],\r\n\t[\"builtin\", \"int\"],\r\n\t[\"builtin\", \"int8\"],\r\n\t[\"builtin\", \"int16\"],\r\n\t[\"builtin\", \"int32\"],\r\n\t[\"builtin\", \"int64\"],\r\n\t[\"builtin\", \"uint\"],\r\n\t[\"builtin\", \"uint8\"],\r\n\t[\"builtin\", \"uint16\"],\r\n\t[\"builtin\", \"uint32\"],\r\n\t[\"builtin\", \"uint64\"],\r\n\t[\"builtin\", \"uintptr\"],\r\n\t[\"builtin\", \"append\"],\r\n\t[\"builtin\", \"cap\"],\r\n\t[\"builtin\", \"close\"],\r\n\t[\"builtin\", \"complex\"],\r\n\t[\"builtin\", \"copy\"],\r\n\t[\"builtin\", \"delete\"],\r\n\t[\"builtin\", \"imag\"],\r\n\t[\"builtin\", \"len\"],\r\n\t[\"builtin\", \"make\"],\r\n\t[\"builtin\", \"new\"],\r\n\t[\"builtin\", \"panic\"],\r\n\t[\"builtin\", \"print\"],\r\n\t[\"builtin\", \"println\"],\r\n\t[\"builtin\", \"real\"],\r\n\t[\"builtin\", \"recover\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all builtins."
  },
  {
    "path": "tests/languages/go/char_feature.test",
    "content": "'a'\n'ä'\n'本'\n'\\t'\n'\\000'\n'\\007'\n'\\377'\n'\\x07'\n'\\xff'\n'\\u12e4'\n'\\U00101234'\n'\\''\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"],\n\t[\"char\", \"'ä'\"],\n\t[\"char\", \"'本'\"],\n\t[\"char\", \"'\\\\t'\"],\n\t[\"char\", \"'\\\\000'\"],\n\t[\"char\", \"'\\\\007'\"],\n\t[\"char\", \"'\\\\377'\"],\n\t[\"char\", \"'\\\\x07'\"],\n\t[\"char\", \"'\\\\xff'\"],\n\t[\"char\", \"'\\\\u12e4'\"],\n\t[\"char\", \"'\\\\U00101234'\"],\n\t[\"char\", \"'\\\\''\"]\n]\n"
  },
  {
    "path": "tests/languages/go/keyword_feature.test",
    "content": "break\r\ncase\r\nchan\r\nconst\r\ncontinue\r\ndefault\r\ndefer\r\nelse\r\nfallthrough\r\nfor\r\nfunc\r\ngo\r\ngoto\r\nif\r\nimport\r\ninterface\r\nmap\r\npackage\r\nrange\r\nreturn\r\nselect\r\nstruct\r\nswitch\r\ntype\r\nvar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"chan\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"defer\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"fallthrough\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"func\"],\r\n\t[\"keyword\", \"go\"],\r\n\t[\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"keyword\", \"map\"],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"range\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"select\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"var\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords"
  },
  {
    "path": "tests/languages/go/number_feature.test",
    "content": "42\r\n0600\r\n0xBadFace\r\n170141183460469231731687303715884105727\r\n42\r\n4_2\r\n0600\r\n0_600\r\n0o600\r\n0O600       // second character is capital letter 'O'\r\n0xBadFace\r\n0xBad_Face\r\n0x_67_7a_2f_cc_40_c6\r\n170141183460469231731687303715884105727\r\n170_141183_460469_231731_687303_715884_105727\r\n\r\n0.\r\n72.40\r\n072.40       // == 72.40\r\n2.71828\r\n1.e+0\r\n6.67428e-11\r\n1E6\r\n.25\r\n.12345E+5\r\n1_5.         // == 15.0\r\n0.15e+0_2    // == 15.0\r\n\r\n0x1p-2       // == 0.25\r\n0x2.p10      // == 2048.0\r\n0x1.Fp+0     // == 1.9375\r\n0X.8p-0      // == 0.5\r\n0X_1FFFP-16  // == 0.1249847412109375\r\n\r\n0i\r\n0123i         // == 123i for backward-compatibility\r\n0o123i        // == 0o123 * 1i == 83i\r\n0xabci        // == 0xabc * 1i == 2748i\r\n0.i\r\n2.71828i\r\n1.e+0i\r\n6.67428e-11i\r\n1E6i\r\n.25i\r\n.12345E+5i\r\n0x1p-2i       // == 0x1p-2 * 1i == 0.25i\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"0600\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"170141183460469231731687303715884105727\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"4_2\"],\r\n\t[\"number\", \"0600\"],\r\n\t[\"number\", \"0_600\"],\r\n\t[\"number\", \"0o600\"],\r\n\t[\"number\", \"0O600\"],\r\n\t[\"comment\", \"// second character is capital letter 'O'\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0xBad_Face\"],\r\n\t[\"number\", \"0x_67_7a_2f_cc_40_c6\"],\r\n\t[\"number\", \"170141183460469231731687303715884105727\"],\r\n\t[\"number\", \"170_141183_460469_231731_687303_715884_105727\"],\r\n\r\n\t[\"number\", \"0.\"],\r\n\t[\"number\", \"72.40\"],\r\n\t[\"number\", \"072.40\"], [\"comment\", \"// == 72.40\"],\r\n\t[\"number\", \"2.71828\"],\r\n\t[\"number\", \"1.e+0\"],\r\n\t[\"number\", \"6.67428e-11\"],\r\n\t[\"number\", \"1E6\"],\r\n\t[\"number\", \".25\"],\r\n\t[\"number\", \".12345E+5\"],\r\n\t[\"number\", \"1_5.\"], [\"comment\", \"// == 15.0\"],\r\n\t[\"number\", \"0.15e+0_2\"], [\"comment\", \"// == 15.0\"],\r\n\r\n\t[\"number\", \"0x1p-2\"], [\"comment\", \"// == 0.25\"],\r\n\t[\"number\", \"0x2.p10\"], [\"comment\", \"// == 2048.0\"],\r\n\t[\"number\", \"0x1.Fp+0\"], [\"comment\", \"// == 1.9375\"],\r\n\t[\"number\", \"0X.8p-0\"], [\"comment\", \"// == 0.5\"],\r\n\t[\"number\", \"0X_1FFFP-16\"], [\"comment\", \"// == 0.1249847412109375\"],\r\n\r\n\t[\"number\", \"0i\"],\r\n\t[\"number\", \"0123i\"], [\"comment\", \"// == 123i for backward-compatibility\"],\r\n\t[\"number\", \"0o123i\"], [\"comment\", \"// == 0o123 * 1i == 83i\"],\r\n\t[\"number\", \"0xabci\"], [\"comment\", \"// == 0xabc * 1i == 2748i\"],\r\n\t[\"number\", \"0.i\"],\r\n\t[\"number\", \"2.71828i\"],\r\n\t[\"number\", \"1.e+0i\"],\r\n\t[\"number\", \"6.67428e-11i\"],\r\n\t[\"number\", \"1E6i\"],\r\n\t[\"number\", \".25i\"],\r\n\t[\"number\", \".12345E+5i\"],\r\n\t[\"number\", \"0x1p-2i\"], [\"comment\", \"// == 0x1p-2 * 1i == 0.25i\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for integers, floats and imaginary numbers.\r\n"
  },
  {
    "path": "tests/languages/go/operator_feature.test",
    "content": "* / % ^ ! =\r\n*= /= %= ^= != ==\r\n+ += ++\r\n- -= --\r\n| |= ||\r\n& &= && &^ &^=\r\n> >> >>= >=\r\n< << <<= <= <-\r\n:= ...\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"%\"], [\"operator\", \"^\"], [\"operator\", \"!\"], [\"operator\", \"=\"],\r\n\t[\"operator\", \"*=\"], [\"operator\", \"/=\"], [\"operator\", \"%=\"], [\"operator\", \"^=\"], [\"operator\", \"!=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"+=\"], [\"operator\", \"++\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"-=\"], [\"operator\", \"--\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"|=\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&=\"], [\"operator\", \"&&\"], [\"operator\", \"&^\"], [\"operator\", \"&^=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">>=\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<<=\"], [\"operator\", \"<=\"], [\"operator\", \"<-\"],\r\n\t[\"operator\", \":=\"], [\"operator\", \"...\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/go/punctuation_feature.test",
    "content": "( ) { } [ ]\n, ; . :\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"]\n]\n"
  },
  {
    "path": "tests/languages/go/string_feature.test",
    "content": "``\r\n`abc`\r\n`\\n\r\n\\n`\r\n`\\`\r\n\r\n\"\"\r\n\"\\n\"\r\n\"\\\"\"\r\n\"Hello, world!\\n\"\r\n\"日本語\"\r\n\"\\xff\\u00FF\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"``\"],\r\n\t[\"string\", \"`abc`\"],\r\n\t[\"string\", \"`\\\\n\\r\\n\\\\n`\"],\r\n\t[\"string\", \"`\\\\`\"],\r\n\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"\\\\n\\\"\"],\r\n\t[\"string\", \"\\\"\\\\\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Hello, world!\\\\n\\\"\"],\r\n\t[\"string\", \"\\\"日本語\\\"\"],\r\n\t[\"string\", \"\\\"\\\\xff\\\\u00FF\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for runes and strings.\r\n"
  },
  {
    "path": "tests/languages/go-module/comment_feature.test",
    "content": "// comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// comment\"]\n]\n"
  },
  {
    "path": "tests/languages/go-module/directives_feature.test",
    "content": "module golang.org/x/net\n\ngo 1.14\n\nrequire golang.org/x/net v1.2.3\n\nrequire (\n    golang.org/x/crypto v1.4.5 // indirect\n    golang.org/x/text v1.6.7\n)\n\nexclude golang.org/x/net v1.2.3\n\nexclude (\n    golang.org/x/crypto v1.4.5\n    golang.org/x/text v1.6.7\n)\n\nreplace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5\n\nreplace (\n    golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5\n    golang.org/x/net => example.com/fork/net v1.4.5\n    golang.org/x/net v1.2.3 => ./fork/net\n    golang.org/x/net => ./fork/net\n)\n\nretract (\n    v1.0.0 // Published accidentally.\n    v1.0.1 // Contains retractions only.\n)\n\nretract v1.0.0\nretract [v1.0.0, v1.9.9]\nretract (\n    v1.0.0\n    [v1.0.0, v1.9.9]\n)\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"module\"], \" golang.org/x/net\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"go\"], [\"go-version\", \"1.14\"],\n\n\t[\"keyword\", \"require\"], \" golang.org/x/net \", [\"version\", \"v1.2.3\"],\n\n\t[\"keyword\", \"require\"],\n\t[\"punctuation\", \"(\"],\n\n\t\"\\r\\n    golang.org/x/crypto \",\n\t[\"version\", \"v1.4.5\"],\n\t[\"comment\", \"// indirect\"],\n\n\t\"\\r\\n    golang.org/x/text \",\n\t[\"version\", \"v1.6.7\"],\n\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"exclude\"], \" golang.org/x/net \", [\"version\", \"v1.2.3\"],\n\n\t[\"keyword\", \"exclude\"], [\"punctuation\", \"(\"],\n\t\"\\r\\n    golang.org/x/crypto \", [\"version\", \"v1.4.5\"],\n\t\"\\r\\n    golang.org/x/text \", [\"version\", \"v1.6.7\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"replace\"],\n\t\" golang.org/x/net \",\n\t[\"version\", \"v1.2.3\"],\n\t[\"operator\", \"=>\"],\n\t\" example.com/fork/net \",\n\t[\"version\", \"v1.4.5\"],\n\n\t[\"keyword\", \"replace\"],\n\t[\"punctuation\", \"(\"],\n\n\t\"\\r\\n    golang.org/x/net \",\n\t[\"version\", \"v1.2.3\"],\n\t[\"operator\", \"=>\"],\n\t\" example.com/fork/net \",\n\t[\"version\", \"v1.4.5\"],\n\n\t\"\\r\\n    golang.org/x/net \",\n\t[\"operator\", \"=>\"],\n\t\" example.com/fork/net \",\n\t[\"version\", \"v1.4.5\"],\n\n\t\"\\r\\n    golang.org/x/net \",\n\t[\"version\", \"v1.2.3\"],\n\t[\"operator\", \"=>\"],\n\t\" ./fork/net\\r\\n    golang.org/x/net \",\n\t[\"operator\", \"=>\"],\n\t\" ./fork/net\\r\\n\",\n\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"retract\"], [\"punctuation\", \"(\"],\n\t[\"version\", \"v1.0.0\"], [\"comment\", \"// Published accidentally.\"],\n\t[\"version\", \"v1.0.1\"], [\"comment\", \"// Contains retractions only.\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"retract\"],\n\t[\"version\", \"v1.0.0\"],\n\n\t[\"keyword\", \"retract\"],\n\t[\"punctuation\", \"[\"],\n\t[\"version\", \"v1.0.0\"],\n\t[\"punctuation\", \",\"],\n\t[\"version\", \"v1.9.9\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"keyword\", \"retract\"],\n\t[\"punctuation\", \"(\"],\n\n\t[\"version\", \"v1.0.0\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"version\", \"v1.0.0\"],\n\t[\"punctuation\", \",\"],\n\t[\"version\", \"v1.9.9\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/go-module/keyword_feature.test",
    "content": "exclude\ngo\nmodule\nreplace\nrequire\nretract\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"exclude\"],\n\t[\"keyword\", \"go\"],\n\t[\"keyword\", \"module\"],\n\t[\"keyword\", \"replace\"],\n\t[\"keyword\", \"require\"],\n\t[\"keyword\", \"retract\"]\n]\n"
  },
  {
    "path": "tests/languages/go-module/operator_feature.test",
    "content": "=>\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"=>\"]\n]\n"
  },
  {
    "path": "tests/languages/go-module/punctuation_feature.test",
    "content": "( ) [ ]\n,\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \",\"]\n]\n"
  },
  {
    "path": "tests/languages/go-module/version_feature.test",
    "content": "v0.0.0\nv1.12.134\nv8.0.5-pre\nv2.0.9+meta\nv1.5.0-beta\nv0.0.0-20191109021931-daa7c04131f5\nv1.999.999-99999999999999-daa7c04131f5\nv1.2.4-0.20191109021931-daa7c04131f5\n\n----------------------------------------------------\n\n[\n\t[\"version\", \"v0.0.0\"],\n\t[\"version\", \"v1.12.134\"],\n\t[\"version\", \"v8.0.5-pre\"],\n\t[\"version\", \"v2.0.9+meta\"],\n\t[\"version\", \"v1.5.0-beta\"],\n\t[\"version\", \"v0.0.0-20191109021931-daa7c04131f5\"],\n\t[\"version\", \"v1.999.999-99999999999999-daa7c04131f5\"],\n\t[\"version\", \"v1.2.4-0.20191109021931-daa7c04131f5\"]\n]\n"
  },
  {
    "path": "tests/languages/gradle/annotation_feature.test",
    "content": "@BaseScript MyBaseClass baseScript\n@DelegatesTo(EmailSpec)\n\n----------------------------------------------------\n\n[\n\t[\"annotation\", \"@BaseScript\"],\n\t\" MyBaseClass baseScript\\r\\n\",\n\t[\"annotation\", \"@DelegatesTo\"],\n\t[\"punctuation\", \"(\"],\n\t\"EmailSpec\",\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for annotations."
  },
  {
    "path": "tests/languages/gradle/keyword_feature.test",
    "content": "implementation\nval tasks dependencies project plugin plugins\nrepository repositories apply def sourceSets import\nif else\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"implementation\"],\n\n\t[\"keyword\", \"val\"],\n\t[\"keyword\", \"tasks\"],\n\t[\"keyword\", \"dependencies\"],\n\t[\"keyword\", \"project\"],\n\t[\"keyword\", \"plugin\"],\n\t[\"keyword\", \"plugins\"],\n\n\t[\"keyword\", \"repository\"],\n\t[\"keyword\", \"repositories\"],\n\t[\"keyword\", \"apply\"],\n\t[\"keyword\", \"def\"],\n\t[\"keyword\", \"sourceSets\"],\n\t[\"keyword\", \"import\"],\n\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"else\"]\n]\n\n----------------------------------------------------\n\nChecks for all keywords.\n"
  },
  {
    "path": "tests/languages/gradle/number_feature.test",
    "content": "0b0110\n0b0110_1111_0000\n0b01G 0b01L 0b01I\n0b01D 0b01F\n\n0xBABE\n0xBad_Face\n0x1.8p1\n0xa.fp-2\n\n42_000\n3.14_15_9\n1.2e3\n3E+1\n4E-2\n42g 42l 42i\n42d 42f\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0b0110\"],\n\t[\"number\", \"0b0110_1111_0000\"],\n\t[\"number\", \"0b01G\"], [\"number\", \"0b01L\"], [\"number\", \"0b01I\"],\n\t[\"number\", \"0b01D\"], [\"number\", \"0b01F\"],\n\n\t[\"number\", \"0xBABE\"],\n\t[\"number\", \"0xBad_Face\"],\n\t[\"number\", \"0x1.8p1\"],\n\t[\"number\", \"0xa.fp-2\"],\n\n\t[\"number\", \"42_000\"],\n\t[\"number\", \"3.14_15_9\"],\n\t[\"number\", \"1.2e3\"],\n\t[\"number\", \"3E+1\"],\n\t[\"number\", \"4E-2\"],\n\t[\"number\", \"42g\"], [\"number\", \"42l\"], [\"number\", \"42i\"],\n\t[\"number\", \"42d\"], [\"number\", \"42f\"]\n]\n\n----------------------------------------------------\n\nChecks for binary, hexadecimal and decimal numbers."
  },
  {
    "path": "tests/languages/gradle/operator_feature.test",
    "content": "~\n= == =~ ==~\n? ?. ?:\n* ** *. *= **=\n.@ .&\n5..8\n5..<8\n- -- -= ->\n+ ++ +=\n! !=\n< << <<= <= <=>\n> >> >>> >>= >>>= >=\n& && &=\n| || |=\n/\n/=\n^ ^=\n% %=\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"=~\"], [\"operator\", \"==~\"],\n\t[\"operator\", \"?\"], [\"operator\", \"?.\"], [\"operator\", \"?:\"],\n\t[\"operator\", \"*\"], [\"operator\", \"**\"], [\"operator\", \"*.\"], [\"operator\", \"*=\"], [\"operator\", \"**=\"],\n\t[\"operator\", \".@\"], [\"operator\", \".&\"],\n\t[\"number\", \"5\"], [\"operator\", \"..\"], [\"number\", \"8\"],\n\t[\"number\", \"5\"], [\"operator\", \"..<\"], [\"number\", \"8\"],\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"-=\"], [\"operator\", \"->\"],\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"+=\"],\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<<=\"], [\"operator\", \"<=\"], [\"operator\", \"<=>\"],\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">>>\"], [\"operator\", \">>=\"], [\"operator\", \">>>=\"], [\"operator\", \">=\"],\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"&=\"],\n\t[\"operator\", \"|\"], [\"operator\", \"||\"], [\"operator\", \"|=\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"],\n\t[\"operator\", \"%\"], [\"operator\", \"%=\"]\n]\n\n----------------------------------------------------\n\nChecks for all operators.\n"
  },
  {
    "path": "tests/languages/gradle/shebang_feature.test",
    "content": "#!foobar\n#!/usr/bin/env groovy\n\n----------------------------------------------------\n\n[\n\t[\"shebang\", \"#!foobar\"],\n\t[\"shebang\", \"#!/usr/bin/env groovy\"]\n]\n\n----------------------------------------------------\n\nCheck for shebang comments."
  },
  {
    "path": "tests/languages/gradle/spock-block_feature.test",
    "content": "setup:\ngiven:\nwhen:\nthen:\nand:\ncleanup:\nexpect:\nwhere:\n\n----------------------------------------------------\n\n[\n\t[\"spock-block\", \"setup:\"],\n\t[\"spock-block\", \"given:\"],\n\t[\"spock-block\", \"when:\"],\n\t[\"spock-block\", \"then:\"],\n\t[\"spock-block\", \"and:\"],\n\t[\"spock-block\", \"cleanup:\"],\n\t[\"spock-block\", \"expect:\"],\n\t[\"spock-block\", \"where:\"]\n]\n\n----------------------------------------------------\n\nChecks for all spock blocks."
  },
  {
    "path": "tests/languages/gradle/string-interpolation_feature.html.test",
    "content": "// Double quoted: interpolation\n\"$foo\"\n\"${42}\"\n\n// Triple double quoted: interpolation\n\"\"\"$foo\"\"\"\n\"\"\"${42}\"\"\"\n\n// Slashy string: interpolation\n/$foo/\n/${42}/\n\n// Dollar slashy string: interpolation\n$/$foo/$\n$/${42}/$\n\n// Double quoted: no interpolation (escaped)\n\"\\$foo \\${42}\"\n\n// Triple double quoted: no interpolation (escaped)\n\"\"\"\\$foo \\${42}\"\"\"\n\n// Slashy string: no interpolation (escaped)\n/\\$foo \\${42}/\n\n// Dollar slashy string: no interpolation (escaped)\n$/$$foo $${42}/$\n\n// Single quoted string: no interpolation\n'$foo ${42}'\n\n// Triple single quoted string: no interpolation\n'''$foo ${42}'''\n\n----------------------------------------------------\n\n<span class=\"token comment\">// Double quoted: interpolation</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">\"</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">$</span>\n\t\t<span class=\"token expression\">foo</span>\n\t</span>\n\t<span class=\"token string\">\"</span>\n</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">\"</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">${</span>\n\t\t<span class=\"token expression\"><span class=\"token number\">42</span></span>\n\t\t<span class=\"token interpolation-punctuation punctuation\">}</span>\n\t</span>\n\t<span class=\"token string\">\"</span>\n</span>\n\n<span class=\"token comment\">// Triple double quoted: interpolation</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">\"\"\"</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">$</span>\n\t\t<span class=\"token expression\">foo</span>\n\t</span>\n\t<span class=\"token string\">\"\"\"</span>\n</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">\"\"\"</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">${</span>\n\t\t<span class=\"token expression\"><span class=\"token number\">42</span></span>\n\t\t<span class=\"token interpolation-punctuation punctuation\">}</span>\n\t</span>\n\t<span class=\"token string\">\"\"\"</span>\n</span>\n\n<span class=\"token comment\">// Slashy string: interpolation</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">/</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">$</span>\n\t\t<span class=\"token expression\">foo</span>\n\t</span>\n\t<span class=\"token string\">/</span>\n</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">/</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">${</span>\n\t\t<span class=\"token expression\"><span class=\"token number\">42</span></span>\n\t\t<span class=\"token interpolation-punctuation punctuation\">}</span>\n\t</span>\n\t<span class=\"token string\">/</span>\n</span>\n\n<span class=\"token comment\">// Dollar slashy string: interpolation</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">$/</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">$</span>\n\t\t<span class=\"token expression\">foo</span>\n\t</span>\n\t<span class=\"token string\">/$</span>\n</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">$/</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">${</span>\n\t\t<span class=\"token expression\"><span class=\"token number\">42</span></span>\n\t\t<span class=\"token interpolation-punctuation punctuation\">}</span>\n\t</span>\n\t<span class=\"token string\">/$</span>\n</span>\n\n<span class=\"token comment\">// Double quoted: no interpolation (escaped)</span>\n<span class=\"token interpolation-string\"><span class=\"token string\">\"\\$foo \\${42}\"</span></span>\n\n<span class=\"token comment\">// Triple double quoted: no interpolation (escaped)</span>\n<span class=\"token interpolation-string\"><span class=\"token string\">\"\"\"\\$foo \\${42}\"\"\"</span></span>\n\n<span class=\"token comment\">// Slashy string: no interpolation (escaped)</span>\n<span class=\"token interpolation-string\"><span class=\"token string\">/\\$foo \\${42}/</span></span>\n\n<span class=\"token comment\">// Dollar slashy string: no interpolation (escaped)</span>\n<span class=\"token interpolation-string\"><span class=\"token string\">$/$$foo $${42}/$</span></span>\n\n<span class=\"token comment\">// Single quoted string: no interpolation</span>\n<span class=\"token string\">'$foo ${42}'</span>\n\n<span class=\"token comment\">// Triple single quoted string: no interpolation</span>\n<span class=\"token string\">'''$foo ${42}'''</span>\n"
  },
  {
    "path": "tests/languages/gradle/string_feature.test",
    "content": "\"\"\"\"\"\"\n\"\"\"foo\"\"\"\n\"\"\"foo\nbar\"\"\"\n\n''''''\n'''foo'''\n'''foo\nbar'''\n\n\"\"\n\"fo\\\"o\"\n''\n'fo\\'o'\n\n/foo/\n/fo\\/o/\n\n$/fo$/$o/$\n$/foo\nbar/$\n\"foo /* comment */ bar\"\n'foo // bar'\n'''foo\n/* comment */\nbar'''\n'''hell\\'''o'''\n\"\"\"foo\n// comment\nbar\"\"\"\n\"\"\"hell\\\"\"\"o\"\"\"\n\n----------------------------------------------------\n\n[\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"\\\"\\\"\\\"\\\"\\\"\\\"\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"\\\"\\\"\\\"foo\\\"\\\"\\\"\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"\\\"\\\"\\\"foo\\r\\nbar\\\"\\\"\\\"\"]\n\t]],\n\n\t[\"string\", \"''''''\"],\n\t[\"string\", \"'''foo'''\"],\n\t[\"string\", \"'''foo\\r\\nbar'''\"],\n\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"\\\"\\\"\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"]\n\t]],\n\t[\"string\", \"''\"],\n\t[\"string\", \"'fo\\\\'o'\"],\n\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"/foo/\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"/fo\\\\/o/\"]\n\t]],\n\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"$/fo$/\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"$\"],\n\t\t\t[\"expression\", [\"o\"]]\n\t\t]],\n\t\t[\"string\", \"/$\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"$/foo\\r\\nbar/$\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"\\\"foo /* comment */ bar\\\"\"]\n\t]],\n\t[\"string\", \"'foo // bar'\"],\n\t[\"string\", \"'''foo\\r\\n/* comment */\\r\\nbar'''\"],\n\t[\"string\", \"'''hell\\\\'''o'''\"],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"\\\"\\\"\\\"foo\\r\\n// comment\\r\\nbar\\\"\\\"\\\"\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"\\\"\\\"\\\"hell\\\\\\\"\\\"\\\"o\\\"\\\"\\\"\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for single quoted, triple single quoted, double quoted,\ntriple double quoted, slashy and dollar slashy strings.\n"
  },
  {
    "path": "tests/languages/graphql/advanced_tokens.html.test",
    "content": "type Human implements Character {\n\tid: ID!\n\tname: String!\n\tfriends: [Character]\n\tappearsIn: [Episode]!\n\tstarships: [Starship]\n\ttotalCredits: Int\n}\ntype Droid implements Character {\n\tid: ID!\n\tname: String!\n\tfriends: [Character]\n\tappearsIn: [Episode]!\n\tprimaryFunction: String\n}\n\n\ninput OrderInput {\n\tid: ID!\n\tcustomAttributes: [AttributeInput!]\n\tcustomer: Customer\n\tlocalizationExtensions: [LocalizationExtensionInput!]\n\tmetafields: [MetafieldInput!]\n\tnote: String!\n\tshippingAddress: MailingAddressInput\n\ttags: [String!]\n}\n\n\nquery getProductById($id: ID!) {\n\tproduct(id: $id) {\n\t\ttitle\n\t\thandle\n\t\tcreatedAt\n\t}\n}\n\n\n{\n\torders(id: 4) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t# Order fields\n\t\t\t\t# Query fields\n\t\t\t}\n\t\t\tcursor\n\t\t}\n\t\tpageInfo {\n\t\t\thasNextPage\n\t\t\thasPreviousPage\n\t\t}\n\t}\n}\n\n\nmutation orderUpdate($input: OrderInput!) {\n\torderUpdate(input: $input) {\n\t\torder {\n\t\t\t# Order fields\n\t\t}\n\t\tuserErrors {\n\t\t\tfield\n\t\t\tmessage\n\t\t}\n\t}\n}\n\n\n\nmutation {\n\tcustomerCreate(input: { firstName: \"John\", lastName: \"Tate\", email: \"john@johns-apparel.com\" }) {\n\t\tcustomer {\n\t\t\tid\n\t\t}\n\t}\n}\n\n\n\nmutation Login($email: String) {\n\tlogin(email: $email)\n}\n\n\n\nmutation BookTrip($id:ID!) {\n\tbookTrips(launchIds: [$id]) {\n\t\tsuccess\n\t\tmessage\n\t\tlaunches {\n\t\t\tid\n\t\t}\n\t}\n}\n\n----------------------------------------------------\n\n<span class=\"token keyword\">type</span>\n<span class=\"token class-name\">Human</span>\n<span class=\"token keyword\">implements</span>\n<span class=\"token class-name\">Character</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token attr-name\">id</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token scalar\">ID</span>\n<span class=\"token operator\">!</span>\n<span class=\"token attr-name\">name</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token scalar\">String</span>\n<span class=\"token operator\">!</span>\n<span class=\"token attr-name\">friends</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">[</span>\n<span class=\"token class-name\">Character</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token attr-name\">appearsIn</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">[</span>\n<span class=\"token class-name\">Episode</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token operator\">!</span>\n<span class=\"token attr-name\">starships</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">[</span>\n<span class=\"token class-name\">Starship</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token attr-name\">totalCredits</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token scalar\">Int</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">type</span>\n<span class=\"token class-name\">Droid</span>\n<span class=\"token keyword\">implements</span>\n<span class=\"token class-name\">Character</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token attr-name\">id</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token scalar\">ID</span>\n<span class=\"token operator\">!</span>\n<span class=\"token attr-name\">name</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token scalar\">String</span>\n<span class=\"token operator\">!</span>\n<span class=\"token attr-name\">friends</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">[</span>\n<span class=\"token class-name\">Character</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token attr-name\">appearsIn</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">[</span>\n<span class=\"token class-name\">Episode</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token operator\">!</span>\n<span class=\"token attr-name\">primaryFunction</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token scalar\">String</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">input</span>\n<span class=\"token atom-input class-name\">OrderInput</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token attr-name\">id</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token scalar\">ID</span>\n<span class=\"token operator\">!</span>\n<span class=\"token attr-name\">customAttributes</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">[</span>\n<span class=\"token atom-input class-name\">AttributeInput</span>\n<span class=\"token operator\">!</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token attr-name\">customer</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token class-name\">Customer</span>\n<span class=\"token attr-name\">localizationExtensions</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">[</span>\n<span class=\"token atom-input class-name\">LocalizationExtensionInput</span>\n<span class=\"token operator\">!</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token attr-name\">metafields</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">[</span>\n<span class=\"token atom-input class-name\">MetafieldInput</span>\n<span class=\"token operator\">!</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token attr-name\">note</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token scalar\">String</span>\n<span class=\"token operator\">!</span>\n<span class=\"token attr-name\">shippingAddress</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token atom-input class-name\">MailingAddressInput</span>\n<span class=\"token attr-name\">tags</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">[</span>\n<span class=\"token scalar\">String</span>\n<span class=\"token operator\">!</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">query</span>\n<span class=\"token definition-query function\">getProductById</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token variable\">$id</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token scalar\">ID</span>\n<span class=\"token operator\">!</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token property-query\">product</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token attr-name\">id</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token variable\">$id</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token property\">title</span>\n<span class=\"token property\">handle</span>\n<span class=\"token property\">createdAt</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">{</span>\n<span class=\"token property-query\">orders</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token attr-name\">id</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token number\">4</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token object\">edges</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token object\">node</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token comment\"># Order fields</span>\n<span class=\"token comment\"># Query fields</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token property\">cursor</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token object\">pageInfo</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token property\">hasNextPage</span>\n<span class=\"token property\">hasPreviousPage</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">mutation</span>\n<span class=\"token definition-mutation function\">orderUpdate</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token variable variable-input\">$input</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token atom-input class-name\">OrderInput</span>\n<span class=\"token operator\">!</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token property-query property-mutation\">orderUpdate</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token attr-name\">input</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token variable variable-input\">$input</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token object\">order</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token comment\"># Order fields</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token object\">userErrors</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token property\">field</span>\n<span class=\"token property\">message</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">mutation</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token property-query property-mutation\">customerCreate</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token attr-name\">input</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token attr-name\">firstName</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token string\">\"John\"</span>\n<span class=\"token punctuation\">,</span>\n<span class=\"token attr-name\">lastName</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token string\">\"Tate\"</span>\n<span class=\"token punctuation\">,</span>\n<span class=\"token attr-name\">email</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token string\">\"john@johns-apparel.com\"</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token object\">customer</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token property\">id</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">mutation</span>\n<span class=\"token definition-mutation function\">Login</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token variable variable-input\">$email</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token scalar\">String</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token property-query property-mutation\">login</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token attr-name\">email</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token variable variable-input\">$email</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">mutation</span>\n<span class=\"token definition-mutation function\">BookTrip</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token variable variable-input\">$id</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token scalar\">ID</span>\n<span class=\"token operator\">!</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token property-query property-mutation\">bookTrips</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token attr-name\">launchIds</span>\n<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">[</span>\n<span class=\"token variable variable-input\">$id</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token property\">success</span>\n<span class=\"token property\">message</span>\n<span class=\"token object\">launches</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token property\">id</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n"
  },
  {
    "path": "tests/languages/graphql/atom-input_feature.test",
    "content": "FooInput\n\n----------------------------------------------------\n\n[\n\t[\"atom-input\", \"FooInput\"]\n]\n"
  },
  {
    "path": "tests/languages/graphql/attr-name_feature.test",
    "content": "{\r\n\tzuck: user(id: 4) {\r\n\t\tname\r\n\t}\r\n\tfoo(bar: Int = 0, baz: String = \"(\"): [Int!]!\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"attr-name\", \"zuck\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"property-query\", \"user\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"attr-name\", \"id\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"name\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"attr-name\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"attr-name\", \"bar\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"scalar\", \"Int\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"attr-name\", \"baz\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"scalar\", \"String\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"(\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"scalar\", \"Int\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"!\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for aliases, parameter names, etc.\r\n"
  },
  {
    "path": "tests/languages/graphql/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/graphql/class-name_feature.test",
    "content": "interface Foo {}\ntype Foo {}\ntype Foo implements Bar {}\ntype Business implements NamedEntity & ValuedEntity {}\nenum Foo {}\nscalar Foo\nunion Foo\non Foo {}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"interface\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"type\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"type\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"keyword\", \"implements\"],\n\t[\"class-name\", \"Bar\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"type\"],\n\t[\"class-name\", \"Business\"],\n\t[\"keyword\", \"implements\"],\n\t[\"class-name\", \"NamedEntity\"],\n\t[\"operator\", \"&\"],\n\t[\"class-name\", \"ValuedEntity\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"enum\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"scalar\"],\n\t[\"class-name\", \"Foo\"],\n\n\t[\"keyword\", \"union\"],\n\t[\"class-name\", \"Foo\"],\n\n\t[\"keyword\", \"on\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for class names.\n"
  },
  {
    "path": "tests/languages/graphql/comment_feature.test",
    "content": "#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/graphql/constant_feature.test",
    "content": "enum Color {\n\tRED\n\tGREEN\n\tBLUE\n}\n\n{\n\tfoo(bar: RED) {\n\t\tbaz\n\t}\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"enum\"], [\"class-name\", \"Color\"], [\"punctuation\", \"{\"],\n\t[\"constant\", \"RED\"],\n\t[\"constant\", \"GREEN\"],\n\t[\"constant\", \"BLUE\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"property-query\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t[\"attr-name\", \"bar\"],\n\t[\"punctuation\", \":\"],\n\t[\"constant\", \"RED\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"property\", \"baz\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for constants.\n"
  },
  {
    "path": "tests/languages/graphql/description_feature.test",
    "content": "\"Single-line description\"\r\ntype Foo {}\r\n\"\"\"\r\nMultiline description\r\n\"\"\"\r\ntype Bar {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"description\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"language-markdown\", \"Single-line description\"],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"description\", [\r\n\t\t\"\\\"\\\"\\\"\",\r\n\t\t[\"language-markdown\", \"\\r\\nMultiline description\\r\\n\"],\r\n\t\t\"\\\"\\\"\\\"\"\r\n\t]],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"class-name\", \"Bar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for descriptions."
  },
  {
    "path": "tests/languages/graphql/directive_feature.test",
    "content": "@skip\r\n@include\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"@skip\"],\r\n\t[\"directive\", \"@include\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directives"
  },
  {
    "path": "tests/languages/graphql/fragment_feature.test",
    "content": "{\r\n\t...frag\r\n}\r\n\r\nfragment frag on FooBar {\r\n\tfoo\r\n\tbar\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"operator\", \"...\"], [\"fragment\", \"frag\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"fragment\"],\r\n\t[\"fragment\", \"frag\"],\r\n\t[\"keyword\", \"on\"],\r\n\t[\"class-name\", \"FooBar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"foo\"],\r\n\r\n\t[\"property\", \"bar\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for fragments.\r\n"
  },
  {
    "path": "tests/languages/graphql/keyword_feature.test",
    "content": "directive,\r\nenum,\r\nextend,\r\nfragment,\r\nimplements,\r\ninput,\r\ninterface,\r\nmutation,\r\non,\r\nquery,\r\nrepeatable,\r\nscalar,\r\nschema,\r\nsubscription,\r\ntype,\r\nunion,\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"directive\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"extend\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"fragment\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"implements\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"input\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"mutation\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"on\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"query\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"repeatable\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"scalar\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"schema\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"subscription\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"union\"],\r\n\t[\"punctuation\", \",\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/graphql/mutation_feature.test",
    "content": "mutation foo {}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"mutation\"],\n\t[\"definition-mutation\", \"foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/graphql/number_feature.test",
    "content": "0\r\n42\r\n-5\r\n3.14159\r\n5e4\r\n6E-78\r\n0.3e+1\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"-5\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"5e4\"],\r\n\t[\"number\", \"6E-78\"],\r\n\t[\"number\", \"0.3e+1\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/graphql/operator_feature.test",
    "content": "= ! | &\r\n...\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"...\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/graphql/scalar_feature.test",
    "content": "Boolean\nFloat\nID\nInt\nString\n\n----------------------------------------------------\n\n[\n\t[\"scalar\", \"Boolean\"],\n\t[\"scalar\", \"Float\"],\n\t[\"scalar\", \"ID\"],\n\t[\"scalar\", \"Int\"],\n\t[\"scalar\", \"String\"]\n]\n"
  },
  {
    "path": "tests/languages/graphql/string_feature.test",
    "content": "\"\"\r\n\"foo bar\"\r\n\"foo\\\"bar\\\\baz\"\r\n\"\"\"multi-line\r\nstring\"\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo bar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\\\\\"bar\\\\\\\\baz\\\"\"],\r\n\t[\"string\", \"\\\"\\\"\\\"multi-line\\r\\nstring\\\"\\\"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/graphql/variable_feature.test",
    "content": "$foo\r\n$Foo_bar42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"variable\", \"$Foo_bar42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/groovy/annotation_feature.test",
    "content": "@BaseScript MyBaseClass baseScript\r\n@DelegatesTo(EmailSpec)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"annotation\", \"@BaseScript\"],\r\n\t\" MyBaseClass baseScript\\r\\n\",\r\n\t[\"annotation\", \"@DelegatesTo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"EmailSpec\",\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for annotations."
  },
  {
    "path": "tests/languages/groovy/issue1049.html.test",
    "content": "\"&amp;\"\n\"&amp;&amp;\"\n\"&lt;\"\n\"&lt;&lt;\"\n\"&amp;lt;\"\n\"&gt;\"\n\n----------------------------------------------------\n\n<span class=\"token interpolation-string\"><span class=\"token string\">\"&amp;amp;\"</span></span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">\"&amp;amp;&amp;amp;\"</span>\n</span>\n<span class=\"token interpolation-string\"><span class=\"token string\">\"&amp;lt;\"</span></span>\n<span class=\"token interpolation-string\"><span class=\"token string\">\"&amp;lt;&amp;lt;\"</span></span>\n<span class=\"token interpolation-string\"><span class=\"token string\">\"&amp;amp;lt;\"</span></span>\n<span class=\"token interpolation-string\"><span class=\"token string\">\"&amp;gt;\"</span></span>\n"
  },
  {
    "path": "tests/languages/groovy/keyword_feature.test",
    "content": "as def in abstract\r\nassert boolean break\r\nbyte case catch char\r\nclass;\r\nconst continue\r\ndefault do double else\r\nenum\r\nextends;\r\nfinal\r\nfinally float for goto\r\nif\r\nimplements;\r\nimport\r\ninstanceof;\r\nint\r\ninterface;\r\nlong native\r\nnew;\r\npackage private protected\r\npublic return short\r\nstatic strictfp super\r\nswitch synchronized this\r\nthrow throws\r\ntrait;\r\ntransient\r\ntry void volatile while\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"], [\"keyword\", \"def\"], [\"keyword\", \"in\"], [\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"assert\"], [\"keyword\", \"boolean\"], [\"keyword\", \"break\"],\r\n\t[\"keyword\", \"byte\"], [\"keyword\", \"case\"], [\"keyword\", \"catch\"], [\"keyword\", \"char\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"], [\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"default\"], [\"keyword\", \"do\"], [\"keyword\", \"double\"], [\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"finally\"], [\"keyword\", \"float\"], [\"keyword\", \"for\"], [\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"instanceof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"long\"], [\"keyword\", \"native\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"package\"], [\"keyword\", \"private\"], [\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"public\"], [\"keyword\", \"return\"], [\"keyword\", \"short\"],\r\n\t[\"keyword\", \"static\"], [\"keyword\", \"strictfp\"], [\"keyword\", \"super\"],\r\n\t[\"keyword\", \"switch\"], [\"keyword\", \"synchronized\"], [\"keyword\", \"this\"],\r\n\t[\"keyword\", \"throw\"], [\"keyword\", \"throws\"],\r\n\t[\"keyword\", \"trait\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"transient\"],\r\n\t[\"keyword\", \"try\"], [\"keyword\", \"void\"], [\"keyword\", \"volatile\"], [\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/groovy/number_feature.test",
    "content": "0b0110\r\n0b0110_1111_0000\r\n0b01G 0b01L 0b01I\r\n0b01D 0b01F\r\n\r\n0xBABE\r\n0xBad_Face\r\n0x1.8p1\r\n0xa.fp-2\r\n\r\n42_000\r\n3.14_15_9\r\n1.2e3\r\n3E+1\r\n4E-2\r\n42g 42l 42i\r\n42d 42f\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0b0110\"],\r\n\t[\"number\", \"0b0110_1111_0000\"],\r\n\t[\"number\", \"0b01G\"], [\"number\", \"0b01L\"], [\"number\", \"0b01I\"],\r\n\t[\"number\", \"0b01D\"], [\"number\", \"0b01F\"],\r\n\r\n\t[\"number\", \"0xBABE\"],\r\n\t[\"number\", \"0xBad_Face\"],\r\n\t[\"number\", \"0x1.8p1\"],\r\n\t[\"number\", \"0xa.fp-2\"],\r\n\r\n\t[\"number\", \"42_000\"],\r\n\t[\"number\", \"3.14_15_9\"],\r\n\t[\"number\", \"1.2e3\"],\r\n\t[\"number\", \"3E+1\"],\r\n\t[\"number\", \"4E-2\"],\r\n\t[\"number\", \"42g\"], [\"number\", \"42l\"], [\"number\", \"42i\"],\r\n\t[\"number\", \"42d\"], [\"number\", \"42f\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for binary, hexadecimal and decimal numbers."
  },
  {
    "path": "tests/languages/groovy/operator_feature.test",
    "content": "~\r\n= == =~ ==~\r\n? ?. ?:\r\n* ** *. *= **=\r\n.@ .&\r\n5..8\r\n5..<8\r\n- -- -= ->\r\n+ ++ +=\r\n! !=\r\n< << <<= <= <=>\r\n> >> >>> >>= >>>= >=\r\n& && &=\r\n| || |=\r\n/\r\n/=\r\n^ ^=\r\n% %=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"=~\"], [\"operator\", \"==~\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \"?.\"], [\"operator\", \"?:\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"**\"], [\"operator\", \"*.\"], [\"operator\", \"*=\"], [\"operator\", \"**=\"],\r\n\t[\"operator\", \".@\"], [\"operator\", \".&\"],\r\n\t[\"number\", \"5\"], [\"operator\", \"..\"], [\"number\", \"8\"],\r\n\t[\"number\", \"5\"], [\"operator\", \"..<\"], [\"number\", \"8\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"-=\"], [\"operator\", \"->\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<<=\"], [\"operator\", \"<=\"], [\"operator\", \"<=>\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">>>\"], [\"operator\", \">>=\"], [\"operator\", \">>>=\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"&=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"], [\"operator\", \"|=\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/groovy/shebang_feature.test",
    "content": "#!foobar\r\n#!/usr/bin/env groovy\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"shebang\", \"#!foobar\"],\r\n\t[\"shebang\", \"#!/usr/bin/env groovy\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nCheck for shebang comments."
  },
  {
    "path": "tests/languages/groovy/spock-block_feature.test",
    "content": "setup:\r\ngiven:\r\nwhen:\r\nthen:\r\nand:\r\ncleanup:\r\nexpect:\r\nwhere:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"spock-block\", \"setup:\"],\r\n\t[\"spock-block\", \"given:\"],\r\n\t[\"spock-block\", \"when:\"],\r\n\t[\"spock-block\", \"then:\"],\r\n\t[\"spock-block\", \"and:\"],\r\n\t[\"spock-block\", \"cleanup:\"],\r\n\t[\"spock-block\", \"expect:\"],\r\n\t[\"spock-block\", \"where:\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all spock blocks."
  },
  {
    "path": "tests/languages/groovy/string-interpolation_feature.html.test",
    "content": "// Double quoted: interpolation\n\"$foo\"\n\"${42}\"\n\n// Triple double quoted: interpolation\n\"\"\"$foo\"\"\"\n\"\"\"${42}\"\"\"\n\n// Slashy string: interpolation\n/$foo/\n/${42}/\n\n// Dollar slashy string: interpolation\n$/$foo/$\n$/${42}/$\n\n// Double quoted: no interpolation (escaped)\n\"\\$foo \\${42}\"\n\n// Triple double quoted: no interpolation (escaped)\n\"\"\"\\$foo \\${42}\"\"\"\n\n// Slashy string: no interpolation (escaped)\n/\\$foo \\${42}/\n\n// Dollar slashy string: no interpolation (escaped)\n$/$$foo $${42}/$\n\n// Single quoted string: no interpolation\n'$foo ${42}'\n\n// Triple single quoted string: no interpolation\n'''$foo ${42}'''\n\n----------------------------------------------------\n\n<span class=\"token comment\">// Double quoted: interpolation</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">\"</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">$</span>\n\t\t<span class=\"token expression\">foo</span>\n\t</span>\n\t<span class=\"token string\">\"</span>\n</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">\"</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">${</span>\n\t\t<span class=\"token expression\"><span class=\"token number\">42</span></span>\n\t\t<span class=\"token interpolation-punctuation punctuation\">}</span>\n\t</span>\n\t<span class=\"token string\">\"</span>\n</span>\n\n<span class=\"token comment\">// Triple double quoted: interpolation</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">\"\"\"</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">$</span>\n\t\t<span class=\"token expression\">foo</span>\n\t</span>\n\t<span class=\"token string\">\"\"\"</span>\n</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">\"\"\"</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">${</span>\n\t\t<span class=\"token expression\"><span class=\"token number\">42</span></span>\n\t\t<span class=\"token interpolation-punctuation punctuation\">}</span>\n\t</span>\n\t<span class=\"token string\">\"\"\"</span>\n</span>\n\n<span class=\"token comment\">// Slashy string: interpolation</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">/</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">$</span>\n\t\t<span class=\"token expression\">foo</span>\n\t</span>\n\t<span class=\"token string\">/</span>\n</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">/</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">${</span>\n\t\t<span class=\"token expression\"><span class=\"token number\">42</span></span>\n\t\t<span class=\"token interpolation-punctuation punctuation\">}</span>\n\t</span>\n\t<span class=\"token string\">/</span>\n</span>\n\n<span class=\"token comment\">// Dollar slashy string: interpolation</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">$/</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">$</span>\n\t\t<span class=\"token expression\">foo</span>\n\t</span>\n\t<span class=\"token string\">/$</span>\n</span>\n<span class=\"token interpolation-string\">\n\t<span class=\"token string\">$/</span>\n\t<span class=\"token interpolation\">\n\t\t<span class=\"token interpolation-punctuation punctuation\">${</span>\n\t\t<span class=\"token expression\"><span class=\"token number\">42</span></span>\n\t\t<span class=\"token interpolation-punctuation punctuation\">}</span>\n\t</span>\n\t<span class=\"token string\">/$</span>\n</span>\n\n<span class=\"token comment\">// Double quoted: no interpolation (escaped)</span>\n<span class=\"token interpolation-string\"><span class=\"token string\">\"\\$foo \\${42}\"</span></span>\n\n<span class=\"token comment\">// Triple double quoted: no interpolation (escaped)</span>\n<span class=\"token interpolation-string\"><span class=\"token string\">\"\"\"\\$foo \\${42}\"\"\"</span></span>\n\n<span class=\"token comment\">// Slashy string: no interpolation (escaped)</span>\n<span class=\"token interpolation-string\"><span class=\"token string\">/\\$foo \\${42}/</span></span>\n\n<span class=\"token comment\">// Dollar slashy string: no interpolation (escaped)</span>\n<span class=\"token interpolation-string\"><span class=\"token string\">$/$$foo $${42}/$</span></span>\n\n<span class=\"token comment\">// Single quoted string: no interpolation</span>\n<span class=\"token string\">'$foo ${42}'</span>\n\n<span class=\"token comment\">// Triple single quoted string: no interpolation</span>\n<span class=\"token string\">'''$foo ${42}'''</span>\n"
  },
  {
    "path": "tests/languages/groovy/string_feature.test",
    "content": "\"\"\"\"\"\"\r\n\"\"\"foo\"\"\"\r\n\"\"\"foo\r\nbar\"\"\"\r\n\r\n''''''\r\n'''foo'''\r\n'''foo\r\nbar'''\r\n\r\n\"\"\r\n\"fo\\\"o\"\r\n''\r\n'fo\\'o'\r\n\r\n/foo/\r\n/fo\\/o/\r\n\r\n$/fo$/$o/$\r\n$/foo\r\nbar/$\r\n\"foo /* comment */ bar\"\r\n'foo // bar'\r\n'''foo\r\n/* comment */\r\nbar'''\r\n'''hell\\'''o'''\r\n\"\"\"foo\r\n// comment\r\nbar\"\"\"\r\n\"\"\"hell\\\"\"\"o\"\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"\\\"\\\"\\\"\\\"\\\"\\\"\"]\r\n\t]],\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"\\\"\\\"\\\"foo\\\"\\\"\\\"\"]\r\n\t]],\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"\\\"\\\"\\\"foo\\r\\nbar\\\"\\\"\\\"\"]\r\n\t]],\r\n\r\n\t[\"string\", \"''''''\"],\r\n\t[\"string\", \"'''foo'''\"],\r\n\t[\"string\", \"'''foo\\r\\nbar'''\"],\r\n\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"\\\"\\\"\"]\r\n\t]],\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"]\r\n\t]],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo\\\\'o'\"],\r\n\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"/foo/\"]\r\n\t]],\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"/fo\\\\/o/\"]\r\n\t]],\r\n\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"$/fo$/\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"$\"],\r\n\t\t\t[\"expression\", [\"o\"]]\r\n\t\t]],\r\n\t\t[\"string\", \"/$\"]\r\n\t]],\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"$/foo\\r\\nbar/$\"]\r\n\t]],\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"\\\"foo /* comment */ bar\\\"\"]\r\n\t]],\r\n\t[\"string\", \"'foo // bar'\"],\r\n\t[\"string\", \"'''foo\\r\\n/* comment */\\r\\nbar'''\"],\r\n\t[\"string\", \"'''hell\\\\'''o'''\"],\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"\\\"\\\"\\\"foo\\r\\n// comment\\r\\nbar\\\"\\\"\\\"\"]\r\n\t]],\r\n\t[\"interpolation-string\", [\r\n\t\t[\"string\", \"\\\"\\\"\\\"hell\\\\\\\"\\\"\\\"o\\\"\\\"\\\"\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single quoted, triple single quoted, double quoted,\r\ntriple double quoted, slashy and dollar slashy strings.\r\n"
  },
  {
    "path": "tests/languages/groovy+sas/groovy_inclusion.test",
    "content": "proc groovy classpath=cp;\r\n  /* Testing a comment */\r\n  submit parseonly;\r\n    class Speaker {\r\n      def say( word ) {\r\n        println \"----> \\\"${word}\\\"\"\r\n      }\r\n    }\r\n  endsubmit;\r\nquit;\r\n\r\nproc groovy classpath=cp;\r\n  eval \"s = new Speaker(); s.say( \"\"Hi\"\" )\";\r\nquit;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"step\", \"proc groovy\"],\r\n\t[\"proc-args\", [\r\n\t\t[\"arg\", \"classpath\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"arg-value\", \"cp\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"proc-groovy\", [\r\n\t\t[\"comment\", \"/* Testing a comment */\"],\r\n\r\n\t\t[\"submit-statement\", \"submit parseonly\"],\r\n\t\t[\"groovy\", [\r\n\t\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t\t[\"keyword\", \"class\"],\r\n\t\t\t[\"class-name\", [\"Speaker\"]],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t\t[\"keyword\", \"def\"],\r\n\t\t\t[\"function\", \"say\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\" word \",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t\t\"\\r\\n        println \",\r\n\t\t\t[\"interpolation-string\", [\r\n\t\t\t\t[\"string\", \"\\\"----> \\\\\\\"\"],\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t[\"expression\", [\"word\"]],\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"string\", \"\\\\\\\"\\\"\"]\r\n\t\t\t]],\r\n\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"submit-statement\", \"endsubmit\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"step\", \"quit\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"step\", \"proc groovy\"],\r\n\t[\"proc-args\", [\r\n\t\t[\"arg\", \"classpath\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"arg-value\", \"cp\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"proc-groovy\", [\r\n\t\t[\"keyword\", \"eval\"],\r\n\t\t[\"string\", \"\\\"s = new Speaker(); s.say( \\\"\\\"Hi\\\"\\\" )\\\"\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"step\", \"quit\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for proc groovy support.\r\n"
  },
  {
    "path": "tests/languages/haml/code_feature.test",
    "content": "~ 42\r\n- 42\r\n= 42\r\n&= 42\r\n!= 42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"~\"], [\"code\", [[\"number\", \"42\"]]],\r\n\t[\"punctuation\", \"-\"], [\"code\", [[\"number\", \"42\"]]],\r\n\t[\"punctuation\", \"=\"], [\"code\", [[\"number\", \"42\"]]],\r\n\t[\"punctuation\", \"&=\"], [\"code\", [[\"number\", \"42\"]]],\r\n\t[\"punctuation\", \"!=\"], [\"code\", [[\"number\", \"42\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line code."
  },
  {
    "path": "tests/languages/haml/doctype_feature.test",
    "content": "!!!\r\n!!! 5\r\n!!! Strict\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"doctype\", \"!!!\"],\r\n\t[\"doctype\", \"!!! 5\"],\r\n\t[\"doctype\", \"!!! Strict\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for doctypes.\r\n"
  },
  {
    "path": "tests/languages/haml/filter_feature.test",
    "content": ":some-language\n\tsome code\n\n~\n\t:some-language\n\t\tsome code\n\n----------------------------------------------------\n\n[\n\t[\"filter\", [\n\t\t[\"filter-name\", \":some-language\"],\n\t\t\"\\r\\n\\tsome code\\r\\n\\r\"\n\t]],\n\t[\"punctuation\", \"~\"],\n\t[\"filter\", [\n\t\t[\"filter-name\", \":some-language\"],\n\t\t\"\\r\\n\\t\\tsome code\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/haml/interpolation_feature.test",
    "content": "#{ 42 }\r\n#{ \"foobar\" }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"interpolation\", [\r\n\t\t[\"delimiter\", \"#{\"],\r\n\t\t[\"ruby\", [\r\n\t\t\t[\"number\", \"42\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"interpolation\", [\r\n\t\t[\"delimiter\", \"#{\"],\r\n\t\t[\"ruby\", [\r\n\t\t\t[\"string-literal\", [\r\n\t\t\t\t[\"string\", \"\\\"foobar\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for interpolation in plain text.\r\n"
  },
  {
    "path": "tests/languages/haml/multiline-code_feature.test",
    "content": "\t~ 1,\r\n\t  1,\r\n\t  1\r\n~ 2 |\r\n  2 |\r\n  2 |\r\n\r\n- 3,\r\n  3,\r\n  3\r\n\t- 4 |\r\n\t  4 |\r\n\t  4 |\r\n\r\n  = 5,\r\n    5,\r\n    5\r\n= 6 |\r\n  6 |\r\n  6 |\r\n\r\n&= 7,\r\n   7,\r\n   7\r\n  &= 8 |\r\n     8 |\r\n     8 |\r\n\r\n!= 9,\r\n   9,\r\n   9\r\n!= 10 |\r\n   10 |\r\n   10 |\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"~\"], [\"multiline-code\", [[\"number\", \"1\"], [\"punctuation\", \",\"], [\"number\", \"1\"], [\"punctuation\", \",\"], [\"number\", \"1\"]]],\r\n\t[\"punctuation\", \"~\"], [\"multiline-code\", [[\"number\", \"2\"], [\"operator\", \"|\"], [\"number\", \"2\"], [\"operator\", \"|\"], [\"number\", \"2\"], [\"operator\", \"|\"]]],\r\n    \r\n\t[\"punctuation\", \"-\"], [\"multiline-code\", [[\"number\", \"3\"], [\"punctuation\", \",\"], [\"number\", \"3\"], [\"punctuation\", \",\"], [\"number\", \"3\"]]],\r\n    [\"punctuation\", \"-\"], [\"multiline-code\", [[\"number\", \"4\"], [\"operator\", \"|\"], [\"number\", \"4\"], [\"operator\", \"|\"], [\"number\", \"4\"], [\"operator\", \"|\"]]],\r\n    \r\n    [\"punctuation\", \"=\"], [\"multiline-code\", [[\"number\", \"5\"], [\"punctuation\", \",\"], [\"number\", \"5\"], [\"punctuation\", \",\"], [\"number\", \"5\"]]],\r\n\t[\"punctuation\", \"=\"], [\"multiline-code\", [[\"number\", \"6\"], [\"operator\", \"|\"], [\"number\", \"6\"], [\"operator\", \"|\"], [\"number\", \"6\"], [\"operator\", \"|\"]]],\r\n\t\r\n\t[\"punctuation\", \"&=\"], [\"multiline-code\", [[\"number\", \"7\"], [\"punctuation\", \",\"], [\"number\", \"7\"], [\"punctuation\", \",\"], [\"number\", \"7\"]]],\r\n\t[\"punctuation\", \"&=\"], [\"multiline-code\", [[\"number\", \"8\"], [\"operator\", \"|\"], [\"number\", \"8\"], [\"operator\", \"|\"], [\"number\", \"8\"], [\"operator\", \"|\"]]],\r\n\t\r\n\t[\"punctuation\", \"!=\"], [\"multiline-code\", [[\"number\", \"9\"], [\"punctuation\", \",\"], [\"number\", \"9\"], [\"punctuation\", \",\"], [\"number\", \"9\"]]],\r\n\t[\"punctuation\", \"!=\"], [\"multiline-code\", [[\"number\", \"10\"], [\"operator\", \"|\"], [\"number\", \"10\"], [\"operator\", \"|\"], [\"number\", \"10\"], [\"operator\", \"|\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for inline code, with all possible prefixes, some not indented, some\r\nindented with two spaces, some indented with one tab."
  },
  {
    "path": "tests/languages/haml/multiline-comment_feature.test",
    "content": "/\r\n\r\n/ foo\r\n\r\n/foo\r\n bar\r\n\r\n  /foo\r\n   bar\r\n\r\n\t/foo\r\n\t bar\r\n\r\n-#\r\n\r\n-# foo\r\n\r\n-#foo\r\n bar\r\n\r\n  -#foo\r\n   bar\r\n\r\n\t-#foo\r\n\t bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"multiline-comment\", \"/\"],\r\n\t[\"multiline-comment\", \"/ foo\"],\r\n\t[\"multiline-comment\", \"/foo\\r\\n bar\"],\r\n\t[\"multiline-comment\", \"/foo\\r\\n   bar\"],\r\n\t[\"multiline-comment\", \"/foo\\r\\n\\t bar\"],\r\n\r\n\t[\"multiline-comment\", \"-#\"],\r\n    [\"multiline-comment\", \"-# foo\"],\r\n    [\"multiline-comment\", \"-#foo\\r\\n bar\"],\r\n    [\"multiline-comment\", \"-#foo\\r\\n   bar\"],\r\n    [\"multiline-comment\", \"-#foo\\r\\n\\t bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for multi-line comments, not indented, indented with two spaces and\r\nindented with one tab."
  },
  {
    "path": "tests/languages/haml/tag_feature.test",
    "content": "%one\r\n\t%two\r\n\r\n%div#things\r\n%div.articles\r\n%div.article.title\r\n\r\n%script{:type => \"text/javascript\",\r\n        :src  => \"javascripts/script_#{42}\"}\r\n\r\n%div{:id => [@item.type, @item.number]}\r\n\r\n%a(title=@title href=href)\r\n%input(selected)\r\n\r\n%html{html_attrs('fr-fr')}\r\n\r\n%div[@user, :greeting]\r\n\t%bar[290]/\r\n\r\n%div#Article.article.entry{:id => @article.number}\r\n\r\n#collection\r\n\t.item\r\n\r\n%br/\r\n%blockquote<\r\n%img>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\"%one\"]],\r\n\t[\"tag\", [\"%two\"]],\r\n\r\n\t[\"tag\", [\"%div#things\"]],\r\n\t[\"tag\", [\"%div.articles\"]],\r\n\t[\"tag\", [\"%div.article.title\"]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"%script\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"symbol\", \":type\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t[\"string-literal\", [\r\n\t\t\t\t[\"string\", \"\\\"text/javascript\\\"\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"symbol\", \":src\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t[\"string-literal\", [\r\n\t\t\t\t[\"string\", \"\\\"javascripts/script_\"],\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t\t\t]],\r\n\t\t\t\t\t[\"delimiter\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"string\", \"\\\"\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"%div\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"symbol\", \":id\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"@item\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"type\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"variable\", \"@item\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"number\",\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"%a\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"attr-name\", \"title\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"attr-value\", \"@title\"],\r\n\t\t\t[\"attr-name\", \"href\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"attr-value\", \"href\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t\"%input\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"attr-name\", \"selected\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"%html\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"html_attrs\",\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string-literal\", [\r\n\t\t\t\t[\"string\", \"'fr-fr'\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"%div\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"@user\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"symbol\", \":greeting\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t\"%bar\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"290\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t\"/\"\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"%div#Article.article.entry\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"symbol\", \":id\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t[\"variable\", \"@article\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"number\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"tag\", [\"#collection\"]],\r\n\t[\"tag\", [\".item\"]],\r\n\r\n\t[\"tag\", [\"%br/\"]],\r\n\t[\"tag\", [\r\n\t\t\"%blockquote\",\r\n\t\t[\"punctuation\", \"<\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t\"%img\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags: basic element names, attributes, html-style attributes,\r\nattribute methods, boolean attributes, class and id shortcuts,\r\nimplicit div elements, empty tags and whitespace removal.\r\n"
  },
  {
    "path": "tests/languages/handlebars/block_feature.test",
    "content": "{{#each comments}}{{/each}}\r\n{{~#if isActive~}}{{~/if~}}\r\n{{#let a as |b|}}{{/let}}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"handlebars\",[\r\n\t\t[\"delimiter\",\"{{\"],[\"block\",\"#each\"],[\"variable\",\"comments\"],[\"delimiter\",\"}}\"]]\r\n\t],\r\n\t[\"handlebars\",[\r\n\t\t[\"delimiter\",\"{{\"],[\"block\",\"/each\"],[\"delimiter\",\"}}\"]]\r\n\t],\r\n\t[\"handlebars\",[\r\n\t\t[\"delimiter\",\"{{\"],[\"punctuation\",\"~\"],[\"block\",\"#if\"],[\"variable\",\"isActive\"],[\"punctuation\",\"~\"],[\"delimiter\",\"}}\"]]\r\n\t],\r\n\t[\"handlebars\",[\r\n\t\t[\"delimiter\",\"{{\"],[\"punctuation\",\"~\"],[\"block\",\"/if\"],[\"punctuation\",\"~\"],[\"delimiter\",\"}}\"]]\r\n\t],\r\n\t[\"handlebars\",[\r\n\t\t[\"delimiter\",\"{{\"],[\"block\",\"#let\"],[\"variable\",\"a\"],[\"variable\",\"as\"],[\"punctuation\",\"|\"],[\"variable\",\"b\"],[\"punctuation\",\"|\"],[\"delimiter\",\"}}\"]]\r\n\t],\r\n\t[\"handlebars\",[\r\n\t\t[\"delimiter\",\"{{\"],[\"block\",\"/let\"],[\"delimiter\",\"}}\"]]\r\n\t]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for block helpers."
  },
  {
    "path": "tests/languages/handlebars/boolean_feature.test",
    "content": "{{ true }}\r\n{{{ false }}}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"], [\"boolean\", \"true\"], [\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{{\"], [\"boolean\", \"false\"], [\"delimiter\", \"}}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all booleans."
  },
  {
    "path": "tests/languages/handlebars/comment_feature.test",
    "content": "{{! foobar}}\r\n{{!-- foo bar baz --}}\r\n{{! foo\r\nbar }}\r\n{{!-- foo\r\nbar --}}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"handlebars\", [[\"comment\", \"{{! foobar}}\"]]],\r\n\t[\"handlebars\", [[\"comment\", \"{{!-- foo bar baz --}}\"]]],\r\n\t[\"handlebars\", [[\"comment\", \"{{! foo\\r\\nbar }}\"]]],\r\n\t[\"handlebars\", [[\"comment\", \"{{!-- foo\\r\\nbar --}}\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/handlebars/handlebars_in_html_feature.test",
    "content": "{{aUserModel.name}}\r\n<div>{{listOfUsers.firstObject.name}}</div>\r\n{{if name \"I have a name\" \"I have no name\"}}\r\n<span data-has-name={{if name true}}></span>\r\n<div {{on \"click\" this.hello}} />\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"aUserModel\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"name\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"listOfUsers\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"firstObject\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"name\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"variable\", \"if\"],\r\n\t\t[\"variable\", \"name\"],\r\n\t\t[\"string\", \"\\\"I have a name\\\"\"],\r\n\t\t[\"string\", \"\\\"I have no name\\\"\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"span\"]],\r\n\t\t[\"attr-name\", [\"data-has-name\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"handlebars\", [\r\n\t\t\t\t[\"delimiter\", \"{{\"],\r\n\t\t\t\t[\"variable\", \"if\"],\r\n\t\t\t\t[\"variable\", \"name\"],\r\n\t\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t\t[\"delimiter\", \"}}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"span\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\r\n\t\t\t[\"handlebars\", [\r\n\t\t\t\t[\"delimiter\", \"{{\"],\r\n\t\t\t\t[\"variable\", \"on\"],\r\n\t\t\t\t[\"string\", \"\\\"click\\\"\"],\r\n\t\t\t\t[\"variable\", \"this\"],\r\n\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t[\"variable\", \"hello\"],\r\n\t\t\t\t[\"delimiter\", \"}}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for handlebars filter in Html.\r\n"
  },
  {
    "path": "tests/languages/handlebars/handlebars_in_markup_feature.test",
    "content": "<div>{{{intro}}}</div>\r\n<div class=\"{{foo}}\">\r\n___HANDLEBARS1___{{{intro}}}\r\n{{!<div></div>}}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{{\"],\r\n\t\t[\"variable\", \"intro\"],\r\n\t\t[\"delimiter\", \"}}}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"handlebars\", [\r\n\t\t\t\t[\"delimiter\", \"{{\"],\r\n\t\t\t\t[\"variable\", \"foo\"],\r\n\t\t\t\t[\"delimiter\", \"}}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n___HANDLEBARS1___\",\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{{\"],\r\n\t\t[\"variable\", \"intro\"],\r\n\t\t[\"delimiter\", \"}}}\"]\r\n\t]],\r\n\r\n\t[\"handlebars\", [\r\n\t\t[\"comment\", \"{{!<div></div>}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Handlebars in Markup.\r\n"
  },
  {
    "path": "tests/languages/handlebars/number_feature.test",
    "content": "{{ 0xBadFace }}\r\n{{{ 42 }}}\r\n{{{ 4e2 }}}\r\n{{ 3.5e+1 }}\r\n{{ 0.15e-9 }}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"], [\"number\", \"0xBadFace\"], [\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{{\"], [\"number\", \"42\"], [\"delimiter\", \"}}}\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{{\"], [\"number\", \"4e2\"], [\"delimiter\", \"}}}\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"], [\"number\", \"3.5e+1\"], [\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"], [\"number\", \"0.15e-9\"], [\"delimiter\", \"}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal and hexadecimal numbers."
  },
  {
    "path": "tests/languages/handlebars/punctuation_feature.test",
    "content": "{{~#if isActive~}}{{~/if~}}\r\n{{:slot-name}}\r\n----------------------------------------------------\r\n\t\r\n[\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"block\", \"#if\"],\r\n\t\t[\"variable\", \"isActive\"],\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"block\", \"/if\"],\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"variable\", \"slot-name\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for punctuation."
  },
  {
    "path": "tests/languages/handlebars/string_feature.test",
    "content": "{{ \"\" }}\r\n{{{''}}}\r\n{{{\"foobar\"}}}\r\n{{ 'foobar' }}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"], [\"string\", \"\\\"\\\"\"], [\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{{\"], [\"string\", \"''\"], [\"delimiter\", \"}}}\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{{\"], [\"string\", \"\\\"foobar\\\"\"], [\"delimiter\", \"}}}\"]\r\n\t]],\r\n\t[\"handlebars\", [\r\n\t\t[\"delimiter\", \"{{\"], [\"string\", \"'foobar'\"], [\"delimiter\", \"}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings"
  },
  {
    "path": "tests/languages/handlebars/variable_feature.test",
    "content": "{{comments}}\r\n{{@comments}}\r\n{{this.comments}}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"handlebars\",[\r\n\t\t[\"delimiter\",\"{{\"],[\"variable\",\"comments\"],[\"delimiter\",\"}}\"]]\r\n\t],\r\n\t[\"handlebars\",[\r\n\t\t[\"delimiter\",\"{{\"],[\"punctuation\",\"@\"],[\"variable\",\"comments\"],[\"delimiter\",\"}}\"]]\r\n\t],\r\n\t[\"handlebars\",[\r\n\t\t[\"delimiter\",\"{{\"],[\"variable\",\"this\"],[\"punctuation\",\".\"],[\"variable\",\"comments\"],[\"delimiter\",\"}}\"]]\r\n\t]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variable."
  },
  {
    "path": "tests/languages/handlebars+pug/handlebars_inclusion.test",
    "content": ":handlebars\r\n\t{{!comment}}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-handlebars\", [\r\n\t\t[\"filter-name\", \":handlebars\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"handlebars\", [\r\n\t\t\t\t[\"comment\", \"{{!comment}}\"]\r\n\t\t\t]]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for handlebars filter in pug.\r\n"
  },
  {
    "path": "tests/languages/haskell/builtin_feature.test",
    "content": "abs acos acosh all and\r\nany appendFile approxRational\r\nasTypeOf asin asinh atan\r\natan2 atanh basicIORun break\r\ncatch ceiling chr compare\r\nconcat concatMap const\r\ncos cosh curry cycle\r\ndecodeFloat denominator\r\ndigitToInt div divMod\r\ndrop dropWhile either\r\nelem encodeFloat enumFrom\r\nenumFromThen enumFromThenTo\r\nenumFromTo error even exp\r\nexponent fail filter flip\r\nfloatDigits floatRadix\r\nfloatRange floor fmap\r\nfoldl foldl1 foldr foldr1\r\nfromDouble fromEnum fromInt\r\nfromInteger fromIntegral\r\nfromRational fst gcd\r\ngetChar getContents getLine\r\ngroup head id inRange index\r\ninit intToDigit interact\r\nioError isAlpha isAlphaNum\r\nisAscii isControl isDenormalized\r\nisDigit isHexDigit isIEEE\r\nisInfinite isLower isNaN\r\nisNegativeZero isOctDigit\r\nisPrint isSpace isUpper iterate\r\nlast lcm length lex\r\nlexDigits lexLitChar lines\r\nlog logBase lookup map\r\nmapM mapM_ max maxBound\r\nmaximum maybe min minBound\r\nminimum mod negate not\r\nnotElem null numerator odd\r\nor ord otherwise pack pi\r\npred primExitWith print\r\nproduct properFraction\r\nputChar putStr putStrLn quot\r\nquotRem range rangeSize read\r\nreadDec readFile readFloat readHex\r\nreadIO readInt readList\r\nreadLitChar readLn readOct\r\nreadParen readSigned reads\r\nreadsPrec realToFrac recip\r\nrem repeat replicate return\r\nreverse round scaleFloat\r\nscanl scanl1 scanr scanr1\r\nseq sequence sequence_ show\r\nshowChar showInt showList\r\nshowLitChar showParen showSigned\r\nshowString shows showsPrec\r\nsignificand signum sin sinh\r\nsnd sort span splitAt sqrt\r\nsubtract succ sum tail take\r\ntakeWhile tan tanh threadToIOResult\r\ntoEnum toInt toInteger\r\ntoLower toRational toUpper\r\ntruncate uncurry undefined\r\nunlines until unwords\r\nunzip unzip3 userError words\r\nwriteFile zip zip3 zipWith\r\nzipWith3\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"abs\"], [\"builtin\", \"acos\"], [\"builtin\", \"acosh\"], [\"builtin\", \"all\"], [\"builtin\", \"and\"],\r\n\t[\"builtin\", \"any\"], [\"builtin\", \"appendFile\"], [\"builtin\", \"approxRational\"],\r\n\t[\"builtin\", \"asTypeOf\"], [\"builtin\", \"asin\"], [\"builtin\", \"asinh\"], [\"builtin\", \"atan\"],\r\n\t[\"builtin\", \"atan2\"], [\"builtin\", \"atanh\"], [\"builtin\", \"basicIORun\"], [\"builtin\", \"break\"],\r\n\t[\"builtin\", \"catch\"], [\"builtin\", \"ceiling\"], [\"builtin\", \"chr\"], [\"builtin\", \"compare\"],\r\n\t[\"builtin\", \"concat\"], [\"builtin\", \"concatMap\"], [\"builtin\", \"const\"],\r\n\t[\"builtin\", \"cos\"], [\"builtin\", \"cosh\"], [\"builtin\", \"curry\"], [\"builtin\", \"cycle\"],\r\n\t[\"builtin\", \"decodeFloat\"], [\"builtin\", \"denominator\"],\r\n\t[\"builtin\", \"digitToInt\"], [\"builtin\", \"div\"], [\"builtin\", \"divMod\"],\r\n\t[\"builtin\", \"drop\"], [\"builtin\", \"dropWhile\"], [\"builtin\", \"either\"],\r\n\t[\"builtin\", \"elem\"], [\"builtin\", \"encodeFloat\"], [\"builtin\", \"enumFrom\"],\r\n\t[\"builtin\", \"enumFromThen\"], [\"builtin\", \"enumFromThenTo\"],\r\n\t[\"builtin\", \"enumFromTo\"], [\"builtin\", \"error\"], [\"builtin\", \"even\"], [\"builtin\", \"exp\"],\r\n\t[\"builtin\", \"exponent\"], [\"builtin\", \"fail\"], [\"builtin\", \"filter\"], [\"builtin\", \"flip\"],\r\n\t[\"builtin\", \"floatDigits\"], [\"builtin\", \"floatRadix\"],\r\n\t[\"builtin\", \"floatRange\"], [\"builtin\", \"floor\"], [\"builtin\", \"fmap\"],\r\n\t[\"builtin\", \"foldl\"], [\"builtin\", \"foldl1\"], [\"builtin\", \"foldr\"], [\"builtin\", \"foldr1\"],\r\n\t[\"builtin\", \"fromDouble\"], [\"builtin\", \"fromEnum\"], [\"builtin\", \"fromInt\"],\r\n\t[\"builtin\", \"fromInteger\"], [\"builtin\", \"fromIntegral\"],\r\n\t[\"builtin\", \"fromRational\"], [\"builtin\", \"fst\"], [\"builtin\", \"gcd\"],\r\n\t[\"builtin\", \"getChar\"], [\"builtin\", \"getContents\"], [\"builtin\", \"getLine\"],\r\n\t[\"builtin\", \"group\"], [\"builtin\", \"head\"], [\"builtin\", \"id\"], [\"builtin\", \"inRange\"], [\"builtin\", \"index\"],\r\n\t[\"builtin\", \"init\"], [\"builtin\", \"intToDigit\"], [\"builtin\", \"interact\"],\r\n\t[\"builtin\", \"ioError\"], [\"builtin\", \"isAlpha\"], [\"builtin\", \"isAlphaNum\"],\r\n\t[\"builtin\", \"isAscii\"], [\"builtin\", \"isControl\"], [\"builtin\", \"isDenormalized\"],\r\n\t[\"builtin\", \"isDigit\"], [\"builtin\", \"isHexDigit\"], [\"builtin\", \"isIEEE\"],\r\n\t[\"builtin\", \"isInfinite\"], [\"builtin\", \"isLower\"], [\"builtin\", \"isNaN\"],\r\n\t[\"builtin\", \"isNegativeZero\"], [\"builtin\", \"isOctDigit\"],\r\n\t[\"builtin\", \"isPrint\"], [\"builtin\", \"isSpace\"], [\"builtin\", \"isUpper\"], [\"builtin\", \"iterate\"],\r\n\t[\"builtin\", \"last\"], [\"builtin\", \"lcm\"], [\"builtin\", \"length\"], [\"builtin\", \"lex\"],\r\n\t[\"builtin\", \"lexDigits\"], [\"builtin\", \"lexLitChar\"], [\"builtin\", \"lines\"],\r\n\t[\"builtin\", \"log\"], [\"builtin\", \"logBase\"], [\"builtin\", \"lookup\"], [\"builtin\", \"map\"],\r\n\t[\"builtin\", \"mapM\"], [\"builtin\", \"mapM_\"], [\"builtin\", \"max\"], [\"builtin\", \"maxBound\"],\r\n\t[\"builtin\", \"maximum\"], [\"builtin\", \"maybe\"], [\"builtin\", \"min\"], [\"builtin\", \"minBound\"],\r\n\t[\"builtin\", \"minimum\"], [\"builtin\", \"mod\"], [\"builtin\", \"negate\"], [\"builtin\", \"not\"],\r\n\t[\"builtin\", \"notElem\"], [\"builtin\", \"null\"], [\"builtin\", \"numerator\"], [\"builtin\", \"odd\"],\r\n\t[\"builtin\", \"or\"], [\"builtin\", \"ord\"], [\"builtin\", \"otherwise\"], [\"builtin\", \"pack\"], [\"builtin\", \"pi\"],\r\n\t[\"builtin\", \"pred\"], [\"builtin\", \"primExitWith\"], [\"builtin\", \"print\"],\r\n\t[\"builtin\", \"product\"], [\"builtin\", \"properFraction\"],\r\n\t[\"builtin\", \"putChar\"], [\"builtin\", \"putStr\"], [\"builtin\", \"putStrLn\"], [\"builtin\", \"quot\"],\r\n\t[\"builtin\", \"quotRem\"], [\"builtin\", \"range\"], [\"builtin\", \"rangeSize\"], [\"builtin\", \"read\"],\r\n\t[\"builtin\", \"readDec\"], [\"builtin\", \"readFile\"], [\"builtin\", \"readFloat\"], [\"builtin\", \"readHex\"],\r\n\t[\"builtin\", \"readIO\"], [\"builtin\", \"readInt\"], [\"builtin\", \"readList\"],\r\n\t[\"builtin\", \"readLitChar\"], [\"builtin\", \"readLn\"], [\"builtin\", \"readOct\"],\r\n\t[\"builtin\", \"readParen\"], [\"builtin\", \"readSigned\"], [\"builtin\", \"reads\"],\r\n\t[\"builtin\", \"readsPrec\"], [\"builtin\", \"realToFrac\"], [\"builtin\", \"recip\"],\r\n\t[\"builtin\", \"rem\"], [\"builtin\", \"repeat\"], [\"builtin\", \"replicate\"], [\"builtin\", \"return\"],\r\n\t[\"builtin\", \"reverse\"], [\"builtin\", \"round\"], [\"builtin\", \"scaleFloat\"],\r\n\t[\"builtin\", \"scanl\"], [\"builtin\", \"scanl1\"], [\"builtin\", \"scanr\"], [\"builtin\", \"scanr1\"],\r\n\t[\"builtin\", \"seq\"], [\"builtin\", \"sequence\"], [\"builtin\", \"sequence_\"], [\"builtin\", \"show\"],\r\n\t[\"builtin\", \"showChar\"], [\"builtin\", \"showInt\"], [\"builtin\", \"showList\"],\r\n\t[\"builtin\", \"showLitChar\"], [\"builtin\", \"showParen\"], [\"builtin\", \"showSigned\"],\r\n\t[\"builtin\", \"showString\"], [\"builtin\", \"shows\"], [\"builtin\", \"showsPrec\"],\r\n\t[\"builtin\", \"significand\"], [\"builtin\", \"signum\"], [\"builtin\", \"sin\"], [\"builtin\", \"sinh\"],\r\n\t[\"builtin\", \"snd\"], [\"builtin\", \"sort\"], [\"builtin\", \"span\"], [\"builtin\", \"splitAt\"], [\"builtin\", \"sqrt\"],\r\n\t[\"builtin\", \"subtract\"], [\"builtin\", \"succ\"], [\"builtin\", \"sum\"], [\"builtin\", \"tail\"], [\"builtin\", \"take\"],\r\n\t[\"builtin\", \"takeWhile\"], [\"builtin\", \"tan\"], [\"builtin\", \"tanh\"], [\"builtin\", \"threadToIOResult\"],\r\n\t[\"builtin\", \"toEnum\"], [\"builtin\", \"toInt\"], [\"builtin\", \"toInteger\"],\r\n\t[\"builtin\", \"toLower\"], [\"builtin\", \"toRational\"], [\"builtin\", \"toUpper\"],\r\n\t[\"builtin\", \"truncate\"], [\"builtin\", \"uncurry\"], [\"builtin\", \"undefined\"],\r\n\t[\"builtin\", \"unlines\"], [\"builtin\", \"until\"], [\"builtin\", \"unwords\"],\r\n\t[\"builtin\", \"unzip\"], [\"builtin\", \"unzip3\"], [\"builtin\", \"userError\"], [\"builtin\", \"words\"],\r\n\t[\"builtin\", \"writeFile\"], [\"builtin\", \"zip\"], [\"builtin\", \"zip3\"], [\"builtin\", \"zipWith\"],\r\n\t[\"builtin\", \"zipWith3\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all builtin."
  },
  {
    "path": "tests/languages/haskell/char_feature.test",
    "content": "'a'\r\n'\\n'\r\n'\\23'\r\n'\\xFE'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"char\", \"'a'\"],\r\n\t[\"char\", \"'\\\\n'\"],\r\n\t[\"char\", \"'\\\\23'\"],\r\n\t[\"char\", \"'\\\\xFE'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for chars."
  },
  {
    "path": "tests/languages/haskell/comment_feature.test",
    "content": "--\r\n-- foo\r\n{- foo\r\nbar -}\r\n{--}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"--\"],\r\n\t[\"comment\", \"-- foo\"],\r\n\t[\"comment\", \"{- foo\\r\\nbar -}\"],\r\n\t[\"comment\", \"{--}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments.\r\n"
  },
  {
    "path": "tests/languages/haskell/constant_feature.test",
    "content": "Foo\r\nFoo'\r\nFoo.Bar\r\nBaz.Foobar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", [\"Foo\"]],\r\n\t[\"constant\", [\"Foo'\"]],\r\n\t[\"constant\", [\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Bar\"\r\n\t]],\r\n\t[\"constant\", [\r\n\t\t\"Baz\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Foobar_42\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants.\r\n"
  },
  {
    "path": "tests/languages/haskell/hvariable_feature.test",
    "content": "foo\r\nfoo'\r\nFoo.bar\r\nBaz.foobar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"hvariable\", [\"foo\"]],\r\n\t[\"hvariable\", [\"foo'\"]],\r\n\t[\"hvariable\", [\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"bar\"\r\n\t]],\r\n\t[\"hvariable\", [\r\n\t\t\"Baz\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"foobar_42\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hvariables.\r\n"
  },
  {
    "path": "tests/languages/haskell/import_statement_feature.test",
    "content": "import Foo\r\nimport qualified Foobar\r\nimport Foo_42.Bar as Foobar\r\nimport Foo.Bar as Foo.Baz hiding\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" Foo\"\r\n\t]],\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t[\"keyword\", \"qualified\"],\r\n\t\t\" Foobar\"\r\n\t]],\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" Foo_42\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Bar \",\r\n\t\t[\"keyword\", \"as\"],\r\n\t\t\" Foobar\"\r\n\t]],\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" Foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Bar \",\r\n\t\t[\"keyword\", \"as\"],\r\n\t\t\" Foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Baz \",\r\n\t\t[\"keyword\", \"hiding\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for import statement.\r\n"
  },
  {
    "path": "tests/languages/haskell/keyword_feature.test",
    "content": "case class data deriving\r\ndo else if in infixl\r\ninfixr instance let\r\nmodule newtype of\r\nprimitive then type where\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"case\"], [\"keyword\", \"class\"], [\"keyword\", \"data\"], [\"keyword\", \"deriving\"],\r\n\t[\"keyword\", \"do\"], [\"keyword\", \"else\"], [\"keyword\", \"if\"], [\"keyword\", \"in\"], [\"keyword\", \"infixl\"],\r\n\t[\"keyword\", \"infixr\"], [\"keyword\", \"instance\"], [\"keyword\", \"let\"],\r\n\t[\"keyword\", \"module\"], [\"keyword\", \"newtype\"], [\"keyword\", \"of\"],\r\n\t[\"keyword\", \"primitive\"], [\"keyword\", \"then\"], [\"keyword\", \"type\"], [\"keyword\", \"where\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/haskell/number_feature.test",
    "content": "42\r\n3.14159\r\n2E3\r\n1.2e-4\r\n0.9e+1\r\n0o47\r\n0xBadFace\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2E3\"],\r\n\t[\"number\", \"1.2e-4\"],\r\n\t[\"number\", \"0.9e+1\"],\r\n\t[\"number\", \"0o47\"],\r\n\t[\"number\", \"0xBadFace\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal, octal and hexadecimal numbers."
  },
  {
    "path": "tests/languages/haskell/operator_feature.test",
    "content": "..\r\nreverse . sort\r\n`foo`\r\n`Foo.bar`\r\n+ - * /\r\n^ ^^ **\r\n&& ||\r\n< <= == /=\r\n>= > \\ |\r\n++ : !!\r\n\\\\ <- ->\r\n= :: =>\r\n>> >>= >@>\r\n~ ! @\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"..\"],\r\n\r\n\t[\"builtin\", \"reverse\"],\r\n\t[\"operator\", \".\"],\r\n\t[\"builtin\", \"sort\"],\r\n\r\n\t[\"operator\", \"`foo`\"],\r\n\r\n\t[\"operator\", \"`Foo.bar`\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"^^\"],\r\n\t[\"operator\", \"**\"],\r\n\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"/=\"],\r\n\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"\\\\\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"!!\"],\r\n\r\n\t[\"operator\", \"\\\\\\\\\"],\r\n\t[\"operator\", \"<-\"],\r\n\t[\"operator\", \"->\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"operator\", \"=>\"],\r\n\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \">@>\"],\r\n\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/haskell/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n\"foo \\\r\n  \\ bar\"\r\n\"foo -- comment \\\r\n  \\ bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"\\\"foo \\\\\\r\\n  \\\\ bar\\\"\"],\r\n\t[\"string\", \"\\\"foo -- comment \\\\\\r\\n  \\\\ bar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/haxe/class-name_feature.test",
    "content": "class Main {}\n\ntypedef Player = { name: String, move: Move }\n\nenum Move { Rock; Paper; Scissors; }\n\nabstract MyAbstractInt(Int) from Int to Int {\n  @:op(A > B) static function gt(a:MyAbstractInt, b:MyAbstractInt):Bool;\n}\n\nnew A();\n\nvar b:B = a;\n\nclass Game {\n  // Haxe applications have a static entry point called main\n  static function main() {\n    // Anonymous structures.\n    var playerA = { name: \"Simon\", move: Paper }\n    var playerB = { name: \"Nicolas\", move: Rock }\n\n    // Array pattern matching. A switch can return a value.\n    var result = switch [playerA.move, playerB.move] {\n      case [Rock, Scissors] |\n           [Paper, Rock] |\n           [Scissors, Paper]: Winner(playerA);\n\n      case [Rock, Paper] |\n           [Paper, Scissors] |\n           [Scissors, Rock]: Winner(playerB);\n\n      case _: Draw;\n    }\n    // Paper vs Rock, who wins?\n    trace('result: $result');\n  }\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"Main\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"typedef\"],\n\t[\"class-name\", \"Player\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\t\" name\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"String\"],\n\t[\"punctuation\", \",\"],\n\t\" move\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Move\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"enum\"],\n\t[\"class-name\", \"Move\"],\n\t[\"punctuation\", \"{\"],\n\t[\"class-name\", \"Rock\"],\n\t[\"punctuation\", \";\"],\n\t[\"class-name\", \"Paper\"],\n\t[\"punctuation\", \";\"],\n\t[\"class-name\", \"Scissors\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"abstract\"],\n\t[\"class-name\", \"MyAbstractInt\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", \"Int\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"from\"],\n\t[\"class-name\", \"Int\"],\n\t[\"keyword\", \"to\"],\n\t[\"class-name\", \"Int\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"metadata\", \"@:op\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", \"A\"],\n\t[\"operator\", \">\"],\n\t[\"class-name\", \"B\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"function\"],\n\t[\"function\", \"gt\"],\n\t[\"punctuation\", \"(\"],\n\t\"a\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"MyAbstractInt\"],\n\t[\"punctuation\", \",\"],\n\t\" b\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"MyAbstractInt\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Bool\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"new\"],\n\t[\"class-name\", \"A\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"var\"],\n\t\" b\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"B\"],\n\t[\"operator\", \"=\"],\n\t\" a\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"Game\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"comment\", \"// Haxe applications have a static entry point called main\"],\n\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"function\"],\n\t[\"function\", \"main\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"comment\", \"// Anonymous structures.\"],\n\n\t[\"keyword\", \"var\"],\n\t\" playerA \",\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\t\" name\",\n\t[\"operator\", \":\"],\n\t[\"string\", \"\\\"Simon\\\"\"],\n\t[\"punctuation\", \",\"],\n\t\" move\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Paper\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"var\"],\n\t\" playerB \",\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\t\" name\",\n\t[\"operator\", \":\"],\n\t[\"string\", \"\\\"Nicolas\\\"\"],\n\t[\"punctuation\", \",\"],\n\t\" move\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Rock\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"comment\", \"// Array pattern matching. A switch can return a value.\"],\n\n\t[\"keyword\", \"var\"],\n\t\" result \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"switch\"],\n\t[\"punctuation\", \"[\"],\n\t\"playerA\",\n\t[\"punctuation\", \".\"],\n\t\"move\",\n\t[\"punctuation\", \",\"],\n\t\" playerB\",\n\t[\"punctuation\", \".\"],\n\t\"move\",\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"punctuation\", \"[\"],\n\t[\"class-name\", \"Rock\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"Scissors\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"|\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"class-name\", \"Paper\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"Rock\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"|\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"class-name\", \"Scissors\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"Paper\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Winner\"],\n\t[\"punctuation\", \"(\"],\n\t\"playerA\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"punctuation\", \"[\"],\n\t[\"class-name\", \"Rock\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"Paper\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"|\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"class-name\", \"Paper\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"Scissors\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"|\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"class-name\", \"Scissors\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"Rock\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Winner\"],\n\t[\"punctuation\", \"(\"],\n\t\"playerB\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t\" _\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Draw\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"comment\", \"// Paper vs Rock, who wins?\"],\n\n\t[\"function\", \"trace\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string-interpolation\", [\n\t\t[\"string\", \"'result: \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"$\"],\n\t\t\t[\"expression\", [\"result\"]]\n\t\t]],\n\t\t[\"string\", \"'\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/haxe/function_feature.test",
    "content": "foo()\nfoo  ()\nfunction identity<T>(arg:T):T {\n\treturn arg;\n}\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"function\"],\n\t[\"function\", \"identity\"],\n\t[\"operator\", \"<\"],\n\t[\"class-name\", \"T\"],\n\t[\"operator\", \">\"],\n\t[\"punctuation\", \"(\"],\n\t\"arg\",\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"T\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"T\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"return\"],\n\t\" arg\",\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/haxe/keyword_feature.test",
    "content": "abstract;\r\nas;\r\nbreak;\r\ncase;\r\ncast;\r\ncatch;\r\nclass;\r\ncontinue;\r\ndefault;\r\ndo;\r\ndynamic;\r\nelse;\r\nenum;\r\nextends;\r\nextern;\r\nfinal;\r\nfor;\r\nfrom;\r\nfunction;\r\nif;\r\nimplements;\r\nimport;\r\nin;\r\ninline;\r\ninterface;\r\nmacro;\r\nnew;\r\nnull;\r\noperator;\r\noverload;\r\noverride;\r\npackage;\r\nprivate;\r\npublic;\r\nreturn;\r\nstatic;\r\nsuper;\r\nswitch;\r\nthis;\r\nthrow;\r\nto;\r\ntry;\r\ntypedef;\r\nuntyped;\r\nusing;\r\nvar;\r\nwhile;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"as\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"case\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"cast\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"catch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"default\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dynamic\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"extern\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"final\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"from\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"function\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"import\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"inline\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"macro\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"null\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"operator\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"overload\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"override\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"package\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"private\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"public\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"super\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"this\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"throw\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"to\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"try\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"typedef\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"untyped\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"using\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"var\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/haxe/metadata_feature.test",
    "content": "@author(\"Nicolas\")\r\n@debug\r\n@:noCompletion\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"metadata\", \"@author\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\"Nicolas\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"metadata\", \"@debug\"],\r\n\r\n\t[\"metadata\", \"@:noCompletion\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for metadata.\r\n"
  },
  {
    "path": "tests/languages/haxe/number_feature.test",
    "content": "42\n0xFF42\n0.32\n3.\n2.1e5\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"42\"],\n\t[\"number\", \"0xFF42\"],\n\t[\"number\", \"0.32\"],\n\t[\"number\", \"3.\"],\n\t[\"number\", \"2.1e5\"]\n]\n"
  },
  {
    "path": "tests/languages/haxe/operator_feature.test",
    "content": "+ - * / %\r\n+= -= *= /= %=\r\n++ --\r\n\r\n== != < <= > >=\r\n! && ||\r\n\r\n& | << >> >>> ^ ~\r\n&= |= <<= >>= >>>= ^=\r\n\r\n? :\r\n\r\n=\r\n->\r\n=>\r\n...\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"--\"],\r\n\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \">>>\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"~\"],\r\n\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"|=\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \">>>=\"],\r\n\t[\"operator\", \"^=\"],\r\n\r\n\t[\"operator\", \"?\"], [\"operator\", \":\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"operator\", \"...\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/haxe/preprocessor_feature.test",
    "content": "#if\r\n#elseif\r\n#else\r\n#end\r\n\r\nclass Main {\r\n  public static function main() {\r\n    #if !debug\r\n    trace(\"ok\");\r\n    #elseif (debug_level > 3)\r\n    trace(3);\r\n    #else\r\n    trace(\"debug level too low\");\r\n    #end\r\n  }\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"preprocessor\", \"#if\"],\r\n\t[\"preprocessor\", \"#elseif\"],\r\n\t[\"preprocessor\", \"#else\"],\r\n\t[\"preprocessor\", \"#end\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", \"Main\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"main\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"preprocessor\", \"#if !debug\"],\r\n\r\n\t[\"function\", \"trace\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\"ok\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"preprocessor\", \"#elseif (debug_level > 3)\"],\r\n\r\n\t[\"function\", \"trace\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"preprocessor\", \"#else\"],\r\n\r\n\t[\"function\", \"trace\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\"debug level too low\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"preprocessor\", \"#end\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for preprocessor directives.\r\n"
  },
  {
    "path": "tests/languages/haxe/punctuation_feature.test",
    "content": "( ) [ ] { }\n, ; .\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"]\n]\n"
  },
  {
    "path": "tests/languages/haxe/regex_feature.test",
    "content": "~/ha\\/xe/i\r\n~/[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z][A-Z][A-Z]?/i\r\n~/(dog|fox)/igmsu\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"~/\"],\r\n\t\t[\"regex-source\", \"ha\\\\/xe\"],\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-flags\", \"i\"]\r\n\t]],\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"~/\"],\r\n\t\t[\"regex-source\", \"[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z][A-Z][A-Z]?\"],\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-flags\", \"i\"]\r\n\t]],\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"~/\"],\r\n\t\t[\"regex-source\", \"(dog|fox)\"],\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-flags\", \"igmsu\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for regexes.\r\n"
  },
  {
    "path": "tests/languages/haxe/reification_feature.test",
    "content": "$e\r\n${4+2}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"reification\", \"$e\"],\r\n\t[\"reification\", \"$\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"number\", \"4\"], [\"operator\", \"+\"], [\"number\", \"2\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for reification."
  },
  {
    "path": "tests/languages/haxe/string_feature.test",
    "content": "\"\"\r\n\"Foo\r\n\\\"bar\\\"\r\nbaz\"\r\n''\r\n'Foo\r\n\\'bar\\'\r\nbaz'\r\n'$bar ${4+2}'\r\n'The sum of $x and 3 is ${x + 3}'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Foo\\r\\n\\\\\\\"bar\\\\\\\"\\r\\nbaz\\\"\"],\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"''\"]\r\n\t]],\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"'Foo\\r\\n\\\\'bar\\\\'\\r\\nbaz'\"]\r\n\t]],\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"'\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"$\"],\r\n\t\t\t[\"expression\", [\"bar\"]]\r\n\t\t]],\r\n\t\t[\"string\", \" \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t[\"number\", \"4\"],\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"number\", \"2\"]\r\n\t\t\t]],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"'\"]\r\n\t]],\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"'The sum of \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"$\"],\r\n\t\t\t[\"expression\", [\"x\"]]\r\n\t\t]],\r\n\t\t[\"string\", \" and 3 is \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t\"x \",\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"number\", \"3\"]\r\n\t\t\t]],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"'\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and string interpolation.\r\n"
  },
  {
    "path": "tests/languages/haxe!+regex/regex_inclusion.test",
    "content": "~/ha\\/xe/i\n~/[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z][A-Z][A-Z]?/i\n~/(dog|fox)/igmsu\n\n----------------------------------------------------\n\n[\n\t[\"regex\", [\n\t\t[\"regex-delimiter\", \"~/\"],\n\t\t[\"regex-source\", [\n\t\t\t\"ha\",\n\t\t\t[\"escape\", \"\\\\/\"],\n\t\t\t\"xe\"\n\t\t]],\n\t\t[\"regex-delimiter\", \"/\"],\n\t\t[\"regex-flags\", \"i\"]\n\t]],\n\t[\"regex\", [\n\t\t[\"regex-delimiter\", \"~/\"],\n\t\t[\"regex-source\", [\n\t\t\t[\"char-class\", [\n\t\t\t\t[\"char-class-punctuation\", \"[\"],\n\t\t\t\t[\"range\", [\n\t\t\t\t\t\"A\",\n\t\t\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\t\t\"Z\"\n\t\t\t\t]],\n\t\t\t\t[\"range\", [\n\t\t\t\t\t\"0\",\n\t\t\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\t\t\"9\"\n\t\t\t\t]],\n\t\t\t\t\"._%-\",\n\t\t\t\t[\"char-class-punctuation\", \"]\"]\n\t\t\t]],\n\t\t\t[\"quantifier\", \"+\"],\n\t\t\t\"@\",\n\t\t\t[\"char-class\", [\n\t\t\t\t[\"char-class-punctuation\", \"[\"],\n\t\t\t\t[\"range\", [\n\t\t\t\t\t\"A\",\n\t\t\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\t\t\"Z\"\n\t\t\t\t]],\n\t\t\t\t[\"range\", [\n\t\t\t\t\t\"0\",\n\t\t\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\t\t\"9\"\n\t\t\t\t]],\n\t\t\t\t\".-\",\n\t\t\t\t[\"char-class-punctuation\", \"]\"]\n\t\t\t]],\n\t\t\t[\"quantifier\", \"+\"],\n\t\t\t[\"char-set\", \".\"],\n\t\t\t[\"char-class\", [\n\t\t\t\t[\"char-class-punctuation\", \"[\"],\n\t\t\t\t[\"range\", [\n\t\t\t\t\t\"A\",\n\t\t\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\t\t\"Z\"\n\t\t\t\t]],\n\t\t\t\t[\"char-class-punctuation\", \"]\"]\n\t\t\t]],\n\t\t\t[\"char-class\", [\n\t\t\t\t[\"char-class-punctuation\", \"[\"],\n\t\t\t\t[\"range\", [\n\t\t\t\t\t\"A\",\n\t\t\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\t\t\"Z\"\n\t\t\t\t]],\n\t\t\t\t[\"char-class-punctuation\", \"]\"]\n\t\t\t]],\n\t\t\t[\"char-class\", [\n\t\t\t\t[\"char-class-punctuation\", \"[\"],\n\t\t\t\t[\"range\", [\n\t\t\t\t\t\"A\",\n\t\t\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\t\t\"Z\"\n\t\t\t\t]],\n\t\t\t\t[\"char-class-punctuation\", \"]\"]\n\t\t\t]],\n\t\t\t[\"quantifier\", \"?\"]\n\t\t]],\n\t\t[\"regex-delimiter\", \"/\"],\n\t\t[\"regex-flags\", \"i\"]\n\t]],\n\t[\"regex\", [\n\t\t[\"regex-delimiter\", \"~/\"],\n\t\t[\"regex-source\", [\n\t\t\t[\"group\", [\"(\"]],\n\t\t\t\"dog\",\n\t\t\t[\"alternation\", \"|\"],\n\t\t\t\"fox\",\n\t\t\t[\"group\", \")\"]\n\t\t]],\n\t\t[\"regex-delimiter\", \"/\"],\n\t\t[\"regex-flags\", \"igmsu\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/hcl/comment_feature.test",
    "content": "# foo bar\r\n// foo bar\r\n/*\r\n * multi line\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"# foo bar\"],\r\n\t[\"comment\", \"// foo bar\"],\r\n\t[\"comment\", \"/*\\r\\n * multi line\\r\\n */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/hcl/interpolation_feature.test",
    "content": "\"${data.aws_availability_zones.available.names[0]}\"\r\n\"${aws_db_subnet_group.default.id}\"\r\n\"${var.something ? 1 : 0}\"\r\n\"${var.num ? 1.02 : 0}\"\r\n\"${length(var.hostnames)}\"\r\n\"${format(\"web-%03d\", count.index + 1)}\"\r\n\"${file(\"templates/web_init.tpl\")}\"\r\n\"${replace(var.sub_domain, \".\", \"\\\\\\\\\\\\\\\\.\")}\"\r\n\"${filepath.foo}\"\r\n\r\n// keywords\r\n\"${terraform}\"\r\n\"${var}\"\r\n\"${self}\"\r\n\"${count}\"\r\n\"${module}\"\r\n\"${path}\"\r\n\"${data}\"\r\n\"${local}\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"data\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"type\", \"aws_availability_zones\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"available\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"names\",\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"0\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"aws_db_subnet_group\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"default\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"id\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"var\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"type\", \"something\"],\r\n\t\t\t[\"punctuation\", \"?\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"number\", \"0\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"var\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"type\", \"num\"],\r\n\t\t\t[\"punctuation\", \"?\"],\r\n\t\t\t[\"number\", \"1.02\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"number\", \"0\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"function\", \"length\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"keyword\", \"var\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"type\", \"hostnames\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"function\", \"format\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"\\\"web-%03d\\\"\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"keyword\", \"count\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"type\", \"index\"],\r\n\t\t\t[\"punctuation\", \"+\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"function\", \"file\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"\\\"templates/web_init.tpl\\\"\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"function\", \"replace\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"keyword\", \"var\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"type\", \"sub_domain\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"\\\".\\\"\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\.\\\"\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"filepath\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\r\n\t[\"comment\", \"// keywords\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"terraform\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"var\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"self\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"count\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"module\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"path\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"data\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"local\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all interpolation.\r\n"
  },
  {
    "path": "tests/languages/hcl/keyword_feature.test",
    "content": "resource \"aws_db_instance\" \"main\" {\r\ndata \"terraform_remote_state\" \"main\" {\r\noutput \"dev_vpc_id\" {\r\nconfig {\r\nterraform {\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\",\r\n\t\t[\"resource \",\r\n\t\t[\"type\", \"\\\"aws_db_instance\\\"\"]]],\r\n    [\"string\", [\"\\\"main\\\"\"]],\r\n    [\"punctuation\", \"{\"],\r\n\t[\"keyword\",\r\n\t\t[\"data \",\r\n\t\t[\"type\", \"\\\"terraform_remote_state\\\"\"]]],\r\n    [\"string\", [\"\\\"main\\\"\"]],\r\n    [\"punctuation\", \"{\"],\r\n\t[\"keyword\",\r\n\t\t[\"output\",\r\n\t\t[\"type\", \" \\\"dev_vpc_id\\\" \"]]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"config\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"terraform\"],\r\n\t[\"punctuation\", \"{\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/hcl/number_feature.test",
    "content": "42\r\n1.02\r\n0x1a\r\n027\r\n1e10\r\n3.1e4\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"1.02\"],\r\n\t[\"number\", \"0x1a\"],\r\n\t[\"number\", \"027\"],\r\n\t[\"number\", \"1e10\"],\r\n\t[\"number\", \"3.1e4\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/hcl/property_feature.test",
    "content": "foo = \"bar\"\r\nc = 1e10\r\nFOO = \"bar\"\r\n\"bool\" = [false]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"foo\"],\r\n\t[\"punctuation\", \"=\"],\r\n\t[\"string\", [\"\\\"bar\\\"\"]],\r\n\t[\"property\", \"c\"],\r\n\t[\"punctuation\", \"=\"],\r\n\t[\"number\", \"1e10\"],\r\n\t[\"property\", \"FOO\"],\r\n\t[\"punctuation\", \"=\"],\r\n\t[\"string\", [\"\\\"bar\\\"\"]],\r\n\t[\"property\", \"\\\"bool\\\"\"],\r\n\t[\"punctuation\", \"=\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"boolean\", \"false\"],\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all properties."
  },
  {
    "path": "tests/languages/hcl/string_feature.test",
    "content": "\"double quoted\\\"' % string\"\r\n\"abc // what now?\"\r\nmultiline_literal = \"hello\r\n  world\"\r\nfoo = <<EOF\r\n  bar\r\n  baz\r\n  EOF\r\nbar = <<-EOF_TEXT\r\n  bar\r\n  \"baz\"\r\n  EOF_TEXT\r\nfoo = <<FOO\r\n # I'm not a comment\r\n // me neither\r\n /* this might make a good test */\r\n This string can contain FOO but not at the start of a line.\r\nFOO\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"double quoted\\\\\\\"' % string\\\"\"]],\r\n\t[\"string\", [\"\\\"abc // what now?\\\"\"]],\r\n\t[\"property\", \"multiline_literal\"],\r\n\t[\"punctuation\", \"=\"],\r\n\t[\"string\", [\"\\\"hello\\r\\n  world\\\"\"]],\r\n\t[\"property\", \"foo\"],\r\n\t[\"punctuation\", \"=\"],\r\n\t[\"heredoc\", \"<<EOF\\r\\n  bar\\r\\n  baz\\r\\n  EOF\"],\r\n\t[\"property\", \"bar\"],\r\n\t[\"punctuation\", \"=\"],\r\n\t[\"heredoc\", \"<<-EOF_TEXT\\r\\n  bar\\r\\n  \\\"baz\\\"\\r\\n  EOF_TEXT\"],\r\n\t[\"property\", \"foo\"],\r\n\t[\"punctuation\", \"=\"],\r\n\t[\"heredoc\", \"<<FOO\\r\\n # I'm not a comment\\r\\n // me neither\\r\\n /* this might make a good test */\\r\\n This string can contain FOO but not at the start of a line.\\r\\nFOO\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/hlsl/boolean_feature.test",
    "content": "false\r\ntrue\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"false\"],\r\n\t[\"boolean\", \"true\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/hlsl/class-name_feature.test",
    "content": "struct Foo {};\r\n\r\nAppendStructuredBuffer\r\nBlendState\r\nBuffer\r\nByteAddressBuffer\r\nCompileShader\r\nComputeShader\r\nConsumeStructuredBuffer\r\nDepthStencilState\r\nDepthStencilView\r\nDomainShader\r\nGeometryShader\r\nHullshader\r\nInputPatch\r\nLineStream\r\nOutputPatch\r\nPixelShader\r\nPointStream\r\nRWBuffer\r\nRWByteAddressBuffer\r\nRWStructuredBuffer\r\nRWTexture1D\r\nRWTexture1DArray\r\nRWTexture2D\r\nRWTexture2DArray\r\nRWTexture3D\r\nRasterizerState\r\nRenderTargetView\r\nSamplerComparisonState\r\nSamplerState\r\nStructuredBuffer\r\nTexture1D\r\nTexture1DArray\r\nTexture2D\r\nTexture2DArray\r\nTexture2DMS\r\nTexture2DMSArray\r\nTexture3D\r\nTextureCube\r\nTextureCubeArray\r\nTriangleStream\r\nVertexShader\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"class-name\", \"AppendStructuredBuffer\"],\r\n\t[\"class-name\", \"BlendState\"],\r\n\t[\"class-name\", \"Buffer\"],\r\n\t[\"class-name\", \"ByteAddressBuffer\"],\r\n\t[\"class-name\", \"CompileShader\"],\r\n\t[\"class-name\", \"ComputeShader\"],\r\n\t[\"class-name\", \"ConsumeStructuredBuffer\"],\r\n\t[\"class-name\", \"DepthStencilState\"],\r\n\t[\"class-name\", \"DepthStencilView\"],\r\n\t[\"class-name\", \"DomainShader\"],\r\n\t[\"class-name\", \"GeometryShader\"],\r\n\t[\"class-name\", \"Hullshader\"],\r\n\t[\"class-name\", \"InputPatch\"],\r\n\t[\"class-name\", \"LineStream\"],\r\n\t[\"class-name\", \"OutputPatch\"],\r\n\t[\"class-name\", \"PixelShader\"],\r\n\t[\"class-name\", \"PointStream\"],\r\n\t[\"class-name\", \"RWBuffer\"],\r\n\t[\"class-name\", \"RWByteAddressBuffer\"],\r\n\t[\"class-name\", \"RWStructuredBuffer\"],\r\n\t[\"class-name\", \"RWTexture1D\"],\r\n\t[\"class-name\", \"RWTexture1DArray\"],\r\n\t[\"class-name\", \"RWTexture2D\"],\r\n\t[\"class-name\", \"RWTexture2DArray\"],\r\n\t[\"class-name\", \"RWTexture3D\"],\r\n\t[\"class-name\", \"RasterizerState\"],\r\n\t[\"class-name\", \"RenderTargetView\"],\r\n\t[\"class-name\", \"SamplerComparisonState\"],\r\n\t[\"class-name\", \"SamplerState\"],\r\n\t[\"class-name\", \"StructuredBuffer\"],\r\n\t[\"class-name\", \"Texture1D\"],\r\n\t[\"class-name\", \"Texture1DArray\"],\r\n\t[\"class-name\", \"Texture2D\"],\r\n\t[\"class-name\", \"Texture2DArray\"],\r\n\t[\"class-name\", \"Texture2DMS\"],\r\n\t[\"class-name\", \"Texture2DMSArray\"],\r\n\t[\"class-name\", \"Texture3D\"],\r\n\t[\"class-name\", \"TextureCube\"],\r\n\t[\"class-name\", \"TextureCubeArray\"],\r\n\t[\"class-name\", \"TriangleStream\"],\r\n\t[\"class-name\", \"VertexShader\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names.\r\n"
  },
  {
    "path": "tests/languages/hlsl/comment_feature.test",
    "content": "// comment\r\n/**/\r\n/*\r\n comment\r\n*/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// comment\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/*\\r\\n comment\\r\\n*/\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/hlsl/keyword_feature.test",
    "content": "asm;\r\nasm_fragment;\r\nauto;\r\nbreak;\r\ncase;\r\ncatch;\r\ncbuffer;\r\ncentroid;\r\nchar;\r\nclass;\r\ncolumn_major;\r\ncompile;\r\ncompile_fragment;\r\nconst;\r\nconst_cast;\r\ncontinue;\r\ndefault;\r\ndelete;\r\ndiscard;\r\ndo;\r\ndynamic_cast;\r\nelse;\r\nenum;\r\nexplicit;\r\nexport;\r\nextern;\r\nfor;\r\nfriend;\r\nfxgroup;\r\ngoto;\r\ngroupshared;\r\nif;\r\nin;\r\ninline;\r\ninout;\r\ninterface;\r\nline;\r\nlineadj;\r\nlinear;\r\nlong;\r\nmatrix;\r\nmutable;\r\nnamespace;\r\nnew;\r\nnointerpolation;\r\nnoperspective;\r\noperator;\r\nout;\r\npackoffset;\r\npass;\r\npixelfragment;\r\npoint;\r\nprecise;\r\nprivate;\r\nprotected;\r\npublic;\r\nregister;\r\nreinterpret_cast;\r\nreturn;\r\nrow_major;\r\nsample;\r\nsampler;\r\nshared;\r\nshort;\r\nsigned;\r\nsizeof;\r\nsnorm;\r\nstateblock;\r\nstateblock_state;\r\nstatic;\r\nstatic_cast;\r\nstring;\r\nstruct;\r\nswitch;\r\ntbuffer;\r\ntechnique;\r\ntechnique10;\r\ntechnique11;\r\ntemplate;\r\ntexture;\r\nthis;\r\nthrow;\r\ntriangle;\r\ntriangleadj;\r\ntry;\r\ntypedef;\r\ntypename;\r\nuniform;\r\nunion;\r\nunorm;\r\nunsigned;\r\nusing;\r\nvector;\r\nvertexfragment;\r\nvirtual;\r\nvoid;\r\nvolatile;\r\nwhile;\r\n;\r\nbool;\r\nbool1;\r\nbool1x1;\r\nbool1x2;\r\nbool1x3;\r\nbool1x4;\r\nbool2;\r\nbool2x1;\r\nbool2x2;\r\nbool2x3;\r\nbool2x4;\r\nbool3;\r\nbool3x1;\r\nbool3x2;\r\nbool3x3;\r\nbool3x4;\r\nbool4;\r\nbool4x1;\r\nbool4x2;\r\nbool4x3;\r\nbool4x4;\r\ndouble;\r\ndouble1;\r\ndouble1x1;\r\ndouble1x2;\r\ndouble1x3;\r\ndouble1x4;\r\ndouble2;\r\ndouble2x1;\r\ndouble2x2;\r\ndouble2x3;\r\ndouble2x4;\r\ndouble3;\r\ndouble3x1;\r\ndouble3x2;\r\ndouble3x3;\r\ndouble3x4;\r\ndouble4;\r\ndouble4x1;\r\ndouble4x2;\r\ndouble4x3;\r\ndouble4x4;\r\ndword;\r\ndword1;\r\ndword1x1;\r\ndword1x2;\r\ndword1x3;\r\ndword1x4;\r\ndword2;\r\ndword2x1;\r\ndword2x2;\r\ndword2x3;\r\ndword2x4;\r\ndword3;\r\ndword3x1;\r\ndword3x2;\r\ndword3x3;\r\ndword3x4;\r\ndword4;\r\ndword4x1;\r\ndword4x2;\r\ndword4x3;\r\ndword4x4;\r\nfloat;\r\nfloat1;\r\nfloat1x1;\r\nfloat1x2;\r\nfloat1x3;\r\nfloat1x4;\r\nfloat2;\r\nfloat2x1;\r\nfloat2x2;\r\nfloat2x3;\r\nfloat2x4;\r\nfloat3;\r\nfloat3x1;\r\nfloat3x2;\r\nfloat3x3;\r\nfloat3x4;\r\nfloat4;\r\nfloat4x1;\r\nfloat4x2;\r\nfloat4x3;\r\nfloat4x4;\r\nhalf;\r\nhalf1;\r\nhalf1x1;\r\nhalf1x2;\r\nhalf1x3;\r\nhalf1x4;\r\nhalf2;\r\nhalf2x1;\r\nhalf2x2;\r\nhalf2x3;\r\nhalf2x4;\r\nhalf3;\r\nhalf3x1;\r\nhalf3x2;\r\nhalf3x3;\r\nhalf3x4;\r\nhalf4;\r\nhalf4x1;\r\nhalf4x2;\r\nhalf4x3;\r\nhalf4x4;\r\nint;\r\nint1;\r\nint1x1;\r\nint1x2;\r\nint1x3;\r\nint1x4;\r\nint2;\r\nint2x1;\r\nint2x2;\r\nint2x3;\r\nint2x4;\r\nint3;\r\nint3x1;\r\nint3x2;\r\nint3x3;\r\nint3x4;\r\nint4;\r\nint4x1;\r\nint4x2;\r\nint4x3;\r\nint4x4;\r\nmin10float;\r\nmin10float1;\r\nmin10float1x1;\r\nmin10float1x2;\r\nmin10float1x3;\r\nmin10float1x4;\r\nmin10float2;\r\nmin10float2x1;\r\nmin10float2x2;\r\nmin10float2x3;\r\nmin10float2x4;\r\nmin10float3;\r\nmin10float3x1;\r\nmin10float3x2;\r\nmin10float3x3;\r\nmin10float3x4;\r\nmin10float4;\r\nmin10float4x1;\r\nmin10float4x2;\r\nmin10float4x3;\r\nmin10float4x4;\r\nmin12int;\r\nmin12int1;\r\nmin12int1x1;\r\nmin12int1x2;\r\nmin12int1x3;\r\nmin12int1x4;\r\nmin12int2;\r\nmin12int2x1;\r\nmin12int2x2;\r\nmin12int2x3;\r\nmin12int2x4;\r\nmin12int3;\r\nmin12int3x1;\r\nmin12int3x2;\r\nmin12int3x3;\r\nmin12int3x4;\r\nmin12int4;\r\nmin12int4x1;\r\nmin12int4x2;\r\nmin12int4x3;\r\nmin12int4x4;\r\nmin16float;\r\nmin16float1;\r\nmin16float1x1;\r\nmin16float1x2;\r\nmin16float1x3;\r\nmin16float1x4;\r\nmin16float2;\r\nmin16float2x1;\r\nmin16float2x2;\r\nmin16float2x3;\r\nmin16float2x4;\r\nmin16float3;\r\nmin16float3x1;\r\nmin16float3x2;\r\nmin16float3x3;\r\nmin16float3x4;\r\nmin16float4;\r\nmin16float4x1;\r\nmin16float4x2;\r\nmin16float4x3;\r\nmin16float4x4;\r\nmin16int;\r\nmin16int1;\r\nmin16int1x1;\r\nmin16int1x2;\r\nmin16int1x3;\r\nmin16int1x4;\r\nmin16int2;\r\nmin16int2x1;\r\nmin16int2x2;\r\nmin16int2x3;\r\nmin16int2x4;\r\nmin16int3;\r\nmin16int3x1;\r\nmin16int3x2;\r\nmin16int3x3;\r\nmin16int3x4;\r\nmin16int4;\r\nmin16int4x1;\r\nmin16int4x2;\r\nmin16int4x3;\r\nmin16int4x4;\r\nmin16uint;\r\nmin16uint1;\r\nmin16uint1x1;\r\nmin16uint1x2;\r\nmin16uint1x3;\r\nmin16uint1x4;\r\nmin16uint2;\r\nmin16uint2x1;\r\nmin16uint2x2;\r\nmin16uint2x3;\r\nmin16uint2x4;\r\nmin16uint3;\r\nmin16uint3x1;\r\nmin16uint3x2;\r\nmin16uint3x3;\r\nmin16uint3x4;\r\nmin16uint4;\r\nmin16uint4x1;\r\nmin16uint4x2;\r\nmin16uint4x3;\r\nmin16uint4x4;\r\nuint;\r\nuint1;\r\nuint1x1;\r\nuint1x2;\r\nuint1x3;\r\nuint1x4;\r\nuint2;\r\nuint2x1;\r\nuint2x2;\r\nuint2x3;\r\nuint2x4;\r\nuint3;\r\nuint3x1;\r\nuint3x2;\r\nuint3x3;\r\nuint3x4;\r\nuint4;\r\nuint4x1;\r\nuint4x2;\r\nuint4x3;\r\nuint4x4;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"asm\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"asm_fragment\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"auto\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"case\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"catch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"cbuffer\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"centroid\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"char\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"column_major\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"compile\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"compile_fragment\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const_cast\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"default\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"delete\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"discard\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dynamic_cast\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"explicit\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"export\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"extern\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"friend\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"fxgroup\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"goto\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"groupshared\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"inline\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"inout\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"line\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"lineadj\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"linear\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"long\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"matrix\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"mutable\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"namespace\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"nointerpolation\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"noperspective\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"operator\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"out\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"packoffset\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"pass\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"pixelfragment\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"point\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"precise\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"private\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"protected\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"public\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"register\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"reinterpret_cast\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"row_major\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"sample\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"sampler\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"shared\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"short\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"signed\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"sizeof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"snorm\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"stateblock\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"stateblock_state\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static_cast\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"string\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"struct\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"tbuffer\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"technique\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"technique10\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"technique11\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"template\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"texture\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"this\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"throw\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"triangle\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"triangleadj\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"try\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"typedef\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"typename\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uniform\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"union\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"unorm\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"unsigned\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"using\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"vector\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"vertexfragment\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"virtual\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"void\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"volatile\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"bool4x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"double4x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dword4x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"float4x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"half4x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int4x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min10float4x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min12int4x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16float4x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16int4x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"min16uint4x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint1x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint1x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint1x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint1x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint2x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint2x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint2x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint2x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint3x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint3x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint3x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint3x4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint4\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint4x1\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint4x2\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint4x3\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"uint4x4\"], [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/hlsl/number_feature.test",
    "content": "123\r\n0123\r\n0xBADface\r\n123.345\r\n123.456e-4\r\n123.456E+44\r\n\r\n.423h\r\n.423H\r\n.423f\r\n.423F\r\n.423l\r\n.423L\r\n0.423e-4h\r\n0.423e-4H\r\n0.423e-4f\r\n0.423e-4F\r\n0.423e-4l\r\n0.423e-4L\r\n1.h\r\n1.H\r\n1.f\r\n1.F\r\n1.l\r\n1.L\r\n\r\n123u\r\n123U\r\n123l\r\n123L\r\n01234567u\r\n01234567U\r\n01234567l\r\n01234567L\r\n0xBadFaceu\r\n0xBadFaceU\r\n0xBadFacel\r\n0xBadFaceL\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"0123\"],\r\n\t[\"number\", \"0xBADface\"],\r\n\t[\"number\", \"123.345\"],\r\n\t[\"number\", \"123.456e-4\"],\r\n\t[\"number\", \"123.456E+44\"],\r\n\t[\"number\", \".423h\"],\r\n\t[\"number\", \".423H\"],\r\n\t[\"number\", \".423f\"],\r\n\t[\"number\", \".423F\"],\r\n\t[\"number\", \".423l\"],\r\n\t[\"number\", \".423L\"],\r\n\t[\"number\", \"0.423e-4h\"],\r\n\t[\"number\", \"0.423e-4H\"],\r\n\t[\"number\", \"0.423e-4f\"],\r\n\t[\"number\", \"0.423e-4F\"],\r\n\t[\"number\", \"0.423e-4l\"],\r\n\t[\"number\", \"0.423e-4L\"],\r\n\t[\"number\", \"1.h\"],\r\n\t[\"number\", \"1.H\"],\r\n\t[\"number\", \"1.f\"],\r\n\t[\"number\", \"1.F\"],\r\n\t[\"number\", \"1.l\"],\r\n\t[\"number\", \"1.L\"],\r\n\t[\"number\", \"123u\"],\r\n\t[\"number\", \"123U\"],\r\n\t[\"number\", \"123l\"],\r\n\t[\"number\", \"123L\"],\r\n\t[\"number\", \"01234567u\"],\r\n\t[\"number\", \"01234567U\"],\r\n\t[\"number\", \"01234567l\"],\r\n\t[\"number\", \"01234567L\"],\r\n\t[\"number\", \"0xBadFaceu\"],\r\n\t[\"number\", \"0xBadFaceU\"],\r\n\t[\"number\", \"0xBadFacel\"],\r\n\t[\"number\", \"0xBadFaceL\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/hlsl/operator_feature.test",
    "content": "+ - * / %\r\n= += -= *= /= %=\r\n~ << >> & | ^ <<= >>= &= |= ^=\r\n! && || ? :\r\n< > == != <= >=\r\n++ --\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"|=\"],\r\n\t[\"operator\", \"^=\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"--\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/hoon/comments_and_leaves.test",
    "content": "::  Arvo formal interface\n    ::\n    ::    this lifecycle wrapper makes the arvo door (multi-armed core)\n    ::    look like a gate (function or single-armed core), to fit\n    ::    urbit's formal lifecycle function. a practical interpreter\n    ::    can ignore it.\n    ::\n    |=  [now=@da ovo=*]\n    ^-  *\n    ~>  %slog.[0 leaf+\"arvo-event\"]\n    .(+> +:(poke now ovo))\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"::  Arvo formal interface\"],\n\n\t[\"comment\", \"::\"],\n\n\t[\"comment\", \"::    this lifecycle wrapper makes the arvo door (multi-armed core)\"],\n\n\t[\"comment\", \"::    look like a gate (function or single-armed core), to fit\"],\n\n\t[\"comment\", \"::    urbit's formal lifecycle function. a practical interpreter\"],\n\n\t[\"comment\", \"::    can ignore it.\"],\n\n\t[\"comment\", \"::\"],\n\n\t[\"keyword\", \"|=\"],\n\t\"  [\",\n\t[\"function\", \"now\"],\n\t\"=\",\n\t[\"class-name\", \"@da\"],\n\t[\"function\", \"ovo\"],\n\t\"=\",\n\t[\"class-name\", \"*\"],\n\t\"]\\r\\n    \",\n\n\t[\"keyword\", \"^-\"],\n\t[\"class-name\", \"*\"],\n\n\t[\"keyword\", \"~>\"],\n\t[\"constant\", \"%slog\"],\n\t\".[0 \",\n\t[\"function\", \"leaf\"],\n\t\"+\",\n\t[\"string\", \"\\\"arvo-event\\\"\"],\n\t\"]\\r\\n    .(+> +:(\",\n\t[\"function\", \"poke\"],\n\t[\"function\", \"now\"],\n\t[\"function\", \"ovo\"],\n\t\"))\"\n]\n\n----------------------------------------------------\n\nTests for block comments and the inclusion of tapes and leaves inline in cells.\n"
  },
  {
    "path": "tests/languages/hoon/core_with_arms.test",
    "content": "|%\n::  #  %math\n::    unsigned arithmetic\n+|  %math\n++  add\n  ~/  %add\n  ::  unsigned addition\n  ::\n  ::  a: augend\n  ::  b: addend\n  |=  [a=@ b=@]\n  ::  sum\n  ^-  @\n  ?:  =(0 a)  b\n  $(a (dec a), b +(b))\n::\n++  dec\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"|%\"],\n\n\t[\"comment\", \"::  #  %math\"],\n\n\t[\"comment\", \"::    unsigned arithmetic\"],\n\n\t[\"keyword\", \"+|\"],\n\t[\"constant\", \"%math\"],\n\n\t[\"function\", \"++  add\"],\n\n\t[\"keyword\", \"~/\"],\n\t[\"constant\", \"%add\"],\n\n\t[\"comment\", \"::  unsigned addition\"],\n\n\t[\"comment\", \"::\"],\n\n\t[\"comment\", \"::  a: augend\"],\n\n\t[\"comment\", \"::  b: addend\"],\n\n\t[\"keyword\", \"|=\"],\n\t\"  [\",\n\t[\"function\", \"a\"],\n\t\"=\",\n\t[\"class-name\", \"@\"],\n\t[\"function\", \"b\"],\n\t\"=\",\n\t[\"class-name\", \"@\"],\n\t\"]\\r\\n  \",\n\n\t[\"comment\", \"::  sum\"],\n\n\t[\"keyword\", \"^-\"],\n\t[\"class-name\", \"@\"],\n\n\t[\"keyword\", \"?:\"],\n\t\"  =(0 \",\n\t[\"function\", \"a\"],\n\t\")  \",\n\t[\"function\", \"b\"],\n\n\t\"\\r\\n  $(\",\n\t[\"function\", \"a\"],\n\t\" (\",\n\t[\"function\", \"dec\"],\n\t[\"function\", \"a\"],\n\t\"), \",\n\t[\"function\", \"b\"],\n\t\" +(\",\n\t[\"function\", \"b\"],\n\t\"))\\r\\n\",\n\n\t[\"comment\", \"::\"],\n\n\t[\"function\", \"++  dec\"]\n]\n\n----------------------------------------------------\n\nTests for a sample definition of a core with an arm.\n"
  },
  {
    "path": "tests/languages/hoon/nested_strings.test",
    "content": "|=  [a=@ b=tape]\n^-  tape\n?:  (gth a 25)\n  $(a (sub a 26))\n%+  turn  b\n|=  c=@tD\n?:  &((gte c 'A') (lte c 'Z'))\n  =.  c  (add c a)\n  ?.  (gth c 'Z')  c\n  (sub c 26)\n?:  &((gte c 'a') (lte c 'z'))\n  =.  c  (add c a)\n  ?.  (gth c 'z')  c\n  (sub c 26)\nc\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"|=\"],\n\t\"  [\",\n\t[\"function\", \"a\"],\n\t\"=\",\n\t[\"class-name\", \"@\"],\n\t[\"function\", \"b\"],\n\t\"=\",\n\t[\"function\", \"tape\"],\n\t\"]\\r\\n\",\n\n\t[\"keyword\", \"^-\"],\n\t[\"function\", \"tape\"],\n\n\t[\"keyword\", \"?:\"],\n\t\"  (\",\n\t[\"function\", \"gth\"],\n\t[\"function\", \"a\"],\n\t\" 25)\\r\\n  $(\",\n\t[\"function\", \"a\"],\n\t\" (\",\n\t[\"function\", \"sub\"],\n\t[\"function\", \"a\"],\n\t\" 26))\\r\\n\",\n\n\t[\"keyword\", \"%+\"],\n\t[\"function\", \"turn\"],\n\t[\"function\", \"b\"],\n\n\t[\"keyword\", \"|=\"],\n\t[\"function\", \"c\"],\n\t\"=\",\n\t[\"class-name\", \"@tD\"],\n\n\t[\"keyword\", \"?:\"],\n\t\"  &((\",\n\t[\"function\", \"gte\"],\n\t[\"function\", \"c\"],\n\t[\"string\", \"'A'\"],\n\t\") (\",\n\t[\"function\", \"lte\"],\n\t[\"function\", \"c\"],\n\t[\"string\", \"'Z'\"],\n\t\"))\\r\\n  \",\n\n\t[\"keyword\", \"=.\"],\n\t[\"function\", \"c\"],\n\t\"  (\",\n\t[\"function\", \"add\"],\n\t[\"function\", \"c\"],\n\t[\"function\", \"a\"],\n\t\")\\r\\n  \",\n\n\t[\"keyword\", \"?.\"],\n\t\"  (\",\n\t[\"function\", \"gth\"],\n\t[\"function\", \"c\"],\n\t[\"string\", \"'Z'\"],\n\t\")  \",\n\t[\"function\", \"c\"],\n\n\t\"\\r\\n  (\",\n\t[\"function\", \"sub\"],\n\t[\"function\", \"c\"],\n\t\" 26)\\r\\n\",\n\n\t[\"keyword\", \"?:\"],\n\t\"  &((\",\n\t[\"function\", \"gte\"],\n\t[\"function\", \"c\"],\n\t[\"string\", \"'a'\"],\n\t\") (\",\n\t[\"function\", \"lte\"],\n\t[\"function\", \"c\"],\n\t[\"string\", \"'z'\"],\n\t\"))\\r\\n  \",\n\n\t[\"keyword\", \"=.\"],\n\t[\"function\", \"c\"],\n\t\"  (\",\n\t[\"function\", \"add\"],\n\t[\"function\", \"c\"],\n\t[\"function\", \"a\"],\n\t\")\\r\\n  \",\n\n\t[\"keyword\", \"?.\"],\n\t\"  (\",\n\t[\"function\", \"gth\"],\n\t[\"function\", \"c\"],\n\t[\"string\", \"'z'\"],\n\t\")  \",\n\t[\"function\", \"c\"],\n\n\t\"\\r\\n  (\",\n\t[\"function\", \"sub\"],\n\t[\"function\", \"c\"],\n\t\" 26)\\r\\n\",\n\n\t[\"function\", \"c\"]\n]\n\n----------------------------------------------------\n\nTests using the Caesar cipher to demonstrate multiple occasions of cords and tapes on the same line, correcting avoiding clobbering two cord and tape definitions into one.\n"
  },
  {
    "path": "tests/languages/hoon/strings_with_escapes.test",
    "content": "\"blah\\\"blah\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"blah\\\\\\\"blah\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/hpkp/max-age_feature.test",
    "content": "max-age=123;\nmax-age=31536000\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"max-age\"], [\"operator\", \"=\"], \"123\", [\"punctuation\", \";\"],\n\t[\"directive\", \"max-age\"], [\"operator\", \"=\"], \"31536000\"\n]\n\n----------------------------------------------------\n\nChecks for HPKP with an \"unsafe\" max-age.\n"
  },
  {
    "path": "tests/languages/hpkp/sha256_pin_feature.test",
    "content": "pin-sha256=\"EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4=\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"pin-sha256\"],\r\n\t[\"operator\", \"=\"],\r\n\t\"\\\"EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4\",\r\n\t[\"operator\", \"=\"],\r\n\t\"\\\"\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for HPKP with a sha256 pin.\r\n"
  },
  {
    "path": "tests/languages/hsts/include_subdomains_feature.test",
    "content": "includeSubDomains\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"includeSubDomains\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for HSTS with the includeSubDomains directive.\r\n"
  },
  {
    "path": "tests/languages/hsts/max-age_feature.test",
    "content": "max-age=0;\nmax-age=\"0\";\nmax-age=31536000;\nmax-age=\"31536000\"\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"max-age\"],\n\t[\"operator\", \"=\"],\n\t\"0\",\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"max-age\"],\n\t[\"operator\", \"=\"],\n\t\"\\\"0\\\"\",\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"max-age\"],\n\t[\"operator\", \"=\"],\n\t\"31536000\",\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"max-age\"],\n\t[\"operator\", \"=\"],\n\t\"\\\"31536000\\\"\"\n]\n"
  },
  {
    "path": "tests/languages/hsts/preload_feature.test",
    "content": "preload\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"preload\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for HSTS with the preload directive.\r\n"
  },
  {
    "path": "tests/languages/http/header_feature.test",
    "content": "Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\nAccept-Encoding: gzip, deflate\nServer: GitHub.com\nDate: Mon, 22 Dec 2014 18:25:30 GMT\nContent-Type: text/html; charset=utf-8\nContent-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports\nPublic-Key-Pins: max-age=3000;\n       pin-sha256=\"d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=\";\n       pin-sha256=\"E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=\"\nStrict-Transport-Security: max-age=31536000\n\n----------------------------------------------------\n\n[\n\t[\"header\", [\n\t\t[\"header-name\", \"Accept-Language\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\"]\n\t]],\n\t[\"header\", [\n\t\t[\"header-name\", \"Accept-Encoding\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"gzip, deflate\"]\n\t]],\n\t[\"header\", [\n\t\t[\"header-name\", \"Server\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"GitHub.com\"]\n\t]],\n\t[\"header\", [\n\t\t[\"header-name\", \"Date\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"Mon, 22 Dec 2014 18:25:30 GMT\"]\n\t]],\n\t[\"header\", [\n\t\t[\"header-name\", \"Content-Type\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"text/html; charset=utf-8\"]\n\t]],\n\t[\"header\", [\n\t\t[\"header-name\", \"Content-Security-Policy\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports\"]\n\t]],\n\t[\"header\", [\n\t\t[\"header-name\", \"Public-Key-Pins\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"max-age=3000;\\r\\n       pin-sha256=\\\"d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=\\\";\\r\\n       pin-sha256=\\\"E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=\\\"\"]\n\t]],\n\t[\"header\", [\n\t\t[\"header-name\", \"Strict-Transport-Security\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"max-age=31536000\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for header names.\n"
  },
  {
    "path": "tests/languages/http/request-line_feature.test",
    "content": "POST http://example.com HTTP/1.0\r\nGET http://localhost:9999/foo.html HTTP/1.1\r\nPUT http://www.example.com HTTP/2.0\r\nDELETE https://example.com HTTP/1.1\r\nOPTIONS https://www.example.com HTTP/1.1\r\nPATCH http://example.com HTTP/1.0\r\nTRACE http://example.com HTTP/1.0\r\nCONNECT http://example.com HTTP/1.0\r\nGET /path/to/foo.html HTTP/1.1\r\nGET / HTTP/1.1\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"POST\"],\r\n\t\t[\"request-target\", \"http://example.com\"],\r\n\t\t[\"http-version\", \"HTTP/1.0\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"GET\"],\r\n\t\t[\"request-target\", \"http://localhost:9999/foo.html\"],\r\n\t\t[\"http-version\", \"HTTP/1.1\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"PUT\"],\r\n\t\t[\"request-target\", \"http://www.example.com\"],\r\n\t\t[\"http-version\", \"HTTP/2.0\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"DELETE\"],\r\n\t\t[\"request-target\", \"https://example.com\"],\r\n\t\t[\"http-version\", \"HTTP/1.1\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"OPTIONS\"],\r\n\t\t[\"request-target\", \"https://www.example.com\"],\r\n\t\t[\"http-version\", \"HTTP/1.1\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"PATCH\"],\r\n\t\t[\"request-target\", \"http://example.com\"],\r\n\t\t[\"http-version\", \"HTTP/1.0\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"TRACE\"],\r\n\t\t[\"request-target\", \"http://example.com\"],\r\n\t\t[\"http-version\", \"HTTP/1.0\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"CONNECT\"],\r\n\t\t[\"request-target\", \"http://example.com\"],\r\n\t\t[\"http-version\", \"HTTP/1.0\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"GET\"],\r\n\t\t[\"request-target\", \"/path/to/foo.html\"],\r\n\t\t[\"http-version\", \"HTTP/1.1\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"GET\"],\r\n\t\t[\"request-target\", \"/\"],\r\n\t\t[\"http-version\", \"HTTP/1.1\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for request lines.\r\n"
  },
  {
    "path": "tests/languages/http/response-status_feature.test",
    "content": "HTTP/1.0 200 OK\r\nHTTP/1.1 403 Forbidden\r\nHTTP/1.1 404 Not Found\r\nHTTP/1.0 418 I'm a teapot\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"response-status\", [\r\n\t\t[\"http-version\", \"HTTP/1.0\"],\r\n\t\t[\"status-code\", \"200\"],\r\n\t\t[\"reason-phrase\", \"OK\"]\r\n\t]],\r\n\t[\"response-status\", [\r\n\t\t[\"http-version\", \"HTTP/1.1\"],\r\n\t\t[\"status-code\", \"403\"],\r\n\t\t[\"reason-phrase\", \"Forbidden\"]\r\n\t]],\r\n\t[\"response-status\", [\r\n\t\t[\"http-version\", \"HTTP/1.1\"],\r\n\t\t[\"status-code\", \"404\"],\r\n\t\t[\"reason-phrase\", \"Not Found\"]\r\n\t]],\r\n\t[\"response-status\", [\r\n\t\t[\"http-version\", \"HTTP/1.0\"],\r\n\t\t[\"status-code\", \"418\"],\r\n\t\t[\"reason-phrase\", \"I'm a teapot\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for response statuses.\r\n"
  },
  {
    "path": "tests/languages/http/text-plain_feature.test",
    "content": "Content-Type: text/plain\n\nHello World!\n\n----------------------------------------------------\n\n[\n\t[\"header\", [\n\t\t[\"header-name\", \"Content-Type\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"text/plain\"]\n\t]],\n\t[\"text-plain\", \"\\r\\nHello World!\"]\n]\n"
  },
  {
    "path": "tests/languages/http!+csp/inclusion.test",
    "content": "Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports\n\n----------------------------------------------------\n\n[\n\t[\"header\", [\n\t\t[\"header-name\", \"Content-Security-Policy\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", [\n\t\t\t[\"directive\", \"default-src\"],\n\t\t\t[\"none\", \"'none'\"],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t[\"directive\", \"style-src\"],\n\t\t\t[\"host\", [\"cdn.example.com\"]],\n\t\t\t[\"punctuation\", \";\"],\n\t\t\t[\"directive\", \"report-uri\"],\n\t\t\t\" /_/csp-reports\"\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/http!+hpkp/inclusion.test",
    "content": "Public-Key-Pins: max-age=3000;\n       pin-sha256=\"d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=\";\n       pin-sha256=\"E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=\"\n\n----------------------------------------------------\n\n[\n\t[\"header\", [\n\t\t[\"header-name\", \"Public-Key-Pins\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", [\n\t\t\t[\"directive\", \"max-age\"],\n\t\t\t[\"operator\", \"=\"],\n\t\t\t\"3000\",\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"directive\", \"pin-sha256\"],\n\t\t\t[\"operator\", \"=\"],\n\t\t\t\"\\\"d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM\",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t\"\\\"\",\n\t\t\t[\"punctuation\", \";\"],\n\n\t\t\t[\"directive\", \"pin-sha256\"],\n\t\t\t[\"operator\", \"=\"],\n\t\t\t\"\\\"E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g\",\n\t\t\t[\"operator\", \"=\"],\n\t\t\t\"\\\"\"\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/http!+hsts/inclusion.test",
    "content": "Strict-Transport-Security: max-age=31536000\n\n----------------------------------------------------\n\n[\n\t[\"header\", [\n\t\t[\"header-name\", \"Strict-Transport-Security\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", [\n\t\t\t[\"directive\", \"max-age\"],\n\t\t\t[\"operator\", \"=\"],\n\t\t\t\"31536000\"\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/http!+uri/request-line_feature.test",
    "content": "POST http://example.com HTTP/1.0\r\nGET http://localhost:9999/foo.html HTTP/1.1\r\nPUT http://www.example.com HTTP/2.0\r\nDELETE https://example.com HTTP/1.1\r\nOPTIONS https://www.example.com HTTP/1.1\r\nPATCH http://example.com HTTP/1.0\r\nTRACE http://example.com HTTP/1.0\r\nCONNECT http://example.com HTTP/1.0\r\nGET /path/to/foo.html HTTP/1.1\r\nGET / HTTP/1.1\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"POST\"],\r\n\t\t[\"request-target\", [\r\n\t\t\t[\"scheme\", [\r\n\t\t\t\t\"http\",\r\n\t\t\t\t[\"scheme-delimiter\", \":\"]\r\n\t\t\t]],\r\n\t\t\t[\"authority\", [\r\n\t\t\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t\t\t[\"host\", [\"example.com\"]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"http-version\", \"HTTP/1.0\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"GET\"],\r\n\t\t[\"request-target\", [\r\n\t\t\t[\"scheme\", [\r\n\t\t\t\t\"http\",\r\n\t\t\t\t[\"scheme-delimiter\", \":\"]\r\n\t\t\t]],\r\n\t\t\t[\"authority\", [\r\n\t\t\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t\t\t[\"host\", [\"localhost\"]],\r\n\t\t\t\t[\"port-segment\", [\r\n\t\t\t\t\t[\"port-delimiter\", \":\"],\r\n\t\t\t\t\t[\"port\", \"9999\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"path\", [\r\n\t\t\t\t[\"path-separator\", \"/\"],\r\n\t\t\t\t\"foo.html\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"http-version\", \"HTTP/1.1\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"PUT\"],\r\n\t\t[\"request-target\", [\r\n\t\t\t[\"scheme\", [\r\n\t\t\t\t\"http\",\r\n\t\t\t\t[\"scheme-delimiter\", \":\"]\r\n\t\t\t]],\r\n\t\t\t[\"authority\", [\r\n\t\t\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t\t\t[\"host\", [\"www.example.com\"]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"http-version\", \"HTTP/2.0\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"DELETE\"],\r\n\t\t[\"request-target\", [\r\n\t\t\t[\"scheme\", [\r\n\t\t\t\t\"https\",\r\n\t\t\t\t[\"scheme-delimiter\", \":\"]\r\n\t\t\t]],\r\n\t\t\t[\"authority\", [\r\n\t\t\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t\t\t[\"host\", [\"example.com\"]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"http-version\", \"HTTP/1.1\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"OPTIONS\"],\r\n\t\t[\"request-target\", [\r\n\t\t\t[\"scheme\", [\r\n\t\t\t\t\"https\",\r\n\t\t\t\t[\"scheme-delimiter\", \":\"]\r\n\t\t\t]],\r\n\t\t\t[\"authority\", [\r\n\t\t\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t\t\t[\"host\", [\"www.example.com\"]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"http-version\", \"HTTP/1.1\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"PATCH\"],\r\n\t\t[\"request-target\", [\r\n\t\t\t[\"scheme\", [\r\n\t\t\t\t\"http\",\r\n\t\t\t\t[\"scheme-delimiter\", \":\"]\r\n\t\t\t]],\r\n\t\t\t[\"authority\", [\r\n\t\t\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t\t\t[\"host\", [\"example.com\"]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"http-version\", \"HTTP/1.0\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"TRACE\"],\r\n\t\t[\"request-target\", [\r\n\t\t\t[\"scheme\", [\r\n\t\t\t\t\"http\",\r\n\t\t\t\t[\"scheme-delimiter\", \":\"]\r\n\t\t\t]],\r\n\t\t\t[\"authority\", [\r\n\t\t\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t\t\t[\"host\", [\"example.com\"]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"http-version\", \"HTTP/1.0\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"CONNECT\"],\r\n\t\t[\"request-target\", [\r\n\t\t\t[\"scheme\", [\r\n\t\t\t\t\"http\",\r\n\t\t\t\t[\"scheme-delimiter\", \":\"]\r\n\t\t\t]],\r\n\t\t\t[\"authority\", [\r\n\t\t\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t\t\t[\"host\", [\"example.com\"]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"http-version\", \"HTTP/1.0\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"GET\"],\r\n\t\t[\"request-target\", [\r\n\t\t\t[\"path\", [\r\n\t\t\t\t[\"path-separator\", \"/\"],\r\n\t\t\t\t\"path\",\r\n\t\t\t\t[\"path-separator\", \"/\"],\r\n\t\t\t\t\"to\",\r\n\t\t\t\t[\"path-separator\", \"/\"],\r\n\t\t\t\t\"foo.html\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"http-version\", \"HTTP/1.1\"]\r\n\t]],\r\n\t[\"request-line\", [\r\n\t\t[\"method\", \"GET\"],\r\n\t\t[\"request-target\", [\r\n\t\t\t[\"path\", [\r\n\t\t\t\t[\"path-separator\", \"/\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"http-version\", \"HTTP/1.1\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for request lines.\r\n"
  },
  {
    "path": "tests/languages/ichigojam/comment_feature.test",
    "content": "'Foobar\n' Foobar\nREMFoobar\r\nREM Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"'Foobar\"],\r\n\t[\"comment\", \"' Foobar\"],\n\t[\"comment\", \"REMFoobar\"],\n\t[\"comment\", \"REM Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/ichigojam/function_feature.test",
    "content": "ABS\r\nANA\r\nASC\r\nBIN\r\nBTN\r\nDEC\r\nFREE\r\nHELP\r\nHEX\r\nI2CR\r\nI2CW\r\nIN\r\nINKEY\r\nLEN\r\nLINE\r\nPEEK\r\nRND\r\nSCR\r\nSOUND\r\nSTR\r\nTICK\r\nUSR\r\nVER\r\nVPEEK\r\nZER\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"ABS\"],\n\t[\"function\", \"ANA\"],\n\t[\"function\", \"ASC\"],\n\t[\"function\", \"BIN\"],\n\t[\"function\", \"BTN\"],\n\t[\"function\", \"DEC\"],\n\t[\"function\", \"FREE\"],\n\t[\"function\", \"HELP\"],\n\t[\"function\", \"HEX\"],\n\t[\"function\", \"I2CR\"],\n\t[\"function\", \"I2CW\"],\n\t[\"function\", \"IN\"],\n\t[\"function\", \"INKEY\"],\n\t[\"function\", \"LEN\"],\n\t[\"function\", \"LINE\"],\n\t[\"function\", \"PEEK\"],\n\t[\"function\", \"RND\"],\n\t[\"function\", \"SCR\"],\n\t[\"function\", \"SOUND\"],\n\t[\"function\", \"STR\"],\n\t[\"function\", \"TICK\"],\n\t[\"function\", \"USR\"],\n\t[\"function\", \"VER\"],\n\t[\"function\", \"VPEEK\"],\n\t[\"function\", \"ZER\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/ichigojam/keyword_feature.test",
    "content": "BEEP\nBPS\nCASE\nCLEAR\nCLK\nCLO\nCLP\nCLS\nCLT\nCLV\nCONT\nCOPY\nELSE\nEND\nFILE\nFILES\nFOR\nGOSUB\nGSB\nGOTO\nIF\nINPUT\nKBD\nLED\nLET\nLIST\nLOAD\nLOCATE\nLRUN\nNEW\nNEXT\nOUT\nRIGHT\nPLAY\nPOKE\nPRINT\nPWM\nRENUM\nRESET\nRETURN\nRTN\nRUN\nSAVE\nSCROLL\nSLEEP\nSRND\nSTEP\nSTOP\nSUB\nTEMPO\nTHEN\nTO\nUART\nVIDEO\nWAIT\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"BEEP\"],\n\t[\"keyword\", \"BPS\"],\n\t[\"keyword\", \"CASE\"],\n\t[\"keyword\", \"CLEAR\"],\n\t[\"keyword\", \"CLK\"],\n\t[\"keyword\", \"CLO\"],\n\t[\"keyword\", \"CLP\"],\n\t[\"keyword\", \"CLS\"],\n\t[\"keyword\", \"CLT\"],\n\t[\"keyword\", \"CLV\"],\n\t[\"keyword\", \"CONT\"],\n\t[\"keyword\", \"COPY\"],\n\t[\"keyword\", \"ELSE\"],\n\t[\"keyword\", \"END\"],\n\t[\"keyword\", \"FILE\"],\n\t[\"keyword\", \"FILES\"],\n\t[\"keyword\", \"FOR\"],\n\t[\"keyword\", \"GOSUB\"],\n\t[\"keyword\", \"GSB\"],\n\t[\"keyword\", \"GOTO\"],\n\t[\"keyword\", \"IF\"],\n\t[\"keyword\", \"INPUT\"],\n\t[\"keyword\", \"KBD\"],\n\t[\"keyword\", \"LED\"],\n\t[\"keyword\", \"LET\"],\n\t[\"keyword\", \"LIST\"],\n\t[\"keyword\", \"LOAD\"],\n\t[\"keyword\", \"LOCATE\"],\n\t[\"keyword\", \"LRUN\"],\n\t[\"keyword\", \"NEW\"],\n\t[\"keyword\", \"NEXT\"],\n\t[\"keyword\", \"OUT\"],\n\t[\"keyword\", \"RIGHT\"],\n\t[\"keyword\", \"PLAY\"],\n\t[\"keyword\", \"POKE\"],\n\t[\"keyword\", \"PRINT\"],\n\t[\"keyword\", \"PWM\"],\n\t[\"keyword\", \"RENUM\"],\n\t[\"keyword\", \"RESET\"],\n\t[\"keyword\", \"RETURN\"],\n\t[\"keyword\", \"RTN\"],\n\t[\"keyword\", \"RUN\"],\n\t[\"keyword\", \"SAVE\"],\n\t[\"keyword\", \"SCROLL\"],\n\t[\"keyword\", \"SLEEP\"],\n\t[\"keyword\", \"SRND\"],\n\t[\"keyword\", \"STEP\"],\n\t[\"keyword\", \"STOP\"],\n\t[\"keyword\", \"SUB\"],\n\t[\"keyword\", \"TEMPO\"],\n\t[\"keyword\", \"THEN\"],\n\t[\"keyword\", \"TO\"],\n\t[\"keyword\", \"UART\"],\n\t[\"keyword\", \"VIDEO\"],\n\t[\"keyword\", \"WAIT\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/ichigojam/label_feature.test",
    "content": "@PAPERNEKO\n@SUKI\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"label\", \"@PAPERNEKO\"],\r\n\t[\"label\", \"@SUKI\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for labels."
  },
  {
    "path": "tests/languages/ichigojam/number_feature.test",
    "content": "42\r\n3.14159\r\n2e8\r\n3.4E-9\r\n0.7E+12\n#496F726953756B69\n`11100010\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2e8\"],\r\n\t[\"number\", \"3.4E-9\"],\r\n\t[\"number\", \"0.7E+12\"],\n\t[\"number\", \"#496F726953756B69\"],\n\t[\"number\", \"`11100010\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/ichigojam/operator_feature.test",
    "content": "<\n<=\n<>\r\n>\n>=\r\n+\n-\n*\n/\r\n^\n=\n&\n~\n!\n|\r\nAND\nNOT\nOR\n||\n&&\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<>\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"=\"], \n\t[\"operator\", \"&\"], [\"operator\", \"~\"], [\"operator\", \"!\"], [\"operator\", \"|\"],\n\t[\"operator\", \"AND\"], [\"operator\", \"NOT\"], [\"operator\", \"OR\"],\n\t[\"operator\", \"||\"], [\"operator\", \"&&\"]\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/ichigojam/punctuation_feature.test",
    "content": "[ ] , ; : ( )\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/ichigojam/string_feature.test",
    "content": "\"\"\r\n\"fo\"\"obar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\"\\\"obar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/icon/builtin-keyword_feature.test",
    "content": "&allocated\r\n&ascii\r\n&clock\r\n&collections\r\n&cset\r\n&current\r\n&date\r\n&dateline\r\n&digits\r\n&dump\r\n&e\r\n&error\r\n&errornumber\r\n&errortext\r\n&errorvalue\r\n&errout\r\n&fail\r\n&features\r\n&file\r\n&host\r\n&input\r\n&lcase\r\n&letters\r\n&level\r\n&line\r\n&main\r\n&null\r\n&output\r\n&phi\r\n&pi\r\n&pos\r\n&progname\r\n&random\r\n&regions\r\n&source\r\n&storage\r\n&subject\r\n&time\r\n&trace\r\n&ucase\r\n&version\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin-keyword\", \"&allocated\"],\r\n\t[\"builtin-keyword\", \"&ascii\"],\r\n\t[\"builtin-keyword\", \"&clock\"],\r\n\t[\"builtin-keyword\", \"&collections\"],\r\n\t[\"builtin-keyword\", \"&cset\"],\r\n\t[\"builtin-keyword\", \"&current\"],\r\n\t[\"builtin-keyword\", \"&date\"],\r\n\t[\"builtin-keyword\", \"&dateline\"],\r\n\t[\"builtin-keyword\", \"&digits\"],\r\n\t[\"builtin-keyword\", \"&dump\"],\r\n\t[\"builtin-keyword\", \"&e\"],\r\n\t[\"builtin-keyword\", \"&error\"],\r\n\t[\"builtin-keyword\", \"&errornumber\"],\r\n\t[\"builtin-keyword\", \"&errortext\"],\r\n\t[\"builtin-keyword\", \"&errorvalue\"],\r\n\t[\"builtin-keyword\", \"&errout\"],\r\n\t[\"builtin-keyword\", \"&fail\"],\r\n\t[\"builtin-keyword\", \"&features\"],\r\n\t[\"builtin-keyword\", \"&file\"],\r\n\t[\"builtin-keyword\", \"&host\"],\r\n\t[\"builtin-keyword\", \"&input\"],\r\n\t[\"builtin-keyword\", \"&lcase\"],\r\n\t[\"builtin-keyword\", \"&letters\"],\r\n\t[\"builtin-keyword\", \"&level\"],\r\n\t[\"builtin-keyword\", \"&line\"],\r\n\t[\"builtin-keyword\", \"&main\"],\r\n\t[\"builtin-keyword\", \"&null\"],\r\n\t[\"builtin-keyword\", \"&output\"],\r\n\t[\"builtin-keyword\", \"&phi\"],\r\n\t[\"builtin-keyword\", \"&pi\"],\r\n\t[\"builtin-keyword\", \"&pos\"],\r\n\t[\"builtin-keyword\", \"&progname\"],\r\n\t[\"builtin-keyword\", \"&random\"],\r\n\t[\"builtin-keyword\", \"&regions\"],\r\n\t[\"builtin-keyword\", \"&source\"],\r\n\t[\"builtin-keyword\", \"&storage\"],\r\n\t[\"builtin-keyword\", \"&subject\"],\r\n\t[\"builtin-keyword\", \"&time\"],\r\n\t[\"builtin-keyword\", \"&trace\"],\r\n\t[\"builtin-keyword\", \"&ucase\"],\r\n\t[\"builtin-keyword\", \"&version\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for builtin keywords."
  },
  {
    "path": "tests/languages/icon/comment_feature.test",
    "content": "#\r\n# Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/icon/directive_feature.test",
    "content": "$include\r\n$line\r\n$define\r\n$undef\r\n$ifdef\r\n$ifndef\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"$include\"],\r\n\t[\"directive\", \"$line\"],\r\n\t[\"directive\", \"$define\"],\r\n\t[\"directive\", \"$undef\"],\r\n\t[\"directive\", \"$ifdef\"],\r\n\t[\"directive\", \"$ifndef\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for preprocessor directives."
  },
  {
    "path": "tests/languages/icon/function_feature.test",
    "content": "foo()\r\nFoobar_42{}\r\nFoo_Bar ! []\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"Foobar_42\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"Foo_Bar\"], [\"operator\", \"!\"], [\"punctuation\", \"[\"], [\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/icon/keyword_feature.test",
    "content": "break\r\nby\r\ncase\r\ncreate\r\ndefault\r\ndo\r\nelse\r\nend\r\nevery\r\nfail\r\nglobal\r\nif\r\ninitial\r\ninvocable\r\nlink\r\nlocal\r\nnext\r\nnot\r\nof\r\nprocedure\r\nrecord\r\nrepeat\r\nreturn\r\nstatic\r\nsuspend\r\nthen\r\nto\r\nuntil\r\nwhile\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"by\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"create\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"every\"],\r\n\t[\"keyword\", \"fail\"],\r\n\t[\"keyword\", \"global\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"initial\"],\r\n\t[\"keyword\", \"invocable\"],\r\n\t[\"keyword\", \"link\"],\r\n\t[\"keyword\", \"local\"],\r\n\t[\"keyword\", \"next\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"procedure\"],\r\n\t[\"keyword\", \"record\"],\r\n\t[\"keyword\", \"repeat\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"suspend\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"to\"],\r\n\t[\"keyword\", \"until\"],\r\n\t[\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/icon/number_feature.test",
    "content": "0\r\n.42\r\n42\r\n3.14159\r\n2e8\r\n3.2E-7\r\n47E+19\r\n\r\n2r11\r\n8R751\r\n16rbadface\r\n36razerty\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \".42\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2e8\"],\r\n\t[\"number\", \"3.2E-7\"],\r\n\t[\"number\", \"47E+19\"],\r\n\r\n\t[\"number\", \"2r11\"],\r\n\t[\"number\", \"8R751\"],\r\n\t[\"number\", \"16rbadface\"],\r\n\t[\"number\", \"36razerty\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/icon/operator_feature.test",
    "content": "!\r\n% %:=\r\n& &:=\r\n* *:= ** **:=\r\n+ ++ +:= ++:=\r\n- -:= -- --:=\r\n.\r\n/ /:=\r\n:= :=:\r\n< <- <-> <:=\r\n<< <<:=\r\n<<= <<=:=\r\n<= <=:=\r\n= =:=\r\n== ==:=\r\n=== ===:=\r\n> >:=\r\n>= >=:=\r\n>> >>:=\r\n>>= >>=:=\r\n? ?:=\r\n@ @:=\r\n\\\r\n^ ^:=\r\n| || ||:=\r\n||| |||:=\r\n~ ~= ~=:=\r\n~== ~==:=\r\n~=== ~===:=\r\n: +: -:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%:=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&:=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"*:=\"], [\"operator\", \"**\"], [\"operator\", \"**:=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"+:=\"], [\"operator\", \"++:=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"-:=\"], [\"operator\", \"--\"], [\"operator\", \"--:=\"],\r\n\t[\"operator\", \".\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/:=\"],\r\n\t[\"operator\", \":=\"], [\"operator\", \":=:\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<-\"], [\"operator\", \"<->\"], [\"operator\", \"<:=\"],\r\n\t[\"operator\", \"<<\"], [\"operator\", \"<<:=\"],\r\n\t[\"operator\", \"<<=\"], [\"operator\", \"<<=:=\"],\r\n\t[\"operator\", \"<=\"], [\"operator\", \"<=:=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"=:=\"],\r\n\t[\"operator\", \"==\"], [\"operator\", \"==:=\"],\r\n\t[\"operator\", \"===\"], [\"operator\", \"===:=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">:=\"],\r\n\t[\"operator\", \">=\"], [\"operator\", \">=:=\"],\r\n\t[\"operator\", \">>\"], [\"operator\", \">>:=\"],\r\n\t[\"operator\", \">>=\"], [\"operator\", \">>=:=\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \"?:=\"],\r\n\t[\"operator\", \"@\"], [\"operator\", \"@:=\"],\r\n\t[\"operator\", \"\\\\\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^:=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"], [\"operator\", \"||:=\"],\r\n\t[\"operator\", \"|||\"], [\"operator\", \"|||:=\"],\r\n\t[\"operator\", \"~\"], [\"operator\", \"~=\"], [\"operator\", \"~=:=\"],\r\n\t[\"operator\", \"~==\"], [\"operator\", \"~==:=\"],\r\n\t[\"operator\", \"~===\"], [\"operator\", \"~===:=\"],\r\n\t[\"operator\", \":\"], [\"operator\", \"+:\"], [\"operator\", \"-:\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/icon/string_feature.test",
    "content": "\"\"\r\n\"Fo\\\"obar\"\r\n\"Foo_\r\nbar_\r\nbaz\"\r\n\r\n''\r\n'a\\'zerty'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"Foo_\\r\\nbar_\\r\\nbaz\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'a\\\\'zerty'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and csets."
  },
  {
    "path": "tests/languages/icu-message-format/arg-skeleton_feature.test",
    "content": "At {1,time,::jmm} on {1,date,::dMMMM}, there was {2} on planet {3,number,integer}.\r\n\r\n{foo,spellout}\r\n{foo,ordinal}\r\n{foo,duration}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"At \",\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"1\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"arg-type\", \"time\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"arg-skeleton\", \"::jmm\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t\" on \",\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"1\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"arg-type\", \"date\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"arg-skeleton\", \"::dMMMM\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t\", there was \",\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"2\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t\" on planet \",\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"3\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"arg-type\", \"number\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"arg-style\", \"integer\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t\".\\r\\n\\r\\n\",\r\n\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"foo\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"arg-type\", \"spellout\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"foo\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"arg-type\", \"ordinal\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"foo\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"arg-type\", \"duration\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/icu-message-format/choice-style_feature.test",
    "content": "The disk {1} contains {0,choice,0#no files|1#one file|1<{0,number,integer} files}\r\n\r\n{3, choice, -1#is negative| 0#is zero or fraction | 1#is one |1.0<is 1+ |2#is two |2<is more than 2.}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"The disk \",\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"1\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t\" contains \",\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"0\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"keyword\", \"choice\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"choice-style\", [\r\n\t\t\t\t[\"range\", [\r\n\t\t\t\t\t[\"number\", \"0\"],\r\n\t\t\t\t\t[\"operator\", \"#\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\"no files\",\r\n\t\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\t[\"range\", [\r\n\t\t\t\t\t[\"number\", \"1\"],\r\n\t\t\t\t\t[\"operator\", \"#\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\"one file\",\r\n\t\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\t[\"range\", [\r\n\t\t\t\t\t[\"number\", \"1\"],\r\n\t\t\t\t\t[\"operator\", \"<\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t[\"argument-name\", \"0\"],\r\n\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t[\"arg-type\", \"number\"],\r\n\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t[\"arg-style\", \"integer\"]\r\n\t\t\t\t\t]],\r\n\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\" files\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"3\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"keyword\", \"choice\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"choice-style\", [\r\n\t\t\t\t[\"range\", [\r\n\t\t\t\t\t[\"number\", \"-1\"],\r\n\t\t\t\t\t[\"operator\", \"#\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\"is negative\",\r\n\t\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\t[\"range\", [\r\n\t\t\t\t\t[\"number\", \"0\"],\r\n\t\t\t\t\t[\"operator\", \"#\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\"is zero or fraction \",\r\n\t\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\t[\"range\", [\r\n\t\t\t\t\t[\"number\", \"1\"],\r\n\t\t\t\t\t[\"operator\", \"#\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\"is one \",\r\n\t\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\t[\"range\", [\r\n\t\t\t\t\t[\"number\", \"1.0\"],\r\n\t\t\t\t\t[\"operator\", \"<\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\"is 1+ \",\r\n\t\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\t[\"range\", [\r\n\t\t\t\t\t[\"number\", \"2\"],\r\n\t\t\t\t\t[\"operator\", \"#\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\"is two \",\r\n\t\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\t[\"range\", [\r\n\t\t\t\t\t[\"number\", \"2\"],\r\n\t\t\t\t\t[\"operator\", \"<\"]\r\n\t\t\t\t]],\r\n\t\t\t\t\"is more than 2.\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/icu-message-format/plural-style_feature.test",
    "content": "https://unicode-org.github.io/icu/userguide/format_parse/messages/\r\n\r\n{gender_of_host, select,\r\n  female {\r\n    {num_guests, plural, offset:1\r\n      =0 {{host} does not give a party.}\r\n      =1 {{host} invites {guest} to her party.}\r\n      =2 {{host} invites {guest} and one other person to her party.}\r\n      other {{host} invites {guest} and # other people to her party.}}}\r\n  male {\r\n    {num_guests, plural, offset:1\r\n      =0 {{host} does not give a party.}\r\n      =1 {{host} invites {guest} to his party.}\r\n      =2 {{host} invites {guest} and one other person to his party.}\r\n      other {{host} invites {guest} and # other people to his party.}}}\r\n  other {\r\n    {num_guests, plural, offset:1\r\n      =0 {{host} does not give a party.}\r\n      =1 {{host} invites {guest} to their party.}\r\n      =2 {{host} invites {guest} and one other person to their party.}\r\n      other {{host} invites {guest} and # other people to their party.}}}}\r\n\r\n{num_guests, selectordinal, foo}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"https://unicode-org.github.io/icu/userguide/format_parse/messages/\\r\\n\\r\\n\",\r\n\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"gender_of_host\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"select-style\", [\r\n\t\t\t\t[\"selector\", [\"female\"]],\r\n\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t[\"argument-name\", \"num_guests\"],\r\n\t\t\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t\t\t[\"keyword\", \"plural\"],\r\n\t\t\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t\t\t[\"plural-style\", [\r\n\t\t\t\t\t\t\t\t\t[\"offset\", \"offset:1\"],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\"=0\"]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" does not give a party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\"=1\"]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" invites \",\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"guest\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" to her party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\"=2\"]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" invites \",\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"guest\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" and one other person to her party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"keyword\", \"other\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" invites \",\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"guest\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" and # other people to her party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]]\r\n\t\t\t\t\t\t\t\t]]\r\n\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t]]\r\n\t\t\t\t\t]],\r\n\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t]],\r\n\r\n\t\t\t\t[\"selector\", [\"male\"]],\r\n\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t[\"argument-name\", \"num_guests\"],\r\n\t\t\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t\t\t[\"keyword\", \"plural\"],\r\n\t\t\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t\t\t[\"plural-style\", [\r\n\t\t\t\t\t\t\t\t\t[\"offset\", \"offset:1\"],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\"=0\"]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" does not give a party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\"=1\"]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" invites \",\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"guest\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" to his party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\"=2\"]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" invites \",\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"guest\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" and one other person to his party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"keyword\", \"other\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" invites \",\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"guest\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" and # other people to his party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]]\r\n\t\t\t\t\t\t\t\t]]\r\n\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t]]\r\n\t\t\t\t\t]],\r\n\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t]],\r\n\r\n\t\t\t\t[\"selector\", [\r\n\t\t\t\t\t[\"keyword\", \"other\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t[\"argument-name\", \"num_guests\"],\r\n\t\t\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t\t\t[\"keyword\", \"plural\"],\r\n\t\t\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t\t\t[\"plural-style\", [\r\n\t\t\t\t\t\t\t\t\t[\"offset\", \"offset:1\"],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\"=0\"]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" does not give a party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\"=1\"]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" invites \",\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"guest\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" to their party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\"=2\"]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" invites \",\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"guest\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" and one other person to their party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"keyword\", \"other\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"host\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" invites \",\r\n\t\t\t\t\t\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-name\", \"guest\"]\r\n\t\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t\t\" and # other people to their party.\"\r\n\t\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]]\r\n\t\t\t\t\t\t\t\t]]\r\n\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t]]\r\n\t\t\t\t\t]],\r\n\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"num_guests\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"keyword\", \"selectordinal\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"plural-style\", [\r\n\t\t\t\t[\"selector\", [\"foo\"]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/icu-message-format/select-style_feature.test",
    "content": "{0} est {1, select, female {allée} other {allé}} à {2}.\r\n\r\n{0} {1, plural,\r\n one {est {2, select, female {allée} other  {allé}}}\r\n other {sont {2, select, female {allées} other {allés}}}\r\n }à {3}.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"0\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t\" est \",\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"1\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"select-style\", [\r\n\t\t\t\t[\"selector\", [\"female\"]],\r\n\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t[\"message\", [\"allée\"]],\r\n\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"selector\", [\r\n\t\t\t\t\t[\"keyword\", \"other\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t[\"message\", [\"allé\"]],\r\n\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t\" à \",\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"2\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t\".\\r\\n\\r\\n\",\r\n\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"0\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"1\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"keyword\", \"plural\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"plural-style\", [\r\n\t\t\t\t[\"selector\", [\r\n\t\t\t\t\t[\"keyword\", \"one\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\"est \",\r\n\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t[\"argument-name\", \"2\"],\r\n\t\t\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t\t\t[\"select-style\", [\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\"female\"]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\"allée\"]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"keyword\", \"other\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\"allé\"]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]]\r\n\t\t\t\t\t\t\t\t]]\r\n\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t]]\r\n\t\t\t\t\t]],\r\n\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t]],\r\n\r\n\t\t\t\t[\"selector\", [\r\n\t\t\t\t\t[\"keyword\", \"other\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t[\"message\", [\r\n\t\t\t\t\t\t\"sont \",\r\n\t\t\t\t\t\t[\"argument\", [\r\n\t\t\t\t\t\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\t\t\t[\"argument-name\", \"2\"],\r\n\t\t\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t\t\t\t[\"select-style\", [\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\"female\"]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\"allées\"]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t[\"selector\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"keyword\", \"other\"]\r\n\t\t\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t\t\t[\"nested-message\", [\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"{\"],\r\n\t\t\t\t\t\t\t\t\t\t[\"message\", [\"allés\"]],\r\n\t\t\t\t\t\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t\t\t\t\t\t]]\r\n\t\t\t\t\t\t\t\t]]\r\n\t\t\t\t\t\t\t]],\r\n\t\t\t\t\t\t\t[\"argument-delimiter\", \"}\"]\r\n\t\t\t\t\t\t]]\r\n\t\t\t\t\t]],\r\n\t\t\t\t\t[\"message-delimiter\", \"}\"]\r\n\t\t\t\t]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t\"à \",\r\n\t[\"argument\", [\r\n\t\t[\"argument-delimiter\", \"{\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"argument-name\", \"3\"]\r\n\t\t]],\r\n\t\t[\"argument-delimiter\", \"}\"]\r\n\t]],\r\n\t\".\"\r\n]"
  },
  {
    "path": "tests/languages/icu-message-format/string_feature.test",
    "content": "foo '{1}' {1} '' {1}\n\nfoo {foo, '{1}'}\n\n----------------------------------------------------\n\n[\n\t\"foo \",\n\t[\"string\", [\"'{1}'\"]],\n\t[\"argument\", [\n\t\t[\"argument-delimiter\", \"{\"],\n\t\t[\"content\", [\n\t\t\t[\"argument-name\", \"1\"]\n\t\t]],\n\t\t[\"argument-delimiter\", \"}\"]\n\t]],\n\t[\"escape\", \"''\"],\n\t[\"argument\", [\n\t\t[\"argument-delimiter\", \"{\"],\n\t\t[\"content\", [\n\t\t\t[\"argument-name\", \"1\"]\n\t\t]],\n\t\t[\"argument-delimiter\", \"}\"]\n\t]],\n\n\t\"\\r\\n\\r\\nfoo \",\n\t[\"argument\", [\n\t\t[\"argument-delimiter\", \"{\"],\n\t\t[\"content\", [\n\t\t\t[\"argument-name\", \"foo\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"arg-style-text\", \"'{1}'\"]\n\t\t]],\n\t\t[\"argument-delimiter\", \"}\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/idris/char_feature.test",
    "content": "'a'\r\n'\\n'\r\n'\\23'\r\n'\\xFE'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"char\", \"'a'\"],\r\n\t[\"char\", \"'\\\\n'\"],\r\n\t[\"char\", \"'\\\\23'\"],\r\n\t[\"char\", \"'\\\\xFE'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for chars."
  },
  {
    "path": "tests/languages/idris/comment_feature.test",
    "content": "--\r\n-- foo\r\n{- foo\r\nbar -}\r\n{--}\r\n||| doc comment\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"--\"],\r\n\t[\"comment\", \"-- foo\"],\r\n\t[\"comment\", \"{- foo\\r\\nbar -}\"],\r\n\t[\"comment\", \"{--}\"],\r\n\t[\"comment\", \"||| doc comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line, multi-line and doc comments.\r\n"
  },
  {
    "path": "tests/languages/idris/constant_feature.test",
    "content": "Foo\r\nFoo.Bar\r\nBaz.Foobar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", [\"Foo\"]],\r\n\t[\"constant\", [\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Bar\"\r\n\t]],\r\n\t[\"constant\", [\r\n\t\t\"Baz\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Foobar_42\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants.\r\n"
  },
  {
    "path": "tests/languages/idris/hvariable_feature.test",
    "content": "foo\r\nFoo.bar\r\nBaz.foobar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"hvariable\", [\"foo\"]],\r\n\t[\"hvariable\", [\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"bar\"\r\n\t]],\r\n\t[\"hvariable\", [\r\n\t\t\"Baz\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"foobar_42\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hvariables.\r\n"
  },
  {
    "path": "tests/languages/idris/import_statement_feature.test",
    "content": "import Foo\r\nimport Maths.NumOps\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"import\"],\r\n\t[\"import-statement\", [\"Foo\"]],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"import-statement\", [\r\n\t\t\"Maths\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"NumOps\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for import statement.\r\n"
  },
  {
    "path": "tests/languages/idris/keyword_feature.test",
    "content": "Type\r\ncase\r\nclass\r\ncodata\r\nconstructor\r\ncorecord\r\ndata\r\ndo\r\ndsl\r\nelse\r\nexport\r\nif\r\nimplementation\r\nimplicit\r\nimport\r\nimpossible\r\nin\r\ninfix\r\ninfixl\r\ninfixr\r\ninstance\r\ninterface\r\nlet\r\nmodule\r\nmutual\r\nnamespace\r\nof\r\nparameters\r\npartial\r\npostulate\r\nprivate\r\nproof\r\npublic\r\nquoteGoal\r\nrecord\r\nrewrite\r\nsyntax\r\nthen\r\ntotal\r\nusing\r\nwhere\r\nwith\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"Type\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"codata\"],\r\n\t[\"keyword\", \"constructor\"],\r\n\t[\"keyword\", \"corecord\"],\r\n\t[\"keyword\", \"data\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"dsl\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"implementation\"],\r\n\t[\"keyword\", \"implicit\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"impossible\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"infix\"],\r\n\t[\"keyword\", \"infixl\"],\r\n\t[\"keyword\", \"infixr\"],\r\n\t[\"keyword\", \"instance\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"keyword\", \"mutual\"],\r\n\t[\"keyword\", \"namespace\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"parameters\"],\r\n\t[\"keyword\", \"partial\"],\r\n\t[\"keyword\", \"postulate\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"proof\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"quoteGoal\"],\r\n\t[\"keyword\", \"record\"],\r\n\t[\"keyword\", \"rewrite\"],\r\n\t[\"keyword\", \"syntax\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"total\"],\r\n\t[\"keyword\", \"using\"],\r\n\t[\"keyword\", \"where\"],\r\n\t[\"keyword\", \"with\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for some keywords.\r\n"
  },
  {
    "path": "tests/languages/idris/number_feature.test",
    "content": "42\r\n3.14159\r\n2E3\r\n1.2e-4\r\n0.9e+1\r\n0o47\r\n0xBadFace\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2E3\"],\r\n\t[\"number\", \"1.2e-4\"],\r\n\t[\"number\", \"0.9e+1\"],\r\n\t[\"number\", \"0o47\"],\r\n\t[\"number\", \"0xBadFace\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal, octal and hexadecimal numbers."
  },
  {
    "path": "tests/languages/idris/operator_feature.test",
    "content": "..\r\nreverse . sort\r\n`foo`\r\n`Foo.bar`\r\n+ - * /\r\n^ ^^ **\r\n&& ||\r\n< <= == /=\r\n>= > \\ |\r\n++ : !!\r\n\\\\ <- ->\r\n= :: =>\r\n>> >>= >@>\r\n~ ! @\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"..\"],\r\n\r\n\t[\"hvariable\", [\"reverse\"]],\r\n\t[\"operator\", \".\"],\r\n\t[\"hvariable\", [\"sort\"]],\r\n\r\n\t[\"operator\", \"`foo`\"],\r\n\r\n\t[\"operator\", \"`Foo.bar`\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"^^\"],\r\n\t[\"operator\", \"**\"],\r\n\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"/=\"],\r\n\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"\\\\\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"!!\"],\r\n\r\n\t[\"operator\", \"\\\\\\\\\"],\r\n\t[\"operator\", \"<-\"],\r\n\t[\"operator\", \"->\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"operator\", \"=>\"],\r\n\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \">@>\"],\r\n\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/idris/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n\"foo \\\r\n  \\ bar\"\r\n\"foo -- comment \\\r\n  \\ bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"\\\"foo \\\\\\r\\n  \\\\ bar\\\"\"],\r\n\t[\"string\", \"\\\"foo -- comment \\\\\\r\\n  \\\\ bar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/iecst/address_feature.test",
    "content": "VAR\n    varname AT %QX1.0.0: BOOL := TRUE;\nEND_VAR\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"VAR\"],\n\n\t\"\\r\\n    varname \",\n\t[\"keyword\", \"AT\"],\n\t[\"address\", \"%QX1.0.0\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"BOOL\"],\n\t[\"operator\", \":=\"],\n\t[\"boolean\", \"TRUE\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"END_VAR\"]\n]\n\n----------------------------------------------------\n\nChecks symbols.\n"
  },
  {
    "path": "tests/languages/iecst/block.test",
    "content": "csq := ABS(c_pi * (r * 2));\n\n----------------------------------------------------\n\n[\n\t\"csq \",\n\t[\"operator\", \":=\"],\n\t[\"function\", \"ABS\"],\n\t[\"punctuation\", \"(\"],\n\t\"c_pi \",\n\t[\"operator\", \"*\"],\n\t[\"punctuation\", \"(\"],\n\t\"r \",\n\t[\"operator\", \"*\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks expression.\n"
  },
  {
    "path": "tests/languages/iecst/boolean_feature.test",
    "content": "TRUE\nFALSE\nNULL\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"TRUE\"],\n\t[\"boolean\", \"FALSE\"],\n\t[\"boolean\", \"NULL\"]\n]\n"
  },
  {
    "path": "tests/languages/iecst/comment_feature.test",
    "content": "// comment\n(* comment *)\n/* comment */\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// comment\"],\n\t[\"comment\", \"(* comment *)\"],\n\t[\"comment\", \"/* comment */\"]\n]\n"
  },
  {
    "path": "tests/languages/iecst/number_feature.test",
    "content": "a := 100\n\n----------------------------------------------------\n\n[\n\t\"a \",\n\t[\"operator\", \":=\"],\n\t[\"number\", \"100\"]\n]\n\n----------------------------------------------------\n\nChecks number.\n"
  },
  {
    "path": "tests/languages/iecst/operator_feature.test",
    "content": "= <> < <= > >=\n+ - * / ** ^ & &&\n\n: :=\n#\n\nAND\nEQ\nEXPT\nGE\nGT\nLE\nLT\nMOD\nNE\nNOT\nOR\nXOR\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"<>\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"**\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"&&\"],\n\n\t[\"operator\", \":\"], [\"operator\", \":=\"],\n\t[\"operator\", \"#\"],\n\n\t[\"operator\", \"AND\"],\n\t[\"operator\", \"EQ\"],\n\t[\"operator\", \"EXPT\"],\n\t[\"operator\", \"GE\"],\n\t[\"operator\", \"GT\"],\n\t[\"operator\", \"LE\"],\n\t[\"operator\", \"LT\"],\n\t[\"operator\", \"MOD\"],\n\t[\"operator\", \"NE\"],\n\t[\"operator\", \"NOT\"],\n\t[\"operator\", \"OR\"],\n\t[\"operator\", \"XOR\"]\n]\n"
  },
  {
    "path": "tests/languages/iecst/punctuation_feature.test",
    "content": "( ) [ ]\n, ; .\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"]\n]\n"
  },
  {
    "path": "tests/languages/ignore/comment_feature.test",
    "content": "# Simple comment\r\n## A comment too\r\n\\# Not a comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"# Simple comment\"],\r\n\t[\"comment\", \"## A comment too\"],\r\n\t[\"entry\", [\"\\\\# Not a comment\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/ignore/entry_feature.test",
    "content": "foo/bar/\r\nfoo/file[1-3].txt\r\n  !unignore\r\n\\!foo/**\r\nnotes\\[1\\].txt\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"entry\", [\"foo\", [\"punctuation\", \"/\"], \"bar\", [\"punctuation\", \"/\"]]],\r\n\t[\"entry\", [\"foo\", [\"punctuation\", \"/\"], \"file\", [\"regex\", \"[1-3]\"], \".txt\"]],\r\n\t[\"entry\", [[\"operator\", \"!\"], \"unignore\"]],\r\n\t[\"entry\", [\"\\\\!foo\", [\"punctuation\", \"/\"], [\"operator\", \"**\"]]],\r\n\t[\"entry\", [\"notes\\\\[1\\\\].txt\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/inform7/comment_feature.test",
    "content": "[Foobar]\r\n[Foo\r\nbar\r\nbaz]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"[Foobar]\"],\r\n\t[\"comment\", \"[Foo\\r\\nbar\\r\\nbaz]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/inform7/keyword_feature.test",
    "content": "after\r\nbefore\r\ncarry out\r\ncheck\r\ncontinue the action\r\ndefinition :\r\ndo nothing\r\nelse\r\nend if\r\nend unless\r\nend the story\r\nevery turn\r\nif\r\ninclude\r\ninstead\r\ninstead of\r\nlet\r\nmove\r\nno\r\nnow\r\notherwise\r\nrepeat\r\nreport\r\nresume the story\r\nrule for\r\nrunning through\r\nsay\r\nsaying\r\nstop the action\r\ntest\r\ntry\r\ntrying\r\nunderstand\r\nunless\r\nuse\r\nwhen\r\nwhile\r\nyes\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"after\"],\r\n\t[\"keyword\", \"before\"],\r\n\t[\"keyword\", \"carry out\"],\r\n\t[\"keyword\", \"check\"],\r\n\t[\"keyword\", \"continue the action\"],\r\n\t[\"keyword\", \"definition\"], [\"punctuation\", \":\"],\r\n\t[\"keyword\", \"do nothing\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end if\"],\r\n\t[\"keyword\", \"end unless\"],\r\n\t[\"keyword\", \"end the story\"],\r\n\t[\"keyword\", \"every turn\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"instead\"],\r\n\t[\"keyword\", \"instead of\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"move\"],\r\n\t[\"keyword\", \"no\"],\r\n\t[\"keyword\", \"now\"],\r\n\t[\"keyword\", \"otherwise\"],\r\n\t[\"keyword\", \"repeat\"],\r\n\t[\"keyword\", \"report\"],\r\n\t[\"keyword\", \"resume the story\"],\r\n\t[\"keyword\", \"rule for\"],\r\n\t[\"keyword\", \"running through\"],\r\n\t[\"keyword\", \"say\"],\r\n\t[\"keyword\", \"saying\"],\r\n\t[\"keyword\", \"stop the action\"],\r\n\t[\"keyword\", \"test\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"trying\"],\r\n\t[\"keyword\", \"understand\"],\r\n\t[\"keyword\", \"unless\"],\r\n\t[\"keyword\", \"use\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"yes\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/inform7/number_feature.test",
    "content": "42\r\n3.14159\r\n50kg\r\n100m\r\none two three\r\nfour five six\r\nseven eight nine\r\nten eleven twelve\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"50kg\"],\r\n\t[\"number\", \"100m\"],\r\n\t[\"number\", \"one\"], [\"number\", \"two\"], [\"number\", \"three\"],\r\n\t[\"number\", \"four\"], [\"number\", \"five\"], [\"number\", \"six\"],\r\n\t[\"number\", \"seven\"], [\"number\", \"eight\"], [\"number\", \"nine\"],\r\n\t[\"number\", \"ten\"], [\"number\", \"eleven\"], [\"number\", \"twelve\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/inform7/position_feature.test",
    "content": "above\r\nadjacent to\r\nback side of\r\nbelow\r\nbetween\r\ndown\r\neast\r\neverywhere\r\nfront side\r\nhere\r\nin\r\ninside\r\ninside from\r\nnorth\r\nnortheast\r\nnorthwest\r\nnowhere\r\non\r\non top of\r\nother side\r\noutside\r\noutside from\r\npart of\r\nparts of\r\nregionally in\r\nsouth\r\nsoutheast\r\nsouthwest\r\nthrough\r\nup\r\nwest\r\nwithin\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"position\", \"above\"],\r\n\t[\"position\", \"adjacent to\"],\r\n\t[\"position\", \"back side of\"],\r\n\t[\"position\", \"below\"],\r\n\t[\"position\", \"between\"],\r\n\t[\"position\", \"down\"],\r\n\t[\"position\", \"east\"],\r\n\t[\"position\", \"everywhere\"],\r\n\t[\"position\", \"front side\"],\r\n\t[\"position\", \"here\"],\r\n\t[\"position\", \"in\"],\r\n\t[\"position\", \"inside\"],\r\n\t[\"position\", \"inside from\"],\r\n\t[\"position\", \"north\"],\r\n\t[\"position\", \"northeast\"],\r\n\t[\"position\", \"northwest\"],\r\n\t[\"position\", \"nowhere\"],\r\n\t[\"position\", \"on\"],\r\n\t[\"position\", \"on top of\"],\r\n\t[\"position\", \"other side\"],\r\n\t[\"position\", \"outside\"],\r\n\t[\"position\", \"outside from\"],\r\n\t[\"position\", \"part of\"],\r\n\t[\"position\", \"parts of\"],\r\n\t[\"position\", \"regionally in\"],\r\n\t[\"position\", \"south\"],\r\n\t[\"position\", \"southeast\"],\r\n\t[\"position\", \"southwest\"],\r\n\t[\"position\", \"through\"],\r\n\t[\"position\", \"up\"],\r\n\t[\"position\", \"west\"],\r\n\t[\"position\", \"within\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for positions."
  },
  {
    "path": "tests/languages/inform7/property_feature.test",
    "content": "adjacent\r\ncarried\r\nclosed\r\nconcealed\r\ncontained\r\ndark\r\ndescribed\r\nedible\r\nempty\r\nenclosed\r\nenterable\r\neven\r\nfemale\r\nfixed in place\r\nfull\r\nhandled\r\nheld\r\nimproper-named\r\nincorporated\r\ninedible\r\ninvisible\r\nlighted\r\nlit\r\nlockable\r\nlocked\r\nmale\r\nmarked for listing\r\nmentioned\r\nnegative\r\nneuter\r\nnon-empty\r\nnon-full\r\nnon-recurring\r\nodd\r\nopaque\r\nopen\r\nopenable\r\nplural-named\r\nportable\r\npositive\r\nprivately-named\r\nproper-named\r\nprovided\r\npublically-named\r\npushable between rooms\r\nrecurring\r\nrelated\r\nrubbing\r\nscenery\r\nseen\r\nsingular-named\r\nsupported\r\nswinging\r\nswitchable\r\nswitched\r\nswitched on\r\nswitched off\r\ntouchable\r\ntouched\r\ntransparent\r\nunconcealed\r\nundescribed\r\nunlit\r\nunlocked\r\nunmarked for listing\r\nunmentioned\r\nunopenable\r\nuntouchable\r\nunvisited\r\nvariable\r\nvisible\r\nvisited\r\nwearable\r\nworn\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"adjacent\"],\r\n\t[\"property\", \"carried\"],\r\n\t[\"property\", \"closed\"],\r\n\t[\"property\", \"concealed\"],\r\n\t[\"property\", \"contained\"],\r\n\t[\"property\", \"dark\"],\r\n\t[\"property\", \"described\"],\r\n\t[\"property\", \"edible\"],\r\n\t[\"property\", \"empty\"],\r\n\t[\"property\", \"enclosed\"],\r\n\t[\"property\", \"enterable\"],\r\n\t[\"property\", \"even\"],\r\n\t[\"property\", \"female\"],\r\n\t[\"property\", \"fixed in place\"],\r\n\t[\"property\", \"full\"],\r\n\t[\"property\", \"handled\"],\r\n\t[\"property\", \"held\"],\r\n\t[\"property\", \"improper-named\"],\r\n\t[\"property\", \"incorporated\"],\r\n\t[\"property\", \"inedible\"],\r\n\t[\"property\", \"invisible\"],\r\n\t[\"property\", \"lighted\"],\r\n\t[\"property\", \"lit\"],\r\n\t[\"property\", \"lockable\"],\r\n\t[\"property\", \"locked\"],\r\n\t[\"property\", \"male\"],\r\n\t[\"property\", \"marked for listing\"],\r\n\t[\"property\", \"mentioned\"],\r\n\t[\"property\", \"negative\"],\r\n\t[\"property\", \"neuter\"],\r\n\t[\"property\", \"non-empty\"],\r\n\t[\"property\", \"non-full\"],\r\n\t[\"property\", \"non-recurring\"],\r\n\t[\"property\", \"odd\"],\r\n\t[\"property\", \"opaque\"],\r\n\t[\"property\", \"open\"],\r\n\t[\"property\", \"openable\"],\r\n\t[\"property\", \"plural-named\"],\r\n\t[\"property\", \"portable\"],\r\n\t[\"property\", \"positive\"],\r\n\t[\"property\", \"privately-named\"],\r\n\t[\"property\", \"proper-named\"],\r\n\t[\"property\", \"provided\"],\r\n\t[\"property\", \"publically-named\"],\r\n\t[\"property\", \"pushable between rooms\"],\r\n\t[\"property\", \"recurring\"],\r\n\t[\"property\", \"related\"],\r\n\t[\"property\", \"rubbing\"],\r\n\t[\"property\", \"scenery\"],\r\n\t[\"property\", \"seen\"],\r\n\t[\"property\", \"singular-named\"],\r\n\t[\"property\", \"supported\"],\r\n\t[\"property\", \"swinging\"],\r\n\t[\"property\", \"switchable\"],\r\n\t[\"property\", \"switched\"],\r\n\t[\"property\", \"switched on\"],\r\n\t[\"property\", \"switched off\"],\r\n\t[\"property\", \"touchable\"],\r\n\t[\"property\", \"touched\"],\r\n\t[\"property\", \"transparent\"],\r\n\t[\"property\", \"unconcealed\"],\r\n\t[\"property\", \"undescribed\"],\r\n\t[\"property\", \"unlit\"],\r\n\t[\"property\", \"unlocked\"],\r\n\t[\"property\", \"unmarked for listing\"],\r\n\t[\"property\", \"unmentioned\"],\r\n\t[\"property\", \"unopenable\"],\r\n\t[\"property\", \"untouchable\"],\r\n\t[\"property\", \"unvisited\"],\r\n\t[\"property\", \"variable\"],\r\n\t[\"property\", \"visible\"],\r\n\t[\"property\", \"visited\"],\r\n\t[\"property\", \"wearable\"],\r\n\t[\"property\", \"worn\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties."
  },
  {
    "path": "tests/languages/inform7/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n\"foo\r\nbar\"\r\n\"[if the player is in Center Ring]A magician's booth stands in the corner, painted dark blue with glittering gold stars.[otherwise if the magician's booth is closed]A crack of light indicates the way back out to the center ring.[otherwise]The door stands open to the outside.[end if]\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"\\\"\"]],\r\n\t[\"string\", [\"\\\"foo\\\"\"]],\r\n\t[\"string\", [\"\\\"foo\\r\\nbar\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"substitution\", [\r\n\t\t\t[\"delimiter\", \"[\"],\r\n\t\t\t[\"keyword\", \"if\"], [\"text\", \"the\"],\r\n\t\t\t[\"type\", \"player\"], [\"verb\", \"is\"],\r\n\t\t\t[\"position\", \"in\"], [\"text\", \"Center Ring\"],\r\n\t\t\t[\"delimiter\", \"]\"]\r\n\t\t]],\r\n\t\t\"A magician's booth stands in the corner, painted dark blue with glittering gold stars.\",\r\n\t\t[\"substitution\", [\r\n\t\t\t[\"delimiter\", \"[\"],\r\n\t\t\t[\"keyword\", \"otherwise\"], [\"keyword\", \"if\"],\r\n\t\t\t[\"text\", \"the magician's booth\"],\r\n\t\t\t[\"verb\", \"is\"],\r\n\t\t\t[\"property\", \"closed\"],\r\n\t\t\t[\"delimiter\", \"]\"]\r\n\t\t]],\r\n\t\t\"A crack of light indicates the way back out to the center ring.\",\r\n\t\t[\"substitution\", [\r\n\t\t\t[\"delimiter\", \"[\"],\r\n\t\t\t[\"keyword\", \"otherwise\"],\r\n\t\t\t[\"delimiter\", \"]\"]\r\n\t\t]],\r\n\t\t\"The door stands open to the outside.\",\r\n\t\t[\"substitution\", [\r\n\t\t\t[\"delimiter\", \"[\"],\r\n\t\t\t[\"keyword\", \"end if\"],\r\n\t\t\t[\"delimiter\", \"]\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and text substitution."
  },
  {
    "path": "tests/languages/inform7/title_feature.test",
    "content": "Volume 1 - Foobar\r\nBook 2 - Foobar\r\nPart 3 - Foobar\r\nChapter 4 - Foobar\r\nSection 5 - Foobar\r\nTable 6 - Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"title\", \"Volume 1 - Foobar\"],\r\n\t[\"title\", \"Book 2 - Foobar\"],\r\n\t[\"title\", \"Part 3 - Foobar\"],\r\n\t[\"title\", \"Chapter 4 - Foobar\"],\r\n\t[\"title\", \"Section 5 - Foobar\"],\r\n\t[\"title\", \"Table 6 - Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for titles."
  },
  {
    "path": "tests/languages/inform7/variable_feature.test",
    "content": "action\r\nactions\r\nactivity\r\nactivities\r\nactor\r\nactors\r\nanimal\r\nanimals\r\nbackdrop\r\nbackdrops\r\ncontainer\r\ncontainers\r\ndevice\r\ndevices\r\ndirection\r\ndirections\r\ndoor\r\ndoors\r\nholder\r\nholders\r\nkind\r\nkinds\r\nlist\r\nlists\r\nman\r\nmen\r\nnobody\r\nnothing\r\nnoun\r\nnouns\r\nnumber\r\nnumbers\r\nobject\r\nobjects\r\npeople\r\nperson\r\npersons\r\nplayer\r\nplayer's holdall\r\nregion\r\nregions\r\nrelation\r\nrelations\r\nroom\r\nrooms\r\nrule\r\nrules\r\nrulebook\r\nrulebooks\r\nscene\r\nscenes\r\nsomeone\r\nsomething\r\nsupporter\r\nsupporters\r\ntable\r\ntables\r\ntext\r\ntexts\r\nthing\r\nthings\r\ntime\r\nvehicle\r\nvehicles\r\nwoman\r\nwomen\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"type\", \"action\"],\r\n\t[\"type\", \"actions\"],\r\n\t[\"type\", \"activity\"],\r\n\t[\"type\", \"activities\"],\r\n\t[\"type\", \"actor\"],\r\n\t[\"type\", \"actors\"],\r\n\t[\"type\", \"animal\"],\r\n\t[\"type\", \"animals\"],\r\n\t[\"type\", \"backdrop\"],\r\n\t[\"type\", \"backdrops\"],\r\n\t[\"type\", \"container\"],\r\n\t[\"type\", \"containers\"],\r\n\t[\"type\", \"device\"],\r\n\t[\"type\", \"devices\"],\r\n\t[\"type\", \"direction\"],\r\n\t[\"type\", \"directions\"],\r\n\t[\"type\", \"door\"],\r\n\t[\"type\", \"doors\"],\r\n\t[\"type\", \"holder\"],\r\n\t[\"type\", \"holders\"],\r\n\t[\"type\", \"kind\"],\r\n\t[\"type\", \"kinds\"],\r\n\t[\"type\", \"list\"],\r\n\t[\"type\", \"lists\"],\r\n\t[\"type\", \"man\"],\r\n\t[\"type\", \"men\"],\r\n\t[\"type\", \"nobody\"],\r\n\t[\"type\", \"nothing\"],\r\n\t[\"type\", \"noun\"],\r\n\t[\"type\", \"nouns\"],\r\n\t[\"type\", \"number\"],\r\n\t[\"type\", \"numbers\"],\r\n\t[\"type\", \"object\"],\r\n\t[\"type\", \"objects\"],\r\n\t[\"type\", \"people\"],\r\n\t[\"type\", \"person\"],\r\n\t[\"type\", \"persons\"],\r\n\t[\"type\", \"player\"],\r\n\t[\"type\", \"player's holdall\"],\r\n\t[\"type\", \"region\"],\r\n\t[\"type\", \"regions\"],\r\n\t[\"type\", \"relation\"],\r\n\t[\"type\", \"relations\"],\r\n\t[\"type\", \"room\"],\r\n\t[\"type\", \"rooms\"],\r\n\t[\"type\", \"rule\"],\r\n\t[\"type\", \"rules\"],\r\n\t[\"type\", \"rulebook\"],\r\n\t[\"type\", \"rulebooks\"],\r\n\t[\"type\", \"scene\"],\r\n\t[\"type\", \"scenes\"],\r\n\t[\"type\", \"someone\"],\r\n\t[\"type\", \"something\"],\r\n\t[\"type\", \"supporter\"],\r\n\t[\"type\", \"supporters\"],\r\n\t[\"type\", \"table\"],\r\n\t[\"type\", \"tables\"],\r\n\t[\"type\", \"text\"],\r\n\t[\"type\", \"texts\"],\r\n\t[\"type\", \"thing\"],\r\n\t[\"type\", \"things\"],\r\n\t[\"type\", \"time\"],\r\n\t[\"type\", \"vehicle\"],\r\n\t[\"type\", \"vehicles\"],\r\n\t[\"type\", \"woman\"],\r\n\t[\"type\", \"women\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/inform7/verb_feature.test",
    "content": "applying to\r\nare\r\nattacking\r\nanswering\r\nasking\r\nbe\r\nbeing\r\nburning\r\nbuying\r\ncalled\r\ncarries\r\ncarry\r\ncarrying\r\nclimbing\r\nclosing\r\nconceal\r\nconceals\r\nconcealing\r\nconsulting\r\ncontain\r\ncontains\r\ncontaining\r\ncutting\r\ndrinking\r\ndropping\r\neating\r\nenclose\r\nencloses\r\nenclosing\r\nentering\r\nexamining\r\nexiting\r\ngetting\r\ngiving\r\ngoing\r\nhave\r\nhas\r\nhaving\r\nhold\r\nholds\r\nholding\r\nimply\r\nimplies\r\nincorporate\r\nincorporates\r\nincorporating\r\ninserting\r\nis\r\njumping\r\nkissing\r\nlistening\r\nlocking\r\nlooking\r\nmean\r\nmeans\r\nmeaning\r\nopening\r\nprovide\r\nprovides\r\nproviding\r\npulling\r\npushing\r\nputting\r\nrelate\r\nrelates\r\nrelating\r\nremoving\r\nsearching\r\nsee\r\nsees\r\nseeing\r\nsetting\r\nshowing\r\nsinging\r\nsleeping\r\nsmelling\r\nsqueezing\r\nswitching\r\nsupport\r\nsupports\r\nsupporting\r\nswearing\r\ntaking\r\ntasting\r\ntelling\r\nthinking\r\nthrowing\r\ntouching\r\nturning\r\ntying\r\nunlock\r\nunlocks\r\nunlocking\r\nvary\r\nvaries\r\nvarying\r\nwaiting\r\nwaking\r\nwaving\r\nwear\r\nwears\r\nwearing\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"verb\", \"applying to\"],\r\n\t[\"verb\", \"are\"],\r\n\t[\"verb\", \"attacking\"],\r\n\t[\"verb\", \"answering\"],\r\n\t[\"verb\", \"asking\"],\r\n\t[\"verb\", \"be\"],\r\n\t[\"verb\", \"being\"],\r\n\t[\"verb\", \"burning\"],\r\n\t[\"verb\", \"buying\"],\r\n\t[\"verb\", \"called\"],\r\n\t[\"verb\", \"carries\"],\r\n\t[\"verb\", \"carry\"],\r\n\t[\"verb\", \"carrying\"],\r\n\t[\"verb\", \"climbing\"],\r\n\t[\"verb\", \"closing\"],\r\n\t[\"verb\", \"conceal\"],\r\n\t[\"verb\", \"conceals\"],\r\n\t[\"verb\", \"concealing\"],\r\n\t[\"verb\", \"consulting\"],\r\n\t[\"verb\", \"contain\"],\r\n\t[\"verb\", \"contains\"],\r\n\t[\"verb\", \"containing\"],\r\n\t[\"verb\", \"cutting\"],\r\n\t[\"verb\", \"drinking\"],\r\n\t[\"verb\", \"dropping\"],\r\n\t[\"verb\", \"eating\"],\r\n\t[\"verb\", \"enclose\"],\r\n\t[\"verb\", \"encloses\"],\r\n\t[\"verb\", \"enclosing\"],\r\n\t[\"verb\", \"entering\"],\r\n\t[\"verb\", \"examining\"],\r\n\t[\"verb\", \"exiting\"],\r\n\t[\"verb\", \"getting\"],\r\n\t[\"verb\", \"giving\"],\r\n\t[\"verb\", \"going\"],\r\n\t[\"verb\", \"have\"],\r\n\t[\"verb\", \"has\"],\r\n\t[\"verb\", \"having\"],\r\n\t[\"verb\", \"hold\"],\r\n\t[\"verb\", \"holds\"],\r\n\t[\"verb\", \"holding\"],\r\n\t[\"verb\", \"imply\"],\r\n\t[\"verb\", \"implies\"],\r\n\t[\"verb\", \"incorporate\"],\r\n\t[\"verb\", \"incorporates\"],\r\n\t[\"verb\", \"incorporating\"],\r\n\t[\"verb\", \"inserting\"],\r\n\t[\"verb\", \"is\"],\r\n\t[\"verb\", \"jumping\"],\r\n\t[\"verb\", \"kissing\"],\r\n\t[\"verb\", \"listening\"],\r\n\t[\"verb\", \"locking\"],\r\n\t[\"verb\", \"looking\"],\r\n\t[\"verb\", \"mean\"],\r\n\t[\"verb\", \"means\"],\r\n\t[\"verb\", \"meaning\"],\r\n\t[\"verb\", \"opening\"],\r\n\t[\"verb\", \"provide\"],\r\n\t[\"verb\", \"provides\"],\r\n\t[\"verb\", \"providing\"],\r\n\t[\"verb\", \"pulling\"],\r\n\t[\"verb\", \"pushing\"],\r\n\t[\"verb\", \"putting\"],\r\n\t[\"verb\", \"relate\"],\r\n\t[\"verb\", \"relates\"],\r\n\t[\"verb\", \"relating\"],\r\n\t[\"verb\", \"removing\"],\r\n\t[\"verb\", \"searching\"],\r\n\t[\"verb\", \"see\"],\r\n\t[\"verb\", \"sees\"],\r\n\t[\"verb\", \"seeing\"],\r\n\t[\"verb\", \"setting\"],\r\n\t[\"verb\", \"showing\"],\r\n\t[\"verb\", \"singing\"],\r\n\t[\"verb\", \"sleeping\"],\r\n\t[\"verb\", \"smelling\"],\r\n\t[\"verb\", \"squeezing\"],\r\n\t[\"verb\", \"switching\"],\r\n\t[\"verb\", \"support\"],\r\n\t[\"verb\", \"supports\"],\r\n\t[\"verb\", \"supporting\"],\r\n\t[\"verb\", \"swearing\"],\r\n\t[\"verb\", \"taking\"],\r\n\t[\"verb\", \"tasting\"],\r\n\t[\"verb\", \"telling\"],\r\n\t[\"verb\", \"thinking\"],\r\n\t[\"verb\", \"throwing\"],\r\n\t[\"verb\", \"touching\"],\r\n\t[\"verb\", \"turning\"],\r\n\t[\"verb\", \"tying\"],\r\n\t[\"verb\", \"unlock\"],\r\n\t[\"verb\", \"unlocks\"],\r\n\t[\"verb\", \"unlocking\"],\r\n\t[\"verb\", \"vary\"],\r\n\t[\"verb\", \"varies\"],\r\n\t[\"verb\", \"varying\"],\r\n\t[\"verb\", \"waiting\"],\r\n\t[\"verb\", \"waking\"],\r\n\t[\"verb\", \"waving\"],\r\n\t[\"verb\", \"wear\"],\r\n\t[\"verb\", \"wears\"],\r\n\t[\"verb\", \"wearing\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for verbs."
  },
  {
    "path": "tests/languages/ini/comment_feature.test",
    "content": "#\n\t;\n #\n ;\n#\n#\t\n# \n#;\n#[foo]\n#foo=bar\n#foobar\n;\n;\t\n; \n;#\n;[foo]\n;foo=bar\n;foobar\nfoo#bar\nfoobar#\nfoo;bar\nfoobar;\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"#\"],\n\t[\"comment\", \";\"],\n\t[\"comment\", \"#\"],\n\t[\"comment\", \";\"],\n\t[\"comment\", \"#\"],\n\t[\"comment\", \"#\\t\"],\n\t[\"comment\", \"# \"],\n\t[\"comment\", \"#;\"],\n\t[\"comment\", \"#[foo]\"],\n\t[\"comment\", \"#foo=bar\"],\n\t[\"comment\", \"#foobar\"],\n\t[\"comment\", \";\"],\n\t[\"comment\", \";\\t\"],\n\t[\"comment\", \"; \"],\n\t[\"comment\", \";#\"],\n\t[\"comment\", \";[foo]\"],\n\t[\"comment\", \";foo=bar\"],\n\t[\"comment\", \";foobar\"],\n\t\"\\r\\nfoo#bar\\r\\nfoobar#\\r\\nfoo;bar\\r\\nfoobar;\"\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/ini/key_value_feature.test",
    "content": "bar1\t=\n \"bar2\" =\n 'bar3' =\n bar4 =\n\" bar5 \"=\n\"bar6\"=\n' bar7 '=\n'bar8'=\n=\tbaz9\t\n= \"baz10\" \n= 'baz11' \n= baz12 \n=\" baz13 \"\n=\"b14\"a14\"z14\"\n=\"baz15\"\n=\"baz16\n=' baz17 '\n='baz18'\n=b19\"a19\"z19\n=b20\"az20\n=ba21\"z21\n=baz22\n=baz23\"\nbar24\nbar25 baz25=qux25\nbar26=\nbar27==baz27\nbar28=baz28\nbar29=baz29 qux29\nbar30=baz30=qux30\n\n----------------------------------------------------\n\n[\n\t[\"key\", \"bar1\"],\n\t[\"punctuation\", \"=\"],\n\n\t[\"key\", \"\\\"bar2\\\"\"],\n\t[\"punctuation\", \"=\"],\n\n\t[\"key\", \"'bar3'\"],\n\t[\"punctuation\", \"=\"],\n\n\t[\"key\", \"bar4\"],\n\t[\"punctuation\", \"=\"],\n\n\t[\"key\", \"\\\" bar5 \\\"\"],\n\t[\"punctuation\", \"=\"],\n\n\t[\"key\", \"\\\"bar6\\\"\"],\n\t[\"punctuation\", \"=\"],\n\n\t[\"key\", \"' bar7 '\"],\n\t[\"punctuation\", \"=\"],\n\n\t[\"key\", \"'bar8'\"],\n\t[\"punctuation\", \"=\"],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"baz9\"]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t\"\\\"\",\n\t\t[\"inner-value\", \"baz10\"],\n\t\t\"\\\"\"\n\t]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t\"'\",\n\t\t[\"inner-value\", \"baz11\"],\n\t\t\"'\"\n\t]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"baz12\"]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t\"\\\"\",\n\t\t[\"inner-value\", \" baz13 \"],\n\t\t\"\\\"\"\n\t]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t\"\\\"\",\n\t\t[\"inner-value\", \"b14\\\"a14\\\"z14\"],\n\t\t\"\\\"\"\n\t]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t\"\\\"\",\n\t\t[\"inner-value\", \"baz15\"],\n\t\t\"\\\"\"\n\t]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"\\\"baz16\"]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t\"'\",\n\t\t[\"inner-value\", \" baz17 \"],\n\t\t\"'\"\n\t]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t\"'\",\n\t\t[\"inner-value\", \"baz18\"],\n\t\t\"'\"\n\t]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"b19\\\"a19\\\"z19\"]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"b20\\\"az20\"]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"ba21\\\"z21\"]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"baz22\"]],\n\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"baz23\\\"\"]],\n\n\t\"\\r\\nbar24\\r\\n\",\n\n\t[\"key\", \"bar25 baz25\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"qux25\"]],\n\n\t[\"key\", \"bar26\"],\n\t[\"punctuation\", \"=\"],\n\n\t[\"key\", \"bar27\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"=baz27\"]],\n\n\t[\"key\", \"bar28\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"baz28\"]],\n\n\t[\"key\", \"bar29\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"baz29 qux29\"]],\n\n\t[\"key\", \"bar30\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\"baz30=qux30\"]]\n]\n\n----------------------------------------------------\n\nChecks for key-value pairs.\n"
  },
  {
    "path": "tests/languages/ini/punctuation_feature.test",
    "content": "=\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"=\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation marks.\n"
  },
  {
    "path": "tests/languages/ini/section_feature.test",
    "content": " [foo1] \n[ \"foo2\" ]\n[ foo3 ]\n[\" foo4 \"]\n[\"foo5 bar5\"]\n[\"foo6\"]\n[foo7\n[foo8 bar8]\n[foo9[bar9]\n[foo10]\n[foo11]bar11]\n\n----------------------------------------------------\n\n[\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"foo1\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"\\\"foo2\\\"\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"foo3\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"\\\" foo4 \\\"\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"\\\"foo5 bar5\\\"\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"\\\"foo6\\\"\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"foo7\"]\n\t]],\n\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"foo8 bar8\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"foo9[bar9\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"foo10\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"foo11\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t\"bar11]\"\n]\n\n----------------------------------------------------\n\nChecks for sections (and section names).\n"
  },
  {
    "path": "tests/languages/io/builtin_feature.test",
    "content": "Array\nAudioDevice\nAudioMixer\nBlock\nBox\nBuffer\nCFunction\nCGI\nColor\nCurses\nDBM\nDNSResolver\nDOConnection\nDOProxy\nDOServer\nDate\nDirectory\nDuration\nDynLib\nError\nException\nFFT\nFile\nFnmatch\nFont\nFuture\nGL\nGLE\nGLScissor\nGLU\nGLUCylinder\nGLUQuadric\nGLUSphere\nGLUT\nHost\nImage\nImporter\nLinkList\nList\nLobby\nLocals\nMD5\nMP3Decoder\nMP3Encoder\nMap\nMessage\nMovie\nNotification\nNumber\nObject\nOpenGL\nPoint\nProtos\nRegex\nSGML\nSGMLElement\nSGMLParser\nSQLite\nServer\nSequence\nShowMessage\nSleepyCat\nSleepyCatCursor\nSocket\nSocketManager\nSound\nSoup\nStore\nString\nTree\nUDPSender\nUPDReceiver\nURL\nUser\nWarning\nWeakLink\nRandom\nBigNum\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"Array\"],\n\t[\"builtin\", \"AudioDevice\"],\n\t[\"builtin\", \"AudioMixer\"],\n\t[\"builtin\", \"Block\"],\n\t[\"builtin\", \"Box\"],\n\t[\"builtin\", \"Buffer\"],\n\t[\"builtin\", \"CFunction\"],\n\t[\"builtin\", \"CGI\"],\n\t[\"builtin\", \"Color\"],\n\t[\"builtin\", \"Curses\"],\n\t[\"builtin\", \"DBM\"],\n\t[\"builtin\", \"DNSResolver\"],\n\t[\"builtin\", \"DOConnection\"],\n\t[\"builtin\", \"DOProxy\"],\n\t[\"builtin\", \"DOServer\"],\n\t[\"builtin\", \"Date\"],\n\t[\"builtin\", \"Directory\"],\n\t[\"builtin\", \"Duration\"],\n\t[\"builtin\", \"DynLib\"],\n\t[\"builtin\", \"Error\"],\n\t[\"builtin\", \"Exception\"],\n\t[\"builtin\", \"FFT\"],\n\t[\"builtin\", \"File\"],\n\t[\"builtin\", \"Fnmatch\"],\n\t[\"builtin\", \"Font\"],\n\t[\"builtin\", \"Future\"],\n\t[\"builtin\", \"GL\"],\n\t[\"builtin\", \"GLE\"],\n\t[\"builtin\", \"GLScissor\"],\n\t[\"builtin\", \"GLU\"],\n\t[\"builtin\", \"GLUCylinder\"],\n\t[\"builtin\", \"GLUQuadric\"],\n\t[\"builtin\", \"GLUSphere\"],\n\t[\"builtin\", \"GLUT\"],\n\t[\"builtin\", \"Host\"],\n\t[\"builtin\", \"Image\"],\n\t[\"builtin\", \"Importer\"],\n\t[\"builtin\", \"LinkList\"],\n\t[\"builtin\", \"List\"],\n\t[\"builtin\", \"Lobby\"],\n\t[\"builtin\", \"Locals\"],\n\t[\"builtin\", \"MD5\"],\n\t[\"builtin\", \"MP3Decoder\"],\n\t[\"builtin\", \"MP3Encoder\"],\n\t[\"builtin\", \"Map\"],\n\t[\"builtin\", \"Message\"],\n\t[\"builtin\", \"Movie\"],\n\t[\"builtin\", \"Notification\"],\n\t[\"builtin\", \"Number\"],\n\t[\"builtin\", \"Object\"],\n\t[\"builtin\", \"OpenGL\"],\n\t[\"builtin\", \"Point\"],\n\t[\"builtin\", \"Protos\"],\n\t[\"builtin\", \"Regex\"],\n\t[\"builtin\", \"SGML\"],\n\t[\"builtin\", \"SGMLElement\"],\n\t[\"builtin\", \"SGMLParser\"],\n\t[\"builtin\", \"SQLite\"],\n\t[\"builtin\", \"Server\"],\n\t[\"builtin\", \"Sequence\"],\n\t[\"builtin\", \"ShowMessage\"],\n\t[\"builtin\", \"SleepyCat\"],\n\t[\"builtin\", \"SleepyCatCursor\"],\n\t[\"builtin\", \"Socket\"],\n\t[\"builtin\", \"SocketManager\"],\n\t[\"builtin\", \"Sound\"],\n\t[\"builtin\", \"Soup\"],\n\t[\"builtin\", \"Store\"],\n\t[\"builtin\", \"String\"],\n\t[\"builtin\", \"Tree\"],\n\t[\"builtin\", \"UDPSender\"],\n\t[\"builtin\", \"UPDReceiver\"],\n\t[\"builtin\", \"URL\"],\n\t[\"builtin\", \"User\"],\n\t[\"builtin\", \"Warning\"],\n\t[\"builtin\", \"WeakLink\"],\n\t[\"builtin\", \"Random\"],\n\t[\"builtin\", \"BigNum\"]\n]\n"
  },
  {
    "path": "tests/languages/io/comment_feature.test",
    "content": "//\n// Foobar\n#!/usr/bin/env io\n/* multiline\ncomment\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"//\"],\n\t[\"comment\", \"// Foobar\"],\n\t[\"comment\", \"#!/usr/bin/env io\"],\n\t[\"comment\", \"/* multiline\\r\\ncomment\\r\\n*/\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/io/keyword_feature.test",
    "content": "activate\nactiveCoroCount\nasString\nblock\nbreak\ncatch\nclone\ncollectGarbage\ncompileString\ncontinue\ndo\ndoFile\ndoMessage\ndoString\nelse\nelseif\nexit\nfor\nforeach\nforward\ngetSlot\ngetEnvironmentVariable\nhasSlot\nif\nifFalse\nifNil\nifNilEval\nifTrue\nisActive\nisNil\nisResumable\nlist\nmessage\nmethod\nparent\npass\npause\nperform\nperformWithArgList\nprint\nprintln\nproto\nraise\nraiseResumable\nremoveSlot\nresend\nresume\nschedulerSleepSeconds\nself\nsender\nsetSchedulerSleepSeconds\nsetSlot\nshallowCopy\nslotNames\nsuper\nsystem\nthen\nthisBlock\nthisContext\ncall\ntry\ntype\nuniqueId\nupdateSlot\nwait\nwhile\nwrite\nyield\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"activate\"],\n\t[\"keyword\", \"activeCoroCount\"],\n\t[\"keyword\", \"asString\"],\n\t[\"keyword\", \"block\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"catch\"],\n\t[\"keyword\", \"clone\"],\n\t[\"keyword\", \"collectGarbage\"],\n\t[\"keyword\", \"compileString\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"do\"],\n\t[\"keyword\", \"doFile\"],\n\t[\"keyword\", \"doMessage\"],\n\t[\"keyword\", \"doString\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"elseif\"],\n\t[\"keyword\", \"exit\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"foreach\"],\n\t[\"keyword\", \"forward\"],\n\t[\"keyword\", \"getSlot\"],\n\t[\"keyword\", \"getEnvironmentVariable\"],\n\t[\"keyword\", \"hasSlot\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"ifFalse\"],\n\t[\"keyword\", \"ifNil\"],\n\t[\"keyword\", \"ifNilEval\"],\n\t[\"keyword\", \"ifTrue\"],\n\t[\"keyword\", \"isActive\"],\n\t[\"keyword\", \"isNil\"],\n\t[\"keyword\", \"isResumable\"],\n\t[\"keyword\", \"list\"],\n\t[\"keyword\", \"message\"],\n\t[\"keyword\", \"method\"],\n\t[\"keyword\", \"parent\"],\n\t[\"keyword\", \"pass\"],\n\t[\"keyword\", \"pause\"],\n\t[\"keyword\", \"perform\"],\n\t[\"keyword\", \"performWithArgList\"],\n\t[\"keyword\", \"print\"],\n\t[\"keyword\", \"println\"],\n\t[\"keyword\", \"proto\"],\n\t[\"keyword\", \"raise\"],\n\t[\"keyword\", \"raiseResumable\"],\n\t[\"keyword\", \"removeSlot\"],\n\t[\"keyword\", \"resend\"],\n\t[\"keyword\", \"resume\"],\n\t[\"keyword\", \"schedulerSleepSeconds\"],\n\t[\"keyword\", \"self\"],\n\t[\"keyword\", \"sender\"],\n\t[\"keyword\", \"setSchedulerSleepSeconds\"],\n\t[\"keyword\", \"setSlot\"],\n\t[\"keyword\", \"shallowCopy\"],\n\t[\"keyword\", \"slotNames\"],\n\t[\"keyword\", \"super\"],\n\t[\"keyword\", \"system\"],\n\t[\"keyword\", \"then\"],\n\t[\"keyword\", \"thisBlock\"],\n\t[\"keyword\", \"thisContext\"],\n\t[\"keyword\", \"call\"],\n\t[\"keyword\", \"try\"],\n\t[\"keyword\", \"type\"],\n\t[\"keyword\", \"uniqueId\"],\n\t[\"keyword\", \"updateSlot\"],\n\t[\"keyword\", \"wait\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"write\"],\n\t[\"keyword\", \"yield\"]\n]\n"
  },
  {
    "path": "tests/languages/io/number_feature.test",
    "content": "123\n123.456\n0.456\n123e-4\n123e4\n123.456e-7\n123.456e2\n\n------------------------------\n\n[\n    [\"number\", \"123\"],\n    [\"number\", \"123.456\"],\n    [\"number\", \"0.456\"],\n    [\"number\", \"123e-4\"],\n    [\"number\", \"123e4\"],\n    [\"number\", \"123.456e-7\"],\n    [\"number\", \"123.456e2\"]\n]\n\n------------------------------\n\nCheck numbers.\n"
  },
  {
    "path": "tests/languages/io/operator_feature.test",
    "content": "::= := = \n== != >= <=\n&& and || or not\n..\n+ - / * **\n%= &= *= += -= /= <<= >>= ^= |=\n? ?? @ @@\nreturn\n\n-------------------------------------------------------------------------------------------------------------------------\n\n[\n\t[\"operator\", \"::=\"    ] , [\"operator\", \":=\"  ] , [\"operator\", \"=\"   ] ,\n\t[\"operator\", \"==\"     ] , [\"operator\", \"!=\"  ] , [\"operator\", \">=\"  ] , [\"operator\", \"<=\" ] ,\n\t[\"operator\", \"&&\"     ] , [\"operator\", \"and\" ] , [\"operator\", \"||\"  ] , [\"operator\", \"or\" ] , [\"operator\", \"not\" ] ,\n\t[\"operator\", \"..\"     ] ,\n\t[\"operator\", \"+\"      ] , [\"operator\", \"-\"   ] , [\"operator\", \"/\"   ] , [\"operator\", \"*\"  ] , [\"operator\", \"**\"  ] ,\n\t[\"operator\", \"%=\"     ] , [\"operator\", \"&=\"  ] , [\"operator\", \"*=\"  ] , [\"operator\", \"+=\" ] , [\"operator\", \"-=\"  ] ,\n\t[\"operator\", \"/=\"     ] , [\"operator\", \"<<=\" ] , [\"operator\", \">>=\" ] , [\"operator\", \"^=\" ] , [\"operator\", \"|=\"  ] ,\n\t[\"operator\", \"?\"      ] , [\"operator\", \"??\"  ] , [\"operator\", \"@\"   ] , [\"operator\", \"@@\" ] ,\n\t[\"operator\", \"return\" ]\n]\n\n-------------------------------------------------------------------------------------------------------------------------\n\nCheck operators.\n"
  },
  {
    "path": "tests/languages/io/string_feature.test",
    "content": "\"\"\n\"\"\"\"\"\"\n\"this is a \\\"test\\\".\\nThis is only a test.\"\n\"\"\"this is a \"test\".\nThis is only a test.\"\"\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"\\\"\\\"\\\"\"],\n\t[\"string\", \"\\\"this is a \\\\\\\"test\\\\\\\".\\\\nThis is only a test.\\\"\"],\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"this is a \\\"test\\\".\\r\\nThis is only a test.\\\"\\\"\\\"\"]\n]\n\n----------------------------------------------------\n\nCheck strings.\n"
  },
  {
    "path": "tests/languages/j/adverb_feature.test",
    "content": "~ }\r\n/ /.\r\n\\ \\.\r\nb. f. M.\r\nt. t:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"adverb\", \"~\"], [\"adverb\", \"}\"],\r\n\t[\"adverb\", \"/\"], [\"adverb\", \"/.\"],\r\n\t[\"adverb\", \"\\\\\"], [\"adverb\", \"\\\\.\"],\r\n\t[\"adverb\", \"b.\"], [\"adverb\", \"f.\"], [\"adverb\", \"M.\"],\r\n\t[\"adverb\", \"t.\"], [\"adverb\", \"t:\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for adverbs."
  },
  {
    "path": "tests/languages/j/comment_feature.test",
    "content": "NB.\r\nNB. Foo bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"NB.\"],\r\n\t[\"comment\", \"NB. Foo bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/j/conjunction_feature.test",
    "content": "& &. &.: &:\r\n\r\n. .. .:\r\n: :. ::\r\n@ @. @:\r\n\r\n!. !:\r\nD. D:\r\n\r\n;. d. H. T.\r\n\r\n` `:\r\n\r\n^: L: S:\r\n\r\n\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"conjunction\", \"&\"], [\"conjunction\", \"&.\"], [\"conjunction\", \"&.:\"], [\"conjunction\", \"&:\"],\r\n\r\n\t[\"conjunction\", \".\"], [\"conjunction\", \"..\"], [\"conjunction\", \".:\"],\r\n\t[\"conjunction\", \":\"], [\"conjunction\", \":.\"], [\"conjunction\", \"::\"],\r\n\t[\"conjunction\", \"@\"], [\"conjunction\", \"@.\"], [\"conjunction\", \"@:\"],\r\n\r\n\t[\"conjunction\", \"!.\"], [\"conjunction\", \"!:\"],\r\n\t[\"conjunction\", \"D.\"], [\"conjunction\", \"D:\"],\r\n\r\n\t[\"conjunction\", \";.\"], [\"conjunction\", \"d.\"], [\"conjunction\", \"H.\"], [\"conjunction\", \"T.\"],\r\n\r\n\t[\"conjunction\", \"`\"], [\"conjunction\", \"`:\"],\r\n\r\n\t[\"conjunction\", \"^:\"], [\"conjunction\", \"L:\"], [\"conjunction\", \"S:\"],\r\n\r\n\t[\"conjunction\", \"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for conjunctions."
  },
  {
    "path": "tests/languages/j/keyword_feature.test",
    "content": "adverb\r\nconjunction\r\nCR\r\ndef\r\ndefine\r\ndyad\r\nLF\r\nmonad\r\nnoun\r\nverb\r\n\r\nassert.\r\nbreak.\r\ncase.\r\ncatch.\r\ncatchd.\r\ncatcht.\r\ncontinue.\r\ndo.\r\nelse.\r\nelseif.\r\nend.\r\nfcase.\r\nfor.\r\nfor_foobar.\r\ngoto_foobar.\r\nif.\r\nlabel_foobar.\r\nreturn.\r\nselect.\r\nthrow.\r\ntry.\r\nwhile.\r\nwhilst.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"adverb\"],\r\n\t[\"keyword\", \"conjunction\"],\r\n\t[\"keyword\", \"CR\"],\r\n\t[\"keyword\", \"def\"],\r\n\t[\"keyword\", \"define\"],\r\n\t[\"keyword\", \"dyad\"],\r\n\t[\"keyword\", \"LF\"],\r\n\t[\"keyword\", \"monad\"],\r\n\t[\"keyword\", \"noun\"],\r\n\t[\"keyword\", \"verb\"],\r\n\r\n\t[\"keyword\", \"assert.\"],\r\n\t[\"keyword\", \"break.\"],\r\n\t[\"keyword\", \"case.\"],\r\n\t[\"keyword\", \"catch.\"],\r\n\t[\"keyword\", \"catchd.\"],\r\n\t[\"keyword\", \"catcht.\"],\r\n\t[\"keyword\", \"continue.\"],\r\n\t[\"keyword\", \"do.\"],\r\n\t[\"keyword\", \"else.\"],\r\n\t[\"keyword\", \"elseif.\"],\r\n\t[\"keyword\", \"end.\"],\r\n\t[\"keyword\", \"fcase.\"],\r\n\t[\"keyword\", \"for.\"],\r\n\t[\"keyword\", \"for_foobar.\"],\r\n\t[\"keyword\", \"goto_foobar.\"],\r\n\t[\"keyword\", \"if.\"],\r\n\t[\"keyword\", \"label_foobar.\"],\r\n\t[\"keyword\", \"return.\"],\r\n\t[\"keyword\", \"select.\"],\r\n\t[\"keyword\", \"throw.\"],\r\n\t[\"keyword\", \"try.\"],\r\n\t[\"keyword\", \"while.\"],\r\n\t[\"keyword\", \"whilst.\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/j/number_feature.test",
    "content": "2.3e2 2.3e_2 2j3\r\n230 0.023 2j3\r\n\r\n2p1 1p_1\r\n6.28319 0.31831\r\n\r\n1x2 2x1 1x_1\r\n7.38906 5.43656 0.367879\r\n\r\n2e2j_2e2 2e2j2p1 2ad45 2ar0.785398\r\n200j_200 628.319j6.28319 1.41421j1.41421 1.41421j1.41421\r\n\r\n16b1f 10b23 _10b23 1e2b23 2b111.111\r\n31 23 _17 203 7.875\r\n\r\n_ __\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"2.3e2\"], [\"number\", \"2.3e_2\"], [\"number\", \"2j3\"],\r\n\t[\"number\", \"230\"], [\"number\", \"0.023\"], [\"number\", \"2j3\"],\r\n\r\n\t[\"number\", \"2p1\"], [\"number\", \"1p_1\"],\r\n\t[\"number\", \"6.28319\"], [\"number\", \"0.31831\"],\r\n\r\n\t[\"number\", \"1x2\"], [\"number\", \"2x1\"], [\"number\", \"1x_1\"],\r\n\t[\"number\", \"7.38906\"], [\"number\", \"5.43656\"], [\"number\", \"0.367879\"],\r\n\r\n\t[\"number\", \"2e2j_2e2\"], [\"number\", \"2e2j2p1\"], [\"number\", \"2ad45\"], [\"number\", \"2ar0.785398\"],\r\n\t[\"number\", \"200j_200\"], [\"number\", \"628.319j6.28319\"], [\"number\", \"1.41421j1.41421\"], [\"number\", \"1.41421j1.41421\"],\r\n\r\n\t[\"number\", \"16b1f\"], [\"number\", \"10b23\"], [\"number\", \"_10b23\"], [\"number\", \"1e2b23\"], [\"number\", \"2b111.111\"],\r\n\t[\"number\", \"31\"], [\"number\", \"23\"], [\"number\", \"_17\"], [\"number\", \"203\"], [\"number\", \"7.875\"],\r\n\r\n\t[\"number\", \"_\"], [\"number\", \"__\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/j/operator_feature.test",
    "content": "_.\n=. =:\na.\na:\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"_.\"],\n\t[\"operator\", \"=.\"],\n\t[\"operator\", \"=:\"],\n\t[\"operator\", \"a.\"],\n\t[\"operator\", \"a:\"]\n]\n"
  },
  {
    "path": "tests/languages/j/string_feature.test",
    "content": "''\r\n'fo''obar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo''obar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/j/verb_feature.test",
    "content": "{ {. {: {::\r\n\r\np. p.. p:\r\n\r\n=\r\n!\r\n]\r\n\r\n< <. <:\r\n> >. >:\r\n+ +. +:\r\n* *. *:\r\n- -. -:\r\n% %. %:\r\n$ $. $:\r\n| |. |:\r\n, ,. ,:\r\n# #. #:\r\n\r\n^ ^.\r\n? ?.\r\n\r\n; ;:\r\n[ [:\r\n\r\n~. ~:\r\n}. }:\r\n\". \":\r\ni. i:\r\n\r\nA. C. e.\r\nE. I. j.\r\nL. o. r.\r\n\r\n_: /: \\:\r\nq: s: u: x:\r\n_9: _8: _7:\r\n_6: _5: _4:\r\n_3: _2: _1:\r\n1: 2: 3:\r\n4: 5: 6:\r\n7: 8: 9:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"verb\", \"{\"], [\"verb\", \"{.\"], [\"verb\", \"{:\"], [\"verb\", \"{::\"],\r\n\r\n\t[\"verb\", \"p.\"], [\"verb\", \"p..\"], [\"verb\", \"p:\"],\r\n\r\n\t[\"verb\", \"=\"],\r\n\t[\"verb\", \"!\"],\r\n\t[\"verb\", \"]\"],\r\n\r\n\t[\"verb\", \"<\"], [\"verb\", \"<.\"], [\"verb\", \"<:\"],\r\n\t[\"verb\", \">\"], [\"verb\", \">.\"], [\"verb\", \">:\"],\r\n\t[\"verb\", \"+\"], [\"verb\", \"+.\"], [\"verb\", \"+:\"],\r\n\t[\"verb\", \"*\"], [\"verb\", \"*.\"], [\"verb\", \"*:\"],\r\n\t[\"verb\", \"-\"], [\"verb\", \"-.\"], [\"verb\", \"-:\"],\r\n\t[\"verb\", \"%\"], [\"verb\", \"%.\"], [\"verb\", \"%:\"],\r\n\t[\"verb\", \"$\"], [\"verb\", \"$.\"], [\"verb\", \"$:\"],\r\n\t[\"verb\", \"|\"], [\"verb\", \"|.\"], [\"verb\", \"|:\"],\r\n\t[\"verb\", \",\"], [\"verb\", \",.\"], [\"verb\", \",:\"],\r\n\t[\"verb\", \"#\"], [\"verb\", \"#.\"], [\"verb\", \"#:\"],\r\n\r\n\t[\"verb\", \"^\"], [\"verb\", \"^.\"],\r\n\t[\"verb\", \"?\"], [\"verb\", \"?.\"],\r\n\r\n\t[\"verb\", \";\"], [\"verb\", \";:\"],\r\n\t[\"verb\", \"[\"], [\"verb\", \"[:\"],\r\n\r\n\t[\"verb\", \"~.\"], [\"verb\", \"~:\"],\r\n\t[\"verb\", \"}.\"], [\"verb\", \"}:\"],\r\n\t[\"verb\", \"\\\".\"], [\"verb\", \"\\\":\"],\r\n\t[\"verb\", \"i.\"], [\"verb\", \"i:\"],\r\n\r\n\t[\"verb\", \"A.\"], [\"verb\", \"C.\"], [\"verb\", \"e.\"],\r\n\t[\"verb\", \"E.\"], [\"verb\", \"I.\"], [\"verb\", \"j.\"],\r\n\t[\"verb\", \"L.\"], [\"verb\", \"o.\"], [\"verb\", \"r.\"],\r\n\r\n\t[\"verb\", \"_:\"], [\"verb\", \"/:\"], [\"verb\", \"\\\\:\"],\r\n\t[\"verb\", \"q:\"], [\"verb\", \"s:\"], [\"verb\", \"u:\"], [\"verb\", \"x:\"],\r\n\t[\"verb\", \"_9:\"], [\"verb\", \"_8:\"], [\"verb\", \"_7:\"],\r\n\t[\"verb\", \"_6:\"], [\"verb\", \"_5:\"], [\"verb\", \"_4:\"],\r\n\t[\"verb\", \"_3:\"], [\"verb\", \"_2:\"], [\"verb\", \"_1:\"],\r\n\t[\"verb\", \"1:\"], [\"verb\", \"2:\"], [\"verb\", \"3:\"],\r\n\t[\"verb\", \"4:\"], [\"verb\", \"5:\"], [\"verb\", \"6:\"],\r\n\t[\"verb\", \"7:\"], [\"verb\", \"8:\"], [\"verb\", \"9:\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for verbs."
  },
  {
    "path": "tests/languages/java/annotation_feature.test",
    "content": "@Override\r\n@Documented\r\n@java.long.annotation.Documented\r\n\r\n@Retention(value=SOURCE)\r\n@Target(value={PACKAGE,TYPE})\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"annotation\", \"@Override\"],\r\n\t[\"annotation\", \"@Documented\"],\r\n\t[\"annotation\", \"@java.long.annotation.Documented\"],\r\n\r\n\t[\"annotation\", \"@Retention\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"value\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"constant\", \"SOURCE\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"annotation\", \"@Target\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"value\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"constant\", \"PACKAGE\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"constant\", \"TYPE\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/java/char_feature.test",
    "content": "'A'\n'\\n'\n'\\u0041'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'A'\"],\n\t[\"char\", \"'\\\\n'\"],\n\t[\"char\", \"'\\\\u0041'\"]\n]\n"
  },
  {
    "path": "tests/languages/java/class-name_feature.test",
    "content": "class Foo extends foo.bar.Foo {\n\n\tjava.util.List<foo.bar.Foo.Bar> bar(foo.bar.Baz bat) throws java.lang.Exception {\n\t\tvar foo = new java.lang.UnsupportedOperationException(\"Not implemented\");\n\t\tException e = foo;\n\t\tthrow e;\n\t}\n\n}\n\nimport com.lib.ID;\nID id = new ID();\nID.Nested id;\nID::new\nID[]::new\n\nString.valueOf(5);\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"Foo\"]],\n\t[\"keyword\", \"extends\"],\n\t[\"class-name\", [\n\t\t[\"namespace\", [\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"bar\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t\"Foo\"\n\t]],\n\t[\"punctuation\", \"{\"],\n\n\t[\"class-name\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"util\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t\"List\"\n\t]],\n\t[\"generics\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"class-name\", [\n\t\t\t[\"namespace\", [\n\t\t\t\t\"foo\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"bar\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t\"Foo\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"Bar\"\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"function\", \"bar\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"namespace\", [\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"bar\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t\"Baz\"\n\t]],\n\t\" bat\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"throws\"],\n\t[\"class-name\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"lang\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t\"Exception\"\n\t]],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"var\"],\n\t\" foo \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"new\"],\n\t[\"class-name\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"lang\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t\"UnsupportedOperationException\"\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Not implemented\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\"Exception\"]],\n\t\" e \",\n\t[\"operator\", \"=\"],\n\t\" foo\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"throw\"],\n\t\" e\",\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"com\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"lib\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"ID\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\"ID\"]],\n\t\" id \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"new\"],\n\t[\"class-name\", [\"ID\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\n\t\t\"ID\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Nested\"\n\t]],\n\t\" id\",\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\"ID\"]],\n\t[\"operator\", \"::\"],\n\t[\"keyword\", \"new\"],\n\n\t[\"class-name\", [\"ID\"]],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"::\"],\n\t[\"keyword\", \"new\"],\n\n\t[\"class-name\", [\"String\"]],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"valueOf\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"5\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/java/constant_feature.test",
    "content": "public class Test {\n    private static final String AAAA = \"aaaaaa\";\n\n    private String str = \"1\";\n\n    public static void main(String[] args) {\n        str += AAAA + \"AAAA\";\n    }\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"Test\"]],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"private\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"final\"],\n\t[\"class-name\", [\"String\"]],\n\t[\"constant\", \"AAAA\"],\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"aaaaaa\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"private\"],\n\t[\"class-name\", [\"String\"]],\n\t\" str \",\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"1\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"void\"],\n\t[\"function\", \"main\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\"String\"]],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t\" args\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n        str \",\n\t[\"operator\", \"+=\"],\n\t[\"constant\", \"AAAA\"],\n\t[\"operator\", \"+\"],\n\t[\"string\", \"\\\"AAAA\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for all constants.\n"
  },
  {
    "path": "tests/languages/java/function_featrue.test",
    "content": "void foo(int a) {}\nfoo(0);\nBar::foo;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"void\"],\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"int\"],\n\t\" a\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\n\t\t\"Bar\"\n\t]],\n\t[\"operator\", \"::\"],\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for functions.\n"
  },
  {
    "path": "tests/languages/java/generics_feature.test",
    "content": "public class Solo<T extends com.foo.Foo.Bar> {}\r\nSolo<Integer> val = new Solo<>();\r\nDuo<Double, Character> dual = new Duo<Double, Character>(12.2585, 'C');\r\n\r\nList<?> list\r\nList<? extends Number> nums = ints;\r\nList<? super Integer> list\r\nEntry<String, String> pair = Entry.<String>twice(\"Hello\");\r\n\r\npublic class Entry<KeyType, ValueType> {}\r\nclass D <T extends A & B & C> {}\r\n\r\npublic <T extends Throwable> void throwMeConditional(boolean conditional, T exception) throws T {}\r\n\r\n<T> T instantiateElementType(List<T> arg) {}\r\n\r\n// not generics\r\nif (a<6&&b>6){}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"Solo\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\"T\"]],\r\n\t\t[\"keyword\", \"extends\"],\r\n\t\t[\"class-name\", [\r\n\t\t\t[\"namespace\", [\r\n\t\t\t\t\"com\",\r\n\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\"foo\",\r\n\t\t\t\t[\"punctuation\", \".\"]\r\n\t\t\t]],\r\n\t\t\t\"Foo\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Bar\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"class-name\", [\"Solo\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\"Integer\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" val \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"class-name\", [\"Solo\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"class-name\", [\"Duo\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\"Double\"]],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", [\"Character\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" dual \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"class-name\", [\"Duo\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\"Double\"]],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", [\"Character\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"12.2585\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"char\", \"'C'\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"class-name\", [\"List\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"operator\", \"?\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" list\\r\\n\",\r\n\r\n\t[\"class-name\", [\"List\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"operator\", \"?\"],\r\n\t\t[\"keyword\", \"extends\"],\r\n\t\t[\"class-name\", [\"Number\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" nums \",\r\n\t[\"operator\", \"=\"],\r\n\t\" ints\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"class-name\", [\"List\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"operator\", \"?\"],\r\n\t\t[\"keyword\", \"super\"],\r\n\t\t[\"class-name\", [\"Integer\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" list\\r\\n\",\r\n\r\n\t[\"class-name\", [\"Entry\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\"String\"]],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", [\"String\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" pair \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"class-name\", [\"Entry\"]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\"String\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", \"twice\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\"Hello\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"Entry\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\"KeyType\"]],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", [\"ValueType\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"D\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\"T\"]],\r\n\t\t[\"keyword\", \"extends\"],\r\n\t\t[\"class-name\", [\"A\"]],\r\n\t\t[\"operator\", \"&\"],\r\n\t\t[\"class-name\", [\"B\"]],\r\n\t\t[\"operator\", \"&\"],\r\n\t\t[\"class-name\", [\"C\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\"T\"]],\r\n\t\t[\"keyword\", \"extends\"],\r\n\t\t[\"class-name\", [\"Throwable\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"function\", \"throwMeConditional\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"boolean\"],\r\n\t\" conditional\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", [\"T\"]],\r\n\t\" exception\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"throws\"],\r\n\t[\"class-name\", [\"T\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\"T\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"class-name\", [\"T\"]],\r\n\t[\"function\", \"instantiateElementType\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\"List\"]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\"T\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" arg\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"comment\", \"// not generics\"],\r\n\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"a\",\r\n\t[\"operator\", \"<\"],\r\n\t[\"number\", \"6\"],\r\n\t[\"operator\", \"&&\"],\r\n\t\"b\",\r\n\t[\"operator\", \">\"],\r\n\t[\"number\", \"6\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for generics.\r\n"
  },
  {
    "path": "tests/languages/java/issue1351.test",
    "content": "public class AllChangesIndexer extends SiteIndexer<Change.Id, ChangeData, ChangeIndex> {\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"AllChangesIndexer\"\r\n\t]],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\r\n\t\t\"SiteIndexer\"\r\n\t]],\r\n\t[\"generics\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", [\r\n\t\t\t\"Change\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Id\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", [\r\n\t\t\t\"ChangeData\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", [\r\n\t\t\t\"ChangeIndex\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for generics. See #1351"
  },
  {
    "path": "tests/languages/java/issue3345.test",
    "content": "public class Main {\n    // \"record\" is used as variable name, but Prism marked it keyword\n    public static void main(String[] record) {\n        System.out.println(record);\n    }\n    // \"record\" is used as method name, but Prism marked it keyword\n    public void record(String aaa){\n    }\n    // \"record\" is keyword since java 14\n    public static record A() {\n    }\n    // it cannot be used as class name in java syntax\n    public static class record {\n    }\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"Main\"]],\n\t[\"punctuation\", \"{\"],\n\n\t[\"comment\", \"// \\\"record\\\" is used as variable name, but Prism marked it keyword\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"void\"],\n\t[\"function\", \"main\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\"String\"]],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t\" record\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"class-name\", [\"System\"]],\n\t[\"punctuation\", \".\"],\n\t\"out\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"println\"],\n\t[\"punctuation\", \"(\"],\n\t\"record\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"comment\", \"// \\\"record\\\" is used as method name, but Prism marked it keyword\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"void\"],\n\t[\"function\", \"record\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\"String\"]],\n\t\" aaa\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"comment\", \"// \\\"record\\\" is keyword since java 14\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"record\"],\n\t[\"class-name\", [\"A\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"comment\", \"// it cannot be used as class name in java syntax\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"class\"],\n\t\" record \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/java/issue3350.test",
    "content": "import java.nio.charset.StandardCharsets;\nimport java.security.MessageDigest;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.UUID;\nimport java.util.regex.Pattern;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"import\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"nio\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"charset\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"StandardCharsets\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"security\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"MessageDigest\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"util\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Arrays\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"util\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"HashSet\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"util\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"UUID\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"util\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"regex\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Pattern\"]\n\t]],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/java/keyword_feature.test",
    "content": "abstract continue for\r\nnew\r\nswitch assert default\r\ngoto package synchronized\r\nboolean do if private\r\nthis break double\r\nimplements\r\nprotected throw byte else\r\nimport public throws case\r\nenum\r\ninstanceof\r\nrecord return transient catch\r\nextends\r\nint short try char\r\nfinal\r\ninterface\r\nstatic void\r\nclass\r\nfinally long\r\nstrictfp volatile const\r\nfloat native super while\r\nvar null\r\nmodule requires transitive\r\nexports uses open\r\nopens with to provides\r\nyield\r\nsealed non-sealed permits\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"], [\"keyword\", \"continue\"], [\"keyword\", \"for\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"switch\"], [\"keyword\", \"assert\"], [\"keyword\", \"default\"],\r\n\t[\"keyword\", \"goto\"], [\"keyword\", \"package\"], [\"keyword\", \"synchronized\"],\r\n\t[\"keyword\", \"boolean\"], [\"keyword\", \"do\"], [\"keyword\", \"if\"], [\"keyword\", \"private\"],\r\n\t[\"keyword\", \"this\"], [\"keyword\", \"break\"], [\"keyword\", \"double\"],\r\n\t[\"keyword\", \"implements\"],\r\n\t[\"keyword\", \"protected\"], [\"keyword\", \"throw\"], [\"keyword\", \"byte\"], [\"keyword\", \"else\"],\r\n\t[\"keyword\", \"import\"], [\"keyword\", \"public\"], [\"keyword\", \"throws\"], [\"keyword\", \"case\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"instanceof\"],\r\n\t[\"keyword\", \"record\"], [\"keyword\", \"return\"], [\"keyword\", \"transient\"], [\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"keyword\", \"int\"], [\"keyword\", \"short\"], [\"keyword\", \"try\"], [\"keyword\", \"char\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"keyword\", \"static\"], [\"keyword\", \"void\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"finally\"], [\"keyword\", \"long\"],\r\n\t[\"keyword\", \"strictfp\"], [\"keyword\", \"volatile\"], [\"keyword\", \"const\"],\r\n\t[\"keyword\", \"float\"], [\"keyword\", \"native\"], [\"keyword\", \"super\"], [\"keyword\", \"while\"],\r\n\t[\"keyword\", \"var\"], [\"keyword\", \"null\"],\r\n\t[\"keyword\", \"module\"], [\"keyword\", \"requires\"], [\"keyword\", \"transitive\"],\r\n\t[\"keyword\", \"exports\"], [\"keyword\", \"uses\"], [\"keyword\", \"open\"],\r\n\t[\"keyword\", \"opens\"], [\"keyword\", \"with\"], [\"keyword\", \"to\"], [\"keyword\", \"provides\"],\r\n\t[\"keyword\", \"yield\"],\r\n\t[\"keyword\", \"sealed\"], [\"keyword\", \"non-sealed\"], [\"keyword\", \"permits\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/java/module_feature.test",
    "content": "module com.js.prism {\r\n\texports java.net.http;\r\n\texports jdk.internal.editor.spi to jdk.jshell;\r\n\r\n\trequires java.base;\r\n\trequires transitive java.xml;\r\n\r\n\tuses java.net.ContentHandlerFactory;\r\n\r\n\topens java.time.DateTime;\r\n\topens java.time.LocalDateTime to java.logging;\r\n\r\n\tprovides com.modules.hello.HelloInterface with com.modules.hello.HelloModules;\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"module\"],\r\n\t[\"namespace\", [\r\n\t\t\"com\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"js\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"prism\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"exports\"],\r\n\t[\"namespace\", [\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"http\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"exports\"],\r\n\t[\"namespace\", [\r\n\t\t\"jdk\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"internal\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"editor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"spi\"\r\n\t]],\r\n\t[\"keyword\", \"to\"],\r\n\t[\"namespace\", [\r\n\t\t\"jdk\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"jshell\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"requires\"],\r\n\t[\"namespace\", [\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"base\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"requires\"],\r\n\t[\"keyword\", \"transitive\"],\r\n\t[\"namespace\", [\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"xml\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"uses\"],\r\n\t[\"namespace\", [\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"net\",\r\n\t\t[\"punctuation\", \".\"]\r\n\t]],\r\n\t[\"class-name\", [\r\n\t\t\"ContentHandlerFactory\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"opens\"],\r\n\t[\"namespace\", [\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"time\",\r\n\t\t[\"punctuation\", \".\"]\r\n\t]],\r\n\t[\"class-name\", [\r\n\t\t\"DateTime\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"opens\"],\r\n\t[\"namespace\", [\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"time\",\r\n\t\t[\"punctuation\", \".\"]\r\n\t]],\r\n\t[\"class-name\", [\r\n\t\t\"LocalDateTime\"\r\n\t]],\r\n\t[\"keyword\", \"to\"],\r\n\t[\"namespace\", [\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"logging\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"provides\"],\r\n\t[\"namespace\", [\r\n\t\t\"com\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"modules\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"hello\",\r\n\t\t[\"punctuation\", \".\"]\r\n\t]],\r\n\t[\"class-name\", [\r\n\t\t\"HelloInterface\"\r\n\t]],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"namespace\", [\r\n\t\t\"com\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"modules\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"hello\",\r\n\t\t[\"punctuation\", \".\"]\r\n\t]],\r\n\t[\"class-name\", [\r\n\t\t\"HelloModules\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for module definition.\r\n"
  },
  {
    "path": "tests/languages/java/number_feature.test",
    "content": "42\r\n42d\r\n42L\r\n\r\n1.2e3f\r\n0.1E-4f\r\n0.2e+1f\r\n\r\n0xBadFace\r\n\r\n0x1.8p1\r\n0xa.fp-2\r\n0xa.fp+2\r\n0xa.p+3f\r\n0x.fp+3f\r\n\r\n0b11110000\r\n\r\n1_2_3\r\n1_2.3_4e-5_6\r\n\r\n0x1_2\r\n0x0_1__2_3\r\n\r\n0b1_1_1_1__0_0_0_0\r\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"42d\"],\r\n\t[\"number\", \"42L\"],\r\n\r\n\t[\"number\", \"1.2e3f\"],\r\n\t[\"number\", \"0.1E-4f\"],\r\n\t[\"number\", \"0.2e+1f\"],\r\n\r\n\t[\"number\", \"0xBadFace\"],\r\n\r\n\t[\"number\", \"0x1.8p1\"],\r\n\t[\"number\", \"0xa.fp-2\"],\r\n\t[\"number\", \"0xa.fp+2\"],\r\n\t[\"number\", \"0xa.p+3f\"],\r\n\t[\"number\", \"0x.fp+3f\"],\r\n\r\n\t[\"number\", \"0b11110000\"],\r\n\r\n\t[\"number\", \"1_2_3\"],\r\n\t[\"number\", \"1_2.3_4e-5_6\"],\r\n\r\n\t[\"number\", \"0x1_2\"],\r\n\t[\"number\", \"0x0_1__2_3\"],\r\n\r\n\t[\"number\", \"0b1_1_1_1__0_0_0_0\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for binary, hexadecimal and decimal numbers.\r\n"
  },
  {
    "path": "tests/languages/java/operator_feature.test",
    "content": "+ ++ +=\r\n- -- -=\r\n! !=\r\n< << <= <<=\r\n> >> >>> >= >>= >>>=\r\n= ==\r\n& && &=\r\n| || |=\r\n? : ~\r\n^ ^=\r\n* *=\r\n/ /=\r\n% %=\r\n-> ::\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<=\"], [\"operator\", \"<<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">>>\"], [\"operator\", \">=\"], [\"operator\", \">>=\"], [\"operator\", \">>>=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"&=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"], [\"operator\", \"|=\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \":\"], [\"operator\", \"~\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%=\"],\r\n\t[\"operator\", \"->\"], [\"operator\", \"::\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/java/package_feature.test",
    "content": "package java;\npackage java.lang;\n\nimport foo.Bar;\nimport foo.ID;\nimport java.lang.Math;\nimport java.lang.*;\n\nimport static foo.Bar.BAZ;\nimport static foo.ID.DEFAULT;\nimport static java.lang.Math.PI;\nimport static java.lang.Math.sin;\nimport static java.lang.Math.*;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"package\"],\n\t[\"namespace\", [\"java\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"package\"],\n\t[\"namespace\", [\n\t\t\"java\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"lang\"\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Bar\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"ID\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"lang\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Math\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"lang\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"operator\", \"*\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"static\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Bar\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"static\", \"BAZ\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"static\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"ID\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"static\", \"DEFAULT\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"static\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"lang\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Math\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"static\", \"PI\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"static\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"lang\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Math\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"static\", \"sin\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"static\"],\n\t[\"import\", [\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"lang\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Math\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"operator\", \"*\"]\n\t]],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for packages.\n"
  },
  {
    "path": "tests/languages/java/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"\\\"foo\\\"\"\n\n\"\"\"\nfoo\n\"\"\"\n\nvar a = \"\"\"\n\\\"\"\"\nfoo\"\"\";\n\n\"\"\"\nThe quick brown fox\"\"\" + \"  \\n\" + \"\"\"\njumps over the lazy dog\n\"\"\"\n\nString empty = \"\"\"\n\"\"\";\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"\\\\\\\"foo\\\\\\\"\\\"\"],\n\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"\\r\\nfoo\\r\\n\\\"\\\"\\\"\"],\n\n\t[\"keyword\", \"var\"],\n\t\" a \",\n\t[\"operator\", \"=\"],\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"\\r\\n\\\\\\\"\\\"\\\"\\r\\nfoo\\\"\\\"\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"\\r\\nThe quick brown fox\\\"\\\"\\\"\"],\n\t[\"operator\", \"+\"],\n\t[\"string\", \"\\\"  \\\\n\\\"\"],\n\t[\"operator\", \"+\"],\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"\\r\\njumps over the lazy dog\\r\\n\\\"\\\"\\\"\"],\n\n\t[\"class-name\", [\"String\"]],\n\t\" empty \",\n\t[\"operator\", \"=\"],\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"\\r\\n\\\"\\\"\\\"\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/javadoc/code_feature.test",
    "content": "/**\r\n * {@code this.foo} is never {@code null}.\r\n *\r\n * <code>Foo.bar(null)</code>\r\n * <tt>Foo</tt>\r\n *\r\n * <pre><code>\r\n * for (int i = 0; i < array.length; i++) {\r\n *     array[i] += 1;\r\n * }\r\n * return array;\r\n * </code></pre>\r\n *\r\n * <pre>{@code\r\n *     String message = String.join(\"-\", \"Java\", \"is\", \"cool\");\r\n *     // message returned is: \"Java-is-cool\"\r\n * }</pre>\r\n *\r\n * <pre>\r\n *     dstBegin + (srcEnd-srcBegin) - 1\r\n * </pre>\r\n *\r\n * <pre>\r\n *     <b><i>c</i></b> == (char)(((hibyte &amp; 0xff) &lt;&lt; 8)\r\n *                         | (<b><i>b</i></b> &amp; 0xff))\r\n * </pre>\r\n *\r\n * <pre> {@code\r\n * interface ArchiveSearcher { String search(String target); }\r\n * class App {\r\n *   void showSearch(final String target)\r\n *       throws InterruptedException {\r\n *     Future<String> future\r\n *       = executor.submit(new Callable<String>() {\r\n *         public String call() {\r\n *             return searcher.search(target);\r\n *         }});\r\n *     displayOtherThings(); // do other things while searching\r\n *     try {\r\n *       displayText(future.get()); // use future\r\n *     } catch (ExecutionException ex) { cleanup(); return; }\r\n *   }\r\n * }}</pre>\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"/**\\r\\n * \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@code\"],\r\n\t[\"code-section\", [\r\n\t\t[\"code\", [\r\n\t\t\t[\"keyword\", \"this\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"foo\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\t\" is never \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@code\"],\r\n\t[\"code-section\", [\r\n\t\t[\"code\", [\r\n\t\t\t[\"keyword\", \"null\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\t\".\\r\\n *\\r\\n * \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"code\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"code-section\", [\r\n\t\t[\"line\", [\r\n\t\t\t[\"code\", [\r\n\t\t\t\t[\"class-name\", [\"Foo\"]],\r\n\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t[\"function\", \"bar\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"keyword\", \"null\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"code\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n * \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"tt\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"code-section\", [\r\n\t\t[\"line\", [\r\n\t\t\t[\"code\", [\r\n\t\t\t\t[\"class-name\", [\"Foo\"]]\r\n\t\t\t]]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"tt\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n *\\r\\n * \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"pre\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"code\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"code-section\", [\r\n\t\t\"* \",\r\n\t\t[\"line\", [\r\n\t\t\t[\"code\", [\r\n\t\t\t\t[\"keyword\", \"for\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"keyword\", \"int\"],\r\n\t\t\t\t\" i \",\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"number\", \"0\"],\r\n\t\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t\t\" i \",\r\n\t\t\t\t[\"operator\", \"<\"],\r\n\t\t\t\t\" array\",\r\n\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\"length\",\r\n\t\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t\t\" i\",\r\n\t\t\t\t[\"operator\", \"++\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"{\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *     \",\r\n\t\t[\"line\", [\r\n\t\t\t[\"code\", [\r\n\t\t\t\t\"array\",\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t\"i\",\r\n\t\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t\t[\"operator\", \"+=\"],\r\n\t\t\t\t[\"number\", \"1\"],\r\n\t\t\t\t[\"punctuation\", \";\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n * \",\r\n\t\t[\"line\", [\r\n\t\t\t[\"code\", [\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n * \",\r\n\t\t[\"line\", [\r\n\t\t\t[\"code\", [\r\n\t\t\t\t[\"keyword\", \"return\"],\r\n\t\t\t\t\" array\",\r\n\t\t\t\t[\"punctuation\", \";\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *\"\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"code\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"pre\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n *\\r\\n * \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"pre\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@code\"],\r\n\r\n\t[\"code-section\", [\r\n\t\t\"*     \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"class-name\", [\"String\"]],\r\n\t\t\t\" message \",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"class-name\", [\"String\"]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"join\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"\\\"-\\\"\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"\\\"Java\\\"\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"\\\"is\\\"\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"\\\"cool\\\"\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *     \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"comment\", \"// message returned is: \\\"Java-is-cool\\\"\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *\"\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"pre\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n *\\r\\n * \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"pre\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"code-section\", [\r\n\t\t\"*     \",\r\n\t\t[\"line\", [\r\n\t\t\t[\"code\", [\r\n\t\t\t\t\"dstBegin \",\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t\"srcEnd\",\r\n\t\t\t\t[\"operator\", \"-\"],\r\n\t\t\t\t\"srcBegin\",\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"operator\", \"-\"],\r\n\t\t\t\t[\"number\", \"1\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *\"\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"pre\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n *\\r\\n * \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"pre\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"code-section\", [\r\n\t\t\"*     \",\r\n\t\t[\"line\", [\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"b\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"i\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"code\", [\"c\"]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"i\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"b\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"code\", [\r\n\t\t\t\t[\"operator\", \"==\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"keyword\", \"char\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t\"hibyte \"\r\n\t\t\t]],\r\n\t\t\t[\"entity\", \"&amp;\"],\r\n\t\t\t[\"code\", [\r\n\t\t\t\t[\"number\", \"0xff\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"entity\", \"&lt;\"],\r\n\t\t\t[\"entity\", \"&lt;\"],\r\n\t\t\t[\"code\", [\r\n\t\t\t\t[\"number\", \"8\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *                         \",\r\n\t\t[\"line\", [\r\n\t\t\t[\"code\", [\r\n\t\t\t\t[\"operator\", \"|\"],\r\n\t\t\t\t[\"punctuation\", \"(\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"b\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"i\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"code\", [\"b\"]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"i\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"b\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"code\", [\r\n\t\t\t]],\r\n\t\t\t[\"entity\", \"&amp;\"],\r\n\t\t\t[\"code\", [\r\n\t\t\t\t[\"number\", \"0xff\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *\"\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"pre\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n *\\r\\n * \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"pre\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@code\"],\r\n\r\n\t[\"code-section\", [\r\n\t\t\"* \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"keyword\", \"interface\"],\r\n\t\t\t[\"class-name\", [\"ArchiveSearcher\"]],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"class-name\", [\"String\"]],\r\n\t\t\t[\"function\", \"search\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"class-name\", [\"String\"]],\r\n\t\t\t\" target\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n * \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"keyword\", \"class\"],\r\n\t\t\t[\"class-name\", [\"App\"]],\r\n\t\t\t[\"punctuation\", \"{\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *   \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"keyword\", \"void\"],\r\n\t\t\t[\"function\", \"showSearch\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"keyword\", \"final\"],\r\n\t\t\t[\"class-name\", [\"String\"]],\r\n\t\t\t\" target\",\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *       \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"keyword\", \"throws\"],\r\n\t\t\t[\"class-name\", [\"InterruptedException\"]],\r\n\t\t\t[\"punctuation\", \"{\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *     \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"class-name\", [\"Future\"]],\r\n\t\t\t[\"generics\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"class-name\", [\"String\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t\" future\"\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *       \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\" executor\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"submit\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"keyword\", \"new\"],\r\n\t\t\t[\"class-name\", [\"Callable\"]],\r\n\t\t\t[\"generics\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"class-name\", [\"String\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"{\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *         \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"keyword\", \"public\"],\r\n\t\t\t[\"class-name\", [\"String\"]],\r\n\t\t\t[\"function\", \"call\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"{\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *             \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"keyword\", \"return\"],\r\n\t\t\t\" searcher\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"search\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"target\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *         \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *     \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"function\", \"displayOtherThings\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"comment\", \"// do other things while searching\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *     \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"keyword\", \"try\"],\r\n\t\t\t[\"punctuation\", \"{\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *       \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"function\", \"displayText\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"future\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"get\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"comment\", \"// use future\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *     \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"keyword\", \"catch\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"class-name\", [\"ExecutionException\"]],\r\n\t\t\t\" ex\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"function\", \"cleanup\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"keyword\", \"return\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n *   \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t\"\\r\\n * \",\r\n\t\t[\"code\", [\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"pre\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n */\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for code.\r\n"
  },
  {
    "path": "tests/languages/javadoc/entity_feature.test",
    "content": "/**\r\n * &lt;\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"/**\\r\\n * \",\r\n\t[\"entity\", \"&lt;\"],\r\n\t\"\\r\\n */\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for HTML entities inside doc comments.\r\n"
  },
  {
    "path": "tests/languages/javadoc/keyword_feature.test",
    "content": "/**\r\n * @author\r\n * @deprecated\r\n * @exception\r\n * @param\r\n * @return\r\n * @see\r\n * @serial\r\n * @serialData\r\n * @serialField\r\n * @since\r\n * @throws\r\n * @version\r\n * {@code}\r\n * {@docRoot}\r\n * {@inheritDoc}\r\n * {@link}\r\n * {@linkplain}\r\n * {@literal}\r\n * {@value}\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"/**\\r\\n * \",\r\n\t[\"keyword\", \"@author\"],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@deprecated\"],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@exception\"],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@param\"],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@return\"],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@serial\"],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@serialData\"],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@serialField\"],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@since\"],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@throws\"],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@version\"],\r\n\t\"\\r\\n * \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@code\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t\"\\r\\n * \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@docRoot\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t\"\\r\\n * \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@inheritDoc\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t\"\\r\\n * \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@link\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t\"\\r\\n * \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@linkplain\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t\"\\r\\n * \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@literal\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t\"\\r\\n * \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@value\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t\"\\r\\n */\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/javadoc/parameter_feature.test",
    "content": "/**\r\n * @param foo an argument.\r\n * @param bar another argument.\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"/**\\r\\n * \",\r\n\t[\"keyword\", \"@param\"],\r\n\t[\"parameter\", \"foo\"],\r\n\t\" an argument.\\r\\n * \",\r\n\t[\"keyword\", \"@param\"],\r\n\t[\"parameter\", \"bar\"],\r\n\t\" another argument.\\r\\n */\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for parameters.\r\n"
  },
  {
    "path": "tests/languages/javadoc/reference_feature.test",
    "content": "/**\r\n * @throws IllegalArgumentException if the argument is negative.\r\n * @see org.my.company.InfoClass for more information.\r\n * @param <T> the first generic argument.\r\n * {@linkplain #foo(char[], java.lang.String) foo}\r\n *\r\n * multi-line {@link\r\n * #foo(char[], java.lang.String)}\r\n *\r\n * @see #field\r\n * @see #method(Type, Type)\r\n * @see #method(Type argname, Type argname)\r\n * @see #constructor(Type, Type)\r\n * @see #constructor(Type argname, Type argname)\r\n * @see Class#field\r\n * @see Class#method(Type, Type)\r\n * @see Class#method(Type argname, Type argname)\r\n * @see Class#constructor(Type, Type)\r\n * @see Class#constructor(Type argname, Type argname)\r\n * @see Class.NestedClass\r\n * @see Class\r\n * @see foo.bar.Class#field\r\n * @see foo.bar.Class#method(Type, Type)\r\n * @see foo.bar.Class#method(Type argname, Type argname)\r\n * @see foo.bar.Class#constructor(Type, Type)\r\n * @see foo.bar.Class#constructor(Type argname, Type argname)\r\n * @see foo.bar.Class.NestedClass\r\n * @see foo.bar.Class\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"/**\\r\\n * \",\r\n\t[\"keyword\", \"@throws\"],\r\n\t[\"reference\", [\r\n\t\t[\"class-name\", \"IllegalArgumentException\"]\r\n\t]],\r\n\t\" if the argument is negative.\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"namespace\", [\r\n\t\t\t\"org\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"my\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"company\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"InfoClass\"]\r\n\t]],\r\n\t\" for more information.\\r\\n * \",\r\n\t[\"keyword\", \"@param\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"T\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\" the first generic argument.\\r\\n * \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@linkplain\"],\r\n\t[\"reference\", [\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"keyword\", \"char\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"java\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"lang\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"String\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\" foo\",\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t\"\\r\\n *\\r\\n * multi-line \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"@link\"],\r\n\t\"\\r\\n * \",\r\n\t[\"reference\", [\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"keyword\", \"char\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"java\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"lang\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"String\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t\"\\r\\n *\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"field\", \"field\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"method\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"method\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"constructor\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"constructor\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"field\", \"field\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"method\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"method\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"constructor\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"constructor\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"class-name\", \"NestedClass\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"class-name\", \"Class\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"namespace\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"field\", \"field\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"namespace\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"method\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"namespace\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"method\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"namespace\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"constructor\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"namespace\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t[\"function\", \"constructor\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"class-name\", \"Type\"],\r\n\t\t\" argname\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"namespace\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"Class\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"class-name\", \"NestedClass\"]\r\n\t]],\r\n\t\"\\r\\n * \",\r\n\t[\"keyword\", \"@see\"],\r\n\t[\"reference\", [\r\n\t\t[\"namespace\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"Class\"]\r\n\t]],\r\n\t\"\\r\\n */\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for references.\r\n"
  },
  {
    "path": "tests/languages/javadoc/tag_feature.test",
    "content": "/**\r\n * <p>\r\n * <table>\r\n *     <tr>\r\n *         <td>\r\n *             foo\r\n *         </td>\r\n *         <td>\r\n *             bar\r\n *         </td>\r\n *     </tr>\r\n * </table>\r\n * <a href=\"example.com\">some link</a>\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"/**\\r\\n * \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"p\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n * \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"table\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n *     \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"tr\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n *         \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"td\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n *             foo\\r\\n *         \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"td\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n *         \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"td\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n *             bar\\r\\n *         \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"td\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n *     \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"tr\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n * \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"table\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n * \",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"attr-name\", [\"href\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"example.com\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\"some link\",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n */\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for HTML tags inside doc comments.\r\n"
  },
  {
    "path": "tests/languages/javadoc+java/javadoc_inclusion.test",
    "content": "/** Description. */\n\n----------------------------------------------------\n\n[\n\t[\"doc-comment\", [\"/** Description. */\"]]\n]\n\n----------------------------------------------------\n\nChecks for JavaDoc doc comments in Java.\n"
  },
  {
    "path": "tests/languages/javascript/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/javascript/class-method_feature.test",
    "content": "class Test {\r\n\tfoo( x, y = 0) {}\r\n\tasync bar(x, y = 0 ) {}\r\n\t$ ( ) {}\r\n\tawaitFoo(){}\r\n\tExample({ props: { a: _A, b} } = Props) {}\r\n\tf(x = fun(), y = 0) {}\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"Test\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\r\n\t\t\"x\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" y \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"0\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"async\"],\r\n\t[\"function\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\r\n\t\t\"x\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" y \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"0\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"$\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"awaitFoo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"Example\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"literal-property\", \"props\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"literal-property\", \"a\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t\" _A\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" b\",\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" Props\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\r\n\t\t\"x \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"function\", \"fun\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" y \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"0\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class methods.\r\n"
  },
  {
    "path": "tests/languages/javascript/constant_feature.test",
    "content": "var FOO;\nconst FOO_BAR;\nconst BAZ42;\ngl.FLOAT_MAT2x4;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"var\"],\n\t[\"constant\", \"FOO\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"const\"],\n\t[\"constant\", \"FOO_BAR\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"const\"],\n\t[\"constant\", \"BAZ42\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\ngl\",\n\t[\"punctuation\", \".\"],\n\t[\"constant\", \"FLOAT_MAT2x4\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for constants.\n"
  },
  {
    "path": "tests/languages/javascript/function-variable_feature.test",
    "content": "foo = function (  ) {}\r\nfoo = function ( x, y) {}\r\n{foo: function () {}}\r\nbar = async function baz (x ) {}\r\nbaz = async(x) => x\r\nfooBar = x => x\r\nfooBar = ( x, y ) => x\r\nಠ_ಠ = () => {}\r\nȠȡ_҇ = async (ಠ, Ƞ = 2) => {}\r\nd = function Example({ props: { a: _A, b} } = Props) {}\r\nf = function (x = fun()) {}\r\nl = (x = fun(), y) => {}\r\na = function () {}, b = () => {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function-variable\", \"foo\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"foo\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\r\n\t\t\"x\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" y\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"function-variable\", \"foo\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"bar\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"async\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"baz\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\"x\"]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"baz\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"async\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\"x\"]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t\" x\\r\\n\",\r\n\r\n\t[\"function-variable\", \"fooBar\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"parameter\", [\"x\"]],\r\n\t[\"operator\", \"=>\"],\r\n\t\" x\\r\\n\",\r\n\r\n\t[\"function-variable\", \"fooBar\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\r\n\t\t\"x\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" y\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t\" x\\r\\n\",\r\n\r\n\t[\"function-variable\", \"ಠ_ಠ\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"Ƞȡ_҇\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"async\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\r\n\t\t\"ಠ\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" Ƞ \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"2\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"d\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"Example\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"literal-property\", \"props\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"literal-property\", \"a\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t\" _A\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" b\",\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" Props\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"f\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\r\n\t\t\"x \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"function\", \"fun\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"l\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\r\n\t\t\"x \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"function\", \"fun\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" y\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function-variable\", \"a\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"function-variable\", \"b\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables obviously containing functions.\r\n"
  },
  {
    "path": "tests/languages/javascript/function_feature.test",
    "content": "foo()\r\nfoo ()\r\nfoo . call ()\r\nfoo_bar()\r\nfoo_bar ( )\r\nf42()\r\n_()\r\n$()\r\nಠ_ಠ()\r\nȠȡ_҇()\r\nif(notAFunction)\r\nfoo({ x })\r\nfoo({ y: fun() })\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"call\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo_bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo_bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"f42\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"_\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"$\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"ಠ_ಠ\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"Ƞȡ_҇\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"notAFunction\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" x \",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"literal-property\", \"y\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"function\", \"fun\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions. Also checks for unicode characters in identifiers.\r\n"
  },
  {
    "path": "tests/languages/javascript/getter-setter_feature.test",
    "content": "const obj = {\r\n\tget name() { return 'bar'; },\r\n\tget [expr]() { return 'bar'; },\r\n\tasync get name() { return 'bar'; },\r\n\tset name(val) { },\r\n\tset [expr](val) { },\r\n\tasync set [expr](val) { },\r\n\tget #x() { return #xValue; },\r\n};\r\n\r\n// not keywords\r\nget();\r\nset(foo);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"const\"],\r\n\t\" obj \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"get\"],\r\n\t[\"function\", \"name\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"string\", \"'bar'\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"keyword\", \"get\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"expr\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"string\", \"'bar'\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"keyword\", \"async\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"function\", \"name\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"string\", \"'bar'\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"keyword\", \"set\"],\r\n\t[\"function\", \"name\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\"val\"]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"keyword\", \"set\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"expr\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\"val\"]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"keyword\", \"async\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"expr\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\"val\"]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"keyword\", \"get\"],\r\n\t[\"function\", \"#x\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"return\"],\r\n\t\" #xValue\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"// not keywords\"],\r\n\r\n\t[\"function\", \"get\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"function\", \"set\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for getters and setters.\r\n"
  },
  {
    "path": "tests/languages/javascript/hashbang_feature.test",
    "content": "#!/usr/bin/env node\r\n// in the Script Goal\r\n'use strict';\r\nconsole.log(1);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"hashbang\", \"#!/usr/bin/env node\"],\r\n\r\n\t[\"comment\", \"// in the Script Goal\"],\r\n\r\n\t[\"string\", \"'use strict'\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\nconsole\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"log\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]"
  },
  {
    "path": "tests/languages/javascript/issue1337.test",
    "content": "// gulp.watch('./src/**/*.js', ['move']);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// gulp.watch('./src/**/*.js', ['move']);\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for multi-line comment inside single-line comment. See #1337"
  },
  {
    "path": "tests/languages/javascript/issue1340.test",
    "content": "/*\r\n * ([{}])\r\n * //  <= double slash comment\r\n * ([{}]) <= punctuation\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/*\\r\\n * ([{}])\\r\\n * //  <= double slash comment\\r\\n * ([{}]) <= punctuation\\r\\n */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line comment inside multi-line comment. See #1340"
  },
  {
    "path": "tests/languages/javascript/issue1397.test",
    "content": "`${`a string`}`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"template-string\", [\r\n\t\t\t\t[\"template-punctuation\", \"`\"],\r\n\t\t\t\t[\"string\", \"a string\"],\r\n\t\t\t\t[\"template-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for nested template strings. See #1397\r\n"
  },
  {
    "path": "tests/languages/javascript/issue1526.test",
    "content": "fetch('some-resource.json')\r\n\t.then(response => response.json())\r\n\t.catch(console.error);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"fetch\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"'some-resource.json'\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"then\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\"response\"]],\r\n\t[\"operator\", \"=>\"],\r\n\t\" response\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"json\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"catch\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"console\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"error\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for catch function which is not a keyword. See #1526\r\n"
  },
  {
    "path": "tests/languages/javascript/issue1807.test",
    "content": "Array.from();\nfoo.var.new;\n\n----------------------------------------------------\n\n[\n\t\"Array\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"from\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\nfoo\",\n\t[\"punctuation\", \".\"],\n\t\"var\",\n\t[\"punctuation\", \".\"],\n\t\"new\",\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for properties which have the same name as keywords. See #1807.\n"
  },
  {
    "path": "tests/languages/javascript/issue2694.test",
    "content": "replace(/'/, `'`)\r\n\r\nconst var1 = `this is fine`;\r\nconst var2 = `this is fine`;\r\n\r\n// `load bearing comment`\r\n\r\nconst var3 = `break starts here`;\r\nconst var4 = `break ends here`;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"replace\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"'\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"'\"],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t\" var1 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"this is fine\"],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t\" var2 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"this is fine\"],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"// `load bearing comment`\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t\" var3 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"break starts here\"],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t\" var4 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"break ends here\"],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]"
  },
  {
    "path": "tests/languages/javascript/keyword_feature.html.test",
    "content": "as;\nawait;\nbreak;\ncase;\nclass;\nconst;\ncontinue;\ndebugger;\ndefault;\ndelete;\ndo;\nelse;\nenum;\nexport;\nextends;\nfor;\nif;\nimplements;\nimport;\nin;\ninstanceof;\ninterface;\nlet;\nnew;\nnull;\nof;\npackage;\nprivate;\nprotected;\npublic;\nreturn;\nstatic;\nsuper;\nswitch;\nthis;\nthrow;\ntry;\ntypeof;\nundefined;\nvar;\nvoid;\nwhile;\nwith;\nyield;\n\n// contextual keywords\n\ntry {} catch {} finally {}\ntry {} catch (e) {} finally {}\nasync function (){}\nasync a => {}\nasync (a,b,c) => {}\nimport {} from \"foo\"\nimport {} from 'foo'\nclass { get foo(){} set baz(){} get [value](){} }\n\n// import assertion\nimport json from \"./foo.json\" assert { type: \"json\" };\n\n// variables, not keywords\n\nconst { async, from, to } = bar;\npromise.catch(foo).finally(bar);\nassert.equal(foo, bar);\n\n----------------------------------------------------\n\n<span class=\"token keyword module\">as</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">await</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">break</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">case</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">class</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">continue</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">debugger</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">default</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">delete</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">do</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">else</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">enum</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword module\">export</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">extends</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">for</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">if</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">implements</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword module\">import</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">in</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">instanceof</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">interface</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">new</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">null</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">of</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">package</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">private</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">protected</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">public</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">return</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">static</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">super</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">switch</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">this</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">throw</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">try</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">typeof</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">undefined</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">void</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">while</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">with</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">yield</span>\n<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// contextual keywords</span>\n\n<span class=\"token keyword control-flow\">try</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword control-flow\">catch</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword control-flow\">finally</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword control-flow\">try</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword control-flow\">catch</span>\n<span class=\"token punctuation\">(</span>\ne\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword control-flow\">finally</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">async</span>\n<span class=\"token keyword\">function</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">async</span>\n<span class=\"token parameter\">a</span>\n<span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">async</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token parameter\">\n\ta\n\t<span class=\"token punctuation\">,</span>\n\tb\n\t<span class=\"token punctuation\">,</span>\n\tc\n</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword module\">import</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword module\">from</span>\n<span class=\"token string\">\"foo\"</span>\n<span class=\"token keyword module\">import</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword module\">from</span>\n<span class=\"token string\">'foo'</span>\n<span class=\"token keyword\">class</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token keyword\">get</span>\n<span class=\"token function\">foo</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">set</span>\n<span class=\"token function\">baz</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">get</span>\n<span class=\"token punctuation\">[</span>\nvalue\n<span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// import assertion</span>\n<span class=\"token keyword module\">import</span>\njson\n<span class=\"token keyword module\">from</span>\n<span class=\"token string\">\"./foo.json\"</span>\n<span class=\"token keyword module\">assert</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token literal-property property\">type</span>\n<span class=\"token operator\">:</span>\n<span class=\"token string\">\"json\"</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// variables, not keywords</span>\n\n<span class=\"token keyword\">const</span>\n<span class=\"token punctuation\">{</span>\nasync\n<span class=\"token punctuation\">,</span>\nfrom\n<span class=\"token punctuation\">,</span>\nto\n<span class=\"token punctuation\">}</span>\n<span class=\"token operator\">=</span>\nbar\n<span class=\"token punctuation\">;</span>\npromise\n<span class=\"token punctuation\">.</span>\n<span class=\"token function\">catch</span>\n<span class=\"token punctuation\">(</span>\nfoo\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span>\n<span class=\"token function\">finally</span>\n<span class=\"token punctuation\">(</span>\nbar\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">;</span>\nassert\n<span class=\"token punctuation\">.</span>\n<span class=\"token function\">equal</span>\n<span class=\"token punctuation\">(</span>\nfoo\n<span class=\"token punctuation\">,</span>\nbar\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">;</span>\n\n----------------------------------------------------\n\nChecks for all keywords.\n"
  },
  {
    "path": "tests/languages/javascript/keyword_feature.test",
    "content": "as;\r\nawait;\r\nbreak;\r\ncase;\r\nclass;\r\nconst;\r\ncontinue;\r\ndebugger;\r\ndefault;\r\ndelete;\r\ndo;\r\nelse;\r\nenum;\r\nexport;\r\nextends;\r\nfor;\r\nif;\r\nimplements;\r\nimport;\r\nin;\r\ninstanceof;\r\ninterface;\r\nlet;\r\nnew;\r\nnull;\r\nof;\r\npackage;\r\nprivate;\r\nprotected;\r\npublic;\r\nreturn;\r\nstatic;\r\nsuper;\r\nswitch;\r\nthis;\r\nthrow;\r\ntry;\r\ntypeof;\r\nundefined;\r\nvar;\r\nvoid;\r\nwhile;\r\nwith;\r\nyield;\r\n\r\n// contextual keywords\r\n\r\ntry {} catch {} finally {}\r\ntry {} catch (e) {} finally {}\r\nasync function (){}\r\nasync a => {}\r\nasync (a,b,c) => {}\r\nimport {} from \"foo\"\r\nimport {} from 'foo'\r\nclass { get foo(){} set baz(){} get [value](){} }\r\n\r\n// import assertion\r\nimport json from \"./foo.json\" assert { type: \"json\" };\r\n\r\n// variables, not keywords\r\n\r\nconst { async, from, to } = bar;\r\npromise.catch(foo).finally(bar);\r\nassert.equal(foo, bar);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"await\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"case\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"debugger\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"default\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"delete\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"export\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"import\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"instanceof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"let\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"null\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"of\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"package\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"private\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"protected\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"public\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"super\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"this\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"throw\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"try\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"typeof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"undefined\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"var\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"void\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"with\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"yield\"], [\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"// contextual keywords\"],\r\n\r\n\t[\"keyword\", \"try\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"try\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"e\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"async\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"async\"],\r\n\t[\"parameter\", [\"a\"]],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"async\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"parameter\", [\r\n\t\t\"a\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\"b\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\"c\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"string\", \"'foo'\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"function\", \"baz\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"value\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"comment\", \"// import assertion\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t\" json \",\r\n\t[\"keyword\", \"from\"],\r\n\t[\"string\", \"\\\"./foo.json\\\"\"],\r\n\t[\"keyword\", \"assert\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"literal-property\", \"type\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"json\\\"\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"// variables, not keywords\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" async\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" from\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" to \",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"operator\", \"=\"],\r\n\t\" bar\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\npromise\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"catch\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"finally\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"bar\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\nassert\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"equal\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" bar\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/javascript/number_feature.test",
    "content": "42\r\n3.14159\r\n4e10\r\n3.2E+6\r\n2.1e-10\r\n0b1101\r\n0o571\r\n0xbabe\r\n0xBABE\r\n\r\nNaN\r\nInfinity\r\n\r\n123n\r\n0x123n\r\n\r\n1_000_000_000_000\r\n1_000_000.220_720\r\n0b0101_0110_0011_1000\r\n0o12_34_56\r\n0x40_76_38_6A_73\r\n4_642_473_943_484_686_707n\r\n0.000_001\r\n1e10_000\r\n\r\n0xf_f_f_f_ffn\r\n0xf_f_f_f_f\r\n0b1_1_1_1\r\n0b0_0_1_0_1_0_1n\r\n0o1_1_3_2\r\n0o1_1_3_2n\r\n2.2_4_54e64_33\r\n2.2_4_54e+64_33\r\n2.2_4_54e-64_33\r\n3_4_5\r\n3_4_5n\r\n3_4_5.5_5_6\r\n\r\n// not numbers\r\n$1234;\r\n$0xFF;\r\n$0b0101;\r\n$1234n;\r\n$0xFFn;\r\n$0b0101n;\r\n_1234;\r\n_0xFF;\r\n_0b0101;\r\n_1234n;\r\n_0xFFn;\r\n_0b0101n;\r\nabc1234;\r\nabc0xFF;\r\nabc0b0101;\r\nabc1234n;\r\nabc0xFFn;\r\nabc0b0101n;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"4e10\"],\r\n\t[\"number\", \"3.2E+6\"],\r\n\t[\"number\", \"2.1e-10\"],\r\n\t[\"number\", \"0b1101\"],\r\n\t[\"number\", \"0o571\"],\r\n\t[\"number\", \"0xbabe\"],\r\n\t[\"number\", \"0xBABE\"],\r\n\r\n\t[\"number\", \"NaN\"],\r\n\t[\"number\", \"Infinity\"],\r\n\r\n\t[\"number\", \"123n\"],\r\n\t[\"number\", \"0x123n\"],\r\n\r\n\t[\"number\", \"1_000_000_000_000\"],\r\n\t[\"number\", \"1_000_000.220_720\"],\r\n\t[\"number\", \"0b0101_0110_0011_1000\"],\r\n\t[\"number\", \"0o12_34_56\"],\r\n\t[\"number\", \"0x40_76_38_6A_73\"],\r\n\t[\"number\", \"4_642_473_943_484_686_707n\"],\r\n\t[\"number\", \"0.000_001\"],\r\n\t[\"number\", \"1e10_000\"],\r\n\r\n\t[\"number\", \"0xf_f_f_f_ffn\"],\r\n\t[\"number\", \"0xf_f_f_f_f\"],\r\n\t[\"number\", \"0b1_1_1_1\"],\r\n\t[\"number\", \"0b0_0_1_0_1_0_1n\"],\r\n\t[\"number\", \"0o1_1_3_2\"],\r\n\t[\"number\", \"0o1_1_3_2n\"],\r\n\t[\"number\", \"2.2_4_54e64_33\"],\r\n\t[\"number\", \"2.2_4_54e+64_33\"],\r\n\t[\"number\", \"2.2_4_54e-64_33\"],\r\n\t[\"number\", \"3_4_5\"],\r\n\t[\"number\", \"3_4_5n\"],\r\n\t[\"number\", \"3_4_5.5_5_6\"],\r\n\r\n\t[\"comment\", \"// not numbers\"],\r\n\t\"\\r\\n$1234\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n$0xFF\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n$0b0101\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n$1234n\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n$0xFFn\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n$0b0101n\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n_1234\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n_0xFF\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n_0b0101\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n_1234n\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n_0xFFn\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n_0b0101n\", [\"punctuation\", \";\"],\r\n\t\"\\r\\nabc1234\", [\"punctuation\", \";\"],\r\n\t\"\\r\\nabc0xFF\", [\"punctuation\", \";\"],\r\n\t\"\\r\\nabc0b0101\", [\"punctuation\", \";\"],\r\n\t\"\\r\\nabc1234n\", [\"punctuation\", \";\"],\r\n\t\"\\r\\nabc0xFFn\", [\"punctuation\", \";\"],\r\n\t\"\\r\\nabc0b0101n\", [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal numbers, binary numbers, octal numbers, hexadecimal numbers.\r\nAlso checks for keywords representing numbers.\r\n"
  },
  {
    "path": "tests/languages/javascript/operator_feature.test",
    "content": "- -- -=\r\n+ ++ +=\r\n< <= << <<=\r\n> >= >> >>= >>> >>>=\r\n= == === =>\r\n! != !==\r\n& && &= &&=\r\n| || |= ||=\r\n* ** *= **=\r\n/ /= ~\r\n^ ^= % %=\r\n? : ...\r\n?? ?. ??=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<<\"], [\"operator\", \"<<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \">>\"], [\"operator\", \">>=\"], [\"operator\", \">>>\"], [\"operator\", \">>>=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"===\"], [\"operator\", \"=>\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"], [\"operator\", \"!==\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"&=\"], [\"operator\", \"&&=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"], [\"operator\", \"|=\"], [\"operator\", \"||=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"**\"], [\"operator\", \"*=\"], [\"operator\", \"**=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"], [\"operator\", \"~\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"], [\"operator\", \"%\"], [\"operator\", \"%=\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \":\"], [\"operator\", \"...\"],\r\n\t[\"operator\", \"??\"], [\"operator\", \"?.\"], [\"operator\", \"??=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/javascript/private_fields_feature.test",
    "content": "class Foo {\r\n\t#foo = function () {\r\n\t\treturn this.#bar;\r\n\t}\r\n\t#bar = 9;\r\n\r\n\tget value() {\r\n\t\treturn this.#foo();\r\n\t}\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"function-variable\", \"#foo\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"#bar\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t\"\\r\\n\\t#bar \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"9\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"get\"],\r\n\t[\"function\", \"value\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"#foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for the private field syntax.\r\n"
  },
  {
    "path": "tests/languages/javascript/property_feature.test",
    "content": "{ foo: 0, bar: 0 };\n{ 'foo': 0, \"bar\": 0 };\n{\n\t// comment\n\tfoo: 0,\n\t// comment\n\t\"bar\": 0\n}\n\nconst test = new TYPE.Application({\n  key1: viewDim.x,\n  key2: viewDim.y,\n  key3: 0x89ddff,\n  key4: window.devicePixelRatio || 1,\n  key5: resize()\n});\n\n// doesn't conflict with function properties\n{\n\tfoo: () => 0,\n\tbar: async function () {}\n}\n\n// no problem with keywords\nswitch(foo) {\n\tdefault: return true;\n}\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\t[\"literal-property\", \"foo\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\t[\"literal-property\", \"bar\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"{\"],\n\t[\"string-property\", \"'foo'\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\t[\"string-property\", \"\\\"bar\\\"\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"comment\", \"// comment\"],\n\n\t[\"literal-property\", \"foo\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"comment\", \"// comment\"],\n\n\t[\"string-property\", \"\\\"bar\\\"\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"0\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"const\"],\n\t\" test \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"new\"],\n\t[\"class-name\", [\n\t\t\"TYPE\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Application\"\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"literal-property\", \"key1\"],\n\t[\"operator\", \":\"],\n\t\" viewDim\",\n\t[\"punctuation\", \".\"],\n\t\"x\",\n\t[\"punctuation\", \",\"],\n\n\t[\"literal-property\", \"key2\"],\n\t[\"operator\", \":\"],\n\t\" viewDim\",\n\t[\"punctuation\", \".\"],\n\t\"y\",\n\t[\"punctuation\", \",\"],\n\n\t[\"literal-property\", \"key3\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"0x89ddff\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"literal-property\", \"key4\"],\n\t[\"operator\", \":\"],\n\t\" window\",\n\t[\"punctuation\", \".\"],\n\t\"devicePixelRatio \",\n\t[\"operator\", \"||\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"literal-property\", \"key5\"],\n\t[\"operator\", \":\"],\n\t[\"function\", \"resize\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// doesn't conflict with function properties\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"function-variable\", \"foo\"],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=>\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"function-variable\", \"bar\"],\n\t[\"operator\", \":\"],\n\t[\"keyword\", \"async\"],\n\t[\"keyword\", \"function\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"comment\", \"// no problem with keywords\"],\n\n\t[\"keyword\", \"switch\"],\n\t[\"punctuation\", \"(\"],\n\t\"foo\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"default\"],\n\t[\"operator\", \":\"],\n\t[\"keyword\", \"return\"],\n\t[\"boolean\", \"true\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/javascript/regex_feature.test",
    "content": "/foo bar/;\r\n/foo/dgimyus,\r\n/[\\[\\]]{2,4}(?:foo)*/;\r\n/foo\"test\"bar/;\r\n/foo\\//;\r\n/[]/;\r\n/[\\]/]/;\r\n1 / 4 + \"/, not a regex\";\r\n/ '1' '2' '3' '4' '5' /\r\n[/foo/]\r\n\r\n// RegExp set notation\r\n;/[A--B]/v;\r\n/[A--[0-9]]/v;\r\n/[\\p{Decimal_Number}--[0-9]]/v;\r\n/[\\p{Script=Khmer}&&[\\p{Letter}\\p{Mark}\\p{Number}]]/v;\r\n\r\nlet a = /regex/m // comment\r\nlet b = condition ? /regex/ : /another one/\r\nreturn /regex/;\r\nyield /regex/;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"foo bar\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"foo\"],\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-flags\", \"dgimyus\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"[\\\\[\\\\]]{2,4}(?:foo)*\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"foo\\\"test\\\"bar\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"foo\\\\/\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"[]\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"[\\\\]/]\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"string\", \"\\\"/, not a regex\\\"\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \" '1' '2' '3' '4' '5' \"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"foo\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"comment\", \"// RegExp set notation\"],\r\n\r\n\t[\"punctuation\", \";\"],\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"[A--B]\"],\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-flags\", \"v\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"[A--[0-9]]\"],\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-flags\", \"v\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"[\\\\p{Decimal_Number}--[0-9]]\"],\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-flags\", \"v\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"[\\\\p{Script=Khmer}&&[\\\\p{Letter}\\\\p{Mark}\\\\p{Number}]]\"],\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-flags\", \"v\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" a \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"regex\"],\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-flags\", \"m\"]\r\n\t]],\r\n\t[\"comment\", \"// comment\"],\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" b \",\r\n\t[\"operator\", \"=\"],\r\n\t\" condition \",\r\n\t[\"operator\", \"?\"],\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"regex\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\t[\"operator\", \":\"],\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"another one\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"regex\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"yield\"],\r\n\t[\"regex\", [\r\n\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t[\"regex-source\", \"regex\"],\r\n\t\t[\"regex-delimiter\", \"/\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for regex.\r\n"
  },
  {
    "path": "tests/languages/javascript/spread_and_keyword_feature.test",
    "content": "async function bar() {\r\n\treturn [...await foo()]\r\n}\r\n\r\nconsole.log([...new Set(numbers)])\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"async\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"operator\", \"...\"],\r\n\t[\"keyword\", \"await\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t\"\\r\\n\\r\\nconsole\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"log\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"operator\", \"...\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"class-name\", [\r\n\t\t\"Set\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"numbers\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for the spread operator followed by a keyword.\r\n"
  },
  {
    "path": "tests/languages/javascript/supposed-classes_feature.test",
    "content": "Foo.prototype.bar;\nBar.constructor;\nfooBar.prototype.bar;\n\n----------------------------------------------------\n\n[\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \".\"],\n\t\"prototype\",\n\t[\"punctuation\", \".\"],\n\t\"bar\",\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", \"Bar\"],\n\t[\"punctuation\", \".\"],\n\t\"constructor\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\nfooBar\",\n\t[\"punctuation\", \".\"],\n\t\"prototype\",\n\t[\"punctuation\", \".\"],\n\t\"bar\",\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for supposed function variables based on standard function invocations or modifications.\n"
  },
  {
    "path": "tests/languages/javascript/supposed-function_feature.test",
    "content": "foo.apply(thisArg, args);\nbar.call(...args);\nfooBar.bind(thisArg);\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"apply\"],\n\t[\"punctuation\", \"(\"],\n\t\"thisArg\",\n\t[\"punctuation\", \",\"],\n\t\" args\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"bar\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"call\"],\n\t[\"punctuation\", \"(\"],\n\t[\"operator\", \"...\"],\n\t\"args\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"fooBar\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"bind\"],\n\t[\"punctuation\", \"(\"],\n\t\"thisArg\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for supposed function variables based on standard function invocations or modifications.\n"
  },
  {
    "path": "tests/languages/javascript/template-string_feature.test",
    "content": "`foo bar`\r\n`foo\r\nbar`\r\n`40+2=${40+2}`\r\n`${foo()}`\r\n`\\${foo}${bar}`\r\n\"foo `a` `b` `c` `d` bar\"\r\n\"test // test\" `template`\r\n\r\nconsole.log(`This is ${it.with({ type: false })}!`)\r\n`${ {foo:'bar'}.foo }`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"foo bar\"],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"foo\\r\\nbar\"],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"40+2=\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"number\", \"40\"],\r\n\t\t\t[\"operator\", \"+\"],\r\n\t\t\t[\"number\", \"2\"],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"function\", \"foo\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"\\\\${foo}\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\r\n\t[\"string\", \"\\\"foo `a` `b` `c` `d` bar\\\"\"],\r\n\r\n\t[\"string\", \"\\\"test // test\\\"\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"template\"],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\r\n\t\"\\r\\n\\r\\nconsole\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"log\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"This is \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\"it\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"with\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"literal-property\", \"type\"],\r\n\t\t\t[\"operator\", \":\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"!\"],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"literal-property\", \"foo\"],\r\n\t\t\t[\"operator\", \":\"],\r\n\t\t\t[\"string\", \"'bar'\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"foo \",\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line template strings.\r\n"
  },
  {
    "path": "tests/languages/javascript/try-catch_feature.test",
    "content": "try { } catch (e) { } finally { }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"try\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"e\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for try statements."
  },
  {
    "path": "tests/languages/javascript/variable_feature.test",
    "content": "let async = true;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"let\"],\n\t\" async \",\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for variables with special names.\n"
  },
  {
    "path": "tests/languages/javascript!+css+js-templates/css_inclusion.test",
    "content": "// styled-jsx\r\ncss`a:hover { color: blue; }`;\r\ncss.global`a:hover { color: blue; }`;\r\ncss.resolve`a:hover { color: blue; }`;\r\n\r\n// styled-components\r\nconst Button = styled.button`\r\n\tcolor: blue;\r\n\tbackground: red;\r\n`;\r\nstyled.button.attr({})`color: blue;`;\r\nstyled(Component)`color: blue;`;\r\nstyled(Component).attr({})`color: blue;`;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// styled-jsx\"],\r\n\r\n\t\"\\r\\ncss\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"css\", [\r\n\t\t\t[\"selector\", \"a:hover\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"property\", \"color\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\" blue\",\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\ncss\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"global\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"css\", [\r\n\t\t\t[\"selector\", \"a:hover\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"property\", \"color\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\" blue\",\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\ncss\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"resolve\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"css\", [\r\n\t\t\t[\"selector\", \"a:hover\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"property\", \"color\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\" blue\",\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"// styled-components\"],\r\n\t[\"keyword\", \"const\"],\r\n\t\" Button \",\r\n\t[\"operator\", \"=\"],\r\n\t\" styled\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"button\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"css\", [\r\n\t\t\t[\"property\", \"color\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\" blue\",\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"property\", \"background\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\" red\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\nstyled\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"button\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"attr\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"css\", [\r\n\t\t\t[\"property\", \"color\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\" blue\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"function\", \"styled\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"Component\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"css\", [\r\n\t\t\t[\"property\", \"color\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\" blue\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"function\", \"styled\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"Component\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"attr\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"css\", [\r\n\t\t\t[\"property\", \"color\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\" blue\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tagged template literals containing CSS code.\r\n"
  },
  {
    "path": "tests/languages/javascript!+graphql+js-templates/graphql_inclusion.test",
    "content": "gql`{ foo }`\r\ngraphql`{ foo }`\r\ngraphql.experimental`{ foo }`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"gql\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"graphql\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"property\", \"foo\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\r\n\t\"\\r\\ngraphql\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"graphql\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"property\", \"foo\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\r\n\t\"\\r\\ngraphql\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"experimental\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"graphql\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"property\", \"foo\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tagged template literals containing GraphQL code.\r\n"
  },
  {
    "path": "tests/languages/javascript!+markdown+js-templates/markdown_inclusion.test",
    "content": "md`# h1`;\r\nmarkdown`## h2`;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"md\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"markdown\", [\r\n\t\t\t[\"title\", [\r\n\t\t\t\t[\"punctuation\", \"#\"],\r\n\t\t\t\t\" h1\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t\"\\r\\nmarkdown\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"markdown\", [\r\n\t\t\t[\"title\", [\r\n\t\t\t\t[\"punctuation\", \"##\"],\r\n\t\t\t\t\" h2\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tagged template literals containing Markdown code.\r\n"
  },
  {
    "path": "tests/languages/javascript!+markup+js-templates/markup_inclusion.test",
    "content": "html`\r\n<p>\r\n\tFoo.\r\n</p>`;\r\n\r\ndiv.innerHTML = `<p></p>`;\r\ndiv.outerHTML = `<p></p>`;\r\ndiv.innerHTML += `<p></p>`;\r\n\r\nsvg`<path fill=\"#fff\" d=\"M55.37 ...\"/>`\r\n\r\nhtml`<img src=\"${host}${path}\" alt=\"\\${foo}\"/>`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"html\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"html\", [\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"p\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t\"\\r\\n\\tFoo.\\r\\n\",\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"p\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\n\\r\\ndiv\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"innerHTML \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"html\", [\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"p\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"p\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\ndiv\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"outerHTML \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"html\", [\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"p\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"p\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\ndiv\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"innerHTML \",\r\n\t[\"operator\", \"+=\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"html\", [\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"p\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"p\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\n\\r\\nsvg\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"svg\", [\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"path\"]],\r\n\t\t\t\t[\"attr-name\", [\"fill\"]],\r\n\t\t\t\t[\"attr-value\", [\r\n\t\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t\t\"#fff\",\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"attr-name\", [\"d\"]],\r\n\t\t\t\t[\"attr-value\", [\r\n\t\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t\t\"M55.37 ...\",\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"/>\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\r\n\t\"\\r\\n\\r\\nhtml\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"html\", [\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"img\"]],\r\n\t\t\t\t[\"attr-name\", [\"src\"]],\r\n\t\t\t\t[\"attr-value\", [\r\n\t\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\t\"host\",\r\n\t\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t\t]],\r\n\t\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\t\"path\",\r\n\t\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t\t]],\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"attr-name\", [\"alt\"]],\r\n\t\t\t\t[\"attr-value\", [\r\n\t\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t\t\"\\\\${foo}\",\r\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"/>\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tagged template literals containing HTML/XML code.\r\n"
  },
  {
    "path": "tests/languages/javascript!+regex/regex_inclusion.test",
    "content": "/a+(?:[a-z]|\\d)?/im;\n\n----------------------------------------------------\n\n[\n\t[\"regex\", [\n\t\t[\"regex-delimiter\", \"/\"],\n\t\t[\"regex-source\", [\n\t\t\t\"a\",\n\t\t\t[\"quantifier\", \"+\"],\n\t\t\t[\"group\", [\"(?:\"]],\n\t\t\t[\"char-class\", [\n\t\t\t\t[\"char-class-punctuation\", \"[\"],\n\t\t\t\t[\"range\", [\n\t\t\t\t\t\"a\",\n\t\t\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\t\t\"z\"\n\t\t\t\t]],\n\t\t\t\t[\"char-class-punctuation\", \"]\"]\n\t\t\t]],\n\t\t\t[\"alternation\", \"|\"],\n\t\t\t[\"char-set\", \"\\\\d\"],\n\t\t\t[\"group\", \")\"],\n\t\t\t[\"quantifier\", \"?\"]\n\t\t]],\n\t\t[\"regex-delimiter\", \"/\"],\n\t\t[\"regex-flags\", \"im\"]\n\t]],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for regex inclusion in JavaScript.\n"
  },
  {
    "path": "tests/languages/javascript!+sql+js-templates/sql_inclusion.test",
    "content": "const users = await sql`\r\n  SELECT * FROM users WHERE id = ${id}\r\n`;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"const\"],\r\n\t\" users \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"await\"],\r\n\t\" sql\",\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"sql\", [\r\n\t\t\t[\"keyword\", \"SELECT\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t[\"keyword\", \"FROM\"],\r\n\t\t\t\" users \",\r\n\t\t\t[\"keyword\", \"WHERE\"],\r\n\t\t\t\" id \",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\"id\",\r\n\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tagged template literals containing SQL code.\r\n"
  },
  {
    "path": "tests/languages/javascript+haml/javascript_inclusion.test",
    "content": ":javascript\r\n\t0xBadFace\r\n\r\n~\r\n\t:javascript\r\n\t  0xBadFace\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-javascript\", [\r\n\t\t[\"filter-name\", \":javascript\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"number\", \"0xBadFace\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"~\"],\r\n\t[\"filter-javascript\", [\r\n\t\t[\"filter-name\", \":javascript\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"number\", \"0xBadFace\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for JavaScript filter in Haml. The tilde serves only as a separator.\r\n"
  },
  {
    "path": "tests/languages/javascript+http/issue2733.test",
    "content": "HTTP/1.1 200 OK\r\nconnection: keep-alive\r\ncontent-type: application/json\r\ndate: Sat, 23 Jan 2021 20:36:14 GMT\r\nkeep-alive: timeout=60\r\ntransfer-encoding: chunked\r\n\r\n{\r\n    \"id\": 1,\r\n    \"name\": \"John Doe\",\r\n    \"userName\": \"jdoe\",\r\n    \"email\": \"whatever@something.zzz\",\r\n    \"phone\": \"1234567890\",\r\n    \"birthDate\": \"1878-05-06\",\r\n    \"address\": {\r\n       \"street\": \"Fake St\",\r\n        \"street2\": \"Apt. 556\",\r\n        \"city\": \"Gwenborough\",\r\n        \"state\": \"ZZ\",\r\n        \"zip\": \"12345\"\r\n    }\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"response-status\", [\r\n\t\t[\"http-version\", \"HTTP/1.1\"],\r\n\t\t[\"status-code\", \"200\"],\r\n\t\t[\"reason-phrase\", \"OK\"]\r\n\t]],\r\n\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"connection\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"keep-alive\"]\r\n\t]],\r\n\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"content-type\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"application/json\"]\r\n\t]],\r\n\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"date\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"Sat, 23 Jan 2021 20:36:14 GMT\"]\r\n\t]],\r\n\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"keep-alive\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"timeout=60\"]\r\n\t]],\r\n\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"transfer-encoding\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"chunked\"]\r\n\t]],\r\n\r\n\t[\"application-json\", [\r\n\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t[\"string-property\", \"\\\"id\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"string-property\", \"\\\"name\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"John Doe\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"string-property\", \"\\\"userName\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"jdoe\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"string-property\", \"\\\"email\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"whatever@something.zzz\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"string-property\", \"\\\"phone\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"1234567890\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"string-property\", \"\\\"birthDate\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"1878-05-06\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"string-property\", \"\\\"address\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t[\"string-property\", \"\\\"street\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"Fake St\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"string-property\", \"\\\"street2\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"Apt. 556\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"string-property\", \"\\\"city\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"Gwenborough\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"string-property\", \"\\\"state\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"ZZ\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"string-property\", \"\\\"zip\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"12345\\\"\"],\r\n\r\n\t\t[\"punctuation\", \"}\"],\r\n\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/javascript+http/javascript_inclusion.test",
    "content": "Content-type: application/javascript\r\n\r\nvar a = true;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"Content-type\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"application/javascript\"]\r\n\t]],\r\n\t[\"application-javascript\", [\r\n\t\t[\"keyword\", \"var\"],\r\n\t\t\" a \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for JavaScript content in HTTP.\r\n"
  },
  {
    "path": "tests/languages/javastacktrace/more_feature.test",
    "content": "... 6 more\n\t... 6 common frames omitted\n\n----------------------------------------------------\n\n[\n\t[\"more\", [\n\t\t[\"punctuation\", \"...\"],\n\t\t[\"number\", \"6\"],\n\t\t[\"keyword\", \"more\"]\n\t]],\n\n\t[\"more\", [\n\t\t[\"punctuation\", \"...\"],\n\t\t[\"number\", \"6\"],\n\t\t[\"keyword\", \"common frames omitted\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for the message that some frames were omitted.\n"
  },
  {
    "path": "tests/languages/javastacktrace/stack-frame_feature.test",
    "content": "at Main.main(Main.java:13)\nat Main.main(Main.java:13) Same but with some additional notes\nat com.foo.bar.Main$FooBar.main(Native Method)\nat Main$FooBar.<init>(Unknown Source)\n        at java.base/java.util.jar.JavaUtilJarAccessImpl.ensureInitialization(JavaUtilJarAccessImpl.java:69)\n        at java.base/java.lang.Class.forName0(Native Method)\nat com.foo.loader/foo@9.0/com.foo.Main.run(Main.java:101)\nat com.foo.loader//com.foo.bar.App.run(App.java:12)\nat acme@2.1/org.acme.Lib.test(Lib.java:80)\nat MyClass.mash(MyClass.java:9)\n\n// not to forget our swiss friends\nat at.foo.bar.Main$FooBar.main(Native Method)\n\n----------------------------------------------------\n\n[\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"class-name\", \"Main\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"main\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"source\", [\n\t\t\t[\"file\", \"Main.java\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"line-number\", \"13\"]\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"class-name\", \"Main\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"main\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"source\", [\n\t\t\t[\"file\", \"Main.java\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"line-number\", \"13\"]\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t\" Same but with some additional notes\\r\\n\",\n\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"namespace\", [\n\t\t\t\"com\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"bar\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Main$FooBar\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"main\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"source\", [\n\t\t\t[\"keyword\", \"Native Method\"]\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"class-name\", \"Main$FooBar\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"<init>\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"source\", [\n\t\t\t[\"keyword\", \"Unknown Source\"]\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"module\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"base\"\n\t\t]],\n\t\t[\"punctuation\", \"/\"],\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"util\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"jar\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"JavaUtilJarAccessImpl\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"ensureInitialization\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"source\", [\n\t\t\t[\"file\", \"JavaUtilJarAccessImpl.java\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"line-number\", \"69\"]\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"module\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"base\"\n\t\t]],\n\t\t[\"punctuation\", \"/\"],\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"lang\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Class\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"forName0\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"source\", [\n\t\t\t[\"keyword\", \"Native Method\"]\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"class-loader\", [\n\t\t\t\"com\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"loader\"\n\t\t]],\n\t\t[\"punctuation\", \"/\"],\n\t\t[\"module\", [\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \"@\"],\n\t\t\t[\"version\", \"9.0\"]\n\t\t]],\n\t\t[\"punctuation\", \"/\"],\n\t\t[\"namespace\", [\n\t\t\t\"com\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Main\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"run\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"source\", [\n\t\t\t[\"file\", \"Main.java\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"line-number\", \"101\"]\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"class-loader\", [\n\t\t\t\"com\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"loader\"\n\t\t]],\n\t\t[\"punctuation\", \"/\"],\n\t\t[\"punctuation\", \"/\"],\n\t\t[\"namespace\", [\n\t\t\t\"com\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"bar\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"App\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"run\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"source\", [\n\t\t\t[\"file\", \"App.java\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"line-number\", \"12\"]\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"module\", [\n\t\t\t\"acme\",\n\t\t\t[\"punctuation\", \"@\"],\n\t\t\t[\"version\", \"2.1\"]\n\t\t]],\n\t\t[\"punctuation\", \"/\"],\n\t\t[\"namespace\", [\n\t\t\t\"org\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"acme\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Lib\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"test\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"source\", [\n\t\t\t[\"file\", \"Lib.java\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"line-number\", \"80\"]\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"class-name\", \"MyClass\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"mash\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"source\", [\n\t\t\t[\"file\", \"MyClass.java\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"line-number\", \"9\"]\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t\"\\r\\n\\r\\n// not to forget our swiss friends\\r\\n\",\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"namespace\", [\n\t\t\t\"at\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"bar\",\n\t\t\t[\"punctuation\", \".\"]\n\t\t]],\n\t\t[\"class-name\", \"Main$FooBar\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"main\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"source\", [\n\t\t\t[\"keyword\", \"Native Method\"]\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for stack frames.\n"
  },
  {
    "path": "tests/languages/javastacktrace/summary_feature.test",
    "content": "java.lang.NullPointerException\njava.lang.NullPointerException: This is bad\nHighLevelException: MidLevelException: LowLevelException\nHighLevelException: MidLevelException: LowLevelException: This is bad\n\nException in thread \"main\" java.lang.RuntimeException: A test exception\nException in thread \"main\" HighLevelException: MidLevelException: LowLevelException: This is bad\n\nCaused by: Exception: This also includes causes and suppressed exceptions\nCaused by: MidLevelException: LowLevelException\nCaused by: com.example.myproject.MyProjectServletException\n\nSuppressed: java.lang.RuntimeException: could not insert: [com.example.myproject.MyEntity]\n\n----------------------------------------------------\n\n[\n\t[\"summary\", [\n\t\t[\"exceptions\", [\n\t\t\t[\"namespace\", \"java\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"namespace\", \"lang\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"class-name\", \"NullPointerException\"]\n\t\t]]\n\t]],\n\n\t[\"summary\", [\n\t\t[\"exceptions\", [\n\t\t\t[\"namespace\", \"java\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"namespace\", \"lang\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"class-name\", \"NullPointerException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"message\", \"This is bad\"]\n\t]],\n\n\t[\"summary\", [\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"HighLevelException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"MidLevelException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"LowLevelException\"]\n\t\t]]\n\t]],\n\n\t[\"summary\", [\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"HighLevelException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"MidLevelException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"LowLevelException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"message\", \"This is bad\"]\n\t]],\n\n\t[\"summary\", [\n\t\t[\"keyword\", \"Exception in thread\"],\n\t\t[\"string\", \"\\\"main\\\"\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"namespace\", \"java\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"namespace\", \"lang\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"class-name\", \"RuntimeException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"message\", \"A test exception\"]\n\t]],\n\n\t[\"summary\", [\n\t\t[\"keyword\", \"Exception in thread\"],\n\t\t[\"string\", \"\\\"main\\\"\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"HighLevelException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"MidLevelException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"LowLevelException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"message\", \"This is bad\"]\n\t]],\n\n\t[\"summary\", [\n\t\t[\"keyword\", \"Caused by\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"Exception\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"message\", \"This also includes causes and suppressed exceptions\"]\n\t]],\n\n\t[\"summary\", [\n\t\t[\"keyword\", \"Caused by\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"MidLevelException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"class-name\", \"LowLevelException\"]\n\t\t]]\n\t]],\n\n\t[\"summary\", [\n\t\t[\"keyword\", \"Caused by\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"namespace\", \"com\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"namespace\", \"example\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"namespace\", \"myproject\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"class-name\", \"MyProjectServletException\"]\n\t\t]]\n\t]],\n\n\t[\"summary\", [\n\t\t[\"keyword\", \"Suppressed\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"exceptions\", [\n\t\t\t[\"namespace\", \"java\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"namespace\", \"lang\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"class-name\", \"RuntimeException\"]\n\t\t]],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"message\", \"could not insert: [com.example.myproject.MyEntity]\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for exception summaries.\n"
  },
  {
    "path": "tests/languages/jexl/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/jexl/function_feature.test",
    "content": "foo()\r\nfoo ()\r\nfoo\r\n()\r\nfoo . bar ()\r\nfoo_bar()\r\nfoo_bar ( )\r\nf42()\r\n_()\r\n$()\r\nä()\r\nÝ()\r\nfoo({ x: 1 })\r\nfoo({ y: fun() })\r\nfoo(bar())\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo \"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo\\r\\n\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\nfoo \",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"bar \"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo_bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo_bar \"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"f42\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"_\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"$\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"ä\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"Ý\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" x\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" y\",\r\n\t[\"operator\", \":\"],\r\n\t[\"function\", \"fun\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions. Also checks for unicode characters in identifiers.\r\n"
  },
  {
    "path": "tests/languages/jexl/keyword_feature.test",
    "content": "in\r\n\"foo\" in [\"foo\"]\r\n\"f\" in \"foo\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"in\"],\r\n\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"string\", \"\\\"f\\\"\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"string\", \"\\\"foo\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/jexl/number_feature.test",
    "content": "42\r\n3.14159\r\n-5.7\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"operator\", \"-\"], [\"number\", \"5.7\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for integers and floats. Negative numbers are handled differently than in Jexl for simplicity: In Jexl, the minus sign in \"-1\" is parsed as an operator in \"1-1\" and as part of the number literal in (\"-1\").\r\n"
  },
  {
    "path": "tests/languages/jexl/operator_feature.test",
    "content": "-\r\n+\r\n< <=\r\n> >=\r\n==\r\n! !=\r\n&& ||\r\n*\r\n/ //\r\n^\r\n? :\r\n%\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"&&\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"//\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \":\"],\r\n\t[\"operator\", \"%\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/jexl/string_feature.test",
    "content": "'a'\r\n'ä'\r\n'本'\r\n'À'\r\n'\\''\r\n'\"\"'\r\n'Hello,\r\nworld!'\r\n\r\n\"\\n\"\r\n\"\\\"\"\r\n\"Hello,\r\nworld!\"\r\n\"日本語\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"'a'\"],\r\n\t[\"string\", \"'ä'\"],\r\n\t[\"string\", \"'本'\"],\r\n\t[\"string\", \"'À'\"],\r\n\t[\"string\", \"'\\\\''\"],\r\n\t[\"string\", \"'\\\"\\\"'\"],\r\n\t[\"string\", \"'Hello,\\r\\nworld!'\"],\r\n\r\n\t[\"string\", \"\\\"\\\\n\\\"\"],\r\n\t[\"string\", \"\\\"\\\\\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Hello,\\r\\nworld!\\\"\"],\r\n\t[\"string\", \"\\\"日本語\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nJexl strings can contain special characters, and even linebreaks."
  },
  {
    "path": "tests/languages/jexl/transform_feature.test",
    "content": "\"foo\"|bar\r\n\"foo\"| bar\r\n\"foo\"\r\n|   \r\nbar\r\n\r\nfoo|Ý\r\n\r\nfoo|bar()\r\nfoo|bar(1,2)\r\nfoo|bar(\r\n1,2\r\n)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"foo\\\"\"], [\"operator\", \"|\"], [\"transform\", \"bar\"],\r\n\t[\"string\", \"\\\"foo\\\"\"], [\"operator\", \"|\"], [\"transform\", \"bar\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"transform\", \"bar\"],\r\n\r\n\t\"\\r\\n\\r\\nfoo\", [\"operator\", \"|\"], [\"transform\", \"Ý\"],\r\n\r\n\t\"\\r\\n\\r\\nfoo\",\r\n\t[\"operator\", \"|\"],\r\n\t[\"transform\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\nfoo\",\r\n\t[\"operator\", \"|\"],\r\n\t[\"transform\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\nfoo\",\r\n\t[\"operator\", \"|\"],\r\n\t[\"transform\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for transforms. Transforms follow the same naming rules as functions.\r\n"
  },
  {
    "path": "tests/languages/jolie/builtin_feature.test",
    "content": "Byte\nany\nbool\nchar\ndouble\nenum\nfloat\nint\nlength\nlong\nranges\nregex\nstring\nundefined\nvoid\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"Byte\"],\n\t[\"builtin\", \"any\"],\n\t[\"builtin\", \"bool\"],\n\t[\"builtin\", \"char\"],\n\t[\"builtin\", \"double\"],\n\t[\"builtin\", \"enum\"],\n\t[\"builtin\", \"float\"],\n\t[\"builtin\", \"int\"],\n\t[\"builtin\", \"length\"],\n\t[\"builtin\", \"long\"],\n\t[\"builtin\", \"ranges\"],\n\t[\"builtin\", \"regex\"],\n\t[\"builtin\", \"string\"],\n\t[\"builtin\", \"undefined\"],\n\t[\"builtin\", \"void\"]\n]\n"
  },
  {
    "path": "tests/languages/jolie/comment_feature.test",
    "content": "// single line\n\n/*\nmultiple\nlines\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// single line\"],\n\n\t[\"comment\", \"/*\\r\\nmultiple\\r\\nlines\\r\\n*/\"]\n]\n"
  },
  {
    "path": "tests/languages/jolie/deployment_features.test",
    "content": "Aggregates: First, Second with Third\n\nRedirects: First => Second, Third => Fourth\n\nJolie: \"logger.ol\" in LoggerService\n\nlog@LoggerService( new )();\nprintln @ Console( \"none\" )()\n\noutputPort OutputPort3 {\n    location: \"socket://localhost:9002/\"\n    protocol: sodep\n    interfaces: Interface3\n}\n\ninterface MyInterface {\nOneWay:\n    myOW( string )\nRequestResponse:\n    myRR( string )( string )\n}\n\nprivate service MainService {\n    embed ConfigurationService( ) as Conf\n    main {\n        getDBConn@Conf( )( res )\n    }\n}\n\n----------------------------------------------------\n\n[\n\t[\"property\", \"Aggregates\"],\n\t[\"punctuation\", \":\"],\n\t[\"aggregates\", [\n\t\t[\"class-name\", \"First\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", \"Second\"],\n\t\t[\"keyword\", \"with\"],\n\t\t[\"class-name\", \"Third\"]\n\t]],\n\n\t[\"property\", \"Redirects\"],\n\t[\"punctuation\", \":\"],\n\t[\"redirects\", [\n\t\t[\"class-name\", \"First\"],\n\t\t[\"operator\", \"=>\"],\n\t\t[\"class-name\", \"Second\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"class-name\", \"Third\"],\n\t\t[\"operator\", \"=>\"],\n\t\t[\"class-name\", \"Fourth\"]\n\t]],\n\n\t[\"property\", \"Jolie\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"\\\"logger.ol\\\"\"],\n\t[\"keyword\", \"in\"],\n\t[\"class-name\", \"LoggerService\"],\n\n\t[\"function\", \"log\"],\n\t[\"operator\", \"@\"],\n\t[\"class-name\", \"LoggerService\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"new\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"println\"],\n\t[\"operator\", \"@\"],\n\t[\"class-name\", \"Console\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"none\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"outputPort\"],\n\t[\"class-name\", \"OutputPort3\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"property\", \"location\"],\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"\\\"socket://localhost:9002/\\\"\"],\n\n\t[\"property\", \"protocol\"],\n\t[\"punctuation\", \":\"],\n\t\" sodep\\r\\n    \",\n\n\t[\"property\", \"interfaces\"],\n\t[\"punctuation\", \":\"],\n\t\" Interface3\\r\\n\",\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"interface\"],\n\t\" MyInterface \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"property\", \"OneWay\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"function\", \"myOW\"],\n\t[\"punctuation\", \"(\"],\n\t[\"builtin\", \"string\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"property\", \"RequestResponse\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"function\", \"myRR\"],\n\t[\"punctuation\", \"(\"],\n\t[\"builtin\", \"string\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t[\"builtin\", \"string\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"private\"],\n\t[\"keyword\", \"service\"],\n\t[\"class-name\", \"MainService\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"embed\"],\n\t[\"class-name\", \"ConfigurationService\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"as\"],\n\t[\"class-name\", \"Conf\"],\n\n\t[\"keyword\", \"main\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"function\", \"getDBConn\"],\n\t[\"operator\", \"@\"],\n\t[\"class-name\", \"Conf\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t\" res \",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for outputPorts and Aggregates and Redirect constructs.\n"
  },
  {
    "path": "tests/languages/jolie/keyword_feature.test",
    "content": "as;\r\ncH;\r\ncomp;\r\nconcurrent;\r\nconstants;\r\ncourier;\r\ncset;\r\ncsets;\r\ndefault;\r\ndefine;\r\nelse;\r\nembed;\r\nembedded;\r\nexecution;\r\nexit;\r\nextender;\r\nfor;\r\nforeach;\r\nforward;\r\nfrom;\r\nglobal;\r\nif;\r\nimport;\r\nin;\r\ninclude;\r\ninit;\r\ninputPort;\r\ninstall;\r\ninstanceof;\r\ninterface;\r\nis_defined;\r\nlinkIn;\r\nlinkOut;\r\nmain;\r\nnew;\r\nnullProcess;\r\noutputPort;\r\nover;\r\nprivate;\r\nprovide;\r\npublic;\r\nscope;\r\nsequential;\r\nservice;\r\nsingle;\r\nspawn;\r\nsynchronized;\r\nthis;\r\nthrow;\r\nthrows;\r\ntype;\r\nundef;\r\nuntil;\r\nwhile;\r\nwith;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"cH\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"comp\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"concurrent\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"constants\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"courier\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"cset\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"csets\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"default\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"define\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"embed\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"embedded\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"execution\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"exit\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"extender\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"foreach\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"forward\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"from\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"global\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"import\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"include\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"init\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"inputPort\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"install\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"instanceof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"is_defined\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"linkIn\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"linkOut\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"main\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"nullProcess\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"outputPort\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"over\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"private\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"provide\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"public\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"scope\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"sequential\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"service\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"single\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"spawn\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"synchronized\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"this\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"throw\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"throws\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"type\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"undef\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"until\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"with\"], [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/jolie/number_feature.test",
    "content": "42\r\n42L\r\n1.2e3\r\n0.1E-4\r\n0.2e+1\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"42L\"],\r\n\t[\"number\", \"1.2e3\"],\r\n\t[\"number\", \"0.1E-4\"],\r\n\t[\"number\", \"0.2e+1\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal numbers.\r\n"
  },
  {
    "path": "tests/languages/jolie/operator_feature.test",
    "content": "+ ++ +=\r\n- -- -=\r\n! !=\r\n< <= > >= -> <<\r\n= ==\r\n&&\r\n? * / % | @\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"+=\"],\r\n\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"operator\", \"-=\"],\r\n\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"!=\"],\r\n\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"operator\", \"<<\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"==\"],\r\n\r\n\t[\"operator\", \"&&\"],\r\n\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators and symbols.\r\n"
  },
  {
    "path": "tests/languages/jolie/punctuation_feature.test",
    "content": "( ) [ ] { }\n, ; . :\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"]\n]\n"
  },
  {
    "path": "tests/languages/jolie/string_feature.test",
    "content": "\"\"\n\"10\"\n\"\nJOLIE preserves formatting.\n    This line will be indented.\n                    This line too.\n\"\n\njsonValue = \"{\n    \\\"int\\\": 123,\n    \\\"bool\\\": true,\n    \\\"long\\\": 124,\n    \\\"double\\\": 123.4,\n    \\\"string\\\": \\\"string\\\",\n    \\\"void\\\": {},\n    \\\"array\\\": [123, true,\\\"ciccio\\\",124,{}],\n    \\\"obj\\\" : {\n        \\\"int\\\": 1243,\n        \\\"bool\\\": true,\n        \\\"long\\\": 1234,\n        \\\"double\\\": 1234.4,\n        \\\"string\\\": \\\"string\\\",\n        \\\"void\\\": {}\n        }\n    }\"\n;\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"10\\\"\"],\n\t[\"string\", \"\\\"\\r\\nJOLIE preserves formatting.\\r\\n    This line will be indented.\\r\\n                    This line too.\\r\\n\\\"\"],\n\n\t\"\\r\\n\\r\\njsonValue \",\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"{\\r\\n    \\\\\\\"int\\\\\\\": 123,\\r\\n    \\\\\\\"bool\\\\\\\": true,\\r\\n    \\\\\\\"long\\\\\\\": 124,\\r\\n    \\\\\\\"double\\\\\\\": 123.4,\\r\\n    \\\\\\\"string\\\\\\\": \\\\\\\"string\\\\\\\",\\r\\n    \\\\\\\"void\\\\\\\": {},\\r\\n    \\\\\\\"array\\\\\\\": [123, true,\\\\\\\"ciccio\\\\\\\",124,{}],\\r\\n    \\\\\\\"obj\\\\\\\" : {\\r\\n        \\\\\\\"int\\\\\\\": 1243,\\r\\n        \\\\\\\"bool\\\\\\\": true,\\r\\n        \\\\\\\"long\\\\\\\": 1234,\\r\\n        \\\\\\\"double\\\\\\\": 1234.4,\\r\\n        \\\\\\\"string\\\\\\\": \\\\\\\"string\\\\\\\",\\r\\n        \\\\\\\"void\\\\\\\": {}\\r\\n        }\\r\\n    }\\\"\"],\n\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/jq/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/jq/comment_feature.test",
    "content": "# foo\r\n#\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"# foo\"],\r\n\t[\"comment\", \"#\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/jq/dot_feature.test",
    "content": ".\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"dot\", \".\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for the dot.\r\n"
  },
  {
    "path": "tests/languages/jq/function_feature.test",
    "content": "def foo:\r\ndef bar(x,y,z):\r\n\tfooBar(x)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"def\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \":\"],\r\n\r\n\t[\"keyword\", \"def\"],\r\n\t[\"function\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"x\",\r\n\t[\"punctuation\", \",\"],\r\n\t\"y\",\r\n\t[\"punctuation\", \",\"],\r\n\t\"z\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\r\n\t[\"c-style-function\", \"fooBar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"x\",\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/jq/keyword_feature.test",
    "content": "as\r\nbreak\r\ncatch\r\ndef;\r\nelif\r\nelse\r\nend\r\nforeach\r\nif\r\nimport\r\ninclude\r\nlabel\r\nmodule\r\nmodulemeta\r\nnull\r\nreduce\r\nthen\r\ntry\r\nwhile\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"def\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"elif\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"label\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"keyword\", \"modulemeta\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"reduce\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/jq/operator_feature.test",
    "content": "..\r\n== != >= <= < >\r\n= ?\r\n?// //=\r\n+ - * / % | += -= *= /= %= |=\r\nand or not\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"..\"],\r\n\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"?\"],\r\n\r\n\t[\"operator\", \"?//\"],\r\n\t[\"operator\", \"//=\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \"|=\"],\r\n\r\n\t[\"operator\", \"and\"],\r\n\t[\"operator\", \"or\"],\r\n\t[\"operator\", \"not\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/jq/property_feature.test",
    "content": "{ foo: 1, \"bar\": 2, \"foo\\(\"Bar\")\": 3 }\r\n\r\n# not a property\r\nfoo::bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property-literal\", \"foo\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", [\r\n\t\t\"\\\"bar\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", [\r\n\t\t\"\\\"foo\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"\\\\(\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"string\", [\r\n\t\t\t\t\t\"\\\"Bar\\\"\"\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"comment\", \"# not a property\"],\r\n\t\"\\r\\nfoo\",\r\n\t[\"punctuation\", \"::\"],\r\n\t\"bar\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties.\r\n"
  },
  {
    "path": "tests/languages/jq/punctuation_feature.test",
    "content": "() [] {}\r\n, : ;\r\n::\r\n.foo\r\n.[]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"::\"],\r\n\r\n\t[\"punctuation\", \".\"],\r\n\t\"foo\\r\\n\",\r\n\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for punctuation.\r\n"
  },
  {
    "path": "tests/languages/jq/string_feature.test",
    "content": "\"foo\"\r\n\"\\\"\"\r\n\"Aa\\r\\n\\t\\b\\f\\u03bc\"\r\n\"inter\\(\"pol\" + \"ation\")\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\r\n\t\t\"\\\"foo\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"\\\\\\\"\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"Aa\\\\r\\\\n\\\\t\\\\b\\\\f\\\\u03bc\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"inter\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"\\\\(\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"string\", [\r\n\t\t\t\t\t\"\\\"pol\\\"\"\r\n\t\t\t\t]],\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"string\", [\r\n\t\t\t\t\t\"\\\"ation\\\"\"\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and string interpolation.\r\n"
  },
  {
    "path": "tests/languages/jq/variable_feature.test",
    "content": "$foo\r\n$_bar123\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"variable\", \"$_bar123\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables.\r\n"
  },
  {
    "path": "tests/languages/jsdoc/class-name_feature.test",
    "content": "/**\n * @param {number}\n * @param {number | string}\n * @param {Array.<number> | Object.<string, number>}\n * @param {{[x: string]: {start: number, end?: number}}}\n * @param {readonly { min?: number; max: number | null | undefined }[]}\n * @param {null | 1 | 2}\n * @param {true | string}\n * @param {Type1 & Type2}\n * @param {typeof import(\"./foo\").Bar}\n * @param {...any[]}\n * @param {*}\n * @param {() => void}\n *\n * @typedef Foo\n * @typedef {Bar} Foo\n * @template Foo\n * @template {Bar} Foo\n * @augments Foo\n * @extends Foo\n * @class Foo\n * @interface Foo\n * @memberof Foo\n * @memberof! Foo\n * @this Foo\n */\n\n----------------------------------------------------\n\n[\n\t\"/**\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t\"number\",\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t\"number \",\n\t\t[\"operator\", \"|\"],\n\t\t\" string\",\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t\"Array\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"punctuation\", \"<\"],\n\t\t\"number\",\n\t\t[\"punctuation\", \">\"],\n\t\t[\"operator\", \"|\"],\n\t\t\" Object\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"punctuation\", \"<\"],\n\t\t\"string\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" number\",\n\t\t[\"punctuation\", \">\"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t\"x\",\n\t\t[\"operator\", \":\"],\n\t\t\" string\",\n\t\t[\"punctuation\", \"]\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"punctuation\", \"{\"],\n\t\t\"start\",\n\t\t[\"operator\", \":\"],\n\t\t\" number\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" end\",\n\t\t[\"operator\", \"?\"],\n\t\t[\"operator\", \":\"],\n\t\t\" number\",\n\t\t[\"punctuation\", \"}\"],\n\t\t[\"punctuation\", \"}\"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"keyword\", \"readonly\"],\n\t\t[\"punctuation\", \"{\"],\n\t\t\" min\",\n\t\t[\"operator\", \"?\"],\n\t\t[\"operator\", \":\"],\n\t\t\" number\",\n\t\t[\"punctuation\", \";\"],\n\t\t\" max\",\n\t\t[\"operator\", \":\"],\n\t\t\" number \",\n\t\t[\"operator\", \"|\"],\n\t\t[\"keyword\", \"null\"],\n\t\t[\"operator\", \"|\"],\n\t\t[\"keyword\", \"undefined\"],\n\t\t[\"punctuation\", \"}\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"punctuation\", \"]\"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"keyword\", \"null\"],\n\t\t[\"operator\", \"|\"],\n\t\t[\"number\", \"1\"],\n\t\t[\"operator\", \"|\"],\n\t\t[\"number\", \"2\"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"boolean\", \"true\"],\n\t\t[\"operator\", \"|\"],\n\t\t\" string\",\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t\"Type1 \",\n\t\t[\"operator\", \"&\"],\n\t\t\" Type2\",\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"keyword\", \"typeof\"],\n\t\t[\"keyword\", \"import\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"string\", \"\\\"./foo\\\"\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \".\"],\n\t\t\"Bar\",\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"operator\", \"...\"],\n\t\t\"any\",\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"punctuation\", \"]\"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"operator\", \"=>\"],\n\t\t[\"keyword\", \"void\"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\n\t\"\\r\\n *\\r\\n * \",\n\t[\"keyword\", \"@typedef\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@typedef\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t\"Bar\",\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\t[\"class-name\", [\"Foo\"]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@template\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@template\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t\"Bar\",\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\t[\"class-name\", [\"Foo\"]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@augments\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@extends\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@class\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@interface\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@memberof\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@memberof\"],\n\t\"! \",\n\t[\"class-name\", [\"Foo\"]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@this\"],\n\t[\"class-name\", [\"Foo\"]],\n\n\t\"\\r\\n */\"\n]\n\n----------------------------------------------------\n\nChecks for class names.\n"
  },
  {
    "path": "tests/languages/jsdoc/example_feature.test",
    "content": "/**\n * @example\n * // returns 3\n * globalNS.method(5, 15);\n */\n\n----------------------------------------------------\n\n[\n\t\"/**\\r\\n * \",\n\t[\"keyword\", \"@example\"],\n\n\t[\"example\", [\n\t\t\"* \",\n\t\t[\"code\", [\n\t\t\t[\"comment\", \"// returns 3\"]\n\t\t]],\n\n\t\t\"\\r\\n * \",\n\t\t[\"code\", [\n\t\t\t\"globalNS\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"method\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"number\", \"5\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"number\", \"15\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \";\"]\n\t\t]]\n\t]],\n\n\t\"\\r\\n */\"\n]\n\n----------------------------------------------------\n\nChecks for examples.\n"
  },
  {
    "path": "tests/languages/jsdoc/keyword_feature.test",
    "content": "/**\n * @abstract\n * @virtual\n * @access\n * @alias\n * @async\n * @augments\n * @extends\n * @author\n * @borrows\n * @callback\n * @class\n * @constructor\n * @hideconstructor\n * @classdesc\n * @constant\n * @const\n * @constructs\n * @copyright\n * @default\n * @defaultValue\n * @deprecated\n * @description\n * @desc\n * @enum\n * @event\n * @exports\n * @external\n * @host\n * @file\n * @overview\n * @fileoverview\n * @fires\n * @emits\n * @function\n * @func\n * @method\n * @generator\n * @global\n * @ignore\n * @implements\n * @inheritdoc\n * @inner\n * @instance\n * @interface\n * @kind\n * @lends\n * @license\n * @listens\n * @member\n * @var\n * @memberof\n * @mixes\n * @mixin\n * @module\n * @name\n * @namespace\n * @override\n * @package\n * @param\n * @arg\n * @argument\n * @private\n * @property\n * @prop\n * @protected\n * @public\n * @readonly\n * @requires\n * @return\n * @returns\n * @see\n * @since\n * @static\n * @summary\n * @this\n * @throws\n * @exception\n * @todo\n * @tutorial\n * @type\n * @typedef\n * @variation\n * @version\n * @yield\n * @yields\n */\n\n----------------------------------------------------\n\n[\n\t\"/**\\r\\n * \", [\"keyword\", \"@abstract\"],\n\t\"\\r\\n * \", [\"keyword\", \"@virtual\"],\n\t\"\\r\\n * \", [\"keyword\", \"@access\"],\n\t\"\\r\\n * \", [\"keyword\", \"@alias\"],\n\t\"\\r\\n * \", [\"keyword\", \"@async\"],\n\t\"\\r\\n * \", [\"keyword\", \"@augments\"],\n\t\"\\r\\n * \", [\"keyword\", \"@extends\"],\n\t\"\\r\\n * \", [\"keyword\", \"@author\"],\n\t\"\\r\\n * \", [\"keyword\", \"@borrows\"],\n\t\"\\r\\n * \", [\"keyword\", \"@callback\"],\n\t\"\\r\\n * \", [\"keyword\", \"@class\"],\n\t\"\\r\\n * \", [\"keyword\", \"@constructor\"],\n\t\"\\r\\n * \", [\"keyword\", \"@hideconstructor\"],\n\t\"\\r\\n * \", [\"keyword\", \"@classdesc\"],\n\t\"\\r\\n * \", [\"keyword\", \"@constant\"],\n\t\"\\r\\n * \", [\"keyword\", \"@const\"],\n\t\"\\r\\n * \", [\"keyword\", \"@constructs\"],\n\t\"\\r\\n * \", [\"keyword\", \"@copyright\"],\n\t\"\\r\\n * \", [\"keyword\", \"@default\"],\n\t\"\\r\\n * \", [\"keyword\", \"@defaultValue\"],\n\t\"\\r\\n * \", [\"keyword\", \"@deprecated\"],\n\t\"\\r\\n * \", [\"keyword\", \"@description\"],\n\t\"\\r\\n * \", [\"keyword\", \"@desc\"],\n\t\"\\r\\n * \", [\"keyword\", \"@enum\"],\n\t\"\\r\\n * \", [\"keyword\", \"@event\"],\n\t\"\\r\\n * \", [\"keyword\", \"@exports\"],\n\t\"\\r\\n * \", [\"keyword\", \"@external\"],\n\t\"\\r\\n * \", [\"keyword\", \"@host\"],\n\t\"\\r\\n * \", [\"keyword\", \"@file\"],\n\t\"\\r\\n * \", [\"keyword\", \"@overview\"],\n\t\"\\r\\n * \", [\"keyword\", \"@fileoverview\"],\n\t\"\\r\\n * \", [\"keyword\", \"@fires\"],\n\t\"\\r\\n * \", [\"keyword\", \"@emits\"],\n\t\"\\r\\n * \", [\"keyword\", \"@function\"],\n\t\"\\r\\n * \", [\"keyword\", \"@func\"],\n\t\"\\r\\n * \", [\"keyword\", \"@method\"],\n\t\"\\r\\n * \", [\"keyword\", \"@generator\"],\n\t\"\\r\\n * \", [\"keyword\", \"@global\"],\n\t\"\\r\\n * \", [\"keyword\", \"@ignore\"],\n\t\"\\r\\n * \", [\"keyword\", \"@implements\"],\n\t\"\\r\\n * \", [\"keyword\", \"@inheritdoc\"],\n\t\"\\r\\n * \", [\"keyword\", \"@inner\"],\n\t\"\\r\\n * \", [\"keyword\", \"@instance\"],\n\t\"\\r\\n * \", [\"keyword\", \"@interface\"],\n\t\"\\r\\n * \", [\"keyword\", \"@kind\"],\n\t\"\\r\\n * \", [\"keyword\", \"@lends\"],\n\t\"\\r\\n * \", [\"keyword\", \"@license\"],\n\t\"\\r\\n * \", [\"keyword\", \"@listens\"],\n\t\"\\r\\n * \", [\"keyword\", \"@member\"],\n\t\"\\r\\n * \", [\"keyword\", \"@var\"],\n\t\"\\r\\n * \", [\"keyword\", \"@memberof\"],\n\t\"\\r\\n * \", [\"keyword\", \"@mixes\"],\n\t\"\\r\\n * \", [\"keyword\", \"@mixin\"],\n\t\"\\r\\n * \", [\"keyword\", \"@module\"],\n\t\"\\r\\n * \", [\"keyword\", \"@name\"],\n\t\"\\r\\n * \", [\"keyword\", \"@namespace\"],\n\t\"\\r\\n * \", [\"keyword\", \"@override\"],\n\t\"\\r\\n * \", [\"keyword\", \"@package\"],\n\t\"\\r\\n * \", [\"keyword\", \"@param\"],\n\t\"\\r\\n * \", [\"keyword\", \"@arg\"],\n\t\"\\r\\n * \", [\"keyword\", \"@argument\"],\n\t\"\\r\\n * \", [\"keyword\", \"@private\"],\n\t\"\\r\\n * \", [\"keyword\", \"@property\"],\n\t\"\\r\\n * \", [\"keyword\", \"@prop\"],\n\t\"\\r\\n * \", [\"keyword\", \"@protected\"],\n\t\"\\r\\n * \", [\"keyword\", \"@public\"],\n\t\"\\r\\n * \", [\"keyword\", \"@readonly\"],\n\t\"\\r\\n * \", [\"keyword\", \"@requires\"],\n\t\"\\r\\n * \", [\"keyword\", \"@return\"],\n\t\"\\r\\n * \", [\"keyword\", \"@returns\"],\n\t\"\\r\\n * \", [\"keyword\", \"@see\"],\n\t\"\\r\\n * \", [\"keyword\", \"@since\"],\n\t\"\\r\\n * \", [\"keyword\", \"@static\"],\n\t\"\\r\\n * \", [\"keyword\", \"@summary\"],\n\t\"\\r\\n * \", [\"keyword\", \"@this\"],\n\t\"\\r\\n * \", [\"keyword\", \"@throws\"],\n\t\"\\r\\n * \", [\"keyword\", \"@exception\"],\n\t\"\\r\\n * \", [\"keyword\", \"@todo\"],\n\t\"\\r\\n * \", [\"keyword\", \"@tutorial\"],\n\t\"\\r\\n * \", [\"keyword\", \"@type\"],\n\t\"\\r\\n * \", [\"keyword\", \"@typedef\"],\n\t\"\\r\\n * \", [\"keyword\", \"@variation\"],\n\t\"\\r\\n * \", [\"keyword\", \"@version\"],\n\t\"\\r\\n * \", [\"keyword\", \"@yield\"],\n\t\"\\r\\n * \", [\"keyword\", \"@yields\"],\n\t\"\\r\\n */\"\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/jsdoc/parameter_feature.test",
    "content": "/**\n * @param n - A number.\n * @param [n] - A number.\n * @param [n=1+2] - A number.\n * @param {number} n - A number.\n * @param {{[x: string]: {start: number, end?: number}}} map\n * @param {any} foo.bar\n */\n\n----------------------------------------------------\n\n[\n\t\"/**\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"parameter\", [\"n\"]],\n\t\" - A number.\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"optional-parameter\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"parameter\", [\"n\"]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\" - A number.\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"optional-parameter\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"parameter\", [\"n\"]],\n\t\t[\"punctuation\", \"=\"],\n\t\t[\"code\", [\n\t\t\t[\"number\", \"1\"],\n\t\t\t[\"operator\", \"+\"],\n\t\t\t[\"number\", \"2\"]\n\t\t]],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t\" - A number.\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t\"number\",\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\t[\"parameter\", [\"n\"]],\n\t\" - A number.\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t\"x\",\n\t\t[\"operator\", \":\"],\n\t\t\" string\",\n\t\t[\"punctuation\", \"]\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"punctuation\", \"{\"],\n\t\t\"start\",\n\t\t[\"operator\", \":\"],\n\t\t\" number\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" end\",\n\t\t[\"operator\", \"?\"],\n\t\t[\"operator\", \":\"],\n\t\t\" number\",\n\t\t[\"punctuation\", \"}\"],\n\t\t[\"punctuation\", \"}\"],\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\t[\"parameter\", [\"map\"]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"{\"],\n\t\t\"any\",\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\t[\"parameter\", [\n\t\t\"foo\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"bar\"\n\t]],\n\n\t\"\\r\\n */\"\n]\n\n----------------------------------------------------\n\nChecks for parameters.\n"
  },
  {
    "path": "tests/languages/jsdoc+javascript/jsdoc_inclusion.test",
    "content": "/** Description. */\n\n----------------------------------------------------\n\n[\n\t[\"doc-comment\", [\"/** Description. */\"]]\n]\n\n----------------------------------------------------\n\nChecks for JSDoc doc comments in JavaScript.\n"
  },
  {
    "path": "tests/languages/json/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/json/comment_feature.test",
    "content": "{\r\n\t// Line comment \"\"\r\n\t\"//\": \"//\",\r\n\r\n\t/* Block comment */\r\n\t\"/*\": \"*/\"\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"comment\", \"// Line comment \\\"\\\"\"],\r\n\t[\"property\", \"\\\"//\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"//\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"comment\", \"/* Block comment */\"],\r\n\t[\"property\", \"\\\"/*\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"*/\\\"\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments.\r\n"
  },
  {
    "path": "tests/languages/json/issue1852.test",
    "content": "{\r\n\t\"A\": \"/*\",\r\n\t\"B\": \"B\",\r\n\t\"C\": \"C\"\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"A\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"/*\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"\\\"B\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"B\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"\\\"C\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"C\\\"\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for issue #1852.\r\n"
  },
  {
    "path": "tests/languages/json/null_feature.test",
    "content": "null\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"null\", \"null\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for null."
  },
  {
    "path": "tests/languages/json/number_feature.test",
    "content": "0\r\n123\r\n3.14159\r\n5.0e8\r\n0.2E+2\r\n47e-5\r\n-1.23\r\n-2.34E33\r\n-4.34E-33\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"5.0e8\"],\r\n\t[\"number\", \"0.2E+2\"],\r\n\t[\"number\", \"47e-5\"],\r\n\t[\"number\", \"-1.23\"],\r\n\t[\"number\", \"-2.34E33\"],\r\n\t[\"number\", \"-4.34E-33\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/json/operator_feature.test",
    "content": ":\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \":\"]\n]\n\n----------------------------------------------------\n\nChecks for all operators.\n"
  },
  {
    "path": "tests/languages/json/property_feature.test",
    "content": "{\"foo\\\"bar\\\"baz\":1,\"foo\":2}\r\n{\r\n\t\"foo\": 1,\r\n\t\"b\\\"ar\": 2\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"foo\\\\\\\"bar\\\\\\\"baz\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"\\\"foo\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"foo\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"\\\"b\\\\\\\"ar\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for features."
  },
  {
    "path": "tests/languages/json/punctuation_feature.test",
    "content": "{}\n{ }\n[]\n],\n},\n,\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"],\n\t[\"punctuation\", \"]\"], [\"punctuation\", \",\"],\n\t[\"punctuation\", \"}\"], [\"punctuation\", \",\"],\n\t[\"punctuation\", \",\"]\n]\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/json/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n\"foo\\\"bar\\\"baz\"\r\n\"\\u2642\\\\ \"\r\n{\"foo\":\"bar\",\"baz\":\"\\\"\"}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\\\\\"bar\\\\\\\"baz\\\"\"],\r\n\t[\"string\", \"\\\"\\\\u2642\\\\\\\\ \\\"\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"foo\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"bar\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"\\\"baz\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"\\\\\\\"\\\"\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/json+http/issue2733.test",
    "content": "HTTP/1.1 200 OK\r\nconnection: keep-alive\r\ncontent-type: application/json\r\ndate: Sat, 23 Jan 2021 20:36:14 GMT\r\nkeep-alive: timeout=60\r\ntransfer-encoding: chunked\r\n\r\n{\r\n    \"id\": 1,\r\n    \"name\": \"John Doe\",\r\n    \"userName\": \"jdoe\",\r\n    \"email\": \"whatever@something.zzz\",\r\n    \"phone\": \"1234567890\",\r\n    \"birthDate\": \"1878-05-06\",\r\n    \"address\": {\r\n       \"street\": \"Fake St\",\r\n        \"street2\": \"Apt. 556\",\r\n        \"city\": \"Gwenborough\",\r\n        \"state\": \"ZZ\",\r\n        \"zip\": \"12345\"\r\n    }\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"response-status\", [\r\n\t\t[\"http-version\", \"HTTP/1.1\"],\r\n\t\t[\"status-code\", \"200\"],\r\n\t\t[\"reason-phrase\", \"OK\"]\r\n\t]],\r\n\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"connection\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"keep-alive\"]\r\n\t]],\r\n\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"content-type\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"application/json\"]\r\n\t]],\r\n\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"date\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"Sat, 23 Jan 2021 20:36:14 GMT\"]\r\n\t]],\r\n\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"keep-alive\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"timeout=60\"]\r\n\t]],\r\n\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"transfer-encoding\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"chunked\"]\r\n\t]],\r\n\r\n\t[\"application-json\", [\r\n\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t[\"property\", \"\\\"id\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"property\", \"\\\"name\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"John Doe\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"property\", \"\\\"userName\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"jdoe\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"property\", \"\\\"email\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"whatever@something.zzz\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"property\", \"\\\"phone\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"1234567890\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"property\", \"\\\"birthDate\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"1878-05-06\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"property\", \"\\\"address\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t[\"property\", \"\\\"street\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"Fake St\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"property\", \"\\\"street2\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"Apt. 556\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"property\", \"\\\"city\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"Gwenborough\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"property\", \"\\\"state\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"ZZ\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t[\"property\", \"\\\"zip\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"12345\\\"\"],\r\n\r\n\t\t[\"punctuation\", \"}\"],\r\n\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/json+http/issue3168.test",
    "content": "HTTP/1.1 200 OK\nAccess-Control-Allow-Credentials: true\nAccess-Control-Allow-Origin: *\nConnection: keep-alive\nContent-Length: 523\nContent-Type: application/json\nServer: gunicorn/19.9.0\nX-Kong-Proxy-Latency: 1\nX-Kong-Upstream-Latency: 1\n{\n    \"args\": {},\n    \"data\": \"\",\n    \"files\": {},\n    \"form\": {},\n    \"headers\": {\n        \"Accept\": \"*/*\",\n        \"Accept-Encoding\": \"gzip, deflate\",\n        \"Connection\": \"close\",\n        \"Host\": \"httpbin.org\",\n        \"User-Agent\": \"HTTPie/1.0.2\",\n        \"X-Forwarded-Host\": \"example.com\"\n    },\n    \"json\": null,\n    \"method\": \"GET\",\n    \"origin\": \"172.19.0.1, 52.201.239.166\",\n    \"url\": \"http://example.com/anything\"\n}\n\n----------------------------------------------------\n\n[\n\t[\"response-status\", [\n\t\t[\"http-version\", \"HTTP/1.1\"],\n\t\t[\"status-code\", \"200\"],\n\t\t[\"reason-phrase\", \"OK\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"Access-Control-Allow-Credentials\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"true\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"Access-Control-Allow-Origin\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"*\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"Connection\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"keep-alive\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"Content-Length\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"523\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"Content-Type\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"application/json\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"Server\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"gunicorn/19.9.0\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"X-Kong-Proxy-Latency\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"1\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"X-Kong-Upstream-Latency\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"1\"]\n\t]],\n\n\t[\"application-json\", [\n\t\t[\"punctuation\", \"{\"],\n\n\t\t[\"property\", \"\\\"args\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"punctuation\", \"}\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"data\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\"\\\"\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"files\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"punctuation\", \"}\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"form\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"punctuation\", \"}\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"headers\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"punctuation\", \"{\"],\n\n\t\t[\"property\", \"\\\"Accept\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\"*/*\\\"\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"Accept-Encoding\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\"gzip, deflate\\\"\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"Connection\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\"close\\\"\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"Host\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\"httpbin.org\\\"\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"User-Agent\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\"HTTPie/1.0.2\\\"\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"X-Forwarded-Host\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\"example.com\\\"\"],\n\n\t\t[\"punctuation\", \"}\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"json\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"null\", \"null\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"method\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\"GET\\\"\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"origin\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\"172.19.0.1, 52.201.239.166\\\"\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"property\", \"\\\"url\\\"\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\"http://example.com/anything\\\"\"],\n\n\t\t[\"punctuation\", \"}\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/json+http/json-suffix_inclusion.test",
    "content": "Content-type: application/x.foo+bar+json\r\n\r\n{\"foo\":\"bar\"}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"Content-type\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"application/x.foo+bar+json\"]\r\n\t]],\r\n\t[\"application-json\", [\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"property\", \"\\\"foo\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"bar\\\"\"],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for content with JSON suffix in HTTP.\r\n"
  },
  {
    "path": "tests/languages/json+http/json_inclusion.test",
    "content": "Content-type: application/json\r\n\r\n{\"foo\":\"bar\"}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"Content-type\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"application/json\"]\r\n\t]],\r\n\t[\"application-json\", [\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"property\", \"\\\"foo\\\"\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"bar\\\"\"],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for JSON content in HTTP.\r\n"
  },
  {
    "path": "tests/languages/json5/number_feature.test",
    "content": "0\n+0\n-0\n\n123\n+123\n-123\n\n0xdeadBEEF\n+0xdeadBEEF\n-0xdeadBEEF\n\nNaN\nInfinity\n+Infinity\n-Infinity\n\n3.14159\n5.0e8\n5.e8\n0.2E+2\n.2E+2\n47e-5\n-1.23\n-2.34E33\n-4.34E-33\n+4.34E+33\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"+0\"],\n\t[\"number\", \"-0\"],\n\t[\"number\", \"123\"],\n\t[\"number\", \"+123\"],\n\t[\"number\", \"-123\"],\n\t[\"number\", \"0xdeadBEEF\"],\n\t[\"number\", \"+0xdeadBEEF\"],\n\t[\"number\", \"-0xdeadBEEF\"],\n\t[\"number\", \"NaN\"],\n\t[\"number\", \"Infinity\"],\n\t[\"number\", \"+Infinity\"],\n\t[\"number\", \"-Infinity\"],\n\t[\"number\", \"3.14159\"],\n\t[\"number\", \"5.0e8\"],\n\t[\"number\", \"5.e8\"],\n\t[\"number\", \"0.2E+2\"],\n\t[\"number\", \".2E+2\"],\n\t[\"number\", \"47e-5\"],\n\t[\"number\", \"-1.23\"],\n\t[\"number\", \"-2.34E33\"],\n\t[\"number\", \"-4.34E-33\"],\n\t[\"number\", \"+4.34E+33\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers.\n"
  },
  {
    "path": "tests/languages/json5/property_feature.test",
    "content": "{\"foo\\\"bar\\\"baz\":1,\"foo\":2}\n{\n\t\"foo\": 1,\n\t\"b\\\"ar\": 2,\n\t'foo': 3\n\tfoo: 3,\n\t'\"':'\"',\n}\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\t[\"property\", \"\\\"foo\\\\\\\"bar\\\\\\\"baz\\\"\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", \"\\\"foo\\\"\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"{\"],\n\t[\"property\", \"\\\"foo\\\"\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", \"\\\"b\\\\\\\"ar\\\"\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", \"'foo'\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"3\"],\n\t[\"property\", \"foo\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"3\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", \"'\\\"'\"],\n\t[\"operator\", \":\"],\n\t[\"string\", \"'\\\"'\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for properties.\n"
  },
  {
    "path": "tests/languages/json5/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"foo\\\"bar\\\"baz\"\n\"\\u2642\\\\ \"\n{\"foo\":\"bar\",\"baz\":\"\\\"\"}\n'foo\"bar\"baz'\n'\\u0001'\n\"\\\nnewline\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\n\t[\"string\", \"\\\"foo\\\"\"],\n\n\t[\"string\", \"\\\"foo\\\\\\\"bar\\\\\\\"baz\\\"\"],\n\n\t[\"string\", \"\\\"\\\\u2642\\\\\\\\ \\\"\"],\n\n\t[\"punctuation\", \"{\"],\n\t[\"property\", \"\\\"foo\\\"\"],\n\t[\"operator\", \":\"],\n\t[\"string\", \"\\\"bar\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", \"\\\"baz\\\"\"],\n\t[\"operator\", \":\"],\n\t[\"string\", \"\\\"\\\\\\\"\\\"\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"string\", \"'foo\\\"bar\\\"baz'\"],\n\n\t[\"string\", \"'\\\\u0001'\"],\n\n\t[\"string\", \"\\\"\\\\\\r\\nnewline\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/jsonp/function_feature.test",
    "content": "callback();\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"callback\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n----------------------------------------------------\n\nChecks for callback functions.\n"
  },
  {
    "path": "tests/languages/jsonp/punctuation_feature.test",
    "content": "{}\n{ }\n[]\n],\n},\n,\n;\n()\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"],\n\t[\"punctuation\", \"]\"], [\"punctuation\", \",\"],\n\t[\"punctuation\", \"}\"], [\"punctuation\", \",\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"(\"], [\"punctuation\", \")\"]\n]\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/jsstacktrace/alias_feature.test",
    "content": "Foo\n    at REPLServer.runBound [as eval] (domain.js:293:12)\n\n----------------------------------------------------\n\n[\n\t[\"error-message\", \"Foo\"],\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"function\", [\n\t\t\t\"REPLServer\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"runBound\"\n\t\t]],\n\t\t[\"alias\", \"[as eval]\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"filename\", \"domain.js\"],\n\t\t[\"line-number\", [\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t\"293\",\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t\"12\"\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/jsstacktrace/errormessage-nodejs_feature.test",
    "content": "(node:16843) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'tick' of undefined\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"error-message\", \"(node:16843) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'tick' of undefined\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks basic a basic error message.\r\n"
  },
  {
    "path": "tests/languages/jsstacktrace/errormessage_feature.test",
    "content": "Some text\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"error-message\", \"Some text\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks basic a basic error message.\r\n"
  },
  {
    "path": "tests/languages/jsstacktrace/filename_feature.test",
    "content": "Some text\n\tat (foo/bar.baz:123:98)\n\n----------------------------------------------------\n\n[\n\t[\"error-message\", \"Some text\"],\n\t[\n\t\t\"stack-frame\",\n\t\t[\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"filename\", \"foo/bar.baz\"],\n\t\t\t[\n\t\t\t\t\"line-number\",\n\t\t\t\t[\n\t\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\t\"123\",\n\t\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\t\"98\"\n\t\t\t\t]\n\t\t\t],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]\n\t]\n]\n\n----------------------------------------------------\n\nChecks basic a basic error message.\n"
  },
  {
    "path": "tests/languages/jsstacktrace/filenamedirect_feature.test",
    "content": "Some text\n\tat /foo/bar.baz:123:98\n\n----------------------------------------------------\n\n[\n\t[\"error-message\", \"Some text\"],\n\t[\n\t\t\"stack-frame\",\n\t\t[\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"filename\", \"/foo/bar.baz\"],\n\t\t\t[\n\t\t\t\t\"line-number\",\n\t\t\t\t[\n\t\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\t\"123\",\n\t\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\t\"98\"\n\t\t\t\t]\n\t\t\t]\n\t\t]\n\t]\n]\n\n----------------------------------------------------\n\nChecks basic a basic error message.\n"
  },
  {
    "path": "tests/languages/jsstacktrace/filenamedirectwindows_feature.test",
    "content": "Some text\n\tat C:\\foo\\bar.baz:123:98\n\n----------------------------------------------------\n\n[\n\t[\"error-message\", \"Some text\"],\n\t[\n\t\t\"stack-frame\",\n\t\t[\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"filename\", \"C:\\\\foo\\\\bar.baz\"],\n\t\t\t[\n\t\t\t\t\"line-number\",\n\t\t\t\t[\n\t\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\t\"123\",\n\t\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\t\"98\"\n\t\t\t\t]\n\t\t\t]\n\t\t]\n\t]\n]\n\n----------------------------------------------------\n\nChecks basic a basic error message.\n"
  },
  {
    "path": "tests/languages/jsstacktrace/function_feature.test",
    "content": "Some text\n\tat foo.bar\n\tat DenoError (deno/js/errors.ts:22:5)\n\tat new <anonymous> (_http_common.js:159:16)\n\n----------------------------------------------------\n\n[\n\t[\"error-message\", \"Some text\"],\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"function\", [\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t\"bar\"\n\t\t]]\n\t]],\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"function\", [\"DenoError\"]],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"filename\", \"deno/js/errors.ts\"],\n\t\t[\"line-number\", [\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t\"22\",\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t\"5\"\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"keyword\", \"new\"],\n\t\t[\"function\", [\"<anonymous>\"]],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"filename\", \"_http_common.js\"],\n\t\t[\"line-number\", [\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t\"159\",\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t\"16\"\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks basic a basic error message.\n"
  },
  {
    "path": "tests/languages/jsstacktrace/linenumber_feature.test",
    "content": "Some text\n\tat :98:32\n\n----------------------------------------------------\n\n[\n\t[\"error-message\", \"Some text\"],\n\t[\n\t\t\"stack-frame\", [\n\t\t\t[\n\t\t\t\t\"keyword\",\n\t\t\t\t\"at\"\n\t\t\t],\n\t\t\t[\n\t\t\t\t\"line-number\",\n\t\t\t\t[\n\t\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\t\"98\",\n\t\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\t\"32\"\n\t\t\t\t]\n\t\t\t]\n\t\t]\n\t]\n]\n\n----------------------------------------------------\n\nChecks basic a basic error message.\n"
  },
  {
    "path": "tests/languages/jsstacktrace/notmycode_feature.test",
    "content": "Some text\n\tat new Foo (foo.js:3:7)\n\tat processTicksAndRejections (internal/process/task_queues.js:98:32)\n\nFoo\n    at throwsA (<unknown>:1:23)\n    at <unknown>:1:13\n\n----------------------------------------------------\n\n[\n\t[\"error-message\", \"Some text\"],\n\t[\"stack-frame\", [\n\t\t[\"keyword\", \"at\"],\n\t\t[\"keyword\", \"new\"],\n\t\t[\"function\", [\"Foo\"]],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"filename\", \"foo.js\"],\n\t\t[\"line-number\", [\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t\"3\",\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t\"7\"\n\t\t]],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"stack-frame\", [\n\t\t[\"not-my-code\", \"at processTicksAndRejections (internal/process/task_queues.js:98:32)\"]\n\t]],\n\n\t[\"error-message\", \"Foo\"],\n\t[\"stack-frame\", [\n\t\t[\"not-my-code\", \"at throwsA (<unknown>:1:23)\"]\n\t]],\n\t[\"stack-frame\", [\n\t\t[\"not-my-code\", \"at <unknown>:1:13\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks greying out internal / library code stack trace frames\n"
  },
  {
    "path": "tests/languages/jsx/dollars-in-attrs.test",
    "content": "<div $$=\"bar baz\" />;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"$$\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"bar baz\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that attribute names can contain $\r\nNo issue filed\r\n"
  },
  {
    "path": "tests/languages/jsx/issue1103.test",
    "content": "var myDivElement = <div foo=\"bar baz\" />;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"var\"],\r\n\t\" myDivElement \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"foo\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"bar baz\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that quoted attribute values can contain spaces.\r\nSee #1103.\r\n"
  },
  {
    "path": "tests/languages/jsx/issue1235.test",
    "content": "<Child options={{ track: true }}>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Child\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"options\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"literal-property\", \"track\"],\r\n\t\t\t[\"operator\", \":\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that attribute can contain an simple object.\r\nSee #1235.\r\n"
  },
  {
    "path": "tests/languages/jsx/issue1236.test",
    "content": "<Child {...this.props}>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Child\"]\r\n\t\t]],\r\n\t\t[\"spread\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"operator\", \"...\"],\r\n\t\t\t[\"keyword\", \"this\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"props\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that spread can contain an object property.\r\nSee #1236.\r\n"
  },
  {
    "path": "tests/languages/jsx/issue1294.test",
    "content": "export default () => (\r\n\t<div>\r\n\t\t<h1>Hi! I'm building a fake Gatsby site as part of a tutorial!</h1>\r\n\t\t<p>\r\n\t\t\tWhat do I like to do? Lots of course but definitely enjoy building\r\n\t\t\twebsites.\r\n\t\t</p>\r\n\t</div>\r\n);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\t\\t\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"h1\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"Hi! I'm building a fake Gatsby site as part of a tutorial!\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"h1\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\t\\t\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"p\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\t\\t\\tWhat do I like to do? Lots of course but definitely enjoy building\\r\\n\\t\\t\\twebsites.\\r\\n\\t\\t\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"p\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\t\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nSee #1294.\r\n"
  },
  {
    "path": "tests/languages/jsx/issue1335.test",
    "content": "<Button onClick={(e) => this.setState({clicked: true})} />\r\n<Component\r\n  data={[\r\n\t{id: 0, name: 'Joe'},\r\n\t{id: 1, name: 'Sue'},\r\n  ]}\r\n/>\r\n<Component title={`${name}`} />\r\n<Component title={`${name}'s page`} />\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Button\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"onClick\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"parameter\", [\"e\"]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t[\"keyword\", \"this\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"setState\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"literal-property\", \"clicked\"],\r\n\t\t\t[\"operator\", \":\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Component\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"data\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"literal-property\", \"id\"],\r\n\t\t\t[\"operator\", \":\"],\r\n\t\t\t[\"number\", \"0\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"literal-property\", \"name\"],\r\n\t\t\t[\"operator\", \":\"],\r\n\t\t\t[\"string\", \"'Joe'\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"literal-property\", \"id\"],\r\n\t\t\t[\"operator\", \":\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"literal-property\", \"name\"],\r\n\t\t\t[\"operator\", \":\"],\r\n\t\t\t[\"string\", \"'Sue'\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Component\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"title\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"template-string\", [\r\n\t\t\t\t[\"template-punctuation\", \"`\"],\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\"name\",\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"template-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Component\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"title\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"template-string\", [\r\n\t\t\t\t[\"template-punctuation\", \"`\"],\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\"name\",\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"string\", \"'s page\"],\r\n\t\t\t\t[\"template-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nHandles nested pairs of curly braces inside tag attribute. See #1335\r\n"
  },
  {
    "path": "tests/languages/jsx/issue1342.test",
    "content": "<CodeView title={<span title={123}>2</span>}>for of as</CodeView>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"CodeView\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"title\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"span\"]],\r\n\t\t\t\t[\"attr-name\", [\"title\"]],\r\n\t\t\t\t[\"script\", [\r\n\t\t\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\t\t[\"number\", \"123\"],\r\n\t\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"plain-text\", \"2\"],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t\t[\"tag\", [\"span\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"for of as\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"CodeView\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for nested tag with JSX inside another tag with JSX. See #1342\r\n"
  },
  {
    "path": "tests/languages/jsx/issue1356.test",
    "content": "<a href=\"//localhost\">link</a>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"attr-name\", [\"href\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"//localhost\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"link\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags containing \"//\". See #1356.\r\n"
  },
  {
    "path": "tests/languages/jsx/issue1364.test",
    "content": "<CodeView title={{}} />\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"CodeView\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"title\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for empty objects in JSX. See #1364\r\n"
  },
  {
    "path": "tests/languages/jsx/issue1408.test",
    "content": "<div style={{ marginLeft: `${sidePanelWidth}px` }}>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"style\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"literal-property\", \"marginLeft\"],\r\n\t\t\t[\"operator\", \":\"],\r\n\t\t\t[\"template-string\", [\r\n\t\t\t\t[\"template-punctuation\", \"`\"],\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\"sidePanelWidth\",\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"string\", \"px\"],\r\n\t\t\t\t[\"template-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for template string with interpolation inside object inside JSX tag. See #1408\r\n"
  },
  {
    "path": "tests/languages/jsx/issue1421.test",
    "content": "class Columns extends React.Component {\r\n  render() {\r\n    return (\r\n      <>\r\n        <td>Hello</td>\r\n        <td>World</td>\r\n      </>\r\n    );\r\n  }\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"Columns\"]],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\r\n\t\t\"React\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Component\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"function\", \"render\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"tag\", [\r\n\t\t\"<\",\r\n\t\t[\"tag\", [\r\n\t\t]],\r\n\t\t\">\"\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n        \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"td\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"Hello\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"td\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n        \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"td\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"World\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"td\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n      \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for fragments short syntax. See #1421\r\n"
  },
  {
    "path": "tests/languages/jsx/issue2727.test",
    "content": "import React from 'react'\r\n\r\nimport * as MaxMSP from 'maxmsp-gui'\r\nimport 'maxmsp-gui/dist/index.css'\r\n\r\nexport default function App() {\r\n    return (\r\n        <React.Fragment>\r\n\r\n            <MaxMSP.Bang\r\n                ariaLabel='set the aria-label tag' // defaults to the object name\r\n                ariaPressed={true || false} // default null\r\n                onClick={() => console.log('bang')}\r\n            />\r\n\r\n            <MaxMSP.Ezdac\r\n                ariaLabel='set the aria-label tag' // defaults to the object name\r\n                value={true || false} // default false\r\n                onClick={(bool) => console.log(bool)} // true or false\r\n            />\r\n\r\n            <MaxMSP.Message\r\n                ariaLabel='set the aria-label tag' // defaults to the object name\r\n                ariaPressed={true || false} // default null\r\n                text='What does the message say?'\r\n                onClick={() => console.log('bang')}\r\n            />\r\n\r\n            <MaxMSP.Object\r\n                inactive={true || false} // default false\r\n                text='What is the object called?'\r\n            />\r\n\r\n            <MaxMSP.Playbar\r\n                ariaLabel='set the aria-label tag' // defaults to the object name\r\n                fidelity={100} // max output of slider, default 100\r\n                inactive={true || false} // diable user interaction, default false\r\n                setPlaying={true || false} // set isPlaying externally\r\n                value={50} // inital/updated state, 0 to this.props.fidelity, default 0\r\n                width={200} // width of the slider in pixels, default 200\r\n                isPlaying={(bool) => console.log(bool)}\r\n                onChange={(i) => console.log(`My value is ${i}`)} // 0 - this.props.fidelity\r\n            />\r\n\r\n            <MaxMSP.RadioGroup\r\n                ariaLabel='set the aria-label tag' // defaults to the object name\r\n                items={['array', 'of', 'items']} // this sets the amount of radiobuttons, strings create text alongside each button\r\n                spacing={24} // the height of each button in pixels, defualt 20\r\n                value={i} // this.props.items[i], default 0\r\n                onClick={(i) => console.log(`My value is ${i}`)}\r\n            />\r\n\r\n            <MaxMSP.Slider\r\n                ariaLabel='set the aria-label tag' // defaults to the object name\r\n                fidelity={100} // max output of slider, default 100\r\n                length={200} // width of the slider in pixels, default 200\r\n                value={50} // inital/updated state, 0 to this.props.fidelity, default 0\r\n                onChange={(i) => console.log(`My value is ${i}`)} // 0 - this.props.fidelity\r\n            />\r\n\r\n            <MaxMSP.TextButton\r\n                ariaLabel='set the aria-label tag' // defaults to the object name\r\n                ariaPressed={true || false} // default null, for mode 'false' only\r\n                inactive={true || false} // diable user interaction, default false\r\n                mode={true || false} // true for toggle, false for bang, default false\r\n                text='What does the textbutton say?'\r\n                toggleText='What does the toggled textbutton say?'\r\n                value={true || false} // default false, for mode 'true' only\r\n                // mode 0 onClick\r\n                onClick={() => console.log('bang')}\r\n                // mode 1 onClick\r\n                onClick={(bool) => console.log(bool)}\r\n            />\r\n\r\n            <MaxMSP.Toggle\r\n                ariaLabel='set the aria-label tag' // defaults to the object name\r\n                value={true || false} // default false\r\n                onClick={(bool) => console.log(bool)}\r\n            />\r\n\r\n            <MaxMSP.Umenu\r\n                ariaLabel='set the aria-label tag' // defaults to the object name\r\n                items={['array', 'of', 'items']}\r\n                outputSymbol={true || false} // true for symbol false for int, default false\r\n                value={i} // this.props.items[i], default 0\r\n                width={200} // width of the umenu in pixels, default 100\r\n                onChange={(x) => console.log(`My index/item is ${x}`)}\r\n            />\r\n\r\n        </React.Fragment>\r\n    )\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"import\"], \" React \", [\"keyword\", \"from\"], [\"string\", \"'react'\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"keyword\", \"as\"],\r\n\t\" MaxMSP \",\r\n\t[\"keyword\", \"from\"],\r\n\t[\"string\", \"'maxmsp-gui'\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"string\", \"'maxmsp-gui/dist/index.css'\"],\r\n\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"App\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"React.Fragment\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\r\\n            \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MaxMSP.Bang\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"ariaLabel\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"set the aria-label tag\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// defaults to the object name\"],\r\n\r\n\t\t[\"attr-name\", [\"ariaPressed\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// default null\"],\r\n\r\n\t\t[\"attr-name\", [\"onClick\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t\" console\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"log\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"'bang'\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\r\\n            \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MaxMSP.Ezdac\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"ariaLabel\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"set the aria-label tag\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// defaults to the object name\"],\r\n\r\n\t\t[\"attr-name\", [\"value\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// default false\"],\r\n\r\n\t\t[\"attr-name\", [\"onClick\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"parameter\", [\"bool\"]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t\" console\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"log\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"bool\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// true or false\"],\r\n\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\r\\n            \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MaxMSP.Message\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"ariaLabel\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"set the aria-label tag\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// defaults to the object name\"],\r\n\r\n\t\t[\"attr-name\", [\"ariaPressed\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// default null\"],\r\n\r\n\t\t[\"attr-name\", [\"text\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"What does the message say?\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"onClick\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t\" console\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"log\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"'bang'\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\r\\n            \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MaxMSP.Object\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"inactive\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// default false\"],\r\n\r\n\t\t[\"attr-name\", [\"text\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"What is the object called?\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\r\\n            \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MaxMSP.Playbar\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"ariaLabel\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"set the aria-label tag\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// defaults to the object name\"],\r\n\r\n\t\t[\"attr-name\", [\"fidelity\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"100\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// max output of slider, default 100\"],\r\n\r\n\t\t[\"attr-name\", [\"inactive\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// diable user interaction, default false\"],\r\n\r\n\t\t[\"attr-name\", [\"setPlaying\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// set isPlaying externally\"],\r\n\r\n\t\t[\"attr-name\", [\"value\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"50\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// inital/updated state, 0 to this.props.fidelity, default 0\"],\r\n\r\n\t\t[\"attr-name\", [\"width\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"200\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// width of the slider in pixels, default 200\"],\r\n\r\n\t\t[\"attr-name\", [\"isPlaying\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"parameter\", [\"bool\"]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t\" console\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"log\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"bool\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"onChange\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"parameter\", [\"i\"]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t\" console\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"log\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"template-string\", [\r\n\t\t\t\t[\"template-punctuation\", \"`\"],\r\n\t\t\t\t[\"string\", \"My value is \"],\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\"i\",\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"template-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// 0 - this.props.fidelity\"],\r\n\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\r\\n            \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MaxMSP.RadioGroup\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"ariaLabel\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"set the aria-label tag\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// defaults to the object name\"],\r\n\r\n\t\t[\"attr-name\", [\"items\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"string\", \"'array'\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"'of'\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"'items'\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// this sets the amount of radiobuttons, strings create text alongside each button\"],\r\n\r\n\t\t[\"attr-name\", [\"spacing\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"24\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// the height of each button in pixels, defualt 20\"],\r\n\r\n\t\t[\"attr-name\", [\"value\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"i\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// this.props.items[i], default 0\"],\r\n\r\n\t\t[\"attr-name\", [\"onClick\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"parameter\", [\"i\"]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t\" console\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"log\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"template-string\", [\r\n\t\t\t\t[\"template-punctuation\", \"`\"],\r\n\t\t\t\t[\"string\", \"My value is \"],\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\"i\",\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"template-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\r\\n            \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MaxMSP.Slider\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"ariaLabel\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"set the aria-label tag\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// defaults to the object name\"],\r\n\r\n\t\t[\"attr-name\", [\"fidelity\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"100\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// max output of slider, default 100\"],\r\n\r\n\t\t[\"attr-name\", [\"length\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"200\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// width of the slider in pixels, default 200\"],\r\n\r\n\t\t[\"attr-name\", [\"value\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"50\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// inital/updated state, 0 to this.props.fidelity, default 0\"],\r\n\r\n\t\t[\"attr-name\", [\"onChange\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"parameter\", [\"i\"]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t\" console\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"log\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"template-string\", [\r\n\t\t\t\t[\"template-punctuation\", \"`\"],\r\n\t\t\t\t[\"string\", \"My value is \"],\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\"i\",\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"template-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// 0 - this.props.fidelity\"],\r\n\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\r\\n            \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MaxMSP.TextButton\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"ariaLabel\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"set the aria-label tag\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// defaults to the object name\"],\r\n\r\n\t\t[\"attr-name\", [\"ariaPressed\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// default null, for mode 'false' only\"],\r\n\r\n\t\t[\"attr-name\", [\"inactive\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// diable user interaction, default false\"],\r\n\r\n\t\t[\"attr-name\", [\"mode\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// true for toggle, false for bang, default false\"],\r\n\r\n\t\t[\"attr-name\", [\"text\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"What does the textbutton say?\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"toggleText\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"What does the toggled textbutton say?\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"value\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// default false, for mode 'true' only\"],\r\n\r\n\t\t[\"comment\", \"// mode 0 onClick\"],\r\n\r\n\t\t[\"attr-name\", [\"onClick\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t\" console\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"log\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"'bang'\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t[\"comment\", \"// mode 1 onClick\"],\r\n\r\n\t\t[\"attr-name\", [\"onClick\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"parameter\", [\"bool\"]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t\" console\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"log\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"bool\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\r\\n            \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MaxMSP.Toggle\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"ariaLabel\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"set the aria-label tag\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// defaults to the object name\"],\r\n\r\n\t\t[\"attr-name\", [\"value\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// default false\"],\r\n\r\n\t\t[\"attr-name\", [\"onClick\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"parameter\", [\"bool\"]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t\" console\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"log\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"bool\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\r\\n            \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MaxMSP.Umenu\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"ariaLabel\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"set the aria-label tag\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// defaults to the object name\"],\r\n\r\n\t\t[\"attr-name\", [\"items\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"string\", \"'array'\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"'of'\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"'items'\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"outputSymbol\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"operator\", \"||\"],\r\n\t\t\t[\"boolean\", \"false\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// true for symbol false for int, default false\"],\r\n\r\n\t\t[\"attr-name\", [\"value\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"i\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// this.props.items[i], default 0\"],\r\n\r\n\t\t[\"attr-name\", [\"width\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"200\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"// width of the umenu in pixels, default 100\"],\r\n\r\n\t\t[\"attr-name\", [\"onChange\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"parameter\", [\"x\"]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t\" console\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"log\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"template-string\", [\r\n\t\t\t\t[\"template-punctuation\", \"`\"],\r\n\t\t\t\t[\"string\", \"My index/item is \"],\r\n\t\t\t\t[\"interpolation\", [\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t\t\t\"x\",\r\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"template-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\r\\n        \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"React.Fragment\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/jsx/issue2753.test",
    "content": "const Test = () => {\r\n    return (\r\n       <div>\r\n           <Button {...{onClick, disabled}}>\r\n               Click (Wrong Highlighting)\r\n           </Button>\r\n           <Button onClick={onClick} disabled={disabled}>\r\n               Click (Correct highlighting)\r\n           </Button>\r\n       </div>\r\n    )\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"const\"],\r\n\t[\"function-variable\", \"Test\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n           \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Button\"]\r\n\t\t]],\r\n\t\t[\"spread\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"operator\", \"...\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"onClick\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\" disabled\",\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n               Click (Wrong Highlighting)\\r\\n           \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Button\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n           \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Button\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"onClick\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"onClick\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"disabled\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"disabled\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n               Click (Correct highlighting)\\r\\n           \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Button\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n       \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/jsx/plain-text_feature.test",
    "content": "<div>\r\n\tfoobar for\r\n\t<div>\r\n\t\tfoobar for\r\n\t</div>\r\n\tfoobar for {i == 0 ? 42 : 0}}\r\n</div>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\tfoobar for\\r\\n\\t\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\t\\tfoobar for\\r\\n\\t\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n\\tfoobar for \"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\"i \",\r\n\t[\"operator\", \"==\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"plain-text\", \"}\\r\\n\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that plain text inside tags is unmatched.\r\n"
  },
  {
    "path": "tests/languages/jsx/spread_in_tags.test",
    "content": "<div {...foo}></div>\r\n<div { ...foo }></div>\r\n<div { ... foo }></div>\r\n<div {...{onClick, disabled}}></div>\r\n<div {...foo()}></div>\r\n<div {...(foo ?? bar)}></div>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"spread\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"operator\", \"...\"],\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"spread\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"operator\", \"...\"],\r\n\t\t\t\"foo \",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"spread\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"operator\", \"...\"],\r\n\t\t\t\" foo \",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"spread\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"operator\", \"...\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"onClick\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\" disabled\",\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"spread\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"operator\", \"...\"],\r\n\t\t\t[\"function\", \"foo\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"spread\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"operator\", \"...\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"foo \",\r\n\t\t\t[\"operator\", \"??\"],\r\n\t\t\t\" bar\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nAllow spaces in spread operator brackets in JSX tags.\r\n"
  },
  {
    "path": "tests/languages/jsx/tag_feature.test",
    "content": "var myDivElement = <div className=\"foo\" />;\r\nvar myElement = <MyComponent someProperty={true} />;\r\n<div {...foo}></div>\r\n<> </>\r\n<Tree.TreeNode.Item leaf={true}></Tree.TreeNode.Item>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"var\"],\r\n\t\" myDivElement \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"className\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t\" myElement \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MyComponent\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"someProperty\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"spread\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"operator\", \"...\"],\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"<\",\r\n\t\t[\"tag\", [\r\n\t\t]],\r\n\t\t\">\"\r\n\t]],\r\n\t[\"plain-text\", \" \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Tree.TreeNode.Item\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"leaf\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Tree.TreeNode.Item\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for JSX tags.\r\n"
  },
  {
    "path": "tests/languages/jsx!+graphql+js-templates/graphql_inclusion.test",
    "content": "import React from 'react';\nimport gql from 'graphql-tag';\nimport { Query } from 'react-apollo';\nimport {\n  Card,\n  ResourceList,\n  Stack,\n  TextStyle,\n  Thumbnail,\n} from '@shopify/polaris';\nimport store from 'store-js';\nimport { Redirect } from '@shopify/app-bridge/actions';\nimport { Context } from '@shopify/app-bridge-react';\n\n// GraphQL query to retrieve products by IDs.\n// The price field belongs to the variants object because\n// variations of a product can have different prices.\nconst GET_PRODUCTS_BY_ID = gql`\n  query getProducts($ids: [ID!]!) {\n    nodes(ids: $ids) {\n      ... on Product {\n        title\n        handle\n        descriptionHtml\n        id\n        images(first: 1) {\n          edges {\n            node {\n              originalSrc\n              altText\n            }\n          }\n        }\n        variants(first: 1) {\n          edges {\n            node {\n              price\n              id\n            }\n          }\n        }\n      }\n    }\n  }\n`;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"import\"],\n\t\" React \",\n\t[\"keyword\", \"from\"],\n\t[\"string\", \"'react'\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t\" gql \",\n\t[\"keyword\", \"from\"],\n\t[\"string\", \"'graphql-tag'\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"punctuation\", \"{\"],\n\t\" Query \",\n\t[\"punctuation\", \"}\"],\n\t[\"keyword\", \"from\"],\n\t[\"string\", \"'react-apollo'\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n  Card\",\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n  ResourceList\",\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n  Stack\",\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n  TextStyle\",\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n  Thumbnail\",\n\t[\"punctuation\", \",\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"keyword\", \"from\"],\n\t[\"string\", \"'@shopify/polaris'\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t\" store \",\n\t[\"keyword\", \"from\"],\n\t[\"string\", \"'store-js'\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"punctuation\", \"{\"],\n\t\" Redirect \",\n\t[\"punctuation\", \"}\"],\n\t[\"keyword\", \"from\"],\n\t[\"string\", \"'@shopify/app-bridge/actions'\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"punctuation\", \"{\"],\n\t\" Context \",\n\t[\"punctuation\", \"}\"],\n\t[\"keyword\", \"from\"],\n\t[\"string\", \"'@shopify/app-bridge-react'\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// GraphQL query to retrieve products by IDs.\"],\n\n\t[\"comment\", \"// The price field belongs to the variants object because\"],\n\n\t[\"comment\", \"// variations of a product can have different prices.\"],\n\n\t[\"keyword\", \"const\"],\n\t[\"constant\", \"GET_PRODUCTS_BY_ID\"],\n\t[\"operator\", \"=\"],\n\t\" gql\",\n\t[\"template-string\", [\n\t\t[\"template-punctuation\", \"`\"],\n\t\t[\"graphql\", [\n\t\t\t[\"keyword\", \"query\"],\n\t\t\t[\"definition-query\", \"getProducts\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"variable\", \"$ids\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"scalar\", \"ID\"],\n\t\t\t[\"operator\", \"!\"],\n\t\t\t[\"punctuation\", \"]\"],\n\t\t\t[\"operator\", \"!\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"property-query\", \"nodes\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"attr-name\", \"ids\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"variable\", \"$ids\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"operator\", \"...\"],\n\t\t\t[\"keyword\", \"on\"],\n\t\t\t[\"class-name\", \"Product\"],\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"property\", \"title\"],\n\n\t\t\t[\"property\", \"handle\"],\n\n\t\t\t[\"property\", \"descriptionHtml\"],\n\n\t\t\t[\"property\", \"id\"],\n\n\t\t\t[\"property-query\", \"images\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"attr-name\", \"first\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"number\", \"1\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"object\", \"edges\"],\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"object\", \"node\"],\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"property\", \"originalSrc\"],\n\n\t\t\t[\"property\", \"altText\"],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"property-query\", \"variants\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"attr-name\", \"first\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"number\", \"1\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"object\", \"edges\"],\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"object\", \"node\"],\n\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t[\"property\", \"price\"],\n\n\t\t\t[\"property\", \"id\"],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"punctuation\", \"}\"],\n\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"template-punctuation\", \"`\"]\n\t]],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for tagged template literals containing GraphQL code.\n"
  },
  {
    "path": "tests/languages/julia/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/julia/char_feature.test",
    "content": "'x'\n'\\''\n'\\u2200'\n'\\x80'\n'\\xe2\\x88'\n'∀'\n\n# not a character\nA'b\nA'b''\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'x'\"],\n\t[\"char\", \"'\\\\''\"],\n\t[\"char\", \"'\\\\u2200'\"],\n\t[\"char\", \"'\\\\x80'\"],\n\t[\"char\", \"'\\\\xe2\\\\x88'\"],\n\t[\"char\", \"'∀'\"],\n\n\t[\"comment\", \"# not a character\"],\n\n\t\"\\r\\nA\",\n\t[\"operator\", \"'\"],\n\t\"b\\r\\nA\",\n\t[\"operator\", \"'\"],\n\t\"b\",\n\t[\"operator\", \"'\"],\n\t[\"operator\", \"'\"]\n]\n"
  },
  {
    "path": "tests/languages/julia/comment_feature.test",
    "content": "#\r\n# foobar\r\n#=#\r\n#=\r\n multi line\r\n  =#\r\n\r\n#= #= nested =# =#\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"],\r\n\t[\"comment\", \"#=#\"],\r\n\t[\"comment\", \"#=\\r\\n multi line\\r\\n  =#\"],\r\n\t[\"comment\", \"#= #= nested =# =#\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/julia/constant_feature.test",
    "content": "NaN NaN16 NaN32 NaN64\r\nInf Inf16 Inf32 Inf64\r\n\r\nim\r\npi π\r\nℯ\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"NaN\"],\r\n\t[\"constant\", \"NaN16\"],\r\n\t[\"constant\", \"NaN32\"],\r\n\t[\"constant\", \"NaN64\"],\r\n\t[\"constant\", \"Inf\"],\r\n\t[\"constant\", \"Inf16\"],\r\n\t[\"constant\", \"Inf32\"],\r\n\t[\"constant\", \"Inf64\"],\r\n\r\n\t[\"constant\", \"im\"],\r\n\t[\"constant\", \"pi\"],\r\n\t[\"constant\", \"π\"],\r\n\t[\"constant\", \"ℯ\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all constants.\r\n"
  },
  {
    "path": "tests/languages/julia/issue2360.test",
    "content": "\"\"\"\r\n\tcount_consecutive(str::AbstractString, start::Int)\r\n\r\nCounts the number of identical characters in a given string `str` starting from index `start`.\r\n\r\n# Examples\r\n\r\n```julia-repl\r\njulia> count_consecutive(\"AAAB\", 3)\r\n('A', 3)\r\n\r\njulia> count_consecutive(\"x y z\", 3)\r\n('y', 1)\r\n```\r\n\"\"\"\r\nfunction count_consecutive(str, start)\r\n\t...\r\nend\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\\\"\\r\\n\\tcount_consecutive(str::AbstractString, start::Int)\\r\\n\\r\\nCounts the number of identical characters in a given string `str` starting from index `start`.\\r\\n\\r\\n# Examples\\r\\n\\r\\n```julia-repl\\r\\njulia> count_consecutive(\\\"AAAB\\\", 3)\\r\\n('A', 3)\\r\\n\\r\\njulia> count_consecutive(\\\"x y z\\\", 3)\\r\\n('y', 1)\\r\\n```\\r\\n\\\"\\\"\\\"\"],\r\n\t[\"keyword\", \"function\"],\r\n\t\" count_consecutive\",\r\n\t[\"punctuation\", \"(\"],\r\n\t\"str\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" start\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"keyword\", \"end\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nMulti-line strings didn't work correctly.\r\n"
  },
  {
    "path": "tests/languages/julia/keyword_feature.test",
    "content": "abstract baremodule begin\r\nbitstype break catch\r\nccall const continue\r\ndo else elseif end\r\nexport finally for\r\nfunction global if\r\nimmutable import importall in\r\nlet local macro module\r\nprint println quote\r\nreturn try type\r\nstruct\r\ntypealias using while\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"], [\"keyword\", \"baremodule\"], [\"keyword\", \"begin\"],\r\n\t[\"keyword\", \"bitstype\"], [\"keyword\", \"break\"], [\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"ccall\"], [\"keyword\", \"const\"], [\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"do\"], [\"keyword\", \"else\"], [\"keyword\", \"elseif\"], [\"keyword\", \"end\"],\r\n\t[\"keyword\", \"export\"], [\"keyword\", \"finally\"], [\"keyword\", \"for\"],\r\n\t[\"keyword\", \"function\"], [\"keyword\", \"global\"], [\"keyword\", \"if\"],\r\n\t[\"keyword\", \"immutable\"], [\"keyword\", \"import\"], [\"keyword\", \"importall\"], [\"keyword\", \"in\"],\r\n\t[\"keyword\", \"let\"], [\"keyword\", \"local\"], [\"keyword\", \"macro\"], [\"keyword\", \"module\"],\r\n\t[\"keyword\", \"print\"], [\"keyword\", \"println\"], [\"keyword\", \"quote\"],\r\n\t[\"keyword\", \"return\"], [\"keyword\", \"try\"], [\"keyword\", \"type\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"typealias\"], [\"keyword\", \"using\"], [\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/julia/number_feature.test",
    "content": "0b0011\r\n0o274\r\n0xBadFace\r\n0x123456789abcdef\r\n42\r\n1.\r\n.5\r\n1.23\r\n1e10\r\n2.5e-4\r\n0.5f0\r\n2.5f-4\r\n0x1p0\r\n0x1.8p3\r\n0x.4p-1\r\n10_000\r\n0.000_000_005\r\n0xdead_beef\r\n0b1011_0010\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0b0011\"],\r\n\t[\"number\", \"0o274\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0x123456789abcdef\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"1.\"],\r\n\t[\"number\", \".5\"],\r\n\t[\"number\", \"1.23\"],\r\n\t[\"number\", \"1e10\"],\r\n\t[\"number\", \"2.5e-4\"],\r\n\t[\"number\", \"0.5f0\"],\r\n\t[\"number\", \"2.5f-4\"],\r\n\t[\"number\", \"0x1p0\"],\r\n\t[\"number\", \"0x1.8p3\"],\r\n\t[\"number\", \"0x.4p-1\"],\r\n\t[\"number\", \"10_000\"],\r\n\t[\"number\", \"0.000_000_005\"],\r\n\t[\"number\", \"0xdead_beef\"],\r\n\t[\"number\", \"0b1011_0010\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for binary, octal, hexadecimal and decimal numbers.\r\n"
  },
  {
    "path": "tests/languages/julia/operator_feature.test",
    "content": "+ +=\r\n- -=\r\n* *=\r\n/ /= //\r\n\\ \\=\r\n^ ^=\r\n% %=\r\n÷ ÷=\r\n! != !==\r\n& &= &&\r\n⊻ ⊻=\r\n| |= ||\r\n|> <|\r\n$ $=\r\n< <= <: << <<=\r\n> >= >> >>= >>> >>>=\r\n= == ===\r\n~ ≠ ≤ ≥ √ ∛\r\n\r\nA'b\r\nA'b''\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"], [\"operator\", \"//\"],\r\n\t[\"operator\", \"\\\\\"], [\"operator\", \"\\\\=\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%=\"],\r\n\t[\"operator\", \"÷\"], [\"operator\", \"÷=\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"], [\"operator\", \"!==\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&=\"], [\"operator\", \"&&\"],\r\n\t[\"operator\", \"⊻\"], [\"operator\", \"⊻=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"|=\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"|>\"], [\"operator\", \"<|\"],\r\n\t[\"operator\", \"$\"], [\"operator\", \"$=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<:\"], [\"operator\", \"<<\"], [\"operator\", \"<<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \">>\"], [\"operator\", \">>=\"], [\"operator\", \">>>\"], [\"operator\", \">>>=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"===\"],\r\n\t[\"operator\", \"~\"], [\"operator\", \"≠\"], [\"operator\", \"≤\"], [\"operator\", \"≥\"], [\"operator\", \"√\"], [\"operator\", \"∛\"],\r\n\t\"\\r\\n\\r\\nA\",\r\n\t[\"operator\", \"'\"],\r\n\t\"b\\r\\nA\",\r\n\t[\"operator\", \"'\"],\r\n\t\"b\",\r\n\t[\"operator\", \"'\"],\r\n\t[\"operator\", \"'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/julia/punctuation_feature.test",
    "content": "{ } [ ] ( )\n; ,\n.\n::\n? :\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \"::\"],\n\t[\"punctuation\", \"?\"],\n\t[\"punctuation\", \":\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/julia/regex_feature.test",
    "content": "r\"foo\"i\r\nr\"(a|b)(c)?(d)\"\r\nr\"^\\s*(?:#\\s*(.*?)\\s*$|$)\"\r\nr\"a+.*b+.*?d$\"ism\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"regex\", \"r\\\"foo\\\"i\"],\r\n\t[\"regex\", \"r\\\"(a|b)(c)?(d)\\\"\"],\r\n\t[\"regex\", \"r\\\"^\\\\s*(?:#\\\\s*(.*?)\\\\s*$|$)\\\"\"],\r\n\t[\"regex\", \"r\\\"a+.*b+.*?d$\\\"ism\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for regular expressions.\r\n"
  },
  {
    "path": "tests/languages/julia/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n\"\\xe2\\x88\"\r\n\r\n\"\"\"foo\"\"\"\r\n\"\"\"fo\"o\r\nbar\"\"\"\r\n\r\n`echo hello`\r\n`echo \"foo bar\"`\r\n\r\n# non-standard string\r\ns\"\\g<0>1\"\r\nb\"DATA\\xff\\u2200\"\r\nv\"0.3-\"\r\nraw\"\\\\ \\\\\\\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"\\\"\\\\xe2\\\\x88\\\"\"],\r\n\r\n\t[\"string\", \"\\\"\\\"\\\"foo\\\"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"\\\"\\\"fo\\\"o\\r\\nbar\\\"\\\"\\\"\"],\r\n\r\n\t[\"string\", \"`echo hello`\"],\r\n\t[\"string\", \"`echo \\\"foo bar\\\"`\"],\r\n\r\n\t[\"comment\", \"# non-standard string\"],\r\n\t[\"string\", \"s\\\"\\\\g<0>1\\\"\"],\r\n\t[\"string\", \"b\\\"DATA\\\\xff\\\\u2200\\\"\"],\r\n\t[\"string\", \"v\\\"0.3-\\\"\"],\r\n\t[\"string\", \"raw\\\"\\\\\\\\ \\\\\\\\\\\\\\\"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and characters.\r\n"
  },
  {
    "path": "tests/languages/keepalived/boolean_feature.test",
    "content": "strict_mode on\r\nstrict_mode off\r\nstrict_mode true\r\nstrict_mode false\r\nstrict_mode yes\r\nstrict_mode no\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n   \t[\"property\", \"strict_mode\"],\r\n\t[\"boolean\", \"on\"],\r\n\t[\"property\", \"strict_mode\"],\r\n\t[\"boolean\", \"off\"],\r\n\t[\"property\", \"strict_mode\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"property\", \"strict_mode\"],\r\n\t[\"boolean\", \"false\"],\r\n\t[\"property\", \"strict_mode\"],\r\n\t[\"boolean\", \"yes\"],\r\n\t[\"property\", \"strict_mode\"],\r\n\t[\"boolean\", \"no\"]\r\n]"
  },
  {
    "path": "tests/languages/keepalived/comment_feature.test",
    "content": "#\r\n# Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/keepalived/conditional-configuration_feature.test",
    "content": "global_defs {\r\n   @main   router_id main_router\r\n}\r\n\r\nvrrp_instance VRRP {\r\n   @main    unicast_src_ip 1.2.3.4\r\n   unicast_peer {\r\n\t   @^main    1.2.3.4\r\n   }\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"global_defs\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"conditional-configuration\", \"@main\"],\r\n\t[\"property\", \"router_id\"],\r\n\t\" main_router\\r\\n\",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"property\", \"vrrp_instance\"],\r\n\t\" VRRP \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"conditional-configuration\", \"@main\"],\r\n\t[\"property\", \"unicast_src_ip\"],\r\n\t[\"ip\", \"1.2.3.4\"],\r\n\t[\"property\", \"unicast_peer\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"conditional-configuration\", \"@^main\"],\r\n\t[\"ip\", \"1.2.3.4\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/languages/keepalived/constant_feature.test",
    "content": "virtual_server 192.168.1.200 3306 {\r\n\tlvs_sched rr\r\n\tlvs_sched wrr\r\n\tlvs_sched lc\r\n\tlvs_sched wlc\r\n\tlvs_sched lblc\r\n\tlvs_sched sh\r\n\tlvs_sched mh\r\n\tlvs_sched dh\r\n\tlvs_sched fo\r\n\tlvs_sched ovf\r\n\tlvs_sched lblcr\r\n\tlvs_sched sed\r\n\tlvs_sched nq\r\n\r\n    lvs_method NAT\r\n    lvs_method DR\r\n    lvs_method TUN\r\n\r\n    protocol TCP\r\n    protocol UDP\r\n    protocol SCTP\r\n}\r\n\r\nvrrp_instance test {\r\n    state MASTER\r\n    state BACKUP\r\n\r\n    authentication {\r\n        auth_type PASS\r\n        auth_type AH\r\n    }\r\n}\r\n\r\nDNS_CHECK {\r\n\ttype A\r\n\ttype NS\r\n\ttype CNAME\r\n\ttype SOA\r\n\ttype MX\r\n\ttype TXT\r\n\ttype AAAA\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"virtual_server\"],\r\n\t[\"ip\", \"192.168.1.200\"],\r\n\t[\"number\", \"3306\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"rr\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"wrr\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"lc\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"wlc\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"lblc\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"sh\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"mh\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"dh\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"fo\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"ovf\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"lblcr\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"sed\"],\r\n\t[\"property\", \"lvs_sched\"],\r\n\t[\"constant\", \"nq\"],\r\n\t[\"property\", \"lvs_method\"],\r\n\t[\"constant\", \"NAT\"],\r\n\t[\"property\", \"lvs_method\"],\r\n\t[\"constant\", \"DR\"],\r\n\t[\"property\", \"lvs_method\"],\r\n\t[\"constant\", \"TUN\"],\r\n\t[\"property\", \"protocol\"],\r\n\t[\"constant\", \"TCP\"],\r\n\t[\"property\", \"protocol\"],\r\n\t[\"constant\", \"UDP\"],\r\n\t[\"property\", \"protocol\"],\r\n\t[\"constant\", \"SCTP\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"property\", \"vrrp_instance\"],\r\n\t\" test \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"state\"],\r\n\t[\"constant\", \"MASTER\"],\r\n\t[\"property\", \"state\"],\r\n\t[\"constant\", \"BACKUP\"],\r\n\t[\"property\", \"authentication\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"auth_type\"],\r\n\t[\"constant\", \"PASS\"],\r\n\t[\"property\", \"auth_type\"],\r\n\t[\"constant\", \"AH\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"property\", \"DNS_CHECK\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"type\"],\r\n\t[\"constant\", \"A\"],\r\n\t[\"property\", \"type\"],\r\n\t[\"constant\", \"NS\"],\r\n\t[\"property\", \"type\"],\r\n\t[\"constant\", \"CNAME\"],\r\n\t[\"property\", \"type\"],\r\n\t[\"constant\", \"SOA\"],\r\n\t[\"property\", \"type\"],\r\n\t[\"constant\", \"MX\"],\r\n\t[\"property\", \"type\"],\r\n\t[\"constant\", \"TXT\"],\r\n\t[\"property\", \"type\"],\r\n\t[\"constant\", \"AAAA\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants, number, punctuations."
  },
  {
    "path": "tests/languages/keepalived/ip_feature.test",
    "content": "virtual_server 192.168.1.200 3306\r\nvirtual_server 192.168.1.200/32 3306\r\nvirtual_server ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 3306\r\nvirtual_server ABCD:EF01:2345:6789:ABCD:EF01:2345:6789/128 3306\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"virtual_server\"],\r\n\t[\"ip\", \"192.168.1.200\"],\r\n\t[\"number\", \"3306\"],\r\n\t[\"property\", \"virtual_server\"],\r\n\t[\"ip\", \"192.168.1.200/32\"],\r\n\t[\"number\", \"3306\"],\r\n\t[\"property\", \"virtual_server\"],\r\n\t[\"ip\", \"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\"],\r\n\t[\"number\", \"3306\"],\r\n\t[\"property\", \"virtual_server\"],\r\n\t[\"ip\", \"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789/128\"],\r\n\t[\"number\", \"3306\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for ip (IPv4, IPv6, subnet mask)."
  },
  {
    "path": "tests/languages/keepalived/path_feature.test",
    "content": "vrrp_instance VI_1 {\r\n\tnotify_master /etc/keepalived/to_master.sh\r\n    notify_backup C:\\keepalived\\to_backup.bat\r\n    net_namespace /var/run/keepalived\r\n    net_namespace C:\\users\\prism\\keepalived\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"vrrp_instance\"],\r\n\t\" VI_1 \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"notify_master\"],\r\n\t[\"path\", \"/etc/keepalived/to_master.sh\"],\r\n\t[\"property\", \"notify_backup\"],\r\n\t[\"path\", \"C:\\\\keepalived\\\\to_backup.bat\"],\r\n\t[\"property\", \"net_namespace\"],\r\n\t[\"path\", \"/var/run/keepalived\"],\r\n\t[\"property\", \"net_namespace\"],\r\n\t[\"path\", \"C:\\\\users\\\\prism\\\\keepalived\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for path."
  },
  {
    "path": "tests/languages/keepalived/property_feature.test",
    "content": "BFD_CHECK\r\nDNS_CHECK\r\nFILE_CHECK\r\nHTTP_GET\r\nMISC_CHECK\r\nNAME\r\nPING_CHECK\r\nSCRIPTS\r\nSMTP_CHECK\r\nSSL\r\nSSL_GET\r\nTCP_CHECK\r\nUDP_CHECK\r\naccept\r\nadvert_int\r\nalpha\r\nauth_pass\r\nauth_type\r\nauthentication\r\nbfd_cpu_affinity\r\nbfd_instance\r\nbfd_no_swap\r\nbfd_priority\r\nbfd_process_name\r\nbfd_rlimit_rttime\r\nbfd_rt_priority\r\nbind_if\r\nbind_port\r\nbindto\r\nca\r\ncertificate\r\ncheck_unicast_src\r\nchecker\r\nchecker_cpu_affinity\r\nchecker_log_all_failures\r\nchecker_no_swap\r\nchecker_priority\r\nchecker_rlimit_rttime\r\nchecker_rt_priority\r\nchild_wait_time\r\nconnect_ip\r\nconnect_port\r\nconnect_timeout\r\ndbus_service_name\r\ndebug\r\ndefault_interface\r\ndelay\r\ndelay_before_retry\r\ndelay_loop\r\ndigest\r\ndont_track_primary\r\ndynamic\r\ndynamic_interfaces\r\nenable_dbus\r\nenable_script_security\r\nenable_sni\r\nenable_snmp_checker\r\nenable_snmp_rfc\r\nenable_snmp_rfcv2\r\nenable_snmp_rfcv3\r\nenable_snmp_vrrp\r\nenable_traps\r\nend\r\nfall\r\nfast_recovery\r\nfile\r\nflag-1\r\nflag-2\r\nflag-3\r\nfork_delay\r\nfull_command\r\nfwmark\r\ngarp_group\r\ngarp_interval\r\ngarp_lower_prio_delay\r\ngarp_lower_prio_repeat\r\ngarp_master_delay\r\ngarp_master_refresh\r\ngarp_master_refresh_repeat\r\ngarp_master_repeat\r\nglobal_defs\r\nglobal_tracking\r\ngna_interval\r\ngroup\r\nha_suspend\r\nhashed\r\nhelo_name\r\nhigher_prio_send_advert\r\nhoplimit\r\nhttp_protocol\r\nhysteresis\r\nidle_tx\r\ninclude\r\ninhibit_on_failure\r\ninit_fail\r\ninit_file\r\ninstance\r\ninterface\r\ninterfaces\r\ninterval\r\nip_family\r\nipvs_process_name\r\nkeepalived.conf\r\nkernel_rx_buf_size\r\nkey\r\nlinkbeat_interfaces\r\nlinkbeat_use_polling\r\nlog_all_failures\r\nlog_unknown_vrids\r\nlower_prio_no_advert\r\nlthreshold\r\nlvs_flush\r\nlvs_flush_onstop\r\nlvs_method\r\nlvs_netlink_cmd_rcv_bufs\r\nlvs_netlink_cmd_rcv_bufs_force\r\nlvs_netlink_monitor_rcv_bufs\r\nlvs_netlink_monitor_rcv_bufs_force\r\nlvs_notify_fifo\r\nlvs_notify_fifo_script\r\nlvs_sched\r\nlvs_sync_daemon\r\nmax_auto_priority\r\nmax_hops\r\nmcast_src_ip\r\nmh-fallback\r\nmh-port\r\nmin_auto_priority_delay\r\nmin_rx\r\nmin_tx\r\nmisc_dynamic\r\nmisc_path\r\nmisc_timeout\r\nmultiplier\r\nname\r\nnamespace_with_ipsets\r\nnative_ipv6\r\nneighbor_ip\r\nnet_namespace\r\nnet_namespace_ipvs\r\nnftables\r\nnftables_counters\r\nnftables_ifindex\r\nnftables_priority\r\nno_accept\r\nno_checker_emails\r\nno_email_faults\r\nnopreempt\r\nnotification_email\r\nnotification_email_from\r\nnotify\r\nnotify_backup\r\nnotify_deleted\r\nnotify_down\r\nnotify_fault\r\nnotify_fifo\r\nnotify_fifo_script\r\nnotify_master\r\nnotify_master_rx_lower_pri\r\nnotify_priority_changes\r\nnotify_stop\r\nnotify_up\r\nold_unicast_checksum\r\nomega\r\nops\r\nparam_match\r\npassive\r\npassword\r\npath\r\npersistence_engine\r\npersistence_granularity\r\npersistence_timeout\r\npreempt\r\npreempt_delay\r\npriority\r\nprocess\r\nprocess_monitor_rcv_bufs\r\nprocess_monitor_rcv_bufs_force\r\nprocess_name\r\nprocess_names\r\npromote_secondaries\r\nprotocol\r\nproxy_arp\r\nproxy_arp_pvlan\r\nquorum\r\nquorum_down\r\nquorum_max\r\nquorum_up\r\nrandom_seed\r\nreal_server\r\nregex\r\nregex_max_offset\r\nregex_min_offset\r\nregex_no_match\r\nregex_options\r\nregex_stack\r\nreload_time_file\r\nreload_repeat\r\nrequire_reply\r\nretry\r\nrise\r\nrouter_id\r\nrs_init_notifies\r\nscript\r\nscript_user\r\nsh-fallback\r\nsh-port\r\nshutdown_script\r\nshutdown_script_timeout\r\nskip_check_adv_addr\r\nsmtp_alert\r\nsmtp_alert_checker\r\nsmtp_alert_vrrp\r\nsmtp_connect_timeout\r\nsmtp_helo_name\r\nsmtp_server\r\nsnmp_socket\r\nsorry_server\r\nsorry_server_inhibit\r\nsorry_server_lvs_method\r\nsource_ip\r\nstart\r\nstartup_script\r\nstartup_script_timeout\r\nstate\r\nstatic_ipaddress\r\nstatic_routes\r\nstatic_rules\r\nstatus_code\r\nstep\r\nstrict_mode\r\nsync_group_tracking_weight\r\nterminate_delay\r\ntimeout\r\ntrack_bfd\r\ntrack_file\r\ntrack_group\r\ntrack_interface\r\ntrack_process\r\ntrack_script\r\ntrack_src_ip\r\nttl\r\ntype\r\numask\r\nunicast_peer\r\nunicast_src_ip\r\nunicast_ttl\r\nurl\r\nuse_ipvlan\r\nuse_pid_dir\r\nuse_vmac\r\nuser\r\nuthreshold\r\nval1\r\nval2\r\nval3\r\nversion\r\nvirtual_ipaddress\r\nvirtual_ipaddress_excluded\r\nvirtual_router_id\r\nvirtual_routes\r\nvirtual_rules\r\nvirtual_server\r\nvirtual_server_group\r\nvirtualhost\r\nvmac_xmit_base\r\nvrrp\r\nvrrp_check_unicast_src\r\nvrrp_cpu_affinity\r\nvrrp_garp_interval\r\nvrrp_garp_lower_prio_delay\r\nvrrp_garp_lower_prio_repeat\r\nvrrp_garp_master_delay\r\nvrrp_garp_master_refresh\r\nvrrp_garp_master_refresh_repeat\r\nvrrp_garp_master_repeat\r\nvrrp_gna_interval\r\nvrrp_higher_prio_send_advert\r\nvrrp_instance\r\nvrrp_ipsets\r\nvrrp_iptables\r\nvrrp_lower_prio_no_advert\r\nvrrp_mcast_group4\r\nvrrp_mcast_group6\r\nvrrp_min_garp\r\nvrrp_netlink_cmd_rcv_bufs\r\nvrrp_netlink_cmd_rcv_bufs_force\r\nvrrp_netlink_monitor_rcv_bufs\r\nvrrp_netlink_monitor_rcv_bufs_force\r\nvrrp_no_swap\r\nvrrp_notify_fifo\r\nvrrp_notify_fifo_script\r\nvrrp_notify_priority_changes\r\nvrrp_priority\r\nvrrp_process_name\r\nvrrp_rlimit_rttime\r\nvrrp_rt_priority\r\nvrrp_rx_bufs_multiplier\r\nvrrp_rx_bufs_policy\r\nvrrp_script\r\nvrrp_skip_check_adv_addr\r\nvrrp_startup_delay\r\nvrrp_strict\r\nvrrp_sync_group\r\nvrrp_track_process\r\nvrrp_version\r\nwarmup\r\nweight\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n    [\"property\", \"BFD_CHECK\"],\r\n    [\"property\", \"DNS_CHECK\"],\r\n    [\"property\", \"FILE_CHECK\"],\r\n    [\"property\", \"HTTP_GET\"],\r\n    [\"property\", \"MISC_CHECK\"],\r\n    [\"property\", \"NAME\"],\r\n    [\"property\", \"PING_CHECK\"],\r\n    [\"property\", \"SCRIPTS\"],\r\n    [\"property\", \"SMTP_CHECK\"],\r\n    [\"property\", \"SSL\"],\r\n    [\"property\", \"SSL_GET\"],\r\n    [\"property\", \"TCP_CHECK\"],\r\n    [\"property\", \"UDP_CHECK\"],\r\n    [\"property\", \"accept\"],\r\n    [\"property\", \"advert_int\"],\r\n    [\"property\", \"alpha\"],\r\n    [\"property\", \"auth_pass\"],\r\n    [\"property\", \"auth_type\"],\r\n    [\"property\", \"authentication\"],\r\n    [\"property\", \"bfd_cpu_affinity\"],\r\n    [\"property\", \"bfd_instance\"],\r\n    [\"property\", \"bfd_no_swap\"],\r\n    [\"property\", \"bfd_priority\"],\r\n    [\"property\", \"bfd_process_name\"],\r\n    [\"property\", \"bfd_rlimit_rttime\"],\r\n    [\"property\", \"bfd_rt_priority\"],\r\n    [\"property\", \"bind_if\"],\r\n    [\"property\", \"bind_port\"],\r\n    [\"property\", \"bindto\"],\r\n    [\"property\", \"ca\"],\r\n    [\"property\", \"certificate\"],\r\n    [\"property\", \"check_unicast_src\"],\r\n    [\"property\", \"checker\"],\r\n    [\"property\", \"checker_cpu_affinity\"],\r\n    [\"property\", \"checker_log_all_failures\"],\r\n    [\"property\", \"checker_no_swap\"],\r\n    [\"property\", \"checker_priority\"],\r\n    [\"property\", \"checker_rlimit_rttime\"],\r\n    [\"property\", \"checker_rt_priority\"],\r\n    [\"property\", \"child_wait_time\"],\r\n    [\"property\", \"connect_ip\"],\r\n    [\"property\", \"connect_port\"],\r\n    [\"property\", \"connect_timeout\"],\r\n    [\"property\", \"dbus_service_name\"],\r\n    [\"property\", \"debug\"],\r\n    [\"property\", \"default_interface\"],\r\n    [\"property\", \"delay\"],\r\n    [\"property\", \"delay_before_retry\"],\r\n    [\"property\", \"delay_loop\"],\r\n    [\"property\", \"digest\"],\r\n    [\"property\", \"dont_track_primary\"],\r\n    [\"property\", \"dynamic\"],\r\n    [\"property\", \"dynamic_interfaces\"],\r\n    [\"property\", \"enable_dbus\"],\r\n    [\"property\", \"enable_script_security\"],\r\n    [\"property\", \"enable_sni\"],\r\n    [\"property\", \"enable_snmp_checker\"],\r\n    [\"property\", \"enable_snmp_rfc\"],\r\n    [\"property\", \"enable_snmp_rfcv2\"],\r\n    [\"property\", \"enable_snmp_rfcv3\"],\r\n    [\"property\", \"enable_snmp_vrrp\"],\r\n    [\"property\", \"enable_traps\"],\r\n    [\"property\", \"end\"],\r\n    [\"property\", \"fall\"],\r\n    [\"property\", \"fast_recovery\"],\r\n    [\"property\", \"file\"],\r\n    [\"property\", \"flag-1\"],\r\n    [\"property\", \"flag-2\"],\r\n    [\"property\", \"flag-3\"],\r\n    [\"property\", \"fork_delay\"],\r\n    [\"property\", \"full_command\"],\r\n    [\"property\", \"fwmark\"],\r\n    [\"property\", \"garp_group\"],\r\n    [\"property\", \"garp_interval\"],\r\n    [\"property\", \"garp_lower_prio_delay\"],\r\n    [\"property\", \"garp_lower_prio_repeat\"],\r\n    [\"property\", \"garp_master_delay\"],\r\n    [\"property\", \"garp_master_refresh\"],\r\n    [\"property\", \"garp_master_refresh_repeat\"],\r\n    [\"property\", \"garp_master_repeat\"],\r\n    [\"property\", \"global_defs\"],\r\n    [\"property\", \"global_tracking\"],\r\n    [\"property\", \"gna_interval\"],\r\n    [\"property\", \"group\"],\r\n    [\"property\", \"ha_suspend\"],\r\n    [\"property\", \"hashed\"],\r\n    [\"property\", \"helo_name\"],\r\n    [\"property\", \"higher_prio_send_advert\"],\r\n    [\"property\", \"hoplimit\"],\r\n    [\"property\", \"http_protocol\"],\r\n    [\"property\", \"hysteresis\"],\r\n    [\"property\", \"idle_tx\"],\r\n    [\"property\", \"include\"],\r\n    [\"property\", \"inhibit_on_failure\"],\r\n    [\"property\", \"init_fail\"],\r\n    [\"property\", \"init_file\"],\r\n    [\"property\", \"instance\"],\r\n    [\"property\", \"interface\"],\r\n    [\"property\", \"interfaces\"],\r\n    [\"property\", \"interval\"],\r\n    [\"property\", \"ip_family\"],\r\n    [\"property\", \"ipvs_process_name\"],\r\n    [\"property\", \"keepalived.conf\"],\r\n    [\"property\", \"kernel_rx_buf_size\"],\r\n    [\"property\", \"key\"],\r\n    [\"property\", \"linkbeat_interfaces\"],\r\n    [\"property\", \"linkbeat_use_polling\"],\r\n    [\"property\", \"log_all_failures\"],\r\n    [\"property\", \"log_unknown_vrids\"],\r\n    [\"property\", \"lower_prio_no_advert\"],\r\n    [\"property\", \"lthreshold\"],\r\n    [\"property\", \"lvs_flush\"],\r\n    [\"property\", \"lvs_flush_onstop\"],\r\n    [\"property\", \"lvs_method\"],\r\n    [\"property\", \"lvs_netlink_cmd_rcv_bufs\"],\r\n    [\"property\", \"lvs_netlink_cmd_rcv_bufs_force\"],\r\n    [\"property\", \"lvs_netlink_monitor_rcv_bufs\"],\r\n    [\"property\", \"lvs_netlink_monitor_rcv_bufs_force\"],\r\n    [\"property\", \"lvs_notify_fifo\"],\r\n    [\"property\", \"lvs_notify_fifo_script\"],\r\n    [\"property\", \"lvs_sched\"],\r\n    [\"property\", \"lvs_sync_daemon\"],\r\n    [\"property\", \"max_auto_priority\"],\r\n    [\"property\", \"max_hops\"],\r\n    [\"property\", \"mcast_src_ip\"],\r\n    [\"property\", \"mh-fallback\"],\r\n    [\"property\", \"mh-port\"],\r\n    [\"property\", \"min_auto_priority_delay\"],\r\n    [\"property\", \"min_rx\"],\r\n    [\"property\", \"min_tx\"],\r\n    [\"property\", \"misc_dynamic\"],\r\n    [\"property\", \"misc_path\"],\r\n    [\"property\", \"misc_timeout\"],\r\n    [\"property\", \"multiplier\"],\r\n    [\"property\", \"name\"],\r\n    [\"property\", \"namespace_with_ipsets\"],\r\n    [\"property\", \"native_ipv6\"],\r\n    [\"property\", \"neighbor_ip\"],\r\n    [\"property\", \"net_namespace\"],\r\n    [\"property\", \"net_namespace_ipvs\"],\r\n    [\"property\", \"nftables\"],\r\n    [\"property\", \"nftables_counters\"],\r\n    [\"property\", \"nftables_ifindex\"],\r\n    [\"property\", \"nftables_priority\"],\r\n    [\"property\", \"no_accept\"],\r\n    [\"property\", \"no_checker_emails\"],\r\n    [\"property\", \"no_email_faults\"],\r\n    [\"property\", \"nopreempt\"],\r\n    [\"property\", \"notification_email\"],\r\n    [\"property\", \"notification_email_from\"],\r\n    [\"property\", \"notify\"],\r\n    [\"property\", \"notify_backup\"],\r\n    [\"property\", \"notify_deleted\"],\r\n    [\"property\", \"notify_down\"],\r\n    [\"property\", \"notify_fault\"],\r\n    [\"property\", \"notify_fifo\"],\r\n    [\"property\", \"notify_fifo_script\"],\r\n    [\"property\", \"notify_master\"],\r\n    [\"property\", \"notify_master_rx_lower_pri\"],\r\n    [\"property\", \"notify_priority_changes\"],\r\n    [\"property\", \"notify_stop\"],\r\n    [\"property\", \"notify_up\"],\r\n    [\"property\", \"old_unicast_checksum\"],\r\n    [\"property\", \"omega\"],\r\n    [\"property\", \"ops\"],\r\n    [\"property\", \"param_match\"],\r\n    [\"property\", \"passive\"],\r\n    [\"property\", \"password\"],\r\n    [\"property\", \"path\"],\r\n    [\"property\", \"persistence_engine\"],\r\n    [\"property\", \"persistence_granularity\"],\r\n    [\"property\", \"persistence_timeout\"],\r\n    [\"property\", \"preempt\"],\r\n    [\"property\", \"preempt_delay\"],\r\n    [\"property\", \"priority\"],\r\n    [\"property\", \"process\"],\r\n    [\"property\", \"process_monitor_rcv_bufs\"],\r\n    [\"property\", \"process_monitor_rcv_bufs_force\"],\r\n    [\"property\", \"process_name\"],\r\n    [\"property\", \"process_names\"],\r\n    [\"property\", \"promote_secondaries\"],\r\n    [\"property\", \"protocol\"],\r\n    [\"property\", \"proxy_arp\"],\r\n    [\"property\", \"proxy_arp_pvlan\"],\r\n    [\"property\", \"quorum\"],\r\n    [\"property\", \"quorum_down\"],\r\n    [\"property\", \"quorum_max\"],\r\n    [\"property\", \"quorum_up\"],\r\n    [\"property\", \"random_seed\"],\r\n    [\"property\", \"real_server\"],\r\n    [\"property\", \"regex\"],\r\n    [\"property\", \"regex_max_offset\"],\r\n    [\"property\", \"regex_min_offset\"],\r\n    [\"property\", \"regex_no_match\"],\r\n    [\"property\", \"regex_options\"],\r\n    [\"property\", \"regex_stack\"],\r\n    [\"property\", \"reload_time_file\"],\r\n    [\"property\", \"reload_repeat\"],\r\n    [\"property\", \"require_reply\"],\r\n    [\"property\", \"retry\"],\r\n    [\"property\", \"rise\"],\r\n    [\"property\", \"router_id\"],\r\n    [\"property\", \"rs_init_notifies\"],\r\n    [\"property\", \"script\"],\r\n    [\"property\", \"script_user\"],\r\n    [\"property\", \"sh-fallback\"],\r\n    [\"property\", \"sh-port\"],\r\n    [\"property\", \"shutdown_script\"],\r\n    [\"property\", \"shutdown_script_timeout\"],\r\n    [\"property\", \"skip_check_adv_addr\"],\r\n    [\"property\", \"smtp_alert\"],\r\n    [\"property\", \"smtp_alert_checker\"],\r\n    [\"property\", \"smtp_alert_vrrp\"],\r\n    [\"property\", \"smtp_connect_timeout\"],\r\n    [\"property\", \"smtp_helo_name\"],\r\n    [\"property\", \"smtp_server\"],\r\n    [\"property\", \"snmp_socket\"],\r\n    [\"property\", \"sorry_server\"],\r\n    [\"property\", \"sorry_server_inhibit\"],\r\n    [\"property\", \"sorry_server_lvs_method\"],\r\n    [\"property\", \"source_ip\"],\r\n    [\"property\", \"start\"],\r\n    [\"property\", \"startup_script\"],\r\n    [\"property\", \"startup_script_timeout\"],\r\n    [\"property\", \"state\"],\r\n    [\"property\", \"static_ipaddress\"],\r\n    [\"property\", \"static_routes\"],\r\n    [\"property\", \"static_rules\"],\r\n    [\"property\", \"status_code\"],\r\n    [\"property\", \"step\"],\r\n    [\"property\", \"strict_mode\"],\r\n    [\"property\", \"sync_group_tracking_weight\"],\r\n    [\"property\", \"terminate_delay\"],\r\n    [\"property\", \"timeout\"],\r\n    [\"property\", \"track_bfd\"],\r\n    [\"property\", \"track_file\"],\r\n    [\"property\", \"track_group\"],\r\n    [\"property\", \"track_interface\"],\r\n    [\"property\", \"track_process\"],\r\n    [\"property\", \"track_script\"],\r\n    [\"property\", \"track_src_ip\"],\r\n    [\"property\", \"ttl\"],\r\n    [\"property\", \"type\"],\r\n    [\"property\", \"umask\"],\r\n    [\"property\", \"unicast_peer\"],\r\n    [\"property\", \"unicast_src_ip\"],\r\n    [\"property\", \"unicast_ttl\"],\r\n    [\"property\", \"url\"],\r\n    [\"property\", \"use_ipvlan\"],\r\n    [\"property\", \"use_pid_dir\"],\r\n    [\"property\", \"use_vmac\"],\r\n    [\"property\", \"user\"],\r\n    [\"property\", \"uthreshold\"],\r\n    [\"property\", \"val1\"],\r\n    [\"property\", \"val2\"],\r\n    [\"property\", \"val3\"],\r\n    [\"property\", \"version\"],\r\n    [\"property\", \"virtual_ipaddress\"],\r\n    [\"property\", \"virtual_ipaddress_excluded\"],\r\n    [\"property\", \"virtual_router_id\"],\r\n    [\"property\", \"virtual_routes\"],\r\n    [\"property\", \"virtual_rules\"],\r\n    [\"property\", \"virtual_server\"],\r\n    [\"property\", \"virtual_server_group\"],\r\n    [\"property\", \"virtualhost\"],\r\n    [\"property\", \"vmac_xmit_base\"],\r\n    [\"property\", \"vrrp\"],\r\n    [\"property\", \"vrrp_check_unicast_src\"],\r\n    [\"property\", \"vrrp_cpu_affinity\"],\r\n    [\"property\", \"vrrp_garp_interval\"],\r\n    [\"property\", \"vrrp_garp_lower_prio_delay\"],\r\n    [\"property\", \"vrrp_garp_lower_prio_repeat\"],\r\n    [\"property\", \"vrrp_garp_master_delay\"],\r\n    [\"property\", \"vrrp_garp_master_refresh\"],\r\n    [\"property\", \"vrrp_garp_master_refresh_repeat\"],\r\n    [\"property\", \"vrrp_garp_master_repeat\"],\r\n    [\"property\", \"vrrp_gna_interval\"],\r\n    [\"property\", \"vrrp_higher_prio_send_advert\"],\r\n    [\"property\", \"vrrp_instance\"],\r\n    [\"property\", \"vrrp_ipsets\"],\r\n    [\"property\", \"vrrp_iptables\"],\r\n    [\"property\", \"vrrp_lower_prio_no_advert\"],\r\n    [\"property\", \"vrrp_mcast_group4\"],\r\n    [\"property\", \"vrrp_mcast_group6\"],\r\n    [\"property\", \"vrrp_min_garp\"],\r\n    [\"property\", \"vrrp_netlink_cmd_rcv_bufs\"],\r\n    [\"property\", \"vrrp_netlink_cmd_rcv_bufs_force\"],\r\n    [\"property\", \"vrrp_netlink_monitor_rcv_bufs\"],\r\n    [\"property\", \"vrrp_netlink_monitor_rcv_bufs_force\"],\r\n    [\"property\", \"vrrp_no_swap\"],\r\n    [\"property\", \"vrrp_notify_fifo\"],\r\n    [\"property\", \"vrrp_notify_fifo_script\"],\r\n    [\"property\", \"vrrp_notify_priority_changes\"],\r\n    [\"property\", \"vrrp_priority\"],\r\n    [\"property\", \"vrrp_process_name\"],\r\n    [\"property\", \"vrrp_rlimit_rttime\"],\r\n    [\"property\", \"vrrp_rt_priority\"],\r\n    [\"property\", \"vrrp_rx_bufs_multiplier\"],\r\n    [\"property\", \"vrrp_rx_bufs_policy\"],\r\n    [\"property\", \"vrrp_script\"],\r\n    [\"property\", \"vrrp_skip_check_adv_addr\"],\r\n    [\"property\", \"vrrp_startup_delay\"],\r\n    [\"property\", \"vrrp_strict\"],\r\n    [\"property\", \"vrrp_sync_group\"],\r\n    [\"property\", \"vrrp_track_process\"],\r\n    [\"property\", \"vrrp_version\"],\r\n    [\"property\", \"warmup\"],\r\n    [\"property\", \"weight\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties.\r\n"
  },
  {
    "path": "tests/languages/keepalived/string_feature.test",
    "content": "global_defs {\r\n\tnotification_email {\r\n\t\texample@163.com\r\n\t}\r\n\tnotification_email_from example@example.com\r\n}\r\n\r\nvrrp_instance VI_1 {\r\n    notify_fault \"/etc/keepalived/to_fault.sh\"\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"global_defs\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"notification_email\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"email\", \"example@163.com\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"property\", \"notification_email_from\"],\r\n\t[\"email\", \"example@example.com\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"property\", \"vrrp_instance\"],\r\n\t\" VI_1 \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"notify_fault\"],\r\n\t[\"string\", \"\\\"/etc/keepalived/to_fault.sh\\\"\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for string, email (alias string)."
  },
  {
    "path": "tests/languages/keepalived/variable_feature.test",
    "content": "$ADDRESS_BASE=10.2.${ADDRESS_BASE_SUB}\r\n$ADDRESS_BASE_SUB=0\r\n${ADDRESS_BASE}.100/32\r\n$ADDRESS_BASE_SUB=10\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$ADDRESS_BASE\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"10.2\"],\r\n\t\".\",\r\n\t[\"variable\", \"${ADDRESS_BASE_SUB}\"],\r\n\t[\"variable\", \"$ADDRESS_BASE_SUB\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"variable\", \"${ADDRESS_BASE}\"],\r\n\t\".100/\",\r\n\t[\"number\", \"32\"],\r\n\t[\"variable\", \"$ADDRESS_BASE_SUB\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"10\"]\r\n]"
  },
  {
    "path": "tests/languages/keyman/comment_feature.test",
    "content": "c Foo\r\n\tc Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"c Foo\"],\r\n\t[\"comment\", \"c Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/keyman/compile-target_feature.test",
    "content": "$keyman:\n$kmfl:\n$weaver:\n$keymanweb:\n$keymanonly:\n\nc Note: return statement is only supported in .kmx in Keyman 13\n$keymanonly: + 'a' > 'a' return\n\n----------------------------------------------------\n\n[\n\t[\"compile-target\", \"$keyman:\"],\n\t[\"compile-target\", \"$kmfl:\"],\n\t[\"compile-target\", \"$weaver:\"],\n\t[\"compile-target\", \"$keymanweb:\"],\n\t[\"compile-target\", \"$keymanonly:\"],\n\n\t[\"comment\", \"c Note: return statement is only supported in .kmx in Keyman 13\"],\n\n\t[\"compile-target\", \"$keymanonly:\"],\n\t[\"operator\", \"+\"],\n\t[\"string\", \"'a'\"],\n\t[\"operator\", \">\"],\n\t[\"string\", \"'a'\"],\n\t[\"rule-keyword\", \"return\"]\n]\n"
  },
  {
    "path": "tests/languages/keyman/header-keyword.test",
    "content": "&baselayout\n&bitmap\n&capsononly\n&capsalwaysoff\n&shiftfreescaps\n&copyright\n&ethnologuecode\n&hotkey\n&includecodes\n&keyboardversion\n&kmw_embedcss\n&kmw_embedjs\n&kmw_helpfile\n&kmw_helptext\n&kmw_rtl\n&language\n&layer\n&layoutfile\n&message\n&mnemoniclayout\n&name\n&oldcharposmatching\n&platform\n&targets\n&version\n&visualkeyboard\n&windowslanguages\n\n----------------------------------------------------\n\n[\n\t[\"header-keyword\", \"&baselayout\"],\n\t[\"header-keyword\", \"&bitmap\"],\n\t[\"header-keyword\", \"&capsononly\"],\n\t[\"header-keyword\", \"&capsalwaysoff\"],\n\t[\"header-keyword\", \"&shiftfreescaps\"],\n\t[\"header-keyword\", \"&copyright\"],\n\t[\"header-keyword\", \"&ethnologuecode\"],\n\t[\"header-keyword\", \"&hotkey\"],\n\t[\"header-keyword\", \"&includecodes\"],\n\t[\"header-keyword\", \"&keyboardversion\"],\n\t[\"header-keyword\", \"&kmw_embedcss\"],\n\t[\"header-keyword\", \"&kmw_embedjs\"],\n\t[\"header-keyword\", \"&kmw_helpfile\"],\n\t[\"header-keyword\", \"&kmw_helptext\"],\n\t[\"header-keyword\", \"&kmw_rtl\"],\n\t[\"header-keyword\", \"&language\"],\n\t[\"header-keyword\", \"&layer\"],\n\t[\"header-keyword\", \"&layoutfile\"],\n\t[\"header-keyword\", \"&message\"],\n\t[\"header-keyword\", \"&mnemoniclayout\"],\n\t[\"header-keyword\", \"&name\"],\n\t[\"header-keyword\", \"&oldcharposmatching\"],\n\t[\"header-keyword\", \"&platform\"],\n\t[\"header-keyword\", \"&targets\"],\n\t[\"header-keyword\", \"&version\"],\n\t[\"header-keyword\", \"&visualkeyboard\"],\n\t[\"header-keyword\", \"&windowslanguages\"]\n]\n"
  },
  {
    "path": "tests/languages/keyman/header-statement.test",
    "content": "bitmap\nbitmaps\ncaps on only\ncaps always off\nshift frees caps\ncopyright\nhotkey\nlanguage\nlayout\nmessage\nname\nversion\n\n----------------------------------------------------\n\n[\n\t[\"header-statement\", \"bitmap\"],\n\t[\"header-statement\", \"bitmaps\"],\n\t[\"header-statement\", \"caps on only\"],\n\t[\"header-statement\", \"caps always off\"],\n\t[\"header-statement\", \"shift frees caps\"],\n\t[\"header-statement\", \"copyright\"],\n\t[\"header-statement\", \"hotkey\"],\n\t[\"header-statement\", \"language\"],\n\t[\"header-statement\", \"layout\"],\n\t[\"header-statement\", \"message\"],\n\t[\"header-statement\", \"name\"],\n\t[\"header-statement\", \"version\"]\n]\n"
  },
  {
    "path": "tests/languages/keyman/number_feature.test",
    "content": "U+0041\r\nd67\r\nd1114111\r\nx20\r\nx10FFFF\r\n4177777\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"U+0041\"],\r\n\t[\"number\", \"d67\"],\r\n\t[\"number\", \"d1114111\"],\r\n\t[\"number\", \"x20\"],\r\n\t[\"number\", \"x10FFFF\"],\r\n\t[\"number\", \"4177777\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for unicode, decimal, hexadecimal and octal character codes."
  },
  {
    "path": "tests/languages/keyman/operator_feature.test",
    "content": "+ > \\\r\n\r\n$vowel_a\r\n'a' .. 'z'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \">\"], [\"operator\", \"\\\\\"],\r\n\r\n\t[\"operator\", \"$\"], \"vowel_a\\r\\n\",\r\n\t[\"string\", \"'a'\"], [\"operator\", \"..\"], [\"string\", \"'z'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/keyman/punctuation_feature.test",
    "content": "( )\n, =\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"], [\"punctuation\", \"=\"]\n]\n"
  },
  {
    "path": "tests/languages/keyman/rule-keyword_feature.test",
    "content": "any\nbaselayout\nbeep\ncall\ncontext\ndeadkey\ndk\nif\nindex\nlayer\nnotany\nnul\nouts\nplatform\nreset\nreturn\nsave\nset\nstore\nuse\n\n----------------------------------------------------\n\n[\n\t[\"rule-keyword\", \"any\"],\n\t[\"rule-keyword\", \"baselayout\"],\n\t[\"rule-keyword\", \"beep\"],\n\t[\"rule-keyword\", \"call\"],\n\t[\"rule-keyword\", \"context\"],\n\t[\"rule-keyword\", \"deadkey\"],\n\t[\"rule-keyword\", \"dk\"],\n\t[\"rule-keyword\", \"if\"],\n\t[\"rule-keyword\", \"index\"],\n\t[\"rule-keyword\", \"layer\"],\n\t[\"rule-keyword\", \"notany\"],\n\t[\"rule-keyword\", \"nul\"],\n\t[\"rule-keyword\", \"outs\"],\n\t[\"rule-keyword\", \"platform\"],\n\t[\"rule-keyword\", \"reset\"],\n\t[\"rule-keyword\", \"return\"],\n\t[\"rule-keyword\", \"save\"],\n\t[\"rule-keyword\", \"set\"],\n\t[\"rule-keyword\", \"store\"],\n\t[\"rule-keyword\", \"use\"]\n]\n\n----------------------------------------------------\n\nChecks for all keywords.\n"
  },
  {
    "path": "tests/languages/keyman/string_feature.test",
    "content": "''\r\n\"\"\r\n'foo'\r\n\"bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"'foo'\"],\r\n\t[\"string\", \"\\\"bar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-quoted and double-quoted strings."
  },
  {
    "path": "tests/languages/keyman/structural-keyword_feature.test",
    "content": "ansi\nbegin\nunicode\ngroup\nusing keys\nmatch\nnomatch\nnewcontext\npostkeystroke\nreadonly\n\n----------------------------------------------------\n\n[\n\t[\"structural-keyword\", \"ansi\"],\n\t[\"structural-keyword\", \"begin\"],\n\t[\"structural-keyword\", \"unicode\"],\n\t[\"structural-keyword\", \"group\"],\n\t[\"structural-keyword\", \"using keys\"],\n\t[\"structural-keyword\", \"match\"],\n\t[\"structural-keyword\", \"nomatch\"],\n\t[\"structural-keyword\", \"newcontext\"],\n\t[\"structural-keyword\", \"postkeystroke\"],\n\t[\"structural-keyword\", \"readonly\"]\n]\n\n----------------------------------------------------\n\nChecks for all structural keywords.\n"
  },
  {
    "path": "tests/languages/keyman/virtual-key_feature.test",
    "content": "['c']\n[\"f\"]\n[K_SEL]\n[K_KANJI?15]\n[T_SCHWA]\n[U_0259]\n[CTRL 'a']\n[SHIFT \"b\"]\n[ALT K_C]\n[LCTRL T_D]\n[RCTRL U_E259]\n[LALT K_F]\n[RALT K_G]\n[CAPS K_H]\n[NCAPS K_I]\n[SHIFT CAPS K_A]\n[SHIFT C01]\n\n----------------------------------------------------\n\n[\n\t[\"virtual-key\", \"['c']\"],\n\t[\"virtual-key\", \"[\\\"f\\\"]\"],\n\t[\"virtual-key\", \"[K_SEL]\"],\n\t[\"virtual-key\", \"[K_KANJI?15]\"],\n\t[\"virtual-key\", \"[T_SCHWA]\"],\n\t[\"virtual-key\", \"[U_0259]\"],\n\t[\"virtual-key\", \"[CTRL 'a']\"],\n\t[\"virtual-key\", \"[SHIFT \\\"b\\\"]\"],\n\t[\"virtual-key\", \"[ALT K_C]\"],\n\t[\"virtual-key\", \"[LCTRL T_D]\"],\n\t[\"virtual-key\", \"[RCTRL U_E259]\"],\n\t[\"virtual-key\", \"[LALT K_F]\"],\n\t[\"virtual-key\", \"[RALT K_G]\"],\n\t[\"virtual-key\", \"[CAPS K_H]\"],\n\t[\"virtual-key\", \"[NCAPS K_I]\"],\n\t[\"virtual-key\", \"[SHIFT CAPS K_A]\"],\n\t[\"virtual-key\", \"[SHIFT C01]\"]\n]\n\n----------------------------------------------------\n\nChecks for keys, with all possible modifiers.\n"
  },
  {
    "path": "tests/languages/kotlin/annotation_feature.test",
    "content": "@Deprecated(SUBSYSTEM_DEPRECATED)\r\n@SetUp\r\n@Suppress\r\n@field:Ann\r\n@file:JvmName\r\n@set:[Inject VisibleForTesting]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"annotation\", \"@Deprecated\"], [\"punctuation\", \"(\"], \"SUBSYSTEM_DEPRECATED\", [\"punctuation\", \")\"],\r\n\t[\"annotation\", \"@SetUp\"],\r\n\t[\"annotation\", \"@Suppress\"],\r\n\t[\"annotation\", \"@field:Ann\"],\r\n\t[\"annotation\", \"@file:JvmName\"],\r\n\t[\"annotation\", \"@set:[Inject VisibleForTesting]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for annotations."
  },
  {
    "path": "tests/languages/kotlin/char_feature.test",
    "content": "'a'\n'\\n'\n'\\uFFFF'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"],\n\t[\"char\", \"'\\\\n'\"],\n\t[\"char\", \"'\\\\uFFFF'\"]\n]\n"
  },
  {
    "path": "tests/languages/kotlin/function_feature.test",
    "content": "foo()\r\nfoo_Bar_42()\r\nlist.filter {}\r\n`function 1`()\r\n` !\"#$%^&()*+,=?@{|}~-_`()\r\nlist.`take 1` {}\r\n`make fun`()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"foo_Bar_42\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t\"\\r\\nlist\", [\"punctuation\", \".\"],\r\n\t[\"function\", \"filter\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"`function 1`\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"` !\\\"#$%^&()*+,=?@{|}~-_`\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t\"\\r\\nlist\", [\"punctuation\", \".\"],\r\n\t[\"function\", \"`take 1`\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"`make fun`\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/kotlin/keyword_feature.test",
    "content": "abstract\r\nactual\r\nannotation\r\nas\r\nbreak\r\nby\r\ncatch\r\nclass\r\ncompanion\r\nconst\r\nconstructor\r\ncontinue\r\ncrossinline\r\ndata\r\ndo\r\ndynamic\r\nelse\r\nenum\r\nexpect\r\nexternal\r\nfinal\r\nfinally\r\nfor\r\nfun\r\nget\r\nif\r\nimport\r\nin\r\ninfix\r\ninit\r\ninline\r\ninner\r\ninterface\r\ninternal\r\nis\r\nlateinit\r\nnoinline\r\nnull\r\nobject\r\nopen\r\noperator\r\nout\r\noverride\r\npackage\r\nprivate\r\nprotected\r\npublic\r\nreified\r\nreturn\r\nsealed\r\nset\r\nsuper\r\nsuspend\r\ntailrec\r\nthis\r\nthrow\r\ntry\r\ntypealias\r\nval\r\nvar\r\nvararg\r\nwhen\r\nwhere\r\nwhile\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"actual\"],\r\n\t[\"keyword\", \"annotation\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"by\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"companion\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"constructor\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"crossinline\"],\r\n\t[\"keyword\", \"data\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"dynamic\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"expect\"],\r\n\t[\"keyword\", \"external\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"fun\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"infix\"],\r\n\t[\"keyword\", \"init\"],\r\n\t[\"keyword\", \"inline\"],\r\n\t[\"keyword\", \"inner\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"keyword\", \"internal\"],\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"lateinit\"],\r\n\t[\"keyword\", \"noinline\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"object\"],\r\n\t[\"keyword\", \"open\"],\r\n\t[\"keyword\", \"operator\"],\r\n\t[\"keyword\", \"out\"],\r\n\t[\"keyword\", \"override\"],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"reified\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"sealed\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"suspend\"],\r\n\t[\"keyword\", \"tailrec\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"typealias\"],\r\n\t[\"keyword\", \"val\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"vararg\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"where\"],\r\n\t[\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/kotlin/label_feature.test",
    "content": "loop@\r\nbreak@loop\r\nreturn@forEach\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"label\", \"loop@\"],\r\n\t[\"keyword\", \"break\"], [\"label\", \"@loop\"],\r\n\t[\"keyword\", \"return\"], [\"label\", \"@forEach\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for labels."
  },
  {
    "path": "tests/languages/kotlin/number_feature.test",
    "content": "123\r\n123L\r\n0x0F\r\n0b00001011\r\n123.5\r\n123.5e10\r\n123.5e-10\r\n123.5e+10\r\n123.5f\r\n123.5F\r\n123_456\r\n123_456L\r\n0X01AB_23CD\r\n0B1001_1101\r\n12E34_56\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"123L\"],\r\n\t[\"number\", \"0x0F\"],\r\n\t[\"number\", \"0b00001011\"],\r\n\t[\"number\", \"123.5\"],\r\n\t[\"number\", \"123.5e10\"],\r\n\t[\"number\", \"123.5e-10\"],\r\n\t[\"number\", \"123.5e+10\"],\r\n\t[\"number\", \"123.5f\"],\r\n\t[\"number\", \"123.5F\"],\r\n\t[\"number\", \"123_456\"],\r\n\t[\"number\", \"123_456L\"],\r\n\t[\"number\", \"0X01AB_23CD\"],\r\n\t[\"number\", \"0B1001_1101\"],\r\n\t[\"number\", \"12E34_56\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/kotlin/operator_feature.test",
    "content": "+ ++ +=\r\n- -- -= ->\r\n= == ===\r\n! !! != !==\r\n/ /= * *=\r\n% %=\r\n< <= > >=\r\n? ?: : ::\r\n.. && ||\r\nand inv or\r\nshl shr ushr xor\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"-=\"], [\"operator\", \"->\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"===\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!!\"], [\"operator\", \"!=\"], [\"operator\", \"!==\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"], [\"operator\", \"*\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \"?:\"], [\"operator\", \":\"], [\"operator\", \"::\"],\r\n\t[\"operator\", \"..\"], [\"operator\", \"&&\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"and\"], [\"operator\", \"inv\"], [\"operator\", \"or\"],\r\n\t[\"operator\", \"shl\"], [\"operator\", \"shr\"], [\"operator\", \"ushr\"], [\"operator\", \"xor\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/kotlin/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"\\\"\\\"\"\n\n\"\"\"\"\"\"\n\"\"\"Foo \"bar\"\" baz\"\"\"\n\"\"\"\n\"Foo\"\nbar\n\"\"\"\n\n// interpolation\n\n\"$foo ${bar} ${'$'} ${foobar()}\"\n\"\"\"\n$foo ${bar}\n${'$'} ${foobar()}\n\"\"\"\n\n----------------------------------------------------\n\n[\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"foo\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\\\\"\\\\\\\"\\\"\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\"\\\"\\\"\\\"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\"\\\"Foo \\\"bar\\\"\\\" baz\\\"\\\"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\"\\\"\\r\\n\\\"Foo\\\"\\r\\nbar\\r\\n\\\"\\\"\\\"\"]\n\t]],\n\n\t[\"comment\", \"// interpolation\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"$\"],\n\t\t\t[\"expression\", [\"foo\"]]\n\t\t]],\n\t\t[\"string\", \" \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"${\"],\n\t\t\t[\"expression\", [\"bar\"]],\n\t\t\t[\"interpolation-punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \" \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"${\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"char\", \"'$'\"]\n\t\t\t]],\n\t\t\t[\"interpolation-punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \" \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"${\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"function\", \"foobar\"],\n\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t[\"punctuation\", \")\"]\n\t\t\t]],\n\t\t\t[\"interpolation-punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\"\\\"\\r\\n\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"$\"],\n\t\t\t[\"expression\", [\"foo\"]]\n\t\t]],\n\t\t[\"string\", \" \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"${\"],\n\t\t\t[\"expression\", [\"bar\"]],\n\t\t\t[\"interpolation-punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"\\r\\n\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"${\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"char\", \"'$'\"]\n\t\t\t]],\n\t\t\t[\"interpolation-punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \" \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"${\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"function\", \"foobar\"],\n\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t[\"punctuation\", \")\"]\n\t\t\t]],\n\t\t\t[\"interpolation-punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"\\r\\n\\\"\\\"\\\"\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for raw strings.\n"
  },
  {
    "path": "tests/languages/kumir/boolean_feature.test",
    "content": "да\nнет\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"да\"],\n\t[\"boolean\", \"нет\"]\n]\n\n----------------------------------------------------\n\nChecks for Booleans.\n"
  },
  {
    "path": "tests/languages/kumir/comment_feature.test",
    "content": " |foo\n|\n| foo bar baz\n|\"\"\n|#\n|''\n|+1\n||\n|алг\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"|foo\"],\n\t[\"comment\", \"|\"],\n\t[\"comment\", \"| foo bar baz\"],\n\t[\"comment\", \"|\\\"\\\"\"],\n\t[\"comment\", \"|#\"],\n\t[\"comment\", \"|''\"],\n\t[\"comment\", \"|+1\"],\n\t[\"comment\", \"||\"],\n\t[\"comment\", \"|алг\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/kumir/keyword_feature.test",
    "content": "арг\nарг  рез\nарг рез\nаргрез\nрез\nкон\nкон  исп\nкон исп\nкон_исп\nкц\nкц при\nкц_при\nпри\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"арг\"],\n\t[\"keyword\", \"арг  рез\"],\n\t[\"keyword\", \"арг рез\"],\n\t[\"keyword\", \"аргрез\"],\n\t[\"keyword\", \"рез\"],\n\t[\"keyword\", \"кон\"],\n\t[\"keyword\", \"кон  исп\"],\n\t[\"keyword\", \"кон исп\"],\n\t[\"keyword\", \"кон_исп\"],\n\t[\"keyword\", \"кц\"],\n\t[\"keyword\", \"кц при\"],\n\t[\"keyword\", \"кц_при\"],\n\t[\"keyword\", \"при\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/kumir/name_feature.test",
    "content": "!\n! 09 @ _ AZ az\n@\n_\nаргумент\n\n----------------------------------------------------\n\n[\n\t[\"name\", \"!\"],\n\t[\"name\", \"! 09 @ _ AZ az\"],\n\t[\"name\", \"@\"],\n\t[\"name\", \"_\"],\n\t[\"name\", \"аргумент\"]\n]\n\n----------------------------------------------------\n\nChecks for names.\n"
  },
  {
    "path": "tests/languages/kumir/number_feature.test",
    "content": "$\n$1BADB002\n$1badb002\n.\n.456\n123\n123.\n123.456\n123.456E7\n123.456e7\n123e+4\n123e-4\n123e4\n\n----------------------------------------------------\n\n[\n\t\"$\\r\\n\",\n\t[\"number\", \"$1BADB002\"],\n\t[\"number\", \"$1badb002\"],\n\t\"\\r\\n.\\r\\n\",\n\t[\"number\", \".456\"],\n\t[\"number\", \"123\"],\n\t[\"number\", \"123.\"],\n\t[\"number\", \"123.456\"],\n\t[\"number\", \"123.456E7\"],\n\t[\"number\", \"123.456e7\"],\n\t[\"number\", \"123e+4\"],\n\t[\"number\", \"123e-4\"],\n\t[\"number\", \"123e4\"]\n]\n\n----------------------------------------------------\n\nChecks for numeric constants.\n"
  },
  {
    "path": "tests/languages/kumir/operator_feature.test",
    "content": "*\n**\n+\n-\n/\n<\n<=\n<>\n=\n>\n>=\nи\nили\nне\n\n----------------------------------------------------\n\n[\n\t[\"operator-char\", \"*\"],\n\t[\"operator-char\", \"**\"],\n\t[\"operator-char\", \"+\"],\n\t[\"operator-char\", \"-\"],\n\t[\"operator-char\", \"/\"],\n\t[\"operator-char\", \"<\"],\n\t[\"operator-char\", \"<=\"],\n\t[\"operator-char\", \"<>\"],\n\t[\"operator-char\", \"=\"],\n\t[\"operator-char\", \">\"],\n\t[\"operator-char\", \">=\"],\n\t[\"operator-word\", \"и\"],\n\t[\"operator-word\", \"или\"],\n\t[\"operator-word\", \"не\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/kumir/prolog_feature.test",
    "content": " #foo\n#\n# foo bar baz\n#\"\"\n##\n#''\n#+1\n#|\n#алг\n\n----------------------------------------------------\n\n[\n\t[\"prolog\", \"#foo\"],\n\t[\"prolog\", \"#\"],\n\t[\"prolog\", \"# foo bar baz\"],\n\t[\"prolog\", \"#\\\"\\\"\"],\n\t[\"prolog\", \"##\"],\n\t[\"prolog\", \"#''\"],\n\t[\"prolog\", \"#+1\"],\n\t[\"prolog\", \"#|\"],\n\t[\"prolog\", \"#алг\"]\n]\n\n----------------------------------------------------\n\nChecks for prologs.\n"
  },
  {
    "path": "tests/languages/kumir/punctuation_feature.test",
    "content": "(\n)\n,\n:\n:=\n;\n[\n]\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \":=\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation marks.\n"
  },
  {
    "path": "tests/languages/kumir/string_feature.test",
    "content": "\"\"\n\"#\"\n\"'\"\n\"256/273\"\n\"foo 'bar' baz\"\n\"|\"\n\"алг\"\n'\"'\n''\n'256/273'\n'foo \"bar\" baz'\n'|'\n'алг'\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"#\\\"\"],\n\t[\"string\", \"\\\"'\\\"\"],\n\t[\"string\", \"\\\"256/273\\\"\"],\n\t[\"string\", \"\\\"foo 'bar' baz\\\"\"],\n\t[\"string\", \"\\\"|\\\"\"],\n\t[\"string\", \"\\\"алг\\\"\"],\n\t[\"string\", \"'\\\"'\"],\n\t[\"string\", \"''\"],\n\t[\"string\", \"'256/273'\"],\n\t[\"string\", \"'foo \\\"bar\\\" baz'\"],\n\t[\"string\", \"'|'\"],\n\t[\"string\", \"'алг'\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/kumir/system-variable_feature.test",
    "content": "знач\n\n----------------------------------------------------\n\n[\n\t[\"system-variable\", \"знач\"]\n]\n"
  },
  {
    "path": "tests/languages/kumir/type_feature.test",
    "content": "вещ\nцел\nцел  таб\nцел таб\nцелтаб\n\nкомпл\nсканкод\nфайл\nцвет\n\n----------------------------------------------------\n\n[\n\t[\"type\", \"вещ\"],\n\t[\"type\", \"цел\"],\n\t[\"type\", \"цел  таб\"],\n\t[\"type\", \"цел таб\"],\n\t[\"type\", \"целтаб\"],\n\n\t[\"type\", \"компл\"],\n\t[\"type\", \"сканкод\"],\n\t[\"type\", \"файл\"],\n\t[\"type\", \"цвет\"]\n]\n\n----------------------------------------------------\n\nChecks for data type names.\n"
  },
  {
    "path": "tests/languages/kusto/boolean_feature.test",
    "content": "true bool(true)\nfalse bool(false)\nbool(null)\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"class-name\", \"bool\"],\n\t[\"punctuation\", \"(\"],\n\t[\"boolean\", \"true\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"boolean\", \"false\"],\n\t[\"class-name\", \"bool\"],\n\t[\"punctuation\", \"(\"],\n\t[\"boolean\", \"false\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"class-name\", \"bool\"],\n\t[\"punctuation\", \"(\"],\n\t[\"boolean\", \"null\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/kusto/class-name_feature.test",
    "content": "bool\ndatetime\ndecimal\ndynamic\nguid\nint\nlong\nreal\nstring\ntimespan\n\n----------------------------------------------------\n\n[\n\t[\"class-name\", \"bool\"],\n\t[\"class-name\", \"datetime\"],\n\t[\"class-name\", \"decimal\"],\n\t[\"class-name\", \"dynamic\"],\n\t[\"class-name\", \"guid\"],\n\t[\"class-name\", \"int\"],\n\t[\"class-name\", \"long\"],\n\t[\"class-name\", \"real\"],\n\t[\"class-name\", \"string\"],\n\t[\"class-name\", \"timespan\"]\n]\n"
  },
  {
    "path": "tests/languages/kusto/command_feature.test",
    "content": ".show tables\n| count\n\n.set foo=234\n\n----------------------------------------------------\n\n[\n\t[\"command\", \".show\"], [\"keyword\", \"tables\"],\n\t[\"operator\", \"|\"], [\"verb\", \"count\"],\n\n\t[\"command\", \".set\"], \" foo\", [\"operator\", \"=\"], [\"number\", \"234\"]\n]\n"
  },
  {
    "path": "tests/languages/kusto/comment_feature.test",
    "content": "// comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// comment\"]\n]\n"
  },
  {
    "path": "tests/languages/kusto/datetime_feature.test",
    "content": "// ISO 8601\n2014-05-25T08:20:03.123456Z\n2014-05-25T08:20:03.123456\n2014-05-25T08:20\n2014-11-08 15:55:55.123456Z\n2014-11-08 15:55:55\n2014-11-08 15:55\n2014-11-08\n\n// RFC 822\nSat, 8 Nov 14 15:05:02 GMT\nSat, 8 Nov 14 15:05:02\nSat, 8 Nov 14 15:05\nSat, 8 Nov 14 15:05 GMT\n8 Nov 14 15:05:02 GMT\n8 Nov 14 15:05:02\n8 Nov 14 15:05\n8 Nov 14 15:05 GMT\n\n// RFC 850\nSaturday, 08-Nov-14 15:05:02 GMT\nSaturday, 08-Nov-14 15:05:02\nSaturday, 08-Nov-14 15:05 GMT\nSaturday, 08-Nov-14 15:05\n08-Nov-14 15:05:02 GMT\n08-Nov-14 15:05:02\n08-Nov-14 15:05 GMT\n08-Nov-14 15:05\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// ISO 8601\"],\n\t[\"datetime\", \"2014-05-25T08:20:03.123456Z\"],\n\t[\"datetime\", \"2014-05-25T08:20:03.123456\"],\n\t[\"datetime\", \"2014-05-25T08:20\"],\n\t[\"datetime\", \"2014-11-08 15:55:55.123456Z\"],\n\t[\"datetime\", \"2014-11-08 15:55:55\"],\n\t[\"datetime\", \"2014-11-08 15:55\"],\n\t[\"datetime\", \"2014-11-08\"],\n\n\t[\"comment\", \"// RFC 822\"],\n\t[\"datetime\", \"Sat, 8 Nov 14 15:05:02 GMT\"],\n\t[\"datetime\", \"Sat, 8 Nov 14 15:05:02\"],\n\t[\"datetime\", \"Sat, 8 Nov 14 15:05\"],\n\t[\"datetime\", \"Sat, 8 Nov 14 15:05 GMT\"],\n\t[\"datetime\", \"8 Nov 14 15:05:02 GMT\"],\n\t[\"datetime\", \"8 Nov 14 15:05:02\"],\n\t[\"datetime\", \"8 Nov 14 15:05\"],\n\t[\"datetime\", \"8 Nov 14 15:05 GMT\"],\n\n\t[\"comment\", \"// RFC 850\"],\n\t[\"datetime\", \"Saturday, 08-Nov-14 15:05:02 GMT\"],\n\t[\"datetime\", \"Saturday, 08-Nov-14 15:05:02\"],\n\t[\"datetime\", \"Saturday, 08-Nov-14 15:05 GMT\"],\n\t[\"datetime\", \"Saturday, 08-Nov-14 15:05\"],\n\t[\"datetime\", \"08-Nov-14 15:05:02 GMT\"],\n\t[\"datetime\", \"08-Nov-14 15:05:02\"],\n\t[\"datetime\", \"08-Nov-14 15:05 GMT\"],\n\t[\"datetime\", \"08-Nov-14 15:05\"]\n]\n"
  },
  {
    "path": "tests/languages/kusto/function_feature.test",
    "content": "min()\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"min\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/kusto/keyword_feature.test",
    "content": "access\nalias\nand\nanti\nas\nasc\nauto\nbetween\nby\ncontains\ncontains_cs\ndatabase\ndeclare\ndesc\nendswith\nendswith_cs\nexternal\nfrom\nfullouter\nhas\nhas_all\nhas_cs\nhasperfix\nhasperfix_cs\nhassuffix\nhassuffix_cs\nin\ningestion\ninline\ninner\ninnerunique\ninto\nleft\nleftanti\nleftantisemi\nleftinner\nleftouter\nleftsemi\nlet\nlike\nlocal\nmatches regex\nnot\nnulls first\nnulls last\nof\non\nor\npattern\nprint\nquery_parameters\nrange\nrestrict\nright\nrightanti\nrightantisemi\nrightinner\nrightouter\nrightsemi\nschema\nset\nstartswith\nstartswith_cs\nstep\ntable\ntables\nto\nview\nwhere\nwith\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"access\"],\n\t[\"keyword\", \"alias\"],\n\t[\"keyword\", \"and\"],\n\t[\"keyword\", \"anti\"],\n\t[\"keyword\", \"as\"],\n\t[\"keyword\", \"asc\"],\n\t[\"keyword\", \"auto\"],\n\t[\"keyword\", \"between\"],\n\t[\"keyword\", \"by\"],\n\t[\"keyword\", \"contains\"],\n\t[\"keyword\", \"contains_cs\"],\n\t[\"keyword\", \"database\"],\n\t[\"keyword\", \"declare\"],\n\t[\"keyword\", \"desc\"],\n\t[\"keyword\", \"endswith\"],\n\t[\"keyword\", \"endswith_cs\"],\n\t[\"keyword\", \"external\"],\n\t[\"keyword\", \"from\"],\n\t[\"keyword\", \"fullouter\"],\n\t[\"keyword\", \"has\"],\n\t[\"keyword\", \"has_all\"],\n\t[\"keyword\", \"has_cs\"],\n\t[\"keyword\", \"hasperfix\"],\n\t[\"keyword\", \"hasperfix_cs\"],\n\t[\"keyword\", \"hassuffix\"],\n\t[\"keyword\", \"hassuffix_cs\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"ingestion\"],\n\t[\"keyword\", \"inline\"],\n\t[\"keyword\", \"inner\"],\n\t[\"keyword\", \"innerunique\"],\n\t[\"keyword\", \"into\"],\n\t[\"keyword\", \"left\"],\n\t[\"keyword\", \"leftanti\"],\n\t[\"keyword\", \"leftantisemi\"],\n\t[\"keyword\", \"leftinner\"],\n\t[\"keyword\", \"leftouter\"],\n\t[\"keyword\", \"leftsemi\"],\n\t[\"keyword\", \"let\"],\n\t[\"keyword\", \"like\"],\n\t[\"keyword\", \"local\"],\n\t[\"keyword\", \"matches regex\"],\n\t[\"keyword\", \"not\"],\n\t[\"keyword\", \"nulls first\"],\n\t[\"keyword\", \"nulls last\"],\n\t[\"keyword\", \"of\"],\n\t[\"keyword\", \"on\"],\n\t[\"keyword\", \"or\"],\n\t[\"keyword\", \"pattern\"],\n\t[\"keyword\", \"print\"],\n\t[\"keyword\", \"query_parameters\"],\n\t[\"keyword\", \"range\"],\n\t[\"keyword\", \"restrict\"],\n\t[\"keyword\", \"right\"],\n\t[\"keyword\", \"rightanti\"],\n\t[\"keyword\", \"rightantisemi\"],\n\t[\"keyword\", \"rightinner\"],\n\t[\"keyword\", \"rightouter\"],\n\t[\"keyword\", \"rightsemi\"],\n\t[\"keyword\", \"schema\"],\n\t[\"keyword\", \"set\"],\n\t[\"keyword\", \"startswith\"],\n\t[\"keyword\", \"startswith_cs\"],\n\t[\"keyword\", \"step\"],\n\t[\"keyword\", \"table\"],\n\t[\"keyword\", \"tables\"],\n\t[\"keyword\", \"to\"],\n\t[\"keyword\", \"view\"],\n\t[\"keyword\", \"where\"],\n\t[\"keyword\", \"with\"]\n]\n"
  },
  {
    "path": "tests/languages/kusto/number_feature.test",
    "content": "0\n123\n123.456\n123.456e-7\n\n0xfF\n\n+inf\n-inf\n\n// time\n12d\n12h\n12m\n12min\n12s\n12sec\n12ms\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"123\"],\n\t[\"number\", \"123.456\"],\n\t[\"number\", \"123.456e-7\"],\n\n\t[\"number\", \"0xfF\"],\n\n\t[\"number\", \"+inf\"],\n\t[\"number\", \"-inf\"],\n\n\t[\"comment\", \"// time\"],\n\t[\"number\", \"12d\"],\n\t[\"number\", \"12h\"],\n\t[\"number\", \"12m\"],\n\t[\"number\", \"12min\"],\n\t[\"number\", \"12s\"],\n\t[\"number\", \"12sec\"],\n\t[\"number\", \"12ms\"]\n]\n"
  },
  {
    "path": "tests/languages/kusto/operator_feature.test",
    "content": "+ - * / %\n== != < <= > >=\n=~ !~\n= !\n\n=>\n..\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\n\t[\"operator\", \"=~\"],\n\t[\"operator\", \"!~\"],\n\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"!\"],\n\n\t[\"operator\", \"=>\"],\n\t[\"operator\", \"..\"]\n]\n"
  },
  {
    "path": "tests/languages/kusto/punctuation_feature.test",
    "content": "( ) [ ] { }\n, ; . :\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"]\n]\n"
  },
  {
    "path": "tests/languages/kusto/string_feature.test",
    "content": "\"\"\n''\n@\"\"\n@''\n\"foo\\\"\"\n'bar\\''\n@\"\\\"\n@'\\'\n\n```\nmultiline\n```\n\n// Obfuscated string literals\nh'hello'\nh@'world'\nh\"hello\"\n\n// string concatenation\n\nprint strlen(\"Hello\"', '@\"world!\"); // Nothing between them\n\nprint strlen(\"Hello\" ', ' @\"world!\"); // Separated by whitespace only\n\nprint strlen(\"Hello\"\n  // Comment\n  ', '@\"world!\"); // Separated by whitespace and a comment\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"''\"],\n\t[\"string\", \"@\\\"\\\"\"],\n\t[\"string\", \"@''\"],\n\t[\"string\", \"\\\"foo\\\\\\\"\\\"\"],\n\t[\"string\", \"'bar\\\\''\"],\n\t[\"string\", \"@\\\"\\\\\\\"\"],\n\t[\"string\", \"@'\\\\'\"],\n\n\t[\"string\", \"```\\r\\nmultiline\\r\\n```\"],\n\n\t[\"comment\", \"// Obfuscated string literals\"],\n\t[\"string\", \"h'hello'\"],\n\t[\"string\", \"h@'world'\"],\n\t[\"string\", \"h\\\"hello\\\"\"],\n\n\t[\"comment\", \"// string concatenation\"],\n\n\t[\"keyword\", \"print\"],\n\t[\"function\", \"strlen\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Hello\\\"\"],\n\t[\"string\", \"', '\"],\n\t[\"string\", \"@\\\"world!\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"comment\", \"// Nothing between them\"],\n\n\t[\"keyword\", \"print\"],\n\t[\"function\", \"strlen\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Hello\\\"\"],\n\t[\"string\", \"', '\"],\n\t[\"string\", \"@\\\"world!\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"comment\", \"// Separated by whitespace only\"],\n\n\t[\"keyword\", \"print\"],\n\t[\"function\", \"strlen\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Hello\\\"\"],\n\n\t[\"comment\", \"// Comment\"],\n\n\t[\"string\", \"', '\"],\n\t[\"string\", \"@\\\"world!\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"comment\", \"// Separated by whitespace and a comment\"]\n]\n"
  },
  {
    "path": "tests/languages/kusto/verb_feature.test",
    "content": "Logs\n| where Timestamp > ago(1d)\n| join\n(\n    Events\n    | where continent == 'Europe'\n) on RequestId\n\n----------------------------------------------------\n\n[\n\t\"Logs\\r\\n\",\n\n\t[\"operator\", \"|\"],\n\t[\"verb\", \"where\"],\n\t\" Timestamp \",\n\t[\"operator\", \">\"],\n\t[\"function\", \"ago\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"1d\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"operator\", \"|\"],\n\t[\"verb\", \"join\"],\n\n\t[\"punctuation\", \"(\"],\n\n\t\"\\r\\n    Events\\r\\n    \",\n\n\t[\"operator\", \"|\"],\n\t[\"verb\", \"where\"],\n\t\" continent \",\n\t[\"operator\", \"==\"],\n\t[\"string\", \"'Europe'\"],\n\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"on\"],\n\t\" RequestId\"\n]\n"
  },
  {
    "path": "tests/languages/latex/cdata_feature.test",
    "content": "\\begin{verbatim*}\r\nFoo bar\r\n\\end{verbatim*}\r\n\r\n\\begin{lstlisting}\r\nFoo bar\r\nbaz\r\n\\end{lstlisting}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"verbatim*\"], [\"punctuation\", \"}\"],\r\n\t[\"cdata\", \"\\r\\nFoo bar\\r\\n\"],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"verbatim*\"], [\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"lstlisting\"], [\"punctuation\", \"}\"],\r\n\t[\"cdata\", \"\\r\\nFoo bar\\r\\nbaz\\r\\n\"],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"lstlisting\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for verbatim environment."
  },
  {
    "path": "tests/languages/latex/comment_feature.test",
    "content": "%\r\n% foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"%\"],\r\n\t[\"comment\", \"% foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/latex/equation_feature.test",
    "content": "$foo$\r\n$a \\dots\r\nb$\r\n$$foo$$\r\n$$a \\dots\r\nb$$\r\n\\(foo\\)\r\n\\(a \\dots\r\nb\\)\r\n\\[foo\\]\r\n\\[a \\dots\r\nb\\]\r\n\r\n\\begin{equation}foo\\end{equation}\r\n\\begin{equation}a \\dots\r\nb\\end{equation}\r\n\\begin{math}foo\\end{math}\r\n\\begin{math}a \\dots\r\nb\\end{math}\r\n\\begin{eqnarray}foo\\end{eqnarray}\r\n\\begin{eqnarray}a \\dots\r\nb\\end{eqnarray}\r\n\\begin{align}foo\\end{align}\r\n\\begin{align*}a \\dots\r\nb\\end{align*}\r\n\\begin{multline}foo\\end{multline}\r\n\\begin{multline}a \\dots\r\nb\\end{multline}\r\n\\begin{gather}foo\\end{gather}\r\n\\begin{gather}a \\dots\r\nb\\end{gather}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"equation\", [\"$foo$\"]],\r\n\t[\"equation\", [\r\n\t\t\"$a \",\r\n\t\t[\"equation-command\", \"\\\\dots\"],\r\n\t\t\"\\r\\nb$\"\r\n\t]],\r\n\t[\"equation\", [\r\n\t\t\"$$foo$$\"\r\n\t]],\r\n\t[\"equation\", [\r\n\t\t\"$$a \",\r\n\t\t[\"equation-command\", \"\\\\dots\"],\r\n\t\t\"\\r\\nb$$\"\r\n\t]],\r\n\t[\"equation\", [\"\\\\(foo\\\\)\"]],\r\n\t[\"equation\", [\r\n\t\t\"\\\\(a \",\r\n\t\t[\"equation-command\", \"\\\\dots\"],\r\n\t\t\"\\r\\nb\\\\)\"\r\n\t]],\r\n\t[\"equation\", [\"\\\\[foo\\\\]\"]],\r\n\t[\"equation\", [\r\n\t\t\"\\\\[a \",\r\n\t\t[\"equation-command\", \"\\\\dots\"],\r\n\t\t\"\\r\\nb\\\\]\"\r\n\t]],\r\n\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"equation\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"foo\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"equation\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"equation\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"a \", [\"equation-command\", \"\\\\dots\"], \"\\r\\nb\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"equation\"], [\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"math\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"foo\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"math\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"math\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"a \", [\"equation-command\", \"\\\\dots\"], \"\\r\\nb\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"math\"], [\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"eqnarray\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"foo\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"eqnarray\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"eqnarray\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"a \", [\"equation-command\", \"\\\\dots\"], \"\\r\\nb\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"eqnarray\"], [\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"align\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"foo\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"align\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"align*\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"a \", [\"equation-command\", \"\\\\dots\"], \"\\r\\nb\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"align*\"], [\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"multline\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"foo\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"multline\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"multline\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"a \", [\"equation-command\", \"\\\\dots\"], \"\\r\\nb\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"multline\"], [\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"gather\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"foo\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"gather\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"gather\"], [\"punctuation\", \"}\"],\r\n\t[\"equation\", [\"a \", [\"equation-command\", \"\\\\dots\"], \"\\r\\nb\"]],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"gather\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for equations.\r\n"
  },
  {
    "path": "tests/languages/latex/headline_feature.test",
    "content": "\\part{Foobar}\r\n\\chapter{Foobar}\r\n\\section{Foobar}\r\n\\subsection{Foobar}\r\n\\frametitle{Foobar}\r\n\\subsubsection{Foobar}\r\n\\paragraph{Foobar}\r\n\\subparagraph{Foobar}\r\n\\subsubparagraph{Foobar}\r\n\\subsubsubparagraph{Foobar}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"\\\\part\"], [\"punctuation\", \"{\"],\r\n\t[\"headline\", \"Foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\chapter\"], [\"punctuation\", \"{\"],\r\n\t[\"headline\", \"Foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\section\"], [\"punctuation\", \"{\"],\r\n\t[\"headline\", \"Foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\subsection\"], [\"punctuation\", \"{\"],\r\n\t[\"headline\", \"Foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\frametitle\"], [\"punctuation\", \"{\"],\r\n\t[\"headline\", \"Foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\subsubsection\"], [\"punctuation\", \"{\"],\r\n\t[\"headline\", \"Foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\paragraph\"], [\"punctuation\", \"{\"],\r\n\t[\"headline\", \"Foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\subparagraph\"], [\"punctuation\", \"{\"],\r\n\t[\"headline\", \"Foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\subsubparagraph\"], [\"punctuation\", \"{\"],\r\n\t[\"headline\", \"Foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\subsubsubparagraph\"], [\"punctuation\", \"{\"],\r\n\t[\"headline\", \"Foobar\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for headlines."
  },
  {
    "path": "tests/languages/latex/keyword_feature.test",
    "content": "\\begin{foobar}\r\n\\end{foobar}\r\n\\ref{foobar}\r\n\\cite{foobar}\r\n\\label{foobar}\r\n\\usepackage{foobar}\r\n\\documentclass[11px,twoside,a4paper]{foobar}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"\\\\begin\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\end\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\ref\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\cite\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\label\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\usepackage\"], [\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"foobar\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"\\\\documentclass\"],\r\n\t[\"punctuation\", \"[\"], \"11px,twoside,a4paper\", [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"foobar\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/latex/url_feature.test",
    "content": "\\url{http://prismjs.com}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"\\\\url\"], [\"punctuation\", \"{\"],\r\n\t[\"url\", \"http://prismjs.com\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for URLs."
  },
  {
    "path": "tests/languages/latte/comment_feature.test",
    "content": "{**}\r\n{* foo *}\r\n{* foo\r\nbar *}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"latte-comment\", \"{**}\"],\r\n\t[\"latte-comment\", \"{* foo *}\"],\r\n\t[\"latte-comment\", \"{* foo\\r\\nbar *}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/latte/delimiter_feature.test",
    "content": "{aa}\r\n{/aa}\r\n{/}\r\n{{aa}}\r\n{10}\r\n{=10}\r\n{test()}\r\n{'no'}\r\n{\"no\"}\r\n{ no }\r\n{multi\r\nline}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"aa\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{/\"],\r\n\t\t[\"latte-tag\", \"aa\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{/\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t\"\\r\\n{\",\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"aa\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"}\\r\\n\",\r\n\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"number\", \"10\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"=\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"number\", \"10\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"function\", [\"test\"]],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t\"\\r\\n{'no'}\\r\\n{\\\"no\\\"}\\r\\n{ no }\\r\\n\",\r\n\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"], [\"latte-tag\", \"multi\"],\r\n\t\t[\"php\", [\"line\"]], [\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for delimiters.\r\n"
  },
  {
    "path": "tests/languages/latte/html_feature.test",
    "content": "<a href=\"{link Post:show $post->id}\">{$post->title}</a>\r\n<a {if $post->id}title=\"ahoj\"{/if}>{$post->title}</a>\r\n\r\n{tag $a = true ? 10 * 5}\r\n<div n:attr=\"$a = true ? 10 * 5\">\r\n{php '' }\r\n{php \"\" }\r\n{php \"ba\\\"r\" }\r\n{php 'ba\\'z' }\r\n{php /* \" */ }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"attr-name\", [\"href\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"latte\", [\r\n\t\t\t\t[\"delimiter\", \"{\"],\r\n\t\t\t\t[\"latte-tag\", \"link\"],\r\n\t\t\t\t[\"php\", [\r\n\t\t\t\t\t\"Post\",\r\n\t\t\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\t\t[\"class-name\", \"show\"],\r\n\t\t\t\t\t[\"variable\", \"$post\"],\r\n\t\t\t\t\t[\"operator\", \"->\"],\r\n\t\t\t\t\t[\"property\", \"id\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"delimiter\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"variable\", \"$post\"],\r\n\t\t\t[\"operator\", \"->\"],\r\n\t\t\t[\"property\", \"title\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"attr-name\", [\r\n\t\t\t[\"latte\", [\r\n\t\t\t\t[\"delimiter\", \"{\"],\r\n\t\t\t\t[\"latte-tag\", \"if\"],\r\n\t\t\t\t[\"php\", [\r\n\t\t\t\t\t[\"variable\", \"$post\"],\r\n\t\t\t\t\t[\"operator\", \"->\"],\r\n\t\t\t\t\t[\"property\", \"id\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"delimiter\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t\"title\"\r\n\t\t]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"ahoj\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\r\n\t\t\t[\"latte\", [\r\n\t\t\t\t[\"delimiter\", \"{/\"],\r\n\t\t\t\t[\"latte-tag\", \"if\"],\r\n\t\t\t\t[\"delimiter\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"variable\", \"$post\"],\r\n\t\t\t[\"operator\", \"->\"],\r\n\t\t\t[\"property\", \"title\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"tag\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"variable\", \"$a\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"constant\", \"true\"],\r\n\t\t\t[\"operator\", \"?\"],\r\n\t\t\t[\"number\", \"10\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t[\"number\", \"5\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"n-attr\", [\r\n\t\t\t[\"attr-name\", \"n:attr\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"php\", [\r\n\t\t\t\t\t[\"variable\", \"$a\"],\r\n\t\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t\t[\"constant\", \"true\"],\r\n\t\t\t\t\t[\"operator\", \"?\"],\r\n\t\t\t\t\t[\"number\", \"10\"],\r\n\t\t\t\t\t[\"operator\", \"*\"],\r\n\t\t\t\t\t[\"number\", \"5\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"php\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"string\", \"''\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"php\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"string\", [\"\\\"\\\"\"]]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"php\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"string\", [\"\\\"ba\\\\\\\"r\\\"\"]]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"php\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"string\", \"'ba\\\\'z'\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"php\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"comment\", \"/* \\\" */\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/latte/n-attr_feature.test",
    "content": "<a n:href=\"Post:show $post->id\">link</a>\r\n<a n:href = \"Post:show $post->id\">link</a>\r\n<div n:if=$items>\r\n<div n:tag-if='$a > $b'>\r\n<script n:nonce>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"n-attr\", [\r\n\t\t\t[\"attr-name\", \"n:href\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"php\", [\r\n\t\t\t\t\t\"Post\",\r\n\t\t\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\t\t[\"class-name\", \"show\"],\r\n\t\t\t\t\t[\"variable\", \"$post\"],\r\n\t\t\t\t\t[\"operator\", \"->\"],\r\n\t\t\t\t\t[\"property\", \"id\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\"link\",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"n-attr\", [\r\n\t\t\t[\"attr-name\", \"n:href\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"php\", [\r\n\t\t\t\t\t\"Post\",\r\n\t\t\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\t\t[\"class-name\", \"show\"],\r\n\t\t\t\t\t[\"variable\", \"$post\"],\r\n\t\t\t\t\t[\"operator\", \"->\"],\r\n\t\t\t\t\t[\"property\", \"id\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\"link\",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"a\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"n-attr\", [\r\n\t\t\t[\"attr-name\", \"n:if\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"php\", [\r\n\t\t\t\t\t[\"variable\", \"$items\"]\r\n\t\t\t\t]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"n-attr\", [\r\n\t\t\t[\"attr-name\", \"n:tag-if\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\t[\"php\", [\r\n\t\t\t\t\t[\"variable\", \"$a\"],\r\n\t\t\t\t\t[\"operator\", \">\"],\r\n\t\t\t\t\t[\"variable\", \"$b\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"'\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"n-attr\", [\r\n\t\t\t[\"attr-name\", \"n:nonce\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/latte/php_feature.test",
    "content": "{tag $a = true ? 10 * 5}\r\n<div n:attr=\"$a = true ? 10 * 5\">\r\n{php '' }\r\n{php \"\" }\r\n{php \"ba\\\"r\" }\r\n{php 'ba\\'z' }\r\n{php /* \" */ }\r\n{php /* } */ }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"tag\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"variable\", \"$a\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"constant\", \"true\"],\r\n\t\t\t[\"operator\", \"?\"],\r\n\t\t\t[\"number\", \"10\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t[\"number\", \"5\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"n-attr\", [\r\n\t\t\t[\"attr-name\", \"n:attr\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"php\", [\r\n\t\t\t\t\t[\"variable\", \"$a\"],\r\n\t\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t\t[\"constant\", \"true\"],\r\n\t\t\t\t\t[\"operator\", \"?\"],\r\n\t\t\t\t\t[\"number\", \"10\"],\r\n\t\t\t\t\t[\"operator\", \"*\"],\r\n\t\t\t\t\t[\"number\", \"5\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"php\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"string\", \"''\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"php\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"string\", [\"\\\"\\\"\"]]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"php\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"string\", [\"\\\"ba\\\\\\\"r\\\"\"]]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"php\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"string\", \"'ba\\\\'z'\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"php\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"comment\", \"/* \\\" */\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"latte\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"latte-tag\", \"php\"],\r\n\t\t[\"php\", [\r\n\t\t\t[\"comment\", \"/* } */\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/less/atrule_feature.test",
    "content": "@media {}\r\n@media screen and (min-width: 320px) {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"atrule\", [\r\n\t\t\"@media\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\r\n\t[\"atrule\", [\r\n\t\t\"@media screen and \",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"min-width\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 320px\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for at-rules."
  },
  {
    "path": "tests/languages/less/comment_feature.test",
    "content": "//\r\n// foobar\r\n/**/\r\n/* foo\r\nbar */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foobar\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments."
  },
  {
    "path": "tests/languages/less/operator_feature.test",
    "content": "+ - * /\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/less/property_feature.test",
    "content": "font-weight:\r\n@{foobar} :\r\nbackground-@{foo}:\r\nbox-shadow+:\r\ntransform+_:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"font-weight\"], [\"punctuation\", \":\"],\r\n\t[\"property\", \"@{foobar}\"], [\"punctuation\", \":\"],\r\n\t[\"property\", \"background-@{foo}\"], [\"punctuation\", \":\"],\r\n\t[\"property\", \"box-shadow+\"], [\"punctuation\", \":\"],\r\n\t[\"property\", \"transform+_\"], [\"punctuation\", \":\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties."
  },
  {
    "path": "tests/languages/less/selector_feature.test",
    "content": ".bordered {}\r\n.@{foo} {}\r\n.foo (@bg: #fff, @color: #000) {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"selector\", [\".bordered\"]],\r\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"selector\", [\".@{foo}\"]],\r\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"selector\", [\r\n\t\t\".foo (\",\r\n\t\t[\"variable\", \"@bg\"],\r\n\t\t\": #fff, \",\r\n\t\t[\"variable\", \"@color\"],\r\n\t\t\": #000)\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for selectors and mixin declarations."
  },
  {
    "path": "tests/languages/less/variable_feature.test",
    "content": "@foo\n@@foo\n\n----------------------------------------------------\n\n[\n\t[\"variable\", \"@foo\"],\n\t[\"variable\", \"@@foo\"]\n]\n"
  },
  {
    "path": "tests/languages/less+haml/less_inclusion.test",
    "content": ":less\r\n\t.foo { .bar; }\r\n\r\n~\r\n\t:less\r\n\t  .foo { .bar; }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-less\", [\r\n\t\t[\"filter-name\", \":less\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"selector\", [\".foo\"]],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"mixin-usage\", \".bar\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"~\"],\r\n\t[\"filter-less\", [\r\n\t\t[\"filter-name\", \":less\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"selector\", [\".foo\"]],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"mixin-usage\", \".bar\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Less filter in Haml. The tilde serves only as a separator.\r\n"
  },
  {
    "path": "tests/languages/less+pug/less_inclusion.test",
    "content": ":less\r\n\t@foo: #123;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-less\", [\r\n\t\t[\"filter-name\", \":less\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"variable\", [\r\n\t\t\t\t\"@foo\",\r\n\t\t\t\t[\"punctuation\", \":\"]\r\n\t\t\t]],\r\n\t\t\t\" #123\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for less filter in pug.\r\n"
  },
  {
    "path": "tests/languages/lilypond/class-name_feature.test",
    "content": "\\new Staff \\hornNotes\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", [\n\t\t[\"punctuation\", \"\\\\\"],\n\t\t\"new\"\n\t]],\n\t[\"class-name\", \"Staff\"],\n\t[\"keyword\", [\n\t\t[\"punctuation\", \"\\\\\"],\n\t\t\"hornNotes\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/lilypond/comment_feature.test",
    "content": "% single line\n\n%{\nmultiple lines\n%}\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"% single line\"],\n\n\t[\"comment\", \"%{\\r\\nmultiple lines\\r\\n%}\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/lilypond/embedded-scheme_feature.test",
    "content": "#(define foo)\n\n#(define-music-function (parser location notes) (ly:music?) #{\n\t% Yes! You can embed LilyPond in Scheme.\n\t\\override Score.Stem.beamlet-max-length-proportion = #'(0.5 . 0.5)\n#})\n\n##t\n\n#\"s t r i n g\"\n\n----------------------------------------------------\n\n[\n\t[\"embedded-scheme\", [\n\t\t[\"punctuation\", \"#\"],\n\t\t[\"scheme\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"keyword\", \"define\"],\n\t\t\t\" foo\",\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\n\t[\"embedded-scheme\", [\n\t\t[\"punctuation\", \"#\"],\n\t\t[\"scheme\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"function\", \"define-music-function\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"function\", \"parser\"],\n\t\t\t\" location notes\",\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"function\", \"ly:music?\"],\n\t\t\t[\"punctuation\", \")\"],\n\t\t\t[\"embedded-lilypond\", [\n\t\t\t\t[\"punctuation\", \"#{\"],\n\t\t\t\t[\"lilypond\", [\n\t\t\t\t\t[\"comment\", \"% Yes! You can embed LilyPond in Scheme.\"],\n\t\t\t\t\t[\"keyword\", [\n\t\t\t\t\t\t[\"punctuation\", \"\\\\\"],\n\t\t\t\t\t\t\"override\"\n\t\t\t\t\t]],\n\t\t\t\t\t\" Score\",\n\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\"Stem\",\n\t\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\t\"beamlet-max-length-proportion \",\n\t\t\t\t\t[\"operator\", \"=\"],\n\t\t\t\t\t[\"embedded-scheme\", [\n\t\t\t\t\t\t[\"punctuation\", \"#\"],\n\t\t\t\t\t\t[\"scheme\", [\n\t\t\t\t\t\t\t[\"punctuation\", \"'\"],\n\t\t\t\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t\t\t\t[\"number\", \"0.5\"],\n\t\t\t\t\t\t\t\" . \",\n\t\t\t\t\t\t\t[\"number\", \"0.5\"],\n\t\t\t\t\t\t\t[\"punctuation\", \")\"]\n\t\t\t\t\t\t]]\n\t\t\t\t\t]]\n\t\t\t\t]],\n\t\t\t\t[\"punctuation\", \"#}\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\n\t[\"embedded-scheme\", [\n\t\t[\"punctuation\", \"#\"],\n\t\t[\"scheme\", [\n\t\t\t[\"boolean\", \"#t\"]\n\t\t]]\n\t]],\n\n\t[\"embedded-scheme\", [\n\t\t[\"punctuation\", \"#\"],\n\t\t[\"scheme\", [\n\t\t\t[\"string\", \"\\\"s t r i n g\\\"\"]\n\t\t]]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for Scheme code embedded in LilyPond.\n"
  },
  {
    "path": "tests/languages/lilypond/keyword_feature.test",
    "content": "\\new \\set\n\\center-column\n5\\mm\nh\\fermata\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", [\n\t\t[\"punctuation\", \"\\\\\"],\n\t\t\"new\"\n\t]],\n\t[\"keyword\", [\n\t\t[\"punctuation\", \"\\\\\"],\n\t\t\"set\"\n\t]],\n\n\t[\"keyword\", [\n\t\t[\"punctuation\", \"\\\\\"],\n\t\t\"center-column\"\n\t]],\n\n\t[\"number\", \"5\"],\n\t[\"keyword\", [\n\t\t[\"punctuation\", \"\\\\\"],\n\t\t\"mm\"\n\t]],\n\n\t\"\\r\\nh\",\n\t[\"keyword\", [\n\t\t[\"punctuation\", \"\\\\\"],\n\t\t\"fermata\"\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/lilypond/number_feature.test",
    "content": "123\n6/8\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"123\"],\n\t[\"number\", \"6/8\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers.\n"
  },
  {
    "path": "tests/languages/lilypond/string_feature.test",
    "content": "\"foo\"\n\"foo\nbar\\\"\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"foo\\r\\nbar\\\\\\\"\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/linker-script/comment_feature.test",
    "content": "/**/\n/*\ncomment\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"/**/\"],\n\t[\"comment\", \"/*\\r\\ncomment\\r\\n*/\"]\n]\n"
  },
  {
    "path": "tests/languages/linker-script/function_feature.test",
    "content": "MAX (SIZEOF (.text0), SIZEOF (.text1))\n\nFOO()\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"MAX\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"SIZEOF\"],\n\t[\"punctuation\", \"(\"],\n\t[\"section\", \".text0\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\t[\"function\", \"SIZEOF\"],\n\t[\"punctuation\", \"(\"],\n\t[\"section\", \".text1\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"function\", \"FOO\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/linker-script/identifier_feature.test",
    "content": "\"SECTION\" = 9;\n\"with a space\" = \"also with a space\" + 10;\n_fourk_1 = 4K;\n\n----------------------------------------------------\n\n[\n\t[\"identifier\", \"\\\"SECTION\\\"\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"9\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"identifier\", \"\\\"with a space\\\"\"],\n\t[\"operator\", \"=\"],\n\t[\"identifier\", \"\\\"also with a space\\\"\"],\n\t[\"operator\", \"+\"],\n\t[\"number\", \"10\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n_fourk_1 \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"4K\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/linker-script/location-counter_feature.test",
    "content": "SECTIONS\n{\n  output :\n  {\n  file1(.text)\n  . = . + 1000;\n  file2(.text)\n  . += 1000;\n  file3(.text)\n  } = 0x1234;\n}\n\n----------------------------------------------------\n\n[\n\t\"SECTIONS\\r\\n\",\n\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n  output \",\n\t[\"operator\", \":\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n  file1\",\n\t[\"punctuation\", \"(\"],\n\t[\"section\", \".text\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"location-counter\", \".\"],\n\t[\"operator\", \"=\"],\n\t[\"location-counter\", \".\"],\n\t[\"operator\", \"+\"],\n\t[\"number\", \"1000\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n  file2\",\n\t[\"punctuation\", \"(\"],\n\t[\"section\", \".text\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"location-counter\", \".\"],\n\t[\"operator\", \"+=\"],\n\t[\"number\", \"1000\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n  file3\",\n\t[\"punctuation\", \"(\"],\n\t[\"section\", \".text\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0x1234\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/linker-script/number_feature.test",
    "content": "0157255\n57001\n0xdead\n0x0123456789abcdefABCDEF\n\n4K\n4096\n0x1000\n\n1M\n0x100000000\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0157255\"],\n\t[\"number\", \"57001\"],\n\t[\"number\", \"0xdead\"],\n\t[\"number\", \"0x0123456789abcdefABCDEF\"],\n\n\t[\"number\", \"4K\"],\n\t[\"number\", \"4096\"],\n\t[\"number\", \"0x1000\"],\n\n\t[\"number\", \"1M\"],\n\t[\"number\", \"0x100000000\"]\n]\n"
  },
  {
    "path": "tests/languages/linker-script/operator_feature.test",
    "content": "+ - * / % -- ++\n>> <<\n~ & | ^\n+= -= *= /= %= >>= <<= &= |= ^=\n! && ||\n-> ::\n? :\n= == != < > <= >=\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"--\"],\n\t[\"operator\", \"++\"],\n\n\t[\"operator\", \">>\"],\n\t[\"operator\", \"<<\"],\n\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"^\"],\n\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"%=\"],\n\t[\"operator\", \">>=\"],\n\t[\"operator\", \"<<=\"],\n\t[\"operator\", \"&=\"],\n\t[\"operator\", \"|=\"],\n\t[\"operator\", \"^=\"],\n\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\n\t[\"operator\", \"->\"],\n\t[\"operator\", \"::\"],\n\n\t[\"operator\", \"?\"],\n\t[\"operator\", \":\"],\n\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">=\"]\n]\n"
  },
  {
    "path": "tests/languages/linker-script/punctuation_feature.test",
    "content": "( ) { }\n; ,\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \",\"]\n]\n"
  },
  {
    "path": "tests/languages/linker-script/section_feature.test",
    "content": ".data\n.DATA\n.text\n\n----------------------------------------------------\n\n[\n\t[\"section\", \".data\"],\n\t[\"section\", \".DATA\"],\n\t[\"section\", \".text\"]\n]\n"
  },
  {
    "path": "tests/languages/liquid/boolean_feature.test",
    "content": "{% if true and false and false or true %}\n\n{% nil %}\n\n----------------------------------------------------\n\n[\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"if\"],\n\t\t[\"boolean\", \"true\"],\n\t\t[\"operator\", \"and\"],\n\t\t[\"boolean\", \"false\"],\n\t\t[\"operator\", \"and\"],\n\t\t[\"boolean\", \"false\"],\n\t\t[\"operator\", \"or\"],\n\t\t[\"boolean\", \"true\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"boolean\", \"nil\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/liquid/comment_feature.test",
    "content": "My name is Wilson Abercrombie{% comment %}, esquire{% endcomment %}.\n\n{% assign verb = \"turned\" %}\n{% comment %}\n{% assign verb = \"converted\" %}\n{% endcomment %}\nAnything you put between {% comment %} and {% endcomment %} tags\nis {{ verb }} into a comment.\n\n----------------------------------------------------\n\n[\n\t\"My name is Wilson Abercrombie\",\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"comment\"],\n\t\t[\"delimiter\", \"%}\"],\n\t\t[\"comment\", \", esquire\"],\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"endcomment\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\t\".\\r\\n\\r\\n\",\n\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"assign\"],\n\t\t\" verb \",\n\t\t[\"operator\", \"=\"],\n\t\t[\"string\", \"\\\"turned\\\"\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"comment\"],\n\t\t[\"delimiter\", \"%}\"],\n\t\t[\"comment\", \"\\r\\n{% assign verb = \\\"converted\\\" %}\\r\\n\"],\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"endcomment\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\n\t\"\\r\\nAnything you put between \",\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"comment\"],\n\t\t[\"delimiter\", \"%}\"],\n\t\t[\"comment\", \" and \"],\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"endcomment\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\t\" tags\\r\\nis \",\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t\" verb \",\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t\" into a comment.\"\n]\n"
  },
  {
    "path": "tests/languages/liquid/empty_feature.test",
    "content": "{% unless pages == empty %}\n  <!-- This will only print if the page with handle \"about\" is not empty -->\n  <h1>{{ pages.frontpage.not_empty_title }}</h1>\n  <div>{{ pages.frontpage.content }}</div>\n{% endunless %}\n\n----------------------------------------------------\n\n[\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"unless\"],\n\t\t\" pages \",\n\t\t[\"operator\", \"==\"],\n\t\t[\"empty\", \"empty\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\n\t[\"comment\", \"<!-- This will only print if the page with handle \\\"about\\\" is not empty -->\"],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"h1\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t\" pages\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"frontpage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"not_empty_title \",\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"h1\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t\" pages\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"frontpage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"content \",\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"endunless\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nTest for the 'empty' keyword / special thing.\n"
  },
  {
    "path": "tests/languages/liquid/function_feature.test",
    "content": "{{ product.tags | first }}\r\n{% if product.tags.first == \"sale\" %}\r\n{{ product.tags | last }}\r\n{% if product.tags.last == \"sale\"%}\r\n\r\n{% assign vegetables = \"broccoli, carrots, lettuce, tomatoes\" | split: \", \" %}\r\n{% assign plants = fruits | concat: vegetables %}\r\n{{ plants | join: \", \" }}\r\n{{ my_array | reverse | join: \", \" }}\r\n{% assign products = collection.products | sort: 'price' %}\r\n{% assign kitchen_products = collection.products | where: \"type\", \"kitchen\" %}\r\n\r\n{{ 'rgb(122, 181, 92)' | color_to_hex }}\r\n{{ '#7ab55c' | color_modify: 'alpha', 0.85 }}\r\n\r\n{% assign bold_italic = settings.body_font | font_modify: 'weight', 'bold' | font_modify: 'style', 'italic' %}\r\n\r\n{{ 'smirking_gnome.gif' | asset_url | img_tag }}\r\n{{ 'shop.js' | asset_url | script_tag }}\r\n{{ article.published_at | time_tag: '%a, %b %d, %Y' }}\r\n\r\n{{ -17 | abs }}\r\n{{ 4 | at_most: 3 }}\r\n{{ product.price | divided_by: 10 }}\r\n{{ product.price | times: 1.15 }}\r\n\r\n{{ product.featured_media | external_video_tag: class: \"youtube_video\" }}\r\n{{ product.featured_media | img_url: 500x500 }}\r\n{{ product.featured_media | media_tag: image_size: \"1024x\" }}\r\n\r\n{{ 'sales' | append: '.jpg' }}\r\n{{ 'capitalize me' | capitalize }}\r\n<img src=\"https://www.gravatar.com/avatar/{{ comment.email | remove: ' ' | strip_newlines | downcase | md5 }}\" />\r\n{% assign my_secret_string = \"ShopifyIsAwesome!\" | hmac_sha256: \"secret_key\" %}\r\n{{ \"hello\" | slice: 1, 3 }}\r\n\r\n{{ 'shop.css' | asset_url }}\r\n{{ 'logo.png' | file_img_url: '1024x768' }}\r\n\r\n{{ article.published_at | date: \"%a, %b %d, %y\" }}\r\n{{ settings.flag | default: true, allow_false: true }}\r\n{{ product.variants.first.weight | weight_with_unit }}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"object\", \"product\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"tags \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"first\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"object\", \"product\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"tags\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"first\"],\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"string\", \"\\\"sale\\\"\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"object\", \"product\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"tags \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"last\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"object\", \"product\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"tags\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"last\"],\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"string\", \"\\\"sale\\\"\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"keyword\", \"assign\"],\r\n\t\t\" vegetables \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"broccoli, carrots, lettuce, tomatoes\\\"\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"split\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\", \\\"\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"keyword\", \"assign\"],\r\n\t\t\" plants \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" fruits \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"concat\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t\" vegetables \",\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" plants \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"join\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\", \\\"\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" my_array \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"reverse\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"join\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\", \\\"\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"keyword\", \"assign\"],\r\n\t\t\" products \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"object\", \"collection\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"products \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"sort\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"'price'\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"keyword\", \"assign\"],\r\n\t\t\" kitchen_products \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"object\", \"collection\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"products \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"where\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"type\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"string\", \"\\\"kitchen\\\"\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", \"'rgb(122, 181, 92)'\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"color_to_hex\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", \"'#7ab55c'\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"color_modify\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"'alpha'\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"number\", \"0.85\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"keyword\", \"assign\"],\r\n\t\t\" bold_italic \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" settings\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"body_font \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"font_modify\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"'weight'\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"string\", \"'bold'\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"font_modify\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"'style'\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"string\", \"'italic'\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", \"'smirking_gnome.gif'\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"asset_url\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"img_tag\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", \"'shop.js'\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"asset_url\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"script_tag\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"object\", \"article\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"published_at \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"time_tag\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"'%a, %b %d, %Y'\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"operator\", \"-\"],\r\n\t\t[\"number\", \"17\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"abs\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"at_most\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"object\", \"product\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"price \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"divided_by\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"number\", \"10\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"object\", \"product\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"price \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"times\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"number\", \"1.15\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"object\", \"product\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"featured_media \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"external_video_tag\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t\" class\",\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"youtube_video\\\"\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"object\", \"product\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"featured_media \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"img_url\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t\" 500x500 \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"object\", \"product\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"featured_media \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"media_tag\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t\" image_size\",\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"1024x\\\"\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", \"'sales'\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"append\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"'.jpg'\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", \"'capitalize me'\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"capitalize\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"img\"]],\r\n\t\t[\"attr-name\", [\"src\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"https://www.gravatar.com/avatar/\",\r\n\t\t\t[\"liquid\", [\r\n\t\t\t\t[\"delimiter\", \"{{\"],\r\n\t\t\t\t[\"keyword\", \"comment\"],\r\n\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\"email \",\r\n\t\t\t\t[\"operator\", \"|\"],\r\n\t\t\t\t[\"function\", \"remove\"],\r\n\t\t\t\t[\"operator\", \":\"],\r\n\t\t\t\t[\"string\", \"' '\"],\r\n\t\t\t\t[\"operator\", \"|\"],\r\n\t\t\t\t[\"function\", \"strip_newlines\"],\r\n\t\t\t\t[\"operator\", \"|\"],\r\n\t\t\t\t[\"function\", \"downcase\"],\r\n\t\t\t\t[\"operator\", \"|\"],\r\n\t\t\t\t[\"function\", \"md5\"],\r\n\t\t\t\t[\"delimiter\", \"}}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"keyword\", \"assign\"],\r\n\t\t\" my_secret_string \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"ShopifyIsAwesome!\\\"\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"hmac_sha256\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"secret_key\\\"\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", \"\\\"hello\\\"\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"slice\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", \"'shop.css'\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"asset_url\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", \"'logo.png'\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"file_img_url\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"'1024x768'\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"object\", \"article\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"published_at \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"object\", \"date\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"string\", \"\\\"%a, %b %d, %y\\\"\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" settings\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"flag \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"default\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" allow_false\",\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"object\", \"product\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"variants\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"first\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"weight \",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"weight_with_unit\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/liquid/keyword_feature.test",
    "content": "{%\r\n\r\nas\r\nassign\r\nbreak\r\ncapture\r\ncase\r\ncomment\r\ncontinue\r\ncycle\r\ndecrement\r\necho\r\nelse\r\nelsif\r\nendcapture\r\nendcase\r\nendcomment\r\nendfor\r\nendform\r\nendif\r\nendpaginate\r\nendraw\r\nendtablerow\r\nendunless\r\nfor\r\nform\r\nif\r\nin\r\ninclude\r\nincrement\r\nlimit\r\nliquid\r\noffset\r\npaginate\r\nrange\r\nraw\r\nrender\r\nreversed\r\ntablerow\r\nunless\r\nwhen\r\nwith\r\n\r\n%}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\r\n\t\t[\"keyword\", \"as\"],\r\n\t\t[\"keyword\", \"assign\"],\r\n\t\t[\"keyword\", \"break\"],\r\n\t\t[\"keyword\", \"capture\"],\r\n\t\t[\"keyword\", \"case\"],\r\n\t\t[\"keyword\", \"comment\"],\r\n\t\t[\"keyword\", \"continue\"],\r\n\t\t[\"keyword\", \"cycle\"],\r\n\t\t[\"keyword\", \"decrement\"],\r\n\t\t[\"keyword\", \"echo\"],\r\n\t\t[\"keyword\", \"else\"],\r\n\t\t[\"keyword\", \"elsif\"],\r\n\t\t[\"keyword\", \"endcapture\"],\r\n\t\t[\"keyword\", \"endcase\"],\r\n\t\t[\"keyword\", \"endcomment\"],\r\n\t\t[\"keyword\", \"endfor\"],\r\n\t\t[\"keyword\", \"endform\"],\r\n\t\t[\"keyword\", \"endif\"],\r\n\t\t[\"keyword\", \"endpaginate\"],\r\n\t\t[\"keyword\", \"endraw\"],\r\n\t\t[\"keyword\", \"endtablerow\"],\r\n\t\t[\"keyword\", \"endunless\"],\r\n\t\t[\"keyword\", \"for\"],\r\n\t\t[\"keyword\", \"form\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"keyword\", \"in\"],\r\n\t\t[\"keyword\", \"include\"],\r\n\t\t[\"keyword\", \"increment\"],\r\n\t\t[\"keyword\", \"limit\"],\r\n\t\t[\"keyword\", \"liquid\"],\r\n\t\t[\"keyword\", \"offset\"],\r\n\t\t[\"keyword\", \"paginate\"],\r\n\t\t[\"keyword\", \"range\"],\r\n\t\t[\"keyword\", \"raw\"],\r\n\t\t[\"keyword\", \"render\"],\r\n\t\t[\"keyword\", \"reversed\"],\r\n\t\t[\"keyword\", \"tablerow\"],\r\n\t\t[\"keyword\", \"unless\"],\r\n\t\t[\"keyword\", \"when\"],\r\n\t\t[\"keyword\", \"with\"],\r\n\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/liquid/markup_feature.test",
    "content": "<a href=\"{{ url }}\">link</a>\n\n<div class=\"foo\"></div>\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"a\"]],\n\t\t[\"attr-name\", [\"href\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t[\"liquid\", [\n\t\t\t\t[\"delimiter\", \"{{\"],\n\t\t\t\t\" url \",\n\t\t\t\t[\"delimiter\", \"}}\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\"link\",\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"a\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"attr-name\", [\"class\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/liquid/number_feature.test",
    "content": "{%\r\n\r\n42\r\n123.456\r\n\r\n%}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"number\", \"123.456\"],\r\n\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/liquid/object_feature.test",
    "content": "{{ address }}\n{{ all_country_option_tags }}\n{{ article }}\n{{ block }}\n{{ blog }}\n{{ cart }}\n{{ checkout }}\n{{ collection }}\n{{ color }}\n{{ country }}\n{{ country_option_tags }}\n{{ currency }}\n{{ current_page }}\n{{ current_tags }}\n{{ customer }}\n{{ customer_address }}\n{{ date }}\n{{ discount_allocation }}\n{{ discount_application }}\n{{ external_video }}\n{{ filter }}\n{{ filter_value }}\n{{ font }}\n{{ forloop }}\n{{ fulfillment }}\n{{ generic_file }}\n{{ gift_card }}\n{{ group }}\n{{ handle }}\n{{ image }}\n{{ line_item }}\n{{ link }}\n{{ linklist }}\n{{ localization }}\n{{ location }}\n{{ measurement }}\n{{ media }}\n{{ metafield }}\n{{ model }}\n{{ model_source }}\n{{ order }}\n{{ page }}\n{{ page_description }}\n{{ page_image }}\n{{ page_title }}\n{{ part }}\n{{ policy }}\n{{ product }}\n{{ product_option }}\n{{ recommendations }}\n{{ request }}\n{{ robots }}\n{{ routes }}\n{{ rule }}\n{{ script }}\n{{ search }}\n{{ selling_plan }}\n{{ selling_plan_allocation }}\n{{ selling_plan_group }}\n{{ shipping_method }}\n{{ shop }}\n{{ shop_locale }}\n{{ sitemap }}\n{{ store_availability }}\n{{ tax_line }}\n{{ template }}\n{{ theme }}\n{{ transaction }}\n{{ unit_price_measurement }}\n{{ user_agent }}\n{{ variant }}\n{{ video }}\n{{ video_source }}\n\n----------------------------------------------------\n\n[\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"address\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"all_country_option_tags\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"article\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"block\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"blog\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"cart\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"checkout\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"collection\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"color\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"country\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"country_option_tags\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"currency\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"current_page\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"current_tags\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"customer\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"customer_address\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"date\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"discount_allocation\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"discount_application\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"external_video\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"filter\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"filter_value\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"font\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"forloop\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"fulfillment\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"generic_file\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"gift_card\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"group\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"handle\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"image\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"line_item\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"link\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"linklist\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"localization\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"location\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"measurement\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"media\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"metafield\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"model\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"model_source\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"order\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"page\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"page_description\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"page_image\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"page_title\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"part\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"policy\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"product\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"product_option\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"recommendations\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"request\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"robots\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"routes\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"rule\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"script\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"search\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"selling_plan\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"selling_plan_allocation\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"selling_plan_group\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"shipping_method\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"shop\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"shop_locale\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"sitemap\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"store_availability\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"tax_line\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"template\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"theme\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"transaction\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"unit_price_measurement\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"user_agent\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"variant\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"video\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"video_source\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nLiquid objects sourced from https://shopify.dev/api/liquid/objects\n"
  },
  {
    "path": "tests/languages/liquid/operator_feature.test",
    "content": "{%\r\n\r\n== != <> < <= > >=\r\n| : ? - =\r\n..\r\n\r\nand or\r\ncontains foo\r\n\r\n%}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"liquid\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"operator\", \"!=\"],\r\n\t\t[\"operator\", \"<>\"],\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"operator\", \"<=\"],\r\n\t\t[\"operator\", \">\"],\r\n\t\t[\"operator\", \">=\"],\r\n\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"operator\", \":\"],\r\n\t\t[\"operator\", \"?\"],\r\n\t\t[\"operator\", \"-\"],\r\n\t\t[\"operator\", \"=\"],\r\n\r\n\t\t[\"range\", \"..\"],\r\n\r\n\t\t[\"operator\", \"and\"], [\"operator\", \"or\"],\r\n\t\t[\"operator\", \"contains\"], \" foo\\r\\n\\r\\n\",\r\n\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/liquid/raw_feature.test",
    "content": "{{ this }}\n{% raw %}\nIn Handlebars, {{ this }} will be HTML-escaped, but {{{ that }}} will not.\n{% endraw %}\n{{ this }}\n\n----------------------------------------------------\n\n[\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t\" this \",\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"raw\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\t\"\\r\\nIn Handlebars, {{ this }} will be HTML-escaped, but {{{ that }}} will not.\\r\\n\",\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"endraw\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t\" this \",\n\t\t[\"delimiter\", \"}}\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/liquid/string_feature.test",
    "content": "{%\n\n'one-half'\n\n\"foo bar\"\n\n%}\n\n----------------------------------------------------\n\n[\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\n\t\t[\"string\", \"'one-half'\"],\n\n\t\t[\"string\", \"\\\"foo bar\\\"\"],\n\n\t\t[\"delimiter\", \"%}\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/liquid/template_feature.test",
    "content": "{{ page.title }}\n\n{% if user %}\n  Hello {{ user.name }}!\n{% endif %}\n\n{{ \"/my/fancy/url\" | append: \".html\" }}\n{{ \"adam!\" | capitalize | prepend: \"Hello \" }}\n\n{% assign my_variable = \"tomato\" -%}\n\n{%- if username and username.size > 10 -%}\n\n----------------------------------------------------\n\n[\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"object\", \"page\"],\n\t\t[\"punctuation\", \".\"],\n\t\t\"title \",\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"if\"],\n\t\t\" user \",\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\n\t\"\\r\\n  Hello \",\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t\" user\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"name \",\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t\"!\\r\\n\",\n\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"endif\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"string\", \"\\\"/my/fancy/url\\\"\"],\n\t\t[\"operator\", \"|\"],\n\t\t[\"function\", \"append\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\".html\\\"\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t[\"string\", \"\\\"adam!\\\"\"],\n\t\t[\"operator\", \"|\"],\n\t\t[\"function\", \"capitalize\"],\n\t\t[\"operator\", \"|\"],\n\t\t[\"function\", \"prepend\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"string\", \"\\\"Hello \\\"\"],\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"keyword\", \"assign\"],\n\t\t\" my_variable \",\n\t\t[\"operator\", \"=\"],\n\t\t[\"string\", \"\\\"tomato\\\"\"],\n\t\t[\"delimiter\", \"-%}\"]\n\t]],\n\n\t[\"liquid\", [\n\t\t[\"delimiter\", \"{%-\"],\n\t\t[\"keyword\", \"if\"],\n\t\t\" username \",\n\t\t[\"operator\", \"and\"],\n\t\t\" username\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"size\"],\n\t\t[\"operator\", \">\"],\n\t\t[\"number\", \"10\"],\n\t\t[\"delimiter\", \"-%}\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/lisp/boolean_feature.test",
    "content": "(t)\r\n(nil)\r\n(foo t)\r\n[t ]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"boolean\", \"t\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"boolean\", \"nil\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"car\", \"foo\"], [\"boolean\", \"t\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"], [\"boolean\", \"t\"], [\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/lisp/car_feature.test",
    "content": "(foo)\r\n(foo bar)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\",\"(\"], [\"car\", \"foo\"], [\"punctuation\",\")\"],\r\n\t[\"punctuation\",\"(\"], [\"car\", \"foo\"], \" bar\", [\"punctuation\",\")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for car."
  },
  {
    "path": "tests/languages/lisp/comment_feature.test",
    "content": ";; h1\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \";; h1\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/lisp/declare_feature.test",
    "content": "(declare)\r\n(declare a)\r\n(declare\r\na)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"declare\", \"declare\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"declare\", \"declare\"], \" a\", [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"declare\", \"declare\"], \"\\r\\na\", [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for declare.\r\n"
  },
  {
    "path": "tests/languages/lisp/defun_feature.test",
    "content": "(defun foo ())\r\n(defun foo (bar))\r\n\r\n(defun foo (bar &body arg1) )\r\n\r\n(defun foo (bar &rest arg1) )\r\n\r\n(defun foo (bar &body arg1 arg2) )\r\n\r\n(defun foo (bar &key arg1) )\r\n(defun foo (bar &key arg1 &allow-other-keys) )\r\n\r\n(defun foo (&optional arg1) )\r\n\r\n(defun defabc ())\r\n\r\n(defun show-members (a b &rest values) (write (list a b values)))\r\n(cl-defun find-thing (thing &rest rest &key need &allow-other-keys)\r\n  (or (apply 'cl-member thing thing-list :allow-other-keys t rest)\r\n      (if need (error \"Thing not found\"))))\r\n\r\n(defun foo (a b &optional (c 3 c-supplied-p))\r\n  (list a b c c-supplied-p))\r\n\r\n(defun foo (&key ((:apple a)) ((:box b) 0) ((:charlie c) 0 c-supplied-p))\r\n  (list a b c c-supplied-p))\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t\t[\"argument\", \"bar\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t\t[\"argument\", \"bar\"],\r\n\t\t\t[\"rest-vars\", [\r\n\t\t\t\t[\"lisp-marker\", \"&body\"],\r\n\t\t\t\t[\"argument\", \"arg1\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t\t[\"argument\", \"bar\"],\r\n\t\t\t[\"rest-vars\", [\r\n\t\t\t\t[\"lisp-marker\", \"&rest\"],\r\n\t\t\t\t[\"argument\", \"arg1\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t\t[\"argument\", \"bar\"],\r\n\t\t\t[\"rest-vars\", [\r\n\t\t\t\t[\"lisp-marker\", \"&body\"],\r\n\t\t\t\t[\"argument\", \"arg1\"],\r\n\t\t\t\t[\"argument\", \"arg2\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t\t[\"argument\", \"bar\"],\r\n\t\t\t[\"keys\", [\r\n\t\t\t\t[\"lisp-marker\", \"&key\"],\r\n\t\t\t\t[\"argument\", \"arg1\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t\t[\"argument\", \"bar\"],\r\n\t\t\t[\"keys\", [\r\n\t\t\t\t[\"lisp-marker\", \"&key\"],\r\n\t\t\t\t[\"argument\", \"arg1\"],\r\n\t\t\t\t[\"lisp-marker\", \"&allow-other-keys\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t\t[\"other-marker-vars\", [\r\n\t\t\t\t[\"lisp-marker\", \"&optional\"],\r\n\t\t\t\t[\"argument\", \"arg1\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"defabc\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"show-members\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t\t[\"argument\", \"a\"],\r\n\t\t\t[\"argument\", \"b\"],\r\n\t\t\t[\"rest-vars\", [\r\n\t\t\t\t[\"lisp-marker\", \"&rest\"],\r\n\t\t\t\t[\"argument\", \"values\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"car\", \"write\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"car\", \"list\"],\r\n\t\" a b values\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"cl-defun\"],\r\n\t\t[\"function\", \"find-thing\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t\t[\"argument\", \"thing\"],\r\n\t\t\t[\"rest-vars\", [\r\n\t\t\t\t[\"lisp-marker\", \"&rest\"],\r\n\t\t\t\t[\"argument\", \"rest\"],\r\n\t\t\t\t[\"lisp-marker\", \"&key\"],\r\n\t\t\t\t[\"argument\", \"need\"],\r\n\t\t\t\t[\"lisp-marker\", \"&allow-other-keys\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"car\", \"apply\"],\r\n\t[\"quoted-symbol\", \"'cl-member\"],\r\n\t\" thing thing-list \",\r\n\t[\"lisp-property\", \":allow-other-keys\"],\r\n\t[\"boolean\", \"t\"],\r\n\t\" rest\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"if\"],\r\n\t\" need \",\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"error\"],\r\n\t[\"string\", [\"\\\"Thing not found\\\"\"]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t\t[\"argument\", \"a\"],\r\n\t\t\t[\"argument\", \"b\"],\r\n\t\t\t[\"other-marker-vars\", [\r\n\t\t\t\t[\"lisp-marker\", \"&optional\"],\r\n\t\t\t\t[\"varform\", [\r\n\t\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t\t[\"car\", \"c\"],\r\n\t\t\t\t\t[\"number\", \"3\"],\r\n\t\t\t\t\t\" c-supplied-p\",\r\n\t\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t\t]]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"car\", \"list\"],\r\n\t\" a b c c-supplied-p\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"defun\", [\r\n\t\t[\"keyword\", \"defun\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"arguments\", [\r\n\t\t\t[\"keys\", [\r\n\t\t\t\t[\"lisp-marker\", \"&key\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"lisp-property\", \":apple\"],\r\n\t\t\t\t[\"argument\", \"a\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"lisp-property\", \":box\"],\r\n\t\t\t\t[\"argument\", \"b\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"number\", \"0\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"lisp-property\", \":charlie\"],\r\n\t\t\t\t[\"argument\", \"c\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"number\", \"0\"],\r\n\t\t\t\t[\"argument\", \"c-supplied-p\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"car\", \"list\"],\r\n\t\" a b c c-supplied-p\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for defun.\r\n"
  },
  {
    "path": "tests/languages/lisp/defvar_feature.test",
    "content": "(defvar foo)\r\n(defvar foo bar)\r\n(defvar     foo)\r\n(defvar)\r\n(defconst foo)\r\n(defcustom foo)\r\n(defgroup foo)\r\n(defvar defabc)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"defvar\", [ [\"keyword\", \"defvar\" ], [\"variable\", \"foo\"] ]], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"defvar\", [ [\"keyword\", \"defvar\" ], [\"variable\", \"foo\"] ]], \" bar\", [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"defvar\", [ [\"keyword\", \"defvar\" ], [\"variable\", \"foo\"] ]], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"car\", \"defvar\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"defvar\", [ [\"keyword\", \"defconst\" ], [\"variable\", \"foo\"] ]], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"defvar\", [ [\"keyword\", \"defcustom\" ], [\"variable\", \"foo\"] ]], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"defvar\", [ [\"keyword\", \"defgroup\" ], [\"variable\", \"foo\"] ]], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"defvar\", [ [\"keyword\", \"defvar\" ], [\"variable\", \"defabc\"] ]], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for defvar.\r\n"
  },
  {
    "path": "tests/languages/lisp/heading_feature.test",
    "content": ";;; h1\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"heading\", \";;; h1\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for headings.\r\n"
  },
  {
    "path": "tests/languages/lisp/interactive_feature.test",
    "content": "(interactive)\r\n(interactive a)\r\n(interactive\r\na)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"interactive\", \"interactive\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"interactive\", \"interactive\"], \" a\", [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"interactive\", \"interactive\"], \"\\r\\na\", [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for declare.\r\n"
  },
  {
    "path": "tests/languages/lisp/keyword_feature.test",
    "content": "(let )\r\nlet\r\n(lexical-let )\r\n(let* )\r\n(letf )\r\n(cl-letf )\r\n(if )\r\n(when )\r\n(while )\r\n(unless )\r\n(cons )\r\n(cl-loop )\r\n(and )\r\n(or )\r\n(not )\r\n(cond )\r\n(setq )\r\n(error )\r\n(message )\r\n(null )\r\n(require )\r\n(provide )\r\n(use-package )\r\n(for )\r\n(do )\r\n(collect )\r\n(return )\r\n(finally )\r\n(append )\r\n(concat )\r\n(in )\r\n(by )\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"let\"], [\"punctuation\", \")\"],\r\n\t\"\\r\\nlet\\r\\n\",\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"lexical-let\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"let*\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"letf\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"cl-letf\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"if\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"when\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"while\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"unless\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"cons\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"cl-loop\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"and\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"or\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"not\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"cond\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"setq\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"error\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"message\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"null\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"require\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"provide\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"use-package\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"for\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"do\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"collect\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"return\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"finally\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"append\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"concat\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"in\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"by\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keyword variations.\r\n"
  },
  {
    "path": "tests/languages/lisp/lambda-feature.test",
    "content": "(lambda () ())\r\n(lambda () (foo bar))\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\",\"(\"],[\"lambda\",[[\"keyword\",\"lambda\"],[\"punctuation\",\"(\"],[\"arguments\",[]],[\"punctuation\",\")\"]]],[\"punctuation\",\"(\"],[\"punctuation\",\")\"],[\"punctuation\",\")\"],\r\n\t[\"punctuation\",\"(\"],[\"lambda\",[[\"keyword\",\"lambda\"],[\"punctuation\",\"(\"],[\"arguments\",[]],[\"punctuation\",\")\"]]],[\"punctuation\",\"(\"],[\"car\",\"foo\"],\" bar\",[\"punctuation\",\")\"],[\"punctuation\",\")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for lambda."
  },
  {
    "path": "tests/languages/lisp/lisp-property_feature.test",
    "content": "(\r\n:foo\r\n)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"lisp-property\", \":foo\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for lisp properties.\r\n"
  },
  {
    "path": "tests/languages/lisp/number_boolean.test",
    "content": "(1)\r\n(12)\r\n(1.2)\r\n(1.23)\r\n(1.)\r\n(foo 1)\r\n[1 ]\r\n(-1)\r\n(+1)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"number\", \"1\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"number\", \"12\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"number\", \"1.2\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"number\", \"1.23\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"number\", \"1.\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"car\", \"foo\"], [\"number\", \"1\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"], [\"number\", \"1\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"(\"], [\"number\", \"-1\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"number\", \"+1\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/lisp/punctuation_feature.test",
    "content": "()\r\n( )\r\n[]\r\n.\r\n(\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \"(\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for punctuation.\r\n"
  },
  {
    "path": "tests/languages/lisp/quoted-symbol_feature.test",
    "content": "(\r\n#'foo\r\n'foo\r\n)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"quoted-symbol\", \"#'foo\"],\r\n\t[\"quoted-symbol\", \"'foo\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for quoted symbols.\r\n"
  },
  {
    "path": "tests/languages/lisp/splice_feature.test",
    "content": "(\r\n,foo\r\n,@foo\r\n)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"splice\", \",foo\"],\r\n\t[\"splice\", \",@foo\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for splices\r\n"
  },
  {
    "path": "tests/languages/lisp/string_feature.test",
    "content": "(\r\n\"\"\r\n\"foo\r\nbar\"\r\n\"\\\"foo\\\"\"\r\n\"foo\\tbar\"\r\n\"`foo'\"\r\n\"FOO.\"\r\n)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", [ \"\\\"\\\"\" ]],\r\n\t[\"string\", [ \"\\\"foo\\r\\nbar\\\"\" ]],\r\n\t[\"string\", [ \"\\\"\\\\\\\"foo\\\\\\\"\\\"\" ]],\r\n\t[\"string\", [ \"\\\"foo\\\\tbar\\\"\" ]],\r\n\t[\"string\", [ \"\\\"\", [\"symbol\", \"`foo'\"], \"\\\"\" ]],\r\n\t[\"string\", [ \"\\\"\", [\"argument\", \"FOO\"], \".\\\"\" ]],\r\n\t[\"punctuation\", \")\"]\r\n\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all string variations.\r\n"
  },
  {
    "path": "tests/languages/livescript/argument_feature.test",
    "content": "&\r\n&0\r\n&1\r\n&999\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"argument\", \"&\"],\r\n\t[\"argument\", \"&0\"],\r\n\t[\"argument\", \"&1\"],\r\n\t[\"argument\", \"&999\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for arguments."
  },
  {
    "path": "tests/languages/livescript/boolean_feature.test",
    "content": "false\r\nno\r\noff\r\non\r\ntrue\r\nyes\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"false\"],\r\n\t[\"boolean\", \"no\"],\r\n\t[\"boolean\", \"off\"],\r\n\t[\"boolean\", \"on\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"yes\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all boolean aliases."
  },
  {
    "path": "tests/languages/livescript/comment_feature.test",
    "content": "/**/\r\n/* foo\r\nbar */\r\n#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/livescript/identifier_feature.test",
    "content": "foo\r\nfooBar42\r\nfoo-bar42-baz\r\nyes-no\r\nfunction-case\r\ndelete-by\r\na-b2\r\n_-a_\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"identifier\", \"foo\"],\r\n\t[\"identifier\", \"fooBar42\"],\r\n\t[\"identifier\", \"foo-bar42-baz\"],\r\n\t[\"identifier\", \"yes-no\"],\r\n\t[\"identifier\", \"function-case\"],\r\n\t[\"identifier\", \"delete-by\"],\r\n\t[\"identifier\", \"a-b2\"],\r\n\t[\"identifier\", \"_-a_\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for identifiers."
  },
  {
    "path": "tests/languages/livescript/interpolated-string.test",
    "content": "\"\"\"\"\"\"\r\n\"\"\"Foo\\\"\"\"bar\"\"\"\r\n\"\"\"Foo\r\nbar\"\"\"\r\n\"\"\"#foobar #{foo + 42}\"\"\"\r\n\r\n\"\"\r\n\"Foo\\\"bar\"\r\n\"Foo\r\nbar\"\r\n\"#foo #{ if /test/ == 'test' then 3 else 4}\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"interpolated-string\", [[\"string\", \"\\\"\\\"\\\"\\\"\\\"\\\"\"]]],\r\n\t[\"interpolated-string\", [[\"string\", \"\\\"\\\"\\\"Foo\\\\\\\"\\\"\\\"bar\\\"\\\"\\\"\"]]],\r\n\t[\"interpolated-string\", [[\"string\", \"\\\"\\\"\\\"Foo\\r\\nbar\\\"\\\"\\\"\"]]],\r\n\t[\"interpolated-string\", [\r\n\t\t[\"string\", \"\\\"\\\"\\\"\"],\r\n\t\t[\"variable\", \"#foobar\"],\r\n\t\t[\"string\", \" \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"#{\"],\r\n\t\t\t[\"identifier\", \"foo\"],\r\n\t\t\t[\"operator\", \"+\"],\r\n\t\t\t[\"number\", \"42\"],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\\"\\\"\\\"\"]\r\n\t]],\r\n\t[\"interpolated-string\", [[\"string\", \"\\\"\\\"\"]]],\r\n\t[\"interpolated-string\", [[\"string\", \"\\\"Foo\\\\\\\"bar\\\"\"]]],\r\n\t[\"interpolated-string\", [[\"string\", \"\\\"Foo\\r\\nbar\\\"\"]]],\r\n\t[\"interpolated-string\", [\r\n\t\t[\"string\", \"\\\"\"],\r\n\t\t[\"variable\", \"#foo\"],\r\n\t\t[\"string\", \" \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"#{\"],\r\n\t\t\t[\"keyword\", \"if\"],\r\n\t\t\t[\"regex\", \"/test/\"],\r\n\t\t\t[\"operator\", \"==\"],\r\n\t\t\t[\"string\", \"'test'\"],\r\n\t\t\t[\"keyword\", \"then\"],\r\n\t\t\t[\"number\", \"3\"],\r\n\t\t\t[\"keyword\", \"else\"],\r\n\t\t\t[\"number\", \"4\"],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\\"\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for interpolated strings."
  },
  {
    "path": "tests/languages/livescript/keyword-operator_feature.test",
    "content": "delete!\r\nrequire!\r\ntypeof!\r\n\r\nand\r\nby\r\ndelete\r\nexport\r\nfrom\r\nimport\r\nimport all\r\nin\r\ninstanceof\r\nis\r\nisnt\r\nis not\r\nnot\r\nof\r\nor\r\ntil\r\nto\r\ntypeof\r\nwith\r\nxor\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword-operator\", \"delete!\"],\r\n\t[\"keyword-operator\", \"require!\"],\r\n\t[\"keyword-operator\", \"typeof!\"],\r\n\r\n\t[\"keyword-operator\", \"and\"],\r\n\t[\"keyword-operator\", \"by\"],\r\n\t[\"keyword-operator\", \"delete\"],\r\n\t[\"keyword-operator\", \"export\"],\r\n\t[\"keyword-operator\", \"from\"],\r\n\t[\"keyword-operator\", \"import\"],\r\n\t[\"keyword-operator\", \"import all\"],\r\n\t[\"keyword-operator\", \"in\"],\r\n\t[\"keyword-operator\", \"instanceof\"],\r\n\t[\"keyword-operator\", \"is\"],\r\n\t[\"keyword-operator\", \"isnt\"],\r\n\t[\"keyword-operator\", \"is not\"],\r\n\t[\"keyword-operator\", \"not\"],\r\n\t[\"keyword-operator\", \"of\"],\r\n\t[\"keyword-operator\", \"or\"],\r\n\t[\"keyword-operator\", \"til\"],\r\n\t[\"keyword-operator\", \"to\"],\r\n\t[\"keyword-operator\", \"typeof\"],\r\n\t[\"keyword-operator\", \"with\"],\r\n\t[\"keyword-operator\", \"xor\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keyword operators."
  },
  {
    "path": "tests/languages/livescript/keyword_feature.test",
    "content": "break\r\ncase\r\ncatch\r\nclass\r\nconst\r\ncontinue\r\ndefault\r\ndo\r\nelse\r\nextends\r\nfallthrough\r\nfinally\r\nfor\r\nfor ever\r\nfunction\r\nif\r\nimplements\r\nit\r\nlet\r\nloop\r\nnew\r\nnull\r\notherwise\r\nown\r\nreturn\r\nsuper\r\nswitch\r\nthat\r\nthen\r\nthis\r\nthrow\r\ntry\r\nunless\r\nuntil\r\nvar\r\nvoid\r\nwhen\r\nwhile\r\nyield\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"keyword\", \"fallthrough\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"for ever\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"implements\"],\r\n\t[\"keyword\", \"it\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"loop\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"otherwise\"],\r\n\t[\"keyword\", \"own\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"that\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"unless\"],\r\n\t[\"keyword\", \"until\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"yield\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/livescript/number_feature.test",
    "content": "42 42_ 42km 42km_2\r\n4.514 0.47foo_7\r\n4_8_7_4.2_4_7\r\n4~12\r\n16~badFaCE\r\n36~azertyuiop0123456789\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"], [\"number\", \"42_\"], [\"number\", \"42km\"], [\"number\", \"42km_2\"],\r\n\t[\"number\", \"4.514\"], [\"number\", \"0.47foo_7\"],\r\n\t[\"number\", \"4_8_7_4.2_4_7\"],\r\n\t[\"number\", \"4~12\"],\r\n\t[\"number\", \"16~badFaCE\"],\r\n\t[\"number\", \"36~azertyuiop0123456789\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/livescript/operator_feature.test",
    "content": "a . b\r\n.= .~ .. ...\r\n.&. .^. .<<. .>>. .>>>.\r\n:= :: ::=\r\n&&\r\n|| |>\r\n< << <<< <<<<\r\n<- <-- <-! <--!\r\n<~ <~~ <~! <~~!\r\n<| <= <?\r\n> >> >= >?\r\n- -- -> -->\r\n+ ++\r\n@ @@\r\n% %%\r\n* **\r\n! != !~=\r\n!~> !~~>\r\n!-> !-->\r\n~ ~> ~~> ~=\r\n= ==\r\n^ ^^\r\n/ ?\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"identifier\", \"a\"], [\"operator\", \".\"], [\"identifier\", \"b\"],\r\n\t[\"operator\", \".=\"], [\"operator\", \".~\"], [\"operator\", \"..\"], [\"operator\", \"...\"],\r\n\t[\"operator\", \".&.\"], [\"operator\", \".^.\"], [\"operator\", \".<<.\"], [\"operator\", \".>>.\"], [\"operator\", \".>>>.\"],\r\n\t[\"operator\", \":=\"], [\"operator\", \"::\"], [\"operator\", \"::=\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"], [\"operator\", \"|>\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<<<\"], [\"operator\", \"<<<<\"],\r\n\t[\"operator\", \"<-\"], [\"operator\", \"<--\"], [\"operator\", \"<-!\"], [\"operator\", \"<--!\"],\r\n\t[\"operator\", \"<~\"], [\"operator\", \"<~~\"], [\"operator\", \"<~!\"], [\"operator\", \"<~~!\"],\r\n\t[\"operator\", \"<|\"], [\"operator\", \"<=\"], [\"operator\", \"<?\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">=\"], [\"operator\", \">?\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"->\"], [\"operator\", \"-->\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"],\r\n\t[\"operator\", \"@\"], [\"operator\", \"@@\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%%\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"**\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"], [\"operator\", \"!~=\"],\r\n\t[\"operator\", \"!~>\"], [\"operator\", \"!~~>\"],\r\n\t[\"operator\", \"!->\"], [\"operator\", \"!-->\"],\r\n\t[\"operator\", \"~\"], [\"operator\", \"~>\"], [\"operator\", \"~~>\"], [\"operator\", \"~=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^^\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"?\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/livescript/punctuation_feature.test",
    "content": "( ) { } [ ] | ., : ; `\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"|\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"`\"]\n]\n"
  },
  {
    "path": "tests/languages/livescript/regex_feature.test",
    "content": "/foo[bar]/igm\r\n//\r\nfoo |\r\n[bar]*\r\n//igmuy\r\n//\r\nfoo #bar\r\n[baz] # foo bar\r\n//\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"regex\", \"/foo[bar]/igm\"],\r\n\t[\"regex\", [\"//\\r\\nfoo |\\r\\n[bar]*\\r\\n//igmuy\"]],\r\n\t[\"regex\", [\r\n\t\t\"//\\r\\nfoo \",\r\n\t\t[\"comment\", \"#bar\"],\r\n\t\t\"\\r\\n[baz] \",\r\n\t\t[\"comment\", \"# foo bar\"],\r\n\t\t\"\\r\\n//\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for regexps."
  },
  {
    "path": "tests/languages/livescript/string_feature.test",
    "content": "''''''\r\n'''Foo\\'''bar'''\r\n'''Foo\r\nbar'''\r\n\r\n''\r\n'Foo\\'bar'\r\n'Foo\r\nbar'\r\n\r\n<[ foo bar baz ]>\r\n\r\n\\foo \\bar \\\"({[-!@^+baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"''''''\"],\r\n\t[\"string\", \"'''Foo\\\\'''bar'''\"],\r\n\t[\"string\", \"'''Foo\\r\\nbar'''\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'Foo\\\\'bar'\"],\r\n\t[\"string\", \"'Foo\\r\\nbar'\"],\r\n\t[\"string\", \"<[ foo bar baz ]>\"],\r\n\t[\"string\", \"\\\\foo\"],\r\n\t[\"string\", \"\\\\bar\"],\r\n\t[\"string\", \"\\\\\\\"({[-!@^+baz\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/livescript+pug/livescript_inclusion.test",
    "content": ":livescript\n\t\"#foo #{ if /test/ == 'test' then 3 else 4}\"\n\n----------------------------------------------------\n\n[\n\t[\"filter-livescript\", [\n\t\t[\"filter-name\", \":livescript\"],\n\t\t[\"text\", [\n\t\t\t[\"interpolated-string\", [\n\t\t\t\t[\"string\", \"\\\"\"],\n\t\t\t\t[\"variable\", \"#foo\"],\n\t\t\t\t[\"string\", \" \"],\n\t\t\t\t[\"interpolation\", [\n\t\t\t\t\t[\"interpolation-punctuation\", \"#{\"],\n\t\t\t\t\t[\"keyword\", \"if\"],\n\t\t\t\t\t[\"regex\", \"/test/\"],\n\t\t\t\t\t[\"operator\", \"==\"],\n\t\t\t\t\t[\"string\", \"'test'\"],\n\t\t\t\t\t[\"keyword\", \"then\"],\n\t\t\t\t\t[\"number\", \"3\"],\n\t\t\t\t\t[\"keyword\", \"else\"],\n\t\t\t\t\t[\"number\", \"4\"],\n\t\t\t\t\t[\"interpolation-punctuation\", \"}\"]\n\t\t\t\t]],\n\t\t\t\t[\"string\", \"\\\"\"]\n\t\t\t]]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/llvm/attributes.test",
    "content": "; Target-independent attributes:\nattributes #0 = { alwaysinline alignstack=4 }\n\n; Target-dependent attributes:\nattributes #1 = { \"no-sse\" }\n\n; Function @f has attributes: alwaysinline, alignstack=4, and \"no-sse\".\ndefine void @f() #0 #1 { ... }\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"; Target-independent attributes:\"],\n\t[\"keyword\", \"attributes\"],\n\t[\"variable\", \"#0\"],\n\t[\"punctuation\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\t[\"keyword\", \"alwaysinline\"],\n\t[\"keyword\", \"alignstack\"],\n\t[\"punctuation\", \"=\"],\n\t[\"number\", \"4\"],\n\t[\"punctuation\", \"}\"],\n\t[\"comment\", \"; Target-dependent attributes:\"],\n\t[\"keyword\", \"attributes\"],\n\t[\"variable\", \"#1\"],\n\t[\"punctuation\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\t[\"string\", \"\\\"no-sse\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"comment\", \"; Function @f has attributes: alwaysinline, alignstack=4, and \\\"no-sse\\\".\"],\n\t[\"keyword\", \"define\"],\n\t[\"type\", \"void\"],\n\t[\"variable\", \"@f\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"variable\", \"#0\"],\n\t[\"variable\", \"#1\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nTests the attribute \"#id\" syntax.\n"
  },
  {
    "path": "tests/languages/llvm/example-iterative.test",
    "content": "define i32 @add(i32 %a, i32 %b) {\nentry:\n  br label %tailrecurse\n\ntailrecurse:\n  %a.tr = phi i32 [ %a, %entry ], [ %tmp2, %recurse ]\n  %b.tr = phi i32 [ %b, %entry ], [ %tmp3, %recurse ]\n  %tmp1 = icmp eq i32 %a.tr, 0\n  br i1 %tmp1, label %done, label %recurse\n\nrecurse:\n  %tmp2 = sub i32 %a.tr, 1\n  %tmp3 = add i32 %b.tr, 1\n  br label %tailrecurse\n\ndone:\n  ret i32 %b.tr\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"define\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"@add\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%a\"],\n\t[\"punctuation\", \",\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%b\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"label\", \"entry:\"],\n\t[\"keyword\", \"br\"],\n\t[\"type\", \"label\"],\n\t[\"variable\", \"%tailrecurse\"],\n\t[\"label\", \"tailrecurse:\"],\n\t[\"variable\", \"%a.tr\"],\n\t[\"punctuation\", \"=\"],\n\t[\"keyword\", \"phi\"],\n\t[\"type\", \"i32\"],\n\t[\"punctuation\", \"[\"],\n\t[\"variable\", \"%a\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"%entry\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \"[\"],\n\t[\"variable\", \"%tmp2\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"%recurse\"],\n\t[\"punctuation\", \"]\"],\n\t[\"variable\", \"%b.tr\"],\n\t[\"punctuation\", \"=\"],\n\t[\"keyword\", \"phi\"],\n\t[\"type\", \"i32\"],\n\t[\"punctuation\", \"[\"],\n\t[\"variable\", \"%b\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"%entry\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \"[\"],\n\t[\"variable\", \"%tmp3\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"%recurse\"],\n\t[\"punctuation\", \"]\"],\n\t[\"variable\", \"%tmp1\"],\n\t[\"punctuation\", \"=\"],\n\t[\"keyword\", \"icmp\"],\n\t[\"keyword\", \"eq\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%a.tr\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0\"],\n\t[\"keyword\", \"br\"],\n\t[\"type\", \"i1\"],\n\t[\"variable\", \"%tmp1\"],\n\t[\"punctuation\", \",\"],\n\t[\"type\", \"label\"],\n\t[\"variable\", \"%done\"],\n\t[\"punctuation\", \",\"],\n\t[\"type\", \"label\"],\n\t[\"variable\", \"%recurse\"],\n\t[\"label\", \"recurse:\"],\n\t[\"variable\", \"%tmp2\"],\n\t[\"punctuation\", \"=\"],\n\t[\"keyword\", \"sub\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%a.tr\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"1\"],\n\t[\"variable\", \"%tmp3\"],\n\t[\"punctuation\", \"=\"],\n\t[\"keyword\", \"add\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%b.tr\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"1\"],\n\t[\"keyword\", \"br\"],\n\t[\"type\", \"label\"],\n\t[\"variable\", \"%tailrecurse\"],\n\t[\"label\", \"done:\"],\n\t[\"keyword\", \"ret\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%b.tr\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nAn iterative example program.\n"
  },
  {
    "path": "tests/languages/llvm/example-recursive.test",
    "content": "define i32 @add(i32 %a, i32 %b) {\nentry:\n  %tmp1 = icmp eq i32 %a, 0\n  br i1 %tmp1, label %done, label %recurse\n\nrecurse:\n  %tmp2 = sub i32 %a, 1\n  %tmp3 = add i32 %b, 1\n  %tmp4 = call i32 @add(i32 %tmp2, i32 %tmp3)\n  ret i32 %tmp4\n\ndone:\n  ret i32 %b\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"define\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"@add\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%a\"],\n\t[\"punctuation\", \",\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%b\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"label\", \"entry:\"],\n\t[\"variable\", \"%tmp1\"],\n\t[\"punctuation\", \"=\"],\n\t[\"keyword\", \"icmp\"],\n\t[\"keyword\", \"eq\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%a\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0\"],\n\t[\"keyword\", \"br\"],\n\t[\"type\", \"i1\"],\n\t[\"variable\", \"%tmp1\"],\n\t[\"punctuation\", \",\"],\n\t[\"type\", \"label\"],\n\t[\"variable\", \"%done\"],\n\t[\"punctuation\", \",\"],\n\t[\"type\", \"label\"],\n\t[\"variable\", \"%recurse\"],\n\t[\"label\", \"recurse:\"],\n\t[\"variable\", \"%tmp2\"],\n\t[\"punctuation\", \"=\"],\n\t[\"keyword\", \"sub\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%a\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"1\"],\n\t[\"variable\", \"%tmp3\"],\n\t[\"punctuation\", \"=\"],\n\t[\"keyword\", \"add\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%b\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"1\"],\n\t[\"variable\", \"%tmp4\"],\n\t[\"punctuation\", \"=\"],\n\t[\"keyword\", \"call\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"@add\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%tmp2\"],\n\t[\"punctuation\", \",\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%tmp3\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"ret\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%tmp4\"],\n\t[\"label\", \"done:\"],\n\t[\"keyword\", \"ret\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"%b\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nA recursive example program.\n"
  },
  {
    "path": "tests/languages/llvm/langref-module-example.test",
    "content": "; Declare the string constant as a global constant.\n@.str = private unnamed_addr constant [13 x i8] c\"hello world\\0A\\00\"\n\n; External declaration of the puts function\ndeclare i32 @puts(i8* nocapture) nounwind\n\n; Definition of main function\ndefine i32 @main() {   ; i32()*\n  ; Convert [13 x i8]* to i8*...\n  %cast210 = getelementptr [13 x i8], [13 x i8]* @.str, i64 0, i64 0\n\n  ; Call puts function to write out the string to stdout.\n  call i32 @puts(i8* %cast210)\n  ret i32 0\n}\n\n; Named metadata\n!0 = !{i32 42, null, !\"string\"}\n!foo = !{!0}\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"; Declare the string constant as a global constant.\"],\n\t[\"variable\", \"@.str\"],\n\t[\"punctuation\", \"=\"],\n\t[\"keyword\", \"private\"],\n\t[\"keyword\", \"unnamed_addr\"],\n\t[\"keyword\", \"constant\"],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"13\"],\n\t[\"keyword\", \"x\"],\n\t[\"type\", \"i8\"],\n\t[\"punctuation\", \"]\"],\n\t[\"keyword\", \"c\"],\n\t[\"string\", \"\\\"hello world\\\\0A\\\\00\\\"\"],\n\t[\"comment\", \"; External declaration of the puts function\"],\n\t[\"keyword\", \"declare\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"@puts\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type\", \"i8\"],\n\t[\"punctuation\", \"*\"],\n\t[\"keyword\", \"nocapture\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"nounwind\"],\n\t[\"comment\", \"; Definition of main function\"],\n\t[\"keyword\", \"define\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"@main\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"comment\", \"; i32()*\"],\n\t[\"comment\", \"; Convert [13 x i8]* to i8*...\"],\n\t[\"variable\", \"%cast210\"],\n\t[\"punctuation\", \"=\"],\n\t[\"keyword\", \"getelementptr\"],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"13\"],\n\t[\"keyword\", \"x\"],\n\t[\"type\", \"i8\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"13\"],\n\t[\"keyword\", \"x\"],\n\t[\"type\", \"i8\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"*\"],\n\t[\"variable\", \"@.str\"],\n\t[\"punctuation\", \",\"],\n\t[\"type\", \"i64\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\t[\"type\", \"i64\"],\n\t[\"number\", \"0\"],\n\t[\"comment\", \"; Call puts function to write out the string to stdout.\"],\n\t[\"keyword\", \"call\"],\n\t[\"type\", \"i32\"],\n\t[\"variable\", \"@puts\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type\", \"i8\"],\n\t[\"punctuation\", \"*\"],\n\t[\"variable\", \"%cast210\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"ret\"],\n\t[\"type\", \"i32\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \"}\"],\n\t[\"comment\", \"; Named metadata\"],\n\t[\"variable\", \"!0\"],\n\t[\"punctuation\", \"=\"],\n\t[\"punctuation\", \"!\"],\n\t[\"punctuation\", \"{\"],\n\t[\"type\", \"i32\"],\n\t[\"number\", \"42\"],\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"null\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \"!\"],\n\t[\"string\", \"\\\"string\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"variable\", \"!foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"punctuation\", \"!\"],\n\t[\"punctuation\", \"{\"],\n\t[\"variable\", \"!0\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nTests the example included on the LangRef, at:\nhttps://llvm.org/docs/LangRef.html#module-structure\n"
  },
  {
    "path": "tests/languages/llvm/numbers.test",
    "content": "0\n1\n+1\n-1\n\n+1.0\n2.7e3\n-1.0e+3\n\ndouble 0x432ff973cafa8000\ndouble 4.5e+15  ; equivalent forms as mentioned in the LangRef\n\n0xK0123456789ABCDEFabcd  ; x86_fp80\n0xM0123456789ABCDEF0123456789abcdef  ; ppc_fp128\n0xL0123456789ABCDEF0123456789abcdef  ; fp128\n0xHFACE  ; half\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"1\"],\n\t[\"number\", \"+1\"],\n\t[\"number\", \"-1\"],\n\t[\"number\", \"+1.0\"],\n\t[\"number\", \"2.7e3\"],\n\t[\"number\", \"-1.0e+3\"],\n\t[\"type\", \"double\"],\n\t[\"number\", \"0x432ff973cafa8000\"],\n\t[\"type\", \"double\"],\n\t[\"number\", \"4.5e+15\"],\n\t[\"comment\", \"; equivalent forms as mentioned in the LangRef\"],\n\t[\"number\", \"0xK0123456789ABCDEFabcd\"],\n\t[\"comment\", \"; x86_fp80\"],\n\t[\"number\", \"0xM0123456789ABCDEF0123456789abcdef\"],\n\t[\"comment\", \"; ppc_fp128\"],\n\t[\"number\", \"0xL0123456789ABCDEF0123456789abcdef\"],\n\t[\"comment\", \"; fp128\"],\n\t[\"number\", \"0xHFACE\"],\n\t[\"comment\", \"; half\"]\n]\n\n----------------------------------------------------\n\nNumeric literals.\n"
  },
  {
    "path": "tests/languages/llvm/string.test",
    "content": "\" ; \"\n\"\"\n\"\\00\\FF\"\n\"\\22\\5cI appreciate that LLVM strings only one kind of escaping\"\n\"/some/path\"\nb\"hello\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\" ; \\\"\"],\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"\\\\00\\\\FF\\\"\"],\n\t[\"string\", \"\\\"\\\\22\\\\5cI appreciate that LLVM strings only one kind of escaping\\\"\"],\n\t[\"string\", \"\\\"/some/path\\\"\"],\n\t[\"keyword\", \"b\"],\n\t[\"string\", \"\\\"hello\\\"\"]\n]\n\n----------------------------------------------------\n\nDifferent string literals.\n"
  },
  {
    "path": "tests/languages/log/_discord.test",
    "content": "[2020-12-07][23:26:36][DEBUG][discord_dispatch::application_manager:195] App started. version=\"1.10.5\"\r\n[2020-12-07][23:26:36][DEBUG][discord_dispatch::application_manager:1030] Searching for applications. install_path=AbsolutePath { path_buf: \"C:\\\\Users\\\\micha\\\\AppData\\\\Local\\\\DiscordGames\" }\r\n[2020-12-07][23:26:36][WARN][discord_dispatch::application_manager:1034] Failed to read install path. path=AbsolutePath { path_buf: \"C:\\\\Users\\\\micha\\\\AppData\\\\Local\\\\DiscordGames\" } error=Os { code: 3, kind: NotFound, message: \"Das System kann den angegebenen Pfad nicht finden.\" }\r\n[2020-12-09][17:25:53][DEBUG][discord_dispatch::application_manager:195] App started. version=\"1.10.5\"\r\n[2020-12-09][17:25:53][DEBUG][discord_dispatch::application_manager:1030] Searching for applications. install_path=AbsolutePath { path_buf: \"C:\\\\Users\\\\micha\\\\AppData\\\\Local\\\\DiscordGames\" }\r\n[2020-12-09][17:25:53][WARN][discord_dispatch::application_manager:1034] Failed to read install path. path=AbsolutePath { path_buf: \"C:\\\\Users\\\\micha\\\\AppData\\\\Local\\\\DiscordGames\" } error=Os { code: 3, kind: NotFound, message: \"Das System kann den angegebenen Pfad nicht finden.\" }\r\n[2020-12-10][12:30:59][DEBUG][discord_dispatch::application_manager:195] App started. version=\"1.10.5\"\r\n[2020-12-10][12:30:59][DEBUG][discord_dispatch::application_manager:1030] Searching for applications. install_path=AbsolutePath { path_buf: \"C:\\\\Users\\\\micha\\\\AppData\\\\Local\\\\DiscordGames\" }\r\n[2020-12-10][12:30:59][WARN][discord_dispatch::application_manager:1034] Failed to read install path. path=AbsolutePath { path_buf: \"C:\\\\Users\\\\micha\\\\AppData\\\\Local\\\\DiscordGames\" } error=Os { code: 3, kind: NotFound, message: \"Das System kann den angegebenen Pfad nicht finden.\" }\r\n[2020-12-10][21:42:22][DEBUG][discord_dispatch::application_manager:195] App started. version=\"1.10.5\"\r\n[2020-12-10][21:42:22][DEBUG][discord_dispatch::application_manager:1030] Searching for applications. install_path=AbsolutePath { path_buf: \"C:\\\\Users\\\\micha\\\\AppData\\\\Local\\\\DiscordGames\" }\r\n[2020-12-10][21:42:22][WARN][discord_dispatch::application_manager:1034] Failed to read install path. path=AbsolutePath { path_buf: \"C:\\\\Users\\\\micha\\\\AppData\\\\Local\\\\DiscordGames\" } error=Os { code: 3, kind: NotFound, message: \"Das System kann den angegebenen Pfad nicht finden.\" }\r\n[2020-12-11][13:05:13][DEBUG][discord_dispatch::application_manager:195] App started. version=\"1.10.5\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-07\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"23:26:36\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"DEBUG\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"195\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" App started\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" version\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"1.10.5\\\"\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-07\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"23:26:36\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"DEBUG\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1030\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" Searching for applications\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" install_path\",\r\n\t[\"operator\", \"=\"],\r\n\t\"AbsolutePath \",\r\n\t[\"operator\", \"{\"],\r\n\t\" path_buf\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"C:\\\\\\\\Users\\\\\\\\micha\\\\\\\\AppData\\\\\\\\Local\\\\\\\\DiscordGames\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-07\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"23:26:36\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"WARN\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1034\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" Failed to read install path\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" path\",\r\n\t[\"operator\", \"=\"],\r\n\t\"AbsolutePath \",\r\n\t[\"operator\", \"{\"],\r\n\t\" path_buf\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"C:\\\\\\\\Users\\\\\\\\micha\\\\\\\\AppData\\\\\\\\Local\\\\\\\\DiscordGames\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\t\" error\",\r\n\t[\"operator\", \"=\"],\r\n\t\"Os \",\r\n\t[\"operator\", \"{\"],\r\n\t\" code\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" kind\",\r\n\t[\"operator\", \":\"],\r\n\t\" NotFound\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" message\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"Das System kann den angegebenen Pfad nicht finden.\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-09\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"17:25:53\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"DEBUG\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"195\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" App started\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" version\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"1.10.5\\\"\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-09\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"17:25:53\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"DEBUG\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1030\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" Searching for applications\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" install_path\",\r\n\t[\"operator\", \"=\"],\r\n\t\"AbsolutePath \",\r\n\t[\"operator\", \"{\"],\r\n\t\" path_buf\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"C:\\\\\\\\Users\\\\\\\\micha\\\\\\\\AppData\\\\\\\\Local\\\\\\\\DiscordGames\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-09\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"17:25:53\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"WARN\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1034\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" Failed to read install path\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" path\",\r\n\t[\"operator\", \"=\"],\r\n\t\"AbsolutePath \",\r\n\t[\"operator\", \"{\"],\r\n\t\" path_buf\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"C:\\\\\\\\Users\\\\\\\\micha\\\\\\\\AppData\\\\\\\\Local\\\\\\\\DiscordGames\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\t\" error\",\r\n\t[\"operator\", \"=\"],\r\n\t\"Os \",\r\n\t[\"operator\", \"{\"],\r\n\t\" code\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" kind\",\r\n\t[\"operator\", \":\"],\r\n\t\" NotFound\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" message\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"Das System kann den angegebenen Pfad nicht finden.\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-10\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"12:30:59\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"DEBUG\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"195\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" App started\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" version\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"1.10.5\\\"\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-10\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"12:30:59\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"DEBUG\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1030\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" Searching for applications\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" install_path\",\r\n\t[\"operator\", \"=\"],\r\n\t\"AbsolutePath \",\r\n\t[\"operator\", \"{\"],\r\n\t\" path_buf\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"C:\\\\\\\\Users\\\\\\\\micha\\\\\\\\AppData\\\\\\\\Local\\\\\\\\DiscordGames\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-10\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"12:30:59\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"WARN\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1034\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" Failed to read install path\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" path\",\r\n\t[\"operator\", \"=\"],\r\n\t\"AbsolutePath \",\r\n\t[\"operator\", \"{\"],\r\n\t\" path_buf\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"C:\\\\\\\\Users\\\\\\\\micha\\\\\\\\AppData\\\\\\\\Local\\\\\\\\DiscordGames\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\t\" error\",\r\n\t[\"operator\", \"=\"],\r\n\t\"Os \",\r\n\t[\"operator\", \"{\"],\r\n\t\" code\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" kind\",\r\n\t[\"operator\", \":\"],\r\n\t\" NotFound\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" message\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"Das System kann den angegebenen Pfad nicht finden.\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-10\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"21:42:22\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"DEBUG\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"195\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" App started\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" version\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"1.10.5\\\"\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-10\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"21:42:22\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"DEBUG\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1030\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" Searching for applications\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" install_path\",\r\n\t[\"operator\", \"=\"],\r\n\t\"AbsolutePath \",\r\n\t[\"operator\", \"{\"],\r\n\t\" path_buf\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"C:\\\\\\\\Users\\\\\\\\micha\\\\\\\\AppData\\\\\\\\Local\\\\\\\\DiscordGames\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-10\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"21:42:22\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"WARN\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1034\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" Failed to read install path\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" path\",\r\n\t[\"operator\", \"=\"],\r\n\t\"AbsolutePath \",\r\n\t[\"operator\", \"{\"],\r\n\t\" path_buf\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"C:\\\\\\\\Users\\\\\\\\micha\\\\\\\\AppData\\\\\\\\Local\\\\\\\\DiscordGames\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\t\" error\",\r\n\t[\"operator\", \"=\"],\r\n\t\"Os \",\r\n\t[\"operator\", \"{\"],\r\n\t\" code\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" kind\",\r\n\t[\"operator\", \":\"],\r\n\t\" NotFound\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" message\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"Das System kann den angegebenen Pfad nicht finden.\\\"\"],\r\n\t[\"operator\", \"}\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-12-11\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"13:05:13\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"DEBUG\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"discord_dispatch\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \":\"],\r\n\t\"application_manager\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"195\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" App started\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" version\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"1.10.5\\\"\"]\r\n]"
  },
  {
    "path": "tests/languages/log/_docker.test",
    "content": "2021-01-12T13:38:16Z containerd time=\"2021-01-12T13:38:16.314696100Z\" level=info msg=\"starting containerd\" revision=269548fa27e0089a8b8278fc4fc781d7f65a939b version=v1.4.3\r\n2021-01-12T13:38:16Z containerd time=\"2021-01-12T13:38:16.314743500Z\" level=debug msg=\"changing OOM score to -500\"\r\n2021-01-12T13:38:16Z containerd time=\"2021-01-12T13:38:16.336716900Z\" level=info msg=\"loading plugin \\\"io.containerd.content.v1.content\\\"...\" type=io.containerd.content.v1\r\n2021-01-12T13:38:16Z containerd time=\"2021-01-12T13:38:16.336891100Z\" level=info msg=\"loading plugin \\\"io.containerd.snapshotter.v1.aufs\\\"...\" type=io.containerd.snapshotter.v1\r\n2021-01-12T13:38:16Z containerd time=\"2021-01-12T13:38:16.338482500Z\" level=info msg=\"skip loading plugin \\\"io.containerd.snapshotter.v1.aufs\\\"...\" error=\"aufs is not supported (modprobe aufs failed: exit status 1 \\\"modprobe: can't change directory to '4.19.128-microsoft-standard': No such file or directory\\\\n\\\"): skip plugin\" type=io.containerd.snapshotter.v1\r\n2021-01-12T13:38:16Z containerd time=\"2021-01-12T13:38:16.338523700Z\" level=info msg=\"loading plugin \\\"io.containerd.snapshotter.v1.btrfs\\\"...\" type=io.containerd.snapshotter.v1\r\n2021-01-12T13:38:16Z containerd time=\"2021-01-12T13:38:16.338835400Z\" level=info msg=\"skip loading plugin \\\"io.containerd.snapshotter.v1.btrfs\\\"...\" error=\"path /var/lib/desktop-containerd/daemon/io.containerd.snapshotter.v1.btrfs (ext4) must be a btrfs filesystem to be used with the btrfs snapshotter: skip plugin\" type=io.containerd.snapshotter.v1\r\n\r\n2021-03-05T17:58:29Z kmsg (977696) - 2021-03-05T17:58:28.2836488Z: init: (141) ERROR: StartHostListener:356: write failed 32\r\n2021-03-05T17:58:30Z kmsg (977697) - 2021-03-05T17:58:29.2863708Z: init: (141) ERROR: StartHostListener:356: write failed 32\r\n2021-03-05T17:58:31Z kmsg (977698) - 2021-03-05T17:58:30.2888998Z: init: (141) ERROR: StartHostListener:356: write failed 32\r\n2021-03-05T17:58:32Z kmsg (977699) - 2021-03-05T17:58:31.2917718Z: init: (141) ERROR: StartHostListener:356: write failed 32\r\n2021-03-05T17:58:33Z kmsg (977700) - 2021-03-05T17:58:32.2944488Z: init: (141) ERROR: StartHostListener:356: write failed 32\r\n2021-03-05T17:58:34Z kmsg (977701) - 2021-03-05T17:58:33.2979438Z: init: (141) ERROR: StartHostListener:356: write failed 32\r\n\r\ntime=\"2021-01-12T14:38:11+01:00\" level=info msg=\"🍀 socket server listening : \\\\\\\\.\\\\pipe\\\\dockerGuiToDriver\"\r\ntime=\"2021-01-12T14:38:13+01:00\" level=info msg=\"NewSharer: WSL2 engine is enabled so no file sharer is required.\"\r\ntime=\"2021-01-12T14:38:13+01:00\" level=info msg=waitForDockerUp\r\ntime=\"2021-01-12T14:38:13+01:00\" level=info msg=\"🍀 socket server starting : \\\\\\\\.\\\\pipe\\\\dockerGuiToDriver\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"date\", \"2021-01-12T\"],\r\n\t[\"time\", \"13:38:16Z\"],\r\n\t\" containerd time\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"2021-01-12T13:38:16.314696100Z\\\"\"],\r\n\t\" level\",\r\n\t[\"operator\", \"=\"],\r\n\t\"info msg\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"starting containerd\\\"\"],\r\n\t\" revision\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"269548fa27e0089a8b8278fc4fc781d7f65a939b\"],\r\n\t\" version\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"v1.4.3\"],\r\n\r\n\t[\"date\", \"2021-01-12T\"],\r\n\t[\"time\", \"13:38:16Z\"],\r\n\t\" containerd time\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"2021-01-12T13:38:16.314743500Z\\\"\"],\r\n\t\" level\",\r\n\t[\"operator\", \"=\"],\r\n\t\"debug msg\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"changing OOM score to -500\\\"\"],\r\n\r\n\t[\"date\", \"2021-01-12T\"],\r\n\t[\"time\", \"13:38:16Z\"],\r\n\t\" containerd time\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"2021-01-12T13:38:16.336716900Z\\\"\"],\r\n\t\" level\",\r\n\t[\"operator\", \"=\"],\r\n\t\"info msg\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"loading plugin \\\\\\\"io.containerd.content.v1.content\\\\\\\"...\\\"\"],\r\n\t\" type\",\r\n\t[\"operator\", \"=\"],\r\n\t\"io\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"containerd\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"content\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"v1\\r\\n\",\r\n\r\n\t[\"date\", \"2021-01-12T\"],\r\n\t[\"time\", \"13:38:16Z\"],\r\n\t\" containerd time\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"2021-01-12T13:38:16.336891100Z\\\"\"],\r\n\t\" level\",\r\n\t[\"operator\", \"=\"],\r\n\t\"info msg\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"loading plugin \\\\\\\"io.containerd.snapshotter.v1.aufs\\\\\\\"...\\\"\"],\r\n\t\" type\",\r\n\t[\"operator\", \"=\"],\r\n\t\"io\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"containerd\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"snapshotter\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"v1\\r\\n\",\r\n\r\n\t[\"date\", \"2021-01-12T\"],\r\n\t[\"time\", \"13:38:16Z\"],\r\n\t\" containerd time\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"2021-01-12T13:38:16.338482500Z\\\"\"],\r\n\t\" level\",\r\n\t[\"operator\", \"=\"],\r\n\t\"info msg\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"skip loading plugin \\\\\\\"io.containerd.snapshotter.v1.aufs\\\\\\\"...\\\"\"],\r\n\t\" error\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"aufs is not supported (modprobe aufs failed: exit status 1 \\\\\\\"modprobe: can't change directory to '4.19.128-microsoft-standard': No such file or directory\\\\\\\\n\\\\\\\"): skip plugin\\\"\"],\r\n\t\" type\",\r\n\t[\"operator\", \"=\"],\r\n\t\"io\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"containerd\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"snapshotter\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"v1\\r\\n\",\r\n\r\n\t[\"date\", \"2021-01-12T\"],\r\n\t[\"time\", \"13:38:16Z\"],\r\n\t\" containerd time\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"2021-01-12T13:38:16.338523700Z\\\"\"],\r\n\t\" level\",\r\n\t[\"operator\", \"=\"],\r\n\t\"info msg\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"loading plugin \\\\\\\"io.containerd.snapshotter.v1.btrfs\\\\\\\"...\\\"\"],\r\n\t\" type\",\r\n\t[\"operator\", \"=\"],\r\n\t\"io\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"containerd\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"snapshotter\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"v1\\r\\n\",\r\n\r\n\t[\"date\", \"2021-01-12T\"],\r\n\t[\"time\", \"13:38:16Z\"],\r\n\t\" containerd time\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"2021-01-12T13:38:16.338835400Z\\\"\"],\r\n\t\" level\",\r\n\t[\"operator\", \"=\"],\r\n\t\"info msg\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"skip loading plugin \\\\\\\"io.containerd.snapshotter.v1.btrfs\\\\\\\"...\\\"\"],\r\n\t\" error\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"path /var/lib/desktop-containerd/daemon/io.containerd.snapshotter.v1.btrfs (ext4) must be a btrfs filesystem to be used with the btrfs snapshotter: skip plugin\\\"\"],\r\n\t\" type\",\r\n\t[\"operator\", \"=\"],\r\n\t\"io\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"containerd\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"snapshotter\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"v1\\r\\n\\r\\n\",\r\n\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:29Z\"],\r\n\t\" kmsg \",\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"977696\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:28.2836488Z\"],\r\n\t[\"operator\", \":\"],\r\n\t\" init\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"141\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"level\", \"ERROR\"],\r\n\t[\"operator\", \":\"],\r\n\t\" StartHostListener\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"356\"],\r\n\t[\"operator\", \":\"],\r\n\t\" write failed \",\r\n\t[\"number\", \"32\"],\r\n\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:30Z\"],\r\n\t\" kmsg \",\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"977697\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:29.2863708Z\"],\r\n\t[\"operator\", \":\"],\r\n\t\" init\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"141\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"level\", \"ERROR\"],\r\n\t[\"operator\", \":\"],\r\n\t\" StartHostListener\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"356\"],\r\n\t[\"operator\", \":\"],\r\n\t\" write failed \",\r\n\t[\"number\", \"32\"],\r\n\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:31Z\"],\r\n\t\" kmsg \",\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"977698\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:30.2888998Z\"],\r\n\t[\"operator\", \":\"],\r\n\t\" init\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"141\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"level\", \"ERROR\"],\r\n\t[\"operator\", \":\"],\r\n\t\" StartHostListener\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"356\"],\r\n\t[\"operator\", \":\"],\r\n\t\" write failed \",\r\n\t[\"number\", \"32\"],\r\n\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:32Z\"],\r\n\t\" kmsg \",\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"977699\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:31.2917718Z\"],\r\n\t[\"operator\", \":\"],\r\n\t\" init\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"141\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"level\", \"ERROR\"],\r\n\t[\"operator\", \":\"],\r\n\t\" StartHostListener\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"356\"],\r\n\t[\"operator\", \":\"],\r\n\t\" write failed \",\r\n\t[\"number\", \"32\"],\r\n\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:33Z\"],\r\n\t\" kmsg \",\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"977700\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:32.2944488Z\"],\r\n\t[\"operator\", \":\"],\r\n\t\" init\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"141\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"level\", \"ERROR\"],\r\n\t[\"operator\", \":\"],\r\n\t\" StartHostListener\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"356\"],\r\n\t[\"operator\", \":\"],\r\n\t\" write failed \",\r\n\t[\"number\", \"32\"],\r\n\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:34Z\"],\r\n\t\" kmsg \",\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"977701\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"date\", \"2021-03-05T\"],\r\n\t[\"time\", \"17:58:33.2979438Z\"],\r\n\t[\"operator\", \":\"],\r\n\t\" init\",\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"141\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"level\", \"ERROR\"],\r\n\t[\"operator\", \":\"],\r\n\t\" StartHostListener\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"356\"],\r\n\t[\"operator\", \":\"],\r\n\t\" write failed \",\r\n\t[\"number\", \"32\"],\r\n\r\n\t\"\\r\\n\\r\\ntime\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"2021-01-12T14:38:11+01:00\\\"\"],\r\n\t\" level\",\r\n\t[\"operator\", \"=\"],\r\n\t\"info msg\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"🍀 socket server listening : \\\\\\\\\\\\\\\\.\\\\\\\\pipe\\\\\\\\dockerGuiToDriver\\\"\"],\r\n\r\n\t\"\\r\\ntime\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"2021-01-12T14:38:13+01:00\\\"\"],\r\n\t\" level\",\r\n\t[\"operator\", \"=\"],\r\n\t\"info msg\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"NewSharer: WSL2 engine is enabled so no file sharer is required.\\\"\"],\r\n\r\n\t\"\\r\\ntime\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"2021-01-12T14:38:13+01:00\\\"\"],\r\n\t\" level\",\r\n\t[\"operator\", \"=\"],\r\n\t\"info msg\",\r\n\t[\"operator\", \"=\"],\r\n\t\"waitForDockerUp\\r\\ntime\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"2021-01-12T14:38:13+01:00\\\"\"],\r\n\t\" level\",\r\n\t[\"operator\", \"=\"],\r\n\t\"info msg\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"🍀 socket server starting : \\\\\\\\\\\\\\\\.\\\\\\\\pipe\\\\\\\\dockerGuiToDriver\\\"\"]\r\n]"
  },
  {
    "path": "tests/languages/log/_hadoop.test",
    "content": "[2021-07-21 14:07:47.665]Container killed on request. Exit code is 143\n[2021-07-21 14:07:47.746]Container exited with a non-zero exit code 143.\n\n2021-07-21 14:08:47,137 INFO  [main] mapreduce.Job (Job.java:printTaskEvents(1457)) - Task Id : attempt_1626702076395_0052_m_000404_1, Status : FAILED\n[2021-07-21 14:07:48.433]Container [pid=33331,containerID=container_e102_1626702076395_0052_01_000877] is running beyond physical memory limits. Current usage: 2.5 GB of 2 GB physical memory used; 4.7 GB of 4.2 GB virtual memory used. Killing container.\nDump of the process-tree for container_e102_1626702076395_0052_01_000877 :\n        |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE\n        |- 33331 33328 33331 33331 (bash) 0 1 7065600 846 /bin/bash -c /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN  -Xmx3072m -Djava.io.tmpdir=/tmp/hadoop/nm-local-dir/usercache/ms26bybu/appcache/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Dhadoop.root.logfile=syslog org.apache.hadoop.mapred.YarnChild 141.54.132.64 39863 attempt_1626702076395_0052_m_000404_1 112150186034029 1>/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/stdout 2>/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/stderr\n        |- 33340 33331 33331 33331 (java) 5424 755 5028823040 665860 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx3072m -Djava.io.tmpdir=/tmp/hadoop/nm-local-dir/usercache/ms26bybu/appcache/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Dhadoop.root.logfile=syslog org.apache.hadoop.mapred.YarnChild 141.54.132.64 39863 attempt_1626702076395_0052_m_000404_1 112150186034029\n\n[2021-07-21 14:07:48.611]Container killed on request. Exit code is 143\n[2021-07-21 14:07:48.633]Container exited with a non-zero exit code 143.\n\n2021-07-21 14:08:47,233 INFO  [main] mapreduce.Job (Job.java:monitorAndPrintJob(1431)) - Job job_1626702076395_0052 failed with state FAILED due to: Task failed task_1626702076395_0052_m_000000\nJob failed as tasks failed. failedMaps:1 failedReduces:0\n\n2021-07-21 14:08:47,330 INFO  [main] mapreduce.Job (Job.java:monitorAndPrintJob(1436)) - Counters: 14\n        Job Counters\n                Failed map tasks=1436\n                Killed map tasks=1527\n                Killed reduce tasks=1\n                Launched map tasks=1816\n                Other local map tasks=1218\n                Rack-local map tasks=598\n                Total time spent by all maps in occupied slots (ms)=119609884\n                Total time spent by all reduces in occupied slots (ms)=0\n                Total time spent by all map tasks (ms)=59804942\n                Total vcore-milliseconds taken by all map tasks=59804942\n                Total megabyte-milliseconds taken by all map tasks=122480521216\n        Map-Reduce Framework\n                CPU time spent (ms)=0\n                Physical memory (bytes) snapshot=0\n                Virtual memory (bytes) snapshot=0\njava.lang.RuntimeException: java.lang.RuntimeException: Job failed.\n        at org.netspeak.usage.Cli.run(Cli.java:272)\n        at picocli.CommandLine.executeUserObject(CommandLine.java:1919)\n        at picocli.CommandLine.access$1200(CommandLine.java:145)\n        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2332)\n        at picocli.CommandLine$RunLast.handle(CommandLine.java:2326)\n        at picocli.CommandLine$RunLast.handle(CommandLine.java:2291)\n        at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2159)\n        at picocli.CommandLine.execute(CommandLine.java:2058)\n        at org.netspeak.usage.Cli.main(Cli.java:292)\n        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n        at java.lang.reflect.Method.invoke(Method.java:498)\n        at org.apache.hadoop.util.RunJar.run(RunJar.java:239)\n        at org.apache.hadoop.util.RunJar.main(RunJar.java:153)\nCaused by: java.lang.RuntimeException: Job failed.\n        at org.netspeak.hadoop.Merge.run(Merge.java:124)\n        at org.netspeak.usage.Cli.runHadoop(Cli.java:239)\n        at org.netspeak.usage.Cli.runWithExecption(Cli.java:259)\n        at org.netspeak.usage.Cli.run(Cli.java:270)\n        ... 14 more\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:47.665\"],\n\t[\"punctuation\", \"]\"],\n\t\"Container killed on request\",\n\t[\"punctuation\", \".\"],\n\t\" Exit code is \",\n\t[\"number\", \"143\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:47.746\"],\n\t[\"punctuation\", \"]\"],\n\t\"Container exited with a non\",\n\t[\"operator\", \"-\"],\n\t\"zero exit code \",\n\t[\"number\", \"143\"],\n\t[\"punctuation\", \".\"],\n\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:08:47,137\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"[\"],\n\t\"main\",\n\t[\"punctuation\", \"]\"],\n\t\" mapreduce\",\n\t[\"punctuation\", \".\"],\n\t\"Job \",\n\t[\"operator\", \"(\"],\n\t\"Job\",\n\t[\"punctuation\", \".\"],\n\t\"java\",\n\t[\"operator\", \":\"],\n\t\"printTaskEvents\",\n\t[\"operator\", \"(\"],\n\t[\"number\", \"1457\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \"-\"],\n\t\" Task Id \",\n\t[\"operator\", \":\"],\n\t\" attempt_1626702076395_0052_m_000404_1\",\n\t[\"punctuation\", \",\"],\n\t\" Status \",\n\t[\"operator\", \":\"],\n\t\" FAILED\\r\\n\",\n\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:48.433\"],\n\t[\"punctuation\", \"]\"],\n\t\"Container \",\n\t[\"punctuation\", \"[\"],\n\t\"pid\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"33331\"],\n\t[\"punctuation\", \",\"],\n\t\"containerID\",\n\t[\"operator\", \"=\"],\n\t\"container_e102_1626702076395_0052_01_000877\",\n\t[\"punctuation\", \"]\"],\n\t\" is running beyond physical memory limits\",\n\t[\"punctuation\", \".\"],\n\t\" Current usage\",\n\t[\"operator\", \":\"],\n\t[\"number\", \"2.5\"],\n\t\" GB of \",\n\t[\"number\", \"2\"],\n\t\" GB physical memory used\",\n\t[\"operator\", \";\"],\n\t[\"number\", \"4.7\"],\n\t\" GB of \",\n\t[\"number\", \"4.2\"],\n\t\" GB virtual memory used\",\n\t[\"punctuation\", \".\"],\n\t\" Killing container\",\n\t[\"punctuation\", \".\"],\n\n\t\"\\r\\nDump of the process\",\n\t[\"operator\", \"-\"],\n\t\"tree for container_e102_1626702076395_0052_01_000877 \",\n\t[\"operator\", \":\"],\n\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"-\"],\n\t\" PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME\",\n\t[\"operator\", \"(\"],\n\t\"MILLIS\",\n\t[\"operator\", \")\"],\n\t\" SYSTEM_TIME\",\n\t[\"operator\", \"(\"],\n\t\"MILLIS\",\n\t[\"operator\", \")\"],\n\t\" VMEM_USAGE\",\n\t[\"operator\", \"(\"],\n\t\"BYTES\",\n\t[\"operator\", \")\"],\n\t\" RSSMEM_USAGE\",\n\t[\"operator\", \"(\"],\n\t\"PAGES\",\n\t[\"operator\", \")\"],\n\t\" FULL_CMD_LINE\\r\\n        \",\n\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"33331\"],\n\t[\"number\", \"33328\"],\n\t[\"number\", \"33331\"],\n\t[\"number\", \"33331\"],\n\t[\"operator\", \"(\"],\n\t\"bash\",\n\t[\"operator\", \")\"],\n\t[\"number\", \"0\"],\n\t[\"number\", \"1\"],\n\t[\"number\", \"7065600\"],\n\t[\"number\", \"846\"],\n\t[\"file-path\", \"/bin/bash\"],\n\t[\"operator\", \"-\"],\n\t\"c \",\n\t[\"file-path\", \"/usr/lib/jvm/java-8-openjdk-amd64/bin/java\"],\n\t[\"operator\", \"-\"],\n\t\"Djava\",\n\t[\"punctuation\", \".\"],\n\t\"net\",\n\t[\"punctuation\", \".\"],\n\t\"preferIPv4Stack\",\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"metrics\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"level\",\n\t[\"operator\", \"=\"],\n\t[\"level\", \"WARN\"],\n\t[\"operator\", \"-\"],\n\t\"Xmx3072m \",\n\t[\"operator\", \"-\"],\n\t\"Djava\",\n\t[\"punctuation\", \".\"],\n\t\"io\",\n\t[\"punctuation\", \".\"],\n\t\"tmpdir\",\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"/\"],\n\t\"tmp\",\n\t[\"operator\", \"/\"],\n\t\"hadoop\",\n\t[\"operator\", \"/\"],\n\t\"nm\",\n\t[\"operator\", \"-\"],\n\t\"local\",\n\t[\"operator\", \"-\"],\n\t\"dir\",\n\t[\"operator\", \"/\"],\n\t\"usercache\",\n\t[\"operator\", \"/\"],\n\t\"ms26bybu\",\n\t[\"operator\", \"/\"],\n\t\"appcache\",\n\t[\"operator\", \"/\"],\n\t\"application_1626702076395_0052\",\n\t[\"operator\", \"/\"],\n\t\"container_e102_1626702076395_0052_01_000877\",\n\t[\"operator\", \"/\"],\n\t\"tmp \",\n\t[\"operator\", \"-\"],\n\t\"Dlog4j\",\n\t[\"punctuation\", \".\"],\n\t\"configuration\",\n\t[\"operator\", \"=\"],\n\t\"container\",\n\t[\"operator\", \"-\"],\n\t\"log4j\",\n\t[\"punctuation\", \".\"],\n\t\"properties \",\n\t[\"operator\", \"-\"],\n\t\"Dyarn\",\n\t[\"punctuation\", \".\"],\n\t\"app\",\n\t[\"punctuation\", \".\"],\n\t\"container\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"dir\",\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"/\"],\n\t\"opt\",\n\t[\"operator\", \"/\"],\n\t\"hadoop\",\n\t[\"operator\", \"/\"],\n\t\"logs\",\n\t[\"operator\", \"/\"],\n\t\"userlogs\",\n\t[\"operator\", \"/\"],\n\t\"application_1626702076395_0052\",\n\t[\"operator\", \"/\"],\n\t\"container_e102_1626702076395_0052_01_000877 \",\n\t[\"operator\", \"-\"],\n\t\"Dyarn\",\n\t[\"punctuation\", \".\"],\n\t\"app\",\n\t[\"punctuation\", \".\"],\n\t\"container\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"filesize\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"root\",\n\t[\"punctuation\", \".\"],\n\t\"logger\",\n\t[\"operator\", \"=\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \",\"],\n\t\"CLA \",\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"root\",\n\t[\"punctuation\", \".\"],\n\t\"logfile\",\n\t[\"operator\", \"=\"],\n\t\"syslog org\",\n\t[\"punctuation\", \".\"],\n\t\"apache\",\n\t[\"punctuation\", \".\"],\n\t\"hadoop\",\n\t[\"punctuation\", \".\"],\n\t\"mapred\",\n\t[\"punctuation\", \".\"],\n\t\"YarnChild \",\n\t[\"ip-address\", \"141.54.132.64\"],\n\t[\"number\", \"39863\"],\n\t\" attempt_1626702076395_0052_m_000404_1 \",\n\t[\"number\", \"112150186034029\"],\n\t[\"number\", \"1\"],\n\t[\"operator\", \">\"],\n\t[\"file-path\", \"/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/stdout\"],\n\t[\"number\", \"2\"],\n\t[\"operator\", \">\"],\n\t[\"file-path\", \"/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/stderr\"],\n\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"33340\"],\n\t[\"number\", \"33331\"],\n\t[\"number\", \"33331\"],\n\t[\"number\", \"33331\"],\n\t[\"operator\", \"(\"],\n\t\"java\",\n\t[\"operator\", \")\"],\n\t[\"number\", \"5424\"],\n\t[\"number\", \"755\"],\n\t[\"number\", \"5028823040\"],\n\t[\"number\", \"665860\"],\n\t[\"file-path\", \"/usr/lib/jvm/java-8-openjdk-amd64/bin/java\"],\n\t[\"operator\", \"-\"],\n\t\"Djava\",\n\t[\"punctuation\", \".\"],\n\t\"net\",\n\t[\"punctuation\", \".\"],\n\t\"preferIPv4Stack\",\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"metrics\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"level\",\n\t[\"operator\", \"=\"],\n\t[\"level\", \"WARN\"],\n\t[\"operator\", \"-\"],\n\t\"Xmx3072m \",\n\t[\"operator\", \"-\"],\n\t\"Djava\",\n\t[\"punctuation\", \".\"],\n\t\"io\",\n\t[\"punctuation\", \".\"],\n\t\"tmpdir\",\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"/\"],\n\t\"tmp\",\n\t[\"operator\", \"/\"],\n\t\"hadoop\",\n\t[\"operator\", \"/\"],\n\t\"nm\",\n\t[\"operator\", \"-\"],\n\t\"local\",\n\t[\"operator\", \"-\"],\n\t\"dir\",\n\t[\"operator\", \"/\"],\n\t\"usercache\",\n\t[\"operator\", \"/\"],\n\t\"ms26bybu\",\n\t[\"operator\", \"/\"],\n\t\"appcache\",\n\t[\"operator\", \"/\"],\n\t\"application_1626702076395_0052\",\n\t[\"operator\", \"/\"],\n\t\"container_e102_1626702076395_0052_01_000877\",\n\t[\"operator\", \"/\"],\n\t\"tmp \",\n\t[\"operator\", \"-\"],\n\t\"Dlog4j\",\n\t[\"punctuation\", \".\"],\n\t\"configuration\",\n\t[\"operator\", \"=\"],\n\t\"container\",\n\t[\"operator\", \"-\"],\n\t\"log4j\",\n\t[\"punctuation\", \".\"],\n\t\"properties \",\n\t[\"operator\", \"-\"],\n\t\"Dyarn\",\n\t[\"punctuation\", \".\"],\n\t\"app\",\n\t[\"punctuation\", \".\"],\n\t\"container\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"dir\",\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"/\"],\n\t\"opt\",\n\t[\"operator\", \"/\"],\n\t\"hadoop\",\n\t[\"operator\", \"/\"],\n\t\"logs\",\n\t[\"operator\", \"/\"],\n\t\"userlogs\",\n\t[\"operator\", \"/\"],\n\t\"application_1626702076395_0052\",\n\t[\"operator\", \"/\"],\n\t\"container_e102_1626702076395_0052_01_000877 \",\n\t[\"operator\", \"-\"],\n\t\"Dyarn\",\n\t[\"punctuation\", \".\"],\n\t\"app\",\n\t[\"punctuation\", \".\"],\n\t\"container\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"filesize\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"root\",\n\t[\"punctuation\", \".\"],\n\t\"logger\",\n\t[\"operator\", \"=\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \",\"],\n\t\"CLA \",\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"root\",\n\t[\"punctuation\", \".\"],\n\t\"logfile\",\n\t[\"operator\", \"=\"],\n\t\"syslog org\",\n\t[\"punctuation\", \".\"],\n\t\"apache\",\n\t[\"punctuation\", \".\"],\n\t\"hadoop\",\n\t[\"punctuation\", \".\"],\n\t\"mapred\",\n\t[\"punctuation\", \".\"],\n\t\"YarnChild \",\n\t[\"ip-address\", \"141.54.132.64\"],\n\t[\"number\", \"39863\"],\n\t\" attempt_1626702076395_0052_m_000404_1 \",\n\t[\"number\", \"112150186034029\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:48.611\"],\n\t[\"punctuation\", \"]\"],\n\t\"Container killed on request\",\n\t[\"punctuation\", \".\"],\n\t\" Exit code is \",\n\t[\"number\", \"143\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:48.633\"],\n\t[\"punctuation\", \"]\"],\n\t\"Container exited with a non\",\n\t[\"operator\", \"-\"],\n\t\"zero exit code \",\n\t[\"number\", \"143\"],\n\t[\"punctuation\", \".\"],\n\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:08:47,233\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"[\"],\n\t\"main\",\n\t[\"punctuation\", \"]\"],\n\t\" mapreduce\",\n\t[\"punctuation\", \".\"],\n\t\"Job \",\n\t[\"operator\", \"(\"],\n\t\"Job\",\n\t[\"punctuation\", \".\"],\n\t\"java\",\n\t[\"operator\", \":\"],\n\t\"monitorAndPrintJob\",\n\t[\"operator\", \"(\"],\n\t[\"number\", \"1431\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \"-\"],\n\t\" Job job_1626702076395_0052 failed with state FAILED due to\",\n\t[\"operator\", \":\"],\n\t\" Task failed task_1626702076395_0052_m_000000\\r\\nJob failed as tasks failed\",\n\t[\"punctuation\", \".\"],\n\t\" failedMaps\",\n\t[\"operator\", \":\"],\n\t[\"number\", \"1\"],\n\t\" failedReduces\",\n\t[\"operator\", \":\"],\n\t[\"number\", \"0\"],\n\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:08:47,330\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"[\"],\n\t\"main\",\n\t[\"punctuation\", \"]\"],\n\t\" mapreduce\",\n\t[\"punctuation\", \".\"],\n\t\"Job \",\n\t[\"operator\", \"(\"],\n\t\"Job\",\n\t[\"punctuation\", \".\"],\n\t\"java\",\n\t[\"operator\", \":\"],\n\t\"monitorAndPrintJob\",\n\t[\"operator\", \"(\"],\n\t[\"number\", \"1436\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \"-\"],\n\t\" Counters\",\n\t[\"operator\", \":\"],\n\t[\"number\", \"14\"],\n\n\t\"\\r\\n        Job Counters\\r\\n                Failed map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1436\"],\n\n\t\"\\r\\n                Killed map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1527\"],\n\n\t\"\\r\\n                Killed reduce tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1\"],\n\n\t\"\\r\\n                Launched map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1816\"],\n\n\t\"\\r\\n                Other local map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1218\"],\n\n\t\"\\r\\n                Rack\",\n\t[\"operator\", \"-\"],\n\t\"local map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"598\"],\n\n\t\"\\r\\n                Total time spent by all maps in occupied slots \",\n\t[\"operator\", \"(\"],\n\t\"ms\",\n\t[\"operator\", \")\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"119609884\"],\n\n\t\"\\r\\n                Total time spent by all reduces in occupied slots \",\n\t[\"operator\", \"(\"],\n\t\"ms\",\n\t[\"operator\", \")\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\n\t\"\\r\\n                Total time spent by all map tasks \",\n\t[\"operator\", \"(\"],\n\t\"ms\",\n\t[\"operator\", \")\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"59804942\"],\n\n\t\"\\r\\n                Total vcore\",\n\t[\"operator\", \"-\"],\n\t\"milliseconds taken by all map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"59804942\"],\n\n\t\"\\r\\n                Total megabyte\",\n\t[\"operator\", \"-\"],\n\t\"milliseconds taken by all map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"122480521216\"],\n\n\t\"\\r\\n        Map\",\n\t[\"operator\", \"-\"],\n\t\"Reduce Framework\\r\\n                CPU time spent \",\n\t[\"operator\", \"(\"],\n\t\"ms\",\n\t[\"operator\", \")\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\n\t\"\\r\\n                Physical memory \",\n\t[\"operator\", \"(\"],\n\t\"bytes\",\n\t[\"operator\", \")\"],\n\t\" snapshot\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\n\t\"\\r\\n                Virtual memory \",\n\t[\"operator\", \"(\"],\n\t\"bytes\",\n\t[\"operator\", \")\"],\n\t\" snapshot\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\n\t[\"exception\", [\n\t\t\"java\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"lang\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"RuntimeException\",\n\t\t[\"punctuation\", \":\"],\n\t\t\" java\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"lang\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"RuntimeException\",\n\t\t[\"punctuation\", \":\"],\n\t\t\" Job failed\",\n\t\t[\"punctuation\", \".\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"usage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"run\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"272\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"executeUserObject\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"1919\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"access$1200\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"145\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine$RunLast\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"executeUserObjectOfLastSubcommandWithSameParent\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"2332\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine$RunLast\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"handle\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"2326\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine$RunLast\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"handle\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"2291\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine$AbstractParseResultHandler\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"execute\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"2159\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"execute\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"2058\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"usage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"main\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"292\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" sun\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"reflect\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"NativeMethodAccessorImpl\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"invoke0\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Native Method\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" sun\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"reflect\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"NativeMethodAccessorImpl\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"invoke\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"NativeMethodAccessorImpl\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"62\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" sun\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"reflect\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"DelegatingMethodAccessorImpl\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"invoke\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"DelegatingMethodAccessorImpl\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"43\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" java\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"lang\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"reflect\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Method\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"invoke\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Method\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"498\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"apache\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"hadoop\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"util\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"RunJar\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"run\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"RunJar\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"239\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"apache\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"hadoop\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"util\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"RunJar\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"main\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"RunJar\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"153\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t\"\\r\\nCaused by\",\n\t\t[\"punctuation\", \":\"],\n\t\t\" java\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"lang\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"RuntimeException\",\n\t\t[\"punctuation\", \":\"],\n\t\t\" Job failed\",\n\t\t[\"punctuation\", \".\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"hadoop\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Merge\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"run\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Merge\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"124\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"usage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"runHadoop\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"239\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"usage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"runWithExecption\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"259\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"usage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"run\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"270\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"punctuation\", \".\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"punctuation\", \".\"],\n\t\t\" 14 more\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/log/_java_stack_trace.test",
    "content": "java.net.BindException: Address already in use\r\n\tat sun.nio.ch.Net.bind0(Native Method) ~[na:1.8.0_171]\r\n\tat sun.nio.ch.Net.bind(Net.java:433) ~[na:1.8.0_171]\r\n\tat sun.nio.ch.Net.bind(Net.java:425) ~[na:1.8.0_171]\r\n\tat sun.nio.ch.ServeISocketChannelImpl.bind(ServerSocketChannellmpl.java:223) ~[na:1.8.0_171]\r\n\r\norg.apache.maven.lifecycle.LifecycleExecutionException: Error installing artifact's metadata: Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\r\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:564)\r\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:480)\r\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:459)\r\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:311)\r\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:278)\r\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:143)\r\n        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:334)\r\n        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:125)\r\n        at org.apache.maven.cli.MavenCli.main(MavenCli.java:280)\r\n        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)\r\n        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)\r\n        at java.lang.reflect.Method.invoke(Method.java:585)\r\n        at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)\r\n        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)\r\n        at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)\r\n        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)\r\nCaused by: org.apache.maven.plugin.MojoExecutionException: Error installing artifact's metadata: Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\r\n        at org.apache.maven.plugin.deploy.DeployMojo.execute(DeployMojo.java:174)\r\n        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:443)\r\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:539)\r\n        ... 16 more\r\nCaused by: org.apache.maven.artifact.deployer.ArtifactDeploymentException: Error installing artifact's metadata: Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\r\n        at org.apache.maven.artifact.deployer.DefaultArtifactDeployer.deploy(DefaultArtifactDeployer.java:102)\r\n        at org.apache.maven.plugin.deploy.DeployMojo.execute(DeployMojo.java:162)\r\n        ... 18 more\r\nCaused by: org.apache.maven.artifact.repository.metadata.RepositoryMetadataDeploymentException: Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\r\n        at org.apache.maven.artifact.repository.metadata.DefaultRepositoryMetadataManager.deploy(DefaultRepositoryMetadataManager.java:441)\r\n        at org.apache.maven.artifact.deployer.DefaultArtifactDeployer.deploy(DefaultArtifactDeployer.java:86)\r\n        ... 19 more\r\nCaused by: org.apache.maven.wagon.TransferFailedException: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\r\n        at org.apache.maven.wagon.providers.http.LightweightHttpWagon.put(LightweightHttpWagon.java:172)\r\n        at org.apache.maven.artifact.manager.DefaultWagonManager.putRemoteFile(DefaultWagonManager.java:237)\r\n        at org.apache.maven.artifact.manager.DefaultWagonManager.putArtifactMetadata(DefaultWagonManager.java:162)\r\n        at org.apache.maven.artifact.repository.metadata.DefaultRepositoryMetadataManager.deploy(DefaultRepositoryMetadataManager.java:437)\r\n        ... 20 more\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"exception\", [\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"BindException\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Address already in use\\r\\n\\t\",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" sun\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"nio\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"ch\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"bind0\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Native Method\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" ~[na\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"1\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"8\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"0_171]\\r\\n\\t\",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" sun\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"nio\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"ch\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"bind\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"433\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" ~[na\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"1\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"8\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"0_171]\\r\\n\\t\",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" sun\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"nio\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"ch\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"bind\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"425\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" ~[na\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"1\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"8\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"0_171]\\r\\n\\t\",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" sun\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"nio\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"ch\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"ServeISocketChannelImpl\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"bind\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"ServerSocketChannellmpl\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"223\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" ~[na\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"1\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"8\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"0_171]\"\r\n\t]],\r\n\r\n\t[\"exception\", [\r\n\t\t\"org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"lifecycle\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"LifecycleExecutionException\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Error installing artifact's metadata\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Error while deploying metadata\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Failed to transfer file\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" http\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"//repo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"xxxx\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"com/foo/bar\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"pom\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\" Return code is\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 500\\r\\n        \",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"lifecycle\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"executeGoals\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"564\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"lifecycle\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"executeGoalWithLifecycle\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"480\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"lifecycle\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"executeGoal\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"459\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"lifecycle\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"executeGoalAndHandleFailures\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"311\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"lifecycle\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"executeTaskSegments\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"278\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"lifecycle\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"execute\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"143\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultMaven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"doExecute\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultMaven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"334\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultMaven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"execute\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultMaven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"125\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"cli\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"MavenCli\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"main\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"MavenCli\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"280\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" sun\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"reflect\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"NativeMethodAccessorImpl\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"invoke0\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Native Method\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" sun\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"reflect\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"NativeMethodAccessorImpl\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"invoke\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"NativeMethodAccessorImpl\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"39\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" sun\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"reflect\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DelegatingMethodAccessorImpl\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"invoke\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DelegatingMethodAccessorImpl\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"25\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" java\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"lang\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"reflect\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Method\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"invoke\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Method\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"585\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"codehaus\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"classworlds\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Launcher\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"launchEnhanced\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Launcher\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"315\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"codehaus\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"classworlds\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Launcher\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"launch\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Launcher\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"255\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"codehaus\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"classworlds\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Launcher\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"mainWithExitCode\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Launcher\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"430\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"codehaus\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"classworlds\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Launcher\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"main\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Launcher\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"375\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t\"\\r\\nCaused by\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"plugin\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"MojoExecutionException\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Error installing artifact's metadata\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Error while deploying metadata\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Failed to transfer file\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" http\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"//repo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"xxxx\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"com/foo/bar\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"pom\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\" Return code is\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 500\\r\\n        \",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"plugin\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"deploy\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DeployMojo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"execute\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DeployMojo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"174\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"plugin\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultPluginManager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"executeMojo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultPluginManager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"443\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"lifecycle\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"executeGoals\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultLifecycleExecutor\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"539\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\" 16 more\\r\\nCaused by\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"artifact\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"deployer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"ArtifactDeploymentException\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Error installing artifact's metadata\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Error while deploying metadata\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Failed to transfer file\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" http\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"//repo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"xxxx\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"com/foo/bar\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"pom\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\" Return code is\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 500\\r\\n        \",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"artifact\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"deployer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultArtifactDeployer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"deploy\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultArtifactDeployer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"102\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"plugin\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"deploy\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DeployMojo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"execute\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DeployMojo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"162\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\" 18 more\\r\\nCaused by\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"artifact\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"repository\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"metadata\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"RepositoryMetadataDeploymentException\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Error while deploying metadata\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Failed to transfer file\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" http\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"//repo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"xxxx\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"com/foo/bar\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"pom\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\" Return code is\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 500\\r\\n        \",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"artifact\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"repository\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"metadata\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultRepositoryMetadataManager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"deploy\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultRepositoryMetadataManager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"441\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"artifact\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"deployer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultArtifactDeployer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"deploy\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultArtifactDeployer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"86\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\" 19 more\\r\\nCaused by\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"wagon\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"TransferFailedException\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Failed to transfer file\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" http\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"//repo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"xxxx\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"com/foo/bar\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"pom\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\" Return code is\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 500\\r\\n        \",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"wagon\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"providers\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"http\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"LightweightHttpWagon\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"put\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"LightweightHttpWagon\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"172\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"artifact\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"manager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultWagonManager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"putRemoteFile\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultWagonManager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"237\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"artifact\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"manager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultWagonManager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"putArtifactMetadata\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultWagonManager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"162\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" org\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"apache\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"maven\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"artifact\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"repository\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"metadata\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DefaultRepositoryMetadataManager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"deploy\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DefaultRepositoryMetadataManager\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"437\",\r\n\t\t[\"punctuation\", \")\"],\r\n\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\" 20 more\"\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/log/_minecraft.test",
    "content": "[07:28:17] [Server thread/INFO] [net.minecraft.server.dedicated.DedicatedServer]: Starting minecraft server version 1.12.2\r\n[07:28:17] [Server thread/INFO] [FML]: MinecraftForge v14.23.5.2847 Initialized\r\n[07:28:17] [Server thread/INFO] [FML]: Starts to replace vanilla recipe ingredients with ore ingredients.\r\n[07:28:18] [Server thread/INFO] [FML]: Invalid recipe found with multiple oredict ingredients in the same ingredient...\r\n[07:28:19] [Server thread/INFO] [FML]: Replaced 1227 ore ingredients\r\n[07:28:19] [Server thread/INFO] [FML]: Searching /home/minecraft/multicraft/servers/server99505/./mods for mods\r\n[07:28:21] [Server thread/INFO] [FML]: Forge Mod Loader has identified 5 mods to load\r\n[07:28:21] [Server thread/WARN] [FML]: Missing English translation for FML: assets/fml/lang/en_us.lang\r\n[07:28:21] [Server thread/FATAL] [FML]: net.minecraftforge.fml.common.MissingModsException: Mod thaumcraft (Thaumcraft) requires [baubles@[1.5.2,)]\r\n[07:28:21] [Server thread/ERROR] [net.minecraft.server.MinecraftServer]: Encountered an unexpected exception\r\nnet.minecraftforge.fml.common.MissingModsException: Mod thaumcraft (Thaumcraft) requires [baubles@[1.5.2,)]\r\n\tat net.minecraftforge.fml.common.Loader.sortModList(Loader.java:266) ~[Loader.class:?]\r\n\tat net.minecraftforge.fml.common.Loader.loadMods(Loader.java:572) ~[Loader.class:?]\r\n\tat net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandler.java:98) ~[FMLServerHandler.class:?]\r\n\tat net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.java:333) ~[FMLCommonHandler.class:?]\r\n\tat net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:125) ~[nz.class:?]\r\n\tat net.minecraft.server.MinecraftServer.run(MinecraftServer.java:486) [MinecraftServer.class:?]\r\n\tat java.lang.Thread.run(Thread.java:748) [?:1.8.0_222]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"07:28:17\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"Server thread\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"net\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"minecraft\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"server\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"dedicated\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"DedicatedServer\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t\" Starting minecraft server version \",\r\n\t[\"number\", \"1.12.2\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"07:28:17\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"Server thread\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"FML\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t\" MinecraftForge \",\r\n\t[\"number\", \"v14.23.5.2847\"],\r\n\t\" Initialized\\r\\n\",\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"07:28:17\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"Server thread\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"FML\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t\" Starts to replace vanilla recipe ingredients with ore ingredients\",\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"07:28:18\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"Server thread\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"FML\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t\" Invalid recipe found with multiple oredict ingredients in the same ingredient\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"07:28:19\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"Server thread\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"FML\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t\" Replaced \",\r\n\t[\"number\", \"1227\"],\r\n\t\" ore ingredients\\r\\n\",\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"07:28:19\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"Server thread\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"FML\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t\" Searching \",\r\n\t[\"file-path\", \"/home/minecraft/multicraft/servers/server99505/./mods\"],\r\n\t\" for mods\\r\\n\",\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"07:28:21\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"Server thread\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"FML\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t\" Forge Mod Loader has identified \",\r\n\t[\"number\", \"5\"],\r\n\t\" mods to load\\r\\n\",\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"07:28:21\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"Server thread\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"level\", \"WARN\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"FML\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t\" Missing English translation for FML\",\r\n\t[\"operator\", \":\"],\r\n\t\" assets\",\r\n\t[\"operator\", \"/\"],\r\n\t\"fml\",\r\n\t[\"operator\", \"/\"],\r\n\t\"lang\",\r\n\t[\"operator\", \"/\"],\r\n\t\"en_us\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"lang\\r\\n\",\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"07:28:21\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"Server thread\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"level\", \"FATAL\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"FML\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t\" net\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"minecraftforge\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"fml\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"common\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"MissingModsException\",\r\n\t[\"operator\", \":\"],\r\n\t\" Mod thaumcraft \",\r\n\t[\"operator\", \"(\"],\r\n\t\"Thaumcraft\",\r\n\t[\"operator\", \")\"],\r\n\t\" requires \",\r\n\t[\"punctuation\", \"[\"],\r\n\t\"baubles\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"1.5.2\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"time\", \"07:28:21\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"Server thread\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"level\", \"ERROR\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"net\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"minecraft\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"server\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"MinecraftServer\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t\" Encountered an unexpected exception\\r\\n\",\r\n\r\n\t[\"exception\", [\r\n\t\t\"net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"minecraftforge\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"fml\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"common\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"MissingModsException\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" Mod thaumcraft \",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Thaumcraft\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" requires [baubles@[1\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"5\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"2,\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\"]\\r\\n\\t\",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"minecraftforge\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"fml\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"common\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Loader\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"sortModList\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Loader\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"266\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" ~[Loader\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"class\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"?]\\r\\n\\t\",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"minecraftforge\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"fml\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"common\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Loader\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"loadMods\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Loader\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"572\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" ~[Loader\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"class\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"?]\\r\\n\\t\",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"minecraftforge\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"fml\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"server\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"FMLServerHandler\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"beginServerLoading\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"FMLServerHandler\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"98\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" ~[FMLServerHandler\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"class\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"?]\\r\\n\\t\",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"minecraftforge\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"fml\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"common\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"FMLCommonHandler\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"onServerStart\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"FMLCommonHandler\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"333\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" ~[FMLCommonHandler\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"class\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"?]\\r\\n\\t\",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"minecraft\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"server\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"dedicated\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"DedicatedServer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"func_71197_b\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"DedicatedServer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"125\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" ~[nz\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"class\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"?]\\r\\n\\t\",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" net\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"minecraft\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"server\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"MinecraftServer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"run\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"MinecraftServer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"486\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" [MinecraftServer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"class\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"?]\\r\\n\\t\",\r\n\r\n\t\t[\"keyword\", \"at\"],\r\n\t\t\" java\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"lang\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Thread\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"run\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"Thread\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"java\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"748\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" [?\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"1\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"8\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"0_222]\"\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/log/_nginx.test",
    "content": "47.29.201.179 - - [28/Feb/2019:13:17:10 +0000] \"GET /?p=1 HTTP/2.0\" 200 5316 \"https://domain1.com/?p=1\" \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36\" \"2.75\"\r\n\r\nMar 19 22:10:18 xxxxxx journal: xxxxxxx.mylabserver.com nginx: photos.example.com 127.0.0.1 - - [19/Mar/2018:22:10:18 +0000] \"GET / HTTP/1.1\" 200 1863 \"-\" \"curl/7.29.0\" \"-\"\r\nMar 19 22:10:24 xxxxxxx journal: xxxxxxxx.mylabserver.com nginx: photos.example.com 127.0.0.1 - - [19/Mar/2018:22:10:24 +0000] \"GET / HTTP/1.1\" 200 53324 \"-\" \"curl/7.29.0\" \"-\"\r\n\r\nTLSv1.2 AES128-SHA 1.1.1.1 \"Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\"\r\nTLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 2.2.2.2 \"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1\"\r\nTLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 3.3.3.3 \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0\"\r\nTLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 4.4.4.4 \"Mozilla/5.0 (Android 4.4.2; Tablet; rv:65.0) Gecko/65.0 Firefox/65.0\"\r\nTLSv1 AES128-SHA 5.5.5.5 \"Mozilla/5.0 (Android 4.4.2; Tablet; rv:65.0) Gecko/65.0 Firefox/65.0\"\r\nTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305 6.6.6.6 \"Mozilla/5.0 (Linux; U; Android 5.0.2; en-US; XT1068 Build/LXB22.46-28) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.10.2.1164 Mobile Safari/537.36\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"ip-address\", \"47.29.201.179\"],\r\n\t[\"separator\", \"- - \"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"28/Feb/2019\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"time\", \"13:17:10 +0000\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"string\", \"\\\"GET /?p=1 HTTP/2.0\\\"\"],\r\n\t[\"number\", \"200\"],\r\n\t[\"number\", \"5316\"],\r\n\t[\"string\", \"\\\"https://domain1.com/?p=1\\\"\"],\r\n\t[\"string\", \"\\\"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36\\\"\"],\r\n\t[\"string\", \"\\\"2.75\\\"\"],\r\n\r\n\t[\"date\", \"Mar 19\"],\r\n\t[\"time\", \"22:10:18\"],\r\n\t\" xxxxxx journal\",\r\n\t[\"operator\", \":\"],\r\n\t[\"domain\", \"xxxxxxx.mylabserver.com\"],\r\n\t\" nginx\",\r\n\t[\"operator\", \":\"],\r\n\t[\"domain\", \"photos.example.com\"],\r\n\t[\"ip-address\", \"127.0.0.1\"],\r\n\t[\"separator\", \"- - \"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"19/Mar/2018\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"time\", \"22:10:18 +0000\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"string\", \"\\\"GET / HTTP/1.1\\\"\"],\r\n\t[\"number\", \"200\"],\r\n\t[\"number\", \"1863\"],\r\n\t[\"string\", \"\\\"-\\\"\"],\r\n\t[\"string\", \"\\\"curl/7.29.0\\\"\"],\r\n\t[\"string\", \"\\\"-\\\"\"],\r\n\r\n\t[\"date\", \"Mar 19\"],\r\n\t[\"time\", \"22:10:24\"],\r\n\t\" xxxxxxx journal\",\r\n\t[\"operator\", \":\"],\r\n\t[\"domain\", \"xxxxxxxx.mylabserver.com\"],\r\n\t\" nginx\",\r\n\t[\"operator\", \":\"],\r\n\t[\"domain\", \"photos.example.com\"],\r\n\t[\"ip-address\", \"127.0.0.1\"],\r\n\t[\"separator\", \"- - \"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"19/Mar/2018\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"time\", \"22:10:24 +0000\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"string\", \"\\\"GET / HTTP/1.1\\\"\"],\r\n\t[\"number\", \"200\"],\r\n\t[\"number\", \"53324\"],\r\n\t[\"string\", \"\\\"-\\\"\"],\r\n\t[\"string\", \"\\\"curl/7.29.0\\\"\"],\r\n\t[\"string\", \"\\\"-\\\"\"],\r\n\r\n\t\"\\r\\n\\r\\nTLSv1\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"2 AES128\",\r\n\t[\"operator\", \"-\"],\r\n\t\"SHA \",\r\n\t[\"ip-address\", \"1.1.1.1\"],\r\n\t[\"string\", \"\\\"Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\\\"\"],\r\n\r\n\t\"\\r\\nTLSv1\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"2 ECDHE\",\r\n\t[\"operator\", \"-\"],\r\n\t\"RSA\",\r\n\t[\"operator\", \"-\"],\r\n\t\"AES128\",\r\n\t[\"operator\", \"-\"],\r\n\t\"GCM\",\r\n\t[\"operator\", \"-\"],\r\n\t\"SHA256 \",\r\n\t[\"ip-address\", \"2.2.2.2\"],\r\n\t[\"string\", \"\\\"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1\\\"\"],\r\n\r\n\t\"\\r\\nTLSv1\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"2 ECDHE\",\r\n\t[\"operator\", \"-\"],\r\n\t\"RSA\",\r\n\t[\"operator\", \"-\"],\r\n\t\"AES128\",\r\n\t[\"operator\", \"-\"],\r\n\t\"GCM\",\r\n\t[\"operator\", \"-\"],\r\n\t\"SHA256 \",\r\n\t[\"ip-address\", \"3.3.3.3\"],\r\n\t[\"string\", \"\\\"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0\\\"\"],\r\n\r\n\t\"\\r\\nTLSv1\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"2 ECDHE\",\r\n\t[\"operator\", \"-\"],\r\n\t\"RSA\",\r\n\t[\"operator\", \"-\"],\r\n\t\"AES128\",\r\n\t[\"operator\", \"-\"],\r\n\t\"GCM\",\r\n\t[\"operator\", \"-\"],\r\n\t\"SHA256 \",\r\n\t[\"ip-address\", \"4.4.4.4\"],\r\n\t[\"string\", \"\\\"Mozilla/5.0 (Android 4.4.2; Tablet; rv:65.0) Gecko/65.0 Firefox/65.0\\\"\"],\r\n\r\n\t\"\\r\\nTLSv1 AES128\",\r\n\t[\"operator\", \"-\"],\r\n\t\"SHA \",\r\n\t[\"ip-address\", \"5.5.5.5\"],\r\n\t[\"string\", \"\\\"Mozilla/5.0 (Android 4.4.2; Tablet; rv:65.0) Gecko/65.0 Firefox/65.0\\\"\"],\r\n\r\n\t\"\\r\\nTLSv1\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"2 ECDHE\",\r\n\t[\"operator\", \"-\"],\r\n\t\"RSA\",\r\n\t[\"operator\", \"-\"],\r\n\t\"CHACHA20\",\r\n\t[\"operator\", \"-\"],\r\n\t\"POLY1305 \",\r\n\t[\"ip-address\", \"6.6.6.6\"],\r\n\t[\"string\", \"\\\"Mozilla/5.0 (Linux; U; Android 5.0.2; en-US; XT1068 Build/LXB22.46-28) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.10.2.1164 Mobile Safari/537.36\\\"\"]\r\n]"
  },
  {
    "path": "tests/languages/log/_npm_console.test",
    "content": "npm ERR! code E404\r\nnpm ERR! 404 Not Found - GET https://registry.npmjs.org/asdasvsdffafwedsfvfasdfkigpodkfphd - Not found\r\nnpm ERR! 404\r\nnpm ERR! 404  'asdasvsdffafwedsfvfasdfkigpodkfphd@latest' is not in the npm registry.\r\nnpm ERR! 404 You should bug the author to publish it (or use the name yourself!)\r\nnpm ERR! 404\r\nnpm ERR! 404 Note that you can also install from a\r\nnpm ERR! 404 tarball, folder, http url, or git url.\r\n\r\nnpm ERR! A complete log of this run can be found in:\r\nnpm ERR!     C:\\Users\\micha\\AppData\\Roaming\\npm-cache\\_logs\\2021-03-08T19_15_44_229Z-debug.log\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"npm \",\r\n\t[\"level\", \"ERR\"],\r\n\t[\"operator\", \"!\"],\r\n\t\" code E404\\r\\nnpm \",\r\n\t[\"level\", \"ERR\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"number\", \"404\"],\r\n\t\" Not Found \",\r\n\t[\"operator\", \"-\"],\r\n\t\" GET \",\r\n\t[\"url\", \"https://registry.npmjs.org/asdasvsdffafwedsfvfasdfkigpodkfphd\"],\r\n\t[\"operator\", \"-\"],\r\n\t\" Not found\\r\\nnpm \",\r\n\t[\"level\", \"ERR\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"number\", \"404\"],\r\n\r\n\t\"\\r\\nnpm \",\r\n\t[\"level\", \"ERR\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"number\", \"404\"],\r\n\t[\"string\", \"'asdasvsdffafwedsfvfasdfkigpodkfphd@latest'\"],\r\n\t\" is not in the npm registry\",\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t\"\\r\\nnpm \",\r\n\t[\"level\", \"ERR\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"number\", \"404\"],\r\n\t\" You should bug the author to publish it \",\r\n\t[\"operator\", \"(\"],\r\n\t\"or use the name yourself\",\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \")\"],\r\n\r\n\t\"\\r\\nnpm \",\r\n\t[\"level\", \"ERR\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"number\", \"404\"],\r\n\r\n\t\"\\r\\nnpm \",\r\n\t[\"level\", \"ERR\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"number\", \"404\"],\r\n\t\" Note that you can also install from a\\r\\nnpm \",\r\n\t[\"level\", \"ERR\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"number\", \"404\"],\r\n\t\" tarball\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" folder\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" http url\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" or git url\",\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t\"\\r\\n\\r\\nnpm \",\r\n\t[\"level\", \"ERR\"],\r\n\t[\"operator\", \"!\"],\r\n\t\" A complete log of this run can be found in\",\r\n\t[\"operator\", \":\"],\r\n\r\n\t\"\\r\\nnpm \",\r\n\t[\"level\", \"ERR\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"file-path\", \"C:\\\\Users\\\\micha\\\\AppData\\\\Roaming\\\\npm-cache\\\\_logs\\\\2021-03-08T19_15_44_229Z-debug.log\"]\r\n]"
  },
  {
    "path": "tests/languages/log/_npm_log.test",
    "content": "0 info it worked if it ends with ok\r\n1 verbose cli [\r\n1 verbose cli   'C:\\\\Program Files\\\\nodejs\\\\node.exe',\r\n1 verbose cli   'C:\\\\Users\\\\micha\\\\AppData\\\\Roaming\\\\npm\\\\node_modules\\\\npm\\\\bin\\\\npm-cli.js',\r\n1 verbose cli   'run',\r\n1 verbose cli   'test:aliases'\r\n1 verbose cli ]\r\n2 info using npm@6.14.10\r\n3 info using node@v14.15.4\r\n4 verbose run-script [ 'pretest:aliases', 'test:aliases', 'posttest:aliases' ]\r\n5 info lifecycle prismjs@1.23.0~pretest:aliases: prismjs@1.23.0\r\n6 info lifecycle prismjs@1.23.0~test:aliases: prismjs@1.23.0\r\n7 verbose lifecycle prismjs@1.23.0~test:aliases: unsafe-perm in lifecycle true\r\n8 verbose lifecycle prismjs@1.23.0~test:aliases: PATH: ...\r\n9 verbose lifecycle prismjs@1.23.0~test:aliases: CWD: C:\\Users\\micha\\Git\\prism\r\n10 silly lifecycle prismjs@1.23.0~test:aliases: Args: [ '/d /s /c', 'mocha tests/aliases-test.js' ]\r\n11 silly lifecycle prismjs@1.23.0~test:aliases: Returned: code: 1  signal: null\r\n12 info lifecycle prismjs@1.23.0~test:aliases: Failed to exec test:aliases script\r\n13 verbose stack Error: prismjs@1.23.0 test:aliases: `mocha tests/aliases-test.js`\r\n13 verbose stack Exit status 1\r\n13 verbose stack     at EventEmitter.<anonymous> (C:\\Users\\micha\\AppData\\Roaming\\npm\\node_modules\\npm\\node_modules\\npm-lifecycle\\index.js:332:16)\r\n13 verbose stack     at EventEmitter.emit (events.js:315:20)\r\n13 verbose stack     at ChildProcess.<anonymous> (C:\\Users\\micha\\AppData\\Roaming\\npm\\node_modules\\npm\\node_modules\\npm-lifecycle\\lib\\spawn.js:55:14)\r\n13 verbose stack     at ChildProcess.emit (events.js:315:20)\r\n13 verbose stack     at maybeClose (internal/child_process.js:1048:16)\r\n13 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:288:5)\r\n14 verbose pkgid prismjs@1.23.0\r\n15 verbose cwd C:\\Users\\micha\\Git\\prism\r\n16 verbose Windows_NT 10.0.19042\r\n17 verbose argv \"C:\\\\Program Files\\\\nodejs\\\\node.exe\" \"C:\\\\Users\\\\micha\\\\AppData\\\\Roaming\\\\npm\\\\node_modules\\\\npm\\\\bin\\\\npm-cli.js\" \"run\" \"test:aliases\"\r\n18 verbose node v14.15.4\r\n19 verbose npm  v6.14.10\r\n20 error code ELIFECYCLE\r\n21 error errno 1\r\n22 error prismjs@1.23.0 test:aliases: `mocha tests/aliases-test.js`\r\n22 error Exit status 1\r\n23 error Failed at the prismjs@1.23.0 test:aliases script.\r\n23 error This is probably not a problem with npm. There is likely additional logging output above.\r\n24 verbose exit [ 1, true ]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t\" info it worked if it ends with ok\\r\\n\",\r\n\r\n\t[\"number\", \"1\"],\r\n\t\" verbose cli \",\r\n\t[\"punctuation\", \"[\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t\" verbose cli   \",\r\n\t[\"string\", \"'C:\\\\\\\\Program Files\\\\\\\\nodejs\\\\\\\\node.exe'\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t\" verbose cli   \",\r\n\t[\"string\", \"'C:\\\\\\\\Users\\\\\\\\micha\\\\\\\\AppData\\\\\\\\Roaming\\\\\\\\npm\\\\\\\\node_modules\\\\\\\\npm\\\\\\\\bin\\\\\\\\npm-cli.js'\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t\" verbose cli   \",\r\n\t[\"string\", \"'run'\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t\" verbose cli   \",\r\n\t[\"string\", \"'test:aliases'\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t\" verbose cli \",\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"number\", \"2\"],\r\n\t\" info using npm\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"6.14.10\"],\r\n\r\n\t[\"number\", \"3\"],\r\n\t\" info using node\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"v14.15.4\"],\r\n\r\n\t[\"number\", \"4\"],\r\n\t\" verbose run\",\r\n\t[\"operator\", \"-\"],\r\n\t\"script \",\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"'pretest:aliases'\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"'test:aliases'\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"'posttest:aliases'\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"number\", \"5\"],\r\n\t\" info lifecycle prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\t[\"operator\", \"~\"],\r\n\t\"pretest\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \":\"],\r\n\t\" prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\r\n\t[\"number\", \"6\"],\r\n\t\" info lifecycle prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\t[\"operator\", \"~\"],\r\n\t\"test\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \":\"],\r\n\t\" prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\r\n\t[\"number\", \"7\"],\r\n\t\" verbose lifecycle prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\t[\"operator\", \"~\"],\r\n\t\"test\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \":\"],\r\n\t\" unsafe\",\r\n\t[\"operator\", \"-\"],\r\n\t\"perm in lifecycle \",\r\n\t[\"boolean\", \"true\"],\r\n\r\n\t[\"number\", \"8\"],\r\n\t\" verbose lifecycle prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\t[\"operator\", \"~\"],\r\n\t\"test\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \":\"],\r\n\t\" PATH\",\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"number\", \"9\"],\r\n\t\" verbose lifecycle prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\t[\"operator\", \"~\"],\r\n\t\"test\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \":\"],\r\n\t\" CWD\",\r\n\t[\"operator\", \":\"],\r\n\t[\"file-path\", \"C:\\\\Users\\\\micha\\\\Git\\\\prism\"],\r\n\r\n\t[\"number\", \"10\"],\r\n\t\" silly lifecycle prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\t[\"operator\", \"~\"],\r\n\t\"test\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \":\"],\r\n\t\" Args\",\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"'/d /s /c'\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"'mocha tests/aliases-test.js'\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"number\", \"11\"],\r\n\t\" silly lifecycle prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\t[\"operator\", \"~\"],\r\n\t\"test\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \":\"],\r\n\t\" Returned\",\r\n\t[\"operator\", \":\"],\r\n\t\" code\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1\"],\r\n\t\"  signal\",\r\n\t[\"operator\", \":\"],\r\n\t[\"boolean\", \"null\"],\r\n\r\n\t[\"number\", \"12\"],\r\n\t\" info lifecycle prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\t[\"operator\", \"~\"],\r\n\t\"test\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \":\"],\r\n\t\" Failed to exec test\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases script\\r\\n\",\r\n\r\n\t[\"number\", \"13\"],\r\n\t\" verbose stack Error\",\r\n\t[\"operator\", \":\"],\r\n\t\" prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\t\" test\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \":\"],\r\n\t\" `mocha tests\",\r\n\t[\"operator\", \"/\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \"-\"],\r\n\t\"test\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"js`\\r\\n\",\r\n\r\n\t[\"number\", \"13\"],\r\n\t\" verbose stack Exit status \",\r\n\t[\"number\", \"1\"],\r\n\r\n\t[\"number\", \"13\"],\r\n\t\" verbose stack     at EventEmitter\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"operator\", \"<\"],\r\n\t\"anonymous\",\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"(\"],\r\n\t[\"file-path\", \"C:\\\\Users\\\\micha\\\\AppData\\\\Roaming\\\\npm\\\\node_modules\\\\npm\\\\node_modules\\\\npm-lifecycle\\\\index.js\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"332\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"16\"],\r\n\t[\"operator\", \")\"],\r\n\r\n\t[\"number\", \"13\"],\r\n\t\" verbose stack     at EventEmitter\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"emit \",\r\n\t[\"operator\", \"(\"],\r\n\t\"events\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"js\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"315\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"20\"],\r\n\t[\"operator\", \")\"],\r\n\r\n\t[\"number\", \"13\"],\r\n\t\" verbose stack     at ChildProcess\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"operator\", \"<\"],\r\n\t\"anonymous\",\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"(\"],\r\n\t[\"file-path\", \"C:\\\\Users\\\\micha\\\\AppData\\\\Roaming\\\\npm\\\\node_modules\\\\npm\\\\node_modules\\\\npm-lifecycle\\\\lib\\\\spawn.js\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"55\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"14\"],\r\n\t[\"operator\", \")\"],\r\n\r\n\t[\"number\", \"13\"],\r\n\t\" verbose stack     at ChildProcess\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"emit \",\r\n\t[\"operator\", \"(\"],\r\n\t\"events\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"js\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"315\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"20\"],\r\n\t[\"operator\", \")\"],\r\n\r\n\t[\"number\", \"13\"],\r\n\t\" verbose stack     at maybeClose \",\r\n\t[\"operator\", \"(\"],\r\n\t\"internal\",\r\n\t[\"operator\", \"/\"],\r\n\t\"child_process\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"js\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1048\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"16\"],\r\n\t[\"operator\", \")\"],\r\n\r\n\t[\"number\", \"13\"],\r\n\t\" verbose stack     at Process\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"ChildProcess\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"_handle\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"onexit \",\r\n\t[\"operator\", \"(\"],\r\n\t\"internal\",\r\n\t[\"operator\", \"/\"],\r\n\t\"child_process\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"js\",\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"288\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"5\"],\r\n\t[\"operator\", \")\"],\r\n\r\n\t[\"number\", \"14\"],\r\n\t\" verbose pkgid prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\r\n\t[\"number\", \"15\"],\r\n\t\" verbose cwd \",\r\n\t[\"file-path\", \"C:\\\\Users\\\\micha\\\\Git\\\\prism\"],\r\n\r\n\t[\"number\", \"16\"],\r\n\t\" verbose Windows_NT \",\r\n\t[\"number\", \"10.0.19042\"],\r\n\r\n\t[\"number\", \"17\"],\r\n\t\" verbose argv \",\r\n\t[\"string\", \"\\\"C:\\\\\\\\Program Files\\\\\\\\nodejs\\\\\\\\node.exe\\\"\"],\r\n\t[\"string\", \"\\\"C:\\\\\\\\Users\\\\\\\\micha\\\\\\\\AppData\\\\\\\\Roaming\\\\\\\\npm\\\\\\\\node_modules\\\\\\\\npm\\\\\\\\bin\\\\\\\\npm-cli.js\\\"\"],\r\n\t[\"string\", \"\\\"run\\\"\"],\r\n\t[\"string\", \"\\\"test:aliases\\\"\"],\r\n\r\n\t[\"number\", \"18\"],\r\n\t\" verbose node \",\r\n\t[\"number\", \"v14.15.4\"],\r\n\r\n\t[\"number\", \"19\"],\r\n\t\" verbose npm  \",\r\n\t[\"number\", \"v6.14.10\"],\r\n\r\n\t[\"number\", \"20\"],\r\n\t\" error code ELIFECYCLE\\r\\n\",\r\n\r\n\t[\"number\", \"21\"],\r\n\t\" error errno \",\r\n\t[\"number\", \"1\"],\r\n\r\n\t[\"number\", \"22\"],\r\n\t\" error prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\t\" test\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \":\"],\r\n\t\" `mocha tests\",\r\n\t[\"operator\", \"/\"],\r\n\t\"aliases\",\r\n\t[\"operator\", \"-\"],\r\n\t\"test\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"js`\\r\\n\",\r\n\r\n\t[\"number\", \"22\"],\r\n\t\" error Exit status \",\r\n\t[\"number\", \"1\"],\r\n\r\n\t[\"number\", \"23\"],\r\n\t\" error Failed at the prismjs\",\r\n\t[\"operator\", \"@\"],\r\n\t[\"number\", \"1.23.0\"],\r\n\t\" test\",\r\n\t[\"operator\", \":\"],\r\n\t\"aliases script\",\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"number\", \"23\"],\r\n\t\" error This is probably not a problem with npm\",\r\n\t[\"punctuation\", \".\"],\r\n\t\" There is likely additional logging output above\",\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"number\", \"24\"],\r\n\t\" verbose exit \",\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"punctuation\", \"]\"]\r\n]"
  },
  {
    "path": "tests/languages/log/_table.test",
    "content": "00:29:13:356 [14204] | INFO  | > Dumping swap chain description:\r\n00:29:13:356 [14204] | INFO  |   +-----------------------------------------+-----------------------------------------+\r\n00:29:13:356 [14204] | INFO  |   | Parameter                               | Value                                   |\r\n00:29:13:357 [14204] | INFO  |   +-----------------------------------------+-----------------------------------------+\r\n00:29:13:357 [14204] | INFO  |   | flags                                   | 0x4                                     |\r\n00:29:13:357 [14204] | INFO  |   | surface                                 | 0000000014A9A320                        |\r\n00:29:13:357 [14204] | INFO  |   | minImageCount                           | 4                                       |\r\n00:29:13:357 [14204] | INFO  |   | imageFormat                             | VK_FORMAT_B8G8R8A8_UNORM                |\r\n00:29:13:358 [14204] | INFO  |   | imageColorSpace                         | 0                                       |\r\n00:29:13:358 [14204] | INFO  |   | imageExtent                             | 1280                720                 |\r\n00:29:13:358 [14204] | INFO  |   | imageArrayLayers                        | 1                                       |\r\n00:29:13:358 [14204] | INFO  |   | imageUsage                              | 0x13                                    |\r\n00:29:13:358 [14204] | INFO  |   | imageSharingMode                        | 0                                       |\r\n00:29:13:359 [14204] | INFO  |   | queueFamilyIndexCount                   | 0                                       |\r\n00:29:13:359 [14204] | INFO  |   | preTransform                            | 0x1                                     |\r\n00:29:13:359 [14204] | INFO  |   | compositeAlpha                          | 0x1                                     |\r\n00:29:13:359 [14204] | INFO  |   | presentMode                             | 0                                       |\r\n00:29:13:359 [14204] | INFO  |   | clipped                                 | true                                    |\r\n00:29:13:359 [14204] | INFO  |   | oldSwapchain                            | 0000000000000000                        |\r\n00:29:13:360 [14204] | INFO  |   +-----------------------------------------+-----------------------------------------+\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"time\", \"00:29:13:356\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \">\"],\r\n\t\" Dumping swap chain description\",\r\n\t[\"operator\", \":\"],\r\n\r\n\t[\"time\", \"00:29:13:356\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"+\"],\r\n\r\n\t[\"time\", \"00:29:13:356\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" Parameter                               \",\r\n\t[\"operator\", \"|\"],\r\n\t\" Value                                   \",\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:357\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"+\"],\r\n\r\n\t[\"time\", \"00:29:13:357\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" flags                                   \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"0x4\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:357\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" surface                                 \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"0000000014A9A320\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:357\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" minImageCount                           \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:357\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" imageFormat                             \",\r\n\t[\"operator\", \"|\"],\r\n\t\" VK_FORMAT_B8G8R8A8_UNORM                \",\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:358\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" imageColorSpace                         \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:358\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" imageExtent                             \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"1280\"],\r\n\t[\"number\", \"720\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:358\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" imageArrayLayers                        \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:358\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" imageUsage                              \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"0x13\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:358\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" imageSharingMode                        \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:359\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" queueFamilyIndexCount                   \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:359\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" preTransform                            \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"0x1\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:359\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" compositeAlpha                          \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"0x1\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:359\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" presentMode                             \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:359\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" clipped                                 \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:359\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"|\"],\r\n\t\" oldSwapchain                            \",\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"0000000000000000\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"time\", \"00:29:13:360\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"14204\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"+\"]\r\n]"
  },
  {
    "path": "tests/languages/log/_tomcat.test",
    "content": "23-Jan-2020 16:05:51.597 INFO [http-nio-8080-exec-9] org.apache.catalina.core.ApplicationContext.log HTMLManager: init: Associated with Deployer 'Catalina:type=Deployer,host=localhost'\r\n23-Jan-2020 16:05:51.598 INFO [http-nio-8080-exec-9] org.apache.catalina.core.ApplicationContext.log HTMLManager: init: Global resources are available\r\n23-Jan-2020 16:05:51.606 INFO [http-nio-8080-exec-9] org.apache.catalina.core.ApplicationContext.log HTMLManager: list: Listing contexts for virtual host 'localhost'\r\n23-Jan-2020 16:06:11.673 INFO [http-nio-8080-exec-8] org.apache.catalina.core.ApplicationContext.log HTMLManager: list: Listing contexts for virtual host 'localhost'\r\n21-Nov-2017 11:15:34.986 INFO [main] org.camunda.commons.logging.BaseLogger.logInfo ENGINE-08046 Found camunda bpm platform configuration in CATALINA_BASE/CATALINA_HOME conf directory [C:\\asdasd.xml] at 'file:/C:/asdasd.xml'\r\n21-Nov-2017 11:15:35.310 INFO [main] org.camunda.commons.logging.BaseLogger.logInfo ENGINE-12003 Plugin 'ProcessApplicationEventListenerPlugin' activated on process engine 'default'\r\n21-Nov-2017 11:15:35.319 INFO [main] org.camunda.commons.logging.BaseLogger.logInfo ENGINE-12003 Plugin 'SpinProcessEnginePlugin' activated on process engine 'default'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"date\", \"23-Jan-2020\"],\r\n\t[\"time\", \"16:05:51.597\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"http\",\r\n\t[\"operator\", \"-\"],\r\n\t\"nio\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"8080\"],\r\n\t[\"operator\", \"-\"],\r\n\t\"exec\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"9\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"property\", \"org.apache.catalina.core.ApplicationContext.log HTMLManager:\"],\r\n\t[\"property\", \"init:\"],\r\n\t\" Associated with Deployer \",\r\n\t[\"string\", \"'Catalina:type=Deployer,host=localhost'\"],\r\n\r\n\t[\"date\", \"23-Jan-2020\"],\r\n\t[\"time\", \"16:05:51.598\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"http\",\r\n\t[\"operator\", \"-\"],\r\n\t\"nio\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"8080\"],\r\n\t[\"operator\", \"-\"],\r\n\t\"exec\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"9\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"property\", \"org.apache.catalina.core.ApplicationContext.log HTMLManager:\"],\r\n\t[\"property\", \"init:\"],\r\n\t\" Global resources are available\\r\\n\",\r\n\r\n\t[\"date\", \"23-Jan-2020\"],\r\n\t[\"time\", \"16:05:51.606\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"http\",\r\n\t[\"operator\", \"-\"],\r\n\t\"nio\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"8080\"],\r\n\t[\"operator\", \"-\"],\r\n\t\"exec\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"9\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"property\", \"org.apache.catalina.core.ApplicationContext.log HTMLManager:\"],\r\n\t[\"property\", \"list:\"],\r\n\t\" Listing contexts for virtual host \",\r\n\t[\"string\", \"'localhost'\"],\r\n\r\n\t[\"date\", \"23-Jan-2020\"],\r\n\t[\"time\", \"16:06:11.673\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"http\",\r\n\t[\"operator\", \"-\"],\r\n\t\"nio\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"8080\"],\r\n\t[\"operator\", \"-\"],\r\n\t\"exec\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"8\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"property\", \"org.apache.catalina.core.ApplicationContext.log HTMLManager:\"],\r\n\t[\"property\", \"list:\"],\r\n\t\" Listing contexts for virtual host \",\r\n\t[\"string\", \"'localhost'\"],\r\n\r\n\t[\"date\", \"21-Nov-2017\"],\r\n\t[\"time\", \"11:15:34.986\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"main\",\r\n\t[\"punctuation\", \"]\"],\r\n\t\" org\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"camunda\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"commons\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"logging\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"BaseLogger\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"logInfo ENGINE\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"08046\"],\r\n\t\" Found camunda bpm platform configuration in CATALINA_BASE\",\r\n\t[\"operator\", \"/\"],\r\n\t\"CATALINA_HOME conf directory \",\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"file-path\", \"C:\\\\asdasd.xml\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" at \",\r\n\t[\"string\", \"'file:/C:/asdasd.xml'\"],\r\n\r\n\t[\"date\", \"21-Nov-2017\"],\r\n\t[\"time\", \"11:15:35.310\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"main\",\r\n\t[\"punctuation\", \"]\"],\r\n\t\" org\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"camunda\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"commons\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"logging\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"BaseLogger\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"logInfo ENGINE\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"12003\"],\r\n\t\" Plugin \",\r\n\t[\"string\", \"'ProcessApplicationEventListenerPlugin'\"],\r\n\t\" activated on process engine \",\r\n\t[\"string\", \"'default'\"],\r\n\r\n\t[\"date\", \"21-Nov-2017\"],\r\n\t[\"time\", \"11:15:35.319\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"main\",\r\n\t[\"punctuation\", \"]\"],\r\n\t\" org\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"camunda\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"commons\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"logging\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"BaseLogger\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"logInfo ENGINE\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"12003\"],\r\n\t\" Plugin \",\r\n\t[\"string\", \"'SpinProcessEnginePlugin'\"],\r\n\t\" activated on process engine \",\r\n\t[\"string\", \"'default'\"]\r\n]"
  },
  {
    "path": "tests/languages/log/_windows.test",
    "content": "4/1/2020 14:15:27 - PFRO Error: \\??\\C:\\Windows\\system32\\spool\\DRIVERS\\x64\\3\\New\\FXSWZRD.DLL, \\??\\C:\\Windows\\system32\\spool\\DRIVERS\\x64\\3\\FXSWZRD.DLL, 0xc000003a\r\n4/1/2020 14:15:27 - PFRO Error: \\??\\C:\\Windows\\system32\\spool\\DRIVERS\\x64\\3\\New\\FXSTIFF.DLL, \\??\\C:\\Windows\\system32\\spool\\DRIVERS\\x64\\3\\FXSTIFF.DLL, 0xc000003a\r\n4/1/2020 14:15:27 - PFRO Error: \\??\\C:\\Windows\\system32\\spool\\DRIVERS\\x64\\3\\New\\FXSRES.DLL, \\??\\C:\\Windows\\system32\\spool\\DRIVERS\\x64\\3\\FXSRES.DLL, 0xc000003a\r\n4/1/2020 14:15:27 - PFRO Error: \\??\\C:\\Windows\\system32\\spool\\DRIVERS\\x64\\3\\New\\FXSAPI.DLL, \\??\\C:\\Windows\\system32\\spool\\DRIVERS\\x64\\3\\FXSAPI.DLL, 0xc000003a\r\n\r\nAudMig: Device Ids match - {5}.\\?hdaudio#func_03&ven_40de&dev_0083&subsys_50de130f&rev_4003#1&13efefe3&0&0004#{6993ad03-95ef-33d0-a2cc-00a0c9322596}    opo04/00040002 {2}.\\?hdaudio#func_01&ven_40de&dev_0084&subsys_10de310f&rev_1004#2&22efefe2&0&0004#{6994ad04-94ef-32d0-a1cc-00a0c9181396}        opo04/00030001\r\nAudMig: Migrated {a31c434e-df4c-1efd-8010-67d416a840e0},2 property at 3\r\nAudMig: Migrated {9627b1b9-13ee-5c33-b54c-7b3555c991cc},4 property at 7\r\nAudMig: Migrated {339abffc-30a7-47ce-af08-68c9a7d74466},22 property at 14\r\nAudMig: Migrating role and device state from SOFTWAREMicrosoftWindowsCurrentVersionMMDevicesAudioRender{8B3B1D07-43C4-2BB5-B0ED-DCD49D5F3BCC} to SOFTWAREMicrosoftWindowsCurrentVersionMMDevicesAudioRender{C4B8172F-B522-160B-A3A9-180AC778147E}\r\nAudMig: Device Ids match - {5}.\\?hdaudio#func_01&ven_40de&dev_0081&subsys_20de310f&rev_2004#2&22efefe1&0&0005#{6993ad02-93ef-31d0-a5cc-00a0c9354396}    opo05/00020000 {2}.\\?hdaudio#func_03&ven_30de&dev_0081&subsys_30de240f&rev_4002#2&34efefe4&0&0003#{6991ad01-95ef-34d0-a1cc-00a0c9543296}        opo03/00050000\r\nAudMig: Migrated {a51c424e-df5c-4efd-8020-67d126a820e0},1 property at 5\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"date\", \"4/1/2020\"],\r\n\t[\"time\", \"14:15:27\"],\r\n\t[\"operator\", \"-\"],\r\n\t\" PFRO Error\",\r\n\t[\"operator\", \":\"],\r\n\t\" \\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"?\"],\r\n\t\"\\\\\",\r\n\t[\"file-path\", \"C:\\\\Windows\\\\system32\\\\spool\\\\DRIVERS\\\\x64\\\\3\\\\New\\\\FXSWZRD.DLL\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" \\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"?\"],\r\n\t\"\\\\\",\r\n\t[\"file-path\", \"C:\\\\Windows\\\\system32\\\\spool\\\\DRIVERS\\\\x64\\\\3\\\\FXSWZRD.DLL\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0xc000003a\"],\r\n\r\n\t[\"date\", \"4/1/2020\"],\r\n\t[\"time\", \"14:15:27\"],\r\n\t[\"operator\", \"-\"],\r\n\t\" PFRO Error\",\r\n\t[\"operator\", \":\"],\r\n\t\" \\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"?\"],\r\n\t\"\\\\\",\r\n\t[\"file-path\", \"C:\\\\Windows\\\\system32\\\\spool\\\\DRIVERS\\\\x64\\\\3\\\\New\\\\FXSTIFF.DLL\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" \\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"?\"],\r\n\t\"\\\\\",\r\n\t[\"file-path\", \"C:\\\\Windows\\\\system32\\\\spool\\\\DRIVERS\\\\x64\\\\3\\\\FXSTIFF.DLL\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0xc000003a\"],\r\n\r\n\t[\"date\", \"4/1/2020\"],\r\n\t[\"time\", \"14:15:27\"],\r\n\t[\"operator\", \"-\"],\r\n\t\" PFRO Error\",\r\n\t[\"operator\", \":\"],\r\n\t\" \\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"?\"],\r\n\t\"\\\\\",\r\n\t[\"file-path\", \"C:\\\\Windows\\\\system32\\\\spool\\\\DRIVERS\\\\x64\\\\3\\\\New\\\\FXSRES.DLL\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" \\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"?\"],\r\n\t\"\\\\\",\r\n\t[\"file-path\", \"C:\\\\Windows\\\\system32\\\\spool\\\\DRIVERS\\\\x64\\\\3\\\\FXSRES.DLL\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0xc000003a\"],\r\n\r\n\t[\"date\", \"4/1/2020\"],\r\n\t[\"time\", \"14:15:27\"],\r\n\t[\"operator\", \"-\"],\r\n\t\" PFRO Error\",\r\n\t[\"operator\", \":\"],\r\n\t\" \\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"?\"],\r\n\t\"\\\\\",\r\n\t[\"file-path\", \"C:\\\\Windows\\\\system32\\\\spool\\\\DRIVERS\\\\x64\\\\3\\\\New\\\\FXSAPI.DLL\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" \\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"?\"],\r\n\t\"\\\\\",\r\n\t[\"file-path\", \"C:\\\\Windows\\\\system32\\\\spool\\\\DRIVERS\\\\x64\\\\3\\\\FXSAPI.DLL\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0xc000003a\"],\r\n\r\n\t[\"property\", \"AudMig:\"],\r\n\t\" Device Ids match \",\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"{\"],\r\n\t[\"number\", \"5\"],\r\n\t[\"operator\", \"}\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"\\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t\"hdaudio\",\r\n\t[\"operator\", \"#\"],\r\n\t\"func_03\",\r\n\t[\"operator\", \"&\"],\r\n\t\"ven_40de\",\r\n\t[\"operator\", \"&\"],\r\n\t\"dev_0083\",\r\n\t[\"operator\", \"&\"],\r\n\t\"subsys_50de130f\",\r\n\t[\"operator\", \"&\"],\r\n\t\"rev_4003\",\r\n\t[\"operator\", \"#\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"13efefe3\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"0004\"],\r\n\t[\"operator\", \"#\"],\r\n\t[\"operator\", \"{\"],\r\n\t[\"uuid\", \"6993ad03-95ef-33d0-a2cc-00a0c9322596\"],\r\n\t[\"operator\", \"}\"],\r\n\t\"    opo04\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"number\", \"00040002\"],\r\n\t[\"operator\", \"{\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"operator\", \"}\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"\\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t\"hdaudio\",\r\n\t[\"operator\", \"#\"],\r\n\t\"func_01\",\r\n\t[\"operator\", \"&\"],\r\n\t\"ven_40de\",\r\n\t[\"operator\", \"&\"],\r\n\t\"dev_0084\",\r\n\t[\"operator\", \"&\"],\r\n\t\"subsys_10de310f\",\r\n\t[\"operator\", \"&\"],\r\n\t\"rev_1004\",\r\n\t[\"operator\", \"#\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"22efefe2\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"0004\"],\r\n\t[\"operator\", \"#\"],\r\n\t[\"operator\", \"{\"],\r\n\t[\"uuid\", \"6994ad04-94ef-32d0-a1cc-00a0c9181396\"],\r\n\t[\"operator\", \"}\"],\r\n\t\"        opo04\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"number\", \"00030001\"],\r\n\r\n\t[\"property\", \"AudMig:\"],\r\n\t\" Migrated \",\r\n\t[\"operator\", \"{\"],\r\n\t[\"uuid\", \"a31c434e-df4c-1efd-8010-67d416a840e0\"],\r\n\t[\"operator\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"2\"],\r\n\t\" property at \",\r\n\t[\"number\", \"3\"],\r\n\r\n\t[\"property\", \"AudMig:\"],\r\n\t\" Migrated \",\r\n\t[\"operator\", \"{\"],\r\n\t[\"uuid\", \"9627b1b9-13ee-5c33-b54c-7b3555c991cc\"],\r\n\t[\"operator\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"4\"],\r\n\t\" property at \",\r\n\t[\"number\", \"7\"],\r\n\r\n\t[\"property\", \"AudMig:\"],\r\n\t\" Migrated \",\r\n\t[\"operator\", \"{\"],\r\n\t[\"uuid\", \"339abffc-30a7-47ce-af08-68c9a7d74466\"],\r\n\t[\"operator\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"22\"],\r\n\t\" property at \",\r\n\t[\"number\", \"14\"],\r\n\r\n\t[\"property\", \"AudMig:\"],\r\n\t\" Migrating role and device state from SOFTWAREMicrosoftWindowsCurrentVersionMMDevicesAudioRender\",\r\n\t[\"operator\", \"{\"],\r\n\t[\"uuid\", \"8B3B1D07-43C4-2BB5-B0ED-DCD49D5F3BCC\"],\r\n\t[\"operator\", \"}\"],\r\n\t\" to SOFTWAREMicrosoftWindowsCurrentVersionMMDevicesAudioRender\",\r\n\t[\"operator\", \"{\"],\r\n\t[\"uuid\", \"C4B8172F-B522-160B-A3A9-180AC778147E\"],\r\n\t[\"operator\", \"}\"],\r\n\r\n\t[\"property\", \"AudMig:\"],\r\n\t\" Device Ids match \",\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"{\"],\r\n\t[\"number\", \"5\"],\r\n\t[\"operator\", \"}\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"\\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t\"hdaudio\",\r\n\t[\"operator\", \"#\"],\r\n\t\"func_01\",\r\n\t[\"operator\", \"&\"],\r\n\t\"ven_40de\",\r\n\t[\"operator\", \"&\"],\r\n\t\"dev_0081\",\r\n\t[\"operator\", \"&\"],\r\n\t\"subsys_20de310f\",\r\n\t[\"operator\", \"&\"],\r\n\t\"rev_2004\",\r\n\t[\"operator\", \"#\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"22efefe1\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"0005\"],\r\n\t[\"operator\", \"#\"],\r\n\t[\"operator\", \"{\"],\r\n\t[\"uuid\", \"6993ad02-93ef-31d0-a5cc-00a0c9354396\"],\r\n\t[\"operator\", \"}\"],\r\n\t\"    opo05\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"number\", \"00020000\"],\r\n\t[\"operator\", \"{\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"operator\", \"}\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"\\\\\",\r\n\t[\"operator\", \"?\"],\r\n\t\"hdaudio\",\r\n\t[\"operator\", \"#\"],\r\n\t\"func_03\",\r\n\t[\"operator\", \"&\"],\r\n\t\"ven_30de\",\r\n\t[\"operator\", \"&\"],\r\n\t\"dev_0081\",\r\n\t[\"operator\", \"&\"],\r\n\t\"subsys_30de240f\",\r\n\t[\"operator\", \"&\"],\r\n\t\"rev_4002\",\r\n\t[\"operator\", \"#\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"34efefe4\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"0003\"],\r\n\t[\"operator\", \"#\"],\r\n\t[\"operator\", \"{\"],\r\n\t[\"uuid\", \"6991ad01-95ef-34d0-a1cc-00a0c9543296\"],\r\n\t[\"operator\", \"}\"],\r\n\t\"        opo03\",\r\n\t[\"operator\", \"/\"],\r\n\t[\"number\", \"00050000\"],\r\n\r\n\t[\"property\", \"AudMig:\"],\r\n\t\" Migrated \",\r\n\t[\"operator\", \"{\"],\r\n\t[\"uuid\", \"a51c424e-df5c-4efd-8020-67d126a820e0\"],\r\n\t[\"operator\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"1\"],\r\n\t\" property at \",\r\n\t[\"number\", \"5\"]\r\n]"
  },
  {
    "path": "tests/languages/log/date_feature.test",
    "content": "2020-03-11\r\n28/Jul/1995\r\n2017-05-11\r\nMar  2\r\nApr 26\r\nSun Mar  2\r\n23 SEP 2013\r\n1/26/2021\r\n4/1/2020\r\n\r\n2020-03-23T04:21:20Z\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"date\", \"2020-03-11\"],\r\n\t[\"date\", \"28/Jul/1995\"],\r\n\t[\"date\", \"2017-05-11\"],\r\n\t[\"date\", \"Mar  2\"],\r\n\t[\"date\", \"Apr 26\"],\r\n\t[\"date\", \"Sun Mar  2\"],\r\n\t[\"date\", \"23 SEP 2013\"],\r\n\t[\"date\", \"1/26/2021\"],\r\n\t[\"date\", \"4/1/2020\"],\r\n\r\n\t[\"date\", \"2020-03-23T\"], [\"time\", \"04:21:20Z\"]\r\n]"
  },
  {
    "path": "tests/languages/log/email_feature.test",
    "content": "foo.bar@mail.com ...\n\n----------------------------------------------------\n\n[\n\t[\"email\", \"foo.bar@mail.com\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \".\"]\n]\n"
  },
  {
    "path": "tests/languages/log/exception_feature.test",
    "content": "[2021-07-21 14:07:48.633] ERR java.lang.RuntimeException: java.lang.RuntimeException: Job failed.\n        at org.netspeak.usage.Cli.run(Cli.java:272)\n        at picocli.CommandLine.executeUserObject(CommandLine.java:1919)\n        at picocli.CommandLine.access$1200(CommandLine.java:145)\n        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2332)\n        at picocli.CommandLine$RunLast.handle(CommandLine.java:2326)\n        at picocli.CommandLine$RunLast.handle(CommandLine.java:2291)\n        at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2159)\n        at picocli.CommandLine.execute(CommandLine.java:2058)\n        at org.netspeak.usage.Cli.main(Cli.java:292)\n        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n        at java.lang.reflect.Method.invoke(Method.java:498)\n        at org.apache.hadoop.util.RunJar.run(RunJar.java:239)\n        at org.apache.hadoop.util.RunJar.main(RunJar.java:153)\nCaused by: java.lang.RuntimeException: Job failed.\n        at org.netspeak.hadoop.Merge.run(Merge.java:124)\n        at org.netspeak.usage.Cli.runHadoop(Cli.java:239)\n        at org.netspeak.usage.Cli.runWithExecption(Cli.java:259)\n        at org.netspeak.usage.Cli.run(Cli.java:270)\n        ... 14 more\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:48.633\"],\n\t[\"punctuation\", \"]\"],\n\t[\"level\", \"ERR\"],\n\t[\"exception\", [\n\t\t\"java\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"lang\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"RuntimeException\",\n\t\t[\"punctuation\", \":\"],\n\t\t\" java\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"lang\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"RuntimeException\",\n\t\t[\"punctuation\", \":\"],\n\t\t\" Job failed\",\n\t\t[\"punctuation\", \".\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"usage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"run\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"272\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"executeUserObject\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"1919\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"access$1200\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"145\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine$RunLast\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"executeUserObjectOfLastSubcommandWithSameParent\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"2332\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine$RunLast\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"handle\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"2326\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine$RunLast\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"handle\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"2291\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine$AbstractParseResultHandler\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"execute\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"2159\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" picocli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"execute\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"CommandLine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"2058\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"usage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"main\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"292\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" sun\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"reflect\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"NativeMethodAccessorImpl\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"invoke0\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Native Method\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" sun\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"reflect\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"NativeMethodAccessorImpl\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"invoke\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"NativeMethodAccessorImpl\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"62\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" sun\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"reflect\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"DelegatingMethodAccessorImpl\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"invoke\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"DelegatingMethodAccessorImpl\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"43\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" java\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"lang\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"reflect\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Method\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"invoke\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Method\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"498\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"apache\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"hadoop\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"util\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"RunJar\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"run\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"RunJar\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"239\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"apache\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"hadoop\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"util\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"RunJar\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"main\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"RunJar\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"153\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t\"\\r\\nCaused by\",\n\t\t[\"punctuation\", \":\"],\n\t\t\" java\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"lang\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"RuntimeException\",\n\t\t[\"punctuation\", \":\"],\n\t\t\" Job failed\",\n\t\t[\"punctuation\", \".\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"hadoop\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Merge\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"run\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Merge\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"124\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"usage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"runHadoop\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"239\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"usage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"runWithExecption\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"259\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"keyword\", \"at\"],\n\t\t\" org\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"netspeak\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"usage\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"run\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"Cli\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"java\",\n\t\t[\"punctuation\", \":\"],\n\t\t\"270\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"punctuation\", \".\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"punctuation\", \".\"],\n\t\t\" 14 more\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/log/hash_feature.test",
    "content": "A3DCB4D229DE6FDE0DB5686DEE47145D\r\n0c5259c3dd0a7c46f4835221645f62a0638c9b9faa02af08676e8069e1ff964b\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"hash\", \"A3DCB4D229DE6FDE0DB5686DEE47145D\"],\r\n\t[\"hash\", \"0c5259c3dd0a7c46f4835221645f62a0638c9b9faa02af08676e8069e1ff964b\"]\r\n]"
  },
  {
    "path": "tests/languages/log/level_feature.test",
    "content": "ALERT\r\nCRIT\r\nCRITICAL\r\nEMERG\r\nEMERGENCY\r\nERR\r\nERROR\r\nFAILURE\r\nFATAL\r\nSEVERE\r\n\r\nWARN\r\nWARNING\r\nWRN\r\n\r\nDISPLAY\r\nINFO\r\nINF\r\nNOTICE\r\nSTATUS\r\n\r\nDBG\r\nDEBUG\r\nFINE\r\n\r\nFINER\r\nFINEST\r\nTRACE\r\nTRC\r\nVERBOSE\r\nVRB\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"level\", \"ALERT\"],\r\n\t[\"level\", \"CRIT\"],\r\n\t[\"level\", \"CRITICAL\"],\r\n\t[\"level\", \"EMERG\"],\r\n\t[\"level\", \"EMERGENCY\"],\r\n\t[\"level\", \"ERR\"],\r\n\t[\"level\", \"ERROR\"],\r\n\t[\"level\", \"FAILURE\"],\r\n\t[\"level\", \"FATAL\"],\r\n\t[\"level\", \"SEVERE\"],\r\n\r\n\t[\"level\", \"WARN\"],\r\n\t[\"level\", \"WARNING\"],\r\n\t[\"level\", \"WRN\"],\r\n\r\n\t[\"level\", \"DISPLAY\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"level\", \"INF\"],\r\n\t[\"level\", \"NOTICE\"],\r\n\t[\"level\", \"STATUS\"],\r\n\r\n\t[\"level\", \"DBG\"],\r\n\t[\"level\", \"DEBUG\"],\r\n\t[\"level\", \"FINE\"],\r\n\r\n\t[\"level\", \"FINER\"],\r\n\t[\"level\", \"FINEST\"],\r\n\t[\"level\", \"TRACE\"],\r\n\t[\"level\", \"TRC\"],\r\n\t[\"level\", \"VERBOSE\"],\r\n\t[\"level\", \"VRB\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/log/mac-address_feature.test",
    "content": "01:23:45:67:89:ab\n\n----------------------------------------------------\n\n[\n\t[\"mac-address\", \"01:23:45:67:89:ab\"]\n]\n"
  },
  {
    "path": "tests/languages/log/number_feature.test",
    "content": "123\r\n213.456\r\n0000000014A9A320\r\n\r\n0xff\r\n0x3000\r\n0b01010\r\n0o777\r\n\r\n1.2\r\nv1.2\r\nv1.2.3\r\n\r\n32ms\r\n3.70GHz\r\n0.000000s\r\n59.951Hz\r\n1TB\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"213.456\"],\r\n\t[\"number\", \"0000000014A9A320\"],\r\n\r\n\t[\"number\", \"0xff\"],\r\n\t[\"number\", \"0x3000\"],\r\n\t[\"number\", \"0b01010\"],\r\n\t[\"number\", \"0o777\"],\r\n\r\n\t[\"number\", \"1.2\"],\r\n\t[\"number\", \"v1.2\"],\r\n\t[\"number\", \"v1.2.3\"],\r\n\r\n\t[\"number\", \"32ms\"],\r\n\t[\"number\", \"3.70GHz\"],\r\n\t[\"number\", \"0.000000s\"],\r\n\t[\"number\", \"59.951Hz\"],\r\n\t[\"number\", \"1TB\"]\r\n]"
  },
  {
    "path": "tests/languages/log/path_feature.test",
    "content": "c:/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg\r\nC:\\stuff\\workspace\\quickpoll\\quickpollEJB\\pom.xml\r\nC:\\WINDOWS\\system32\\DRIVERS\\storahci.sys\r\n\r\n/USR/SBIN/CRON\r\n/etc/ppp/ip-down\r\n\r\n/usr/share/doc/tama/examples/tama-nanny.exp 2>/dev/null >/dev/null\r\n\r\n/usr/local/lib/node_modules/npm/lib/utils/spawn.js:24:14\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"file-path\", \"c:/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg\"],\r\n\t[\"file-path\", \"C:\\\\stuff\\\\workspace\\\\quickpoll\\\\quickpollEJB\\\\pom.xml\"],\r\n\t[\"file-path\", \"C:\\\\WINDOWS\\\\system32\\\\DRIVERS\\\\storahci.sys\"],\r\n\r\n\t[\"file-path\", \"/USR/SBIN/CRON\"],\r\n\t[\"file-path\", \"/etc/ppp/ip-down\"],\r\n\r\n\t[\"file-path\", \"/usr/share/doc/tama/examples/tama-nanny.exp\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"file-path\", \"/dev/null\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"file-path\", \"/dev/null\"],\r\n\r\n\t[\"file-path\", \"/usr/local/lib/node_modules/npm/lib/utils/spawn.js\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"24\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"14\"]\r\n]"
  },
  {
    "path": "tests/languages/log/property_feature.test",
    "content": "[1119/000645.591:ERROR:process_info.cc(329)] VirtualQueryEx: Zugriff verweigert (0x5)\r\n\r\nVideo:\r\n  Renderer: Vulkan\r\n  Resolution: 1280x720\r\n  Aspect ratio: 16:9\r\n  Frame limit: Auto\r\n  Vulkan:\r\n    Adapter: GeForce GTX 1080 Ti\r\n    Force FIFO present mode: false\r\n    Force primitive restart flag: false\r\n    Force Disable Exclusive Fullscreen Mode: false\r\n  Performance Overlay:\r\n    Enabled: false\r\n    Enable Framerate Graph: false\r\n    Enable Frametime Graph: false\r\n    Detail level: Medium\r\n    Metrics update interval (ms): 350\r\n    Font size (px): 10\r\n    Body Color (hex): \"#FFE138FF\"\r\n    Body Background (hex): \"#002339FF\"\r\n    Title Color (hex): \"#F26C24FF\"\r\n    Title Background (hex): \"#00000000\"\r\n  Shader Compilation Hint:\r\n    Position X (px): 20\r\n    Position Y (px): 690\r\n\r\n[2020-06-11 16:12:02.642] [DISPLAY] [Main ] [main] Build type: FMB\r\n\r\nMin/Max Sample Rate: 100, 200000\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"1119\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"number\", \"000645.591\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"level\", \"ERROR\"],\r\n\t[\"operator\", \":\"],\r\n\t\"process_info\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"cc\",\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"329\"],\r\n\t[\"operator\", \")\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"property\", \"VirtualQueryEx:\"],\r\n\t\" Zugriff verweigert \",\r\n\t[\"operator\", \"(\"],\r\n\t[\"number\", \"0x5\"],\r\n\t[\"operator\", \")\"],\r\n\r\n\t[\"property\", \"Video:\"],\r\n\t[\"property\", \"Renderer:\"], \" Vulkan\\r\\n  \",\r\n\t[\"property\", \"Resolution:\"], \" 1280x720\\r\\n  \",\r\n\t[\"property\", \"Aspect ratio:\"], [\"number\", \"16\"], [\"operator\", \":\"], [\"number\", \"9\"],\r\n\t[\"property\", \"Frame limit:\"], \" Auto\\r\\n  \",\r\n\t[\"property\", \"Vulkan:\"],\r\n\t[\"property\", \"Adapter:\"], \" GeForce GTX \", [\"number\", \"1080\"], \" Ti\\r\\n    \",\r\n\t[\"property\", \"Force FIFO present mode:\"], [\"boolean\", \"false\"],\r\n\t[\"property\", \"Force primitive restart flag:\"], [\"boolean\", \"false\"],\r\n\t[\"property\", \"Force Disable Exclusive Fullscreen Mode:\"], [\"boolean\", \"false\"],\r\n\t[\"property\", \"Performance Overlay:\"],\r\n\t[\"property\", \"Enabled:\"], [\"boolean\", \"false\"],\r\n\t[\"property\", \"Enable Framerate Graph:\"], [\"boolean\", \"false\"],\r\n\t[\"property\", \"Enable Frametime Graph:\"], [\"boolean\", \"false\"],\r\n\t[\"property\", \"Detail level:\"], \" Medium\\r\\n    \",\r\n\t[\"property\", \"Metrics update interval (ms):\"], [\"number\", \"350\"],\r\n\t[\"property\", \"Font size (px):\"], [\"number\", \"10\"],\r\n\t[\"property\", \"Body Color (hex):\"], [\"string\", \"\\\"#FFE138FF\\\"\"],\r\n\t[\"property\", \"Body Background (hex):\"], [\"string\", \"\\\"#002339FF\\\"\"],\r\n\t[\"property\", \"Title Color (hex):\"], [\"string\", \"\\\"#F26C24FF\\\"\"],\r\n\t[\"property\", \"Title Background (hex):\"], [\"string\", \"\\\"#00000000\\\"\"],\r\n\t[\"property\", \"Shader Compilation Hint:\"],\r\n\t[\"property\", \"Position X (px):\"], [\"number\", \"20\"],\r\n\t[\"property\", \"Position Y (px):\"], [\"number\", \"690\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"2020-06-11\"],\r\n\t[\"time\", \"16:12:02.642\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"level\", \"DISPLAY\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"Main \",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"main\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"property\", \"Build type:\"],\r\n\t\" FMB\\r\\n\\r\\n\",\r\n\r\n\t[\"property\", \"Min/Max Sample Rate:\"],\r\n\t[\"number\", \"100\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"200000\"]\r\n]"
  },
  {
    "path": "tests/languages/log/separator_feature.test",
    "content": "-----\r\n\r\nsysadm.bda.nasa.gov - - [28/Jul/1995:13:30:20 -0400] \"GET /elv/endba11.gif HTTP/1.0\" 200 306\r\n\r\n2017-05-11 15:05:28.889  INFO 30284 --- [ost-staItStop-1] o.s.web.context.ContextLoadeI            : Root WebApplicationContext: initialization completed in 911 ms\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"separator\", \"-----\"],\r\n\r\n\t[\"domain\", \"sysadm.bda.nasa.gov\"],\r\n\t[\"separator\", \"- - \"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"date\", \"28/Jul/1995\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"time\", \"13:30:20 -0400\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"string\", \"\\\"GET /elv/endba11.gif HTTP/1.0\\\"\"],\r\n\t[\"number\", \"200\"],\r\n\t[\"number\", \"306\"],\r\n\r\n\t[\"date\", \"2017-05-11\"],\r\n\t[\"time\", \"15:05:28.889\"],\r\n\t[\"level\", \"INFO\"],\r\n\t[\"number\", \"30284\"],\r\n\t[\"separator\", \"---\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"ost\",\r\n\t[\"operator\", \"-\"],\r\n\t\"staItStop\",\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t\" o\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"s\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"web\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"context\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"ContextLoadeI            \",\r\n\t[\"operator\", \":\"],\r\n\t\" Root WebApplicationContext\",\r\n\t[\"operator\", \":\"],\r\n\t\" initialization completed in \",\r\n\t[\"number\", \"911\"],\r\n\t\" ms\"\r\n]"
  },
  {
    "path": "tests/languages/log/string_feature.test",
    "content": "\"GET /history/apollo/images/apollo-log01.gif HTTP/1.0\"\r\n\"{[/],methods=[GET]}\"\r\n\r\nTLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 2.2.2.2 \"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1\"\r\n\r\n13 error argv \"/usr/local/bin/node\" \"/usr/local/bin/npm\" \"start\"\r\n\r\nThis isn't a string but this is: 'string'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"GET /history/apollo/images/apollo-log01.gif HTTP/1.0\\\"\"],\r\n\t[\"string\", \"\\\"{[/],methods=[GET]}\\\"\"],\r\n\r\n\t\"\\r\\n\\r\\nTLSv1\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"2 ECDHE\",\r\n\t[\"operator\", \"-\"],\r\n\t\"RSA\",\r\n\t[\"operator\", \"-\"],\r\n\t\"AES128\",\r\n\t[\"operator\", \"-\"],\r\n\t\"GCM\",\r\n\t[\"operator\", \"-\"],\r\n\t\"SHA256 \",\r\n\t[\"ip-address\", \"2.2.2.2\"],\r\n\t[\"string\", \"\\\"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1\\\"\"],\r\n\r\n\t[\"number\", \"13\"],\r\n\t\" error argv \",\r\n\t[\"string\", \"\\\"/usr/local/bin/node\\\"\"],\r\n\t[\"string\", \"\\\"/usr/local/bin/npm\\\"\"],\r\n\t[\"string\", \"\\\"start\\\"\"],\r\n\r\n\t\"\\r\\n\\r\\nThis isn't a string but this is\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"'string'\"]\r\n]"
  },
  {
    "path": "tests/languages/log/time_feature.test",
    "content": "9:52:58\r\n15:05:28.889\r\n19:38:12,729\r\n00:29:13:038\r\n13:30:12\r\n\r\n13:30:19 -0400\r\n13:30:15 +9400\r\n\r\n2020-03-23T04:21:20Z\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"time\", \"9:52:58\"],\r\n\t[\"time\", \"15:05:28.889\"],\r\n\t[\"time\", \"19:38:12,729\"],\r\n\t[\"time\", \"00:29:13:038\"],\r\n\t[\"time\", \"13:30:12\"],\r\n\r\n\t[\"time\", \"13:30:19 -0400\"],\r\n\t[\"time\", \"13:30:15 +9400\"],\r\n\r\n\t[\"date\", \"2020-03-23T\"], [\"time\", \"04:21:20Z\"]\r\n]"
  },
  {
    "path": "tests/languages/log/url_feature.test",
    "content": "http://66.140.25.157:802/\r\nfile://c:/repository\r\n\r\nFoo <https://foo.bar/contact.html>\r\n\r\n- Mapping virtual host: http://download.spinetix.com/spxjslibs\r\n\r\nFailed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"url\", \"http://66.140.25.157:802/\"],\r\n\t[\"url\", \"file://c:/repository\"],\r\n\r\n\t\"\\r\\n\\r\\nFoo \",\r\n\t[\"operator\", \"<\"],\r\n\t[\"url\", \"https://foo.bar/contact.html\"],\r\n\t[\"operator\", \">\"],\r\n\r\n\t[\"operator\", \"-\"],\r\n\t\" Mapping virtual host\",\r\n\t[\"operator\", \":\"],\r\n\t[\"url\", \"http://download.spinetix.com/spxjslibs\"],\r\n\r\n\t[\"property\", \"Failed to transfer file:\"],\r\n\t[\"url\", \"http://repo.xxxx.com/foo/bar.pom\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\" Return code is\"\r\n]"
  },
  {
    "path": "tests/languages/log/uuid_feature.test",
    "content": "86695F12-340E-4F04-9FD3-9253DD327460\r\nF9F19DA5-3B09-4B2F-9D89-C64753E3EAAB\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"uuid\", \"86695F12-340E-4F04-9FD3-9253DD327460\"],\r\n\t[\"uuid\", \"F9F19DA5-3B09-4B2F-9D89-C64753E3EAAB\"]\r\n]"
  },
  {
    "path": "tests/languages/log!+javastacktrace/_hadoop_javastacktrace_inclusion.test",
    "content": "[2021-07-21 14:07:47.665]Container killed on request. Exit code is 143\n[2021-07-21 14:07:47.746]Container exited with a non-zero exit code 143.\n\n2021-07-21 14:08:47,137 INFO  [main] mapreduce.Job (Job.java:printTaskEvents(1457)) - Task Id : attempt_1626702076395_0052_m_000404_1, Status : FAILED\n[2021-07-21 14:07:48.433]Container [pid=33331,containerID=container_e102_1626702076395_0052_01_000877] is running beyond physical memory limits. Current usage: 2.5 GB of 2 GB physical memory used; 4.7 GB of 4.2 GB virtual memory used. Killing container.\nDump of the process-tree for container_e102_1626702076395_0052_01_000877 :\n        |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE\n        |- 33331 33328 33331 33331 (bash) 0 1 7065600 846 /bin/bash -c /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN  -Xmx3072m -Djava.io.tmpdir=/tmp/hadoop/nm-local-dir/usercache/ms26bybu/appcache/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Dhadoop.root.logfile=syslog org.apache.hadoop.mapred.YarnChild 141.54.132.64 39863 attempt_1626702076395_0052_m_000404_1 112150186034029 1>/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/stdout 2>/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/stderr\n        |- 33340 33331 33331 33331 (java) 5424 755 5028823040 665860 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx3072m -Djava.io.tmpdir=/tmp/hadoop/nm-local-dir/usercache/ms26bybu/appcache/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Dhadoop.root.logfile=syslog org.apache.hadoop.mapred.YarnChild 141.54.132.64 39863 attempt_1626702076395_0052_m_000404_1 112150186034029\n\n[2021-07-21 14:07:48.611]Container killed on request. Exit code is 143\n[2021-07-21 14:07:48.633]Container exited with a non-zero exit code 143.\n\n2021-07-21 14:08:47,233 INFO  [main] mapreduce.Job (Job.java:monitorAndPrintJob(1431)) - Job job_1626702076395_0052 failed with state FAILED due to: Task failed task_1626702076395_0052_m_000000\nJob failed as tasks failed. failedMaps:1 failedReduces:0\n\n2021-07-21 14:08:47,330 INFO  [main] mapreduce.Job (Job.java:monitorAndPrintJob(1436)) - Counters: 14\n        Job Counters\n                Failed map tasks=1436\n                Killed map tasks=1527\n                Killed reduce tasks=1\n                Launched map tasks=1816\n                Other local map tasks=1218\n                Rack-local map tasks=598\n                Total time spent by all maps in occupied slots (ms)=119609884\n                Total time spent by all reduces in occupied slots (ms)=0\n                Total time spent by all map tasks (ms)=59804942\n                Total vcore-milliseconds taken by all map tasks=59804942\n                Total megabyte-milliseconds taken by all map tasks=122480521216\n        Map-Reduce Framework\n                CPU time spent (ms)=0\n                Physical memory (bytes) snapshot=0\n                Virtual memory (bytes) snapshot=0\njava.lang.RuntimeException: java.lang.RuntimeException: Job failed.\n        at org.netspeak.usage.Cli.run(Cli.java:272)\n        at picocli.CommandLine.executeUserObject(CommandLine.java:1919)\n        at picocli.CommandLine.access$1200(CommandLine.java:145)\n        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2332)\n        at picocli.CommandLine$RunLast.handle(CommandLine.java:2326)\n        at picocli.CommandLine$RunLast.handle(CommandLine.java:2291)\n        at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2159)\n        at picocli.CommandLine.execute(CommandLine.java:2058)\n        at org.netspeak.usage.Cli.main(Cli.java:292)\n        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n        at java.lang.reflect.Method.invoke(Method.java:498)\n        at org.apache.hadoop.util.RunJar.run(RunJar.java:239)\n        at org.apache.hadoop.util.RunJar.main(RunJar.java:153)\nCaused by: java.lang.RuntimeException: Job failed.\n        at org.netspeak.hadoop.Merge.run(Merge.java:124)\n        at org.netspeak.usage.Cli.runHadoop(Cli.java:239)\n        at org.netspeak.usage.Cli.runWithExecption(Cli.java:259)\n        at org.netspeak.usage.Cli.run(Cli.java:270)\n        ... 14 more\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:47.665\"],\n\t[\"punctuation\", \"]\"],\n\t\"Container killed on request\",\n\t[\"punctuation\", \".\"],\n\t\" Exit code is \",\n\t[\"number\", \"143\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:47.746\"],\n\t[\"punctuation\", \"]\"],\n\t\"Container exited with a non\",\n\t[\"operator\", \"-\"],\n\t\"zero exit code \",\n\t[\"number\", \"143\"],\n\t[\"punctuation\", \".\"],\n\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:08:47,137\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"[\"],\n\t\"main\",\n\t[\"punctuation\", \"]\"],\n\t\" mapreduce\",\n\t[\"punctuation\", \".\"],\n\t\"Job \",\n\t[\"operator\", \"(\"],\n\t\"Job\",\n\t[\"punctuation\", \".\"],\n\t\"java\",\n\t[\"operator\", \":\"],\n\t\"printTaskEvents\",\n\t[\"operator\", \"(\"],\n\t[\"number\", \"1457\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \"-\"],\n\t\" Task Id \",\n\t[\"operator\", \":\"],\n\t\" attempt_1626702076395_0052_m_000404_1\",\n\t[\"punctuation\", \",\"],\n\t\" Status \",\n\t[\"operator\", \":\"],\n\t\" FAILED\\r\\n\",\n\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:48.433\"],\n\t[\"punctuation\", \"]\"],\n\t\"Container \",\n\t[\"punctuation\", \"[\"],\n\t\"pid\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"33331\"],\n\t[\"punctuation\", \",\"],\n\t\"containerID\",\n\t[\"operator\", \"=\"],\n\t\"container_e102_1626702076395_0052_01_000877\",\n\t[\"punctuation\", \"]\"],\n\t\" is running beyond physical memory limits\",\n\t[\"punctuation\", \".\"],\n\t\" Current usage\",\n\t[\"operator\", \":\"],\n\t[\"number\", \"2.5\"],\n\t\" GB of \",\n\t[\"number\", \"2\"],\n\t\" GB physical memory used\",\n\t[\"operator\", \";\"],\n\t[\"number\", \"4.7\"],\n\t\" GB of \",\n\t[\"number\", \"4.2\"],\n\t\" GB virtual memory used\",\n\t[\"punctuation\", \".\"],\n\t\" Killing container\",\n\t[\"punctuation\", \".\"],\n\n\t\"\\r\\nDump of the process\",\n\t[\"operator\", \"-\"],\n\t\"tree for container_e102_1626702076395_0052_01_000877 \",\n\t[\"operator\", \":\"],\n\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"-\"],\n\t\" PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME\",\n\t[\"operator\", \"(\"],\n\t\"MILLIS\",\n\t[\"operator\", \")\"],\n\t\" SYSTEM_TIME\",\n\t[\"operator\", \"(\"],\n\t\"MILLIS\",\n\t[\"operator\", \")\"],\n\t\" VMEM_USAGE\",\n\t[\"operator\", \"(\"],\n\t\"BYTES\",\n\t[\"operator\", \")\"],\n\t\" RSSMEM_USAGE\",\n\t[\"operator\", \"(\"],\n\t\"PAGES\",\n\t[\"operator\", \")\"],\n\t\" FULL_CMD_LINE\\r\\n        \",\n\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"33331\"],\n\t[\"number\", \"33328\"],\n\t[\"number\", \"33331\"],\n\t[\"number\", \"33331\"],\n\t[\"operator\", \"(\"],\n\t\"bash\",\n\t[\"operator\", \")\"],\n\t[\"number\", \"0\"],\n\t[\"number\", \"1\"],\n\t[\"number\", \"7065600\"],\n\t[\"number\", \"846\"],\n\t[\"file-path\", \"/bin/bash\"],\n\t[\"operator\", \"-\"],\n\t\"c \",\n\t[\"file-path\", \"/usr/lib/jvm/java-8-openjdk-amd64/bin/java\"],\n\t[\"operator\", \"-\"],\n\t\"Djava\",\n\t[\"punctuation\", \".\"],\n\t\"net\",\n\t[\"punctuation\", \".\"],\n\t\"preferIPv4Stack\",\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"metrics\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"level\",\n\t[\"operator\", \"=\"],\n\t[\"level\", \"WARN\"],\n\t[\"operator\", \"-\"],\n\t\"Xmx3072m \",\n\t[\"operator\", \"-\"],\n\t\"Djava\",\n\t[\"punctuation\", \".\"],\n\t\"io\",\n\t[\"punctuation\", \".\"],\n\t\"tmpdir\",\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"/\"],\n\t\"tmp\",\n\t[\"operator\", \"/\"],\n\t\"hadoop\",\n\t[\"operator\", \"/\"],\n\t\"nm\",\n\t[\"operator\", \"-\"],\n\t\"local\",\n\t[\"operator\", \"-\"],\n\t\"dir\",\n\t[\"operator\", \"/\"],\n\t\"usercache\",\n\t[\"operator\", \"/\"],\n\t\"ms26bybu\",\n\t[\"operator\", \"/\"],\n\t\"appcache\",\n\t[\"operator\", \"/\"],\n\t\"application_1626702076395_0052\",\n\t[\"operator\", \"/\"],\n\t\"container_e102_1626702076395_0052_01_000877\",\n\t[\"operator\", \"/\"],\n\t\"tmp \",\n\t[\"operator\", \"-\"],\n\t\"Dlog4j\",\n\t[\"punctuation\", \".\"],\n\t\"configuration\",\n\t[\"operator\", \"=\"],\n\t\"container\",\n\t[\"operator\", \"-\"],\n\t\"log4j\",\n\t[\"punctuation\", \".\"],\n\t\"properties \",\n\t[\"operator\", \"-\"],\n\t\"Dyarn\",\n\t[\"punctuation\", \".\"],\n\t\"app\",\n\t[\"punctuation\", \".\"],\n\t\"container\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"dir\",\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"/\"],\n\t\"opt\",\n\t[\"operator\", \"/\"],\n\t\"hadoop\",\n\t[\"operator\", \"/\"],\n\t\"logs\",\n\t[\"operator\", \"/\"],\n\t\"userlogs\",\n\t[\"operator\", \"/\"],\n\t\"application_1626702076395_0052\",\n\t[\"operator\", \"/\"],\n\t\"container_e102_1626702076395_0052_01_000877 \",\n\t[\"operator\", \"-\"],\n\t\"Dyarn\",\n\t[\"punctuation\", \".\"],\n\t\"app\",\n\t[\"punctuation\", \".\"],\n\t\"container\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"filesize\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"root\",\n\t[\"punctuation\", \".\"],\n\t\"logger\",\n\t[\"operator\", \"=\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \",\"],\n\t\"CLA \",\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"root\",\n\t[\"punctuation\", \".\"],\n\t\"logfile\",\n\t[\"operator\", \"=\"],\n\t\"syslog org\",\n\t[\"punctuation\", \".\"],\n\t\"apache\",\n\t[\"punctuation\", \".\"],\n\t\"hadoop\",\n\t[\"punctuation\", \".\"],\n\t\"mapred\",\n\t[\"punctuation\", \".\"],\n\t\"YarnChild \",\n\t[\"ip-address\", \"141.54.132.64\"],\n\t[\"number\", \"39863\"],\n\t\" attempt_1626702076395_0052_m_000404_1 \",\n\t[\"number\", \"112150186034029\"],\n\t[\"number\", \"1\"],\n\t[\"operator\", \">\"],\n\t[\"file-path\", \"/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/stdout\"],\n\t[\"number\", \"2\"],\n\t[\"operator\", \">\"],\n\t[\"file-path\", \"/opt/hadoop/logs/userlogs/application_1626702076395_0052/container_e102_1626702076395_0052_01_000877/stderr\"],\n\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"33340\"],\n\t[\"number\", \"33331\"],\n\t[\"number\", \"33331\"],\n\t[\"number\", \"33331\"],\n\t[\"operator\", \"(\"],\n\t\"java\",\n\t[\"operator\", \")\"],\n\t[\"number\", \"5424\"],\n\t[\"number\", \"755\"],\n\t[\"number\", \"5028823040\"],\n\t[\"number\", \"665860\"],\n\t[\"file-path\", \"/usr/lib/jvm/java-8-openjdk-amd64/bin/java\"],\n\t[\"operator\", \"-\"],\n\t\"Djava\",\n\t[\"punctuation\", \".\"],\n\t\"net\",\n\t[\"punctuation\", \".\"],\n\t\"preferIPv4Stack\",\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"metrics\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"level\",\n\t[\"operator\", \"=\"],\n\t[\"level\", \"WARN\"],\n\t[\"operator\", \"-\"],\n\t\"Xmx3072m \",\n\t[\"operator\", \"-\"],\n\t\"Djava\",\n\t[\"punctuation\", \".\"],\n\t\"io\",\n\t[\"punctuation\", \".\"],\n\t\"tmpdir\",\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"/\"],\n\t\"tmp\",\n\t[\"operator\", \"/\"],\n\t\"hadoop\",\n\t[\"operator\", \"/\"],\n\t\"nm\",\n\t[\"operator\", \"-\"],\n\t\"local\",\n\t[\"operator\", \"-\"],\n\t\"dir\",\n\t[\"operator\", \"/\"],\n\t\"usercache\",\n\t[\"operator\", \"/\"],\n\t\"ms26bybu\",\n\t[\"operator\", \"/\"],\n\t\"appcache\",\n\t[\"operator\", \"/\"],\n\t\"application_1626702076395_0052\",\n\t[\"operator\", \"/\"],\n\t\"container_e102_1626702076395_0052_01_000877\",\n\t[\"operator\", \"/\"],\n\t\"tmp \",\n\t[\"operator\", \"-\"],\n\t\"Dlog4j\",\n\t[\"punctuation\", \".\"],\n\t\"configuration\",\n\t[\"operator\", \"=\"],\n\t\"container\",\n\t[\"operator\", \"-\"],\n\t\"log4j\",\n\t[\"punctuation\", \".\"],\n\t\"properties \",\n\t[\"operator\", \"-\"],\n\t\"Dyarn\",\n\t[\"punctuation\", \".\"],\n\t\"app\",\n\t[\"punctuation\", \".\"],\n\t\"container\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"dir\",\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"/\"],\n\t\"opt\",\n\t[\"operator\", \"/\"],\n\t\"hadoop\",\n\t[\"operator\", \"/\"],\n\t\"logs\",\n\t[\"operator\", \"/\"],\n\t\"userlogs\",\n\t[\"operator\", \"/\"],\n\t\"application_1626702076395_0052\",\n\t[\"operator\", \"/\"],\n\t\"container_e102_1626702076395_0052_01_000877 \",\n\t[\"operator\", \"-\"],\n\t\"Dyarn\",\n\t[\"punctuation\", \".\"],\n\t\"app\",\n\t[\"punctuation\", \".\"],\n\t\"container\",\n\t[\"punctuation\", \".\"],\n\t\"log\",\n\t[\"punctuation\", \".\"],\n\t\"filesize\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"root\",\n\t[\"punctuation\", \".\"],\n\t\"logger\",\n\t[\"operator\", \"=\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \",\"],\n\t\"CLA \",\n\t[\"operator\", \"-\"],\n\t\"Dhadoop\",\n\t[\"punctuation\", \".\"],\n\t\"root\",\n\t[\"punctuation\", \".\"],\n\t\"logfile\",\n\t[\"operator\", \"=\"],\n\t\"syslog org\",\n\t[\"punctuation\", \".\"],\n\t\"apache\",\n\t[\"punctuation\", \".\"],\n\t\"hadoop\",\n\t[\"punctuation\", \".\"],\n\t\"mapred\",\n\t[\"punctuation\", \".\"],\n\t\"YarnChild \",\n\t[\"ip-address\", \"141.54.132.64\"],\n\t[\"number\", \"39863\"],\n\t\" attempt_1626702076395_0052_m_000404_1 \",\n\t[\"number\", \"112150186034029\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:48.611\"],\n\t[\"punctuation\", \"]\"],\n\t\"Container killed on request\",\n\t[\"punctuation\", \".\"],\n\t\" Exit code is \",\n\t[\"number\", \"143\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:48.633\"],\n\t[\"punctuation\", \"]\"],\n\t\"Container exited with a non\",\n\t[\"operator\", \"-\"],\n\t\"zero exit code \",\n\t[\"number\", \"143\"],\n\t[\"punctuation\", \".\"],\n\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:08:47,233\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"[\"],\n\t\"main\",\n\t[\"punctuation\", \"]\"],\n\t\" mapreduce\",\n\t[\"punctuation\", \".\"],\n\t\"Job \",\n\t[\"operator\", \"(\"],\n\t\"Job\",\n\t[\"punctuation\", \".\"],\n\t\"java\",\n\t[\"operator\", \":\"],\n\t\"monitorAndPrintJob\",\n\t[\"operator\", \"(\"],\n\t[\"number\", \"1431\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \"-\"],\n\t\" Job job_1626702076395_0052 failed with state FAILED due to\",\n\t[\"operator\", \":\"],\n\t\" Task failed task_1626702076395_0052_m_000000\\r\\nJob failed as tasks failed\",\n\t[\"punctuation\", \".\"],\n\t\" failedMaps\",\n\t[\"operator\", \":\"],\n\t[\"number\", \"1\"],\n\t\" failedReduces\",\n\t[\"operator\", \":\"],\n\t[\"number\", \"0\"],\n\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:08:47,330\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"[\"],\n\t\"main\",\n\t[\"punctuation\", \"]\"],\n\t\" mapreduce\",\n\t[\"punctuation\", \".\"],\n\t\"Job \",\n\t[\"operator\", \"(\"],\n\t\"Job\",\n\t[\"punctuation\", \".\"],\n\t\"java\",\n\t[\"operator\", \":\"],\n\t\"monitorAndPrintJob\",\n\t[\"operator\", \"(\"],\n\t[\"number\", \"1436\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \")\"],\n\t[\"operator\", \"-\"],\n\t\" Counters\",\n\t[\"operator\", \":\"],\n\t[\"number\", \"14\"],\n\n\t\"\\r\\n        Job Counters\\r\\n                Failed map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1436\"],\n\n\t\"\\r\\n                Killed map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1527\"],\n\n\t\"\\r\\n                Killed reduce tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1\"],\n\n\t\"\\r\\n                Launched map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1816\"],\n\n\t\"\\r\\n                Other local map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1218\"],\n\n\t\"\\r\\n                Rack\",\n\t[\"operator\", \"-\"],\n\t\"local map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"598\"],\n\n\t\"\\r\\n                Total time spent by all maps in occupied slots \",\n\t[\"operator\", \"(\"],\n\t\"ms\",\n\t[\"operator\", \")\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"119609884\"],\n\n\t\"\\r\\n                Total time spent by all reduces in occupied slots \",\n\t[\"operator\", \"(\"],\n\t\"ms\",\n\t[\"operator\", \")\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\n\t\"\\r\\n                Total time spent by all map tasks \",\n\t[\"operator\", \"(\"],\n\t\"ms\",\n\t[\"operator\", \")\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"59804942\"],\n\n\t\"\\r\\n                Total vcore\",\n\t[\"operator\", \"-\"],\n\t\"milliseconds taken by all map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"59804942\"],\n\n\t\"\\r\\n                Total megabyte\",\n\t[\"operator\", \"-\"],\n\t\"milliseconds taken by all map tasks\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"122480521216\"],\n\n\t\"\\r\\n        Map\",\n\t[\"operator\", \"-\"],\n\t\"Reduce Framework\\r\\n                CPU time spent \",\n\t[\"operator\", \"(\"],\n\t\"ms\",\n\t[\"operator\", \")\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\n\t\"\\r\\n                Physical memory \",\n\t[\"operator\", \"(\"],\n\t\"bytes\",\n\t[\"operator\", \")\"],\n\t\" snapshot\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\n\t\"\\r\\n                Virtual memory \",\n\t[\"operator\", \"(\"],\n\t\"bytes\",\n\t[\"operator\", \")\"],\n\t\" snapshot\",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\n\t[\"exception\", [\n\t\t[\"summary\", [\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"java\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"lang\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"RuntimeException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"java\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"lang\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"RuntimeException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"message\", \"Job failed.\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"usage\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Cli\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"run\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Cli.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"272\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"executeUserObject\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"1919\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"access$1200\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"145\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine$RunLast\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"executeUserObjectOfLastSubcommandWithSameParent\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"2332\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine$RunLast\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"handle\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"2326\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine$RunLast\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"handle\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"2291\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine$AbstractParseResultHandler\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"execute\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"2159\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"execute\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"2058\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"usage\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Cli\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"main\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Cli.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"292\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"NativeMethodAccessorImpl\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke0\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"keyword\", \"Native Method\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"NativeMethodAccessorImpl\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"NativeMethodAccessorImpl.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"62\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DelegatingMethodAccessorImpl\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DelegatingMethodAccessorImpl.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"43\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"java\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"lang\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Method\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Method.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"498\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"hadoop\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"util\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"RunJar\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"run\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"RunJar.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"239\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"hadoop\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"util\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"RunJar\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"main\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"RunJar.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"153\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"summary\", [\n\t\t\t[\"keyword\", \"Caused by\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"java\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"lang\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"RuntimeException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"message\", \"Job failed.\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"hadoop\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Merge\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"run\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Merge.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"124\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"usage\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Cli\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"runHadoop\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Cli.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"239\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"usage\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Cli\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"runWithExecption\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Cli.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"259\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"usage\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Cli\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"run\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Cli.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"270\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"more\", [\n\t\t\t[\"punctuation\", \"...\"],\n\t\t\t[\"number\", \"14\"],\n\t\t\t[\"keyword\", \"more\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/log!+javastacktrace/_java_stack_trace_inclusion.test",
    "content": "java.net.BindException: Address already in use\n\tat sun.nio.ch.Net.bind0(Native Method) ~[na:1.8.0_171]\n\tat sun.nio.ch.Net.bind(Net.java:433) ~[na:1.8.0_171]\n\tat sun.nio.ch.Net.bind(Net.java:425) ~[na:1.8.0_171]\n\tat sun.nio.ch.ServeISocketChannelImpl.bind(ServerSocketChannellmpl.java:223) ~[na:1.8.0_171]\n\norg.apache.maven.lifecycle.LifecycleExecutionException: Error installing artifact's metadata: Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:564)\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:480)\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:459)\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:311)\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:278)\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:143)\n        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:334)\n        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:125)\n        at org.apache.maven.cli.MavenCli.main(MavenCli.java:280)\n        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)\n        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)\n        at java.lang.reflect.Method.invoke(Method.java:585)\n        at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)\n        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)\n        at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)\n        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)\nCaused by: org.apache.maven.plugin.MojoExecutionException: Error installing artifact's metadata: Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\n        at org.apache.maven.plugin.deploy.DeployMojo.execute(DeployMojo.java:174)\n        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:443)\n        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:539)\n        ... 16 more\nCaused by: org.apache.maven.artifact.deployer.ArtifactDeploymentException: Error installing artifact's metadata: Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\n        at org.apache.maven.artifact.deployer.DefaultArtifactDeployer.deploy(DefaultArtifactDeployer.java:102)\n        at org.apache.maven.plugin.deploy.DeployMojo.execute(DeployMojo.java:162)\n        ... 18 more\nCaused by: org.apache.maven.artifact.repository.metadata.RepositoryMetadataDeploymentException: Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\n        at org.apache.maven.artifact.repository.metadata.DefaultRepositoryMetadataManager.deploy(DefaultRepositoryMetadataManager.java:441)\n        at org.apache.maven.artifact.deployer.DefaultArtifactDeployer.deploy(DefaultArtifactDeployer.java:86)\n        ... 19 more\nCaused by: org.apache.maven.wagon.TransferFailedException: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\n        at org.apache.maven.wagon.providers.http.LightweightHttpWagon.put(LightweightHttpWagon.java:172)\n        at org.apache.maven.artifact.manager.DefaultWagonManager.putRemoteFile(DefaultWagonManager.java:237)\n        at org.apache.maven.artifact.manager.DefaultWagonManager.putArtifactMetadata(DefaultWagonManager.java:162)\n        at org.apache.maven.artifact.repository.metadata.DefaultRepositoryMetadataManager.deploy(DefaultRepositoryMetadataManager.java:437)\n        ... 20 more\n\n----------------------------------------------------\n\n[\n\t[\"exception\", [\n\t\t[\"summary\", [\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"java\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"net\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"BindException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"message\", \"Address already in use\"]\n\t\t]],\n\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"nio\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"ch\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Net\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"bind0\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"keyword\", \"Native Method\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t\" ~[na:1.8.0_171]\\r\\n\\t\",\n\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"nio\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"ch\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Net\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"bind\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Net.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"433\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t\" ~[na:1.8.0_171]\\r\\n\\t\",\n\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"nio\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"ch\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Net\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"bind\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Net.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"425\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t\" ~[na:1.8.0_171]\\r\\n\\t\",\n\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"nio\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"ch\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"ServeISocketChannelImpl\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"bind\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"ServerSocketChannellmpl.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"223\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t\" ~[na:1.8.0_171]\"\n\t]],\n\n\t[\"exception\", [\n\t\t[\"summary\", [\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"org\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"apache\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"maven\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"lifecycle\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"LifecycleExecutionException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"message\", \"Error installing artifact's metadata: Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"lifecycle\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultLifecycleExecutor\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"executeGoals\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultLifecycleExecutor.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"564\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"lifecycle\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultLifecycleExecutor\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"executeGoalWithLifecycle\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultLifecycleExecutor.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"480\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"lifecycle\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultLifecycleExecutor\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"executeGoal\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultLifecycleExecutor.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"459\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"lifecycle\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultLifecycleExecutor\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"executeGoalAndHandleFailures\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultLifecycleExecutor.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"311\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"lifecycle\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultLifecycleExecutor\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"executeTaskSegments\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultLifecycleExecutor.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"278\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"lifecycle\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultLifecycleExecutor\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"execute\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultLifecycleExecutor.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"143\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultMaven\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"doExecute\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultMaven.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"334\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultMaven\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"execute\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultMaven.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"125\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"cli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"MavenCli\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"main\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"MavenCli.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"280\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"NativeMethodAccessorImpl\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke0\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"keyword\", \"Native Method\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"NativeMethodAccessorImpl\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"NativeMethodAccessorImpl.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"39\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DelegatingMethodAccessorImpl\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DelegatingMethodAccessorImpl.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"25\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"java\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"lang\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Method\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Method.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"585\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"codehaus\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"classworlds\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Launcher\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"launchEnhanced\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Launcher.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"315\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"codehaus\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"classworlds\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Launcher\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"launch\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Launcher.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"255\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"codehaus\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"classworlds\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Launcher\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"mainWithExitCode\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Launcher.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"430\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"codehaus\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"classworlds\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Launcher\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"main\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Launcher.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"375\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"summary\", [\n\t\t\t[\"keyword\", \"Caused by\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"org\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"apache\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"maven\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"plugin\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"MojoExecutionException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"message\", \"Error installing artifact's metadata: Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"plugin\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"deploy\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DeployMojo\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"execute\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DeployMojo.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"174\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"plugin\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultPluginManager\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"executeMojo\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultPluginManager.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"443\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"lifecycle\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultLifecycleExecutor\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"executeGoals\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultLifecycleExecutor.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"539\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"more\", [\n\t\t\t[\"punctuation\", \"...\"],\n\t\t\t[\"number\", \"16\"],\n\t\t\t[\"keyword\", \"more\"]\n\t\t]],\n\t\t[\"summary\", [\n\t\t\t[\"keyword\", \"Caused by\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"org\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"apache\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"maven\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"artifact\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"deployer\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"ArtifactDeploymentException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"message\", \"Error installing artifact's metadata: Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"artifact\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"deployer\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultArtifactDeployer\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"deploy\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultArtifactDeployer.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"102\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"plugin\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"deploy\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DeployMojo\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"execute\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DeployMojo.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"162\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"more\", [\n\t\t\t[\"punctuation\", \"...\"],\n\t\t\t[\"number\", \"18\"],\n\t\t\t[\"keyword\", \"more\"]\n\t\t]],\n\t\t[\"summary\", [\n\t\t\t[\"keyword\", \"Caused by\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"org\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"apache\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"maven\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"artifact\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"repository\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"metadata\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"RepositoryMetadataDeploymentException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"message\", \"Error while deploying metadata: Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"artifact\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"repository\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"metadata\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultRepositoryMetadataManager\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"deploy\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultRepositoryMetadataManager.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"441\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"artifact\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"deployer\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultArtifactDeployer\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"deploy\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultArtifactDeployer.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"86\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"more\", [\n\t\t\t[\"punctuation\", \"...\"],\n\t\t\t[\"number\", \"19\"],\n\t\t\t[\"keyword\", \"more\"]\n\t\t]],\n\t\t[\"summary\", [\n\t\t\t[\"keyword\", \"Caused by\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"org\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"apache\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"maven\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"wagon\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"TransferFailedException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"message\", \"Failed to transfer file: http://repo.xxxx.com/foo/bar.pom. Return code is: 500\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"wagon\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"providers\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"http\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"LightweightHttpWagon\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"put\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"LightweightHttpWagon.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"172\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"artifact\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"manager\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultWagonManager\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"putRemoteFile\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultWagonManager.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"237\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"artifact\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"manager\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultWagonManager\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"putArtifactMetadata\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultWagonManager.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"162\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"maven\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"artifact\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"repository\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"metadata\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DefaultRepositoryMetadataManager\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"deploy\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DefaultRepositoryMetadataManager.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"437\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"more\", [\n\t\t\t[\"punctuation\", \"...\"],\n\t\t\t[\"number\", \"20\"],\n\t\t\t[\"keyword\", \"more\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/log!+javastacktrace/_minecraft_javastacktrace_inclusion.test",
    "content": "[07:28:17] [Server thread/INFO] [net.minecraft.server.dedicated.DedicatedServer]: Starting minecraft server version 1.12.2\n[07:28:17] [Server thread/INFO] [FML]: MinecraftForge v14.23.5.2847 Initialized\n[07:28:17] [Server thread/INFO] [FML]: Starts to replace vanilla recipe ingredients with ore ingredients.\n[07:28:18] [Server thread/INFO] [FML]: Invalid recipe found with multiple oredict ingredients in the same ingredient...\n[07:28:19] [Server thread/INFO] [FML]: Replaced 1227 ore ingredients\n[07:28:19] [Server thread/INFO] [FML]: Searching /home/minecraft/multicraft/servers/server99505/./mods for mods\n[07:28:21] [Server thread/INFO] [FML]: Forge Mod Loader has identified 5 mods to load\n[07:28:21] [Server thread/WARN] [FML]: Missing English translation for FML: assets/fml/lang/en_us.lang\n[07:28:21] [Server thread/FATAL] [FML]: net.minecraftforge.fml.common.MissingModsException: Mod thaumcraft (Thaumcraft) requires [baubles@[1.5.2,)]\n[07:28:21] [Server thread/ERROR] [net.minecraft.server.MinecraftServer]: Encountered an unexpected exception\nnet.minecraftforge.fml.common.MissingModsException: Mod thaumcraft (Thaumcraft) requires [baubles@[1.5.2,)]\n\tat net.minecraftforge.fml.common.Loader.sortModList(Loader.java:266) ~[Loader.class:?]\n\tat net.minecraftforge.fml.common.Loader.loadMods(Loader.java:572) ~[Loader.class:?]\n\tat net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandler.java:98) ~[FMLServerHandler.class:?]\n\tat net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.java:333) ~[FMLCommonHandler.class:?]\n\tat net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:125) ~[nz.class:?]\n\tat net.minecraft.server.MinecraftServer.run(MinecraftServer.java:486) [MinecraftServer.class:?]\n\tat java.lang.Thread.run(Thread.java:748) [?:1.8.0_222]\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"[\"],\n\t[\"time\", \"07:28:17\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"Server thread\",\n\t[\"operator\", \"/\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"net\",\n\t[\"punctuation\", \".\"],\n\t\"minecraft\",\n\t[\"punctuation\", \".\"],\n\t\"server\",\n\t[\"punctuation\", \".\"],\n\t\"dedicated\",\n\t[\"punctuation\", \".\"],\n\t\"DedicatedServer\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t\" Starting minecraft server version \",\n\t[\"number\", \"1.12.2\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"time\", \"07:28:17\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"Server thread\",\n\t[\"operator\", \"/\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"FML\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t\" MinecraftForge \",\n\t[\"number\", \"v14.23.5.2847\"],\n\t\" Initialized\\r\\n\",\n\n\t[\"punctuation\", \"[\"],\n\t[\"time\", \"07:28:17\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"Server thread\",\n\t[\"operator\", \"/\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"FML\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t\" Starts to replace vanilla recipe ingredients with ore ingredients\",\n\t[\"punctuation\", \".\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"time\", \"07:28:18\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"Server thread\",\n\t[\"operator\", \"/\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"FML\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t\" Invalid recipe found with multiple oredict ingredients in the same ingredient\",\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \".\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"time\", \"07:28:19\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"Server thread\",\n\t[\"operator\", \"/\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"FML\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t\" Replaced \",\n\t[\"number\", \"1227\"],\n\t\" ore ingredients\\r\\n\",\n\n\t[\"punctuation\", \"[\"],\n\t[\"time\", \"07:28:19\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"Server thread\",\n\t[\"operator\", \"/\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"FML\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t\" Searching \",\n\t[\"file-path\", \"/home/minecraft/multicraft/servers/server99505/./mods\"],\n\t\" for mods\\r\\n\",\n\n\t[\"punctuation\", \"[\"],\n\t[\"time\", \"07:28:21\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"Server thread\",\n\t[\"operator\", \"/\"],\n\t[\"level\", \"INFO\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"FML\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t\" Forge Mod Loader has identified \",\n\t[\"number\", \"5\"],\n\t\" mods to load\\r\\n\",\n\n\t[\"punctuation\", \"[\"],\n\t[\"time\", \"07:28:21\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"Server thread\",\n\t[\"operator\", \"/\"],\n\t[\"level\", \"WARN\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"FML\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t\" Missing English translation for FML\",\n\t[\"operator\", \":\"],\n\t\" assets\",\n\t[\"operator\", \"/\"],\n\t\"fml\",\n\t[\"operator\", \"/\"],\n\t\"lang\",\n\t[\"operator\", \"/\"],\n\t\"en_us\",\n\t[\"punctuation\", \".\"],\n\t\"lang\\r\\n\",\n\n\t[\"punctuation\", \"[\"],\n\t[\"time\", \"07:28:21\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"Server thread\",\n\t[\"operator\", \"/\"],\n\t[\"level\", \"FATAL\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"FML\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t\" net\",\n\t[\"punctuation\", \".\"],\n\t\"minecraftforge\",\n\t[\"punctuation\", \".\"],\n\t\"fml\",\n\t[\"punctuation\", \".\"],\n\t\"common\",\n\t[\"punctuation\", \".\"],\n\t\"MissingModsException\",\n\t[\"operator\", \":\"],\n\t\" Mod thaumcraft \",\n\t[\"operator\", \"(\"],\n\t\"Thaumcraft\",\n\t[\"operator\", \")\"],\n\t\" requires \",\n\t[\"punctuation\", \"[\"],\n\t\"baubles\",\n\t[\"operator\", \"@\"],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"1.5.2\"],\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \")\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"time\", \"07:28:21\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"Server thread\",\n\t[\"operator\", \"/\"],\n\t[\"level\", \"ERROR\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"[\"],\n\t\"net\",\n\t[\"punctuation\", \".\"],\n\t\"minecraft\",\n\t[\"punctuation\", \".\"],\n\t\"server\",\n\t[\"punctuation\", \".\"],\n\t\"MinecraftServer\",\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \":\"],\n\t\" Encountered an unexpected exception\\r\\n\",\n\n\t[\"exception\", [\n\t\t[\"summary\", [\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"net\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"minecraftforge\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"fml\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"common\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"MissingModsException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"message\", \"Mod thaumcraft (Thaumcraft) requires [baubles@[1.5.2,)]\"]\n\t\t]],\n\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"net\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"minecraftforge\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"fml\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"common\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Loader\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"sortModList\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Loader.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"266\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t\" ~[Loader.class:?]\\r\\n\\t\",\n\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"net\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"minecraftforge\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"fml\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"common\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Loader\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"loadMods\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Loader.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"572\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t\" ~[Loader.class:?]\\r\\n\\t\",\n\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"net\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"minecraftforge\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"fml\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"server\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"FMLServerHandler\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"beginServerLoading\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"FMLServerHandler.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"98\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t\" ~[FMLServerHandler.class:?]\\r\\n\\t\",\n\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"net\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"minecraftforge\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"fml\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"common\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"FMLCommonHandler\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"onServerStart\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"FMLCommonHandler.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"333\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t\" ~[FMLCommonHandler.class:?]\\r\\n\\t\",\n\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"net\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"minecraft\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"server\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"dedicated\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DedicatedServer\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"func_71197_b\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DedicatedServer.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"125\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t\" ~[nz.class:?]\\r\\n\\t\",\n\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"net\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"minecraft\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"server\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"MinecraftServer\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"run\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"MinecraftServer.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"486\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t\" [MinecraftServer.class:?]\\r\\n\\t\",\n\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"java\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"lang\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Thread\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"run\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Thread.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"748\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t\" [?:1.8.0_222]\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/log!+javastacktrace/exception_javastacktrace_inclusion.test",
    "content": "[2021-07-21 14:07:48.633] ERR java.lang.RuntimeException: java.lang.RuntimeException: Job failed.\n        at org.netspeak.usage.Cli.run(Cli.java:272)\n        at picocli.CommandLine.executeUserObject(CommandLine.java:1919)\n        at picocli.CommandLine.access$1200(CommandLine.java:145)\n        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2332)\n        at picocli.CommandLine$RunLast.handle(CommandLine.java:2326)\n        at picocli.CommandLine$RunLast.handle(CommandLine.java:2291)\n        at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2159)\n        at picocli.CommandLine.execute(CommandLine.java:2058)\n        at org.netspeak.usage.Cli.main(Cli.java:292)\n        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n        at java.lang.reflect.Method.invoke(Method.java:498)\n        at org.apache.hadoop.util.RunJar.run(RunJar.java:239)\n        at org.apache.hadoop.util.RunJar.main(RunJar.java:153)\nCaused by: java.lang.RuntimeException: Job failed.\n        at org.netspeak.hadoop.Merge.run(Merge.java:124)\n        at org.netspeak.usage.Cli.runHadoop(Cli.java:239)\n        at org.netspeak.usage.Cli.runWithExecption(Cli.java:259)\n        at org.netspeak.usage.Cli.run(Cli.java:270)\n        ... 14 more\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"[\"],\n\t[\"date\", \"2021-07-21\"],\n\t[\"time\", \"14:07:48.633\"],\n\t[\"punctuation\", \"]\"],\n\t[\"level\", \"ERR\"],\n\t[\"exception\", [\n\t\t[\"summary\", [\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"java\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"lang\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"RuntimeException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"java\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"lang\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"RuntimeException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"message\", \"Job failed.\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"usage\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Cli\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"run\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Cli.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"272\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"executeUserObject\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"1919\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"access$1200\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"145\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine$RunLast\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"executeUserObjectOfLastSubcommandWithSameParent\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"2332\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine$RunLast\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"handle\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"2326\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine$RunLast\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"handle\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"2291\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine$AbstractParseResultHandler\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"execute\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"2159\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"picocli\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"CommandLine\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"execute\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"CommandLine.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"2058\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"usage\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Cli\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"main\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Cli.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"292\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"NativeMethodAccessorImpl\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke0\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"keyword\", \"Native Method\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"NativeMethodAccessorImpl\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"NativeMethodAccessorImpl.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"62\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"sun\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"DelegatingMethodAccessorImpl\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"DelegatingMethodAccessorImpl.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"43\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"java\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"lang\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"reflect\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Method\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"invoke\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Method.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"498\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"hadoop\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"util\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"RunJar\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"run\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"RunJar.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"239\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"apache\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"hadoop\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"util\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"RunJar\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"main\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"RunJar.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"153\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"summary\", [\n\t\t\t[\"keyword\", \"Caused by\"],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"exceptions\", [\n\t\t\t\t[\"namespace\", \"java\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"namespace\", \"lang\"],\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"class-name\", \"RuntimeException\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \":\"],\n\t\t\t[\"message\", \"Job failed.\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"hadoop\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Merge\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"run\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Merge.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"124\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"usage\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Cli\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"runHadoop\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Cli.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"239\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"usage\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Cli\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"runWithExecption\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Cli.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"259\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"stack-frame\", [\n\t\t\t[\"keyword\", \"at\"],\n\t\t\t[\"namespace\", [\n\t\t\t\t\"org\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"netspeak\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"usage\",\n\t\t\t\t[\"punctuation\", \".\"]\n\t\t\t]],\n\t\t\t[\"class-name\", \"Cli\"],\n\t\t\t[\"punctuation\", \".\"],\n\t\t\t[\"function\", \"run\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"source\", [\n\t\t\t\t[\"file\", \"Cli.java\"],\n\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t[\"line-number\", \"270\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"more\", [\n\t\t\t[\"punctuation\", \"...\"],\n\t\t\t[\"number\", \"14\"],\n\t\t\t[\"keyword\", \"more\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/lolcode/boolean_feature.test",
    "content": "WIN\r\nFAIL\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"WIN\"],\r\n\t[\"boolean\", \"FAIL\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/lolcode/comment_feature.test",
    "content": "OBTW foo\r\nbar TLDR\r\n\tBTW foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"OBTW foo\\r\\nbar TLDR\"],\r\n\t[\"comment\", \"BTW foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments."
  },
  {
    "path": "tests/languages/lolcode/function_feature.test",
    "content": "I IZ foobar\r\n\tHOW IZ I foobar\r\nIZ fooBAR\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"I IZ\"],\r\n\t[\"function\", \"foobar\"],\r\n\t[\"keyword\", \"HOW IZ I\"],\r\n\t[\"function\", \"foobar\"],\r\n\t[\"keyword\", \"IZ\"],\r\n\t[\"function\", \"fooBAR\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/lolcode/keyword_feature.test",
    "content": "O HAI IM\r\nKTHX\r\nHAI\r\nKTHXBYE\r\nI HAS A\r\nITZ\r\nITZ A\r\nR\r\nAN\r\nMKAY\r\nSMOOSH\r\nMAEK\r\nIS NOW\r\nIS NOW A\r\nVISIBLE\r\nGIMMEH\r\nO RLY?\r\nYA RLY\r\nNO WAI\r\nOIC\r\nMEBBE\r\nWTF?\r\nOMG\r\nOMGWTF\r\nGTFO\r\nIM IN YR\r\nIM OUTTA YR\r\nFOUND YR\r\nYR\r\nTIL\r\nWILE\r\nUPPIN\r\nNERFIN\r\nI IZ\r\nHOW IZ I foo\r\nIF U SAY SO\r\nSRS\r\nHAS A\r\nLIEK\r\nLIEK A\r\nIZ\r\nfoo'Z\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"O HAI IM\"],\r\n\t[\"keyword\", \"KTHX\"],\r\n\t[\"keyword\", \"HAI\"],\r\n\t[\"keyword\", \"KTHXBYE\"],\r\n\t[\"keyword\", \"I HAS A\"],\r\n\t[\"keyword\", \"ITZ\"],\r\n\t[\"keyword\", \"ITZ A\"],\r\n\t[\"keyword\", \"R\"],\r\n\t[\"keyword\", \"AN\"],\r\n\t[\"keyword\", \"MKAY\"],\r\n\t[\"keyword\", \"SMOOSH\"],\r\n\t[\"keyword\", \"MAEK\"],\r\n\t[\"keyword\", \"IS NOW\"],\r\n\t[\"keyword\", \"IS NOW A\"],\r\n\t[\"keyword\", \"VISIBLE\"],\r\n\t[\"keyword\", \"GIMMEH\"],\r\n\t[\"keyword\", \"O RLY?\"],\r\n\t[\"keyword\", \"YA RLY\"],\r\n\t[\"keyword\", \"NO WAI\"],\r\n\t[\"keyword\", \"OIC\"],\r\n\t[\"keyword\", \"MEBBE\"],\r\n\t[\"keyword\", \"WTF?\"],\r\n\t[\"keyword\", \"OMG\"],\r\n\t[\"keyword\", \"OMGWTF\"],\r\n\t[\"keyword\", \"GTFO\"],\r\n\t[\"keyword\", \"IM IN YR\"],\r\n\t[\"keyword\", \"IM OUTTA YR\"],\r\n\t[\"keyword\", \"FOUND YR\"],\r\n\t[\"keyword\", \"YR\"],\r\n\t[\"keyword\", \"TIL\"],\r\n\t[\"keyword\", \"WILE\"],\r\n\t[\"keyword\", \"UPPIN\"],\r\n\t[\"keyword\", \"NERFIN\"],\r\n\t[\"keyword\", \"I IZ\"],\r\n\t[\"keyword\", \"HOW IZ I\"], [\"function\", \"foo\"],\r\n\t[\"keyword\", \"IF U SAY SO\"],\r\n\t[\"keyword\", \"SRS\"],\r\n\t[\"keyword\", \"HAS A\"],\r\n\t[\"keyword\", \"LIEK\"],\r\n\t[\"keyword\", \"LIEK A\"],\r\n\t[\"keyword\", \"IZ\"],\r\n\t\"\\r\\nfoo\", [\"keyword\", \"'Z\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/lolcode/label_feature.test",
    "content": "IM IN YR foobar\r\n\tIM OUTTA YR fooBAR\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"IM IN YR\"],\r\n\t[\"label\", \"foobar\"],\r\n\t[\"keyword\", \"IM OUTTA YR\"],\r\n\t[\"label\", \"fooBAR\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for labels."
  },
  {
    "path": "tests/languages/lolcode/number_feature.test",
    "content": "42\r\n3.14159\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/lolcode/operator_feature.test",
    "content": "NOT\r\nBOTH SAEM\r\nDIFFRINT\r\nSUM OF\r\nDIFF OF\r\nPRODUKT OF\r\nQUOSHUNT OF\r\nMOD OF\r\nBIGGR OF\r\nSMALLR OF\r\nBOTH OF\r\nEITHER OF\r\nWON OF\r\nALL OF\r\nANY OF\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"NOT\"],\r\n\t[\"operator\", \"BOTH SAEM\"],\r\n\t[\"operator\", \"DIFFRINT\"],\r\n\t[\"operator\", \"SUM OF\"],\r\n\t[\"operator\", \"DIFF OF\"],\r\n\t[\"operator\", \"PRODUKT OF\"],\r\n\t[\"operator\", \"QUOSHUNT OF\"],\r\n\t[\"operator\", \"MOD OF\"],\r\n\t[\"operator\", \"BIGGR OF\"],\r\n\t[\"operator\", \"SMALLR OF\"],\r\n\t[\"operator\", \"BOTH OF\"],\r\n\t[\"operator\", \"EITHER OF\"],\r\n\t[\"operator\", \"WON OF\"],\r\n\t[\"operator\", \"ALL OF\"],\r\n\t[\"operator\", \"ANY OF\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/lolcode/punctuation_feature.test",
    "content": "... … , !\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"...\"],\n\t[\"punctuation\", \"…\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \"!\"]\n]\n"
  },
  {
    "path": "tests/languages/lolcode/string_feature.test",
    "content": "\"\"\r\n\"foobar\"\r\n\"fo:\"o\"\r\n\"foo:)bar:>baz\"\r\n\"foo:(FF)baz\"\r\n\"foo:[bar]baz\"\r\n\"foo:{bar}baz\"\r\n\"foo BTW bar\" BTW and out\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"\\\"\"]],\r\n\r\n\t[\"string\", [\"\\\"foobar\\\"\"]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"fo\",\r\n\t\t[\"symbol\", \":\\\"\"],\r\n\t\t\"o\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"foo\",\r\n\t\t[\"symbol\", \":)\"],\r\n\t\t\"bar\",\r\n\t\t[\"symbol\", \":>\"],\r\n\t\t\"baz\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"foo\",\r\n\t\t[\"symbol\", \":(FF)\"],\r\n\t\t\"baz\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"foo\",\r\n\t\t[\"symbol\", \":[bar]\"],\r\n\t\t\"baz\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"foo\",\r\n\t\t[\"variable\", \":{bar}\"],\r\n\t\t\"baz\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\"\\\"foo BTW bar\\\"\"]],\r\n\t[\"comment\", \"BTW and out\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings, with variables and symbols in them.\r\n"
  },
  {
    "path": "tests/languages/lolcode/symbol_feature.test",
    "content": "YARN A YARN\r\nNUMBR A NUMBR\r\nNUMBAR A NUMBAR\r\nTROOF A TROOF\r\nBUKKIT A BUKKIT\r\nNOOB A NOOB\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"symbol\", [\"YARN\"]],\r\n\t[\"symbol\", [[\"keyword\", \"A\"], \" YARN\"]],\r\n\t[\"symbol\", [\"NUMBR\"]],\r\n\t[\"symbol\", [[\"keyword\", \"A\"], \" NUMBR\"]],\r\n\t[\"symbol\", [\"NUMBAR\"]],\r\n\t[\"symbol\", [[\"keyword\", \"A\"], \" NUMBAR\"]],\r\n\t[\"symbol\", [\"TROOF\"]],\r\n\t[\"symbol\", [[\"keyword\", \"A\"], \" TROOF\"]],\r\n\t[\"symbol\", [\"BUKKIT\"]],\r\n\t[\"symbol\", [[\"keyword\", \"A\"], \" BUKKIT\"]],\r\n\t[\"symbol\", [\"NOOB\"]],\r\n\t[\"symbol\", [[\"keyword\", \"A\"], \" NOOB\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for symbols, optionally prefixed by \"A \"."
  },
  {
    "path": "tests/languages/lolcode/variable_feature.test",
    "content": "IT\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"IT\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/lua/comment_feature.test",
    "content": "#!/usr/local/bin/lua\r\n--\r\n-- Foobar\r\n--[[Foo\r\nbar]]\r\n--[====[Foo\r\nbar]=====] ]===]\r\nbaz]====]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#!/usr/local/bin/lua\"],\r\n\t[\"comment\", \"--\"],\r\n\t[\"comment\", \"-- Foobar\"],\r\n\t[\"comment\", \"--[[Foo\\r\\nbar]]\"],\r\n\t[\"comment\", \"--[====[Foo\\r\\nbar]=====] ]===]\\r\\nbaz]====]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/lua/function_feature.test",
    "content": "foo ()\r\nFoo_bar_42()\r\nfoo {}\r\nFoo_bar_42{}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"Foo_bar_42\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"foo\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"function\", \"Foo_bar_42\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/lua/keyword_feature.test",
    "content": "and\r\nbreak\r\ndo\r\nelse\r\nelseif\r\nend\r\nfalse\r\nfor\r\nfunction\r\ngoto\r\nif\r\nin\r\nlocal\r\nnil\r\nnot\r\nor\r\nrepeat\r\nreturn\r\nthen\r\ntrue\r\nuntil\r\nwhile\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"and\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"elseif\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"false\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"local\"],\r\n\t[\"keyword\", \"nil\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"repeat\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"true\"],\r\n\t[\"keyword\", \"until\"],\r\n\t[\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/lua/number_feature.test",
    "content": "0\r\n42\r\n3.14159\r\n3.\r\n.42\r\n4e14\r\n3.14e+8\r\n.7E-1\r\n4.e12\r\n0xBadFace\r\n0x0.1E\r\n0xA23p-4\r\n0X1.921FB54442D18P+1\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3.\"],\r\n\t[\"number\", \".42\"],\r\n\t[\"number\", \"4e14\"],\r\n\t[\"number\", \"3.14e+8\"],\r\n\t[\"number\", \".7E-1\"],\r\n\t[\"number\", \"4.e12\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0x0.1E\"],\r\n\t[\"number\", \"0xA23p-4\"],\r\n\t[\"number\", \"0X1.921FB54442D18P+1\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/lua/operator_feature.test",
    "content": "+ - * %\r\n^ & | #\r\n/ //\r\n< << <=\r\n> >> >=\r\n= ==\r\n~ ~=\r\n..\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"%\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"&\"], [\"operator\", \"|\"], [\"operator\", \"#\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"//\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"~\"], [\"operator\", \"~=\"],\r\n\t[\"operator\", \"..\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/lua/string_feature.test",
    "content": "\"\"\r\n\"Fo\\\"obar\"\r\n\"Foo\\\r\nbar\\z\r\nbaz\"\r\n''\r\n'Fo\\'obar'\r\n'Foo\\\r\nbar\\z\r\nbaz'\r\n[[Foo\r\nbar]]\r\n[====[Foo\r\nbar]=====] ]===]\r\nbaz]====]\r\n[====[Foo\r\n-- comment\r\nbaz]====]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"Foo\\\\\\r\\nbar\\\\z\\r\\nbaz\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'Fo\\\\'obar'\"],\r\n\t[\"string\", \"'Foo\\\\\\r\\nbar\\\\z\\r\\nbaz'\"],\r\n\t[\"string\", \"[[Foo\\r\\nbar]]\"],\r\n\t[\"string\", \"[====[Foo\\r\\nbar]=====] ]===]\\r\\nbaz]====]\"],\r\n\t[\"string\", \"[====[Foo\\r\\n-- comment\\r\\nbaz]====]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/lua+sas/lua_inclusion.test",
    "content": "proc lua;\r\n/* Testing a comment */\r\nsubmit;\r\n   array = { 1, 2, 3, 4, 5 }\r\n   sum = sas.sumx(array)\r\n   print(sum)\r\nendsubmit;\r\nrun;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"step\", \"proc lua\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\r\n\t\t\"proc-lua\", [\r\n\t\t\t[\"comment\", \"/* Testing a comment */\"],\r\n\t\t\t[\"submit-statement\", \"submit\"],\r\n\t\t\t[\r\n\t\t\t\t\"lua\", [\r\n\t\t\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t\t\t\"\\r\\n   array \",\r\n\t\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\t\t[\"number\", \"1\"],\r\n\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t[\"number\", \"2\"],\r\n\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t[\"number\", \"3\"],\r\n\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t[\"number\", \"4\"],\r\n\t\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t\t[\"number\", \"5\"],\r\n\t\t\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t\t\t\"\\r\\n   sum \",\r\n\t\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t\t\" sas\",\r\n\t\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\t[\"function\", \"sumx\"],\r\n\t\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t\t\"array\",\r\n\t\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t\t[\"function\", \"print\"],\r\n\t\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t\t\"sum\",\r\n\t\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t\t]\r\n\t\t\t],\r\n\t\t\t[\"submit-statement\", \"endsubmit\"],\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]\r\n\t],\r\n\t[\"step\", \"run\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for proc lua support.\r\n"
  },
  {
    "path": "tests/languages/magma/boolean_feature.test",
    "content": "true\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n"
  },
  {
    "path": "tests/languages/magma/comment_feature.test",
    "content": "// comment\n\n/*\n comment\n */\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// comment\"],\n\n\t[\"comment\", \"/*\\r\\n comment\\r\\n */\"]\n]\n"
  },
  {
    "path": "tests/languages/magma/generator_feature.test",
    "content": "G<a, b> := Group<a, b | a^2 = b^3 = a^b*b^2>;\n\n----------------------------------------------------\n\n[\n\t[\"generator\", \"G\"],\n\t[\"punctuation\", \"<\"],\n\t\"a\",\n\t[\"punctuation\", \",\"],\n\t\" b\",\n\t[\"punctuation\", \">\"],\n\t[\"operator\", \":=\"],\n\t[\"generator\", \"Group\"],\n\t[\"punctuation\", \"<\"],\n\t\"a\",\n\t[\"punctuation\", \",\"],\n\t\" b \",\n\t[\"operator\", \"|\"],\n\t\" a\",\n\t[\"operator\", \"^\"],\n\t[\"number\", \"2\"],\n\t[\"operator\", \"=\"],\n\t\" b\",\n\t[\"operator\", \"^\"],\n\t[\"number\", \"3\"],\n\t[\"operator\", \"=\"],\n\t\" a\",\n\t[\"operator\", \"^\"],\n\t\"b\",\n\t[\"operator\", \"*\"],\n\t\"b\",\n\t[\"operator\", \"^\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \">\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/magma/keyword_feature.test",
    "content": "_;\nadj;\nand;\nassert;\nassert2;\nassert3;\nassigned;\nbreak;\nby;\ncase;\ncat;\ncatch;\nclear;\ncmpeq;\ncmpne;\ncontinue;\ndeclare;\ndefault;\ndelete;\ndiff;\ndiv;\ndo;\nelif;\nelse;\nend;\neq;\nerror;\neval;\nexists;\nexit;\nfor;\nforall;\nforward;\nfprintf;\nfreeze;\nfunction;\nge;\ngt;\nif;\niload;\nimport;\nin;\nintrinsic;\nis;\njoin;\nle;\nload;\nlocal;\nlt;\nmeet;\nmod;\nne;\nnot;\nnotadj;\nnotin;\nnotsubset;\nor;\nprint;\nprintf;\nprocedure;\nquit;\nrandom;\nread;\nreadi;\nrepeat;\nrequire;\nrequirege;\nrequirerange;\nrestore;\nreturn;\nsave;\nsdiff;\nselect;\nsubset;\nthen;\ntime;\nto;\ntry;\nuntil;\nvprint;\nvprintf;\nvtime;\nwhen;\nwhere;\nwhile;\nxor;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"_\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"adj\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"and\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"assert\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"assert2\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"assert3\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"assigned\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"by\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"case\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"cat\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"catch\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"clear\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"cmpeq\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"cmpne\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"declare\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"default\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"delete\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"diff\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"div\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"do\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"elif\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"end\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"eq\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"error\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"eval\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"exists\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"exit\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"forall\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"forward\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"fprintf\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"freeze\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"function\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"ge\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"gt\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"iload\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"import\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"intrinsic\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"is\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"join\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"le\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"load\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"local\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"lt\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"meet\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"mod\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"ne\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"not\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"notadj\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"notin\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"notsubset\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"or\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"print\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"printf\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"procedure\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"quit\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"random\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"read\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"readi\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"repeat\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"require\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"requirege\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"requirerange\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"restore\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"save\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"sdiff\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"select\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"subset\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"then\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"time\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"to\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"try\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"until\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"vprint\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"vprintf\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"vtime\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"when\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"where\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"xor\"], [\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/magma/number_feature.test",
    "content": "123\n-123\n\n1.234\n\n0..100\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"123\"],\n\t[\"operator\", \"-\"], [\"number\", \"123\"],\n\n\t[\"number\", \"1.234\"],\n\n\t[\"number\", \"0\"], [\"operator\", \"..\"], [\"number\", \"100\"]\n]\n"
  },
  {
    "path": "tests/languages/magma/operator_feature.test",
    "content": "+ - * / ^ ~ !\n=\n:= -> ..\n| #\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"!\"],\n\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \":=\"],\n\t[\"operator\", \"->\"],\n\t[\"operator\", \"..\"],\n\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"#\"]\n]\n"
  },
  {
    "path": "tests/languages/magma/punctuation_feature.test",
    "content": "( ) [ ] { } < >\n, ; . :\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"<\"],\n\t[\"punctuation\", \">\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"]\n]\n"
  },
  {
    "path": "tests/languages/magma/shell_feature.test",
    "content": "> 1\n1\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \">\"], [\"number\", \"1\"],\n\t[\"output\", \"1\"]\n]\n"
  },
  {
    "path": "tests/languages/magma/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"\\\"\"\n\"\\n\\n\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"\\\\\\\"\\\"\"],\n\t[\"string\", \"\\\"\\\\n\\\\n\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/makefile/builtin-target_feature.test",
    "content": ".PHONY:\n.DELETE_ON_ERROR:\n.SECONDEXPANSION:\n\n----------------------------------------------------\n\n[\n\t[\"builtin-target\", \".PHONY\"], [\"punctuation\", \":\"],\n\t[\"builtin-target\", \".DELETE_ON_ERROR\"], [\"punctuation\", \":\"],\n\t[\"builtin-target\", \".SECONDEXPANSION\"], [\"punctuation\", \":\"]\n]\n\n----------------------------------------------------\n\nChecks for built-in target names.\n"
  },
  {
    "path": "tests/languages/makefile/comment_feature.test",
    "content": "#\r\n# foobar\r\n# foo \\\r\nbar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"],\r\n\t[\"comment\", \"# foo \\\\\\r\\nbar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/makefile/function_feature.test",
    "content": "(abspath foo)\n(addsuffix foo)\n(and foo)\n(basename foo)\n(call foo)\n(dir foo)\n(error foo)\n(eval foo)\n(file foo)\n(filter foo)\n(filter-out foo)\n(findstring foo)\n(firstword foo)\n(flavor foo)\n(foreach foo)\n(guile foo)\n(if foo)\n(info foo)\n(join foo)\n(lastword foo)\n(load foo)\n(notdir foo)\n(or foo)\n(origin foo)\n(patsubst foo)\n(realpath foo)\n(shell foo)\n(sort foo)\n(strip foo)\n(subst foo)\n(suffix foo)\n(value foo)\n(warning foo)\n(wildcard foo)\n(word foo)\n(wordlist foo)\n(words foo)\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"abspath\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"addsuffix\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"and\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"basename\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"call\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"dir\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"error\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"eval\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"file\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"filter\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"filter-out\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"findstring\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"firstword\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"flavor\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"foreach\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"guile\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"if\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"info\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"join\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"lastword\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"load\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"notdir\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"or\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"origin\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"patsubst\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"realpath\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"shell\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"sort\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"strip\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"subst\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"suffix\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"value\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"warning\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"wildcard\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"word\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"wordlist\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"words\"],\n\t\" foo\",\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/makefile/keyword_feature.test",
    "content": "-include\r\ndefine\r\nelse\r\nendef\r\nendif\r\nexport\r\nifdef\r\nifeq\r\nifndef\r\nifneq\r\ninclude\r\noverride\r\nprivate\r\nsinclude\r\nundefine\r\nunexport\r\nvpath\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"-include\"],\r\n\t[\"keyword\", \"define\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"endef\"],\r\n\t[\"keyword\", \"endif\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"ifdef\"],\r\n\t[\"keyword\", \"ifeq\"],\r\n\t[\"keyword\", \"ifndef\"],\r\n\t[\"keyword\", \"ifneq\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"override\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"sinclude\"],\r\n\t[\"keyword\", \"undefine\"],\r\n\t[\"keyword\", \"unexport\"],\r\n\t[\"keyword\", \"vpath\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/makefile/operator_feature.test",
    "content": "= ::= ?=\r\n:= += !=\r\n| @\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"=\"], [\"operator\", \"::=\"], [\"operator\", \"?=\"],\r\n\t[\"operator\", \":=\"], [\"operator\", \"+=\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/makefile/string_feature.test",
    "content": "\"\"\r\n''\r\n\"fo\\\"o\"\r\n'fo\\'o'\r\n\"foo\\\r\nbar\"\r\n'foo\\\r\nbar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"'fo\\\\'o'\"],\r\n\t[\"string\", \"\\\"foo\\\\\\r\\nbar\\\"\"],\r\n\t[\"string\", \"'foo\\\\\\r\\nbar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-quoted and double-quoted strings."
  },
  {
    "path": "tests/languages/makefile/target_feature.test",
    "content": "edit :\n%oo:\n$(foo):\n\n----------------------------------------------------\n\n[\n\t[\"target\", [\"edit\"]],\n\t[\"punctuation\", \":\"],\n\n\t[\"target\", [\"%oo\"]],\n\t[\"punctuation\", \":\"],\n\n\t[\"target\", [\n\t\t[\"variable\", \"$\"],\n\t\t\"(foo)\"\n\t]],\n\t[\"punctuation\", \":\"]\n]\n\n----------------------------------------------------\n\nChecks for targets, optionally containing interpolation.\n"
  },
  {
    "path": "tests/languages/makefile/variable_feature.test",
    "content": "$@\r\n$$<\r\n$(@D)\r\n$(foobar)\r\n$(2)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$@\"],\r\n\t[\"variable\", \"$$<\"],\r\n\t[\"variable\", \"$(@D)\"],\r\n\t[\"variable\", \"$\"], [\"punctuation\", \"(\"], \"foobar\", [\"punctuation\", \")\"],\r\n\t[\"variable\", \"$\"], [\"punctuation\", \"(\"], \"2\", [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/markdown/blockquote_feature.test",
    "content": "> foo\r\n>> foo\r\n> > foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"blockquote\", \">\"], \" foo\\r\\n\",\r\n\t[\"blockquote\", \">>\"], \" foo\\r\\n\",\r\n\t[\"blockquote\", \"> >\"], \" foo\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for blockquotes."
  },
  {
    "path": "tests/languages/markdown/bold_feature.test",
    "content": "**foobar**\r\n**foo\r\nbar**\r\n__foobar__\r\n__foo\r\nbar__\r\n\r\n__foo *bar* baz__\r\n__foo _bar_ baz__\r\n__foo ~bar~ baz__\r\n__foo ~~bar~~ baz__\r\n__foo[bar](baz)__\r\n__foo `bar`__\r\n\r\n**foo *bar* baz**\r\n**foo _bar_ baz**\r\n**foo ~bar~ baz**\r\n**foo ~~bar~~ baz**\r\n**foo[bar](baz)**\r\n**foo `bar`**\r\n\r\nnot__bold__ __this__either\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\"foobar\"]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\"foo\\r\\nbar\"]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"__\"],\r\n\t\t[\"content\", [\"foobar\"]],\r\n\t\t[\"punctuation\", \"__\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"__\"],\r\n\t\t[\"content\", [\"foo\\r\\nbar\"]],\r\n\t\t[\"punctuation\", \"__\"]\r\n\t]],\r\n\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"__\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"__\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"__\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"__\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"__\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"strike\", [\r\n\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"__\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"__\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"strike\", [\r\n\t\t\t\t[\"punctuation\", \"~~\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"~~\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"__\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"__\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"url\", [\r\n\t\t\t\t\"[\",\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t\"](\",\r\n\t\t\t\t[\"url\", \"baz\"],\r\n\t\t\t\t\")\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"__\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"__\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"code-snippet\", \"`bar`\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"__\"]\r\n\t]],\r\n\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"strike\", [\r\n\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"strike\", [\r\n\t\t\t\t[\"punctuation\", \"~~\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"~~\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"url\", [\r\n\t\t\t\t\"[\",\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t\"](\",\r\n\t\t\t\t[\"url\", \"baz\"],\r\n\t\t\t\t\")\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"code-snippet\", \"`bar`\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\r\n\t\"\\r\\n\\r\\nnot__bold__ __this__either\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for bold. Also tests for inclusion of italic, strike, and url.\r\n"
  },
  {
    "path": "tests/languages/markdown/code-block_feature.html.test",
    "content": "```html\n<a href=\"#foo\">Click me!</a> &amp;\n```\n\n```unknownLanguage\n<a href=\"#foo\">Click me!</a> &amp;\n```\n\n----------------------------------------------------\n\n<span class=\"token code\">\n\t<span class=\"token punctuation\">```</span>\n\t<span class=\"token code-language\">html</span>\n\t<span class=\"token code-block language-html\">\n\t\t<span class=\"token tag\">\n\t\t\t<span class=\"token punctuation\">&lt;</span>\n\t\t\t<span class=\"token tag\">a</span>\n\t\t\t<span class=\"token attr-name\">href</span>\n\t\t\t<span class=\"token attr-value\">\n\t\t\t\t<span class=\"token punctuation attr-equals\">=</span>\n\t\t\t\t<span class=\"token punctuation\">\"</span>\n\t\t\t\t#foo\n\t\t\t\t<span class=\"token punctuation\">\"</span>\n\t\t\t</span>\n\t\t\t<span class=\"token punctuation\">></span>\n\t\t</span>\n\t\tClick me!\n\t\t<span class=\"token tag\">\n\t\t\t<span class=\"token punctuation\">&lt;/</span>\n\t\t\t<span class=\"token tag\">a</span>\n\t\t\t<span class=\"token punctuation\">></span>\n\t\t</span>\n\t\t<span class=\"token entity named-entity\" title=\"&amp;\">&amp;amp;</span>\n\t</span>\n\t<span class=\"token punctuation\">```</span>\n</span>\n\n<span class=\"token code\">\n\t<span class=\"token punctuation\">```</span>\n\t<span class=\"token code-language\">unknownLanguage</span>\n\t<span class=\"token code-block language-unknownlanguage needs-highlighting\">\n\t\t&lt;a href=\"#foo\">Click me!&lt;/a> &amp;amp;\n\t</span>\n\t<span class=\"token punctuation\">```</span>\n</span>\n"
  },
  {
    "path": "tests/languages/markdown/code-block_feature.test",
    "content": "```html\n<a href=\"#foo\">Click me!</a> &amp;\n```\n\n```js\nvar foo = 0;\n```\n\n----------------------------------------------------\n\n[\n\t[\"code\", [\n\t\t[\"punctuation\", \"```\"],\n\t\t[\"code-language\", \"html\"],\n\n\t\t[\"code-block\", [\n\t\t\t[\"tag\", [\n\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t[\"tag\", [\"a\"]],\n\t\t\t\t[\"attr-name\", [\"href\"]],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"#foo\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]],\n\t\t\t\"Click me!\",\n\t\t\t[\"tag\", [\n\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t[\"tag\", [\"a\"]],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]],\n\t\t\t[\"entity\", \"&amp;\"]\n\t\t]],\n\n\t\t[\"punctuation\", \"```\"]\n\t]],\n\n\t[\"code\", [\n\t\t[\"punctuation\", \"```\"], [\"code-language\", \"js\"],\n\t\t[\"code-block\", \"var foo = 0;\"],\n\t\t[\"punctuation\", \"```\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/markdown/code_block_language_detection_feature.html.test",
    "content": "```js\nlet a = 0;\n```\n\n``` c++\nint a = 0;\n```\n\n``` c#\nvar a = 0;\n```\n\n```{r pressure, echo=FALSE}\nplot(pressure)\n```\n\n----------------------------------------------------\n\n<span class=\"token code\">\n\t<span class=\"token punctuation\">```</span>\n\t<span class=\"token code-language\">js</span>\n\t<span class=\"token code-block language-js needs-highlighting\">let a = 0;</span>\n\t<span class=\"token punctuation\">```</span>\n</span>\n\n<span class=\"token code\">\n\t<span class=\"token punctuation\">```</span>\n\t<span class=\"token code-language\">c++</span>\n\t<span class=\"token code-block language-cpp needs-highlighting\">int a = 0;</span>\n\t<span class=\"token punctuation\">```</span>\n</span>\n\n<span class=\"token code\">\n\t<span class=\"token punctuation\">```</span>\n\t<span class=\"token code-language\">c#</span>\n\t<span class=\"token code-block language-csharp needs-highlighting\">var a = 0;</span>\n\t<span class=\"token punctuation\">```</span>\n</span>\n\n<span class=\"token code\">\n\t<span class=\"token punctuation\">```</span>\n\t<span class=\"token code-language\">{r pressure, echo=FALSE}</span>\n\t<span class=\"token code-block language-r needs-highlighting\">plot(pressure)</span>\n\t<span class=\"token punctuation\">```</span>\n</span>\n"
  },
  {
    "path": "tests/languages/markdown/code_feature.test",
    "content": "`foo bar baz`\r\n``foo `bar` baz``\r\n\r\n    foobar\r\n\r\n\tfoobar\r\n\tcontinuous\r\n\r\n``` js\r\nvar a = 0;\r\n```\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"code-snippet\", \"`foo bar baz`\"],\r\n\t[\"code-snippet\", \"``foo `bar` baz``\"],\r\n\r\n\t[\"code\", \"    foobar\"],\r\n\r\n\t[\"code\", \"\\tfoobar\\r\\n\\tcontinuous\"],\r\n\r\n\t[\"code\", [\r\n\t\t[\"punctuation\", \"```\"], [\"code-language\", \" js\"],\r\n\t\t[\"code-block\", \"var a = 0;\"],\r\n\t\t[\"punctuation\", \"```\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for code blocks and inline code. The first code block is\r\nindented with 4 spaces, the second one is indented with 1 tab.\r\nThe initial dot is necessary because of the first part being trimmed\r\nby the test runner.\r\n"
  },
  {
    "path": "tests/languages/markdown/front-matter-block_empty_feature.test",
    "content": "---\r\n---\r\n\r\n# Title\r\n\r\n---\r\nnormal paragraph\r\n\r\n---\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"front-matter-block\", [\r\n\t\t[\"punctuation\", \"---\"],\r\n\t\t[\"punctuation\", \"---\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t\" Title\"\r\n\t]],\r\n\r\n\t[\"hr\", \"---\"],\r\n\t\"\\r\\nnormal paragraph\\r\\n\\r\\n\",\r\n\r\n\t[\"hr\", \"---\"]\r\n]"
  },
  {
    "path": "tests/languages/markdown/front-matter-block_feature.test",
    "content": "---\r\nlayout: post\r\ntitle: Blogging Like a Hacker\r\n---\r\n\r\n# Title\r\n\r\n---\r\nnormal paragraph\r\n\r\n---\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"front-matter-block\", [\r\n\t\t[\"punctuation\", \"---\"],\r\n\t\t[\"front-matter\", \"layout: post\\r\\ntitle: Blogging Like a Hacker\"],\r\n\t\t[\"punctuation\", \"---\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"#\"],\r\n\t\t\" Title\"\r\n\t]],\r\n\r\n\t[\"hr\", \"---\"],\r\n\t\"\\r\\nnormal paragraph\\r\\n\\r\\n\",\r\n\r\n\t[\"hr\", \"---\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/markdown/hr_feature.test",
    "content": "***\r\n\r\n---\r\n\r\n* * *\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"hr\", \"***\"],\r\n\t[\"hr\", \"---\"],\r\n\t[\"hr\", \"* * *\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hr.\r\n"
  },
  {
    "path": "tests/languages/markdown/issue2966.test",
    "content": "* foo\n* `asd` afsdfsdfsdf\n* foo\n    * foo\n    * `REM`\n    * foo\n\n----------------------------------------------------\n\n[\n\t[\"list\", \"*\"], \" foo\\r\\n\",\n\t[\"list\", \"*\"], [\"code-snippet\", \"`asd`\"], \" afsdfsdfsdf\\r\\n\",\n\t[\"list\", \"*\"], \" foo\\r\\n    \",\n\t[\"list\", \"*\"], \" foo\\r\\n    \",\n\t[\"list\", \"*\"], [\"code-snippet\", \"`REM`\"],\n\t[\"list\", \"*\"], \" foo\"\n]\n"
  },
  {
    "path": "tests/languages/markdown/italic_feature.test",
    "content": "*foobar*\r\n*foo\r\nbar*\r\n_foobar_\r\n_foo\r\nbar_\r\n\r\n_foo __bar__ baz_\r\n_foo **bar** baz_\r\n_foo ~bar~ baz_\r\n_foo ~~bar~~ baz_\r\n_foo[bar](baz)_\r\n_foo `bar`_\r\n\r\n*foo __bar__ baz*\r\n*foo **bar** baz*\r\n*foo ~bar~ baz*\r\n*foo ~~bar~~ baz*\r\n*foo[bar](baz)*\r\n*foo `bar`*\r\n\r\nnot_italic_ _this_either\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\"foobar\"]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\"foo\\r\\nbar\"]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t[\"content\", [\"foobar\"]],\r\n\t\t[\"punctuation\", \"_\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t[\"content\", [\"foo\\r\\nbar\"]],\r\n\t\t[\"punctuation\", \"_\"]\r\n\t]],\r\n\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"__\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"_\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"_\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"strike\", [\r\n\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"_\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"strike\", [\r\n\t\t\t\t[\"punctuation\", \"~~\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"~~\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"_\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"url\", [\r\n\t\t\t\t\"[\",\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t\"](\",\r\n\t\t\t\t[\"url\", \"baz\"],\r\n\t\t\t\t\")\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"_\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"code-snippet\", \"`bar`\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"_\"]\r\n\t]],\r\n\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"__\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"strike\", [\r\n\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"strike\", [\r\n\t\t\t\t[\"punctuation\", \"~~\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"~~\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"url\", [\r\n\t\t\t\t\"[\",\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t\"](\",\r\n\t\t\t\t[\"url\", \"baz\"],\r\n\t\t\t\t\")\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"code-snippet\", \"`bar`\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\r\n\t\"\\r\\n\\r\\nnot_italic_ _this_either\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for italic. Also tests for inclusion of url.\r\n"
  },
  {
    "path": "tests/languages/markdown/list_feature.test",
    "content": "* foo\r\n+ bar\r\n- baz\r\n\r\n1. foo\r\n  2. bar\r\n42. baz\r\n\r\n1. list\r\n\t1. nested list\r\n\t\t- a\r\n\t\t- b\r\n\t2. foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"list\", \"*\"],\r\n\t\" foo\\r\\n\",\r\n\t[\"list\", \"+\"],\r\n\t\" bar\\r\\n\",\r\n\t[\"list\", \"-\"],\r\n\t\" baz\\r\\n\\r\\n\",\r\n\r\n\t[\"list\", \"1.\"],\r\n\t\" foo\\r\\n  \",\r\n\t[\"list\", \"2.\"],\r\n\t\" bar\\r\\n\",\r\n\t[\"list\", \"42.\"],\r\n\t\" baz\\r\\n\\r\\n\",\r\n\r\n\t[\"list\", \"1.\"],\r\n\t\" list\\r\\n\\t\",\r\n\t[\"list\", \"1.\"],\r\n\t\" nested list\\r\\n\\t\\t\",\r\n\t[\"list\", \"-\"],\r\n\t\" a\\r\\n\\t\\t\",\r\n\t[\"list\", \"-\"],\r\n\t\" b\\r\\n\\t\",\r\n\t[\"list\", \"2.\"],\r\n\t\" foo\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for list symbols.\r\n"
  },
  {
    "path": "tests/languages/markdown/nested_bold_italic_feature.test",
    "content": "**a *b* c**\r\n\r\n*a **b** c*\r\n\r\n***abc***\r\n\r\n*b **c***\r\n\r\n**b *c***\r\n\r\n***b *c**\r\n\r\n***c **c*\r\n\r\n*a \\* b*\r\n\r\n*a **b***\r\n\r\n**a *b***\r\n\r\n___foo___\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"a \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\"b\"\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t]],\r\n\t\t\t\" c\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"a \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\"b\"\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t]],\r\n\t\t\t\" c\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\"abc\"\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"b \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\"c\"\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"b \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\"c\"\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\"b \"\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t]],\r\n\t\t\t\"c\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\"c \"\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t]],\r\n\t\t\t\"c\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"a \\\\* b\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"italic\", [\r\n\t\t[\"punctuation\", \"*\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"a \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\"b\"\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"*\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"**\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"a \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\"b\"\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"**\"]\r\n\t]],\r\n\t[\"bold\", [\r\n\t\t[\"punctuation\", \"__\"],\r\n\t\t[\"content\", [\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t[\"content\", [\r\n\t\t\t\t\t\"foo\"\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"__\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for nested versions of bold and italic.\r\n"
  },
  {
    "path": "tests/languages/markdown/strike_feature.test",
    "content": "~~foobar~~\r\n~~foo\r\nbar~~\r\n~foobar~\r\n~foo\r\nbar~\r\n\r\n~foo *bar* baz~\r\n~foo _bar_ baz~\r\n~foo **bar** baz~\r\n~foo __bar__ baz~\r\n~foo[bar](baz)~\r\n~foo `bar`~\r\n\r\n~~foo *bar* baz~~\r\n~~foo _bar_ baz~~\r\n~~foo **bar** baz~~\r\n~~foo __bar__ baz~~\r\n~~foo[bar](baz)~~\r\n~~foo `bar`~~\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~~\"],\r\n\t\t[\"content\", [\"foobar\"]],\r\n\t\t[\"punctuation\", \"~~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~~\"],\r\n\t\t[\"content\", [\"foo\\r\\nbar\"]],\r\n\t\t[\"punctuation\", \"~~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"content\", [\"foobar\"]],\r\n\t\t[\"punctuation\", \"~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"content\", [\"foo\\r\\nbar\"]],\r\n\t\t[\"punctuation\", \"~\"]\r\n\t]],\r\n\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"__\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"url\", [\r\n\t\t\t\t\"[\",\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t\"](\",\r\n\t\t\t\t[\"url\", \"baz\"],\r\n\t\t\t\t\")\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"code-snippet\", \"`bar`\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~\"]\r\n\t]],\r\n\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"__\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"url\", [\r\n\t\t\t\t\"[\",\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t\"](\",\r\n\t\t\t\t[\"url\", \"baz\"],\r\n\t\t\t\t\")\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~~\"]\r\n\t]],\r\n\t[\"strike\", [\r\n\t\t[\"punctuation\", \"~~\"],\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"code-snippet\", \"`bar`\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"~~\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strike. Also tests for inclusion of bold, italic, and url.\r\n"
  },
  {
    "path": "tests/languages/markdown/table_feature.test",
    "content": "| Tables        | Are           | Cool  |\r\n| ------------- |:-------------:| -----:|\r\n| col 3 is      | right-aligned | $1600 |\r\n| col 2 is      | centered      |   $12 |\r\n| zebra stripes | are neat      |    $1 |\r\n\r\nMarkdown | Less | Pretty\r\n--- | --- | ---\r\n*Still* | `renders` | **nicely**\r\n1 | 2 | 3\r\n\r\n|Abc | Def   |\r\n--- | ---\r\n|`` `. ``|2|\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"table\", [\r\n\t\t[\"table-header-row\", [\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-header\", [\" Tables        \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-header\", [\" Are           \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-header\", [\" Cool  \"]],\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]],\r\n\t\t[\"table-line\", [\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"punctuation\", \"-------------\"],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"punctuation\", \":-------------:\"],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"punctuation\", \"-----:\"],\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]],\r\n\t\t[\"table-data-rows\", [\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\" col 3 is      \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\" right-aligned \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\" $1600 \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\" col 2 is      \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\" centered      \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\"   $12 \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\" zebra stripes \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\" are neat      \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\"    $1 \"]],\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"table-header-row\", [\r\n\t\t\t[\"table-header\", [\"Markdown \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-header\", [\" Less \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-header\", [\" Pretty\"]]\r\n\t\t]],\r\n\t\t[\"table-line\", [\r\n\t\t\t[\"punctuation\", \"---\"],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"punctuation\", \"---\"],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"punctuation\", \"---\"]\r\n\t\t]],\r\n\t\t[\"table-data-rows\", [\r\n\t\t\t[\"table-data\", [\r\n\t\t\t\t[\"italic\", [\r\n\t\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t\t[\"content\", [\"Still\"]],\r\n\t\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\r\n\t\t\t\t[\"code-snippet\", \"`renders`\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\r\n\t\t\t\t[\"bold\", [\r\n\t\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t\t[\"content\", [\"nicely\"]],\r\n\t\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\r\n\t\t\t[\"table-data\", [\"1 \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\" 2 \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\" 3\"]]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"table-header-row\", [\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-header\", [\"Abc \"]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-header\", [\" Def   \"]],\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]],\r\n\t\t[\"table-line\", [\r\n\t\t\t[\"punctuation\", \"---\"],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"punctuation\", \"---\"]\r\n\t\t]],\r\n\t\t[\"table-data-rows\", [\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\r\n\t\t\t\t[\"code-snippet\", \"`` `. ``\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"table-data\", [\"2\"]],\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tables.\r\n"
  },
  {
    "path": "tests/languages/markdown/title_feature.test",
    "content": "title 1\r\n==\r\n\r\nfoobar\r\n======\r\n\r\nÜberschrift\r\n===========\r\n\r\nÜberschrift\r\n--\r\n\r\ntitle 2\r\n--\r\n\r\n# title 1\r\n## title 2\r\n### title 3\r\n#### title 4\r\n##### title 5\r\n###### title 6\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"title\", [\"title 1\\r\\n\", [\"punctuation\", \"==\"]]],\r\n\t[\"title\", [\"foobar\\r\\n\", [\"punctuation\", \"======\"]]],\r\n\t[\"title\", [\"Überschrift\\r\\n\", [\"punctuation\", \"===========\"]]],\r\n\t[\"title\", [\"Überschrift\\r\\n\", [\"punctuation\", \"--\"]]],\r\n\t[\"title\", [\"title 2\\r\\n\", [\"punctuation\", \"--\"]]],\r\n\r\n\t[\"title\", [[\"punctuation\", \"#\"], \" title 1\"]],\r\n\t[\"title\", [[\"punctuation\", \"##\"], \" title 2\"]],\r\n\t[\"title\", [[\"punctuation\", \"###\"], \" title 3\"]],\r\n\t[\"title\", [[\"punctuation\", \"####\"], \" title 4\"]],\r\n\t[\"title\", [[\"punctuation\", \"#####\"], \" title 5\"]],\r\n\t[\"title\", [[\"punctuation\", \"######\"], \" title 6\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for titles.\r\n"
  },
  {
    "path": "tests/languages/markdown/url-reference_feature.test",
    "content": "[foo]: http://prismjs.com\r\n[foo]: http://prismjs.com \"foo\\\"bar\"\r\n[foo]: http://prismjs.com 'foo\\'bar'\r\n![foo]: http://prismjs.com (foo (bar\\) baz)\r\n[foo]: <http://prismjs.com> \"Prism\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"url-reference\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" http://prismjs.com\"\r\n\t]],\r\n\t[\"url-reference\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" http://prismjs.com \",\r\n\t\t[\"string\", \"\\\"foo\\\\\\\"bar\\\"\"]\r\n\t]],\r\n\t[\"url-reference\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" http://prismjs.com \",\r\n\t\t[\"string\", \"'foo\\\\'bar'\"]\r\n\t]],\r\n\t[\"url-reference\", [\r\n\t\t[\"punctuation\", \"!\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" http://prismjs.com \",\r\n\t\t[\"string\", \"(foo (bar\\\\) baz)\"]\r\n\t]],\r\n\t[\"url-reference\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://prismjs.com\",\r\n\t\t[\"punctuation\", \">\"],\r\n\t\t[\"string\", \"\\\"Prism\\\"\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for URL references."
  },
  {
    "path": "tests/languages/markdown/url_feature.test",
    "content": "[foo](http://prismjs.com)\r\n![foo](http://prismjs.com \"Foo\\\"bar\")\r\n[foo][bar]\r\n[foo] [bar]\r\n\r\n[foo\r\nbar](http://prismjs.com)\r\n\r\n[foo *bar* baz](http://prismjs.com)\r\n[foo _bar_ baz](http://prismjs.com)\r\n[foo **bar** baz](http://prismjs.com)\r\n[foo __bar__ baz](http://prismjs.com)\r\n[foo ~bar~ baz](http://prismjs.com)\r\n[foo ~~bar~~ baz](http://prismjs.com)\r\n[foo `bar` baz](http://prismjs.com)\r\n[`bar`](http://prismjs.com)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\"foo\"]],\r\n\t\t\"](\",\r\n\t\t[\"url\", \"http://prismjs.com\"],\r\n\t\t\")\"\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"operator\", \"!\"],\r\n\t\t\"[\",\r\n\t\t[\"content\", [\"foo\"]],\r\n\t\t\"](\",\r\n\t\t[\"url\", \"http://prismjs.com\"],\r\n\t\t[\"string\", \"\\\"Foo\\\\\\\"bar\\\"\"],\r\n\t\t\")\"\r\n\t]],\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\"foo\"]],\r\n\t\t\"][\",\r\n\t\t[\"variable\", \"bar\"],\r\n\t\t\"]\"\r\n\t]],\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\"foo\"]],\r\n\t\t\"] [\",\r\n\t\t[\"variable\", \"bar\"],\r\n\t\t\"]\"\r\n\t]],\r\n\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\"foo\\r\\nbar\"]],\r\n\t\t\"](\",\r\n\t\t[\"url\", \"http://prismjs.com\"],\r\n\t\t\")\"\r\n\t]],\r\n\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t\"](\",\r\n\t\t[\"url\", \"http://prismjs.com\"],\r\n\t\t\")\"\r\n\t]],\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t\"](\",\r\n\t\t[\"url\", \"http://prismjs.com\"],\r\n\t\t\")\"\r\n\t]],\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t\"](\",\r\n\t\t[\"url\", \"http://prismjs.com\"],\r\n\t\t\")\"\r\n\t]],\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"__\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t\"](\",\r\n\t\t[\"url\", \"http://prismjs.com\"],\r\n\t\t\")\"\r\n\t]],\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"strike\", [\r\n\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t\"](\",\r\n\t\t[\"url\", \"http://prismjs.com\"],\r\n\t\t\")\"\r\n\t]],\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"strike\", [\r\n\t\t\t\t[\"punctuation\", \"~~\"],\r\n\t\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t\t[\"punctuation\", \"~~\"]\r\n\t\t\t]],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t\"](\",\r\n\t\t[\"url\", \"http://prismjs.com\"],\r\n\t\t\")\"\r\n\t]],\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\r\n\t\t\t\"foo \",\r\n\t\t\t[\"code-snippet\", \"`bar`\"],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t\"](\",\r\n\t\t[\"url\", \"http://prismjs.com\"],\r\n\t\t\")\"\r\n\t]],\r\n\t[\"url\", [\r\n\t\t\"[\",\r\n\t\t[\"content\", [\r\n\t\t\t[\"code-snippet\", \"`bar`\"]\r\n\t\t]],\r\n\t\t\"](\",\r\n\t\t[\"url\", \"http://prismjs.com\"],\r\n\t\t\")\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for URLs.\r\n"
  },
  {
    "path": "tests/languages/markdown+graphql/description_feature.test",
    "content": "\"\"\"\r\nComplex multiline description\r\n# Title\r\n\"\"\"\r\ntype Baz {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"description\", [\r\n\t\t\"\\\"\\\"\\\"\",\r\n\t\t[\"language-markdown\", [\r\n\t\t\t\"\\r\\nComplex multiline description\\r\\n\",\r\n\t\t\t[\"title\", [[\"punctuation\", \"#\"], \" Title\"]]\r\n\t\t]],\r\n\t\t\"\\\"\\\"\\\"\"\r\n\t]],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"class-name\", \"Baz\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for descriptions."
  },
  {
    "path": "tests/languages/markdown+haml/markdown_inclusion.test",
    "content": ":markdown\r\n # Title 1\r\n\r\n~\r\n  :markdown\r\n   # Title 1\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-markdown\", [\r\n\t\t[\"filter-name\", \":markdown\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"title\", [\r\n\t\t\t\t[\"punctuation\", \"#\"],\r\n\t\t\t\t\" Title 1\"\r\n\t\t\t]]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"~\"],\r\n\t[\"filter-markdown\", [\r\n\t\t[\"filter-name\", \":markdown\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"title\", [\r\n\t\t\t\t[\"punctuation\", \"#\"],\r\n\t\t\t\t\" Title 1\"\r\n\t\t\t]]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Markdown filter in Haml. The tilde serves only as a separator.\r\nIndentation is intentionally less than 1 tab, otherwise markdown is\r\ninterpreted as code.\r\n"
  },
  {
    "path": "tests/languages/markdown+pug/markdown_inclusion.test",
    "content": ":markdown\r\n  # title\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-markdown\", [\r\n\t\t[\"filter-name\", \":markdown\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"title\", [\r\n\t\t\t\t[\"punctuation\", \"#\"],\r\n\t\t\t\t\" title\"\r\n\t\t\t]]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for markdown filter in pug.\r\n"
  },
  {
    "path": "tests/languages/markup/cdata_feature.test",
    "content": "<![CDATA[ foo bar baz ]]>\r\n<![CDATA[\r\nfoo bar baz\r\n]]>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"cdata\", \"<![CDATA[ foo bar baz ]]>\"],\r\n\t[\"cdata\", \"<![CDATA[\\r\\nfoo bar baz\\r\\n]]>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for CDATA sections, single-line and multi-line."
  },
  {
    "path": "tests/languages/markup/comment_feature.test",
    "content": "<!---->\r\n<!-- foo bar -->\r\n<!-- foo bar\r\nbaz -->\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"<!---->\"],\r\n\t[\"comment\", \"<!-- foo bar -->\"],\r\n\t[\"comment\", \"<!-- foo bar\\r\\nbaz -->\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for empty comment, single-line comment and multi-line comment."
  },
  {
    "path": "tests/languages/markup/doctype_feature.test",
    "content": "<!DOCTYPE html>\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\r\n\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\r\n<!DOCTYPE greeting SYSTEM \"hello.dtd\">\r\n<!DOCTYPE greeting [\r\n\t<!ELEMENT greeting (#PCDATA)>\r\n]>\r\n<!DOCTYPE greeting [\r\n\t<!ELEMENT greeting (#PCDATA)>\r\n\t<!ELEMENT subject (#PCDATA)>\r\n\t<!-- comment ]> -->\r\n]>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"doctype\", [\r\n\t\t[\"punctuation\", \"<!\"],\r\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\r\n\t\t[\"name\", \"html\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"doctype\", [\r\n\t\t[\"punctuation\", \"<!\"],\r\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\r\n\t\t[\"name\", \"HTML\"],\r\n\t\t[\"name\", \"PUBLIC\"],\r\n\t\t[\"string\", \"\\\"-//W3C//DTD HTML 4.01//EN\\\"\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"doctype\", [\r\n\t\t[\"punctuation\", \"<!\"],\r\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\r\n\t\t[\"name\", \"html\"],\r\n\t\t[\"name\", \"PUBLIC\"],\r\n\t\t[\"string\", \"\\\"-//W3C//DTD XHTML 1.0 Strict//EN\\\"\"],\r\n\r\n\t\t[\"string\", \"\\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\\\"\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"doctype\", [\r\n\t\t[\"punctuation\", \"<!\"],\r\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\r\n\t\t[\"name\", \"greeting\"],\r\n\t\t[\"name\", \"SYSTEM\"],\r\n\t\t[\"string\", \"\\\"hello.dtd\\\"\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"doctype\", [\r\n\t\t[\"punctuation\", \"<!\"],\r\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\r\n\t\t[\"name\", \"greeting\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"internal-subset\", [\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"!ELEMENT\"]],\r\n\t\t\t\t[\"attr-name\", [\"greeting\"]],\r\n\t\t\t\t[\"attr-name\", [\"(#PCDATA)\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"doctype\", [\r\n\t\t[\"punctuation\", \"<!\"],\r\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\r\n\t\t[\"name\", \"greeting\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"internal-subset\", [\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"!ELEMENT\"]],\r\n\t\t\t\t[\"attr-name\", [\"greeting\"]],\r\n\t\t\t\t[\"attr-name\", [\"(#PCDATA)\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"tag\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"tag\", [\"!ELEMENT\"]],\r\n\t\t\t\t[\"attr-name\", [\"subject\"]],\r\n\t\t\t\t[\"attr-name\", [\"(#PCDATA)\"]],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"comment\", \"<!-- comment ]> -->\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for different doctypes, single-line and multi-line.\r\n"
  },
  {
    "path": "tests/languages/markup/entity_feature.html.test",
    "content": "&amp;\n&thetasym;\n&#65;\n&#x41;\n&#x26f5;\n\n----------------------------------------------------\n\n<span class=\"token entity named-entity\" title=\"&amp;\">&amp;amp;</span>\n<span class=\"token entity named-entity\" title=\"&thetasym;\">&amp;thetasym;</span>\n<span class=\"token entity\" title=\"&#65;\">&amp;#65;</span>\n<span class=\"token entity\" title=\"&#x41;\">&amp;#x41;</span>\n<span class=\"token entity\" title=\"&#x26f5;\">&amp;#x26f5;</span>\n\n----------------------------------------------------\n\nChecks for HTML/XML character entity references.\n"
  },
  {
    "path": "tests/languages/markup/issue3441.test",
    "content": "<google-chart data='[[\"Month\", \"Days\"], [\"Jan\", 31]]'></google-chart>\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"google-chart\"]],\n\t\t[\"attr-name\", [\"data\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"'\"],\n\t\t\t\"[[\\\"Month\\\", \\\"Days\\\"], [\\\"Jan\\\", 31]]\",\n\t\t\t[\"punctuation\", \"'\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"google-chart\"]],\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/markup/issue585.test",
    "content": "<Läufer>foo</Läufer>\r\n<tag läufer=\"läufer\">\r\n<läufer:tag>baz</läufer:tag>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"Läufer\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\"foo\",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"Läufer\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"tag\"]],\r\n\t\t[\"attr-name\", [\"läufer\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"läufer\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"namespace\", \"läufer:\"],\r\n\t\t\t\"tag\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\"baz\",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"namespace\", \"läufer:\"],\r\n\t\t\t\"tag\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags, attributes and namespaces containing unicode characters.\r\nSee #585 for details.\r\n"
  },
  {
    "path": "tests/languages/markup/issue888.test",
    "content": "<android.support.v7.widget.CardView>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"android.support.v7.widget.CardView\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tag names containing dots.\r\nSee #888 for details.\r\n"
  },
  {
    "path": "tests/languages/markup/prolog_feature.test",
    "content": "<?xml version=\"1.0\"?>\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<?xml-stylesheet href=\"tei2html.xsl\"\r\ntype=\"text/xsl\"?>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"prolog\", \"<?xml version=\\\"1.0\\\"?>\"],\r\n\t[\"prolog\", \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\"],\r\n\t[\"prolog\", \"<?xml-stylesheet href=\\\"tei2html.xsl\\\"\\r\\ntype=\\\"text/xsl\\\"?>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for different XML prologs, single-line and multi-line."
  },
  {
    "path": "tests/languages/markup/tag_attribute_feature.test",
    "content": "<div class=\"test\" foo bar=baz>\r\n<div foo='bar'>\r\n<div class=\"foo\r\nbar\r\nbaz\">\r\n<div foo:bar=42>\r\n<div foo = 42 bar = \"42\">\r\n<div foo=\"=\\\"bar=baz/>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"test\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"foo\"]],\r\n\t\t[\"attr-name\", [\"bar\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\"baz\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"foo\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"foo\\r\\nbar\\r\\nbaz\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\r\n\t\t\t[\"namespace\", \"foo:\"],\r\n\t\t\t\"bar\"\r\n\t\t]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\"42\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"foo\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\" 42\"\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"bar\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"42\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"foo\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"=\\\\\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"bar\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\"baz/\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-quoted, double-quoted and unquoted attributes, attributes without value and\r\nnamespaced attributes.\r\n"
  },
  {
    "path": "tests/languages/markup/tag_feature.test",
    "content": "<p></p>\r\n<div>dummy</div>\r\n<div\r\n> </div\r\n>\r\n<foo:bar> </foo:bar>\r\n<div\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"p\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"p\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t\"dummy\",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"], [\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"], [\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"namespace\", \"foo:\"],\r\n\t\t\t\"bar\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"namespace\", \"foo:\"],\r\n\t\t\t\"bar\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n<div\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for empty tags, tags that span multiple lines and namespaces in tag names.\r\nAlso checks that unclosed tags (e.g. \"<div\") are not highlighted.\r\n"
  },
  {
    "path": "tests/languages/markup!+css/css_inclusion.test",
    "content": "<style type=\"text/css\">\r\nfoo {\r\n\tbar: baz;\r\n}\r\n</style>\r\n\r\n<style>\r\n.bar { }\r\n<![CDATA[\r\nfoo {\r\n\tbar: baz;\r\n}\r\n]]>\r\n#foo { }\r\n</style>\r\n\r\n<foo style=\"bar:baz;\">\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"style\"]],\r\n\t\t[\"attr-name\", [\"type\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"text/css\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"style\", [\r\n\t\t[\"language-css\", [\r\n\t\t\t[\"selector\", \"foo\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t\t[\"property\", \"bar\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\" baz\",\r\n\t\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"style\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"style\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"style\", [\r\n\t\t[\"language-css\", [\r\n\t\t\t[\"selector\", \".bar\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"included-cdata\", [\r\n\t\t\t[\"cdata\", \"<![CDATA[\"],\r\n\t\t\t[\"language-css\", [\r\n\t\t\t\t[\"selector\", \"foo\"],\r\n\t\t\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t\t\t[\"property\", \"bar\"],\r\n\t\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\t\" baz\",\r\n\t\t\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"cdata\", \"]]>\"]\r\n\t\t]],\r\n\t\t[\"language-css\", [\r\n\t\t\t[\"selector\", \"#foo\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"style\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"foo\"]],\r\n\t\t[\"special-attr\", [\r\n\t\t\t[\"attr-name\", \"style\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"value\", [\r\n\t\t\t\t\t[\"property\", \"bar\"],\r\n\t\t\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\t\t\"baz\",\r\n\t\t\t\t\t[\"punctuation\", \";\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for CSS usage inside Markup, using <style> tag and style attribute.\r\n"
  },
  {
    "path": "tests/languages/markup!+css+javascript/issue1240.test",
    "content": "<script>\r\n\tlet str = `\r\n\t\t<style>\r\n\t\t\t.foo { color: blue; }\r\n\t\t</style>\r\n\t`;\r\n</script>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"script\", [\r\n\t\t[\"language-javascript\", [\r\n\t\t\t[\"keyword\", \"let\"],\r\n\t\t\t\" str \",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"template-string\", [\r\n\t\t\t\t[\"template-punctuation\", \"`\"],\r\n\t\t\t\t[\"string\", \"\\r\\n\\t\\t<style>\\r\\n\\t\\t\\t.foo { color: blue; }\\r\\n\\t\\t</style>\\r\\n\\t\"],\r\n\t\t\t\t[\"template-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Javascript usage inside Markup, using <script> tags.\r\n"
  },
  {
    "path": "tests/languages/markup!+javascript/javascript_inclusion.test",
    "content": "<script type=\"text/javascript\">foo()</script>\r\n\r\n<script>\r\n\"foo bar\"\r\n</script>\r\n\r\n<script type=\"application/javascript\">\r\nvar a = 0;\r\n<![CDATA[\r\nlet foo = '</script>';\r\n]]>\r\n\"foo\"\r\n</script>\r\n\r\n<foo onclick=\"this.textContent='Clicked!'\">\r\n<foo mouseover=\"this.textContent='Over!'\">\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"attr-name\", [\"type\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"text/javascript\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"script\", [\r\n\t\t[\"language-javascript\", [\r\n\t\t\t[\"function\", \"foo\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"script\", [\r\n\t\t[\"language-javascript\", [\r\n\t\t\t[\"string\", \"\\\"foo bar\\\"\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"attr-name\", [\"type\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"application/javascript\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"script\", [\r\n\t\t[\"language-javascript\", [\r\n\t\t\t[\"keyword\", \"var\"],\r\n\t\t\t\" a \",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"number\", \"0\"],\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\t\t[\"included-cdata\", [\r\n\t\t\t[\"cdata\", \"<![CDATA[\"],\r\n\t\t\t[\"language-javascript\", [\r\n\t\t\t\t[\"keyword\", \"let\"],\r\n\t\t\t\t\" foo \",\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"string\", \"'</script>'\"],\r\n\t\t\t\t[\"punctuation\", \";\"]\r\n\t\t\t]],\r\n\t\t\t[\"cdata\", \"]]>\"]\r\n\t\t]],\r\n\t\t[\"language-javascript\", [\r\n\t\t\t[\"string\", \"\\\"foo\\\"\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"foo\"]],\r\n\t\t[\"special-attr\", [\r\n\t\t\t[\"attr-name\", \"onclick\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"value\", [\r\n\t\t\t\t\t[\"keyword\", \"this\"],\r\n\t\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\t\"textContent\",\r\n\t\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t\t[\"string\", \"'Clicked!'\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"foo\"]],\r\n\t\t[\"attr-name\", [\"mouseover\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"this.textContent='Over!'\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Javascript usage inside Markup, using <script> tags.\r\n"
  },
  {
    "path": "tests/languages/markup+actionscript/xml_feature.test",
    "content": "var employees:XML =\r\n\t<employees>\r\n\t\t<employee ssn=\"123-123-1234\"></employee>\r\n\t</employees>;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"var\"],\r\n\t\" employees\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"constant\", \"XML\"],\r\n\t[\"operator\", \"=\"],\r\n\r\n\t[\"xml\", [\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"employees\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"xml\", [\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"employee\"]],\r\n\t\t\t[\"attr-name\", [\"ssn\"]],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t\"123-123-1234\",\r\n\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"xml\", [\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"employee\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"xml\", [\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"employees\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for XML variables in ActionScript.\r\n"
  },
  {
    "path": "tests/languages/markup+css+wiki/table-tag_feature.test",
    "content": "{|\r\n| Foo\r\n| Bar\r\n|-\r\n| Baz\r\n| Foobar\r\n|}\r\n\r\n{|\r\n|Foo\r\nbar\r\n\r\nbaz\r\n|\r\n''Foobar''\r\n|}\r\n\r\n{|\r\n| Foo || Bar || Baz\r\n|-\r\n| Baz || Bar || Foo\r\n|}\r\n\r\n{|\r\n! style=\"text-align:left;\"| Foo\r\n! Bar\r\n! Baz\r\n|-\r\n| foo\r\n| bar\r\n| baz\r\n|}\r\n\r\n{|\r\n! style=\"color:red;\"| Foo !! style=\"color:blue;\"| Bar !! Baz\r\n|-\r\n| foo || style=\"font-weight:bold;\"| bar || baz\r\n|}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{|\"],\r\n\t[\"punctuation\", \"|\"], \" Foo\\r\\n\",\r\n\t[\"punctuation\", \"|\"], \" Bar\\r\\n\",\r\n\t[\"punctuation\", \"|-\"],\r\n\t[\"punctuation\", \"|\"], \" Baz\\r\\n\",\r\n\t[\"punctuation\", \"|\"], \" Foobar\\r\\n\",\r\n\t[\"punctuation\", \"|}\"],\r\n\r\n\t[\"punctuation\", \"{|\"],\r\n\t[\"punctuation\", \"|\"], \"Foo\\r\\nbar\\r\\n\\r\\nbaz\\r\\n\",\r\n\t[\"punctuation\", \"|\"],\r\n\t[\"emphasis\", [[\"punctuation\", \"''\"], [\"italic\", \"Foobar\"], [\"punctuation\", \"''\"]]],\r\n\t[\"punctuation\", \"|}\"],\r\n\r\n\t[\"punctuation\", \"{|\"],\r\n\t[\"punctuation\", \"|\"], \" Foo \",\r\n\t[\"punctuation\", \"||\"], \" Bar \",\r\n\t[\"punctuation\", \"||\"], \" Baz\\r\\n\",\r\n\t[\"punctuation\", \"|-\"],\r\n\t[\"punctuation\", \"|\"], \" Baz \",\r\n\t[\"punctuation\", \"||\"], \" Bar \",\r\n\t[\"punctuation\", \"||\"], \" Foo\\r\\n\",\r\n\t[\"punctuation\", \"|}\"],\r\n\r\n\t[\"punctuation\", \"{|\"],\r\n\t[\"punctuation\", \"!\"],\r\n\t[\"table-tag\", [\r\n\t\t[\"special-attr\", [\r\n\t\t\t[\"attr-name\", \"style\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"value\", [\r\n\t\t\t\t\t[\"property\", \"text-align\"],\r\n\t\t\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\t\t\"left\",\r\n\t\t\t\t\t[\"punctuation\", \";\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"table-bar\", \"|\"]\r\n\t]], \" Foo\\r\\n\",\r\n\t[\"punctuation\", \"!\"], \" Bar\\r\\n\",\r\n\t[\"punctuation\", \"!\"], \" Baz\\r\\n\",\r\n\t[\"punctuation\", \"|-\"],\r\n\t[\"punctuation\", \"|\"], \" foo\\r\\n\",\r\n\t[\"punctuation\", \"|\"], \" bar\\r\\n\",\r\n\t[\"punctuation\", \"|\"], \" baz\\r\\n\",\r\n\t[\"punctuation\", \"|}\"],\r\n\r\n\t[\"punctuation\", \"{|\"],\r\n\t[\"punctuation\", \"!\"],\r\n\t[\"table-tag\", [\r\n\t\t[\"special-attr\", [\r\n\t\t\t[\"attr-name\", \"style\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"value\", [\r\n\t\t\t\t\t[\"property\", \"color\"],\r\n\t\t\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\t\t\"red\",\r\n\t\t\t\t\t[\"punctuation\", \";\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"table-bar\", \"|\"]\r\n\t]], \" Foo \",\r\n\t[\"punctuation\", \"!!\"],\r\n\t[\"table-tag\", [\r\n\t\t[\"special-attr\", [\r\n\t\t\t[\"attr-name\", \"style\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"value\", [\r\n\t\t\t\t\t[\"property\", \"color\"],\r\n\t\t\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\t\t\"blue\",\r\n\t\t\t\t\t[\"punctuation\", \";\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"table-bar\", \"|\"]\r\n\t]], \" Bar \",\r\n\t[\"punctuation\", \"!!\"], \" Baz\\r\\n\",\r\n\t[\"punctuation\", \"|-\"],\r\n\t[\"punctuation\", \"|\"], \" foo \",\r\n\t[\"punctuation\", \"||\"],\r\n\t[\"table-tag\", [\r\n\t\t[\"special-attr\", [\r\n\t\t\t[\"attr-name\", \"style\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"value\", [\r\n\t\t\t\t\t[\"property\", \"font-weight\"],\r\n\t\t\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\t\t\"bold\",\r\n\t\t\t\t\t[\"punctuation\", \";\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"table-bar\", \"|\"]\r\n\t]], \" bar \",\r\n\t[\"punctuation\", \"||\"], \" baz\\r\\n\",\r\n\t[\"punctuation\", \"|}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tables and cell attributes.\r\nNote: Markup is loaded before CSS so that inline styles are added into grammar.\r\n"
  },
  {
    "path": "tests/languages/markup+haml/markup_feature.test",
    "content": "<div>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"markup\", [\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"div\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for embedded markup.\r\n"
  },
  {
    "path": "tests/languages/markup+http/html_inclusion.test",
    "content": "Content-type: text/html\r\n\r\n<b></b>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"header\", [\r\n\t\t[\"header-name\", \"Content-type\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"header-value\", \"text/html\"]\r\n\t]],\r\n\t[\"text-html\", [\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"b\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"b\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for HTML content in HTTP.\r\n"
  },
  {
    "path": "tests/languages/markup+javascript+csharp+aspnet/script_feature.test",
    "content": "<script runat=\"server\">#pragma</script>\r\n<script>/foo/</script>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"attr-name\", [\"runat\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"server\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"asp-script\", [\r\n\t\t[\"preprocessor\", [\r\n\t\t\t\"#\",\r\n\t\t\t[\"directive\", \"pragma\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"script\", [\r\n\t\t[\"language-javascript\", [\r\n\t\t\t[\"regex\", [\r\n\t\t\t\t[\"regex-delimiter\", \"/\"],\r\n\t\t\t\t[\"regex-source\", \"foo\"],\r\n\t\t\t\t[\"regex-delimiter\", \"/\"]\r\n\t\t\t]]\r\n\t\t]]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"script\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for scripts containing C# code.\r\nAlso checks that those don't break normal JS scripts.\r\nNote: Markup is loaded before Javascript so that scripts are added into grammar.\r\n"
  },
  {
    "path": "tests/languages/markup+php/issue1582.test",
    "content": "<?php\r\n\r\n\techo '<?xml version=\"1.0\" encoding=\"UTF-8\"?><tracker />';\r\n\techo PHP_EOL;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?php\"],\r\n\t\t[\"keyword\", \"echo\"],\r\n\t\t[\"string\", \"'<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?><tracker />'\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"keyword\", \"echo\"],\r\n\t\t[\"constant\", \"PHP_EOL\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for PHP closing tags '?>' inside of strings.\r\nSee #1582 for details.\r\n"
  },
  {
    "path": "tests/languages/markup+php/php_in_markup_feature.test",
    "content": "<div><?php echo $foo; ?></div>\r\n<div><? echo $foo; ?></div>\r\n<div class=\"<?php echo $foo; ?>\">\r\n<div class=\"<? echo $foo; ?>\">\r\n<div><?= $foo; ?></div>\r\n___PHP1___<?php 1 ?>___PHP2___ <?php 2 ?>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?php\"],\r\n\t\t[\"keyword\", \"echo\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"delimiter\", \"?>\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?\"],\r\n\t\t[\"keyword\", \"echo\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"delimiter\", \"?>\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"php\", [\r\n\t\t\t\t[\"delimiter\", \"<?php\"],\r\n\t\t\t\t[\"keyword\", \"echo\"],\r\n\t\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t\t[\"delimiter\", \"?>\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"php\", [\r\n\t\t\t\t[\"delimiter\", \"<?\"],\r\n\t\t\t\t[\"keyword\", \"echo\"],\r\n\t\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t\t[\"delimiter\", \"?>\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?=\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"delimiter\", \"?>\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n___PHP1___\",\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?php\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"delimiter\", \"?>\"]\r\n\t]],\r\n\t\"___PHP2___ \",\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?php\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"delimiter\", \"?>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for PHP inside Markup.\r\n"
  },
  {
    "path": "tests/languages/markup+php/php_with_closing_tag_in_markup_feature.test",
    "content": "<?php\r\n\r\n\t// '\r\n\t# \"\r\n\t//*\r\n\techo '?>' + \"?>\"; /* ?> */\r\n\techo PHP_EOL;\r\n\t// */\r\n\t// ?>\r\n\r\n<?php # ?>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?php\"],\r\n\t\t[\"comment\", \"// '\"],\r\n\t\t[\"comment\", \"# \\\"\"],\r\n\t\t[\"comment\", \"//*\"],\r\n\t\t[\"keyword\", \"echo\"],\r\n\t\t[\"string\", \"'?>'\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"string\", [\"\\\"?>\\\"\"]],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"comment\", \"/* ?> */\"],\r\n\t\t[\"keyword\", \"echo\"],\r\n\t\t[\"constant\", \"PHP_EOL\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"comment\", \"// */\"],\r\n\t\t[\"comment\", \"// \"],\r\n\t\t[\"delimiter\", \"?>\"]\r\n\t]],\r\n\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?php\"],\r\n\t\t[\"comment\", \"# \"],\r\n\t\t[\"delimiter\", \"?>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for PHP closing tags '?>' inside of strings and comments.\r\n"
  },
  {
    "path": "tests/languages/markup+pug/markup_feature.test",
    "content": "<div>\r\n\t<span>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"markup\", [\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"div\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"markup\", [\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"span\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Markup inside Jade.\r\n"
  },
  {
    "path": "tests/languages/markup+tt2/tt2_in_markup_feature.test",
    "content": "<div>[%  foo.bar.baz  %]</div>\r\n<div>[%- foo.bar.baz  %]</div>\r\n<div>[%  foo.bar.baz -%]</div>\r\n<div>[%- foo.bar.baz -%]</div>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tt2\", [\r\n\t\t[\"delimiter\", \"[%\"],\r\n\t\t[\"variable\", \"foo.bar.baz\"],\r\n\t\t[\"delimiter\", \"%]\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tt2\", [\r\n\t\t[\"delimiter\", \"[%-\"],\r\n\t\t[\"variable\", \"foo.bar.baz\"],\r\n\t\t[\"delimiter\", \"%]\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tt2\", [\r\n\t\t[\"delimiter\", \"[%\"],\r\n\t\t[\"variable\", \"foo.bar.baz\"],\r\n\t\t[\"delimiter\", \"-%]\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tt2\", [\r\n\t\t[\"delimiter\", \"[%-\"],\r\n\t\t[\"variable\", \"foo.bar.baz\"],\r\n\t\t[\"delimiter\", \"-%]\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Template Toolkit 2 inside Markup.\r\n"
  },
  {
    "path": "tests/languages/mata/class-name_feature.test",
    "content": "struct mystruct {\n\treal scalar n1, n2\n\treal matrix X\n}\n\nclass coord {\n\treal scalar x, y\n\treal scalar length(), angle()\n}\nreal scalar coord::length()\n{\n\treturn(sqrt(x^2 + y^2))\n}\nreal scalar coord::angle()\n{\n\treturn(atan2(y, x)*360/(2*pi()))\n}\nclass rotated_coord extends coord {\n\treal scalar theta\n\treal scalar angle()\n\tvoid new()\n}\nreal scalar rotated_coord::angle()\n{\n\treturn(super.angle() - theta)\n}\nvoid rotated_coord::new()\n{\n\ttheta = 0\n}\n\nclass V {\npublic:\n\treal matrix M\n\tstatic real scalar count\n\tclass coord scalar c\n\treal matrix inverse()\n\tclass coord scalar c()\nprivate:\n\treal scalar type\nprotected:\n\treal scalar type()\n}\n\nclass cow extends animal {}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"struct\"], [\"class-name\", \"mystruct\"], [\"punctuation\", \"{\"],\n\t[\"type\", [\"real scalar\"]], \" n1\", [\"punctuation\", \",\"], \" n2\\r\\n\\t\",\n\t[\"type\", [\"real matrix\"]], \" X\\r\\n\",\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"coord\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"type\", [\"real scalar\"]],\n\t\" x\",\n\t[\"punctuation\", \",\"],\n\t\" y\\r\\n\\t\",\n\n\t[\"type\", [\"real scalar\"]],\n\t[\"function\", \"length\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\t[\"function\", \"angle\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"type\", [\"real scalar\"]],\n\t\" coord\",\n\t[\"operator\", \"::\"],\n\t[\"function\", \"length\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"return\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"sqrt\"],\n\t[\"punctuation\", \"(\"],\n\t\"x\",\n\t[\"operator\", \"^\"],\n\t[\"number\", \"2\"],\n\t[\"operator\", \"+\"],\n\t\" y\",\n\t[\"operator\", \"^\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"type\", [\"real scalar\"]],\n\t\" coord\",\n\t[\"operator\", \"::\"],\n\t[\"function\", \"angle\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"return\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"atan2\"],\n\t[\"punctuation\", \"(\"],\n\t\"y\",\n\t[\"punctuation\", \",\"],\n\t\" x\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"*\"],\n\t[\"number\", \"360\"],\n\t[\"operator\", \"/\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"2\"],\n\t[\"operator\", \"*\"],\n\t[\"function\", \"pi\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"rotated_coord\"],\n\t[\"keyword\", \"extends\"],\n\t[\"class-name\", \"coord\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"type\", [\"real scalar\"]],\n\t\" theta\\r\\n\\t\",\n\n\t[\"type\", [\"real scalar\"]],\n\t[\"function\", \"angle\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"type\", [\n\t\t[\"keyword\", \"void\"]\n\t]],\n\t[\"function\", \"new\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"type\", [\"real scalar\"]],\n\t\" rotated_coord\",\n\t[\"operator\", \"::\"],\n\t[\"function\", \"angle\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"return\"],\n\t[\"punctuation\", \"(\"],\n\t\"super\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"angle\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"-\"],\n\t\" theta\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"type\", [\n\t\t[\"keyword\", \"void\"]\n\t]],\n\t\" rotated_coord\",\n\t[\"operator\", \"::\"],\n\t[\"function\", \"new\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n\\ttheta \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"V\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"public\"],\n\t[\"operator\", \":\"],\n\n\t[\"type\", [\"real matrix\"]],\n\t\" M\\r\\n\\t\",\n\n\t[\"keyword\", \"static\"],\n\t[\"type\", [\"real scalar\"]],\n\t\" count\\r\\n\\t\",\n\n\t[\"type\", [\n\t\t[\"keyword\", \"class\"],\n\t\t\" coord scalar\"\n\t]],\n\t\" c\\r\\n\\t\",\n\n\t[\"type\", [\"real matrix\"]],\n\t[\"function\", \"inverse\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"type\", [\n\t\t[\"keyword\", \"class\"],\n\t\t\" coord scalar\"\n\t]],\n\t[\"function\", \"c\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"private\"],\n\t[\"operator\", \":\"],\n\n\t[\"type\", [\"real scalar\"]],\n\t\" type\\r\\n\",\n\n\t[\"keyword\", \"protected\"],\n\t[\"operator\", \":\"],\n\n\t[\"type\", [\"real scalar\"]],\n\t[\"function\", \"type\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"cow\"],\n\t[\"keyword\", \"extends\"],\n\t[\"class-name\", \"animal\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/mata/comment_feature.test",
    "content": "/* enclosed comment */\n// rest-of-line comment\n\n/* What follows uses an approximation formula: */\n/*\nWe use the approximation based on sin(x) approximately\nequaling x for small x; x measure in radians\n*/\n\n/*\nfor (i=1; i<=rows(x); i++) { /* normalization */\n\tx[i] = x[i] :/ value[i]\n}\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"/* enclosed comment */\"],\n\t[\"comment\", \"// rest-of-line comment\"],\n\n\t[\"comment\", \"/* What follows uses an approximation formula: */\"],\n\t[\"comment\", \"/*\\r\\nWe use the approximation based on sin(x) approximately\\r\\nequaling x for small x; x measure in radians\\r\\n*/\"],\n\n\t[\"comment\", \"/*\\r\\nfor (i=1; i<=rows(x); i++) { /* normalization */\\r\\n\\tx[i] = x[i] :/ value[i]\\r\\n}\\r\\n*/\"]\n]\n"
  },
  {
    "path": "tests/languages/mata/constant_feature.test",
    "content": "NULL\n\n----------------------------------------------------\n\n[\n\t[\"constant\", \"NULL\"]\n]\n"
  },
  {
    "path": "tests/languages/mata/keyword_feature.test",
    "content": "break;\nclass;\ncontinue;\ndo;\nelse;\nend;\nextends;\nexternal;\nfinal;\nfor;\nfunction;\ngoto;\nif;\npragma;\nprivate;\nprotected;\npublic;\nreturn;\nstatic;\nstruct;\nunset;\nunused;\nversion;\nvirtual;\nwhile;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"do\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"end\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"external\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"final\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"function\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"goto\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"pragma\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"private\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"protected\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"public\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"struct\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"unset\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"unused\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"version\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"virtual\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/mata/missing_feature.test",
    "content": ".\n.a\n.b\n\n----------------------------------------------------\n\n[\n\t[\"missing\", \".\"],\n\t[\"missing\", \".a\"],\n\t[\"missing\", \".b\"]\n]\n"
  },
  {
    "path": "tests/languages/mata/number_feature.test",
    "content": "2\n3.14159\n-7.2\n5i\n1.213e+32\n1.213E+32\n1.921fb54442d18X+001\n1.921fb54442d18x+001\n1.921fb54442d18X+001i\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"2\"],\n\t[\"number\", \"3.14159\"],\n\t[\"operator\", \"-\"], [\"number\", \"7.2\"],\n\t[\"number\", \"5i\"],\n\t[\"number\", \"1.213e+32\"],\n\t[\"number\", \"1.213E+32\"],\n\t[\"number\", \"1.921fb54442d18X+001\"],\n\t[\"number\", \"1.921fb54442d18x+001\"],\n\t[\"number\", \"1.921fb54442d18X+001i\"]\n]\n"
  },
  {
    "path": "tests/languages/mata/operator_feature.test",
    "content": "+  -  *  /  ^\n:+ :- :* :/ :^\n++ --\n\n\\ :: ..\n:| | :& &\n! && ||\n\n ==  !=  >=  >  <  <=\n:== :!= :>= :> :< :<=\n\n? :\n=\n#\n\na’ a` a'\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"^\"],\n\n\t[\"operator\", \":+\"],\n\t[\"operator\", \":-\"],\n\t[\"operator\", \":*\"],\n\t[\"operator\", \":/\"],\n\t[\"operator\", \":^\"],\n\n\t[\"operator\", \"++\"],\n\t[\"operator\", \"--\"],\n\n\t[\"operator\", \"\\\\\"], [\"operator\", \"::\"], [\"operator\", \"..\"],\n\t[\"operator\", \":|\"], [\"operator\", \"|\"], [\"operator\", \":&\"], [\"operator\", \"&\"],\n\t[\"operator\", \"!\"], [\"operator\", \"&&\"], [\"operator\", \"||\"],\n\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\n\t[\"operator\", \":==\"],\n\t[\"operator\", \":!=\"],\n\t[\"operator\", \":>=\"],\n\t[\"operator\", \":>\"],\n\t[\"operator\", \":<\"],\n\t[\"operator\", \":<=\"],\n\n\t[\"operator\", \"?\"], [\"operator\", \":\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"#\"],\n\n\t\"\\r\\n\\r\\na\",\n\t[\"operator\", \"’\"],\n\t\" a\",\n\t[\"operator\", \"`\"],\n\t\" a\",\n\t[\"operator\", \"'\"]\n]\n"
  },
  {
    "path": "tests/languages/mata/punctuation_feature.test",
    "content": "( ) [ ] { }\n, ;\n\nt.n1\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n\\r\\nt\", [\"punctuation\", \".\"], \"n1\"\n]\n"
  },
  {
    "path": "tests/languages/mata/string_feature.test",
    "content": "\"\"\n‘\"\"’\n\"foo\"\n‘\"also a string\"’\n‘\"The \"factor\" of a matrix\"’\n\n// technically not correct, but commonly used on the web\n`\"Hamlet said \"To be, or not to be.\"\"'\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"‘\\\"\\\"’\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"‘\\\"also a string\\\"’\"],\n\t[\"string\", \"‘\\\"The \\\"factor\\\" of a matrix\\\"’\"],\n\n\t[\"comment\", \"// technically not correct, but commonly used on the web\"],\n\t[\"string\", \"`\\\"Hamlet said \\\"To be, or not to be.\\\"\\\"'\"]\n]\n"
  },
  {
    "path": "tests/languages/mata/type_feature.test",
    "content": "void\ntransmorphic matrix\nreal matrix\ncomplex matrix\nstring matrix\npointer matrix\ntransmorphic rowvector\nreal rowvector\ncomplex rowvector\nstring rowvector\npointer rowvector\ntransmorphic colvector\nreal colvector\ncomplex colvector\nstring colvector\npointer colvector\ntransmorphic vector\nreal vector\ncomplex vector\nstring vector\npointer vector\ntransmorphic scalar\nreal scalar\ncomplex scalar\nstring scalar\npointer scalar\n\npointer(real matrix) scalar example(real scalar n)\nreal scalar neat(pointer(real scalar function) p)\nstruct mystruct scalar y\nclass rotated_coord scalar b\n\n----------------------------------------------------\n\n[\n\t[\"type\", [\n\t\t[\"keyword\", \"void\"]\n\t]],\n\t[\"type\", [\"transmorphic matrix\"]],\n\t[\"type\", [\"real matrix\"]],\n\t[\"type\", [\"complex matrix\"]],\n\t[\"type\", [\"string matrix\"]],\n\t[\"type\", [\"pointer matrix\"]],\n\t[\"type\", [\"transmorphic rowvector\"]],\n\t[\"type\", [\"real rowvector\"]],\n\t[\"type\", [\"complex rowvector\"]],\n\t[\"type\", [\"string rowvector\"]],\n\t[\"type\", [\"pointer rowvector\"]],\n\t[\"type\", [\"transmorphic colvector\"]],\n\t[\"type\", [\"real colvector\"]],\n\t[\"type\", [\"complex colvector\"]],\n\t[\"type\", [\"string colvector\"]],\n\t[\"type\", [\"pointer colvector\"]],\n\t[\"type\", [\"transmorphic vector\"]],\n\t[\"type\", [\"real vector\"]],\n\t[\"type\", [\"complex vector\"]],\n\t[\"type\", [\"string vector\"]],\n\t[\"type\", [\"pointer vector\"]],\n\t[\"type\", [\"transmorphic scalar\"]],\n\t[\"type\", [\"real scalar\"]],\n\t[\"type\", [\"complex scalar\"]],\n\t[\"type\", [\"string scalar\"]],\n\t[\"type\", [\"pointer scalar\"]],\n\n\t[\"type\", [\n\t\t\"pointer\",\n\t\t[\"punctuation\", \"(\"],\n\t\t\"real matrix\",\n\t\t[\"punctuation\", \")\"],\n\t\t\" scalar\"\n\t]],\n\t[\"function\", \"example\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type\", [\"real scalar\"]],\n\t\" n\",\n\t[\"punctuation\", \")\"],\n\n\t[\"type\", [\"real scalar\"]],\n\t[\"function\", \"neat\"],\n\t[\"punctuation\", \"(\"],\n\t[\"type\", [\n\t\t\"pointer\",\n\t\t[\"punctuation\", \"(\"],\n\t\t\"real scalar \",\n\t\t[\"keyword\", \"function\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t\" p\",\n\t[\"punctuation\", \")\"],\n\n\t[\"type\", [\n\t\t[\"keyword\", \"struct\"],\n\t\t\" mystruct scalar\"\n\t]],\n\t\" y\\r\\n\",\n\n\t[\"type\", [\n\t\t[\"keyword\", \"class\"],\n\t\t\" rotated_coord scalar\"\n\t]],\n\t\" b\"\n]\n"
  },
  {
    "path": "tests/languages/matlab/comment_feature.test",
    "content": "% foobar\r\n%{}%\r\n%{ foo\r\nbar }%\r\n% 'test'\r\n%{ 'test' }%\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"% foobar\"],\r\n\t[\"comment\", \"%{}%\"],\r\n\t[\"comment\", \"%{ foo\\r\\nbar }%\"],\r\n\t[\"comment\", \"% 'test'\"],\r\n\t[\"comment\", \"%{ 'test' }%\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments."
  },
  {
    "path": "tests/languages/matlab/function_feature.test",
    "content": "foo()\r\nfoo_42()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"foo_42\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/matlab/keyword_feature.test",
    "content": "break case catch continue\r\nelse elseif end for\r\nfunction if inf NaN\r\notherwise parfor pause\r\npi return switch\r\ntry while\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"break\"], [\"keyword\", \"case\"], [\"keyword\", \"catch\"], [\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"else\"], [\"keyword\", \"elseif\"], [\"keyword\", \"end\"], [\"keyword\", \"for\"],\r\n\t[\"keyword\", \"function\"], [\"keyword\", \"if\"], [\"keyword\", \"inf\"], [\"keyword\", \"NaN\"],\r\n\t[\"keyword\", \"otherwise\"], [\"keyword\", \"parfor\"], [\"keyword\", \"pause\"],\r\n\t[\"keyword\", \"pi\"], [\"keyword\", \"return\"], [\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"try\"], [\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/matlab/number_feature.test",
    "content": "42\r\n3.14159\r\n2.1e2\r\n3.2E+4\r\n0.1e-5\r\n3i\r\n2j\r\ni\r\nj\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2.1e2\"],\r\n\t[\"number\", \"3.2E+4\"],\r\n\t[\"number\", \"0.1e-5\"],\r\n\t[\"number\", \"3i\"],\r\n\t[\"number\", \"2j\"],\r\n\t[\"number\", \"i\"],\r\n\t[\"number\", \"j\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/matlab/operator_feature.test",
    "content": ".' .^\r\n.* ./ .\\\r\n@ ^ :\r\n+ - ~\r\n* / \\\r\n< <= > >=\r\n== ~=\r\n& &&\r\n| ||\r\nA'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \".'\"], [\"operator\", \".^\"],\r\n\t[\"operator\", \".*\"], [\"operator\", \"./\"], [\"operator\", \".\\\\\"],\r\n\t[\"operator\", \"@\"], [\"operator\", \"^\"], [\"operator\", \":\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"~\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"\\\\\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"==\"], [\"operator\", \"~=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"],\r\n\t\"\\r\\nA\", [\"operator\", \"'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/matlab/string_feature.test",
    "content": "''\r\n'foo''bar'\r\n'%s'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'foo''bar'\"],\r\n\t[\"string\", \"'%s'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/maxscript/boolean_feature.test",
    "content": "true;\nfalse;\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"punctuation\", \";\"],\n\t[\"boolean\", \"false\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/maxscript/color_feature.test",
    "content": "black\nblue\nbrown\ngray\ngreen\norange\nred\nwhite\nyellow\n\n----------------------------------------------------\n\n[\n\t[\"color\", \"black\"],\n\t[\"color\", \"blue\"],\n\t[\"color\", \"brown\"],\n\t[\"color\", \"gray\"],\n\t[\"color\", \"green\"],\n\t[\"color\", \"orange\"],\n\t[\"color\", \"red\"],\n\t[\"color\", \"white\"],\n\t[\"color\", \"yellow\"]\n]\n"
  },
  {
    "path": "tests/languages/maxscript/comment_feature.test",
    "content": "/* this is a long comment\nblah blah\nprint \"debug 1\" -- code commented out\nmore comments\n*/\n\nfor i in 1 to 10 do(/* messageBox \"in loop\"; */frabulate i )\n\n-- comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"/* this is a long comment\\r\\nblah blah\\r\\nprint \\\"debug 1\\\" -- code commented out\\r\\nmore comments\\r\\n*/\"],\n\n\t[\"keyword\", \"for\"],\n\t\" i \",\n\t[\"keyword\", \"in\"],\n\t[\"number\", \"1\"],\n\t[\"keyword\", \"to\"],\n\t[\"number\", \"10\"],\n\t[\"keyword\", \"do\"],\n\t[\"punctuation\", \"(\"],\n\t[\"comment\", \"/* messageBox \\\"in loop\\\"; */\"],\n\t\"frabulate i \",\n\t[\"punctuation\", \")\"],\n\n\t[\"comment\", \"-- comment\"]\n]\n"
  },
  {
    "path": "tests/languages/maxscript/constant_feature.test",
    "content": "dontcollect\nok\nsilentValue\nundefined\nunsupplied\n\n----------------------------------------------------\n\n[\n\t[\"constant\", \"dontcollect\"],\n\t[\"constant\", \"ok\"],\n\t[\"constant\", \"silentValue\"],\n\t[\"constant\", \"undefined\"],\n\t[\"constant\", \"unsupplied\"]\n]\n"
  },
  {
    "path": "tests/languages/maxscript/function_feature.test",
    "content": "function my_add a b = a + b\n\nfn factorial n = if n <= 0 then 1 else n * factorial (n - 1)\n\nmapped function rand_color x =\n   x.wireColor = random (color 0 0 0) (color 255 255 255)\n\nfn starfield count extent:[200,200,200] pos:[0,0,0] =\n   (\n   -- something\n   )\n\nfn saddle x y = sin x * sin y\n\nprint \"build math mesh\"\nin_name = getOpenFileName()\nval.x=random -100 100\nappend vert_array (readValue in_file)\nwhile not eof f do\non pressme pressed do print \"Pressed!\"\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"function\"],\n\t[\"function-definition\", \"my_add\"],\n\t\" a b \",\n\t[\"operator\", \"=\"],\n\t\" a \",\n\t[\"operator\", \"+\"],\n\t\" b\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"fn\"],\n\t[\"function-definition\", \"factorial\"],\n\t\" n \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"if\"],\n\t\" n \",\n\t[\"operator\", \"<=\"],\n\t[\"number\", \"0\"],\n\t[\"keyword\", \"then\"],\n\t[\"number\", \"1\"],\n\t[\"keyword\", \"else\"],\n\t\" n \",\n\t[\"operator\", \"*\"],\n\t[\"function-call\", \"factorial\"],\n\t[\"punctuation\", \"(\"],\n\t\"n \",\n\t[\"operator\", \"-\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"mapped\"],\n\t[\"keyword\", \"function\"],\n\t[\"function-definition\", \"rand_color\"],\n\t\" x \",\n\t[\"operator\", \"=\"],\n\n\t\"\\r\\n   x\",\n\t[\"punctuation\", \".\"],\n\t\"wireColor \",\n\t[\"operator\", \"=\"],\n\t[\"function-call\", \"random\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function-call\", \"color\"],\n\t[\"number\", \"0\"],\n\t[\"number\", \"0\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function-call\", \"color\"],\n\t[\"number\", \"255\"],\n\t[\"number\", \"255\"],\n\t[\"number\", \"255\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"fn\"],\n\t[\"function-definition\", \"starfield\"],\n\t\" count \",\n\t[\"argument\", \"extent\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"200\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"200\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"200\"],\n\t[\"punctuation\", \"]\"],\n\t[\"argument\", \"pos\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"=\"],\n\n\t[\"punctuation\", \"(\"],\n\n\t[\"comment\", \"-- something\"],\n\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"fn\"],\n\t[\"function-definition\", \"saddle\"],\n\t\" x y \",\n\t[\"operator\", \"=\"],\n\t[\"function-call\", \"sin\"],\n\t\" x \",\n\t[\"operator\", \"*\"],\n\t[\"function-call\", \"sin\"],\n\t\" y\\r\\n\\r\\n\",\n\n\t[\"function-call\", \"print\"],\n\t[\"string\", \"\\\"build math mesh\\\"\"],\n\n\t\"\\r\\nin_name \",\n\t[\"operator\", \"=\"],\n\t[\"function-call\", \"getOpenFileName\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\nval\",\n\t[\"punctuation\", \".\"],\n\t\"x\",\n\t[\"operator\", \"=\"],\n\t[\"function-call\", \"random\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"100\"],\n\t[\"number\", \"100\"],\n\n\t[\"function-call\", \"append\"],\n\t\" vert_array \",\n\t[\"punctuation\", \"(\"],\n\t[\"function-call\", \"readValue\"],\n\t\" in_file\",\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"not\"],\n\t[\"function-call\", \"eof\"],\n\t\" f \",\n\t[\"keyword\", \"do\"],\n\n\t[\"keyword\", \"on\"],\n\t\" pressme pressed \",\n\t[\"keyword\", \"do\"],\n\t[\"function-call\", \"print\"],\n\t[\"string\", \"\\\"Pressed!\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/maxscript/keyword_feature.test",
    "content": "about;\nand;\nanimate;\nas;\nat;\nattributes;\nby;\ncase;\ncatch;\ncollect;\ncontinue;\ncoordsys;\ndo;\nelse;\nexit;\nfn;\nfor;\nfrom;\nfunction;\nglobal;\nif;\nin;\nlocal;\nmacroscript;\nmapped;\nmax;\nnot;\nof;\noff;\non;\nor;\nparameters;\npersistent;\nplugin;\nrcmenu;\nreturn;\nrollout;\nset;\nstruct;\nthen;\nthrow;\nto;\ntool;\ntry;\nundo;\nutility;\nwhen;\nwhere;\nwhile;\nwith;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"about\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"and\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"animate\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"as\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"at\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"attributes\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"by\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"case\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"catch\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"collect\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"coordsys\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"do\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"exit\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"fn\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"from\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"function\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"global\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"local\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"macroscript\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"mapped\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"max\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"not\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"of\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"off\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"on\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"or\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"parameters\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"persistent\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"plugin\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"rcmenu\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"rollout\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"set\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"struct\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"then\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"throw\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"to\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"tool\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"try\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"undo\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"utility\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"when\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"where\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"with\"], [\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/maxscript/number_feature.test",
    "content": "123\n123.45\n-0.00345\n1.0e-6\n0x0E\n.1\n\ne\npi\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"123\"],\n\t[\"number\", \"123.45\"],\n\t[\"operator\", \"-\"], [\"number\", \"0.00345\"],\n\t[\"number\", \"1.0e-6\"],\n\t[\"number\", \"0x0E\"],\n\t[\"number\", \".1\"],\n\n\t[\"number\", \"e\"],\n\t[\"number\", \"pi\"]\n]\n"
  },
  {
    "path": "tests/languages/maxscript/operator_feature.test",
    "content": "+ - * /\n+= -= *= /=\n\n=\n== != < <= > >=\n\n^ & #\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\n\t[\"operator\", \"^\"], [\"operator\", \"&\"], [\"operator\", \"#\"]\n]\n"
  },
  {
    "path": "tests/languages/maxscript/path_feature.test",
    "content": "$box01 -- object named 'box01'\n$torso/left_up_arm/left_low_arm -- hierarchy path name\n$*box* -- all objects with 'box' in\n-- the name\n$torso/* -- all the direct children of\n-- $torso\n$helpers/d* -- all helper objects whose name starts with 'd'\n\n$dummy/head/neck\n$dummy/*\n$neck*\n$box0?\n$dummy/*/*\n$dummy/.../box*\n$dummy...*\n$*box*.position += [10, 10, 0]\n\n$.pos = [0,0,0]\nhide $\nrotate $ 35 z_axis\n\n$'a silly name!!'\n$'what the \\*'\nbodyPart=$'Bip01 L UpperArm'\nbodyPart=$Bip01_L_UpperArm\n\n----------------------------------------------------\n\n[\n\t[\"path\", \"$box01\"],\n\t[\"comment\", \"-- object named 'box01'\"],\n\t[\"path\", \"$torso/left_up_arm/left_low_arm\"],\n\t[\"comment\", \"-- hierarchy path name\"],\n\t[\"path\", \"$*box*\"],\n\t[\"comment\", \"-- all objects with 'box' in\"],\n\t[\"comment\", \"-- the name\"],\n\t[\"path\", \"$torso/*\"],\n\t[\"comment\", \"-- all the direct children of\"],\n\t[\"comment\", \"-- $torso\"],\n\t[\"path\", \"$helpers/d*\"],\n\t[\"comment\", \"-- all helper objects whose name starts with 'd'\"],\n\n\t[\"path\", \"$dummy/head/neck\"],\n\n\t[\"path\", \"$dummy/*\"],\n\n\t[\"path\", \"$neck*\"],\n\n\t[\"path\", \"$box0?\"],\n\n\t[\"path\", \"$dummy/*/*\"],\n\n\t[\"path\", \"$dummy/.../box*\"],\n\n\t[\"path\", \"$dummy...*\"],\n\n\t[\"path\", \"$*box*.position\"],\n\t[\"operator\", \"+=\"],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"10\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"10\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"path\", \"$.pos\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"function-call\", \"hide\"],\n\t[\"path\", \"$\"],\n\n\t[\"function-call\", \"rotate\"],\n\t[\"path\", \"$\"],\n\t[\"number\", \"35\"],\n\t\" z_axis\\r\\n\\r\\n\",\n\n\t[\"path\", \"$'a silly name!!'\"],\n\t[\"path\", \"$'what the \\\\*'\"],\n\t\"\\r\\nbodyPart\", [\"operator\", \"=\"], [\"path\", \"$'Bip01 L UpperArm'\"],\n\t\"\\r\\nbodyPart\", [\"operator\", \"=\"], [\"path\", \"$Bip01_L_UpperArm\"]\n]\n"
  },
  {
    "path": "tests/languages/maxscript/punctuation_feature.test",
    "content": "( ) [ ] { }\n. : , ;\n#(\n\\\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"#\"],\n\t[\"punctuation\", \"(\"],\n\n\t[\"punctuation\", \"\\\\\"]\n]\n"
  },
  {
    "path": "tests/languages/maxscript/string_feature.test",
    "content": "\"\"\n\"foo should be quoted like this: \\\"foo\\\" and a new line: \\n\"\n\"Twas brillig and the slithy tobes\ndid gyre and gimbol in the wabe\nor something like that...\"\n\"g:\\\\3dsmax25\\\\scenes\"\n@\"g:\\temp\\newfolder\\render\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo should be quoted like this: \\\\\\\"foo\\\\\\\" and a new line: \\\\n\\\"\"],\n\t[\"string\", \"\\\"Twas brillig and the slithy tobes\\r\\ndid gyre and gimbol in the wabe\\r\\nor something like that...\\\"\"],\n\t[\"string\", \"\\\"g:\\\\\\\\3dsmax25\\\\\\\\scenes\\\"\"],\n\t[\"string\", \"@\\\"g:\\\\temp\\\\newfolder\\\\render\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/maxscript/time_feature.test",
    "content": "2.5s\n1m15s\n2m30s5f2t\n125f\n18.25f\n1f20t\n2:10.0\n0:0.29\n\n----------------------------------------------------\n\n[\n\t[\"time\", \"2.5s\"],\n\t[\"time\", \"1m15s\"],\n\t[\"time\", \"2m30s5f2t\"],\n\t[\"time\", \"125f\"],\n\t[\"time\", \"18.25f\"],\n\t[\"time\", \"1f20t\"],\n\t[\"time\", \"2:10.0\"],\n\t[\"time\", \"0:0.29\"]\n]\n"
  },
  {
    "path": "tests/languages/mel/code_feature.test",
    "content": "`ls -selection`\r\n\r\n$shaders = `listConnections -source true -type shadingEngine\r\n$listOfShapes[$whichShape]`;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"code\", [\r\n\t\t[\"delimiter\", \"`\"],\r\n\t\t[\"statement\", [\r\n\t\t\t[\"function\", \"ls\"],\r\n\t\t\t[\"flag\", \"-selection\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"`\"]\r\n\t]],\r\n\r\n\t[\"variable\", \"$shaders\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"code\", [\r\n\t\t[\"delimiter\", \"`\"],\r\n\t\t[\"statement\", [\r\n\t\t\t[\"function\", \"listConnections\"],\r\n\t\t\t[\"flag\", \"-source\"],\r\n\t\t\t\" true \",\r\n\t\t\t[\"flag\", \"-type\"],\r\n\t\t\t\" shadingEngine\\r\\n\",\r\n\r\n\t\t\t[\"variable\", \"$listOfShapes\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"$whichShape\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for code.\r\n"
  },
  {
    "path": "tests/languages/mel/comment_feature.test",
    "content": "//\r\n// Foobar\r\n/*\r\ncomment\r\n*/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// Foobar\"],\r\n\t[\"comment\", \"/*\\r\\ncomment\\r\\n*/\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/mel/flag_feature.test",
    "content": "-d\r\n-foo\r\n-foo42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"flag\", \"-d\"],\r\n\t[\"flag\", \"-foo\"],\r\n\t[\"flag\", \"-foo42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for flags."
  },
  {
    "path": "tests/languages/mel/function_feature.test",
    "content": "foobar()\r\nfoo_bar_42()\r\nfoo.bar()\r\n\r\nproc animatedDuplication ()\r\nglobal proc VL_doit( )\r\n\r\nprint(\"Semicolons separate\"); print(\" different statements.\");\r\n\r\nfloat $frame = `currentTime -q`;\r\nstring $timeFormat = `currentUnit -query -time`;\r\ncurrentUnit -time sec;\r\nfloat $time = `currentTime -q`;\r\ncurrentUnit -time $timeFormat;\r\n\r\npersp.translateX = 23.2;\r\n\r\nPolySelectConvert 3;\r\nsetParent ..;\r\nduplicate;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foobar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"foo_bar_42\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\nfoo\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"bar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"proc\"],\r\n\t[\"function\", \"animatedDuplication\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"global\"],\r\n\t[\"keyword\", \"proc\"],\r\n\t[\"function\", \"VL_doit\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"print\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\"Semicolons separate\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"function\", \"print\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\" different statements.\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"float\"],\r\n\t[\"variable\", \"$frame\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"code\", [\r\n\t\t[\"delimiter\", \"`\"],\r\n\t\t[\"statement\", [\r\n\t\t\t[\"function\", \"currentTime\"],\r\n\t\t\t[\"flag\", \"-q\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"string\"],\r\n\t[\"variable\", \"$timeFormat\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"code\", [\r\n\t\t[\"delimiter\", \"`\"],\r\n\t\t[\"statement\", [\r\n\t\t\t[\"function\", \"currentUnit\"],\r\n\t\t\t[\"flag\", \"-query\"],\r\n\t\t\t[\"flag\", \"-time\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"function\", \"currentUnit\"],\r\n\t[\"flag\", \"-time\"],\r\n\t\" sec\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"float\"],\r\n\t[\"variable\", \"$time\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"code\", [\r\n\t\t[\"delimiter\", \"`\"],\r\n\t\t[\"statement\", [\r\n\t\t\t[\"function\", \"currentTime\"],\r\n\t\t\t[\"flag\", \"-q\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"function\", \"currentUnit\"],\r\n\t[\"flag\", \"-time\"],\r\n\t[\"variable\", \"$timeFormat\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\n\\r\\npersp\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"translateX \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"23.2\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"function\", \"PolySelectConvert\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"function\", \"setParent\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"function\", \"duplicate\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/mel/keyword_feature.test",
    "content": "break\r\ncase\r\ncontinue\r\ndefault\r\ndo\r\nelse\r\nfloat\r\nfor\r\nglobal\r\nif\r\nin\r\nint\r\nmatrix\r\nproc\r\nreturn\r\nstring\r\nswitch\r\nvector\r\nwhile\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"float\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"global\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"keyword\", \"matrix\"],\r\n\t[\"keyword\", \"proc\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"vector\"],\r\n\t[\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/mel/number_feature.test",
    "content": "0xBadFace\r\n42\r\n3.14159\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/mel/operator_feature.test",
    "content": "+ ++ +=\r\n- -- -=\r\n* *=\r\n/ /=\r\n! !=\r\n= ==\r\n&&\r\n||\r\n< <=\r\n> >=\r\n%\r\n^\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"^\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/mel/punctuation_feature.test",
    "content": "( ) { } [ ]\n. ; .\n? :\n<< >>\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"],\n\n\t[\"punctuation\", \"?\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"tensor-punctuation\", \"<<\"],\n\t[\"tensor-punctuation\", \">>\"]\n]\n"
  },
  {
    "path": "tests/languages/mel/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/mel/variable_feature.test",
    "content": "$x\r\n$foo42\r\n$Foo_Bar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$x\"],\r\n\t[\"variable\", \"$foo42\"],\r\n\t[\"variable\", \"$Foo_Bar_42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/mermaid/arrow_feature.test",
    "content": "%% flow chart\n\n--- ---- -----\n--> ---> ---->\n<-- <--- <----\n=== ==== =====\n==> ===> ====>\n<== <=== <====\n-.- -..- -...-\n-.-> -..-> -...->\n<-.- <-..- <-...-\n--x ---x ----x\n--x -.-x -..-x\nx-- x--- x----\nx-- x-.- x-..-\n--o ---o ----o\n--o -.-o -..-o\no-- o--- o----\no-- o-.- o-..-\n\n<--> <----> <-..-> <====>\nx--x x----x x-..-x x====x\no--o o----o o-..-o o====o\n\n%% sequence diagram\n\n-> --> ->> -->>\n<- <-- <<- <<--\n-x --x -) --)\nx- x-- (- (--\n\n%% class diagram\n\n<|-- *-- o-- <-- <.. <|..\n--|> --* --o --> ..> ..|>\n-- ..\n\n%% ER diagram\n\n|o--o|  |o..o|\n||--||  ||..||\n}o--o{  }o..o{\n}|--|{  }|..|{\n\n|o--o|  |o..o|\n||--o{  ||..o{\n}o--|{  }o..|{\n}|--||  }|..||\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"%% flow chart\"],\n\n\t[\"arrow\", \"---\"], [\"arrow\", \"----\"], [\"arrow\", \"-----\"],\n\t[\"arrow\", \"-->\"], [\"arrow\", \"--->\"], [\"arrow\", \"---->\"],\n\t[\"arrow\", \"<--\"], [\"arrow\", \"<---\"], [\"arrow\", \"<----\"],\n\t[\"arrow\", \"===\"], [\"arrow\", \"====\"], [\"arrow\", \"=====\"],\n\t[\"arrow\", \"==>\"], [\"arrow\", \"===>\"], [\"arrow\", \"====>\"],\n\t[\"arrow\", \"<==\"], [\"arrow\", \"<===\"], [\"arrow\", \"<====\"],\n\t[\"arrow\", \"-.-\"], [\"arrow\", \"-..-\"], [\"arrow\", \"-...-\"],\n\t[\"arrow\", \"-.->\"], [\"arrow\", \"-..->\"], [\"arrow\", \"-...->\"],\n\t[\"arrow\", \"<-.-\"], [\"arrow\", \"<-..-\"], [\"arrow\", \"<-...-\"],\n\t[\"arrow\", \"--x\"], [\"arrow\", \"---x\"], [\"arrow\", \"----x\"],\n\t[\"arrow\", \"--x\"], [\"arrow\", \"-.-x\"], [\"arrow\", \"-..-x\"],\n\t[\"arrow\", \"x--\"], [\"arrow\", \"x---\"], [\"arrow\", \"x----\"],\n\t[\"arrow\", \"x--\"], [\"arrow\", \"x-.-\"], [\"arrow\", \"x-..-\"],\n\t[\"arrow\", \"--o\"], [\"arrow\", \"---o\"], [\"arrow\", \"----o\"],\n\t[\"arrow\", \"--o\"], [\"arrow\", \"-.-o\"], [\"arrow\", \"-..-o\"],\n\t[\"arrow\", \"o--\"], [\"arrow\", \"o---\"], [\"arrow\", \"o----\"],\n\t[\"arrow\", \"o--\"], [\"arrow\", \"o-.-\"], [\"arrow\", \"o-..-\"],\n\n\t[\"arrow\", \"<-->\"],\n\t[\"arrow\", \"<---->\"],\n\t[\"arrow\", \"<-..->\"],\n\t[\"arrow\", \"<====>\"],\n\n\t[\"arrow\", \"x--x\"],\n\t[\"arrow\", \"x----x\"],\n\t[\"arrow\", \"x-..-x\"],\n\t[\"arrow\", \"x====x\"],\n\n\t[\"arrow\", \"o--o\"],\n\t[\"arrow\", \"o----o\"],\n\t[\"arrow\", \"o-..-o\"],\n\t[\"arrow\", \"o====o\"],\n\n\t[\"comment\", \"%% sequence diagram\"],\n\n\t[\"arrow\", \"->\"], [\"arrow\", \"-->\"], [\"arrow\", \"->>\"], [\"arrow\", \"-->>\"],\n\t[\"arrow\", \"<-\"], [\"arrow\", \"<--\"], [\"arrow\", \"<<-\"], [\"arrow\", \"<<--\"],\n\t[\"arrow\", \"-x\"], [\"arrow\", \"--x\"], [\"arrow\", \"-)\"], [\"arrow\", \"--)\"],\n\t[\"arrow\", \"x-\"], [\"arrow\", \"x--\"], [\"arrow\", \"(-\"], [\"arrow\", \"(--\"],\n\n\t[\"comment\", \"%% class diagram\"],\n\n\t[\"arrow\", \"<|--\"],\n\t[\"arrow\", \"*--\"],\n\t[\"arrow\", \"o--\"],\n\t[\"arrow\", \"<--\"],\n\t[\"arrow\", \"<..\"],\n\t[\"arrow\", \"<|..\"],\n\n\t[\"arrow\", \"--|>\"],\n\t[\"arrow\", \"--*\"],\n\t[\"arrow\", \"--o\"],\n\t[\"arrow\", \"-->\"],\n\t[\"arrow\", \"..>\"],\n\t[\"arrow\", \"..|>\"],\n\n\t[\"arrow\", \"--\"],\n\t[\"arrow\", \"..\"],\n\n\t[\"comment\", \"%% ER diagram\"],\n\n\t[\"arrow\", \"|o--o|\"], [\"arrow\", \"|o..o|\"],\n\t[\"arrow\", \"||--||\"], [\"arrow\", \"||..||\"],\n\t[\"arrow\", \"}o--o{\"], [\"arrow\", \"}o..o{\"],\n\t[\"arrow\", \"}|--|{\"], [\"arrow\", \"}|..|{\"],\n\n\t[\"arrow\", \"|o--o|\"], [\"arrow\", \"|o..o|\"],\n\t[\"arrow\", \"||--o{\"], [\"arrow\", \"||..o{\"],\n\t[\"arrow\", \"}o--|{\"], [\"arrow\", \"}o..|{\"],\n\t[\"arrow\", \"}|--||\"], [\"arrow\", \"}|..||\"]\n]\n"
  },
  {
    "path": "tests/languages/mermaid/comment_feature.test",
    "content": "%% comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"%% comment\"]\n]\n"
  },
  {
    "path": "tests/languages/mermaid/full_classdiagram.test",
    "content": "classDiagram\n      Animal <|-- Duck\n      Animal <|-- Fish\n      Animal <|-- Zebra\n      Animal : +int age\n      Animal : +String gender\n      Animal: +isMammal()\n      Animal: +mate()\n      class Duck{\n          +String beakColor\n          +swim()\n          +quack()\n      }\n      class Fish{\n          -int sizeInFeet\n          -canEat()\n      }\n      class Zebra{\n          +bool is_wild\n          +run()\n      }\n\nclassDiagram\n    class BankAccount\n    BankAccount : +String owner\n    BankAccount : +Bigdecimal balance\n    BankAccount : +deposit(amount)\n    BankAccount : +withdrawl(amount)\n\nclassDiagram\n    class Animal\n    Vehicle <|-- Car\n\nclass BankAccount\n BankAccount : +String owner\n BankAccount : +BigDecimal balance\n BankAccount : +deposit(amount)\n BankAccount : +withdrawal(amount)\n\nclass BankAccount{\n    +String owner\n    +BigDecimal balance\n    +deposit(amount)\n    +withdrawl(amount)\n}\n\nclass BankAccount{\n    +String owner\n    +BigDecimal balance\n    +deposit(amount) bool\n    +withdrawl(amount) int\n}\n\nclassDiagram\nclass Square~Shape~{\n    int id\n    List~int~ position\n    setPoints(List~int~ points)\n    getPoints() List~int~\n}\n\nSquare : -List~string~ messages\nSquare : +setMessages(List~string~ messages)\nSquare : +getMessages() List~string~\n\nclassDiagram\nclassA <|-- classB\nclassC *-- classD\nclassE o-- classF\nclassG <-- classH\nclassI -- classJ\nclassK <.. classL\nclassM <|.. classN\nclassO .. classP\n\nclassDiagram\nclassA --|> classB : Inheritance\nclassC --* classD : Composition\nclassE --o classF : Aggregation\nclassG --> classH : Association\nclassI -- classJ : Link(Solid)\nclassK ..> classL : Dependency\nclassM ..|> classN : Realization\nclassO .. classP : Link(Dashed)\n\nclassDiagram\nclassA <|-- classB : implements\nclassC *-- classD : composition\nclassE o-- classF : association\n\nclassDiagram\n    Customer \"1\" --> \"*\" Ticket\n    Student \"1\" --> \"1..*\" Course\n    Galaxy --> \"many\" Star : Contains\n\nclassDiagram\nclass Shape\n<<interface>> Shape\n\nclassDiagram\nclass Shape{\n    <<interface>>\n    noOfVertices\n    draw()\n}\nclass Color{\n    <<enumeration>>\n    RED\n    BLUE\n    GREEN\n    WHITE\n    BLACK\n}\n\nclassDiagram\n%% This whole line is a comment classDiagram class Shape <<interface>>\nclass Shape{\n    <<interface>>\n    noOfVertices\n    draw()\n}\n\nclassDiagram\n  direction RL\n  class Student {\n    -idCard : IdCard\n  }\n  class IdCard{\n    -id : int\n    -name : string\n  }\n  class Bike{\n    -id : int\n    -name : string\n  }\n  Student \"1\" --o \"1\" IdCard : carries\n  Student \"1\" --o \"1\" Bike : rides\n\naction className \"reference\" \"tooltip\"\nclick className call callback() \"tooltip\"\nclick className href \"url\" \"tooltip\"\n\nclassDiagram\nclass Shape\nlink Shape \"http://www.github.com\" \"This is a tooltip for a link\"\nclass Shape2\nclick Shape2 href \"http://www.github.com\" \"This is a tooltip for a link\"\n\nclassDiagram\nclass Shape\ncallback Shape \"callbackFunction\" \"This is a tooltip for a callback\"\nclass Shape2\nclick Shape2 call callbackFunction() \"This is a tooltip for a callback\"\n\nclassDiagram\nAnimal <|-- Duck\nAnimal <|-- Fish\nAnimal <|-- Zebra\nAnimal : +int age\nAnimal : +String gender\nAnimal: +isMammal()\nAnimal: +mate()\nclass Duck{\n  +String beakColor\n  +swim()\n  +quack()\n  }\nclass Fish{\n  -int sizeInFeet\n  -canEat()\n  }\nclass Zebra{\n  +bool is_wild\n  +run()\n  }\n\n  callback Duck callback \"Tooltip\"\n  link Zebra \"http://www.github.com\" \"This is a link\"\n\nclassDiagram\n    class Animal:::cssClass\n\nclassDiagram\n    class Animal:::cssClass {\n        -int sizeInFeet\n        -canEat()\n    }\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"classDiagram\"],\n\n\t\"\\r\\n      Animal \",\n\t[\"arrow\", \"<|--\"],\n\t\" Duck\\r\\n      Animal \",\n\t[\"arrow\", \"<|--\"],\n\t\" Fish\\r\\n      Animal \",\n\t[\"arrow\", \"<|--\"],\n\t\" Zebra\\r\\n      Animal \",\n\t[\"operator\", \":\"],\n\t\" +int age\\r\\n      Animal \",\n\t[\"operator\", \":\"],\n\t\" +String gender\\r\\n      Animal\",\n\t[\"operator\", \":\"],\n\t\" +isMammal\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\n      Animal\",\n\t[\"operator\", \":\"],\n\t\" +mate\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Duck\",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n          +String beakColor\\r\\n          +swim\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\n          +quack\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Fish\",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n          -int sizeInFeet\\r\\n          -canEat\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Zebra\",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n          +bool is_wild\\r\\n          +run\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t[\"keyword\", \"class\"],\n\t\" BankAccount\\r\\n    BankAccount \",\n\t[\"operator\", \":\"],\n\t\" +String owner\\r\\n    BankAccount \",\n\t[\"operator\", \":\"],\n\t\" +Bigdecimal balance\\r\\n    BankAccount \",\n\t[\"operator\", \":\"],\n\t\" +deposit\",\n\t[\"text\", \"(amount)\"],\n\n\t\"\\r\\n    BankAccount \",\n\t[\"operator\", \":\"],\n\t\" +withdrawl\",\n\t[\"text\", \"(amount)\"],\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Animal\\r\\n    Vehicle \",\n\t[\"arrow\", \"<|--\"],\n\t\" Car\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"class\"],\n\t\" BankAccount\\r\\n BankAccount \",\n\t[\"operator\", \":\"],\n\t\" +String owner\\r\\n BankAccount \",\n\t[\"operator\", \":\"],\n\t\" +BigDecimal balance\\r\\n BankAccount \",\n\t[\"operator\", \":\"],\n\t\" +deposit\",\n\t[\"text\", \"(amount)\"],\n\n\t\"\\r\\n BankAccount \",\n\t[\"operator\", \":\"],\n\t\" +withdrawal\",\n\t[\"text\", \"(amount)\"],\n\n\t[\"keyword\", \"class\"],\n\t\" BankAccount\",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n    +String owner\\r\\n    +BigDecimal balance\\r\\n    +deposit\",\n\t[\"text\", \"(amount)\"],\n\n\t\"\\r\\n    +withdrawl\",\n\t[\"text\", \"(amount)\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t\" BankAccount\",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n    +String owner\\r\\n    +BigDecimal balance\\r\\n    +deposit\",\n\t[\"text\", \"(amount)\"],\n\t\" bool\\r\\n    +withdrawl\",\n\t[\"text\", \"(amount)\"],\n\t\" int\\r\\n\",\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Square~Shape~\",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n    int id\\r\\n    List~int~ position\\r\\n    setPoints\",\n\t[\"text\", \"(List~int~ points)\"],\n\n\t\"\\r\\n    getPoints\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t\" List~int~\\r\\n\",\n\n\t[\"punctuation\", \"}\"],\n\n\t\"\\r\\n\\r\\nSquare \",\n\t[\"operator\", \":\"],\n\t\" -List~string~ messages\\r\\nSquare \",\n\t[\"operator\", \":\"],\n\t\" +setMessages\",\n\t[\"text\", \"(List~string~ messages)\"],\n\n\t\"\\r\\nSquare \",\n\t[\"operator\", \":\"],\n\t\" +getMessages\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t\" List~string~\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t\"\\r\\nclassA \",\n\t[\"arrow\", \"<|--\"],\n\t\" classB\\r\\nclassC \",\n\t[\"arrow\", \"*--\"],\n\t\" classD\\r\\nclassE \",\n\t[\"arrow\", \"o--\"],\n\t\" classF\\r\\nclassG \",\n\t[\"arrow\", \"<--\"],\n\t\" classH\\r\\nclassI \",\n\t[\"arrow\", \"--\"],\n\t\" classJ\\r\\nclassK \",\n\t[\"arrow\", \"<..\"],\n\t\" classL\\r\\nclassM \",\n\t[\"arrow\", \"<|..\"],\n\t\" classN\\r\\nclassO \",\n\t[\"arrow\", \"..\"],\n\t\" classP\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t\"\\r\\nclassA \",\n\t[\"arrow\", \"--|>\"],\n\t\" classB \",\n\t[\"operator\", \":\"],\n\t\" Inheritance\\r\\nclassC \",\n\t[\"arrow\", \"--*\"],\n\t\" classD \",\n\t[\"operator\", \":\"],\n\t\" Composition\\r\\nclassE \",\n\t[\"arrow\", \"--o\"],\n\t\" classF \",\n\t[\"operator\", \":\"],\n\t\" Aggregation\\r\\nclassG \",\n\t[\"arrow\", \"-->\"],\n\t\" classH \",\n\t[\"operator\", \":\"],\n\t\" Association\\r\\nclassI \",\n\t[\"arrow\", \"--\"],\n\t\" classJ \",\n\t[\"operator\", \":\"],\n\t\" Link\",\n\t[\"text\", \"(Solid)\"],\n\n\t\"\\r\\nclassK \",\n\t[\"arrow\", \"..>\"],\n\t\" classL \",\n\t[\"operator\", \":\"],\n\t\" Dependency\\r\\nclassM \",\n\t[\"arrow\", \"..|>\"],\n\t\" classN \",\n\t[\"operator\", \":\"],\n\t\" Realization\\r\\nclassO \",\n\t[\"arrow\", \"..\"],\n\t\" classP \",\n\t[\"operator\", \":\"],\n\t\" Link\",\n\t[\"text\", \"(Dashed)\"],\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t\"\\r\\nclassA \",\n\t[\"arrow\", \"<|--\"],\n\t\" classB \",\n\t[\"operator\", \":\"],\n\t\" implements\\r\\nclassC \",\n\t[\"arrow\", \"*--\"],\n\t\" classD \",\n\t[\"operator\", \":\"],\n\t\" composition\\r\\nclassE \",\n\t[\"arrow\", \"o--\"],\n\t\" classF \",\n\t[\"operator\", \":\"],\n\t\" association\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t\"\\r\\n    Customer \",\n\t[\"string\", \"\\\"1\\\"\"],\n\t[\"arrow\", \"-->\"],\n\t[\"string\", \"\\\"*\\\"\"],\n\t\" Ticket\\r\\n    Student \",\n\t[\"string\", \"\\\"1\\\"\"],\n\t[\"arrow\", \"-->\"],\n\t[\"string\", \"\\\"1..*\\\"\"],\n\t\" Course\\r\\n    Galaxy \",\n\t[\"arrow\", \"-->\"],\n\t[\"string\", \"\\\"many\\\"\"],\n\t\" Star \",\n\t[\"operator\", \":\"],\n\t\" Contains\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"classDiagram\"],\n\t[\"keyword\", \"class\"], \" Shape\\r\\n\",\n\t[\"annotation\", \"<<interface>>\"], \" Shape\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"classDiagram\"],\n\t[\"keyword\", \"class\"],\n\t\" Shape\",\n\t[\"punctuation\", \"{\"],\n\t[\"annotation\", \"<<interface>>\"],\n\t\"\\r\\n    noOfVertices\\r\\n    draw\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"}\"],\n\t[\"keyword\", \"class\"],\n\t\" Color\",\n\t[\"punctuation\", \"{\"],\n\t[\"annotation\", \"<<enumeration>>\"],\n\t\"\\r\\n    RED\\r\\n    BLUE\\r\\n    GREEN\\r\\n    WHITE\\r\\n    BLACK\\r\\n\",\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"classDiagram\"],\n\t[\"comment\", \"%% This whole line is a comment classDiagram class Shape <<interface>>\"],\n\t[\"keyword\", \"class\"],\n\t\" Shape\",\n\t[\"punctuation\", \"{\"],\n\t[\"annotation\", \"<<interface>>\"],\n\t\"\\r\\n    noOfVertices\\r\\n    draw\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t[\"keyword\", \"direction\"],\n\t\" RL\\r\\n  \",\n\n\t[\"keyword\", \"class\"],\n\t\" Student \",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n    -idCard \",\n\t[\"operator\", \":\"],\n\t\" IdCard\\r\\n  \",\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t\" IdCard\",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n    -id \",\n\t[\"operator\", \":\"],\n\t\" int\\r\\n    -name \",\n\t[\"operator\", \":\"],\n\t\" string\\r\\n  \",\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Bike\",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n    -id \",\n\t[\"operator\", \":\"],\n\t\" int\\r\\n    -name \",\n\t[\"operator\", \":\"],\n\t\" string\\r\\n  \",\n\n\t[\"punctuation\", \"}\"],\n\n\t\"\\r\\n  Student \",\n\t[\"string\", \"\\\"1\\\"\"],\n\t[\"arrow\", \"--o\"],\n\t[\"string\", \"\\\"1\\\"\"],\n\t\" IdCard \",\n\t[\"operator\", \":\"],\n\t\" carries\\r\\n  Student \",\n\t[\"string\", \"\\\"1\\\"\"],\n\t[\"arrow\", \"--o\"],\n\t[\"string\", \"\\\"1\\\"\"],\n\t\" Bike \",\n\t[\"operator\", \":\"],\n\t\" rides\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"action\"],\n\t\" className \",\n\t[\"string\", \"\\\"reference\\\"\"],\n\t[\"string\", \"\\\"tooltip\\\"\"],\n\n\t[\"keyword\", \"click\"],\n\t\" className call callback\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"string\", \"\\\"tooltip\\\"\"],\n\n\t[\"keyword\", \"click\"],\n\t\" className href \",\n\t[\"string\", \"\\\"url\\\"\"],\n\t[\"string\", \"\\\"tooltip\\\"\"],\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Shape\\r\\n\",\n\n\t[\"keyword\", \"link\"],\n\t\" Shape \",\n\t[\"string\", \"\\\"http://www.github.com\\\"\"],\n\t[\"string\", \"\\\"This is a tooltip for a link\\\"\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Shape2\\r\\n\",\n\n\t[\"keyword\", \"click\"],\n\t\" Shape2 href \",\n\t[\"string\", \"\\\"http://www.github.com\\\"\"],\n\t[\"string\", \"\\\"This is a tooltip for a link\\\"\"],\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Shape\\r\\n\",\n\n\t[\"keyword\", \"callback\"],\n\t\" Shape \",\n\t[\"string\", \"\\\"callbackFunction\\\"\"],\n\t[\"string\", \"\\\"This is a tooltip for a callback\\\"\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Shape2\\r\\n\",\n\n\t[\"keyword\", \"click\"],\n\t\" Shape2 call callbackFunction\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"string\", \"\\\"This is a tooltip for a callback\\\"\"],\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t\"\\r\\nAnimal \",\n\t[\"arrow\", \"<|--\"],\n\t\" Duck\\r\\nAnimal \",\n\t[\"arrow\", \"<|--\"],\n\t\" Fish\\r\\nAnimal \",\n\t[\"arrow\", \"<|--\"],\n\t\" Zebra\\r\\nAnimal \",\n\t[\"operator\", \":\"],\n\t\" +int age\\r\\nAnimal \",\n\t[\"operator\", \":\"],\n\t\" +String gender\\r\\nAnimal\",\n\t[\"operator\", \":\"],\n\t\" +isMammal\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\nAnimal\",\n\t[\"operator\", \":\"],\n\t\" +mate\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Duck\",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n  +String beakColor\\r\\n  +swim\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t\"\\r\\n  +quack\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Fish\",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n  -int sizeInFeet\\r\\n  -canEat\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Zebra\",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n  +bool is_wild\\r\\n  +run\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"callback\"],\n\t\" Duck callback \",\n\t[\"string\", \"\\\"Tooltip\\\"\"],\n\n\t[\"keyword\", \"link\"],\n\t\" Zebra \",\n\t[\"string\", \"\\\"http://www.github.com\\\"\"],\n\t[\"string\", \"\\\"This is a link\\\"\"],\n\n\t[\"keyword\", \"classDiagram\"],\n\t[\"keyword\", \"class\"], \" Animal\", [\"operator\", \":::\"], \"cssClass\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"classDiagram\"],\n\n\t[\"keyword\", \"class\"],\n\t\" Animal\",\n\t[\"operator\", \":::\"],\n\t\"cssClass \",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n        -int sizeInFeet\\r\\n        -canEat\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/mermaid/full_erdiagram.test",
    "content": "erDiagram\n    CUSTOMER ||--o{ ORDER : places\n    ORDER ||--|{ LINE-ITEM : contains\n    CUSTOMER }|..|{ DELIVERY-ADDRESS : uses\n\nerDiagram\n    CUSTOMER ||--o{ ORDER : places\n    CUSTOMER {\n        string name\n        string custNumber\n        string sector\n    }\n    ORDER ||--|{ LINE-ITEM : contains\n    ORDER {\n        int orderNumber\n        string deliveryAddress\n    }\n    LINE-ITEM {\n        string productCode\n        int quantity\n        float pricePerUnit\n    }\n\nPROPERTY ||--|{ ROOM : contains\n\nCAR ||--o{ NAMED-DRIVER : allows\n    PERSON ||--o{ NAMED-DRIVER : is\n\nerDiagram\n    CAR ||--o{ NAMED-DRIVER : allows\n    CAR {\n        string registrationNumber\n        string make\n        string model\n    }\n    PERSON ||--o{ NAMED-DRIVER : is\n    PERSON {\n        string firstName\n        string lastName\n        int age\n    }\n\nerDiagram\n    CAR ||--o{ NAMED-DRIVER : allows\n    CAR {\n        string registrationNumber\n        string make\n        string model\n    }\n    PERSON ||--o{ NAMED-DRIVER : is\n    PERSON {\n        string firstName\n        string lastName\n        int age\n    }\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"erDiagram\"],\n\n\t\"\\r\\n    CUSTOMER \",\n\t[\"arrow\", \"||--o{\"],\n\t\" ORDER \",\n\t[\"operator\", \":\"],\n\t\" places\\r\\n    ORDER \",\n\t[\"arrow\", \"||--|{\"],\n\t\" LINE-ITEM \",\n\t[\"operator\", \":\"],\n\t\" contains\\r\\n    CUSTOMER \",\n\t[\"arrow\", \"}|..|{\"],\n\t\" DELIVERY-ADDRESS \",\n\t[\"operator\", \":\"],\n\t\" uses\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"erDiagram\"],\n\n\t\"\\r\\n    CUSTOMER \",\n\t[\"arrow\", \"||--o{\"],\n\t\" ORDER \",\n\t[\"operator\", \":\"],\n\t\" places\\r\\n    CUSTOMER \",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n        string name\\r\\n        string custNumber\\r\\n        string sector\\r\\n    \",\n\n\t[\"punctuation\", \"}\"],\n\n\t\"\\r\\n    ORDER \",\n\t[\"arrow\", \"||--|{\"],\n\t\" LINE-ITEM \",\n\t[\"operator\", \":\"],\n\t\" contains\\r\\n    ORDER \",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n        int orderNumber\\r\\n        string deliveryAddress\\r\\n    \",\n\n\t[\"punctuation\", \"}\"],\n\n\t\"\\r\\n    LINE-ITEM \",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n        string productCode\\r\\n        int quantity\\r\\n        float pricePerUnit\\r\\n    \",\n\n\t[\"punctuation\", \"}\"],\n\n\t\"\\r\\n\\r\\nPROPERTY \",\n\t[\"arrow\", \"||--|{\"],\n\t\" ROOM \",\n\t[\"operator\", \":\"],\n\t\" contains\\r\\n\\r\\nCAR \",\n\t[\"arrow\", \"||--o{\"],\n\t\" NAMED-DRIVER \",\n\t[\"operator\", \":\"],\n\t\" allows\\r\\n    PERSON \",\n\t[\"arrow\", \"||--o{\"],\n\t\" NAMED-DRIVER \",\n\t[\"operator\", \":\"],\n\t\" is\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"erDiagram\"],\n\n\t\"\\r\\n    CAR \",\n\t[\"arrow\", \"||--o{\"],\n\t\" NAMED-DRIVER \",\n\t[\"operator\", \":\"],\n\t\" allows\\r\\n    CAR \",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n        string registrationNumber\\r\\n        string make\\r\\n        string model\\r\\n    \",\n\n\t[\"punctuation\", \"}\"],\n\n\t\"\\r\\n    PERSON \",\n\t[\"arrow\", \"||--o{\"],\n\t\" NAMED-DRIVER \",\n\t[\"operator\", \":\"],\n\t\" is\\r\\n    PERSON \",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n        string firstName\\r\\n        string lastName\\r\\n        int age\\r\\n    \",\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"erDiagram\"],\n\n\t\"\\r\\n    CAR \",\n\t[\"arrow\", \"||--o{\"],\n\t\" NAMED-DRIVER \",\n\t[\"operator\", \":\"],\n\t\" allows\\r\\n    CAR \",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n        string registrationNumber\\r\\n        string make\\r\\n        string model\\r\\n    \",\n\n\t[\"punctuation\", \"}\"],\n\n\t\"\\r\\n    PERSON \",\n\t[\"arrow\", \"||--o{\"],\n\t\" NAMED-DRIVER \",\n\t[\"operator\", \":\"],\n\t\" is\\r\\n    PERSON \",\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n        string firstName\\r\\n        string lastName\\r\\n        int age\\r\\n    \",\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/mermaid/full_flowchart.test",
    "content": "flowchart LR\n    id\n\nflowchart LR\n    id1[This is the text in the box]\n\nflowchart TD\n    Start --> Stop\n\nflowchart LR\n    Start --> Stop\n\nflowchart LR\n    id1(This is the text in the box)\n\nflowchart LR\n    id1([This is the text in the box])\n\nflowchart LR\n    id1[[This is the text in the box]]\n\nflowchart LR\n    id1[(Database)]\n\nflowchart LR\n    id1((This is the text in the circle))\n\nflowchart LR\n    id1>This is the text in the box]\n\nflowchart LR\n    id1{This is the text in the box}\n\nflowchart LR\n    id1{{This is the text in the box}}\n\nflowchart TD\n    id1[/This is the text in the box/]\n\nflowchart TD\n    id1[\\This is the text in the box\\]\n\nflowchart TD\n    A[/Christmas\\]\n\nflowchart TD\n    B[\\Go shopping/]\n\nflowchart LR\n    A-->B\n\nflowchart LR\n    A --- B\n\nflowchart LR\n    A-- This is the text! ---B\n\nflowchart LR\n    A---|This is the text|B\n\nflowchart LR\n    A-->|text|B\n\nflowchart LR\n    A-- text -->B\n\nflowchart LR;\n   A-.->B;\n\nflowchart LR\n   A-. text .-> B\n\nflowchart LR\n   A ==> B\n\nflowchart LR\n   A == text ==> B\n\nflowchart LR\n   A -- text --> B -- text2 --> C\n\nflowchart LR\n   a --> b & c--> d\n\nflowchart TB\n    A & B--> C & D\n\nflowchart TB\n    A --> C\n    A --> D\n    B --> C\n    B --> D\n\nflowchart LR\n    A --o B\n    B --x C\n\nflowchart LR\n    A o--o B\n    B <--> C\n    C x--x D\n\nflowchart TD\n    A[Start] --> B{Is it?};\n    B -->|Yes| C[OK];\n    C --> D[Rethink];\n    D --> B;\n    B ---->|No| E[End];\n\nflowchart TD\n    A[Start] --> B{Is it?};\n    B -- Yes --> C[OK];\n    C --> D[Rethink];\n    D --> B;\n    B -- No ----> E[End];\n\nflowchart LR\n    id1[\"This is the (text) in the box\"]\n\nflowchart LR\n        A[\"A double quote:#quot;\"] -->B[\"A dec char:#9829;\"]\n\nsubgraph title\n    graph definition\nend\n\nflowchart TB\n    c1-->a2\n    subgraph one\n    a1-->a2\n    end\n    subgraph two\n    b1-->b2\n    end\n    subgraph three\n    c1-->c2\n    end\n\nflowchart TB\n    c1-->a2\n    subgraph ide1 [one]\n    a1-->a2\n    end\n\nflowchart TB\n    c1-->a2\n    subgraph one\n    a1-->a2\n    end\n    subgraph two\n    b1-->b2\n    end\n    subgraph three\n    c1-->c2\n    end\n    one --> two\n    three --> two\n    two --> c2\n\nflowchart LR\n  subgraph TOP\n    direction TB\n    subgraph B1\n        direction RL\n        i1 -->f1\n    end\n    subgraph B2\n        direction BT\n        i2 -->f2\n    end\n  end\n  A --> TOP --> B\n  B1 --> B2\n\nclick nodeId callback\nclick nodeId call callback()\n\nflowchart LR;\n    A-->B;\n    B-->C;\n    C-->D;\n    click A callback \"Tooltip for a callback\"\n    click B \"http://www.github.com\" \"This is a tooltip for a link\"\n    click A call callback() \"Tooltip for a callback\"\n    click B href \"http://www.github.com\" \"This is a tooltip for a link\"\n\nflowchart LR;\n    A-->B;\n    B-->C;\n    C-->D;\n    D-->E;\n    click A \"http://www.github.com\" _blank\n    click B \"http://www.github.com\" \"Open this in a new tab\" _blank\n    click C href \"http://www.github.com\" _blank\n    click D href \"http://www.github.com\" \"Open this in a new tab\" _blank\n\nflowchart LR\n%% this is a comment A -- text --> B{node}\n   A -- text --> B -- text2 --> C\n\nlinkStyle 3 stroke:#ff3,stroke-width:4px,color:red;\n\nflowchart LR\n    id1(Start)-->id2(Stop)\n    style id1 fill:#f9f,stroke:#333,stroke-width:4px\n    style id2 fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5\n\nclassDef className fill:#f9f,stroke:#333,stroke-width:4px;\n\nclass nodeId1 className;\n\nclass nodeId1,nodeId2 className;\n\nflowchart LR\n    A:::someclass --> B\n    classDef someclass fill:#f96;\n\nflowchart LR;\n    A-->B[AAA<span>BBB</span>];\n    B-->D;\n    class A cssClass;\n\nclassDef default fill:#f9f,stroke:#333,stroke-width:4px;\n\nflowchart TD\n    B[\"fa:fa-twitter for peace\"]\n    B-->C[fa:fa-ban forbidden]\n    B-->D(fa:fa-spinner);\n    B-->E(A fa:fa-camera-retro perhaps?);\n\nflowchart LR\n    A[Hard edge] -->|Link text| B(Round edge)\n    B --> C{Decision}\n    C -->|One| D[Result one]\n    C -->|Two| E[Result two]\n\n    flowchart LR;\n        A-->B;\n        B-->C;\n        C-->D;\n        click A callback \"Tooltip\"\n        click B \"http://www.github.com\" \"This is a link\"\n        click C call callback() \"Tooltip\"\n        click D href \"http://www.github.com\" \"This is a link\"\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"flowchart\"], \" LR\\r\\n    id\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    id1\",\n\t[\"text\", \"[This is the text in the box]\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" TD\\r\\n    Start \",\n\t[\"arrow\", \"-->\"],\n\t\" Stop\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    Start \",\n\t[\"arrow\", \"-->\"],\n\t\" Stop\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    id1\",\n\t[\"text\", \"(This is the text in the box)\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    id1\",\n\t[\"text\", \"([This is the text in the box])\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    id1\",\n\t[\"text\", \"[[This is the text in the box]]\"],\n\n\t[\"keyword\", \"flowchart\"], \" LR\\r\\n    id1\", [\"text\", \"[(Database)]\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    id1\",\n\t[\"text\", \"((This is the text in the circle))\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    id1\",\n\t[\"text\", \">This is the text in the box]\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    id1\",\n\t[\"text\", \"{This is the text in the box}\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    id1\",\n\t[\"text\", \"{{This is the text in the box}}\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" TD\\r\\n    id1\",\n\t[\"text\", \"[/This is the text in the box/]\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" TD\\r\\n    id1\",\n\t[\"text\", \"[\\\\This is the text in the box\\\\]\"],\n\n\t[\"keyword\", \"flowchart\"], \" TD\\r\\n    A\", [\"text\", \"[/Christmas\\\\]\"],\n\n\t[\"keyword\", \"flowchart\"], \" TD\\r\\n    B\", [\"text\", \"[\\\\Go shopping/]\"],\n\n\t[\"keyword\", \"flowchart\"], \" LR\\r\\n    A\", [\"arrow\", \"-->\"], \"B\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"], \" LR\\r\\n    A \", [\"arrow\", \"---\"], \" B\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    A\",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"This is the text!\"],\n\t\t[\"arrow\", \"---\"]\n\t]],\n\t\"B\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    A\",\n\t[\"arrow\", \"---\"],\n\t[\"label\", \"|This is the text|\"],\n\t\"B\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    A\",\n\t[\"arrow\", \"-->\"],\n\t[\"label\", \"|text|\"],\n\t\"B\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    A\",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"text\"],\n\t\t[\"arrow\", \"-->\"]\n\t]],\n\t\"B\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"], \" LR\", [\"punctuation\", \";\"],\n\t\"\\r\\n   A\", [\"arrow\", \"-.->\"], \"B\", [\"punctuation\", \";\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n   A\",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"-.\"],\n\t\t[\"label\", \"text\"],\n\t\t[\"arrow\", \".->\"]\n\t]],\n\t\" B\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"], \" LR\\r\\n   A \", [\"arrow\", \"==>\"], \" B\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n   A \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"==\"],\n\t\t[\"label\", \"text\"],\n\t\t[\"arrow\", \"==>\"]\n\t]],\n\t\" B\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n   A \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"text\"],\n\t\t[\"arrow\", \"-->\"]\n\t]],\n\t\" B \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"text2\"],\n\t\t[\"arrow\", \"-->\"]\n\t]],\n\t\" C\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n   a \",\n\t[\"arrow\", \"-->\"],\n\t\" b \",\n\t[\"operator\", \"&\"],\n\t\" c\",\n\t[\"arrow\", \"-->\"],\n\t\" d\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" TB\\r\\n    A \",\n\t[\"operator\", \"&\"],\n\t\" B\",\n\t[\"arrow\", \"-->\"],\n\t\" C \",\n\t[\"operator\", \"&\"],\n\t\" D\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" TB\\r\\n    A \",\n\t[\"arrow\", \"-->\"],\n\t\" C\\r\\n    A \",\n\t[\"arrow\", \"-->\"],\n\t\" D\\r\\n    B \",\n\t[\"arrow\", \"-->\"],\n\t\" C\\r\\n    B \",\n\t[\"arrow\", \"-->\"],\n\t\" D\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    A \",\n\t[\"arrow\", \"--o\"],\n\t\" B\\r\\n    B \",\n\t[\"arrow\", \"--x\"],\n\t\" C\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    A \",\n\t[\"arrow\", \"o--o\"],\n\t\" B\\r\\n    B \",\n\t[\"arrow\", \"<-->\"],\n\t\" C\\r\\n    C \",\n\t[\"arrow\", \"x--x\"],\n\t\" D\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" TD\\r\\n    A\",\n\t[\"text\", \"[Start]\"],\n\t[\"arrow\", \"-->\"],\n\t\" B\",\n\t[\"text\", \"{Is it?}\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    B \",\n\t[\"arrow\", \"-->\"],\n\t[\"label\", \"|Yes|\"],\n\t\" C\",\n\t[\"text\", \"[OK]\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    C \",\n\t[\"arrow\", \"-->\"],\n\t\" D\",\n\t[\"text\", \"[Rethink]\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    D \",\n\t[\"arrow\", \"-->\"],\n\t\" B\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    B \",\n\t[\"arrow\", \"---->\"],\n\t[\"label\", \"|No|\"],\n\t\" E\",\n\t[\"text\", \"[End]\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" TD\\r\\n    A\",\n\t[\"text\", \"[Start]\"],\n\t[\"arrow\", \"-->\"],\n\t\" B\",\n\t[\"text\", \"{Is it?}\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    B \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"Yes\"],\n\t\t[\"arrow\", \"-->\"]\n\t]],\n\t\" C\",\n\t[\"text\", \"[OK]\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    C \",\n\t[\"arrow\", \"-->\"],\n\t\" D\",\n\t[\"text\", \"[Rethink]\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    D \",\n\t[\"arrow\", \"-->\"],\n\t\" B\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    B \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"No\"],\n\t\t[\"arrow\", \"---->\"]\n\t]],\n\t\" E\",\n\t[\"text\", \"[End]\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    id1\",\n\t[\"text\", \"[\\\"This is the (text) in the box\\\"]\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n        A\",\n\t[\"text\", \"[\\\"A double quote:#quot;\\\"]\"],\n\t[\"arrow\", \"-->\"],\n\t\"B\",\n\t[\"text\", \"[\\\"A dec char:#9829;\\\"]\"],\n\n\t[\"keyword\", \"subgraph\"], \" title\\r\\n    \",\n\t[\"keyword\", \"graph\"], \" definition\\r\\n\",\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"flowchart\"], \" TB\\r\\n    c1\", [\"arrow\", \"-->\"], \"a2\\r\\n    \",\n\t[\"keyword\", \"subgraph\"], \" one\\r\\n    a1\", [\"arrow\", \"-->\"], \"a2\\r\\n    \",\n\t[\"keyword\", \"end\"],\n\t[\"keyword\", \"subgraph\"], \" two\\r\\n    b1\", [\"arrow\", \"-->\"], \"b2\\r\\n    \",\n\t[\"keyword\", \"end\"],\n\t[\"keyword\", \"subgraph\"], \" three\\r\\n    c1\", [\"arrow\", \"-->\"], \"c2\\r\\n    \",\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"flowchart\"], \" TB\\r\\n    c1\", [\"arrow\", \"-->\"], \"a2\\r\\n    \",\n\t[\"keyword\", \"subgraph\"], \" ide1 \", [\"text\", \"[one]\"],\n\t\"\\r\\n    a1\", [\"arrow\", \"-->\"], \"a2\\r\\n    \",\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" TB\\r\\n    c1\",\n\t[\"arrow\", \"-->\"],\n\t\"a2\\r\\n    \",\n\n\t[\"keyword\", \"subgraph\"],\n\t\" one\\r\\n    a1\",\n\t[\"arrow\", \"-->\"],\n\t\"a2\\r\\n    \",\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"subgraph\"],\n\t\" two\\r\\n    b1\",\n\t[\"arrow\", \"-->\"],\n\t\"b2\\r\\n    \",\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"subgraph\"],\n\t\" three\\r\\n    c1\",\n\t[\"arrow\", \"-->\"],\n\t\"c2\\r\\n    \",\n\n\t[\"keyword\", \"end\"],\n\n\t\"\\r\\n    one \",\n\t[\"arrow\", \"-->\"],\n\t\" two\\r\\n    three \",\n\t[\"arrow\", \"-->\"],\n\t\" two\\r\\n    two \",\n\t[\"arrow\", \"-->\"],\n\t\" c2\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n  \",\n\n\t[\"keyword\", \"subgraph\"],\n\t\" TOP\\r\\n    \",\n\n\t[\"keyword\", \"direction\"],\n\t\" TB\\r\\n    \",\n\n\t[\"keyword\", \"subgraph\"],\n\t\" B1\\r\\n        \",\n\n\t[\"keyword\", \"direction\"],\n\t\" RL\\r\\n        i1 \",\n\t[\"arrow\", \"-->\"],\n\t\"f1\\r\\n    \",\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"subgraph\"],\n\t\" B2\\r\\n        \",\n\n\t[\"keyword\", \"direction\"],\n\t\" BT\\r\\n        i2 \",\n\t[\"arrow\", \"-->\"],\n\t\"f2\\r\\n    \",\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"end\"],\n\n\t\"\\r\\n  A \",\n\t[\"arrow\", \"-->\"],\n\t\" TOP \",\n\t[\"arrow\", \"-->\"],\n\t\" B\\r\\n  B1 \",\n\t[\"arrow\", \"-->\"],\n\t\" B2\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"click\"],\n\t\" nodeId callback\\r\\n\",\n\n\t[\"keyword\", \"click\"],\n\t\" nodeId call callback\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    A\",\n\t[\"arrow\", \"-->\"],\n\t\"B\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    B\",\n\t[\"arrow\", \"-->\"],\n\t\"C\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    C\",\n\t[\"arrow\", \"-->\"],\n\t\"D\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"click\"],\n\t\" A callback \",\n\t[\"string\", \"\\\"Tooltip for a callback\\\"\"],\n\n\t[\"keyword\", \"click\"],\n\t\" B \",\n\t[\"string\", \"\\\"http://www.github.com\\\"\"],\n\t[\"string\", \"\\\"This is a tooltip for a link\\\"\"],\n\n\t[\"keyword\", \"click\"],\n\t\" A call callback\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"string\", \"\\\"Tooltip for a callback\\\"\"],\n\n\t[\"keyword\", \"click\"],\n\t\" B href \",\n\t[\"string\", \"\\\"http://www.github.com\\\"\"],\n\t[\"string\", \"\\\"This is a tooltip for a link\\\"\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    A\",\n\t[\"arrow\", \"-->\"],\n\t\"B\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    B\",\n\t[\"arrow\", \"-->\"],\n\t\"C\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    C\",\n\t[\"arrow\", \"-->\"],\n\t\"D\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    D\",\n\t[\"arrow\", \"-->\"],\n\t\"E\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"click\"],\n\t\" A \",\n\t[\"string\", \"\\\"http://www.github.com\\\"\"],\n\t\" _blank\\r\\n    \",\n\n\t[\"keyword\", \"click\"],\n\t\" B \",\n\t[\"string\", \"\\\"http://www.github.com\\\"\"],\n\t[\"string\", \"\\\"Open this in a new tab\\\"\"],\n\t\" _blank\\r\\n    \",\n\n\t[\"keyword\", \"click\"],\n\t\" C href \",\n\t[\"string\", \"\\\"http://www.github.com\\\"\"],\n\t\" _blank\\r\\n    \",\n\n\t[\"keyword\", \"click\"],\n\t\" D href \",\n\t[\"string\", \"\\\"http://www.github.com\\\"\"],\n\t[\"string\", \"\\\"Open this in a new tab\\\"\"],\n\t\" _blank\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n\",\n\n\t[\"comment\", \"%% this is a comment A -- text --> B{node}\"],\n\n\t\"\\r\\n   A \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"text\"],\n\t\t[\"arrow\", \"-->\"]\n\t]],\n\t\" B \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"text2\"],\n\t\t[\"arrow\", \"-->\"]\n\t]],\n\t\" C\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"linkStyle\"],\n\t\" 3 \",\n\t[\"style\", [\n\t\t[\"property\", \"stroke\"],\n\t\t[\"operator\", \":\"],\n\t\t\"#ff3\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"stroke-width\"],\n\t\t[\"operator\", \":\"],\n\t\t\"4px\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"color\"],\n\t\t[\"operator\", \":\"],\n\t\t\"red\"\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    id1\",\n\t[\"text\", \"(Start)\"],\n\t[\"arrow\", \"-->\"],\n\t\"id2\",\n\t[\"text\", \"(Stop)\"],\n\n\t[\"keyword\", \"style\"],\n\t\" id1 \",\n\t[\"style\", [\n\t\t[\"property\", \"fill\"],\n\t\t[\"operator\", \":\"],\n\t\t\"#f9f\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"stroke\"],\n\t\t[\"operator\", \":\"],\n\t\t\"#333\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"stroke-width\"],\n\t\t[\"operator\", \":\"],\n\t\t\"4px\"\n\t]],\n\n\t[\"keyword\", \"style\"],\n\t\" id2 \",\n\t[\"style\", [\n\t\t[\"property\", \"fill\"],\n\t\t[\"operator\", \":\"],\n\t\t\"#bbf\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"stroke\"],\n\t\t[\"operator\", \":\"],\n\t\t\"#f66\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"stroke-width\"],\n\t\t[\"operator\", \":\"],\n\t\t\"2px\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"color\"],\n\t\t[\"operator\", \":\"],\n\t\t\"#fff\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"stroke-dasharray\"],\n\t\t[\"operator\", \":\"],\n\t\t\" 5 5\"\n\t]],\n\n\t[\"keyword\", \"classDef\"],\n\t\" className \",\n\t[\"style\", [\n\t\t[\"property\", \"fill\"],\n\t\t[\"operator\", \":\"],\n\t\t\"#f9f\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"stroke\"],\n\t\t[\"operator\", \":\"],\n\t\t\"#333\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"stroke-width\"],\n\t\t[\"operator\", \":\"],\n\t\t\"4px\"\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"class\"], \" nodeId1 className\", [\"punctuation\", \";\"],\n\n\t[\"keyword\", \"class\"], \" nodeId1,nodeId2 className\", [\"punctuation\", \";\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    A\",\n\t[\"operator\", \":::\"],\n\t\"someclass \",\n\t[\"arrow\", \"-->\"],\n\t\" B\\r\\n    \",\n\n\t[\"keyword\", \"classDef\"],\n\t\" someclass \",\n\t[\"style\", [\n\t\t[\"property\", \"fill\"],\n\t\t[\"operator\", \":\"],\n\t\t\"#f96\"\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    A\",\n\t[\"arrow\", \"-->\"],\n\t\"B\",\n\t[\"text\", \"[AAA<span>BBB</span>]\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    B\",\n\t[\"arrow\", \"-->\"],\n\t\"D\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"class\"],\n\t\" A cssClass\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"classDef\"],\n\t\" default \",\n\t[\"style\", [\n\t\t[\"property\", \"fill\"],\n\t\t[\"operator\", \":\"],\n\t\t\"#f9f\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"stroke\"],\n\t\t[\"operator\", \":\"],\n\t\t\"#333\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"stroke-width\"],\n\t\t[\"operator\", \":\"],\n\t\t\"4px\"\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" TD\\r\\n    B\",\n\t[\"text\", \"[\\\"fa:fa-twitter for peace\\\"]\"],\n\n\t\"\\r\\n    B\",\n\t[\"arrow\", \"-->\"],\n\t\"C\",\n\t[\"text\", \"[fa:fa-ban forbidden]\"],\n\n\t\"\\r\\n    B\",\n\t[\"arrow\", \"-->\"],\n\t\"D\",\n\t[\"text\", \"(fa:fa-spinner)\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n    B\",\n\t[\"arrow\", \"-->\"],\n\t\"E\",\n\t[\"text\", \"(A fa:fa-camera-retro perhaps?)\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\\r\\n    A\",\n\t[\"text\", \"[Hard edge]\"],\n\t[\"arrow\", \"-->\"],\n\t[\"label\", \"|Link text|\"],\n\t\" B\",\n\t[\"text\", \"(Round edge)\"],\n\n\t\"\\r\\n    B \",\n\t[\"arrow\", \"-->\"],\n\t\" C\",\n\t[\"text\", \"{Decision}\"],\n\n\t\"\\r\\n    C \",\n\t[\"arrow\", \"-->\"],\n\t[\"label\", \"|One|\"],\n\t\" D\",\n\t[\"text\", \"[Result one]\"],\n\n\t\"\\r\\n    C \",\n\t[\"arrow\", \"-->\"],\n\t[\"label\", \"|Two|\"],\n\t\" E\",\n\t[\"text\", \"[Result two]\"],\n\n\t[\"keyword\", \"flowchart\"],\n\t\" LR\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n        A\",\n\t[\"arrow\", \"-->\"],\n\t\"B\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n        B\",\n\t[\"arrow\", \"-->\"],\n\t\"C\",\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n        C\",\n\t[\"arrow\", \"-->\"],\n\t\"D\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"click\"],\n\t\" A callback \",\n\t[\"string\", \"\\\"Tooltip\\\"\"],\n\n\t[\"keyword\", \"click\"],\n\t\" B \",\n\t[\"string\", \"\\\"http://www.github.com\\\"\"],\n\t[\"string\", \"\\\"This is a link\\\"\"],\n\n\t[\"keyword\", \"click\"],\n\t\" C call callback\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"string\", \"\\\"Tooltip\\\"\"],\n\n\t[\"keyword\", \"click\"],\n\t\" D href \",\n\t[\"string\", \"\\\"http://www.github.com\\\"\"],\n\t[\"string\", \"\\\"This is a link\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/mermaid/full_sequencediagram.test",
    "content": "sequenceDiagram\n    Alice->>John: Hello John, how are you?\n    John-->>Alice: Great!\n    Alice-)John: See you later!\n\nsequenceDiagram\n    participant John\n    participant Alice\n    Alice->>John: Hello John, how are you?\n    John-->>Alice: Great!\n\nsequenceDiagram\n    participant A as Alice\n    participant J as John\n    A->>J: Hello John, how are you?\n    J->>A: Great!\n\n[Actor][Arrow][Actor]:Message text\n\nsequenceDiagram\n    Alice->>John: Hello John, how are you?\n    activate John\n    John-->>Alice: Great!\n    deactivate John\n\nsequenceDiagram\n    Alice->>+John: Hello John, how are you?\n    John-->>-Alice: Great!\n\nsequenceDiagram\n    Alice->>+John: Hello John, how are you?\n    Alice->>+John: John, can you hear me?\n    John-->>-Alice: Hi Alice, I can hear you!\n    John-->>-Alice: I feel great!\n\nsequenceDiagram\n    participant John\n    Note right of John: Text in note\n\nsequenceDiagram\n    Alice->John: Hello John, how are you?\n    Note over Alice,John: A typical interaction\n\nloop Loop text\n... statements ...\nend\n\nsequenceDiagram\n    Alice->John: Hello John, how are you?\n    loop Every minute\n        John-->Alice: Great!\n    end\n\nalt Describing text\n... statements ...\nelse\n... statements ...\nend\n\nopt Describing text\n... statements ...\nend\n\nsequenceDiagram\n    Alice->>Bob: Hello Bob, how are you?\n    alt is sick\n        Bob->>Alice: Not so good :(\n    else is well\n        Bob->>Alice: Feeling fresh like a daisy\n    end\n    opt Extra response\n        Bob->>Alice: Thanks for asking\n    end\n\npar [Action 1]\n... statements ...\nand [Action 2]\n... statements ...\nand [Action N]\n... statements ...\nend\n\nrect rgb(0, 255, 0)\n... content ...\nend\n\nrect rgba(0, 0, 255, .1)\n... content ...\nend\n\nsequenceDiagram\n    Alice->>John: Hello John, how are you?\n    %% this is a comment\n    John-->>Alice: Great!\n\nsequenceDiagram\n    A->>B: I #9829; you!\n    B->>A: I #9829; you #infin; times more!\n\nsequenceDiagram\n    autonumber\n    Alice->>John: Hello John, how are you?\n    loop Healthcheck\n        John->>John: Fight against hypochondria\n    end\n    Note right of John: Rational thoughts!\n    John-->>Alice: Great!\n    John->>Bob: How about you?\n    Bob-->>John: Jolly good!\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t\"\\r\\n    Alice\",\n\t[\"arrow\", \"->>\"],\n\t\"John\",\n\t[\"operator\", \":\"],\n\t\" Hello John, how are you?\\r\\n    John\",\n\t[\"arrow\", \"-->>\"],\n\t\"Alice\",\n\t[\"operator\", \":\"],\n\t\" Great!\\r\\n    Alice\",\n\t[\"arrow\", \"-)\"],\n\t\"John\",\n\t[\"operator\", \":\"],\n\t\" See you later!\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t[\"keyword\", \"participant\"],\n\t\" John\\r\\n    \",\n\n\t[\"keyword\", \"participant\"],\n\t\" Alice\\r\\n    Alice\",\n\t[\"arrow\", \"->>\"],\n\t\"John\",\n\t[\"operator\", \":\"],\n\t\" Hello John, how are you?\\r\\n    John\",\n\t[\"arrow\", \"-->>\"],\n\t\"Alice\",\n\t[\"operator\", \":\"],\n\t\" Great!\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t[\"keyword\", \"participant\"],\n\t\" A as Alice\\r\\n    \",\n\n\t[\"keyword\", \"participant\"],\n\t\" J as John\\r\\n    A\",\n\t[\"arrow\", \"->>\"],\n\t\"J\",\n\t[\"operator\", \":\"],\n\t\" Hello John, how are you?\\r\\n    J\",\n\t[\"arrow\", \"->>\"],\n\t\"A\",\n\t[\"operator\", \":\"],\n\t\" Great!\\r\\n\\r\\n\",\n\n\t[\"text\", \"[Actor]\"],\n\t[\"text\", \"[Arrow]\"],\n\t[\"text\", \"[Actor]\"],\n\t[\"operator\", \":\"],\n\t\"Message text\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t\"\\r\\n    Alice\",\n\t[\"arrow\", \"->>\"],\n\t\"John\",\n\t[\"operator\", \":\"],\n\t\" Hello John, how are you?\\r\\n    \",\n\n\t[\"keyword\", \"activate\"],\n\t\" John\\r\\n    John\",\n\t[\"arrow\", \"-->>\"],\n\t\"Alice\",\n\t[\"operator\", \":\"],\n\t\" Great!\\r\\n    \",\n\n\t[\"keyword\", \"deactivate\"],\n\t\" John\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t\"\\r\\n    Alice\",\n\t[\"arrow\", \"->>\"],\n\t\"+John\",\n\t[\"operator\", \":\"],\n\t\" Hello John, how are you?\\r\\n    John\",\n\t[\"arrow\", \"-->>\"],\n\t\"-Alice\",\n\t[\"operator\", \":\"],\n\t\" Great!\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t\"\\r\\n    Alice\",\n\t[\"arrow\", \"->>\"],\n\t\"+John\",\n\t[\"operator\", \":\"],\n\t\" Hello John, how are you?\\r\\n    Alice\",\n\t[\"arrow\", \"->>\"],\n\t\"+John\",\n\t[\"operator\", \":\"],\n\t\" John, can you hear me?\\r\\n    John\",\n\t[\"arrow\", \"-->>\"],\n\t\"-Alice\",\n\t[\"operator\", \":\"],\n\t\" Hi Alice, I can hear you!\\r\\n    John\",\n\t[\"arrow\", \"-->>\"],\n\t\"-Alice\",\n\t[\"operator\", \":\"],\n\t\" I feel great!\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t[\"keyword\", \"participant\"],\n\t\" John\\r\\n    \",\n\n\t[\"keyword\", \"Note right of\"],\n\t\" John\",\n\t[\"operator\", \":\"],\n\t\" Text in note\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t\"\\r\\n    Alice\",\n\t[\"arrow\", \"->\"],\n\t\"John\",\n\t[\"operator\", \":\"],\n\t\" Hello John, how are you?\\r\\n    \",\n\n\t[\"keyword\", \"Note over\"],\n\t\" Alice,John\",\n\t[\"operator\", \":\"],\n\t\" A typical interaction\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"loop\"], \" Loop text\\r\\n... statements ...\\r\\n\",\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t\"\\r\\n    Alice\",\n\t[\"arrow\", \"->\"],\n\t\"John\",\n\t[\"operator\", \":\"],\n\t\" Hello John, how are you?\\r\\n    \",\n\n\t[\"keyword\", \"loop\"],\n\t\" Every minute\\r\\n        John\",\n\t[\"arrow\", \"-->\"],\n\t\"Alice\",\n\t[\"operator\", \":\"],\n\t\" Great!\\r\\n    \",\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"alt\"], \" Describing text\\r\\n... statements ...\\r\\n\",\n\t[\"keyword\", \"else\"],\n\t\"\\r\\n... statements ...\\r\\n\",\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"opt\"], \" Describing text\\r\\n... statements ...\\r\\n\",\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t\"\\r\\n    Alice\",\n\t[\"arrow\", \"->>\"],\n\t\"Bob\",\n\t[\"operator\", \":\"],\n\t\" Hello Bob, how are you?\\r\\n    \",\n\n\t[\"keyword\", \"alt\"],\n\t\" is sick\\r\\n        Bob\",\n\t[\"arrow\", \"->>\"],\n\t\"Alice\",\n\t[\"operator\", \":\"],\n\t\" Not so good \",\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"(\"],\n\n\t[\"keyword\", \"else\"],\n\t\" is well\\r\\n        Bob\",\n\t[\"arrow\", \"->>\"],\n\t\"Alice\",\n\t[\"operator\", \":\"],\n\t\" Feeling fresh like a daisy\\r\\n    \",\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"opt\"],\n\t\" Extra response\\r\\n        Bob\",\n\t[\"arrow\", \"->>\"],\n\t\"Alice\",\n\t[\"operator\", \":\"],\n\t\" Thanks for asking\\r\\n    \",\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"par\"], [\"text\", \"[Action 1]\"],\n\t\"\\r\\n... statements ...\\r\\n\",\n\t[\"keyword\", \"and\"], [\"text\", \"[Action 2]\"],\n\t\"\\r\\n... statements ...\\r\\n\",\n\t[\"keyword\", \"and\"], [\"text\", \"[Action N]\"],\n\t\"\\r\\n... statements ...\\r\\n\",\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"rect\"], \" rgb\", [\"text\", \"(0, 255, 0)\"],\n\t\"\\r\\n... content ...\\r\\n\",\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"rect\"], \" rgba\", [\"text\", \"(0, 0, 255, .1)\"],\n\t\"\\r\\n... content ...\\r\\n\",\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t\"\\r\\n    Alice\",\n\t[\"arrow\", \"->>\"],\n\t\"John\",\n\t[\"operator\", \":\"],\n\t\" Hello John, how are you?\\r\\n    \",\n\n\t[\"comment\", \"%% this is a comment\"],\n\n\t\"\\r\\n    John\",\n\t[\"arrow\", \"-->>\"],\n\t\"Alice\",\n\t[\"operator\", \":\"],\n\t\" Great!\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t\"\\r\\n    A\",\n\t[\"arrow\", \"->>\"],\n\t\"B\",\n\t[\"operator\", \":\"],\n\t\" I \",\n\t[\"entity\", \"#9829;\"],\n\t\" you!\\r\\n    B\",\n\t[\"arrow\", \"->>\"],\n\t\"A\",\n\t[\"operator\", \":\"],\n\t\" I \",\n\t[\"entity\", \"#9829;\"],\n\t\" you \",\n\t[\"entity\", \"#infin;\"],\n\t\" times more!\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"sequenceDiagram\"],\n\n\t[\"keyword\", \"autonumber\"],\n\n\t\"\\r\\n    Alice\",\n\t[\"arrow\", \"->>\"],\n\t\"John\",\n\t[\"operator\", \":\"],\n\t\" Hello John, how are you?\\r\\n    \",\n\n\t[\"keyword\", \"loop\"],\n\t\" Healthcheck\\r\\n        John\",\n\t[\"arrow\", \"->>\"],\n\t\"John\",\n\t[\"operator\", \":\"],\n\t\" Fight against hypochondria\\r\\n    \",\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"Note right of\"],\n\t\" John\",\n\t[\"operator\", \":\"],\n\t\" Rational thoughts!\\r\\n    John\",\n\t[\"arrow\", \"-->>\"],\n\t\"Alice\",\n\t[\"operator\", \":\"],\n\t\" Great!\\r\\n    John\",\n\t[\"arrow\", \"->>\"],\n\t\"Bob\",\n\t[\"operator\", \":\"],\n\t\" How about you?\\r\\n    Bob\",\n\t[\"arrow\", \"-->>\"],\n\t\"John\",\n\t[\"operator\", \":\"],\n\t\" Jolly good!\"\n]\n"
  },
  {
    "path": "tests/languages/mermaid/full_statediagram.test",
    "content": "stateDiagram-v2\n    [*] --> Still\n    Still --> [*]\n\n    Still --> Moving\n    Moving --> Still\n    Moving --> Crash\n    Crash --> [*]\n\nstateDiagram-v2\n    s1 --> s2\n\nstateDiagram-v2\n    s1 --> s2: A transition\n\nstateDiagram-v2\n    [*] --> s1\n    s1 --> [*]\n\nstateDiagram-v2\n    [*] --> First\n    state First {\n        [*] --> second\n        second --> [*]\n    }\n\nstateDiagram-v2\n    [*] --> First\n\n    state First {\n        [*] --> Second\n\n        state Second {\n            [*] --> second\n            second --> Third\n\n            state Third {\n                [*] --> third\n                third --> [*]\n            }\n        }\n    }\n\nstateDiagram-v2\n    [*] --> First\n    First --> Second\n    First --> Third\n\n    state First {\n        [*] --> fir\n        fir --> [*]\n    }\n    state Second {\n        [*] --> sec\n        sec --> [*]\n    }\n    state Third {\n        [*] --> thi\n        thi --> [*]\n    }\n\nstateDiagram-v2\n    state if_state <<choice>>\n    [*] --> IsPositive\n    IsPositive --> if_state\n    if_state --> False: if n < 0\n    if_state --> True : if n >= 0\n\nstateDiagram-v2\n    state fork_state <<fork>>\n      [*] --> fork_state\n      fork_state --> State2\n      fork_state --> State3\n\n      state join_state <<join>>\n      State2 --> join_state\n      State3 --> join_state\n      join_state --> State4\n      State4 --> [*]\n\nstateDiagram-v2\n        State1: The state with a note\n        note right of State1\n            Important information! You can write\n            notes.\n        end note\n        State1 --> State2\n        note left of State2 : This is the note to the left.\n\nstateDiagram-v2\n    [*] --> Active\n\n    state Active {\n        [*] --> NumLockOff\n        NumLockOff --> NumLockOn : EvNumLockPressed\n        NumLockOn --> NumLockOff : EvNumLockPressed\n        --\n        [*] --> CapsLockOff\n        CapsLockOff --> CapsLockOn : EvCapsLockPressed\n        CapsLockOn --> CapsLockOff : EvCapsLockPressed\n        --\n        [*] --> ScrollLockOff\n        ScrollLockOff --> ScrollLockOn : EvScrollLockPressed\n        ScrollLockOn --> ScrollLockOff : EvScrollLockPressed\n    }\n\nstateDiagram\n    direction LR\n    [*] --> A\n    A --> B\n    B --> C\n    state B {\n      direction LR\n      a --> b\n    }\n    B --> D\n\nstateDiagram-v2\n    [*] --> Still\n    Still --> [*]\n%% this is a comment\n    Still --> Moving\n    Moving --> Still %% another comment\n    Moving --> Crash\n    Crash --> [*]\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"stateDiagram-v2\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" Still\\r\\n    Still \",\n\t[\"arrow\", \"-->\"],\n\t[\"text\", \"[*]\"],\n\n\t\"\\r\\n\\r\\n    Still \",\n\t[\"arrow\", \"-->\"],\n\t\" Moving\\r\\n    Moving \",\n\t[\"arrow\", \"-->\"],\n\t\" Still\\r\\n    Moving \",\n\t[\"arrow\", \"-->\"],\n\t\" Crash\\r\\n    Crash \",\n\t[\"arrow\", \"-->\"],\n\t[\"text\", \"[*]\"],\n\n\t[\"keyword\", \"stateDiagram-v2\"],\n\t\"\\r\\n    s1 \", [\"arrow\", \"-->\"], \" s2\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"stateDiagram-v2\"],\n\n\t\"\\r\\n    s1 \",\n\t[\"arrow\", \"-->\"],\n\t\" s2\",\n\t[\"operator\", \":\"],\n\t\" A transition\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"stateDiagram-v2\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" s1\\r\\n    s1 \",\n\t[\"arrow\", \"-->\"],\n\t[\"text\", \"[*]\"],\n\n\t[\"keyword\", \"stateDiagram-v2\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" First\\r\\n    \",\n\n\t[\"keyword\", \"state\"],\n\t\" First \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" second\\r\\n        second \",\n\t[\"arrow\", \"-->\"],\n\t[\"text\", \"[*]\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"stateDiagram-v2\"],\n\t[\"text\", \"[*]\"], [\"arrow\", \"-->\"], \" First\\r\\n\\r\\n    \",\n\n\t[\"keyword\", \"state\"], \" First \", [\"punctuation\", \"{\"],\n\t[\"text\", \"[*]\"], [\"arrow\", \"-->\"], \" Second\\r\\n\\r\\n        \",\n\n\t[\"keyword\", \"state\"],\n\t\" Second \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" second\\r\\n            second \",\n\t[\"arrow\", \"-->\"],\n\t\" Third\\r\\n\\r\\n            \",\n\n\t[\"keyword\", \"state\"],\n\t\" Third \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" third\\r\\n                third \",\n\t[\"arrow\", \"-->\"],\n\t[\"text\", \"[*]\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"stateDiagram-v2\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" First\\r\\n    First \",\n\t[\"arrow\", \"-->\"],\n\t\" Second\\r\\n    First \",\n\t[\"arrow\", \"-->\"],\n\t\" Third\\r\\n\\r\\n    \",\n\n\t[\"keyword\", \"state\"],\n\t\" First \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" fir\\r\\n        fir \",\n\t[\"arrow\", \"-->\"],\n\t[\"text\", \"[*]\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"state\"],\n\t\" Second \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" sec\\r\\n        sec \",\n\t[\"arrow\", \"-->\"],\n\t[\"text\", \"[*]\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"state\"],\n\t\" Third \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" thi\\r\\n        thi \",\n\t[\"arrow\", \"-->\"],\n\t[\"text\", \"[*]\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"stateDiagram-v2\"],\n\n\t[\"keyword\", \"state\"],\n\t\" if_state \",\n\t[\"annotation\", \"<<choice>>\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" IsPositive\\r\\n    IsPositive \",\n\t[\"arrow\", \"-->\"],\n\t\" if_state\\r\\n    if_state \",\n\t[\"arrow\", \"-->\"],\n\t\" False\",\n\t[\"operator\", \":\"],\n\t\" if n < 0\\r\\n    if_state \",\n\t[\"arrow\", \"-->\"],\n\t\" True \",\n\t[\"operator\", \":\"],\n\t\" if n >= 0\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"stateDiagram-v2\"],\n\n\t[\"keyword\", \"state\"],\n\t\" fork_state \",\n\t[\"annotation\", \"<<fork>>\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" fork_state\\r\\n      fork_state \",\n\t[\"arrow\", \"-->\"],\n\t\" State2\\r\\n      fork_state \",\n\t[\"arrow\", \"-->\"],\n\t\" State3\\r\\n\\r\\n      \",\n\n\t[\"keyword\", \"state\"],\n\t\" join_state \",\n\t[\"annotation\", \"<<join>>\"],\n\n\t\"\\r\\n      State2 \",\n\t[\"arrow\", \"-->\"],\n\t\" join_state\\r\\n      State3 \",\n\t[\"arrow\", \"-->\"],\n\t\" join_state\\r\\n      join_state \",\n\t[\"arrow\", \"-->\"],\n\t\" State4\\r\\n      State4 \",\n\t[\"arrow\", \"-->\"],\n\t[\"text\", \"[*]\"],\n\n\t[\"keyword\", \"stateDiagram-v2\"],\n\n\t\"\\r\\n        State1\",\n\t[\"operator\", \":\"],\n\t\" The state with a note\\r\\n        \",\n\n\t[\"keyword\", \"note right of\"],\n\t\" State1\\r\\n            Important information! You can write\\r\\n            notes.\\r\\n        \",\n\n\t[\"keyword\", \"end note\"],\n\n\t\"\\r\\n        State1 \",\n\t[\"arrow\", \"-->\"],\n\t\" State2\\r\\n        \",\n\n\t[\"keyword\", \"note left of\"],\n\t\" State2 \",\n\t[\"operator\", \":\"],\n\t\" This is the note to the left.\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"stateDiagram-v2\"],\n\t[\"text\", \"[*]\"], [\"arrow\", \"-->\"], \" Active\\r\\n\\r\\n    \",\n\n\t[\"keyword\", \"state\"],\n\t\" Active \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" NumLockOff\\r\\n        NumLockOff \",\n\t[\"arrow\", \"-->\"],\n\t\" NumLockOn \",\n\t[\"operator\", \":\"],\n\t\" EvNumLockPressed\\r\\n        NumLockOn \",\n\t[\"arrow\", \"-->\"],\n\t\" NumLockOff \",\n\t[\"operator\", \":\"],\n\t\" EvNumLockPressed\\r\\n        \",\n\n\t[\"arrow\", \"--\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" CapsLockOff\\r\\n        CapsLockOff \",\n\t[\"arrow\", \"-->\"],\n\t\" CapsLockOn \",\n\t[\"operator\", \":\"],\n\t\" EvCapsLockPressed\\r\\n        CapsLockOn \",\n\t[\"arrow\", \"-->\"],\n\t\" CapsLockOff \",\n\t[\"operator\", \":\"],\n\t\" EvCapsLockPressed\\r\\n        \",\n\n\t[\"arrow\", \"--\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" ScrollLockOff\\r\\n        ScrollLockOff \",\n\t[\"arrow\", \"-->\"],\n\t\" ScrollLockOn \",\n\t[\"operator\", \":\"],\n\t\" EvScrollLockPressed\\r\\n        ScrollLockOn \",\n\t[\"arrow\", \"-->\"],\n\t\" ScrollLockOff \",\n\t[\"operator\", \":\"],\n\t\" EvScrollLockPressed\\r\\n    \",\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"stateDiagram\"],\n\n\t[\"keyword\", \"direction\"],\n\t\" LR\\r\\n    \",\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" A\\r\\n    A \",\n\t[\"arrow\", \"-->\"],\n\t\" B\\r\\n    B \",\n\t[\"arrow\", \"-->\"],\n\t\" C\\r\\n    \",\n\n\t[\"keyword\", \"state\"],\n\t\" B \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"direction\"],\n\t\" LR\\r\\n      a \",\n\t[\"arrow\", \"-->\"],\n\t\" b\\r\\n    \",\n\n\t[\"punctuation\", \"}\"],\n\n\t\"\\r\\n    B \",\n\t[\"arrow\", \"-->\"],\n\t\" D\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"stateDiagram-v2\"],\n\n\t[\"text\", \"[*]\"],\n\t[\"arrow\", \"-->\"],\n\t\" Still\\r\\n    Still \",\n\t[\"arrow\", \"-->\"],\n\t[\"text\", \"[*]\"],\n\n\t[\"comment\", \"%% this is a comment\"],\n\n\t\"\\r\\n    Still \",\n\t[\"arrow\", \"-->\"],\n\t\" Moving\\r\\n    Moving \",\n\t[\"arrow\", \"-->\"],\n\t\" Still \",\n\t[\"comment\", \"%% another comment\"],\n\n\t\"\\r\\n    Moving \",\n\t[\"arrow\", \"-->\"],\n\t\" Crash\\r\\n    Crash \",\n\t[\"arrow\", \"-->\"],\n\t[\"text\", \"[*]\"]\n]\n"
  },
  {
    "path": "tests/languages/mermaid/inter-arrow-label_feature.test",
    "content": "A -.s .- C\nA -. s .- C\nA -. \"asdasd\" .- C\nA -- \"asdasd\" --> C\nA -- \"asdasd\" --> C\nA -- \"asdasd\" .- C\nA -- \"asdasd\" === C\nA -- \"asdasd\" ==> C\n\n----------------------------------------------------\n\n[\n\t\"A \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"-.\"],\n\t\t[\"label\", \"s\"],\n\t\t[\"arrow\", \".-\"]\n\t]],\n\t\" C\\r\\nA \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"-.\"],\n\t\t[\"label\", \"s\"],\n\t\t[\"arrow\", \".-\"]\n\t]],\n\t\" C\\r\\nA \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"-.\"],\n\t\t[\"label\", \"\\\"asdasd\\\"\"],\n\t\t[\"arrow\", \".-\"]\n\t]],\n\t\" C\\r\\nA \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"\\\"asdasd\\\"\"],\n\t\t[\"arrow\", \"-->\"]\n\t]],\n\t\" C\\r\\nA \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"\\\"asdasd\\\"\"],\n\t\t[\"arrow\", \"-->\"]\n\t]],\n\t\" C\\r\\nA \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"\\\"asdasd\\\"\"],\n\t\t[\"arrow\", \".-\"]\n\t]],\n\t\" C\\r\\nA \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"\\\"asdasd\\\"\"],\n\t\t[\"arrow\", \"===\"]\n\t]],\n\t\" C\\r\\nA \",\n\t[\"inter-arrow-label\", [\n\t\t[\"arrow-head\", \"--\"],\n\t\t[\"label\", \"\\\"asdasd\\\"\"],\n\t\t[\"arrow\", \"==>\"]\n\t]],\n\t\" C\"\n]\n"
  },
  {
    "path": "tests/languages/mermaid/operator_feature.test",
    "content": "A & B\n\n: :::\n\n----------------------------------------------------\n\n[\n\t\"A \", [\"operator\", \"&\"], \" B\\r\\n\\r\\n\",\n\n\t[\"operator\", \":\"], [\"operator\", \":::\"]\n]\n"
  },
  {
    "path": "tests/languages/metafont/boolean_feature.test",
    "content": "true false\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans."
  },
  {
    "path": "tests/languages/metafont/command_feature.test",
    "content": "addto\nbatchmode\ncharlist cull\ndisplay\nerrhelp errmessage errorstopmode everyjob extensible\nfontdimen\nheaderbyte\ninner interim\nlet ligtable\nmessage\nnewinternal nonstopmode numspecial\nopenwindow outer\nrandomseed\nsave scrollmode show showdependencies showstats showtoken showvariable shipout special\n\n----------------------------------------------------\n\n[\n\t[\"command\", \"addto\"],\n\n\t[\"command\", \"batchmode\"],\n\n\t[\"command\", \"charlist\"],\n\t[\"command\", \"cull\"],\n\n\t[\"command\", \"display\"],\n\n\t[\"command\", \"errhelp\"],\n\t[\"command\", \"errmessage\"],\n\t[\"command\", \"errorstopmode\"],\n\t[\"command\", \"everyjob\"],\n\t[\"command\", \"extensible\"],\n\n\t[\"command\", \"fontdimen\"],\n\n\t[\"command\", \"headerbyte\"],\n\n\t[\"command\", \"inner\"],\n\t[\"command\", \"interim\"],\n\n\t[\"command\", \"let\"],\n\t[\"command\", \"ligtable\"],\n\n\t[\"command\", \"message\"],\n\n\t[\"command\", \"newinternal\"],\n\t[\"command\", \"nonstopmode\"],\n\t[\"command\", \"numspecial\"],\n\n\t[\"command\", \"openwindow\"],\n\t[\"command\", \"outer\"],\n\n\t[\"command\", \"randomseed\"],\n\n\t[\"command\", \"save\"],\n\t[\"command\", \"scrollmode\"],\n\t[\"command\", \"show\"],\n\t[\"command\", \"showdependencies\"],\n\t[\"command\", \"showstats\"],\n\t[\"command\", \"showtoken\"],\n\t[\"command\", \"showvariable\"],\n\t[\"command\", \"shipout\"],\n\t[\"command\", \"special\"]\n]\n\n----------------------------------------------------\n\nChecks for commands."
  },
  {
    "path": "tests/languages/metafont/constant_feature.test",
    "content": "% Length constants\nbp cc cm dd in mm pc pt\n\n% Pair constants\ndown left origin right up\n\n% Numeric constants\neps epsilon infinity _ % _ is -1, as per Knuth: \"internal constant to make macros unreadable but shorter\"\n\n% Path constants\nfullcircle halfcircle quartercircle unitsquare\n\n% Pen constant\nnullpen penrazor penspeck pensquare penstroke\n\n% Picture constants\nblankpicture nullpicture unitpixel\n\n% String constant\nditto\n\n% Transform constant\nidentity\n\n% Other constants\nproof relax smoke \\ \\\\ ???\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"% Length constants\"],\n\n\t[\"constant\", \"bp\"],\n\t[\"constant\", \"cc\"],\n\t[\"constant\", \"cm\"],\n\t[\"constant\", \"dd\"],\n\t[\"constant\", \"in\"],\n\t[\"constant\", \"mm\"],\n\t[\"constant\", \"pc\"],\n\t[\"constant\", \"pt\"],\n\n\t[\"comment\", \"% Pair constants\"],\n\n\t[\"constant\", \"down\"],\n\t[\"constant\", \"left\"],\n\t[\"constant\", \"origin\"],\n\t[\"constant\", \"right\"],\n\t[\"constant\", \"up\"],\n\n\t[\"comment\", \"% Numeric constants\"],\n\n\t[\"constant\", \"eps\"],\n\t[\"constant\", \"epsilon\"],\n\t[\"constant\", \"infinity\"],\n\t[\"constant\", \"_\"],\n\t[\"comment\", \"% _ is -1, as per Knuth: \\\"internal constant to make macros unreadable but shorter\\\"\"],\n\n\t[\"comment\", \"% Path constants\"],\n\n\t[\"constant\", \"fullcircle\"],\n\t[\"constant\", \"halfcircle\"],\n\t[\"constant\", \"quartercircle\"],\n\t[\"constant\", \"unitsquare\"],\n\n\t[\"comment\", \"% Pen constant\"],\n\n\t[\"constant\", \"nullpen\"],\n\t[\"constant\", \"penrazor\"],\n\t[\"constant\", \"penspeck\"],\n\t[\"constant\", \"pensquare\"],\n\t[\"constant\", \"penstroke\"],\n\n\t[\"comment\", \"% Picture constants\"],\n\n\t[\"constant\", \"blankpicture\"],\n\t[\"constant\", \"nullpicture\"],\n\t[\"constant\", \"unitpixel\"],\n\n\t[\"comment\", \"% String constant\"],\n\t[\"constant\", \"ditto\"],\n\n\t[\"comment\", \"% Transform constant\"],\n\t[\"constant\", \"identity\"],\n\n\t[\"comment\", \"% Other constants\"],\n\n\t[\"constant\", \"proof\"],\n\t[\"constant\", \"relax\"],\n\t[\"constant\", \"smoke\"],\n\t[\"constant\", \"\\\\\"],\n\t[\"constant\", \"\\\\\\\\\"],\n\t[\"constant\", \"???\"]\n]\n\n----------------------------------------------------\n\nChecks for constants best not to be redefined."
  },
  {
    "path": "tests/languages/metafont/internal_quantity_feature.test",
    "content": "autorounding\nboundarychar\ncharcode chardp chardx chardy charext charht charic charwd\nday designsize\nfillin fontmaking\ngranularity\nhppp\nmonth\npausing proofing\nshowstopping smoothing\ntime tracingcapsules tracingchoices tracingcommands tracingedges tracingequations tracingmacros tracingonline tracingoutput tracingpens tracingrestores tracingspecs tracingstats tracingtitles turningcheck\nvppp\nwarningcheck\nxoffset\nyear yoffset\n\n% From PlainMETAFONT\nblacker currentwindow displaying join_radius o_correction pen_bot pen_lft pen_rt pen_top pixels_per_inch tolerance\n\n----------------------------------------------------\n\n[\n\t[\"quantity\", \"autorounding\"],\n\n\t[\"quantity\", \"boundarychar\"],\n\n\t[\"quantity\", \"charcode\"],\n\t[\"quantity\", \"chardp\"],\n\t[\"quantity\", \"chardx\"],\n\t[\"quantity\", \"chardy\"],\n\t[\"quantity\", \"charext\"],\n\t[\"quantity\", \"charht\"],\n\t[\"quantity\", \"charic\"],\n\t[\"quantity\", \"charwd\"],\n\n\t[\"quantity\", \"day\"],\n\t[\"quantity\", \"designsize\"],\n\n\t[\"quantity\", \"fillin\"],\n\t[\"quantity\", \"fontmaking\"],\n\n\t[\"quantity\", \"granularity\"],\n\n\t[\"quantity\", \"hppp\"],\n\n\t[\"quantity\", \"month\"],\n\n\t[\"quantity\", \"pausing\"],\n\t[\"quantity\", \"proofing\"],\n\n\t[\"quantity\", \"showstopping\"],\n\t[\"quantity\", \"smoothing\"],\n\n\t[\"quantity\", \"time\"],\n\t[\"quantity\", \"tracingcapsules\"],\n\t[\"quantity\", \"tracingchoices\"],\n\t[\"quantity\", \"tracingcommands\"],\n\t[\"quantity\", \"tracingedges\"],\n\t[\"quantity\", \"tracingequations\"],\n\t[\"quantity\", \"tracingmacros\"],\n\t[\"quantity\", \"tracingonline\"],\n\t[\"quantity\", \"tracingoutput\"],\n\t[\"quantity\", \"tracingpens\"],\n\t[\"quantity\", \"tracingrestores\"],\n\t[\"quantity\", \"tracingspecs\"],\n\t[\"quantity\", \"tracingstats\"],\n\t[\"quantity\", \"tracingtitles\"],\n\t[\"quantity\", \"turningcheck\"],\n\n\t[\"quantity\", \"vppp\"],\n\n\t[\"quantity\", \"warningcheck\"],\n\n\t[\"quantity\", \"xoffset\"],\n\n\t[\"quantity\", \"year\"],\n\t[\"quantity\", \"yoffset\"],\n\n\t[\"comment\", \"% From PlainMETAFONT\"],\n\n\t[\"quantity\", \"blacker\"],\n\t[\"quantity\", \"currentwindow\"],\n\t[\"quantity\", \"displaying\"],\n\t[\"quantity\", \"join_radius\"],\n\t[\"quantity\", \"o_correction\"],\n\t[\"quantity\", \"pen_bot\"],\n\t[\"quantity\", \"pen_lft\"],\n\t[\"quantity\", \"pen_rt\"],\n\t[\"quantity\", \"pen_top\"],\n\t[\"quantity\", \"pixels_per_inch\"],\n\t[\"quantity\", \"tolerance\"]\n]\n\n----------------------------------------------------\n\nChecks for internal quantities."
  },
  {
    "path": "tests/languages/metafont/keywords_feature.test",
    "content": "also at atleast\nbegingroup\ncharexists contour controls curl cycle\ndef delimiters doublepath dropping dump\nelse elseif end enddef endfor endgroup endinput exitif exitunless expandafter\nfi for forever forsuffixes from\nif input inwindow\nkeeping kern\nof\nprimarydef\nquote\nreadstring\nscaled scantokens secondarydef shifted skipto slanted step\ntension tertiarydef to transformed\nuntil\nvardef\nwithpen withweight\nxscaled\nyscaled\nzscaled\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"also\"],\n\t[\"keyword\", \"at\"],\n\t[\"keyword\", \"atleast\"],\n\n\t[\"keyword\", \"begingroup\"],\n\n\t[\"keyword\", \"charexists\"],\n\t[\"keyword\", \"contour\"],\n\t[\"keyword\", \"controls\"],\n\t[\"keyword\", \"curl\"],\n\t[\"keyword\", \"cycle\"],\n\n\t[\"keyword\", \"def\"],\n\t[\"keyword\", \"delimiters\"],\n\t[\"keyword\", \"doublepath\"],\n\t[\"keyword\", \"dropping\"],\n\t[\"keyword\", \"dump\"],\n\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"elseif\"],\n\t[\"keyword\", \"end\"],\n\t[\"keyword\", \"enddef\"],\n\t[\"keyword\", \"endfor\"],\n\t[\"keyword\", \"endgroup\"],\n\t[\"keyword\", \"endinput\"],\n\t[\"keyword\", \"exitif\"],\n\t[\"keyword\", \"exitunless\"],\n\t[\"keyword\", \"expandafter\"],\n\n\t[\"keyword\", \"fi\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"forever\"],\n\t[\"keyword\", \"forsuffixes\"],\n\t[\"keyword\", \"from\"],\n\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"input\"],\n\t[\"keyword\", \"inwindow\"],\n\n\t[\"keyword\", \"keeping\"],\n\t[\"keyword\", \"kern\"],\n\n\t[\"keyword\", \"of\"],\n\n\t[\"keyword\", \"primarydef\"],\n\n\t[\"keyword\", \"quote\"],\n\n\t[\"keyword\", \"readstring\"],\n\n\t[\"keyword\", \"scaled\"],\n\t[\"keyword\", \"scantokens\"],\n\t[\"keyword\", \"secondarydef\"],\n\t[\"keyword\", \"shifted\"],\n\t[\"keyword\", \"skipto\"],\n\t[\"keyword\", \"slanted\"],\n\t[\"keyword\", \"step\"],\n\n\t[\"keyword\", \"tension\"],\n\t[\"keyword\", \"tertiarydef\"],\n\t[\"keyword\", \"to\"],\n\t[\"keyword\", \"transformed\"],\n\n\t[\"keyword\", \"until\"],\n\n\t[\"keyword\", \"vardef\"],\n\n\t[\"keyword\", \"withpen\"],\n\t[\"keyword\", \"withweight\"],\n\n\t[\"keyword\", \"xscaled\"],\n\n\t[\"keyword\", \"yscaled\"],\n\n\t[\"keyword\", \"zscaled\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords."
  },
  {
    "path": "tests/languages/metafont/macro_feature.test",
    "content": "beginchar cullit decr define_pixels div draw downto endchar fill flex incr max min mod mode_setup penlabels penpos shipit showit upto\n\n----------------------------------------------------\n\n[\n\t[\"macro\", \"beginchar\"],\n\t[\"macro\", \"cullit\"],\n\t[\"macro\", \"decr\"],\n\t[\"macro\", \"define_pixels\"],\n\t[\"macro\", \"div\"],\n\t[\"macro\", \"draw\"],\n\t[\"macro\", \"downto\"],\n\t[\"macro\", \"endchar\"],\n\t[\"macro\", \"fill\"],\n\t[\"macro\", \"flex\"],\n\t[\"macro\", \"incr\"],\n\t[\"macro\", \"max\"],\n\t[\"macro\", \"min\"],\n\t[\"macro\", \"mod\"],\n\t[\"macro\", \"mode_setup\"],\n\t[\"macro\", \"penlabels\"],\n\t[\"macro\", \"penpos\"],\n\t[\"macro\", \"shipit\"],\n\t[\"macro\", \"showit\"],\n\t[\"macro\", \"upto\"]\n]\n\n----------------------------------------------------\n\nChecks for a few important macros."
  },
  {
    "path": "tests/languages/metafont/number_feature.test",
    "content": "42\n3.14\n.34\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"42\"],\n\t[\"number\", \"3.14\"],\n\t[\"number\", \".34\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers."
  },
  {
    "path": "tests/languages/metafont/operator_feature.test",
    "content": ": :=\n\n% Boolean operators\nand or not <>\n\n% Numeric operators\n< <= >= > = <>\n* ** / + - ++ +-+\n\n% Path operators\n& .. ... -- ---\n\n% String operators\n& < <= >= > = <>\n\n% Ligature operators\n=: :: |=: |=:> =:| =:|> |=:| |=:|> |=:|>> ||:\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \":\"],\n\t[\"operator\", \":=\"],\n\n\t[\"comment\", \"% Boolean operators\"],\n\n\t[\"operator\", \"and\"],\n\t[\"operator\", \"or\"],\n\t[\"operator\", \"not\"],\n\t[\"operator\", \"<>\"],\n\n\t[\"comment\", \"% Numeric operators\"],\n\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"<>\"],\n\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"**\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"++\"],\n\t[\"operator\", \"+-+\"],\n\n\t[\"comment\", \"% Path operators\"],\n\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"..\"],\n\t[\"operator\", \"...\"],\n\t[\"operator\", \"--\"],\n\t[\"operator\", \"---\"],\n\n\t[\"comment\", \"% String operators\"],\n\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"<>\"],\n\n\t[\"comment\", \"% Ligature operators\"],\n\n\t[\"operator\", \"=:\"],\n\t[\"operator\", \"::\"],\n\t[\"operator\", \"|=:\"],\n\t[\"operator\", \"|=:>\"],\n\t[\"operator\", \"=:|\"],\n\t[\"operator\", \"=:|>\"],\n\t[\"operator\", \"|=:|\"],\n\t[\"operator\", \"|=:|>\"],\n\t[\"operator\", \"|=:|>>\"],\n\t[\"operator\", \"||:\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/metafont/ponctuation_feature.test",
    "content": "{ }\n\n% Loners\n,;()\n[]\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\n\n\t[\"comment\", \"% Loners\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation and delimiters."
  },
  {
    "path": "tests/languages/metafont/primitive_feature.test",
    "content": "ASCII\nangle\nchar cosd\ndecimal directiontime\nfloor\nhex\nintersectiontimes\njobname\nknown\nlength\nmakepath makepen mexp mlog\nnormaldeviate\noct odd\npencircle penoffset point postcontrol precontrol\nreverse rotated\nsind sqrt str subpath substring\ntotalweight turningnumber\nuniformdeviate unknown\nxpart xxpart xypart\nypart yxpart yypart\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"ASCII\"],\n\t[\"builtin\", \"angle\"],\n\t[\"builtin\", \"char\"],\n\t[\"builtin\", \"cosd\"],\n\t[\"builtin\", \"decimal\"],\n\t[\"builtin\", \"directiontime\"],\n\t[\"builtin\", \"floor\"],\n\t[\"builtin\", \"hex\"],\n\t[\"builtin\", \"intersectiontimes\"],\n\t[\"builtin\", \"jobname\"],\n\t[\"builtin\", \"known\"],\n\t[\"builtin\", \"length\"],\n\t[\"builtin\", \"makepath\"],\n\t[\"builtin\", \"makepen\"],\n\t[\"builtin\", \"mexp\"],\n\t[\"builtin\", \"mlog\"],\n\t[\"builtin\", \"normaldeviate\"],\n\t[\"builtin\", \"oct\"],\n\t[\"builtin\", \"odd\"],\n\t[\"builtin\", \"pencircle\"],\n\t[\"builtin\", \"penoffset\"],\n\t[\"builtin\", \"point\"],\n\t[\"builtin\", \"postcontrol\"],\n\t[\"builtin\", \"precontrol\"],\n\t[\"builtin\", \"reverse\"],\n\t[\"builtin\", \"rotated\"],\n\t[\"builtin\", \"sind\"],\n\t[\"builtin\", \"sqrt\"],\n\t[\"builtin\", \"str\"],\n\t[\"builtin\", \"subpath\"],\n\t[\"builtin\", \"substring\"],\n\t[\"builtin\", \"totalweight\"],\n\t[\"builtin\", \"turningnumber\"],\n\t[\"builtin\", \"uniformdeviate\"],\n\t[\"builtin\", \"unknown\"],\n\t[\"builtin\", \"xpart\"],\n\t[\"builtin\", \"xxpart\"],\n\t[\"builtin\", \"xypart\"],\n\t[\"builtin\", \"ypart\"],\n\t[\"builtin\", \"yxpart\"],\n\t[\"builtin\", \"yypart\"]\n]\n\n----------------------------------------------------\n\nChecks for primitive METAFONT operations."
  },
  {
    "path": "tests/languages/metafont/string_and_comment_feature.test",
    "content": "%\n% comment\n\"\"\n\"string\"\n\"text%noncomment\"\n%\"not string\"\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"%\"],\n\t[\"comment\", \"% comment\"],\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"string\\\"\"],\n\t[\"string\", \"\\\"text%noncomment\\\"\"],\n\t[\"comment\", \"%\\\"not string\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings and comments without mangling."
  },
  {
    "path": "tests/languages/metafont/type_feature.test",
    "content": "% Variable type\nboolean\nnumeric\npair\npath\npen\npicture\nstring\ntransform\n\n% Argument type\nexpr\nprimary\nsecondary\nsuffix\ntertiary\ntext\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"% Variable type\"],\n\t[\"type\", \"boolean\"],\n\t[\"type\", \"numeric\"],\n\t[\"type\", \"pair\"],\n\t[\"type\", \"path\"],\n\t[\"type\", \"pen\"],\n\t[\"type\", \"picture\"],\n\t[\"type\", \"string\"],\n\t[\"type\", \"transform\"],\n\n\t[\"comment\", \"% Argument type\"],\n\t[\"type\", \"expr\"],\n\t[\"type\", \"primary\"],\n\t[\"type\", \"secondary\"],\n\t[\"type\", \"suffix\"],\n\t[\"type\", \"tertiary\"],\n\t[\"type\", \"text\"]\n]\n\n----------------------------------------------------\n\nChecks for typing keywords."
  },
  {
    "path": "tests/languages/metafont/variable_feature.test",
    "content": "% Special variables\n#@ @ @#\nwhatever\n\n% Chardimen variables\nd h w\n\n% Position variables\nx y z\n\n% Output variables\naspect_ratio localfont mag mode screen_cols screen_rows\n\n% Other variables\ncurrentpen currentpicture currenttransform\nextra_beginchar extra_endchar extra_setup\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"% Special variables\"],\n\t[\"variable\", \"#@\"], [\"variable\", \"@\"], [\"variable\", \"@#\"],\n\t[\"variable\", \"whatever\"],\n\n\t[\"comment\", \"% Chardimen variables\"],\n\t[\"variable\", \"d\"], [\"variable\", \"h\"], [\"variable\", \"w\"],\n\n\t[\"comment\", \"% Position variables\"],\n\t[\"variable\", \"x\"], [\"variable\", \"y\"], [\"variable\", \"z\"],\n\n\t[\"comment\", \"% Output variables\"],\n\n\t[\"variable\", \"aspect_ratio\"],\n\t[\"variable\", \"localfont\"],\n\t[\"variable\", \"mag\"],\n\t[\"variable\", \"mode\"],\n\t[\"variable\", \"screen_cols\"],\n\t[\"variable\", \"screen_rows\"],\n\n\t[\"comment\", \"% Other variables\"],\n\n\t[\"variable\", \"currentpen\"],\n\t[\"variable\", \"currentpicture\"],\n\t[\"variable\", \"currenttransform\"],\n\n\t[\"variable\", \"extra_beginchar\"],\n\t[\"variable\", \"extra_endchar\"],\n\t[\"variable\", \"extra_setup\"]\n]\n\n----------------------------------------------------\n\nChecks for important variables."
  },
  {
    "path": "tests/languages/mizar/comment_feature.test",
    "content": ":: Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \":: Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/mizar/keyword_feature.test",
    "content": "@proof\r\naccording\r\naggregate\r\nall\r\nand\r\nantonym\r\nare\r\nas\r\nassociativity\r\nassume\r\nasymmetry\r\nattr\r\nbe\r\nbegin\r\nbeing\r\nby\r\ncanceled\r\ncase\r\ncases\r\ncluster\r\nclusters\r\ncoherence\r\ncommutativity\r\ncompatibility\r\nconnectedness\r\nconsider\r\nconsistency\r\nconstructors\r\ncontradiction\r\ncorrectness\r\ndef\r\ndeffunc\r\ndefine\r\ndefinition\r\ndefinitions\r\ndefpred\r\ndo\r\ndoes\r\nequals\r\nend\r\nenviron\r\nex\r\nexactly\r\nexistence\r\nfor\r\nfrom\r\nfunc\r\ngiven\r\nhence\r\nhereby\r\nholds\r\nidempotence\r\nidentity\r\nif\r\niff\r\nimplies\r\ninvolutiveness\r\nirreflexivity\r\nis\r\nit\r\nlet\r\nmeans\r\nmode\r\nnon\r\nnot\r\nnotation\r\nnotations\r\nnow\r\nof\r\nor\r\notherwise\r\nover\r\nper\r\npred\r\nprefix\r\nprojectivity\r\nproof\r\nprovided\r\nqua\r\nreconsider\r\nredefine\r\nreduce\r\nreducibility\r\nreflexivity\r\nregistration\r\nregistrations\r\nrequirements\r\nreserve\r\nsch\r\nscheme\r\nschemes\r\nsection\r\nselector\r\nset\r\nsethood\r\nst\r\nstruct\r\nsuch\r\nsuppose\r\nsymmetry\r\nsynonym\r\ntake\r\nthat\r\nthe\r\nthen\r\ntheorem\r\ntheorems\r\nthesis\r\nthus\r\nto\r\ntransitivity\r\nuniqueness\r\nvocabulary\r\nvocabularies\r\nwhen\r\nwhere\r\nwith\r\nwrt\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"@proof\"],\r\n\t[\"keyword\", \"according\"],\r\n\t[\"keyword\", \"aggregate\"],\r\n\t[\"keyword\", \"all\"],\r\n\t[\"keyword\", \"and\"],\r\n\t[\"keyword\", \"antonym\"],\r\n\t[\"keyword\", \"are\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"associativity\"],\r\n\t[\"keyword\", \"assume\"],\r\n\t[\"keyword\", \"asymmetry\"],\r\n\t[\"keyword\", \"attr\"],\r\n\t[\"keyword\", \"be\"],\r\n\t[\"keyword\", \"begin\"],\r\n\t[\"keyword\", \"being\"],\r\n\t[\"keyword\", \"by\"],\r\n\t[\"keyword\", \"canceled\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"cases\"],\r\n\t[\"keyword\", \"cluster\"],\r\n\t[\"keyword\", \"clusters\"],\r\n\t[\"keyword\", \"coherence\"],\r\n\t[\"keyword\", \"commutativity\"],\r\n\t[\"keyword\", \"compatibility\"],\r\n\t[\"keyword\", \"connectedness\"],\r\n\t[\"keyword\", \"consider\"],\r\n\t[\"keyword\", \"consistency\"],\r\n\t[\"keyword\", \"constructors\"],\r\n\t[\"keyword\", \"contradiction\"],\r\n\t[\"keyword\", \"correctness\"],\r\n\t[\"keyword\", \"def\"],\r\n\t[\"keyword\", \"deffunc\"],\r\n\t[\"keyword\", \"define\"],\r\n\t[\"keyword\", \"definition\"],\r\n\t[\"keyword\", \"definitions\"],\r\n\t[\"keyword\", \"defpred\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"does\"],\r\n\t[\"keyword\", \"equals\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"environ\"],\r\n\t[\"keyword\", \"ex\"],\r\n\t[\"keyword\", \"exactly\"],\r\n\t[\"keyword\", \"existence\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"keyword\", \"func\"],\r\n\t[\"keyword\", \"given\"],\r\n\t[\"keyword\", \"hence\"],\r\n\t[\"keyword\", \"hereby\"],\r\n\t[\"keyword\", \"holds\"],\r\n\t[\"keyword\", \"idempotence\"],\r\n\t[\"keyword\", \"identity\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"iff\"],\r\n\t[\"keyword\", \"implies\"],\r\n\t[\"keyword\", \"involutiveness\"],\r\n\t[\"keyword\", \"irreflexivity\"],\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"it\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"means\"],\r\n\t[\"keyword\", \"mode\"],\r\n\t[\"keyword\", \"non\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"notation\"],\r\n\t[\"keyword\", \"notations\"],\r\n\t[\"keyword\", \"now\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"otherwise\"],\r\n\t[\"keyword\", \"over\"],\r\n\t[\"keyword\", \"per\"],\r\n\t[\"keyword\", \"pred\"],\r\n\t[\"keyword\", \"prefix\"],\r\n\t[\"keyword\", \"projectivity\"],\r\n\t[\"keyword\", \"proof\"],\r\n\t[\"keyword\", \"provided\"],\r\n\t[\"keyword\", \"qua\"],\r\n\t[\"keyword\", \"reconsider\"],\r\n\t[\"keyword\", \"redefine\"],\r\n\t[\"keyword\", \"reduce\"],\r\n\t[\"keyword\", \"reducibility\"],\r\n\t[\"keyword\", \"reflexivity\"],\r\n\t[\"keyword\", \"registration\"],\r\n\t[\"keyword\", \"registrations\"],\r\n\t[\"keyword\", \"requirements\"],\r\n\t[\"keyword\", \"reserve\"],\r\n\t[\"keyword\", \"sch\"],\r\n\t[\"keyword\", \"scheme\"],\r\n\t[\"keyword\", \"schemes\"],\r\n\t[\"keyword\", \"section\"],\r\n\t[\"keyword\", \"selector\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"keyword\", \"sethood\"],\r\n\t[\"keyword\", \"st\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"such\"],\r\n\t[\"keyword\", \"suppose\"],\r\n\t[\"keyword\", \"symmetry\"],\r\n\t[\"keyword\", \"synonym\"],\r\n\t[\"keyword\", \"take\"],\r\n\t[\"keyword\", \"that\"],\r\n\t[\"keyword\", \"the\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"theorem\"],\r\n\t[\"keyword\", \"theorems\"],\r\n\t[\"keyword\", \"thesis\"],\r\n\t[\"keyword\", \"thus\"],\r\n\t[\"keyword\", \"to\"],\r\n\t[\"keyword\", \"transitivity\"],\r\n\t[\"keyword\", \"uniqueness\"],\r\n\t[\"keyword\", \"vocabulary\"],\r\n\t[\"keyword\", \"vocabularies\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"where\"],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"keyword\", \"wrt\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/mizar/number_feature.test",
    "content": "0\r\n-2\r\n42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"-2\"],\r\n\t[\"number\", \"42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/mizar/operator_feature.test",
    "content": "...\r\n->\r\n&\r\n= .=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"...\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \".=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/mizar/parameter_feature.test",
    "content": "$1 $2 $3\r\n$4 $5 $6\r\n$6 $7 $9\r\n$10\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"parameter\", \"$1\"], [\"parameter\", \"$2\"], [\"parameter\", \"$3\"],\r\n\t[\"parameter\", \"$4\"], [\"parameter\", \"$5\"], [\"parameter\", \"$6\"],\r\n\t[\"parameter\", \"$6\"], [\"parameter\", \"$7\"], [\"parameter\", \"$9\"],\r\n\t[\"parameter\", \"$10\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for parameters."
  },
  {
    "path": "tests/languages/mizar/variable_feature.test",
    "content": "P:\r\nCQC_THE1:\r\nPRE_FF:\r\nNAT_1:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"P\"], [\"punctuation\", \":\"],\r\n\t[\"variable\", \"CQC_THE1\"], [\"punctuation\", \":\"],\r\n\t[\"variable\", \"PRE_FF\"], [\"punctuation\", \":\"],\r\n\t[\"variable\", \"NAT_1\"], [\"punctuation\", \":\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/mongodb/document_feature.test",
    "content": "{\n\t'_id': ObjectId('5ec72ffe00316be87cab3927'),\n\t'code': Code('function () { return 22; }'),\n\t'binary': BinData(1, '232sa3d323sd232a32sda3s2d3a2s1d23s21d3sa'),\n\t'dbref': DBRef('namespace', ObjectId('5ec72f4200316be87cab3926'), 'db'),\n\t'timestamp': Timestamp(0, 0),\n\t'long': NumberLong(9223372036854775807),\n\t'decimal': NumberDecimal('1000.55'),\n\t'integer': 100,\n\t'maxkey': MaxKey(),\n\t'minkey': MinKey(),\n\t'isodate': ISODate('2012-01-01T00:00:00.000Z'),\n\t'regexp': RegExp('prism(js)?', 'i'),\n\t'string': 'Hello World',\n\t'numberArray': [1, 2, 3],\n\t'stringArray': ['1','2','3'],\n\t'randomKey': null,\n\t'object': { 'a': 1, 'b': 2 },\n\t'max_key2': MaxKey(),\n\t'number': 1234,\n\t'invalid-key': 123,\n\tnoQuotesKey: 'value',\n}\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\n\t[\"string-property\", \"'_id'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"ObjectId\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", [\"'5ec72ffe00316be87cab3927'\"]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'code'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"Code\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", [\"'function () { return 22; }'\"]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'binary'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"BinData\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'232sa3d323sd232a32sda3s2d3a2s1d23s21d3sa'\"]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'dbref'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"DBRef\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", [\"'namespace'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"builtin\", \"ObjectId\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", [\"'5ec72f4200316be87cab3926'\"]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'db'\"]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'timestamp'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"Timestamp\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'long'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"NumberLong\"],\n\t[\"punctuation\", \"(\"],\n\t[\"number\", \"9223372036854775807\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'decimal'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"NumberDecimal\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", [\"'1000.55'\"]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'integer'\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"100\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'maxkey'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"MaxKey\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'minkey'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"MinKey\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'isodate'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"ISODate\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", [\"'2012-01-01T00:00:00.000Z'\"]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'regexp'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"RegExp\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", [\"'prism(js)?'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'i'\"]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'string'\"],\n\t[\"operator\", \":\"],\n\t[\"string\", [\"'Hello World'\"]],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'numberArray'\"],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"3\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'stringArray'\"],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"[\"],\n\t[\"string\", [\"'1'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'2'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'3'\"]],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'randomKey'\"],\n\t[\"operator\", \":\"],\n\t[\"keyword\", \"null\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'object'\"],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"string-property\", \"'a'\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \",\"],\n\t[\"string-property\", \"'b'\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'max_key2'\"],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"MaxKey\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'number'\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"1234\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string-property\", \"'invalid-key'\"],\n\t[\"operator\", \":\"],\n\t[\"number\", \"123\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"property\", [\"noQuotesKey\"]],\n\t[\"operator\", \":\"],\n\t[\"string\", [\"'value'\"]],\n\t[\"punctuation\", \",\"],\n\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nCommon document.\n"
  },
  {
    "path": "tests/languages/mongodb/functions_feature.test",
    "content": "ObjectId()\nObjectId ()\nCode()\nBinData()\nDBRef()\nTimestamp()\nNumberLong()\nNumberDecimal()\nMaxKey()\nMinKey()\nRegExp()\nISODate()\nUUID()\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"ObjectId\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"ObjectId\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"Code\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"BinData\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"DBRef\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"Timestamp\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"NumberLong\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"NumberDecimal\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"MaxKey\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"MinKey\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"RegExp\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"ISODate\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"UUID\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for built-in functions.\n"
  },
  {
    "path": "tests/languages/mongodb/operations_feature.test",
    "content": "{\n\t$eq: {},\n\t$gt: {},\n\t$gte: {},\n\t$in: {},\n\t$lt: {},\n\t$lte: {},\n\t$ne: {},\n\t$nin: {},\n\t$and: {},\n\t$not: {},\n\t$nor: {},\n\t$or: {},\n\t$exists: {},\n\t$type: {},\n\t$expr: {},\n\t$jsonSchema: {},\n\t$mod: {},\n\t$regex: {},\n\t$text: {},\n\t$where: {},\n\t$geoIntersects: {},\n\t$geoWithin: {},\n\t$near: {},\n\t$nearSphere: {},\n\t$all: {},\n\t$elemMatch: {},\n\t$size: {},\n\t$bitsAllClear: {},\n\t$bitsAllSet: {},\n\t$bitsAnyClear: {},\n\t$bitsAnySet: {},\n\t$comment: {},\n\t$elemMatch: {},\n\t$meta: {},\n\t$slice: {},\n\t$currentDate: {},\n\t$inc: {},\n\t$min: {},\n\t$max: {},\n\t$mul: {},\n\t$rename: {},\n\t$set: {},\n\t$setOnInsert: {},\n\t$unset: {},\n\t$addToSet: {},\n\t$pop: {},\n\t$pull: {},\n\t$push: {},\n\t$pullAll: {},\n\t$each: {},\n\t$position: {},\n\t$slice: {},\n\t$sort: {},\n\t$bit: {},\n\t$addFields: {},\n\t$bucket: {},\n\t$bucketAuto: {},\n\t$collStats: {},\n\t$count: {},\n\t$currentOp: {},\n\t$facet: {},\n\t$geoNear: {},\n\t$graphLookup: {},\n\t$group: {},\n\t$indexStats: {},\n\t$limit: {},\n\t$listLocalSessions: {},\n\t$listSessions: {},\n\t$lookup: {},\n\t$match: {},\n\t$merge: {},\n\t$out: {},\n\t$planCacheStats: {},\n\t$project: {},\n\t$redact: {},\n\t$replaceRoot: {},\n\t$replaceWith: {},\n\t$sample: {},\n\t$set: {},\n\t$skip: {},\n\t$sort: {},\n\t$sortByCount: {},\n\t$unionWith: {},\n\t$unset: {},\n\t$unwind: {},\n\t$abs: {},\n\t$accumulator: {},\n\t$acos: {},\n\t$acosh: {},\n\t$add: {},\n\t$addToSet: {},\n\t$allElementsTrue: {},\n\t$and: {},\n\t$anyElementTrue: {},\n\t$arrayElemAt: {},\n\t$arrayToObject: {},\n\t$asin: {},\n\t$asinh: {},\n\t$atan: {},\n\t$atan2: {},\n\t$atanh: {},\n\t$avg: {},\n\t$binarySize: {},\n\t$bsonSize: {},\n\t$ceil: {},\n\t$cmp: {},\n\t$concat: {},\n\t$concatArrays: {},\n\t$cond: {},\n\t$convert: {},\n\t$cos: {},\n\t$dateFromParts: {},\n\t$dateToParts: {},\n\t$dateFromString: {},\n\t$dateToString: {},\n\t$dayOfMonth: {},\n\t$dayOfWeek: {},\n\t$dayOfYear: {},\n\t$degreesToRadians: {},\n\t$divide: {},\n\t$eq: {},\n\t$exp: {},\n\t$filter: {},\n\t$first: {},\n\t$floor: {},\n\t$function: {},\n\t$gt: {},\n\t$gte: {},\n\t$hour: {},\n\t$ifNull: {},\n\t$in: {},\n\t$indexOfArray: {},\n\t$indexOfBytes: {},\n\t$indexOfCP: {},\n\t$isArray: {},\n\t$isNumber: {},\n\t$isoDayOfWeek: {},\n\t$isoWeek: {},\n\t$isoWeekYear: {},\n\t$last: {},\n\t$last: {},\n\t$let: {},\n\t$literal: {},\n\t$ln: {},\n\t$log: {},\n\t$log10: {},\n\t$lt: {},\n\t$lte: {},\n\t$ltrim: {},\n\t$map: {},\n\t$max: {},\n\t$mergeObjects: {},\n\t$meta: {},\n\t$min: {},\n\t$millisecond: {},\n\t$minute: {},\n\t$mod: {},\n\t$month: {},\n\t$multiply: {},\n\t$ne: {},\n\t$not: {},\n\t$objectToArray: {},\n\t$or: {},\n\t$pow: {},\n\t$push: {},\n\t$radiansToDegrees: {},\n\t$range: {},\n\t$reduce: {},\n\t$regexFind: {},\n\t$regexFindAll: {},\n\t$regexMatch: {},\n\t$replaceOne: {},\n\t$replaceAll: {},\n\t$reverseArray: {},\n\t$round: {},\n\t$rtrim: {},\n\t$second: {},\n\t$setDifference: {},\n\t$setEquals: {},\n\t$setIntersection: {},\n\t$setIsSubset: {},\n\t$setUnion: {},\n\t$size: {},\n\t$sin: {},\n\t$slice: {},\n\t$split: {},\n\t$sqrt: {},\n\t$stdDevPop: {},\n\t$stdDevSamp: {},\n\t$strcasecmp: {},\n\t$strLenBytes: {},\n\t$strLenCP: {},\n\t$substr: {},\n\t$substrBytes: {},\n\t$substrCP: {},\n\t$subtract: {},\n\t$sum: {},\n\t$switch: {},\n\t$tan: {},\n\t$toBool: {},\n\t$toDate: {},\n\t$toDecimal: {},\n\t$toDouble: {},\n\t$toInt: {},\n\t$toLong: {},\n\t$toObjectId: {},\n\t$toString: {},\n\t$toLower: {},\n\t$toUpper: {},\n\t$trim: {},\n\t$trunc: {},\n\t$type: {},\n\t$week: {},\n\t$year: {},\n\t$zip: {},\n\t$comment: {},\n\t$explain: {},\n\t$hint: {},\n\t$max: {},\n\t$maxTimeMS: {},\n\t$min: {},\n\t$orderby: {},\n\t$query: {},\n\t$returnKey: {},\n\t$showDiskLoc: {},\n\t$natural: {},\n}\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$eq\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$gt\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$gte\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$in\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$lt\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$lte\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$ne\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$nin\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$and\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$not\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$nor\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$or\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$exists\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$type\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$expr\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$jsonSchema\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$mod\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$regex\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$text\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$where\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$geoIntersects\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$geoWithin\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$near\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$nearSphere\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$all\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$elemMatch\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$size\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$bitsAllClear\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$bitsAllSet\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$bitsAnyClear\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$bitsAnySet\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$comment\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$elemMatch\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$meta\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$slice\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$currentDate\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$inc\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$min\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$max\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$mul\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$rename\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$set\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$setOnInsert\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$unset\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$addToSet\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$pop\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$pull\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$push\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$pullAll\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$each\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$position\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$slice\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$sort\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$bit\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$addFields\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$bucket\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$bucketAuto\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$collStats\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$count\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$currentOp\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$facet\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$geoNear\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$graphLookup\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$group\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$indexStats\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$limit\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$listLocalSessions\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$listSessions\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$lookup\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$match\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$merge\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$out\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$planCacheStats\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$project\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$redact\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$replaceRoot\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$replaceWith\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$sample\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$set\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$skip\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$sort\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$sortByCount\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$unionWith\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$unset\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$unwind\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$abs\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$accumulator\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$acos\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$acosh\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$add\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$addToSet\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$allElementsTrue\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$and\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$anyElementTrue\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$arrayElemAt\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$arrayToObject\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$asin\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$asinh\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$atan\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$atan2\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$atanh\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$avg\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$binarySize\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$bsonSize\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$ceil\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$cmp\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$concat\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$concatArrays\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$cond\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$convert\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$cos\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$dateFromParts\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$dateToParts\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$dateFromString\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$dateToString\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$dayOfMonth\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$dayOfWeek\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$dayOfYear\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$degreesToRadians\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$divide\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$eq\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$exp\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$filter\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$first\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$floor\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$function\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$gt\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$gte\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$hour\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$ifNull\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$in\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$indexOfArray\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$indexOfBytes\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$indexOfCP\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$isArray\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$isNumber\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$isoDayOfWeek\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$isoWeek\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$isoWeekYear\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$last\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$last\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$let\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$literal\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$ln\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$log\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$log10\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$lt\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$lte\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$ltrim\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$map\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$max\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$mergeObjects\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$meta\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$min\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$millisecond\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$minute\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$mod\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$month\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$multiply\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$ne\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$not\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$objectToArray\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$or\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$pow\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$push\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$radiansToDegrees\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$range\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$reduce\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$regexFind\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$regexFindAll\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$regexMatch\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$replaceOne\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$replaceAll\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$reverseArray\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$round\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$rtrim\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$second\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$setDifference\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$setEquals\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$setIntersection\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$setIsSubset\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$setUnion\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$size\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$sin\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$slice\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$split\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$sqrt\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$stdDevPop\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$stdDevSamp\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$strcasecmp\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$strLenBytes\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$strLenCP\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$substr\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$substrBytes\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$substrCP\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$subtract\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$sum\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$switch\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$tan\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$toBool\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$toDate\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$toDecimal\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$toDouble\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$toInt\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$toLong\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$toObjectId\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$toString\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$toLower\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$toUpper\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$trim\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$trunc\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$type\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$week\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$year\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$zip\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$comment\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$explain\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$hint\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$max\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$maxTimeMS\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$min\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$orderby\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$query\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$returnKey\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$showDiskLoc\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$natural\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \"}\"]\n]\n\n\n\n----------------------------------------------------\n\nChecks for operations.\n"
  },
  {
    "path": "tests/languages/mongodb/query_feature.test",
    "content": "db.users.find({\n\t_id: { $nin: ObjectId('5ec72ffe00316be87cab3927') },\n\tage: { $gte: 18, $lte: 99 },\n\tfield: { $exists: true }\n})\n\n----------------------------------------------------\n\n[\n\t\"db\",\n\t[\"punctuation\", \".\"],\n\t\"users\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"find\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \"{\"],\n\t[\"property\", [\n\t\t\"_id\"\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$nin\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"ObjectId\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", [\n\t\t\"'5ec72ffe00316be87cab3927'\"\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t\"age\"\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$gte\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"number\", \"18\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$lte\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"number\", \"99\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t\"field\"\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$exists\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"boolean\", \"true\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \")\"]\n]\n\n\n\n----------------------------------------------------\n\nCommon query.\n"
  },
  {
    "path": "tests/languages/mongodb/string_url_and_ip_feature.test",
    "content": "{\n\tfield1: 'Here is url: http://prismjs.com/'\n\tfield2: 'Here is ip: 192.168.0.1'\n}\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\t[\"property\", [\n\t\t\"field1\"\n\t]],\n\t[\"operator\", \":\"],\n\t[\"string\", [\n\t\t\"'Here is url: \",\n\t\t[\"url\", \"http://prismjs.com/\"],\n\t\t\"'\"\n\t]],\n\t[\"property\", [\n\t\t\"field2\"\n\t]],\n\t[\"operator\", \":\"],\n\t[\"string\", [\n\t\t\"'Here is ip: \",\n\t\t[\"entity\", \"192.168.0.1\"],\n\t\t\"'\"\n\t]],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for URL and IP highlighting inside string.\n"
  },
  {
    "path": "tests/languages/mongodb/update_feature.test",
    "content": "db.users.updateOne(\n\t{\n\t\t_id: ObjectId('5ec72ffe00316be87cab3927')\n\t},\n\t{\n\t\t$set: { age: 30 },\n\t\t$inc: { updateCount: 1 }, \n\t\t$push: { updateDates: new Date() } \n\t}\n)\n\n----------------------------------------------------\n\n[\n\t\"db\",\n\t[\"punctuation\", \".\"],\n\t\"users\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"updateOne\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \"{\"],\n\t[\"property\", [\n\t\t\"_id\"\n\t]],\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"ObjectId\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", [\n\t\t\"'5ec72ffe00316be87cab3927'\"\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \"{\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$set\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"property\", [\n\t\t\"age\"\n\t]],\n\t[\"operator\", \":\"],\n\t[\"number\", \"30\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$inc\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"property\", [\n\t\t\"updateCount\"\n\t]],\n\t[\"operator\", \":\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"property\", [\n\t\t[\"keyword\", \"$push\"]\n\t]],\n\t[\"operator\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"property\", [\n\t\t\"updateDates\"\n\t]],\n\t[\"operator\", \":\"],\n\t[\"keyword\", \"new\"],\n\t[\"class-name\", [\n\t\t\"Date\"\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nCommon update.\n"
  },
  {
    "path": "tests/languages/monkey/comment_feature.test",
    "content": "' Foobar\r\n#Rem Foo\r\nBar 'Baz\r\n#End\r\n' This \"is\" a comment\r\n#Rem\r\nThis \"is\" a comment\r\n#End\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"' Foobar\"],\r\n\t[\"comment\", \"#Rem Foo\\r\\nBar 'Baz\\r\\n#End\"],\r\n\t[\"comment\", \"' This \\\"is\\\" a comment\"],\r\n\t[\"comment\", \"#Rem\\r\\nThis \\\"is\\\" a comment\\r\\n#End\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/monkey/function_feature.test",
    "content": "foobar()\r\nFoo_Bar_42()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foobar\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"Foo_Bar_42\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/monkey/keyword_feature.test",
    "content": "Void\r\nStrict\r\nPublic\r\nPrivate\r\nProperty\r\nBool\r\nInt\r\nFloat\r\nString\r\nArray\r\nObject\r\nContinue\r\nExit\r\nImport\r\nExtern\r\nNew\r\nSelf\r\nSuper\r\nTry\r\nCatch\r\nEachin\r\nTrue\r\nFalse\r\nExtends\r\nAbstract\r\nFinal\r\nSelect\r\nCase\r\nDefault\r\nConst\r\nLocal\r\nGlobal\r\nField\r\nMethod\r\nFunction\r\nClass\r\nEnd\r\nIf\r\nThen\r\nElse\r\nElseIf\r\nEndIf\r\nWhile\r\nWend\r\nRepeat\r\nUntil\r\nForever\r\nFor\r\nTo\r\nStep\r\nNext\r\nReturn\r\nModule\r\nInterface\r\nImplements\r\nInline\r\nThrow\r\nNull\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"Void\"],\r\n\t[\"keyword\", \"Strict\"],\r\n\t[\"keyword\", \"Public\"],\r\n\t[\"keyword\", \"Private\"],\r\n\t[\"keyword\", \"Property\"],\r\n\t[\"keyword\", \"Bool\"],\r\n\t[\"keyword\", \"Int\"],\r\n\t[\"keyword\", \"Float\"],\r\n\t[\"keyword\", \"String\"],\r\n\t[\"keyword\", \"Array\"],\r\n\t[\"keyword\", \"Object\"],\r\n\t[\"keyword\", \"Continue\"],\r\n\t[\"keyword\", \"Exit\"],\r\n\t[\"keyword\", \"Import\"],\r\n\t[\"keyword\", \"Extern\"],\r\n\t[\"keyword\", \"New\"],\r\n\t[\"keyword\", \"Self\"],\r\n\t[\"keyword\", \"Super\"],\r\n\t[\"keyword\", \"Try\"],\r\n\t[\"keyword\", \"Catch\"],\r\n\t[\"keyword\", \"Eachin\"],\r\n\t[\"keyword\", \"True\"],\r\n\t[\"keyword\", \"False\"],\r\n\t[\"keyword\", \"Extends\"],\r\n\t[\"keyword\", \"Abstract\"],\r\n\t[\"keyword\", \"Final\"],\r\n\t[\"keyword\", \"Select\"],\r\n\t[\"keyword\", \"Case\"],\r\n\t[\"keyword\", \"Default\"],\r\n\t[\"keyword\", \"Const\"],\r\n\t[\"keyword\", \"Local\"],\r\n\t[\"keyword\", \"Global\"],\r\n\t[\"keyword\", \"Field\"],\r\n\t[\"keyword\", \"Method\"],\r\n\t[\"keyword\", \"Function\"],\r\n\t[\"keyword\", \"Class\"],\r\n\t[\"keyword\", \"End\"],\r\n\t[\"keyword\", \"If\"],\r\n\t[\"keyword\", \"Then\"],\r\n\t[\"keyword\", \"Else\"],\r\n\t[\"keyword\", \"ElseIf\"],\r\n\t[\"keyword\", \"EndIf\"],\r\n\t[\"keyword\", \"While\"],\r\n\t[\"keyword\", \"Wend\"],\r\n\t[\"keyword\", \"Repeat\"],\r\n\t[\"keyword\", \"Until\"],\r\n\t[\"keyword\", \"Forever\"],\r\n\t[\"keyword\", \"For\"],\r\n\t[\"keyword\", \"To\"],\r\n\t[\"keyword\", \"Step\"],\r\n\t[\"keyword\", \"Next\"],\r\n\t[\"keyword\", \"Return\"],\r\n\t[\"keyword\", \"Module\"],\r\n\t[\"keyword\", \"Interface\"],\r\n\t[\"keyword\", \"Implements\"],\r\n\t[\"keyword\", \"Inline\"],\r\n\t[\"keyword\", \"Throw\"],\r\n\t[\"keyword\", \"Null\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/monkey/number_feature.test",
    "content": "0\r\n42\r\n3.14159\r\n.5\r\n$BadFace\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \".5\"],\r\n\t[\"number\", \"$BadFace\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/monkey/operator_feature.test",
    "content": "..\r\n< <> <=\r\n> >=\r\n=\r\n:=\r\n+ +=\r\n- -=\r\n* *=\r\n/ /=\r\n& &=\r\n~ ~=\r\n| |=\r\nMod Mod=\r\nShl Shl=\r\nShr Shr=\r\nAnd Not Or\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"..\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<>\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \":=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&=\"],\r\n\t[\"operator\", \"~\"], [\"operator\", \"~=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"|=\"],\r\n\t[\"operator\", \"Mod\"], [\"operator\", \"Mod=\"],\r\n\t[\"operator\", \"Shl\"], [\"operator\", \"Shl=\"],\r\n\t[\"operator\", \"Shr\"], [\"operator\", \"Shr=\"],\r\n\t[\"operator\", \"And\"], [\"operator\", \"Not\"], [\"operator\", \"Or\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/monkey/preprocessor_feature.test",
    "content": "#If HOST\r\n#ElseIf\r\n#Else\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"preprocessor\", \"#If HOST\"],\r\n\t[\"preprocessor\", \"#ElseIf\"],\r\n\t[\"preprocessor\", \"#Else\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for preprocessor directives."
  },
  {
    "path": "tests/languages/monkey/string_feature.test",
    "content": "\"\"\r\n\"Foo ~qBar~q\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Foo ~qBar~q\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/monkey/type-char_feature.test",
    "content": "foo?\r\nbar%\r\nbaz#\r\nfoobar$\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"foo\", [\"type-char\", \"?\"],\r\n\t\"\\r\\nbar\", [\"type-char\", \"%\"],\r\n\t\"\\r\\nbaz\", [\"type-char\", \"#\"],\r\n\t\"\\r\\nfoobar\", [\"type-char\", \"$\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for type chars."
  },
  {
    "path": "tests/languages/moonscript/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/moonscript/class-name_feature.test",
    "content": "class Foo extends Bar\r\n\tnew: (@foo)=>\r\n\r\nwith MyClass 'baz'\r\n\t.foo = \"bazz\"\r\n\r\n\r\n-- any name starting with a capital letter is considered a class\r\nfunc Foo Bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", \"Bar\"],\r\n\t[\"property\", \"new\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"@foo\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"class-name\", \"MyClass\"],\r\n\t[\"string\", \"'baz'\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"foo \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"bazz\\\"\"\r\n\t]],\r\n\r\n\t[\"comment\", \"-- any name starting with a capital letter is considered a class\"],\r\n\t\"\\r\\nfunc \",\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"class-name\", \"Bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names.\r\n"
  },
  {
    "path": "tests/languages/moonscript/comment_feature.test",
    "content": "-- I'm a comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"-- I'm a comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/moonscript/function_feature.test",
    "content": "_G\n_VERSION\nassert\ncollectgarbage\ncoroutine.create\ncoroutine.resume\ncoroutine.running\ncoroutine.status\ncoroutine.wrap\ncoroutine.yield\ndebug.debug\ndebug.getfenv\ndebug.gethook\ndebug.getinfo\ndebug.getlocal\ndebug.getmetatable\ndebug.getregistry\ndebug.getupvalue\ndebug.setfenv\ndebug.sethook\ndebug.setlocal\ndebug.setmetatable\ndebug.setupvalue\ndebug.traceback\ndofile\nerror\ngetfenv\ngetmetatable\nio.close\nio.flush\nio.input\nio.lines\nio.open\nio.output\nio.popen\nio.read\nio.stderr\nio.stdin\nio.stdout\nio.tmpfile\nio.type\nio.write\nipairs\nload\nloadfile\nloadstring\nmath.abs\nmath.acos\nmath.asin\nmath.atan\nmath.atan2\nmath.ceil\nmath.cos\nmath.cosh\nmath.deg\nmath.exp\nmath.floor\nmath.fmod\nmath.frexp\nmath.ldexp\nmath.log\nmath.log10\nmath.max\nmath.min\nmath.modf\nmath.pi\nmath.pow\nmath.rad\nmath.random\nmath.randomseed\nmath.sin\nmath.sinh\nmath.sqrt\nmath.tan\nmath.tanh\nmodule\nnext\nos.clock\nos.date\nos.difftime\nos.execute\nos.exit\nos.getenv\nos.remove\nos.rename\nos.setlocale\nos.time\nos.tmpname\npackage.cpath\npackage.loaded\npackage.loadlib\npackage.path\npackage.preload\npackage.seeall\npairs\npcall\nprint\nrawequal\nrawget\nrawset\nrequire\nselect\nsetfenv\nsetmetatable\nstring.byte\nstring.char\nstring.dump\nstring.find\nstring.format\nstring.gmatch\nstring.gsub\nstring.len\nstring.lower\nstring.match\nstring.rep\nstring.reverse\nstring.sub\nstring.upper\ntable.concat\ntable.insert\ntable.maxn\ntable.remove\ntable.sort\ntonumber\ntostring\ntype\nunpack\nxpcall\n\n----------------------------------------------------\n\n[\n\t[\"function\", [\n\t\t\"_G\"\n\t]],\n\t[\"function\", [\n\t\t\"_VERSION\"\n\t]],\n\t[\"function\", [\n\t\t\"assert\"\n\t]],\n\t[\"function\", [\n\t\t\"collectgarbage\"\n\t]],\n\t[\"function\", [\n\t\t\"coroutine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"create\"\n\t]],\n\t[\"function\", [\n\t\t\"coroutine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"resume\"\n\t]],\n\t[\"function\", [\n\t\t\"coroutine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"running\"\n\t]],\n\t[\"function\", [\n\t\t\"coroutine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"status\"\n\t]],\n\t[\"function\", [\n\t\t\"coroutine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"wrap\"\n\t]],\n\t[\"function\", [\n\t\t\"coroutine\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"yield\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"debug\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"getfenv\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"gethook\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"getinfo\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"getlocal\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"getmetatable\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"getregistry\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"getupvalue\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"setfenv\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"sethook\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"setlocal\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"setmetatable\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"setupvalue\"\n\t]],\n\t[\"function\", [\n\t\t\"debug\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"traceback\"\n\t]],\n\t[\"function\", [\n\t\t\"dofile\"\n\t]],\n\t[\"function\", [\n\t\t\"error\"\n\t]],\n\t[\"function\", [\n\t\t\"getfenv\"\n\t]],\n\t[\"function\", [\n\t\t\"getmetatable\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"close\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"flush\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"input\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"lines\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"open\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"output\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"popen\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"read\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"stderr\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"stdin\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"stdout\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"tmpfile\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"type\"\n\t]],\n\t[\"function\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"write\"\n\t]],\n\t[\"function\", [\n\t\t\"ipairs\"\n\t]],\n\t[\"function\", [\n\t\t\"load\"\n\t]],\n\t[\"function\", [\n\t\t\"loadfile\"\n\t]],\n\t[\"function\", [\n\t\t\"loadstring\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"abs\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"acos\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"asin\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"atan\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"atan2\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"ceil\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"cos\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"cosh\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"deg\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"exp\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"floor\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"fmod\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"frexp\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"ldexp\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"log\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"log10\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"max\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"min\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"modf\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"pi\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"pow\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"rad\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"random\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"randomseed\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"sin\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"sinh\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"sqrt\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"tan\"\n\t]],\n\t[\"function\", [\n\t\t\"math\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"tanh\"\n\t]],\n\t[\"function\", [\n\t\t\"module\"\n\t]],\n\t[\"function\", [\n\t\t\"next\"\n\t]],\n\t[\"function\", [\n\t\t\"os\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"clock\"\n\t]],\n\t[\"function\", [\n\t\t\"os\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"date\"\n\t]],\n\t[\"function\", [\n\t\t\"os\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"difftime\"\n\t]],\n\t[\"function\", [\n\t\t\"os\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"execute\"\n\t]],\n\t[\"function\", [\n\t\t\"os\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"exit\"\n\t]],\n\t[\"function\", [\n\t\t\"os\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"getenv\"\n\t]],\n\t[\"function\", [\n\t\t\"os\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"remove\"\n\t]],\n\t[\"function\", [\n\t\t\"os\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"rename\"\n\t]],\n\t[\"function\", [\n\t\t\"os\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"setlocale\"\n\t]],\n\t[\"function\", [\n\t\t\"os\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"time\"\n\t]],\n\t[\"function\", [\n\t\t\"os\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"tmpname\"\n\t]],\n\t[\"function\", [\n\t\t\"package\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"cpath\"\n\t]],\n\t[\"function\", [\n\t\t\"package\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"loaded\"\n\t]],\n\t[\"function\", [\n\t\t\"package\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"loadlib\"\n\t]],\n\t[\"function\", [\n\t\t\"package\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"path\"\n\t]],\n\t[\"function\", [\n\t\t\"package\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"preload\"\n\t]],\n\t[\"function\", [\n\t\t\"package\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"seeall\"\n\t]],\n\t[\"function\", [\n\t\t\"pairs\"\n\t]],\n\t[\"function\", [\n\t\t\"pcall\"\n\t]],\n\t[\"function\", [\n\t\t\"print\"\n\t]],\n\t[\"function\", [\n\t\t\"rawequal\"\n\t]],\n\t[\"function\", [\n\t\t\"rawget\"\n\t]],\n\t[\"function\", [\n\t\t\"rawset\"\n\t]],\n\t[\"function\", [\n\t\t\"require\"\n\t]],\n\t[\"function\", [\n\t\t\"select\"\n\t]],\n\t[\"function\", [\n\t\t\"setfenv\"\n\t]],\n\t[\"function\", [\n\t\t\"setmetatable\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"byte\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"char\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"dump\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"find\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"format\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"gmatch\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"gsub\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"len\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"lower\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"match\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"rep\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"reverse\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"sub\"\n\t]],\n\t[\"function\", [\n\t\t\"string\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"upper\"\n\t]],\n\t[\"function\", [\n\t\t\"table\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"concat\"\n\t]],\n\t[\"function\", [\n\t\t\"table\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"insert\"\n\t]],\n\t[\"function\", [\n\t\t\"table\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"maxn\"\n\t]],\n\t[\"function\", [\n\t\t\"table\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"remove\"\n\t]],\n\t[\"function\", [\n\t\t\"table\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"sort\"\n\t]],\n\t[\"function\", [\n\t\t\"tonumber\"\n\t]],\n\t[\"function\", [\n\t\t\"tostring\"\n\t]],\n\t[\"function\", [\n\t\t\"type\"\n\t]],\n\t[\"function\", [\n\t\t\"unpack\"\n\t]],\n\t[\"function\", [\n\t\t\"xpcall\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/moonscript/keyword_feature.test",
    "content": "class\r\ncontinue\r\ndo\r\nelse\r\nelseif\r\nexport\r\nextends\r\nfor\r\nfrom\r\nif\r\nimport\r\nin\r\nlocal\r\nnil\r\nreturn\r\nself\r\nsuper\r\nswitch\r\nthen\r\nunless\r\nusing\r\nwhen\r\nwhile\r\nwith\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"elseif\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"local\"],\r\n\t[\"keyword\", \"nil\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"self\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"unless\"],\r\n\t[\"keyword\", \"using\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/moonscript/number_feature.test",
    "content": "121\r\n121.2323\r\n121.2323e-1\r\n121.2323e13434\r\n2323E34\r\n0x12323\r\n\r\n0xfF2323\r\n0xabcdef\r\n0xABCDEF\r\n\r\n.2323\r\n.2323e-1\r\n.2323e13434\r\n\r\n1LL\r\n1ULL\r\n9332LL\r\n9332\r\n0x2aLL\r\n0x2aULL\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"121\"],\r\n\t[\"number\", \"121.2323\"],\r\n\t[\"number\", \"121.2323e-1\"],\r\n\t[\"number\", \"121.2323e13434\"],\r\n\t[\"number\", \"2323E34\"],\r\n\t[\"number\", \"0x12323\"],\r\n\t[\"number\", \"0xfF2323\"],\r\n\t[\"number\", \"0xabcdef\"],\r\n\t[\"number\", \"0xABCDEF\"],\r\n\t[\"number\", \".2323\"],\r\n\t[\"number\", \".2323e-1\"],\r\n\t[\"number\", \".2323e13434\"],\r\n\t[\"number\", \"1LL\"],\r\n\t[\"number\", \"1ULL\"],\r\n\t[\"number\", \"9332LL\"],\r\n\t[\"number\", \"9332\"],\r\n\t[\"number\", \"0x2aLL\"],\r\n\t[\"number\", \"0x2aULL\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/moonscript/operator_feature.test",
    "content": "+ - * / % ..\r\n+= -= *= /= %= ..=\r\n\r\n> >= < <= == != ~=\r\n\r\n= : ... ^ # !\r\n-> =>\r\n\r\nand or not\r\nand= or=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"..\"],\r\n\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \"..=\"],\r\n\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"~=\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"...\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"#\"],\r\n\t[\"operator\", \"!\"],\r\n\r\n\t[\"operator\", \"->\"],\r\n\t[\"operator\", \"=>\"],\r\n\r\n\t[\"operator\", \"and\"],\r\n\t[\"operator\", \"or\"],\r\n\t[\"operator\", \"not\"],\r\n\t[\"operator\", \"and=\"],\r\n\t[\"operator\", \"or=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/moonscript/property_feature.test",
    "content": "collection =\r\n  height: 32434\r\n  hats: {\"tophat\", \"bball\", \"bowler\"}\r\n\r\nmy_function dance: \"Tango\", partner: \"none\"\r\ny = type: \"dog\", legs: 4, tails: 1\r\n\r\nhair = \"golden\"\r\nheight = 200\r\nperson = { :hair, :height, shoe_size: 40 }\r\nprint_table :hair, :height\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"collection \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"property\", \"height\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"32434\"],\r\n\t[\"property\", \"hats\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"tophat\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"bball\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"bowler\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t\"\\r\\n\\r\\nmy_function \",\r\n\t[\"property\", \"dance\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"Tango\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"partner\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"none\\\"\"\r\n\t]],\r\n\t\"\\r\\ny \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"property\", \"type\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"dog\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"legs\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"tails\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1\"],\r\n\r\n\t\"\\r\\n\\r\\nhair \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"golden\\\"\"\r\n\t]],\r\n\t\"\\r\\nheight \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"200\"],\r\n\t\"\\r\\nperson \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"property\", \"hair\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"property\", \"height\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"shoe_size\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"40\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t\"\\r\\nprint_table \",\r\n\t[\"operator\", \":\"],\r\n\t[\"property\", \"hair\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"property\", \"height\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties.\r\n"
  },
  {
    "path": "tests/languages/moonscript/punctuation_feature.test",
    "content": ". , \\\r\n() [] {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"\\\\\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for punctuation.\r\n"
  },
  {
    "path": "tests/languages/moonscript/string_feature.test",
    "content": "\"\"\r\n\"MoonScript\r\nhas multiline strings\"\r\n\r\n\"Hello, I am #{@name}!\"\r\n\r\n''\r\n'foo\r\nbar'\r\n' #{no interpolation here} '\r\n\r\n[==[\r\n\r\nmoon\r\n\r\n]==]\r\n[[(.-\\)[^\\]+$]]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\r\n\t\t\"\\\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"MoonScript\\r\\nhas multiline strings\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"Hello, I am \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"#{\"],\r\n\t\t\t[\"moonscript\", [\r\n\t\t\t\t[\"variable\", \"@name\"]\r\n\t\t\t]],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"!\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'foo\\r\\nbar'\"],\r\n\t[\"string\", \"' #{no interpolation here} '\"],\r\n\r\n\t[\"string\", \"[==[\\r\\n\\r\\nmoon\\r\\n\\r\\n]==]\"],\r\n\t[\"string\", \"[[(.-\\\\)[^\\\\]+$]]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and string interpolation.\r\n"
  },
  {
    "path": "tests/languages/moonscript/variable_feature.test",
    "content": "@ @@\r\n@var @@var\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"@\"],\r\n\t[\"variable\", \"@@\"],\r\n\t[\"variable\", \"@var\"],\r\n\t[\"variable\", \"@@var\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables.\r\n"
  },
  {
    "path": "tests/languages/n1ql/boolean_feature.test",
    "content": "TRUE\r\nFALSE\r\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"TRUE\"],\r\n\t[\"boolean\", \"FALSE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/n1ql/comment_feature.test",
    "content": "/**/\r\n/* foo\r\nbar */\r\n\r\n-- comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\r\n\t[\"comment\", \"-- comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/n1ql/function_feature.test",
    "content": "ABS(\r\nACOS(\r\nARRAY_AGG(\r\nARRAY_APPEND(\r\nARRAY_AVG(\r\nARRAY_CONCAT(\r\nARRAY_CONTAINS(\r\nARRAY_COUNT(\r\nARRAY_DISTINCT(\r\nARRAY_FLATTEN(\r\nARRAY_IFNULL(\r\nARRAY_INSERT(\r\nARRAY_INTERSECT(\r\nARRAY_LENGTH(\r\nARRAY_MAX(\r\nARRAY_MIN(\r\nARRAY_POSITION(\r\nARRAY_PREPEND(\r\nARRAY_PUT(\r\nARRAY_RANGE(\r\nARRAY_REMOVE(\r\nARRAY_REPEAT(\r\nARRAY_REPLACE(\r\nARRAY_REVERSE(\r\nARRAY_SORT(\r\nARRAY_STAR(\r\nARRAY_SUM(\r\nARRAY_SYMDIFF(\r\nARRAY_SYMDIFFN(\r\nARRAY_UNION(\r\nASIN(\r\nATAN(\r\nATAN2(\r\nAVG(\r\nBASE64(\r\nBASE64_DECODE(\r\nBASE64_ENCODE(\r\nBITAND(\r\nBITCLEAR(\r\nBITNOT(\r\nBITOR(\r\nBITSET(\r\nBITSHIFT(\r\nBITTEST(\r\nBITXOR(\r\nCEIL(\r\nCLOCK_LOCAL(\r\nCLOCK_MILLIS(\r\nCLOCK_STR(\r\nCLOCK_TZ(\r\nCLOCK_UTC(\r\nCONTAINS(\r\nCONTAINS_TOKEN(\r\nCONTAINS_TOKEN_LIKE(\r\nCONTAINS_TOKEN_REGEXP(\r\nCOS(\r\nCOUNT(\r\nCURL(\r\nDATE_ADD_MILLIS(\r\nDATE_ADD_STR(\r\nDATE_DIFF_MILLIS(\r\nDATE_DIFF_STR(\r\nDATE_FORMAT_STR(\r\nDATE_PART_MILLIS(\r\nDATE_PART_STR(\r\nDATE_RANGE_MILLIS(\r\nDATE_RANGE_STR(\r\nDATE_TRUNC_MILLIS(\r\nDATE_TRUNC_STR(\r\nDECODE_JSON(\r\nDEGREES(\r\nDURATION_TO_STR(\r\nE(\r\nENCODED_SIZE(\r\nENCODE_JSON(\r\nEXP(\r\nFLOOR(\r\nGREATEST(\r\nHAS_TOKEN(\r\nIFINF(\r\nIFMISSING(\r\nIFMISSINGORNULL(\r\nIFNAN(\r\nIFNANORINF(\r\nIFNULL(\r\nINITCAP(\r\nISARRAY(\r\nISATOM(\r\nISBOOLEAN(\r\nISNUMBER(\r\nISOBJECT(\r\nISSTRING(\r\nIsBitSET(\r\nLEAST(\r\nLENGTH(\r\nLN(\r\nLOG(\r\nLOWER(\r\nLTRIM(\r\nMAX(\r\nMETA(\r\nMILLIS(\r\nMILLIS_TO_LOCAL(\r\nMILLIS_TO_STR(\r\nMILLIS_TO_TZ(\r\nMILLIS_TO_UTC(\r\nMILLIS_TO_ZONE_NAME(\r\nMIN(\r\nMISSINGIF(\r\nNANIF(\r\nNEGINFIF(\r\nNOW_LOCAL(\r\nNOW_MILLIS(\r\nNOW_STR(\r\nNOW_TZ(\r\nNOW_UTC(\r\nNULLIF(\r\nOBJECT_ADD(\r\nOBJECT_CONCAT(\r\nOBJECT_INNER_PAIRS(\r\nOBJECT_INNER_VALUES(\r\nOBJECT_LENGTH(\r\nOBJECT_NAMES(\r\nOBJECT_PAIRS(\r\nOBJECT_PUT(\r\nOBJECT_REMOVE(\r\nOBJECT_RENAME(\r\nOBJECT_REPLACE(\r\nOBJECT_UNWRAP(\r\nOBJECT_VALUES(\r\nPAIRS(\r\nPI(\r\nPOLY_LENGTH(\r\nPOSINFIF(\r\nPOSITION(\r\nPOWER(\r\nRADIANS(\r\nRANDOM(\r\nREGEXP_CONTAINS(\r\nREGEXP_LIKE(\r\nREGEXP_POSITION(\r\nREGEXP_REPLACE(\r\nREPEAT(\r\nREPLACE(\r\nREVERSE(\r\nROUND(\r\nRTRIM(\r\nSIGN(\r\nSIN(\r\nSPLIT(\r\nSQRT(\r\nSTR_TO_DURATION(\r\nSTR_TO_MILLIS(\r\nSTR_TO_TZ(\r\nSTR_TO_UTC(\r\nSTR_TO_ZONE_NAME(\r\nSUBSTR(\r\nSUFFIXES(\r\nSUM(\r\nTAN(\r\nTITLE(\r\nTOARRAY(\r\nTOATOM(\r\nTOBOOLEAN(\r\nTOKENS(\r\nTOKENS(\r\nTONUMBER(\r\nTOOBJECT(\r\nTOSTRING(\r\nTRIM(\r\nTRUNC(\r\nTYPE(\r\nUPPER(\r\nWEEKDAY_MILLIS(\r\nWEEKDAY_STR(\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"ABS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ACOS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_AGG\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_APPEND\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_AVG\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_CONCAT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_CONTAINS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_COUNT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_DISTINCT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_FLATTEN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_IFNULL\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_INSERT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_INTERSECT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_LENGTH\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_MAX\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_MIN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_POSITION\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_PREPEND\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_PUT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_RANGE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_REMOVE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_REPEAT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_REPLACE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_REVERSE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_SORT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_STAR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_SUM\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_SYMDIFF\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_SYMDIFFN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ARRAY_UNION\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ASIN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ATAN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ATAN2\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"AVG\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"BASE64\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"BASE64_DECODE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"BASE64_ENCODE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"BITAND\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"BITCLEAR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"BITNOT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"BITOR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"BITSET\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"BITSHIFT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"BITTEST\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"BITXOR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"CEIL\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"CLOCK_LOCAL\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"CLOCK_MILLIS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"CLOCK_STR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"CLOCK_TZ\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"CLOCK_UTC\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"CONTAINS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"CONTAINS_TOKEN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"CONTAINS_TOKEN_LIKE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"CONTAINS_TOKEN_REGEXP\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"COS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"COUNT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"CURL\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DATE_ADD_MILLIS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DATE_ADD_STR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DATE_DIFF_MILLIS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DATE_DIFF_STR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DATE_FORMAT_STR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DATE_PART_MILLIS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DATE_PART_STR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DATE_RANGE_MILLIS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DATE_RANGE_STR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DATE_TRUNC_MILLIS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DATE_TRUNC_STR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DECODE_JSON\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DEGREES\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"DURATION_TO_STR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"E\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ENCODED_SIZE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ENCODE_JSON\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"EXP\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"FLOOR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"GREATEST\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"HAS_TOKEN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"IFINF\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"IFMISSING\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"IFMISSINGORNULL\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"IFNAN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"IFNANORINF\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"IFNULL\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"INITCAP\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ISARRAY\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ISATOM\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ISBOOLEAN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ISNUMBER\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ISOBJECT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ISSTRING\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"IsBitSET\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"LEAST\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"LENGTH\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"LN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"LOG\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"LOWER\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"LTRIM\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MAX\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"META\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MILLIS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MILLIS_TO_LOCAL\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MILLIS_TO_STR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MILLIS_TO_TZ\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MILLIS_TO_UTC\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MILLIS_TO_ZONE_NAME\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MIN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MISSINGIF\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"NANIF\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"NEGINFIF\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"NOW_LOCAL\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"NOW_MILLIS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"NOW_STR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"NOW_TZ\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"NOW_UTC\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"NULLIF\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_ADD\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_CONCAT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_INNER_PAIRS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_INNER_VALUES\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_LENGTH\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_NAMES\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_PAIRS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_PUT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_REMOVE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_RENAME\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_REPLACE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_UNWRAP\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"OBJECT_VALUES\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"PAIRS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"PI\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"POLY_LENGTH\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"POSINFIF\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"POSITION\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"POWER\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"RADIANS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"RANDOM\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"REGEXP_CONTAINS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"REGEXP_LIKE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"REGEXP_POSITION\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"REGEXP_REPLACE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"REPEAT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"REPLACE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"REVERSE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ROUND\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"RTRIM\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"SIGN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"SIN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"SPLIT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"SQRT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"STR_TO_DURATION\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"STR_TO_MILLIS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"STR_TO_TZ\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"STR_TO_UTC\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"STR_TO_ZONE_NAME\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"SUBSTR\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"SUFFIXES\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"SUM\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TAN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TITLE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TOARRAY\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TOATOM\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TOBOOLEAN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TOKENS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TOKENS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TONUMBER\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TOOBJECT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TOSTRING\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TRIM\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TRUNC\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"TYPE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"UPPER\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"WEEKDAY_MILLIS\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"WEEKDAY_STR\"], [\"punctuation\", \"(\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/n1ql/identifier_feature.test",
    "content": "``\r\n`foo`\r\n`foo bar`\r\n`foo\r\nbar`\r\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"identifier\", \"``\"],\r\n\t[\"identifier\", \"`foo`\"],\r\n\t[\"identifier\", \"`foo bar`\"],\r\n\t[\"identifier\", \"`foo\\r\\nbar`\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for escaped identifiers."
  },
  {
    "path": "tests/languages/n1ql/keyword_feature.test",
    "content": "ADVISE\r\nALL\r\nALTER\r\nANALYZE\r\nAS\r\nASC\r\nAT\r\nBEGIN\r\nBINARY\r\nBOOLEAN\r\nBREAK\r\nBUCKET\r\nBUILD\r\nBY\r\nCALL\r\nCAST\r\nCLUSTER\r\nCOLLATE\r\nCOLLECTION\r\nCOMMIT\r\nCOMMITTED\r\nCONNECT\r\nCONTINUE\r\nCORRELATE\r\nCORRELATED\r\nCOVER\r\nCREATE\r\nCURRENT\r\nDATABASE\r\nDATASET\r\nDATASTORE\r\nDECLARE\r\nDECREMENT\r\nDELETE\r\nDERIVED\r\nDESC\r\nDESCRIBE\r\nDISTINCT\r\nDO\r\nDROP\r\nEACH\r\nELEMENT\r\nEXCEPT\r\nEXCLUDE\r\nEXECUTE\r\nEXPLAIN\r\nFETCH\r\nFILTER\r\nFLATTEN\r\nFLUSH\r\nFOLLOWING\r\nFOR\r\nFORCE\r\nFROM\r\nFTS\r\nFUNCTION\r\nGOLANG\r\nGRANT\r\nGROUP\r\nGROUPS\r\nGSI\r\nHASH\r\nHAVING\r\nIF\r\nIGNORE\r\nILIKE\r\nINCLUDE\r\nINCREMENT\r\nINDEX\r\nINFER\r\nINLINE\r\nINNER\r\nINSERT\r\nINTERSECT\r\nINTO\r\nIS\r\nISOLATION\r\nJAVASCRIPT\r\nJOIN\r\nKEY\r\nKEYS\r\nKEYSPACE\r\nKNOWN\r\nLANGUAGE\r\nLAST\r\nLEFT\r\nLET\r\nLETTING\r\nLEVEL\r\nLIMIT\r\nLSM\r\nMAP\r\nMAPPING\r\nMATCHED\r\nMATERIALIZED\r\nMERGE\r\nMINUS\r\nMISSING\r\nNAMESPACE\r\nNEST\r\nNL\r\nNO\r\nNTH_VALUE\r\nNULL\r\nNULLS\r\nNUMBER\r\nOBJECT\r\nOFFSET\r\nON\r\nOPTION\r\nOPTIONS\r\nORDER\r\nOTHERS\r\nOUTER\r\nOVER\r\nPARSE\r\nPARTITION\r\nPASSWORD\r\nPATH\r\nPOOL\r\nPRECEDING\r\nPREPARE\r\nPRIMARY\r\nPRIVATE\r\nPRIVILEGE\r\nPROBE\r\nPROCEDURE\r\nPUBLIC\r\nRANGE\r\nRAW\r\nREALM\r\nREDUCE\r\nRENAME\r\nRESPECT\r\nRETURN\r\nRETURNING\r\nREVOKE\r\nRIGHT\r\nROLE\r\nROLLBACK\r\nROW\r\nROWS\r\nSATISFIES\r\nSAVEPOINT\r\nSCHEMA\r\nSCOPE\r\nSELECT\r\nSELF\r\nSEMI\r\nSET\r\nSHOW\r\nSOME\r\nSTART\r\nSTATISTICS\r\nSTRING\r\nSYSTEM\r\nTIES\r\nTO\r\nTRAN\r\nTRANSACTION\r\nTRIGGER\r\nTRUNCATE\r\nUNBOUNDED\r\nUNDER\r\nUNION\r\nUNIQUE\r\nUNKNOWN\r\nUNNEST\r\nUNSET\r\nUPDATE\r\nUPSERT\r\nUSE\r\nUSER\r\nUSING\r\nVALIDATE\r\nVALUE\r\nVALUES\r\nVIA\r\nVIEW\r\nWHERE\r\nWHILE\r\nWINDOW\r\nWITH\r\nWORK\r\nXOR\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"ADVISE\"],\r\n\t[\"keyword\", \"ALL\"],\r\n\t[\"keyword\", \"ALTER\"],\r\n\t[\"keyword\", \"ANALYZE\"],\r\n\t[\"keyword\", \"AS\"],\r\n\t[\"keyword\", \"ASC\"],\r\n\t[\"keyword\", \"AT\"],\r\n\t[\"keyword\", \"BEGIN\"],\r\n\t[\"keyword\", \"BINARY\"],\r\n\t[\"keyword\", \"BOOLEAN\"],\r\n\t[\"keyword\", \"BREAK\"],\r\n\t[\"keyword\", \"BUCKET\"],\r\n\t[\"keyword\", \"BUILD\"],\r\n\t[\"keyword\", \"BY\"],\r\n\t[\"keyword\", \"CALL\"],\r\n\t[\"keyword\", \"CAST\"],\r\n\t[\"keyword\", \"CLUSTER\"],\r\n\t[\"keyword\", \"COLLATE\"],\r\n\t[\"keyword\", \"COLLECTION\"],\r\n\t[\"keyword\", \"COMMIT\"],\r\n\t[\"keyword\", \"COMMITTED\"],\r\n\t[\"keyword\", \"CONNECT\"],\r\n\t[\"keyword\", \"CONTINUE\"],\r\n\t[\"keyword\", \"CORRELATE\"],\r\n\t[\"keyword\", \"CORRELATED\"],\r\n\t[\"keyword\", \"COVER\"],\r\n\t[\"keyword\", \"CREATE\"],\r\n\t[\"keyword\", \"CURRENT\"],\r\n\t[\"keyword\", \"DATABASE\"],\r\n\t[\"keyword\", \"DATASET\"],\r\n\t[\"keyword\", \"DATASTORE\"],\r\n\t[\"keyword\", \"DECLARE\"],\r\n\t[\"keyword\", \"DECREMENT\"],\r\n\t[\"keyword\", \"DELETE\"],\r\n\t[\"keyword\", \"DERIVED\"],\r\n\t[\"keyword\", \"DESC\"],\r\n\t[\"keyword\", \"DESCRIBE\"],\r\n\t[\"keyword\", \"DISTINCT\"],\r\n\t[\"keyword\", \"DO\"],\r\n\t[\"keyword\", \"DROP\"],\r\n\t[\"keyword\", \"EACH\"],\r\n\t[\"keyword\", \"ELEMENT\"],\r\n\t[\"keyword\", \"EXCEPT\"],\r\n\t[\"keyword\", \"EXCLUDE\"],\r\n\t[\"keyword\", \"EXECUTE\"],\r\n\t[\"keyword\", \"EXPLAIN\"],\r\n\t[\"keyword\", \"FETCH\"],\r\n\t[\"keyword\", \"FILTER\"],\r\n\t[\"keyword\", \"FLATTEN\"],\r\n\t[\"keyword\", \"FLUSH\"],\r\n\t[\"keyword\", \"FOLLOWING\"],\r\n\t[\"keyword\", \"FOR\"],\r\n\t[\"keyword\", \"FORCE\"],\r\n\t[\"keyword\", \"FROM\"],\r\n\t[\"keyword\", \"FTS\"],\r\n\t[\"keyword\", \"FUNCTION\"],\r\n\t[\"keyword\", \"GOLANG\"],\r\n\t[\"keyword\", \"GRANT\"],\r\n\t[\"keyword\", \"GROUP\"],\r\n\t[\"keyword\", \"GROUPS\"],\r\n\t[\"keyword\", \"GSI\"],\r\n\t[\"keyword\", \"HASH\"],\r\n\t[\"keyword\", \"HAVING\"],\r\n\t[\"keyword\", \"IF\"],\r\n\t[\"keyword\", \"IGNORE\"],\r\n\t[\"keyword\", \"ILIKE\"],\r\n\t[\"keyword\", \"INCLUDE\"],\r\n\t[\"keyword\", \"INCREMENT\"],\r\n\t[\"keyword\", \"INDEX\"],\r\n\t[\"keyword\", \"INFER\"],\r\n\t[\"keyword\", \"INLINE\"],\r\n\t[\"keyword\", \"INNER\"],\r\n\t[\"keyword\", \"INSERT\"],\r\n\t[\"keyword\", \"INTERSECT\"],\r\n\t[\"keyword\", \"INTO\"],\r\n\t[\"keyword\", \"IS\"],\r\n\t[\"keyword\", \"ISOLATION\"],\r\n\t[\"keyword\", \"JAVASCRIPT\"],\r\n\t[\"keyword\", \"JOIN\"],\r\n\t[\"keyword\", \"KEY\"],\r\n\t[\"keyword\", \"KEYS\"],\r\n\t[\"keyword\", \"KEYSPACE\"],\r\n\t[\"keyword\", \"KNOWN\"],\r\n\t[\"keyword\", \"LANGUAGE\"],\r\n\t[\"keyword\", \"LAST\"],\r\n\t[\"keyword\", \"LEFT\"],\r\n\t[\"keyword\", \"LET\"],\r\n\t[\"keyword\", \"LETTING\"],\r\n\t[\"keyword\", \"LEVEL\"],\r\n\t[\"keyword\", \"LIMIT\"],\r\n\t[\"keyword\", \"LSM\"],\r\n\t[\"keyword\", \"MAP\"],\r\n\t[\"keyword\", \"MAPPING\"],\r\n\t[\"keyword\", \"MATCHED\"],\r\n\t[\"keyword\", \"MATERIALIZED\"],\r\n\t[\"keyword\", \"MERGE\"],\r\n\t[\"keyword\", \"MINUS\"],\r\n\t[\"keyword\", \"MISSING\"],\r\n\t[\"keyword\", \"NAMESPACE\"],\r\n\t[\"keyword\", \"NEST\"],\r\n\t[\"keyword\", \"NL\"],\r\n\t[\"keyword\", \"NO\"],\r\n\t[\"keyword\", \"NTH_VALUE\"],\r\n\t[\"keyword\", \"NULL\"],\r\n\t[\"keyword\", \"NULLS\"],\r\n\t[\"keyword\", \"NUMBER\"],\r\n\t[\"keyword\", \"OBJECT\"],\r\n\t[\"keyword\", \"OFFSET\"],\r\n\t[\"keyword\", \"ON\"],\r\n\t[\"keyword\", \"OPTION\"],\r\n\t[\"keyword\", \"OPTIONS\"],\r\n\t[\"keyword\", \"ORDER\"],\r\n\t[\"keyword\", \"OTHERS\"],\r\n\t[\"keyword\", \"OUTER\"],\r\n\t[\"keyword\", \"OVER\"],\r\n\t[\"keyword\", \"PARSE\"],\r\n\t[\"keyword\", \"PARTITION\"],\r\n\t[\"keyword\", \"PASSWORD\"],\r\n\t[\"keyword\", \"PATH\"],\r\n\t[\"keyword\", \"POOL\"],\r\n\t[\"keyword\", \"PRECEDING\"],\r\n\t[\"keyword\", \"PREPARE\"],\r\n\t[\"keyword\", \"PRIMARY\"],\r\n\t[\"keyword\", \"PRIVATE\"],\r\n\t[\"keyword\", \"PRIVILEGE\"],\r\n\t[\"keyword\", \"PROBE\"],\r\n\t[\"keyword\", \"PROCEDURE\"],\r\n\t[\"keyword\", \"PUBLIC\"],\r\n\t[\"keyword\", \"RANGE\"],\r\n\t[\"keyword\", \"RAW\"],\r\n\t[\"keyword\", \"REALM\"],\r\n\t[\"keyword\", \"REDUCE\"],\r\n\t[\"keyword\", \"RENAME\"],\r\n\t[\"keyword\", \"RESPECT\"],\r\n\t[\"keyword\", \"RETURN\"],\r\n\t[\"keyword\", \"RETURNING\"],\r\n\t[\"keyword\", \"REVOKE\"],\r\n\t[\"keyword\", \"RIGHT\"],\r\n\t[\"keyword\", \"ROLE\"],\r\n\t[\"keyword\", \"ROLLBACK\"],\r\n\t[\"keyword\", \"ROW\"],\r\n\t[\"keyword\", \"ROWS\"],\r\n\t[\"keyword\", \"SATISFIES\"],\r\n\t[\"keyword\", \"SAVEPOINT\"],\r\n\t[\"keyword\", \"SCHEMA\"],\r\n\t[\"keyword\", \"SCOPE\"],\r\n\t[\"keyword\", \"SELECT\"],\r\n\t[\"keyword\", \"SELF\"],\r\n\t[\"keyword\", \"SEMI\"],\r\n\t[\"keyword\", \"SET\"],\r\n\t[\"keyword\", \"SHOW\"],\r\n\t[\"keyword\", \"SOME\"],\r\n\t[\"keyword\", \"START\"],\r\n\t[\"keyword\", \"STATISTICS\"],\r\n\t[\"keyword\", \"STRING\"],\r\n\t[\"keyword\", \"SYSTEM\"],\r\n\t[\"keyword\", \"TIES\"],\r\n\t[\"keyword\", \"TO\"],\r\n\t[\"keyword\", \"TRAN\"],\r\n\t[\"keyword\", \"TRANSACTION\"],\r\n\t[\"keyword\", \"TRIGGER\"],\r\n\t[\"keyword\", \"TRUNCATE\"],\r\n\t[\"keyword\", \"UNBOUNDED\"],\r\n\t[\"keyword\", \"UNDER\"],\r\n\t[\"keyword\", \"UNION\"],\r\n\t[\"keyword\", \"UNIQUE\"],\r\n\t[\"keyword\", \"UNKNOWN\"],\r\n\t[\"keyword\", \"UNNEST\"],\r\n\t[\"keyword\", \"UNSET\"],\r\n\t[\"keyword\", \"UPDATE\"],\r\n\t[\"keyword\", \"UPSERT\"],\r\n\t[\"keyword\", \"USE\"],\r\n\t[\"keyword\", \"USER\"],\r\n\t[\"keyword\", \"USING\"],\r\n\t[\"keyword\", \"VALIDATE\"],\r\n\t[\"keyword\", \"VALUE\"],\r\n\t[\"keyword\", \"VALUES\"],\r\n\t[\"keyword\", \"VIA\"],\r\n\t[\"keyword\", \"VIEW\"],\r\n\t[\"keyword\", \"WHERE\"],\r\n\t[\"keyword\", \"WHILE\"],\r\n\t[\"keyword\", \"WINDOW\"],\r\n\t[\"keyword\", \"WITH\"],\r\n\t[\"keyword\", \"WORK\"],\r\n\t[\"keyword\", \"XOR\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/n1ql/number_feature.test",
    "content": "42\r\n0.154\r\n3.1E+7\r\n.02e2\r\n2.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"0.154\"],\r\n\t[\"number\", \"3.1E+7\"],\r\n\t[\"number\", \".02e2\"],\r\n\t[\"number\", \"2.\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for integers, decimal and e-notation numbers."
  },
  {
    "path": "tests/languages/n1ql/operator_feature.test",
    "content": "+ - * /\r\n= % ||\r\n!=\r\n< <= <>\r\n> >=\r\n\r\nAND\r\nANY\r\nARRAY\r\nBETWEEN\r\nCASE\r\nELSE\r\nEND\r\nEVERY\r\nEXISTS\r\nFIRST\r\nIN\r\nLIKE\r\nNOT\r\nOR\r\nTHEN\r\nVALUED\r\nWHEN\r\nWITHIN\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"%\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<>\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"AND\"],\r\n\t[\"operator\", \"ANY\"],\r\n\t[\"operator\", \"ARRAY\"],\r\n\t[\"operator\", \"BETWEEN\"],\r\n\t[\"operator\", \"CASE\"],\r\n\t[\"operator\", \"ELSE\"],\r\n\t[\"operator\", \"END\"],\r\n\t[\"operator\", \"EVERY\"],\r\n\t[\"operator\", \"EXISTS\"],\r\n\t[\"operator\", \"FIRST\"],\r\n\t[\"operator\", \"IN\"],\r\n\t[\"operator\", \"LIKE\"],\r\n\t[\"operator\", \"NOT\"],\r\n\t[\"operator\", \"OR\"],\r\n\t[\"operator\", \"THEN\"],\r\n\t[\"operator\", \"VALUED\"],\r\n\t[\"operator\", \"WHEN\"],\r\n\t[\"operator\", \"WITHIN\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/n1ql/parameter_feature.test",
    "content": "$1\r\n$named_parameter\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"parameter\", \"$1\"],\r\n\t[\"parameter\", \"$named_parameter\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for parameters.\r\n"
  },
  {
    "path": "tests/languages/n1ql/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\"foo\r\nbar\"\r\n''\r\n'fo\\'obar'\r\n'foo\r\nbar'\r\n'foo''s bar'\r\n\"foo's \"\"bar\"\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo\\\\'obar'\"],\r\n\t[\"string\", \"'foo\\r\\nbar'\"],\r\n\t[\"string\", \"'foo''s bar'\"],\r\n\t[\"string\", \"\\\"foo's \\\"\\\"bar\\\"\\\"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/n4js/annotation_feature.test",
    "content": "@Inject\r\n@Internal\r\n@Undefined\r\n@StringBased\r\n@Final\r\n@GenerateInjector\r\n@WithParentInjector\r\n@Spec\r\n@Override\r\n@Promisifiable\r\n@Promisify\r\n@This\r\n@N4JS\r\n@IgnoreImplementation\r\n@Global\r\n@ProvidedByRuntime\r\n@TestAPI\r\n@Polyfill\r\n@StaticPolyfill\r\n@StaticPolyfillAware\r\n@StaticPolyfillModule\r\n@Transient\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"annotation\", \"@Inject\"],\r\n\t[\"annotation\", \"@Internal\"],\r\n\t[\"annotation\", \"@Undefined\"],\r\n\t[\"annotation\", \"@StringBased\"],\r\n\t[\"annotation\", \"@Final\"],\r\n\t[\"annotation\", \"@GenerateInjector\"],\r\n\t[\"annotation\", \"@WithParentInjector\"],\r\n\t[\"annotation\", \"@Spec\"],\r\n\t[\"annotation\", \"@Override\"],\r\n\t[\"annotation\", \"@Promisifiable\"],\r\n\t[\"annotation\", \"@Promisify\"],\r\n\t[\"annotation\", \"@This\"],\r\n\t[\"annotation\", \"@N4JS\"],\r\n\t[\"annotation\", \"@IgnoreImplementation\"],\r\n\t[\"annotation\", \"@Global\"],\r\n\t[\"annotation\", \"@ProvidedByRuntime\"],\r\n\t[\"annotation\", \"@TestAPI\"],\r\n\t[\"annotation\", \"@Polyfill\"],\r\n\t[\"annotation\", \"@StaticPolyfill\"],\r\n\t[\"annotation\", \"@StaticPolyfillAware\"],\r\n\t[\"annotation\", \"@StaticPolyfillModule\"],\r\n\t[\"annotation\", \"@Transient\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTest for annotations.\r\n"
  },
  {
    "path": "tests/languages/n4js/keyword_feature.test",
    "content": "any\r\nArray\r\nboolean\r\nbreak\r\ncase\r\ncatch\r\nclass;\r\nconst\r\nconstructor\r\ncontinue\r\ndebugger\r\ndeclare\r\ndefault\r\ndelete\r\ndo\r\nelse\r\nenum\r\nexport\r\nextends;\r\nfalse\r\nfinally\r\nfor\r\nfrom\r\nfunction\r\nget\r\nif\r\nimplements;\r\nimport\r\nin\r\ninstanceof;\r\ninterface;\r\nlet\r\nmodule\r\nnew;\r\nnull\r\nnumber\r\npackage\r\nprivate\r\nprotected\r\npublic\r\nreturn\r\nset\r\nstatic\r\nstring\r\nsuper\r\nswitch\r\nthis\r\nthrow\r\ntrue\r\ntry\r\ntypeof\r\nvar\r\nvoid\r\nwhile\r\nwith\r\nyield\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"any\"],\r\n\t[\"keyword\", \"Array\"],\r\n\t[\"keyword\", \"boolean\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"constructor\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"debugger\"],\r\n\t[\"keyword\", \"declare\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"delete\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"false\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"instanceof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"number\"],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"true\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"typeof\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"keyword\", \"yield\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTests N4JS keywords."
  },
  {
    "path": "tests/languages/nand2tetris-hdl/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/nand2tetris-hdl/comment_feature.test",
    "content": "// foobar\r\n/**/\r\n/* foo\r\nbar */\r\n/*\r\n * foobar\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// foobar\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"/*\\r\\n * foobar\\r\\n */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments.\r\n"
  },
  {
    "path": "tests/languages/nand2tetris-hdl/function_feature.test",
    "content": "And()\r\nnot()\r\nmux16()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"And\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"not\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"mux16\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/nand2tetris-hdl/keyword_feature.test",
    "content": "CHIP\r\nIN\r\nOUT\r\nPARTS\r\nBUILTIN\r\nCLOCKED\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"CHIP\"],\r\n\t[\"keyword\", \"IN\"],\r\n\t[\"keyword\", \"OUT\"],\r\n\t[\"keyword\", \"PARTS\"],\r\n\t[\"keyword\", \"BUILTIN\"],\r\n\t[\"keyword\", \"CLOCKED\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/nand2tetris-hdl/number_feature.test",
    "content": "0\r\n16\r\n32\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"16\"],\r\n\t[\"number\", \"32\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for integer numbers.\r\n"
  },
  {
    "path": "tests/languages/nand2tetris-hdl/operator_feature.test",
    "content": "=\r\n..\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"..\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/nand2tetris-hdl/punctuation_feature.test",
    "content": "( )\r\n{ }\r\n[ ]\r\n,\r\n;\r\n:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \":\"]\r\n]\r\n----------------------------------------------------\r\n\r\nChecks for punctuation.\r\n"
  },
  {
    "path": "tests/languages/naniscript/command_feature.test",
    "content": "@\r\n@ cmdWithWhiteSpaceBefore\r\n@cmdWithTrailingSemicolon:\r\n@paramlessCmd\r\n @cmdWithNoParamsAndWhitespaceBefore\r\n\t@cmdWithNoParamsAndTabBefore\r\n\t\t\t\t @cmdWithNoParamsAndTabAndSpacesBefore\r\n\t\t\t\t\t\t @cmdWithNoParamsWrappedInWhitespaces\r\n@cmdWithNoParamWithTrailingSpace \r\n@cmdWithNoParamWithMultipleTrailingSpaces    \r\n@cmdWithNoParamWithTrailingTab\t\r\n@cmdWithNoParamWithTrailingTabAndSpaces\t\t\t\t\r\n@cmdWithPositiveIntParam 1\r\n@cmdWithNegativeIntParam -1\r\n@cmdWithPositiveFloatParamAndNoFraction 1.\r\n@cmdWithPositiveFloatParamAndFraction 1.10\r\n@cmdWithPositiveHegativeFloatParamAndNoFraction -1.\r\n@cmdWithPositiveHegativeFloatParamAndFraction -1.10\r\n@cmdWithBoolParamAndPositive true\r\n@cmdWithBoolParamAndNegative false\r\n@cmdWithStringParam hello$co\\:mma\"d\"\r\n@cmdWithQuotedStringNamelessParameter \"hello grizzly\"\r\n@cmdWithQuotedStringNamelessParameterWithEscapedQuotesInTheValue \"hello \\\"grizzly\\\"\"\r\n@set choice=\"moe\"\r\n@command hello.grizzly\r\n@command one,two,three\r\n@command 1,2,3\r\n@command true,false,true\r\n@command hi:grizzly\r\n@command hi:1\r\n@command hi:true\r\n@command 1 in:forest danger:true\r\n@char 1 pos:0.25,-0.75 look:right\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"@\\r\\n@ cmdWithWhiteSpaceBefore\\r\\n@cmdWithTrailingSemicolon:\\r\\n\",\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@paramlessCmd\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithNoParamsAndWhitespaceBefore\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithNoParamsAndTabBefore\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithNoParamsAndTabAndSpacesBefore\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithNoParamsWrappedInWhitespaces\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithNoParamWithTrailingSpace\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithNoParamWithMultipleTrailingSpaces\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithNoParamWithTrailingTab\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithNoParamWithTrailingTabAndSpaces\"]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithPositiveIntParam\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"1\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithNegativeIntParam\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"-1\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithPositiveFloatParamAndNoFraction\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"1.\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithPositiveFloatParamAndFraction\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"1.10\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithPositiveHegativeFloatParamAndNoFraction\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"-1.\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithPositiveHegativeFloatParamAndFraction\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"-1.10\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithBoolParamAndPositive\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"true\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithBoolParamAndNegative\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"false\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithStringParam\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"hello$co\\\\:mma\\\"d\\\"\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithQuotedStringNamelessParameter\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"quoted-string\", \"\\\"hello grizzly\\\"\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@cmdWithQuotedStringNamelessParameterWithEscapedQuotesInTheValue\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"quoted-string\", \"\\\"hello \\\\\\\"grizzly\\\\\\\"\\\"\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@set\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"choice=\\\"moe\\\"\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@command\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"hello.grizzly\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@command\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"one,two,three\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@command\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"1,2,3\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@command\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"true,false,true\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@command\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-id\", \"hi:\"],\r\n\t\t\t[\"command-param-value\", \"grizzly\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@command\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-id\", \"hi:\"],\r\n\t\t\t[\"command-param-value\", \"1\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@command\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-id\", \"hi:\"],\r\n\t\t\t[\"command-param-value\", \"true\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@command\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"1\"],\r\n\t\t\t[\"command-param-id\", \"in:\"],\r\n\t\t\t[\"command-param-value\", \"forest\"],\r\n\t\t\t[\"command-param-id\", \"danger:\"],\r\n\t\t\t[\"command-param-value\", \"true\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"command\", [\r\n\t\t[\"command-name\", \"@char\"],\r\n\t\t[\"command-params\", [\r\n\t\t\t[\"command-param-value\", \"1\"],\r\n\t\t\t[\"command-param-id\", \"pos:\"],\r\n\t\t\t[\"command-param-value\", \"0.25,-0.75\"],\r\n\t\t\t[\"command-param-id\", \"look:\"],\r\n\t\t\t[\"command-param-value\", \"right\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nCommand tests.\r\n"
  },
  {
    "path": "tests/languages/naniscript/comment_feature.test",
    "content": ";\r\n; comment\r\n\\:; invalid comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \";\"],\r\n\t[\"comment\", \"; comment\"],\r\n\t[\"generic-text\", [\r\n\t\t\"\\\\:; invalid comment\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nComment tests.\r\n"
  },
  {
    "path": "tests/languages/naniscript/define_feature.test",
    "content": ">\r\n>DefineKey \tdefine _ + 3h f[29 j] value *\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\">\\r\\n\",\r\n\t[\"define\", [\r\n\t\t\">\",\r\n\t\t[\"key\", \"DefineKey\"],\r\n\t\t[\"value\", \"define _ + 3h f[29 j] value *\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nDefine tests.\r\n"
  },
  {
    "path": "tests/languages/naniscript/expression_feature.test",
    "content": "{}\n{ Abs(a, d) + 12 - 1 / -230.0 + \"Lol ipsum\" }\nExpressions inside a generic text line: Loreim ipsu,{ Abs(a, d) + 12 - 1 / -230.0 + \"Lol ipsum\" } doler sit amen {¯\\_(ツ)_/¯}.\n@ExpressionInsteadOfNamelessParameterValue {x > 0}\n@ExpressionBlendedWithNamelessParameterValue sdf{x > 0}df\n@ExpressionsInsideNamedParameterValueWrappedInQuotes text:\"{a} < {b}\"\n@ExpressionsBlendedWithNamedParameterValue param:32r2f,df{x > 0},d.{Abs(0) + 12.24 > 0}ff\n@ExpressionsInsteadOfNamelessParameterAndQuotedParameter {remark} if:remark==\"Saying \\\\\"Stop { \"the\" } car\\\\\" was a mistake.\"\n\n----------------------------------------------------\n\n[\n\t[\"generic-text\", [\n\t\t[\"expression\", \"{}\"]\n\t]],\n\t[\"generic-text\", [\n\t\t[\"expression\", \"{ Abs(a, d) + 12 - 1 / -230.0 + \\\"Lol ipsum\\\" }\"]\n\t]],\n\t[\"generic-text\", [\n\t\t\"Expressions inside a generic text line: Loreim ipsu,\",\n\t\t[\"expression\", \"{ Abs(a, d) + 12 - 1 / -230.0 + \\\"Lol ipsum\\\" }\"],\n\t\t\" doler sit amen \",\n\t\t[\"expression\", \"{¯\\\\_(ツ)_/¯}\"],\n\t\t\".\"\n\t]],\n\t[\"command\", [\n\t\t[\"command-name\", \"@ExpressionInsteadOfNamelessParameterValue\"],\n\t\t[\"expression\", \"{x > 0}\"]\n\t]],\n\t[\"command\", [\n\t\t[\"command-name\", \"@ExpressionBlendedWithNamelessParameterValue\"],\n\t\t[\"command-params\", [\n\t\t\t[\"command-param-value\", \"sdf\"]\n\t\t]],\n\t\t[\"expression\", \"{x > 0}\"],\n\t\t[\"command-params\", [\n\t\t\t[\"command-param-value\", \"df\"]\n\t\t]]\n\t]],\n\t[\"command\", [\n\t\t[\"command-name\", \"@ExpressionsInsideNamedParameterValueWrappedInQuotes\"],\n\t\t[\"command-params\", [\n\t\t\t[\"command-param-id\", \"text:\"],\n\t\t\t[\"command-param-value\", \"\\\"\"]\n\t\t]],\n\t\t[\"expression\", \"{a}\"],\n\t\t[\"command-params\", [\n\t\t\t[\"command-param-value\", \"<\"]\n\t\t]],\n\t\t[\"expression\", \"{b}\"],\n\t\t[\"command-params\", [\n\t\t\t[\"command-param-value\", \"\\\"\"]\n\t\t]]\n\t]],\n\t[\"command\", [\n\t\t[\"command-name\", \"@ExpressionsBlendedWithNamedParameterValue\"],\n\t\t[\"command-params\", [\n\t\t\t[\"command-param-id\", \"param:\"],\n\t\t\t[\"command-param-value\", \"32r2f,df\"]\n\t\t]],\n\t\t[\"expression\", \"{x > 0}\"],\n\t\t[\"command-params\", [\n\t\t\t[\"command-param-value\", \",d.\"]\n\t\t]],\n\t\t[\"expression\", \"{Abs(0) + 12.24 > 0}\"],\n\t\t[\"command-params\", [\n\t\t\t[\"command-param-value\", \"ff\"]\n\t\t]]\n\t]],\n\t[\"command\", [\n\t\t[\"command-name\", \"@ExpressionsInsteadOfNamelessParameterAndQuotedParameter\"],\n\t\t[\"expression\", \"{remark}\"],\n\t\t[\"command-params\", [\n\t\t\t[\"command-param-id\", \"if:\"],\n\t\t\t[\"command-param-value\", \"remark==\"],\n\t\t\t[\"quoted-string\", \"\\\"Saying \\\\\\\\\\\"\"],\n\t\t\t[\"command-param-value\", \"Stop\"]\n\t\t]],\n\t\t[\"expression\", \"{ \\\"the\\\" }\"],\n\t\t[\"command-params\", [\n\t\t\t[\"command-param-value\", \"car\\\\\\\\\\\"\"],\n\t\t\t[\"command-param-value\", \"was\"],\n\t\t\t[\"command-param-value\", \"a\"],\n\t\t\t[\"command-param-value\", \"mistake.\\\"\"]\n\t\t]]\n\t]]\n]\n\n----------------------------------------------------\n\nExpressions tests.\n"
  },
  {
    "path": "tests/languages/naniscript/label_feature.test",
    "content": "#\r\n# Section1\r\n#Section2\r\n# Section4\r\n#\t\t\tSectionWithMultipleTabsBefore\r\n## Section3\r\n# Section with multiple words\r\n\t# Section with\r\n\t# Section with tab\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"#\\r\\n\",\r\n\t[\"label\", \"# Section1\"],\r\n\t[\"label\", \"#Section2\"],\r\n\t[\"label\", \"# Section4\"],\r\n\t[\"label\", \"#\\t\\t\\tSectionWithMultipleTabsBefore\"],\r\n\t\"\\r\\n## Section3\\r\\n# Section with multiple words\\r\\n\\t# Section with\\r\\n\\t# Section with tab\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nLabel tests.\r\n"
  },
  {
    "path": "tests/languages/naniscript/mixed_content_feature.test",
    "content": "Generic text with inlined commands[i] example[command 1 danger:true] more text here [act danger:false true:false]\n\n@action1ForTwoLinesWithCommands\n@action2ForTwoLinesWithCommands\n\n@commandAndGenericTextOnNewLine\nMassa ut elementum.\n\n@commandWithParameterAndGenericTextOnNewLine WideParam\nInteger\n\nEscaped braces inside generic text\\{abu\\}nt @ >ip#s;um< @ \\[sdff j9dj\\]\n\nUnclosedExpression{ab{cndum dui dolor tincidu{nt [s[fa]sdf [\n\"Integer: a = {a} malesuada a + b = {a + b}\", Random(a, b) = {Random(a, b)}, Random(\"foo\", \"bar\", \"foobar\") = {Random(\"foo\", \"bar\", \"foobar\")},}\n#\n>\n@\n\n----------------------------------------------------\n\n[\n\t[\"generic-text\", [\n\t\t\"Generic text with inlined commands\",\n\t\t[\"inline-command\", [\n\t\t\t[\"start-stop-char\", \"[\"],\n\t\t\t[\"command-param-name\", \"i\"],\n\t\t\t[\"start-stop-char\", \"]\"]\n\t\t]],\n\t\t\" example\",\n\t\t[\"inline-command\", [\n\t\t\t[\"start-stop-char\", \"[\"],\n\t\t\t[\"command-param-name\", \"command\"],\n\t\t\t[\"command-params\", [\n\t\t\t\t[\"command-param-value\", \"1\"],\n\t\t\t\t[\"command-param-id\", \"danger:\"],\n\t\t\t\t[\"command-param-value\", \"true\"]\n\t\t\t]],\n\t\t\t[\"start-stop-char\", \"]\"]\n\t\t]],\n\t\t\" more text here \",\n\t\t[\"inline-command\", [\n\t\t\t[\"start-stop-char\", \"[\"],\n\t\t\t[\"command-param-name\", \"act\"],\n\t\t\t[\"command-params\", [\n\t\t\t\t[\"command-param-id\", \"danger:\"],\n\t\t\t\t[\"command-param-value\", \"false\"],\n\t\t\t\t[\"command-param-id\", \"true:\"],\n\t\t\t\t[\"command-param-value\", \"false\"]\n\t\t\t]],\n\t\t\t[\"start-stop-char\", \"]\"]\n\t\t]]\n\t]],\n\n\t[\"command\", [\n\t\t[\"command-name\", \"@action1ForTwoLinesWithCommands\"]\n\t]],\n\t[\"command\", [\n\t\t[\"command-name\", \"@action2ForTwoLinesWithCommands\"]\n\t]],\n\n\t[\"command\", [\n\t\t[\"command-name\", \"@commandAndGenericTextOnNewLine\"]\n\t]],\n\t[\"generic-text\", [\"Massa ut elementum.\"]],\n\n\t[\"command\", [\n\t\t[\"command-name\", \"@commandWithParameterAndGenericTextOnNewLine\"],\n\t\t[\"command-params\", [\n\t\t\t[\"command-param-value\", \"WideParam\"]\n\t\t]]\n\t]],\n\t[\"generic-text\", [\"Integer\"]],\n\n\t[\"generic-text\", [\n\t\t\"Escaped braces inside generic text\",\n\t\t[\"escaped-char\", \"\\\\{\"],\n\t\t\"abu\",\n\t\t[\"escaped-char\", \"\\\\}\"],\n\t\t\"nt @ >ip#s;um< @ \",\n\t\t[\"escaped-char\", \"\\\\[\"],\n\t\t\"sdff j9dj\",\n\t\t[\"escaped-char\", \"\\\\]\"]\n\t]],\n\n\t[\"bad-line\", \"UnclosedExpression{ab{cndum dui dolor tincidu{nt [s[fa]sdf [\"],\n\t[\"bad-line\", \"\\\"Integer: a = {a} malesuada a + b = {a + b}\\\", Random(a, b) = {Random(a, b)}, Random(\\\"foo\\\", \\\"bar\\\", \\\"foobar\\\") = {Random(\\\"foo\\\", \\\"bar\\\", \\\"foobar\\\")},}\"],\n\t\"\\r\\n#\\r\\n>\\r\\n@\"\n]\n\n----------------------------------------------------\n\nMixed tests of Generic Text, Commands, Inline Commands.\n"
  },
  {
    "path": "tests/languages/nasm/comment_feature.test",
    "content": ";\r\n; foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \";\"],\r\n\t[\"comment\", \"; foo\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/nasm/keyword_feature.test",
    "content": "BITS 16 BITS 32 BITS 64\r\n[BITS 16] [BITS 32] [BITS 64]\r\n\r\nsection Foo.bar\r\nsection foobar:\r\n\r\nextern _printf\r\nglobal _main\r\n\r\nCPU 8086\r\nFLOAT DAZ\r\nDEFAULT REL\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"BITS 16\"], [\"keyword\", \"BITS 32\"], [\"keyword\", \"BITS 64\"],\r\n\t[\"keyword\", \"[BITS 16]\"], [\"keyword\", \"[BITS 32]\"], [\"keyword\", \"[BITS 64]\"],\r\n\t[\"keyword\", \"section Foo.bar\"],\r\n\t[\"keyword\", \"section foobar:\"],\r\n\t[\"keyword\", \"extern _printf\"],\r\n\t[\"keyword\", \"global _main\"],\r\n\t[\"keyword\", \"CPU 8086\"],\r\n\t[\"keyword\", \"FLOAT DAZ\"],\r\n\t[\"keyword\", \"DEFAULT REL\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/nasm/label_feature.test",
    "content": "foo42:\r\n.foo:\r\n..@foo:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"label\", \"foo42:\"],\r\n\t[\"label\", \".foo:\"],\r\n\t[\"label\", \"..@foo:\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for labels."
  },
  {
    "path": "tests/languages/nasm/number_feature.test",
    "content": "0xBadFace\r\n0x4f.ab\r\n0x4p2\r\n0x2.ap-8\r\n0x1p+1\r\n\r\n0hBadFace\r\n0h4f.ab\r\n0h4p2\r\n0h2.ap-8\r\n0h1p+1\r\n42fh\r\n4ab2x\r\n\r\n$4\r\n$2a4f\r\n\r\n0o75\r\n0q75\r\n75o\r\n75q\r\n\r\n0b0101\r\n0y0101\r\n0101b\r\n0101y\r\n\r\n0d42\r\n0t42\r\n42\r\n3.14159\r\n4.2e4\r\n2e-1\r\n3.1e+2\r\n42d\r\n3.14159d\r\n4.2e4d\r\n2e-1d\r\n3.1e+2d\r\n42t\r\n3.14159t\r\n4.2e4t\r\n2e-1t\r\n3.1e+2t\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0x4f.ab\"],\r\n\t[\"number\", \"0x4p2\"],\r\n\t[\"number\", \"0x2.ap-8\"],\r\n\t[\"number\", \"0x1p+1\"],\r\n\r\n\t[\"number\", \"0hBadFace\"],\r\n\t[\"number\", \"0h4f.ab\"],\r\n\t[\"number\", \"0h4p2\"],\r\n\t[\"number\", \"0h2.ap-8\"],\r\n\t[\"number\", \"0h1p+1\"],\r\n\t[\"number\", \"42fh\"],\r\n\t[\"number\", \"4ab2x\"],\r\n\r\n\t[\"number\", \"$4\"],\r\n\t[\"number\", \"$2a4f\"],\r\n\r\n\t[\"number\", \"0o75\"],\r\n\t[\"number\", \"0q75\"],\r\n\t[\"number\", \"75o\"],\r\n\t[\"number\", \"75q\"],\r\n\r\n\t[\"number\", \"0b0101\"],\r\n\t[\"number\", \"0y0101\"],\r\n\t[\"number\", \"0101b\"],\r\n\t[\"number\", \"0101y\"],\r\n\r\n\t[\"number\", \"0d42\"],\r\n\t[\"number\", \"0t42\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"4.2e4\"],\r\n\t[\"number\", \"2e-1\"],\r\n\t[\"number\", \"3.1e+2\"],\r\n\t[\"number\", \"42d\"],\r\n\t[\"number\", \"3.14159d\"],\r\n\t[\"number\", \"4.2e4d\"],\r\n\t[\"number\", \"2e-1d\"],\r\n\t[\"number\", \"3.1e+2d\"],\r\n\t[\"number\", \"42t\"],\r\n\t[\"number\", \"3.14159t\"],\r\n\t[\"number\", \"4.2e4t\"],\r\n\t[\"number\", \"2e-1t\"],\r\n\t[\"number\", \"3.1e+2t\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/nasm/operator_feature.test",
    "content": "[ ]\r\n* + - /\r\n% < > =\r\n& | $ !\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"[\"], [\"operator\", \"]\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"<\"], [\"operator\", \">\"], [\"operator\", \"=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"|\"], [\"operator\", \"$\"], [\"operator\", \"!\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/nasm/register_feature.test",
    "content": "st0 st1\r\nxmm1 xmm2\r\nymm1 ymm2\r\nzmm1 zmm2\r\ncr1 dr1 tr1\r\nr1 r42\r\nr1b r1w r1d\r\nax bx cx dx\r\neax ebx ecx edx\r\nrax rbx rcx rdx\r\nah bh ch dh\r\nal bl cl dl\r\nbp sp si di\r\nebp esp esi edi\r\nrbp rsp rsi rdi\r\ncs ds es\r\nfs gs ss\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"register\", \"st0\"], [\"register\", \"st1\"],\r\n\t[\"register\", \"xmm1\"], [\"register\", \"xmm2\"],\r\n\t[\"register\", \"ymm1\"], [\"register\", \"ymm2\"],\r\n\t[\"register\", \"zmm1\"], [\"register\", \"zmm2\"],\r\n\t[\"register\", \"cr1\"], [\"register\", \"dr1\"], [\"register\", \"tr1\"],\r\n\t[\"register\", \"r1\"], [\"register\", \"r42\"],\r\n\t[\"register\", \"r1b\"], [\"register\", \"r1w\"], [\"register\", \"r1d\"],\r\n\t[\"register\", \"ax\"], [\"register\", \"bx\"], [\"register\", \"cx\"], [\"register\", \"dx\"],\r\n\t[\"register\", \"eax\"], [\"register\", \"ebx\"], [\"register\", \"ecx\"], [\"register\", \"edx\"],\r\n\t[\"register\", \"rax\"], [\"register\", \"rbx\"], [\"register\", \"rcx\"], [\"register\", \"rdx\"],\r\n\t[\"register\", \"ah\"], [\"register\", \"bh\"], [\"register\", \"ch\"], [\"register\", \"dh\"],\r\n\t[\"register\", \"al\"], [\"register\", \"bl\"], [\"register\", \"cl\"], [\"register\", \"dl\"],\r\n\t[\"register\", \"bp\"], [\"register\", \"sp\"], [\"register\", \"si\"], [\"register\", \"di\"],\r\n\t[\"register\", \"ebp\"], [\"register\", \"esp\"], [\"register\", \"esi\"], [\"register\", \"edi\"],\r\n\t[\"register\", \"rbp\"], [\"register\", \"rsp\"], [\"register\", \"rsi\"], [\"register\", \"rdi\"],\r\n\t[\"register\", \"cs\"], [\"register\", \"ds\"], [\"register\", \"es\"],\r\n\t[\"register\", \"fs\"], [\"register\", \"gs\"], [\"register\", \"ss\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for registers."
  },
  {
    "path": "tests/languages/nasm/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n''\r\n'fo\\'o'\r\n``\r\n`fo\\`o`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo\\\\'o'\"],\r\n\t[\"string\", \"``\"],\r\n\t[\"string\", \"`fo\\\\`o`\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/neon/boolean_feature.test",
    "content": "foo: true\r\nbar: false\r\nalt: [yes, no, YES, NO, TRUE, FALSE]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"boolean\", \"false\"],\r\n\t[\"key\", \"alt\"], [\"punctuation\", \":\"], [\"punctuation\", \"[\"],\r\n\t[\"boolean\", \"yes\"], [\"punctuation\", \",\"], [\"boolean\", \"no\"], [\"punctuation\", \",\"], [\"boolean\", \"YES\"], [\"punctuation\", \",\"], [\"boolean\", \"NO\"], [\"punctuation\", \",\"], [\"boolean\", \"TRUE\"], [\"punctuation\", \",\"], [\"boolean\", \"FALSE\"],\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n\r\n\r\n"
  },
  {
    "path": "tests/languages/neon/comment_feature.test",
    "content": "#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/neon/composite.test",
    "content": "phones: {home: 555-6528,work: 555-7334 }\r\n\r\nchildren:      # this is a comment\r\n\t- -50.5\r\n\r\nentity: Column(type=int, nulls=yes)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"key\", \"phones\"], [\"punctuation\", \":\"], [\"punctuation\", \"{\"],\r\n\t[\"key\", \"home\"], [\"punctuation\", \":\"],\r\n\t[\"literal\", \"555-6528\"], [\"punctuation\", \",\"],\r\n\t[\"key\", \"work\"], [\"punctuation\", \":\"],\r\n\t[\"literal\", \"555-7334\"], [\"punctuation\", \"}\"],\r\n\t[\"key\", \"children\"], [\"punctuation\", \":\"],\r\n\t[\"comment\", \"# this is a comment\"],\r\n\t[\"punctuation\", \"-\"], [\"number\", \"-50.5\"],\r\n\t[\"key\", \"entity\"], [\"punctuation\", \":\"],\r\n\t[\"literal\", \"Column\"], [\"punctuation\", \"(\"], [\"key\", \"type\"], [\"punctuation\", \"=\"], [\"literal\", \"int\"], [\"punctuation\", \",\"], [\"key\", \"nulls\"], [\"punctuation\", \"=\"], [\"boolean\", \"yes\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nOverall test\r\n"
  },
  {
    "path": "tests/languages/neon/datetime_feature.test",
    "content": "canonical: 2001-12-15T02:59:43.1Z\r\niso8601: 2001-12-14t21:59:43.10-05:00\r\nspaced: 2001-12-14 21:59:43.10 -5\r\ndate: 2002-12-14\r\nshort: 2002-1-1\r\nalt: 2016-06-03 19:00:00 +0200\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"key\", \"canonical\"], [\"punctuation\", \":\"],\r\n\t[\"datetime\", \"2001-12-15T02:59:43.1Z\"],\r\n\t[\"key\", \"iso8601\"], [\"punctuation\", \":\"],\r\n\t[\"datetime\", \"2001-12-14t21:59:43.10-05:00\"],\r\n\t[\"key\", \"spaced\"], [\"punctuation\", \":\"],\r\n\t[\"datetime\", \"2001-12-14 21:59:43.10 -5\"],\r\n\t[\"key\", \"date\"], [\"punctuation\", \":\"],\r\n\t[\"datetime\", \"2002-12-14\"],\r\n\t[\"key\", \"short\"], [\"punctuation\", \":\"],\r\n\t[\"datetime\", \"2002-1-1\"],\r\n\t[\"key\", \"alt\"], [\"punctuation\", \":\"], [\"datetime\", \"2016-06-03 19:00:00 +0200\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for dates and datetimes."
  },
  {
    "path": "tests/languages/neon/json_feature.test",
    "content": "[\r\n\t[true,false, null],\r\n{\r\n\t\"A\": \"/*\",\r\n\t\"B\": \"B\",\r\n\t\"foo\": 1,\r\n\t\"b\\\"ar\":{\"bar\":1},\r\n\t\"baz\":\"\\\"\"\r\n},\r\n\t[0, 123, 3.14159, 5.0e8, 0.2E+2, 47e-5],\r\n\t[\r\n\t\"\" , \"foo\\\"bar\\\"baz\", \"\\u2642\\\\ \"\r\n\t]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"[\"], [\"boolean\", \"true\"], [\"punctuation\", \",\"], [\"boolean\", \"false\"], [\"punctuation\", \",\"], [\"null\", \"null\"], [\"punctuation\", \"]\"], [\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\t[\"string\", \"\\\"A\\\"\"], [\"punctuation\", \":\"], [\"string\", \"\\\"/*\\\"\"], [\"punctuation\", \",\"],\r\n\t\t[\"string\", \"\\\"B\\\"\"], [\"punctuation\", \":\"], [\"string\", \"\\\"B\\\"\"], [\"punctuation\", \",\"],\r\n\t\t[\"string\", \"\\\"foo\\\"\"], [\"punctuation\", \":\"], [\"number\", \"1\"], [\"punctuation\", \",\"],\r\n\t\t[\"string\", \"\\\"b\\\\\\\"ar\\\"\"], [\"punctuation\", \":\"],[\"punctuation\", \"{\"], [\"string\", \"\\\"bar\\\"\"], [\"punctuation\", \":\"], [\"number\", \"1\"], [\"punctuation\", \"}\"], [\"punctuation\", \",\"],\r\n\t\t[\"string\", \"\\\"baz\\\"\"], [\"punctuation\", \":\"], [\"string\", \"\\\"\\\\\\\"\\\"\"],\r\n\t[\"punctuation\", \"}\"], [\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\t[\"number\", \"0\"], [\"punctuation\", \",\"], [\"number\", \"123\"], [\"punctuation\", \",\"], [\"number\", \"3.14159\"], [\"punctuation\", \",\"], [\"number\", \"5.0e8\"], [\"punctuation\", \",\"], [\"number\", \"0.2E+2\"], [\"punctuation\", \",\"], [\"number\", \"47e-5\"],\r\n\t[\"punctuation\", \"]\"], [\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"[\"], \r\n\t\t[\"string\", \"\\\"\\\"\"], [\"punctuation\", \",\"], [\"string\", \"\\\"foo\\\\\\\"bar\\\\\\\"baz\\\"\"], [\"punctuation\", \",\"], [\"string\", \"\\\"\\\\u2642\\\\\\\\ \\\"\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n\r\n----------------------------------------------------\r\n\r\nChecks for JSON superset.\r\n"
  },
  {
    "path": "tests/languages/neon/key_feature.test",
    "content": "foo: 4\r\nFooBar : 5\r\nalt=6\r\nalt2 = 7\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"], [\"number\", \"4\"],\r\n\t[\"key\", \"FooBar\"], [\"punctuation\", \":\"], [\"number\", \"5\"],\r\n\t[\"key\", \"alt\"], [\"punctuation\", \"=\"], [\"number\", \"6\"],\r\n\t[\"key\", \"alt2\"], [\"punctuation\", \"=\"], [\"number\", \"7\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keys."
  },
  {
    "path": "tests/languages/neon/literal_feature.test",
    "content": "foo: hello:abc\r\nbar: @test\\x\\b\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"literal\",\"hello:abc\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"literal\",\"@test\\\\x\\\\b\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for literals.\r\n"
  },
  {
    "path": "tests/languages/neon/null_feature.test",
    "content": "foo: null\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"null\", \"null\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for null."
  },
  {
    "path": "tests/languages/neon/number_feature.test",
    "content": "foo: 0xBadFace\r\nbar: 0o754\r\nbaz: 42\r\nfoo: 3.14159\r\nbar: 4e8\r\nbaz: 3.1E-7\r\nfoo: 0.4e+2\r\nbar: -0xFF\r\nbaz: +0o123\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"0o754\"],\r\n\t[\"key\", \"baz\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"4e8\"],\r\n\t[\"key\", \"baz\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"3.1E-7\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"0.4e+2\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"-0xFF\"],\r\n\t[\"key\", \"baz\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"+0o123\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/neon/string_feature.test",
    "content": "foo: \"\"\r\nbar: \"fo\\\"obar\"\r\nfoo: ''\r\nfoo: \"foo\" # bar\r\nbar: 'bar' # foo\r\nmulti: '''\r\n\tone line\r\n\tsecond line\r\n\tthird line\r\n'''\r\nmulti: \"\"\"\r\n\tone line\r\n\tsecond line\r\n\tthird line\r\n\"\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"\\\"foo\\\"\"], [\"comment\", \"# bar\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"'bar'\"], [\"comment\", \"# foo\"],\r\n\t[\"key\", \"multi\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"'''\\r\\n\\tone line\\r\\n\\tsecond line\\r\\n\\tthird line\\r\\n'''\"],\r\n\t[\"key\", \"multi\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"\\\"\\\"\\\"\\r\\n\\tone line\\r\\n\\tsecond line\\r\\n\\tthird line\\r\\n\\\"\\\"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/nevod/comment_feature.test",
    "content": "/* Comment */\r\n/* Multi-line\r\ncomment */\r\n/**/\r\n//\r\n// Single-line comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/* Comment */\"],\r\n\t[\"comment\", \"/* Multi-line\\r\\ncomment */\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// Single-line comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/nevod/full_feature.test",
    "content": "@namespace Basic\n{\n  @search @pattern Url(Domain, Path, Query, Anchor) =\n    Method + Domain:Url.Domain + ?Port + ?Path:Url.Path +\n    ?Query:Url.Query + ?Anchor:Url.Anchor\n  @where {\n    Method = {'http', 'https' , 'ftp', 'mailto', 'file', 'data',\n      'irc'} + '://';\n    Domain = Word + [1+ '.' + Word + [0+ {Word, '_', '-'}]];\n    Port = ':' + Num;\n    Path = ?'/' + [0+ {Word, '/', '_', '+', '-', '%', '.'}];\n\n    Query = '?' + ?(Param + [0+ '&' + Param])\n    @where\n    {\n      Param = Identifier + '=' + Identifier\n      @where\n      {\n        Identifier = {Alpha, AlphaNum, '_'} + [0+ {Word, '_'}];\n      };\n    };\n\n    Anchor(Value) = '#' + Value:{Word};\n  };\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"@namespace\"],\n\t[\"namespace\", \"Basic\"],\n\n\t[\"operator\", \"{\"],\n\n\t[\"keyword\", \"@search\"],\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"Url\"],\n\t\t[\"fields\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"field-name\", \"Domain\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"field-name\", \"Path\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"field-name\", \"Query\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"field-name\", \"Anchor\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"operator\", \"=\"],\n\n\t[\"name\", \"Method\"],\n\t[\"operator\", \"+\"],\n\t[\"field-capture\", [\n\t\t[\"field-name\", \"Domain\"],\n\t\t[\"colon\", \":\"]\n\t]],\n\t[\"name\", \"Url.Domain\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"?\"],\n\t[\"name\", \"Port\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"?\"],\n\t[\"field-capture\", [\n\t\t[\"field-name\", \"Path\"],\n\t\t[\"colon\", \":\"]\n\t]],\n\t[\"name\", \"Url.Path\"],\n\t[\"operator\", \"+\"],\n\n\t[\"operator\", \"?\"],\n\t[\"field-capture\", [\n\t\t[\"field-name\", \"Query\"],\n\t\t[\"colon\", \":\"]\n\t]],\n\t[\"name\", \"Url.Query\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"?\"],\n\t[\"field-capture\", [\n\t\t[\"field-name\", \"Anchor\"],\n\t\t[\"colon\", \":\"]\n\t]],\n\t[\"name\", \"Url.Anchor\"],\n\n\t[\"keyword\", \"@where\"],\n\t[\"operator\", \"{\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"Method\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"{\"],\n\t[\"string\", [\"'http'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'https'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'ftp'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'mailto'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'file'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'data'\"]],\n\t[\"punctuation\", \",\"],\n\n\t[\"string\", [\"'irc'\"]],\n\t[\"operator\", \"}\"],\n\t[\"operator\", \"+\"],\n\t[\"string\", [\"'://'\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"Domain\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"]\n\t]],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"[\"],\n\t[\"quantifier\", \"1+\"],\n\t[\"string\", [\"'.'\"]],\n\t[\"operator\", \"+\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"]\n\t]],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"[\"],\n\t[\"quantifier\", \"0+\"],\n\t[\"operator\", \"{\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"]\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'_'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'-'\"]],\n\t[\"operator\", \"}\"],\n\t[\"operator\", \"]\"],\n\t[\"operator\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"Port\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"string\", [\"':'\"]],\n\t[\"operator\", \"+\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Num\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"Path\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"?\"],\n\t[\"string\", [\"'/'\"]],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"[\"],\n\t[\"quantifier\", \"0+\"],\n\t[\"operator\", \"{\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"]\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'/'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'_'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'+'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'-'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'%'\"]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'.'\"]],\n\t[\"operator\", \"}\"],\n\t[\"operator\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"Query\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"string\", [\"'?'\"]],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"?\"],\n\t[\"punctuation\", \"(\"],\n\t[\"name\", \"Param\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"[\"],\n\t[\"quantifier\", \"0+\"],\n\t[\"string\", [\"'&'\"]],\n\t[\"operator\", \"+\"],\n\t[\"name\", \"Param\"],\n\t[\"operator\", \"]\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"@where\"],\n\n\t[\"operator\", \"{\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"Param\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"name\", \"Identifier\"],\n\t[\"operator\", \"+\"],\n\t[\"string\", [\"'='\"]],\n\t[\"operator\", \"+\"],\n\t[\"name\", \"Identifier\"],\n\n\t[\"keyword\", \"@where\"],\n\n\t[\"operator\", \"{\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"Identifier\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"{\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Alpha\"]\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"AlphaNum\"]\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'_'\"]],\n\t[\"operator\", \"}\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"[\"],\n\t[\"quantifier\", \"0+\"],\n\t[\"operator\", \"{\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"]\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", [\"'_'\"]],\n\t[\"operator\", \"}\"],\n\t[\"operator\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"operator\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"operator\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"Anchor\"],\n\t\t[\"fields\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"field-name\", \"Value\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"string\", [\"'#'\"]],\n\t[\"operator\", \"+\"],\n\t[\"field-capture\", [\n\t\t[\"field-name\", \"Value\"],\n\t\t[\"colon\", \":\"]\n\t]],\n\t[\"operator\", \"{\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"]\n\t]],\n\t[\"operator\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"operator\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"operator\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/nevod/keyword_feature.test",
    "content": "@require @namespace @pattern @search\r\n@inside @outside @having\r\n@where\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"@require\"], [\"keyword\", \"@namespace\"], [\"keyword\", \"@pattern\"], [\"keyword\", \"@search\"], \r\n\t[\"keyword\", \"@inside\"], [\"keyword\", \"@outside\"], [\"keyword\", \"@having\"],\r\n\t[\"keyword\", \"@where\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/nevod/operator_feature.test",
    "content": "( , ) ;\r\n+ _\r\n.. ...\r\n[ 0-5 ]\r\n&\r\n~\r\n?\r\n{}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"punctuation\", \",\"], [\"punctuation\", \")\"], [\"punctuation\", \";\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"_\"],\r\n\t[\"operator\", \"..\"], [\"operator\", \"...\"],\r\n\t[\"operator\", \"[\"], [\"quantifier\", \"0-5\"], [\"operator\", \"]\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"{\"], [\"operator\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/nevod/package_feature.test",
    "content": "@namespace Basic\n{\n  @search @pattern GUID = Word(8) + [3 '-' + Word(4)] + '-' + Word(12);\n}\n\n@require \"GUID.np\";\n\n@namespace Basic\n{\n  @search @pattern GUID-in-Braces = '{' + GUID + '}';\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"@namespace\"],\n\t[\"namespace\", \"Basic\"],\n\n\t[\"operator\", \"{\"],\n\n\t[\"keyword\", \"@search\"],\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"GUID\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"quantifier\", \"8\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"[\"],\n\t[\"quantifier\", \"3\"],\n\t[\"string\", [\"'-'\"]],\n\t[\"operator\", \"+\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"quantifier\", \"4\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"operator\", \"]\"],\n\t[\"operator\", \"+\"],\n\t[\"string\", [\"'-'\"]],\n\t[\"operator\", \"+\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"quantifier\", \"12\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"operator\", \"}\"],\n\n\t[\"keyword\", \"@require\"], [\"string\", [\"\\\"GUID.np\\\"\"]], [\"punctuation\", \";\"],\n\n\t[\"keyword\", \"@namespace\"],\n\t[\"namespace\", \"Basic\"],\n\n\t[\"operator\", \"{\"],\n\n\t[\"keyword\", \"@search\"],\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"GUID-in-Braces\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"string\", [\"'{'\"]],\n\t[\"operator\", \"+\"],\n\t[\"name\", \"GUID\"],\n\t[\"operator\", \"+\"],\n\t[\"string\", [\"'}'\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"operator\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/nevod/pattern_feature.test",
    "content": "P = \"text\";\nP = Alpha;\nP2 = P1; P1 = Word;\nP = A + B;\nP = {A, B};\nP = [1+ A];\n\n#P = \"text\";\n\n@pattern P = Alpha;\n@search @pattern P = Alpha;\n@pattern P = W @where { @pattern W = Word; };\n@pattern #P = W + S @where { @pattern #W = Word; @pattern S = Space; };\n\n#P(X, Y) = X: A ... Y: B;\n#P(X) = A .. X .. B;\n#P1(X, Y) = P2(X: Q, Y: S);\n#P(X) = X: Word ... X;\n#P(X, Y) = {X: Punct + X, Y: Symbol + Y};\n\n----------------------------------------------------\n\n[\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"P\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"string\", [\"\\\"text\\\"\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"P\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Alpha\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"P2\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"name\", \"P1\"],\n\t[\"punctuation\", \";\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"P1\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"P\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"name\", \"A\"],\n\t[\"operator\", \"+\"],\n\t[\"name\", \"B\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"P\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"{\"],\n\t[\"name\", \"A\"],\n\t[\"punctuation\", \",\"],\n\t[\"name\", \"B\"],\n\t[\"operator\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"P\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"[\"],\n\t[\"quantifier\", \"1+\"],\n\t[\"name\", \"A\"],\n\t[\"operator\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"#P\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"string\", [\"\\\"text\\\"\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"P\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Alpha\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"@search\"],\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"P\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Alpha\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"P\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"name\", \"W\"],\n\t[\"keyword\", \"@where\"],\n\t[\"operator\", \"{\"],\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"W\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"operator\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"#P\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"name\", \"W\"],\n\t[\"operator\", \"+\"],\n\t[\"name\", \"S\"],\n\t[\"keyword\", \"@where\"],\n\t[\"operator\", \"{\"],\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"#W\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"S\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Space\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"operator\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"#P\"],\n\t\t[\"fields\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"field-name\", \"X\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"field-name\", \"Y\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"field-capture\", [\n\t\t[\"field-name\", \"X\"],\n\t\t[\"colon\", \":\"]\n\t]],\n\t[\"name\", \"A\"],\n\t[\"operator\", \"...\"],\n\t[\"field-capture\", [\n\t\t[\"field-name\", \"Y\"],\n\t\t[\"colon\", \":\"]\n\t]],\n\t[\"name\", \"B\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"#P\"],\n\t\t[\"fields\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"field-name\", \"X\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"name\", \"A\"],\n\t[\"operator\", \"..\"],\n\t[\"name\", \"X\"],\n\t[\"operator\", \"..\"],\n\t[\"name\", \"B\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"#P1\"],\n\t\t[\"fields\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"field-name\", \"X\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"field-name\", \"Y\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"name\", \"P2\"],\n\t[\"punctuation\", \"(\"],\n\t[\"field-capture\", [\n\t\t[\"field-name\", \"X\"],\n\t\t[\"colon\", \":\"],\n\t\t[\"field-name\", \"Q\"],\n\t\t\", \",\n\t\t[\"field-name\", \"Y\"],\n\t\t[\"colon\", \":\"],\n\t\t[\"field-name\", \"S\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"#P\"],\n\t\t[\"fields\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"field-name\", \"X\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"field-capture\", [\n\t\t[\"field-name\", \"X\"],\n\t\t[\"colon\", \":\"]\n\t]],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Word\"]\n\t]],\n\t[\"operator\", \"...\"],\n\t[\"name\", \"X\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"#P\"],\n\t\t[\"fields\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"field-name\", \"X\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"field-name\", \"Y\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"{\"],\n\t[\"field-capture\", [\n\t\t[\"field-name\", \"X\"],\n\t\t[\"colon\", \":\"]\n\t]],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Punct\"]\n\t]],\n\t[\"operator\", \"+\"],\n\t[\"name\", \"X\"],\n\t[\"punctuation\", \",\"],\n\t[\"field-capture\", [\n\t\t[\"field-name\", \"Y\"],\n\t\t[\"colon\", \":\"]\n\t]],\n\t[\"standard-pattern\", [\n\t\t[\"standard-pattern-name\", \"Symbol\"]\n\t]],\n\t[\"operator\", \"+\"],\n\t[\"name\", \"Y\"],\n\t[\"operator\", \"}\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/nevod/search_feature.test",
    "content": "@namespace Basic\n{\n  @search @pattern GUID-in-Braces = '{' + GUID + '}';\n}\n\n@search Basic.GUID;\n@search Basic.GUID-in-Braces;\n\n@namespace Basic\n{\n  @pattern GUID-in-Braces = '{' + GUID + '}';\n}\n\n@require \"GUID.np\";\n\n@search Basic.*;\n\n@namespace Basic\n{\n  @pattern GUID-in-Braces = '{' + GUID + '}';\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"@namespace\"],\n\t[\"namespace\", \"Basic\"],\n\n\t[\"operator\", \"{\"],\n\n\t[\"keyword\", \"@search\"],\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"GUID-in-Braces\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"string\", [\"'{'\"]],\n\t[\"operator\", \"+\"],\n\t[\"name\", \"GUID\"],\n\t[\"operator\", \"+\"],\n\t[\"string\", [\"'}'\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"operator\", \"}\"],\n\n\t[\"keyword\", \"@search\"],\n\t[\"search\", \"Basic.GUID\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"@search\"],\n\t[\"search\", \"Basic.GUID-in-Braces\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"@namespace\"],\n\t[\"namespace\", \"Basic\"],\n\n\t[\"operator\", \"{\"],\n\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"GUID-in-Braces\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"string\", [\"'{'\"]],\n\t[\"operator\", \"+\"],\n\t[\"name\", \"GUID\"],\n\t[\"operator\", \"+\"],\n\t[\"string\", [\"'}'\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"operator\", \"}\"],\n\n\t[\"keyword\", \"@require\"], [\"string\", [\"\\\"GUID.np\\\"\"]], [\"punctuation\", \";\"],\n\n\t[\"keyword\", \"@search\"], [\"search\", \"Basic.*\"], [\"punctuation\", \";\"],\n\n\t[\"keyword\", \"@namespace\"],\n\t[\"namespace\", \"Basic\"],\n\n\t[\"operator\", \"{\"],\n\n\t[\"keyword\", \"@pattern\"],\n\t[\"pattern\", [\n\t\t[\"pattern-name\", \"GUID-in-Braces\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"string\", [\"'{'\"]],\n\t[\"operator\", \"+\"],\n\t[\"name\", \"GUID\"],\n\t[\"operator\", \"+\"],\n\t[\"string\", [\"'}'\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"operator\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/nevod/string_feature.test",
    "content": "\"text in double quotes\"\r\n\"\"\r\n'text in single quotes'\r\n'case-sensitive text'!\r\n'text ''Nevod'' in quotes'\r\n\"text \"\"Nevod\"\" in double quotes\"\r\n'text prefix'*\r\n'case-sensitive text prefix'!*\r\n''\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"text in double quotes\\\"\"]],\r\n\t[\"string\", [\"\\\"\\\"\"]],\r\n\t[\"string\", [\"'text in single quotes'\"]],\r\n\t[\"string\", [\"'case-sensitive text'\", [\"string-attrs\", \"!\"]]],\r\n\t[\"string\", [\"'text ''Nevod'' in quotes'\"]],\r\n\t[\"string\", [\"\\\"text \\\"\\\"Nevod\\\"\\\" in double quotes\\\"\"]],\r\n\t[\"string\", [\"'text prefix'\", [\"string-attrs\", \"*\"]]],\r\n\t[\"string\", [\"'case-sensitive text prefix'\", [\"string-attrs\", \"!*\"]]],\r\n\t[\"string\", [\"''\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for various text strings."
  },
  {
    "path": "tests/languages/nginx/boolean_feature.test",
    "content": "ssi on;\r\nsendfile      off;\r\ntcp_nopush    on;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"ssi\"],\r\n\t\t[\"boolean\", \"on\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"sendfile\"],\r\n\t\t[\"boolean\", \"off\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"tcp_nopush\"],\r\n\t\t[\"boolean\", \"on\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/nginx/comment_feature.test",
    "content": "#\r\n# Foobar\r\n\r\nhttp {# This must be recognized as a comment\r\n}\r\n\r\nevents # A comment\r\n{\r\n    worker_connections 512;\r\n}\r\n\r\n# A comment\r\n\r\nhttp# This is not a comment. There is no space\r\n{\r\n    server {# A comment\r\n        listen 80;# A comment\r\n\r\n        location = \"/example1\" # This is a comment. There is a space\r\n        {# This is a comment after \"{\". No spaces required\r\n            return 200 \"Hello, world!\";# This is a comment after \";\". No spaces required\r\n        }# This is a comment after \"}\". No spaces required\r\n\r\n        location = /example2 # This is a comment. There is a space\r\n        {}\r\n\r\n        location = \"/example3\"# This is not a comment. There is no space\r\n        {}\r\n\r\n        location = /example4# This is not a comment. There is no space\r\n        {}\r\n    }# A comment\r\n}\r\n\r\nlocation = \"/example\"# This is NOT a comment. There is no space\r\n{}\r\n\r\nlocation = /example# This is NOT a comment. There is no space\r\n{}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# Foobar\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"http\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"comment\", \"# This must be recognized as a comment\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"events\"],\r\n\t\t[\"comment\", \"# A comment\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"worker_connections\"],\r\n\t\t[\"number\", \"512\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"comment\", \"# A comment\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"http#\"],\r\n\t\t\" This is not a comment. There is no space\"\r\n\t]],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"server\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"comment\", \"# A comment\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"listen\"],\r\n\t\t[\"number\", \"80\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"# A comment\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"location\"],\r\n\t\t\" = \",\r\n\t\t[\"string\", [\"\\\"/example1\\\"\"]],\r\n\t\t[\"comment\", \"# This is a comment. There is a space\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"comment\", \"# This is a comment after \\\"{\\\". No spaces required\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"return\"],\r\n\t\t[\"number\", \"200\"],\r\n\t\t[\"string\", [\"\\\"Hello, world!\\\"\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"# This is a comment after \\\";\\\". No spaces required\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"comment\", \"# This is a comment after \\\"}\\\". No spaces required\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"location\"],\r\n\t\t\" = /example2 \",\r\n\t\t[\"comment\", \"# This is a comment. There is a space\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"location\"],\r\n\t\t\" = \",\r\n\t\t[\"string\", [\"\\\"/example3\\\"\"]],\r\n\t\t\"# This is not a comment. There is no space\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"location\"],\r\n\t\t\" = /example4# This is not a comment. There is no space\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"], [\"comment\", \"# A comment\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"location\"],\r\n\t\t\" = \",\r\n\t\t[\"string\", [\"\\\"/example\\\"\"]],\r\n\t\t\"# This is NOT a comment. There is no space\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"location\"],\r\n\t\t\" = /example# This is NOT a comment. There is no space\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/nginx/directive_feature.test",
    "content": "name parameter1;\r\nname \"parameter1\";\r\nname parameter1 parameter2;\r\nname parameter1 \"parameter2\";\r\nname \"parameter1\" parameter2;\r\nname para\\;meter1;\r\nname \"para;meter1\";\r\nname \"para\\;meter1\";\r\ninternal;\r\ninternal    ;\r\n\r\n# A multiline parameter\r\nname \"para\r\n\r\nmeter1\";\r\n\r\nname {\r\n    name parameter1  'parameter2' \\; par#ameter3;\r\n    name parameter1 \\\" 'he\"llo' par#ameter2;\r\n    name parameter1; name parameter1;\r\n    name parameter1 \\{ 'hello';\r\n    name {\r\n        internal;\r\n        name parameter1 parameter2;\r\n    }\r\n}\r\n\r\nname \"#foo\"; name; #bar\r\nname \" #foo\"; #bar\r\nname ';oh no' parameter;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t\" parameter1\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t[\"string\", [\"\\\"parameter1\\\"\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t\" parameter1 parameter2\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t\" parameter1 \",\r\n\t\t[\"string\", [\"\\\"parameter2\\\"\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t[\"string\", [\"\\\"parameter1\\\"\"]],\r\n\t\t\" parameter2\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t\" para\\\\;meter1\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t[\"string\", [\"\\\"para;meter1\\\"\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t[\"string\", [\"\\\"para\\\\;meter1\\\"\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"internal\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"internal\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"# A multiline parameter\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t[\"string\", [\"\\\"para\\r\\n\\r\\nmeter1\\\"\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t\" parameter1  \",\r\n\t\t[\"string\", [\"'parameter2'\"]],\r\n\t\t\" \\\\; par#ameter3\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t\" parameter1 \\\\\\\" \",\r\n\t\t[\"string\", [\"'he\\\"llo'\"]],\r\n\t\t\" par#ameter2\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t\" parameter1\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t\" parameter1\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t\" parameter1 \\\\{ \",\r\n\t\t[\"string\", [\"'hello'\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"internal\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t\" parameter1 parameter2\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t[\"string\", [\"\\\"#foo\\\"\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"#bar\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t[\"string\", [\"\\\" #foo\\\"\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"#bar\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"name\"],\r\n\t\t[\"string\", [\"';oh no'\"]],\r\n\t\t\" parameter\"\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]"
  },
  {
    "path": "tests/languages/nginx/number_feature.test",
    "content": "worker_connections  4096;\r\nexpires 30d;\r\n\r\nclient_max_body_size    10m;\r\nclient_body_buffer_size 128k;\r\nproxy_connect_timeout   90;\r\nproxy_send_timeout      90;\r\nproxy_read_timeout      90;\r\nproxy_buffers           32 4k;\r\n\r\nkeepalive_timeout  75 20;\r\nreturn 404;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"worker_connections\"],\r\n\t\t[\"number\", \"4096\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"expires\"],\r\n\t\t[\"number\", \"30d\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"client_max_body_size\"],\r\n\t\t[\"number\", \"10m\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"client_body_buffer_size\"],\r\n\t\t[\"number\", \"128k\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"proxy_connect_timeout\"],\r\n\t\t[\"number\", \"90\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"proxy_send_timeout\"],\r\n\t\t[\"number\", \"90\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"proxy_read_timeout\"],\r\n\t\t[\"number\", \"90\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"proxy_buffers\"],\r\n\t\t[\"number\", \"32\"],\r\n\t\t[\"number\", \"4k\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"keepalive_timeout\"],\r\n\t\t[\"number\", \"75\"],\r\n\t\t[\"number\", \"20\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"return\"],\r\n\t\t[\"number\", \"404\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]"
  },
  {
    "path": "tests/languages/nginx/string_feature.test",
    "content": "foo \"\";\r\nfoo '';\r\nfoo \"foo\r\nbar\";\r\nfoo 'foo\r\nbar';\r\n\r\nfoo \" \\\" \\' \\\\ \\r \\n \\t\";\r\nfoo ' \\\" \\' \\\\ \\r \\n \\t';\r\n\r\nfoo \"$foo\";\r\nfoo \"${foo}bar\";\r\nfoo \"$arg_;\";\r\n\r\n# not escaped\r\nfoo \"\\$foo\";\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"string\", [\"\\\"\\\"\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"string\", [\"''\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"string\", [\"\\\"foo\\r\\nbar\\\"\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"string\", [\"'foo\\r\\nbar'\"]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\" \",\r\n\t\t\t[\"escape\", \"\\\\\\\"\"],\r\n\t\t\t[\"escape\", \"\\\\'\"],\r\n\t\t\t[\"escape\", \"\\\\\\\\\"],\r\n\t\t\t[\"escape\", \"\\\\r\"],\r\n\t\t\t[\"escape\", \"\\\\n\"],\r\n\t\t\t[\"escape\", \"\\\\t\"],\r\n\t\t\t\"\\\"\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"' \",\r\n\t\t\t[\"escape\", \"\\\\\\\"\"],\r\n\t\t\t[\"escape\", \"\\\\'\"],\r\n\t\t\t[\"escape\", \"\\\\\\\\\"],\r\n\t\t\t[\"escape\", \"\\\\r\"],\r\n\t\t\t[\"escape\", \"\\\\n\"],\r\n\t\t\t[\"escape\", \"\\\\t\"],\r\n\t\t\t\"'\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"\",\r\n\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\"\\\"\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"\",\r\n\t\t\t[\"variable\", \"${foo}\"],\r\n\t\t\t\"bar\\\"\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"\",\r\n\t\t\t[\"variable\", \"$arg_;\"],\r\n\t\t\t\"\\\"\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"# not escaped\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"\\\\\",\r\n\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\"\\\"\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]"
  },
  {
    "path": "tests/languages/nginx/variable_feature.test",
    "content": "foo $host;\r\nfoo $geoip_city_country_code3\r\nset $0 foo;\r\nset $_ foo;\r\nset $arg_? foo;\r\n\r\n# real example\r\n\r\nlog_format main      '$remote_addr - $remote_user [$time_local]  '\r\n  '\"$request\" $status $bytes_sent '\r\n  '\"$http_referer\" \"$http_user_agent\" '\r\n  '\"$gzip_ratio\"';\r\n\r\nlocation / {\r\n    ssi on;\r\n    set $inc $request_uri;\r\n    if (!-f $request_filename) {\r\n        rewrite ^ /index.html last;\r\n    }\r\n    if (!-f $document_root$inc.html) {\r\n        return 404;\r\n    }\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"variable\", \"$host\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"foo\"], [\"variable\", \"$geoip_city_country_code3\"],\r\n\t\t\"\\r\\nset \", [\"variable\", \"$0\"], \" foo\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"set\"],\r\n\t\t[\"variable\", \"$_\"],\r\n\t\t\" foo\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"set\"],\r\n\t\t[\"variable\", \"$arg_?\"],\r\n\t\t\" foo\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"# real example\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"log_format\"],\r\n\t\t\" main      \",\r\n\t\t[\"string\", [\r\n\t\t\t\"'\",\r\n\t\t\t[\"variable\", \"$remote_addr\"],\r\n\t\t\t\" - \",\r\n\t\t\t[\"variable\", \"$remote_user\"],\r\n\t\t\t\" [\",\r\n\t\t\t[\"variable\", \"$time_local]\"],\r\n\t\t\t\"  '\"\r\n\t\t]],\r\n\r\n\t\t[\"string\", [\r\n\t\t\t\"'\\\"\",\r\n\t\t\t[\"variable\", \"$request\"],\r\n\t\t\t\"\\\" \",\r\n\t\t\t[\"variable\", \"$status\"],\r\n\t\t\t[\"variable\", \"$bytes_sent\"],\r\n\t\t\t\" '\"\r\n\t\t]],\r\n\r\n\t\t[\"string\", [\r\n\t\t\t\"'\\\"\",\r\n\t\t\t[\"variable\", \"$http_referer\"],\r\n\t\t\t\"\\\" \\\"\",\r\n\t\t\t[\"variable\", \"$http_user_agent\"],\r\n\t\t\t\"\\\" '\"\r\n\t\t]],\r\n\r\n\t\t[\"string\", [\r\n\t\t\t\"'\\\"\",\r\n\t\t\t[\"variable\", \"$gzip_ratio\"],\r\n\t\t\t\"\\\"'\"\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"location\"],\r\n\t\t\" /\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"ssi\"],\r\n\t\t[\"boolean\", \"on\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"set\"],\r\n\t\t[\"variable\", \"$inc\"],\r\n\t\t[\"variable\", \"$request_uri\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t\" (!-f \",\r\n\t\t[\"variable\", \"$request_filename\"],\r\n\t\t\")\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"rewrite\"],\r\n\t\t\" ^ /index.html last\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t\" (!-f \",\r\n\t\t[\"variable\", \"$document_root\"],\r\n\t\t[\"variable\", \"$inc\"],\r\n\t\t\".html)\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", \"return\"],\r\n\t\t[\"number\", \"404\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables.\r\n"
  },
  {
    "path": "tests/languages/nim/char_feature.test",
    "content": "'\\''\n'\\xFC'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'\\\\''\"],\n\t[\"char\", \"'\\\\xFC'\"]\n]\n"
  },
  {
    "path": "tests/languages/nim/comment_feature.test",
    "content": "#\r\n# Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/nim/function_feature.test",
    "content": "fo\\x9ao(\r\nclass*(\r\ntakeV[T](\r\n`$`(\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", [\"fo\\\\x9ao\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"function\", [\r\n\t\t\"class\",\r\n\t\t[\"operator\", \"*\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"function\", [\"takeV[T]\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"function\", [\"`$`\"]],\r\n\t[\"punctuation\", \"(\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/nim/identifier_feature.test",
    "content": "var `var` = 42\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"var\"],\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"var\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"42\"]\n]\n"
  },
  {
    "path": "tests/languages/nim/keyword_feature.test",
    "content": "addr\r\nas\r\nasm\r\natomic\r\nbind\r\nblock\r\nbreak\r\ncase\r\ncast\r\nconcept\r\nconst\r\ncontinue\r\nconverter\r\ndefer\r\ndiscard\r\ndistinct\r\ndo\r\nelif\r\nelse\r\nend\r\nenum\r\nexcept\r\nexport\r\nfinally\r\nfor\r\nfrom\r\nfunc\r\ngeneric\r\nif\r\nimport\r\ninclude\r\ninterface\r\niterator\r\nlet\r\nmacro\r\nmethod\r\nmixin\r\nnil\r\nobject\r\nout\r\nproc\r\nptr\r\nraise\r\nref\r\nreturn\r\nstatic\r\ntemplate\r\ntry\r\ntuple\r\ntype\r\nusing\r\nvar\r\nwhen\r\nwhile\r\nwith\r\nwithout\r\nyield\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"addr\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"asm\"],\r\n\t[\"keyword\", \"atomic\"],\r\n\t[\"keyword\", \"bind\"],\r\n\t[\"keyword\", \"block\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"cast\"],\r\n\t[\"keyword\", \"concept\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"converter\"],\r\n\t[\"keyword\", \"defer\"],\r\n\t[\"keyword\", \"discard\"],\r\n\t[\"keyword\", \"distinct\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"elif\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"except\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"keyword\", \"func\"],\r\n\t[\"keyword\", \"generic\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"keyword\", \"iterator\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"macro\"],\r\n\t[\"keyword\", \"method\"],\r\n\t[\"keyword\", \"mixin\"],\r\n\t[\"keyword\", \"nil\"],\r\n\t[\"keyword\", \"object\"],\r\n\t[\"keyword\", \"out\"],\r\n\t[\"keyword\", \"proc\"],\r\n\t[\"keyword\", \"ptr\"],\r\n\t[\"keyword\", \"raise\"],\r\n\t[\"keyword\", \"ref\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"template\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"tuple\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"using\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"keyword\", \"without\"],\r\n\t[\"keyword\", \"yield\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/nim/number_feature.test",
    "content": "0xBad_Face\r\n0o754_173\r\n0B1111_0000\r\n42_000\r\n3.14_15_9\r\n3E7\r\n0.5e-84_741\r\n9.8e+54\r\n9000'u\r\n2'i16\r\n2i16\r\n0xfe'f32\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0xBad_Face\"],\r\n\t[\"number\", \"0o754_173\"],\r\n\t[\"number\", \"0B1111_0000\"],\r\n\t[\"number\", \"42_000\"],\r\n\t[\"number\", \"3.14_15_9\"],\r\n\t[\"number\", \"3E7\"],\r\n\t[\"number\", \"0.5e-84_741\"],\r\n\t[\"number\", \"9.8e+54\"],\r\n\t[\"number\", \"9000'u\"],\r\n\t[\"number\", \"2'i16\"],\r\n\t[\"number\", \"2i16\"],\r\n\t[\"number\", \"0xfe'f32\"]\r\n]\r\n\r\n----------------------------------------------------\r\n"
  },
  {
    "path": "tests/languages/nim/operator_feature.test",
    "content": "= + -\r\n* /\r\n< >\r\n@ $ ~\r\n& % |\r\n! ? ^\r\n: \\\r\n.. .\r\n\r\n+*<>\r\n\r\nand div of or\r\nin is isnot mod\r\nnot notin\r\nshl shr xor\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"=\"], [\"operator\", \"+\"], [\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \">\"],\r\n\t[\"operator\", \"@\"], [\"operator\", \"$\"], [\"operator\", \"~\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"%\"], [\"operator\", \"|\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"?\"], [\"operator\", \"^\"],\r\n\t[\"operator\", \":\"], [\"operator\", \"\\\\\"],\r\n\t[\"operator\", \"..\"], [\"operator\", \".\"],\r\n\r\n\t[\"operator\", \"+*<>\"],\r\n\r\n\t[\"operator\", \"and\"], [\"operator\", \"div\"], [\"operator\", \"of\"], [\"operator\", \"or\"],\r\n\t[\"operator\", \"in\"], [\"operator\", \"is\"], [\"operator\", \"isnot\"], [\"operator\", \"mod\"],\r\n\t[\"operator\", \"not\"], [\"operator\", \"notin\"],\r\n\t[\"operator\", \"shl\"], [\"operator\", \"shr\"], [\"operator\", \"xor\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/nim/string_feature.test",
    "content": "\"\"\r\n\"Fo\\\"obar\"\r\n\r\n\"\"\"\"\"\"\r\n\"\"\"Fo\"o\r\nbar\"\"\"\r\n\r\nR\"Raw \"\"string\"\r\n\r\nr\"Raw\r\n\"\"string\"\r\n\r\nfo\\x8Fo\"Foobar\"\r\n\r\nbar\"\"\"Foo\r\nbar\"\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Fo\\\\\\\"obar\\\"\"],\r\n\r\n\t[\"string\", \"\\\"\\\"\\\"\\\"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"\\\"\\\"Fo\\\"o\\r\\nbar\\\"\\\"\\\"\"],\r\n\r\n\t[\"string\", \"R\\\"Raw \\\"\\\"string\\\"\"],\r\n\r\n\t[\"string\", \"r\\\"Raw\\r\\n\\\"\\\"string\\\"\"],\r\n\r\n\t[\"string\", \"fo\\\\x8Fo\\\"Foobar\\\"\"],\r\n\r\n\t[\"string\", \"bar\\\"\\\"\\\"Foo\\r\\nbar\\\"\\\"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and character literals.\r\n"
  },
  {
    "path": "tests/languages/nix/antiquotation_feature.test",
    "content": "${42}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"antiquotation\", \"$\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for antiquotations outside of strings."
  },
  {
    "path": "tests/languages/nix/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/nix/comment_feature.test",
    "content": "#\r\n# foobar\r\n/**/\r\n/* foo\r\nbar */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/nix/function_feature.test",
    "content": "abort\r\nadd\r\nall\r\nany\r\nattrNames\r\nattrValues\r\nbaseNameOf\r\ncompareVersions\r\nconcatLists\r\ncurrentSystem\r\ndeepSeq\r\nderivation\r\ndirOf\r\ndiv\r\nelem\r\nelemAt\r\nfetchurl\r\nfetchTarball\r\nfilter\r\nfilterSource\r\nfromJSON\r\ngenList\r\ngetAttr\r\ngetEnv\r\nhasAttr\r\nhashString\r\nhead\r\nimport\r\nintersectAttrs\r\nisAttrs\r\nisBool\r\nisFunction\r\nisInt\r\nisList\r\nisNull\r\nisString\r\nlength\r\nlessThan\r\nlistToAttrs\r\nmap\r\nmul\r\nparseDrvName\r\npathExists\r\nreadDir\r\nreadFile\r\nremoveAttrs\r\nreplaceStrings\r\nseq\r\nsort\r\nstringLength\r\nsub\r\nsubstring\r\ntail\r\nthrow\r\ntoFile\r\ntoJSON\r\ntoPath\r\ntoString\r\ntoXML\r\ntrace\r\ntypeOf\r\nfoldl'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"abort\"],\r\n\t[\"function\", \"add\"],\r\n\t[\"function\", \"all\"],\r\n\t[\"function\", \"any\"],\r\n\t[\"function\", \"attrNames\"],\r\n\t[\"function\", \"attrValues\"],\r\n\t[\"function\", \"baseNameOf\"],\r\n\t[\"function\", \"compareVersions\"],\r\n\t[\"function\", \"concatLists\"],\r\n\t[\"function\", \"currentSystem\"],\r\n\t[\"function\", \"deepSeq\"],\r\n\t[\"function\", \"derivation\"],\r\n\t[\"function\", \"dirOf\"],\r\n\t[\"function\", \"div\"],\r\n\t[\"function\", \"elem\"],\r\n\t[\"function\", \"elemAt\"],\r\n\t[\"function\", \"fetchurl\"],\r\n\t[\"function\", \"fetchTarball\"],\r\n\t[\"function\", \"filter\"],\r\n\t[\"function\", \"filterSource\"],\r\n\t[\"function\", \"fromJSON\"],\r\n\t[\"function\", \"genList\"],\r\n\t[\"function\", \"getAttr\"],\r\n\t[\"function\", \"getEnv\"],\r\n\t[\"function\", \"hasAttr\"],\r\n\t[\"function\", \"hashString\"],\r\n\t[\"function\", \"head\"],\r\n\t[\"function\", \"import\"],\r\n\t[\"function\", \"intersectAttrs\"],\r\n\t[\"function\", \"isAttrs\"],\r\n\t[\"function\", \"isBool\"],\r\n\t[\"function\", \"isFunction\"],\r\n\t[\"function\", \"isInt\"],\r\n\t[\"function\", \"isList\"],\r\n\t[\"function\", \"isNull\"],\r\n\t[\"function\", \"isString\"],\r\n\t[\"function\", \"length\"],\r\n\t[\"function\", \"lessThan\"],\r\n\t[\"function\", \"listToAttrs\"],\r\n\t[\"function\", \"map\"],\r\n\t[\"function\", \"mul\"],\r\n\t[\"function\", \"parseDrvName\"],\r\n\t[\"function\", \"pathExists\"],\r\n\t[\"function\", \"readDir\"],\r\n\t[\"function\", \"readFile\"],\r\n\t[\"function\", \"removeAttrs\"],\r\n\t[\"function\", \"replaceStrings\"],\r\n\t[\"function\", \"seq\"],\r\n\t[\"function\", \"sort\"],\r\n\t[\"function\", \"stringLength\"],\r\n\t[\"function\", \"sub\"],\r\n\t[\"function\", \"substring\"],\r\n\t[\"function\", \"tail\"],\r\n\t[\"function\", \"throw\"],\r\n\t[\"function\", \"toFile\"],\r\n\t[\"function\", \"toJSON\"],\r\n\t[\"function\", \"toPath\"],\r\n\t[\"function\", \"toString\"],\r\n\t[\"function\", \"toXML\"],\r\n\t[\"function\", \"trace\"],\r\n\t[\"function\", \"typeOf\"],\r\n\t[\"function\", \"foldl'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for built-in functions."
  },
  {
    "path": "tests/languages/nix/keyword_feature.test",
    "content": "assert builtins else if\r\nin inherit let null\r\nor then with\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"assert\"], [\"keyword\", \"builtins\"], [\"keyword\", \"else\"], [\"keyword\", \"if\"],\r\n\t[\"keyword\", \"in\"], [\"keyword\", \"inherit\"], [\"keyword\", \"let\"], [\"keyword\", \"null\"],\r\n\t[\"keyword\", \"or\"], [\"keyword\", \"then\"], [\"keyword\", \"with\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/nix/number_feature.test",
    "content": "0\r\n42\r\n120457\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"120457\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for integers."
  },
  {
    "path": "tests/languages/nix/operator_feature.test",
    "content": "= ==\r\n! !=\r\n< <=\r\n> >=\r\n+ ++\r\n- ->\r\n|| && //\r\n? @\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"->\"],\r\n\t[\"operator\", \"||\"], [\"operator\", \"&&\"], [\"operator\", \"//\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \"@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/nix/string_feature.test",
    "content": "\"\"\r\n\"foo\\\"b\\\\ar\"\r\n\"f''o'o'\\\"bar\"\r\n\"foo\r\nbar\"\r\n\"foo ${ 42 } baz\"\r\n\"foo \\${ 42 } baz\"\r\n\r\n''''\r\n''\r\nfoo\r\nbar\r\n''\r\n''\r\nf'oo'''ba'r\r\nfoo ${ 42 } baz\r\nfoo ''${ 42 } baz\r\n''\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"\\\"\"]],\r\n\t[\"string\", [\"\\\"foo\\\\\\\"b\\\\\\\\ar\\\"\"]],\r\n\t[\"string\", [\"\\\"f''o'o'\\\\\\\"bar\\\"\"]],\r\n\t[\"string\", [\"\\\"foo\\r\\nbar\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"\\\"foo \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"antiquotation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"42\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\" baz\\\"\"\r\n\t]],\r\n\t[\"string\", [\"\\\"foo \\\\${ 42 } baz\\\"\"]],\r\n\r\n\t[\"string\", [\"''''\"]],\r\n\t[\"string\", [\"''\\r\\nfoo\\r\\nbar\\r\\n''\"]],\r\n\t[\"string\", [\r\n\t\t\"''\\r\\nf'oo'''ba'r\\r\\nfoo \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"antiquotation\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"42\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\" baz\\r\\nfoo ''${ 42 } baz\\r\\n''\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and string interpolation.\r\nAlso checks that escaped interpolations are not interpreted."
  },
  {
    "path": "tests/languages/nix/url_feature.test",
    "content": "http://example.org/foo.tar.bz2\r\nftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz\r\n\r\n/bin/sh\r\n./builder.sh\r\n~/foo.bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"url\", \"http://example.org/foo.tar.bz2\"],\r\n\t[\"url\", \"ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz\"],\r\n\r\n\t[\"url\", \"/bin/sh\"],\r\n\t[\"url\", \"./builder.sh\"],\r\n\t[\"url\", \"~/foo.bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for URLs and paths."
  },
  {
    "path": "tests/languages/nsis/comment_feature.test",
    "content": "/* foo */\r\n/* foo\r\nbar */\r\n# foo\r\n; bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/* foo */\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"# foo\"],\r\n\t[\"comment\", \"; bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/nsis/constant_feature.test",
    "content": "$(myLicenseData)\r\n$(^Name)\r\n$(!Name)\r\n${LANG_ENGLISH}\r\n${AtLeastWin8.1}\r\n${nsArray_Copy}\r\n${xml::CreateNode}\r\n${^EXAMPLE}\r\n${!defineifexist}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n    [\"constant\", \"$(myLicenseData)\"],\r\n    [\"constant\", \"$(^Name)\"],\r\n    [\"constant\", \"$(!Name)\"],\r\n    [\"constant\", \"${LANG_ENGLISH}\"],\r\n    [\"constant\", \"${AtLeastWin8.1}\"],\r\n    [\"constant\", \"${nsArray_Copy}\"],\r\n    [\"constant\", \"${xml::CreateNode}\"],\r\n    [\"constant\", \"${^EXAMPLE}\"],\r\n    [\"constant\", \"${!defineifexist}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants."
  },
  {
    "path": "tests/languages/nsis/important_feature.test",
    "content": "!addincludedir\r\n!addplugindir\r\n!appendfile\r\n!cd\r\n!define\r\n!delfile\r\n!echo\r\n!else\r\n!endif\r\n!error\r\n!execute\r\n!finalize\r\n!getdllversion\r\n!gettlbversion\r\n!ifdef\r\n!ifmacrodef\r\n!ifmacrondef\r\n!ifndef\r\n!if\r\n!include\r\n!insertmacro\r\n!macroend\r\n!macro\r\n!makensis\r\n!packhdr\r\n!pragma\r\n!searchparse\r\n!searchreplace\r\n!system\r\n!tempfile\r\n!undef\r\n!verbose\r\n!warning\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"important\", \"!addincludedir\"],\r\n\t[\"important\", \"!addplugindir\"],\r\n\t[\"important\", \"!appendfile\"],\r\n\t[\"important\", \"!cd\"],\r\n\t[\"important\", \"!define\"],\r\n\t[\"important\", \"!delfile\"],\r\n\t[\"important\", \"!echo\"],\r\n\t[\"important\", \"!else\"],\r\n\t[\"important\", \"!endif\"],\r\n\t[\"important\", \"!error\"],\r\n\t[\"important\", \"!execute\"],\r\n\t[\"important\", \"!finalize\"],\r\n\t[\"important\", \"!getdllversion\"],\r\n\t[\"important\", \"!gettlbversion\"],\r\n\t[\"important\", \"!ifdef\"],\r\n\t[\"important\", \"!ifmacrodef\"],\r\n\t[\"important\", \"!ifmacrondef\"],\r\n\t[\"important\", \"!ifndef\"],\r\n\t[\"important\", \"!if\"],\r\n\t[\"important\", \"!include\"],\r\n\t[\"important\", \"!insertmacro\"],\r\n\t[\"important\", \"!macroend\"],\r\n\t[\"important\", \"!macro\"],\r\n\t[\"important\", \"!makensis\"],\r\n\t[\"important\", \"!packhdr\"],\r\n\t[\"important\", \"!pragma\"],\r\n\t[\"important\", \"!searchparse\"],\r\n\t[\"important\", \"!searchreplace\"],\r\n\t[\"important\", \"!system\"],\r\n\t[\"important\", \"!tempfile\"],\r\n\t[\"important\", \"!undef\"],\r\n\t[\"important\", \"!verbose\"],\r\n\t[\"important\", \"!warning\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for compiler instructions."
  },
  {
    "path": "tests/languages/nsis/keyword_feature.test",
    "content": "Abort\r\nAddBrandingImage\r\nAddSize\r\nAdvSplash\r\nAllowRootDirInstall\r\nAllowSkipFiles\r\nAutoCloseWindow\r\nBanner\r\nBGFont\r\nBGGradient\r\nBGImage\r\nBrandingText\r\nBringToFront\r\nCall\r\nCallInstDLL\r\nCaption\r\nChangeUI\r\nCheckBitmap\r\nClearErrors\r\nCompletedText\r\nComponentText\r\nCopyFiles\r\nCRCCheck\r\nCreateDirectory\r\nCreateFont\r\nCreateShortCut\r\nDelete\r\nDeleteINISec\r\nDeleteINIStr\r\nDeleteRegKey\r\nDeleteRegValue\r\nDetailPrint\r\nDetailsButtonText\r\nDialer\r\nDirText\r\nDirVar\r\nDirVerify\r\nEnableWindow\r\nEnumRegKey\r\nEnumRegValue\r\nExch\r\nExec\r\nExecShell\r\nExecWait\r\nExecShellWait\r\nExpandEnvStrings\r\nFile\r\nFileBufSize\r\nFileClose\r\nFileErrorText\r\nFileOpen\r\nFileRead\r\nFileReadByte\r\nFileReadUTF16LE\r\nFileReadWord\r\nFileSeek\r\nFileWrite\r\nFileWriteByte\r\nFileWriteUTF16LE\r\nFileWriteWord\r\nFindClose\r\nFindFirst\r\nFindNext\r\nFindWindow\r\nFlushINI\r\nGetCurInstType\r\nGetCurrentAddress\r\nGetDlgItem\r\nGetDLLVersion\r\nGetDLLVersionLocal\r\nGetErrorLevel\r\nGetFileTime\r\nGetFileTimeLocal\r\nGetFullPathName\r\nGetFunction\r\nGetFunctionAddress\r\nGetFunctionEnd\r\nGetInstDirError\r\nGetKnownFolderPath\r\nGetLabelAddress\r\nGetTempFileName\r\nGetWinVer\r\nGoto\r\nHideWindow\r\nIcon\r\nIfAbort\r\nIfErrors\r\nIfFileExists\r\nIfRebootFlag\r\nIfRtlLanguage\r\nIfShellVarContextAll\r\nIfSilent\r\nInitPluginsDir\r\nInstallButtonText\r\nInstallColors\r\nInstallDir\r\nInstallDirRegKey\r\nInstProgressFlags\r\nInstType\r\nInstTypeGetText\r\nInstTypeSetText\r\nInt64Cmp\r\nInt64CmpU\r\nInt64Fmt\r\nIntCmp\r\nIntCmpU\r\nIntFmt\r\nIntOp\r\nIntPtrCmp\r\nIntPtrCmpU\r\nIntPtrOp\r\nIsWindow\r\nLangDLL\r\nLangString\r\nLicenseBkColor\r\nLicenseData\r\nLicenseForceSelection\r\nLicenseLangString\r\nLicenseText\r\nLoadLanguageFile\r\nLockWindow\r\nLogSet\r\nLogText\r\nManifestDPIAware\r\nManifestSupportedOS\r\nMath\r\nMessageBox\r\nMiscButtonText\r\nName\r\nNop\r\nnsDialogs\r\nnsExec\r\nNSISdl\r\nOutFile\r\nPage\r\nPageCallbacks\r\nPEDllCharacteristics\r\nPESubsysVer\r\nPop\r\nPush\r\nQuit\r\nReadEnvStr\r\nReadINIStr\r\nReadRegDWORD\r\nReadRegStr\r\nReboot\r\nRegDLL\r\nRename\r\nRequestExecutionLevel\r\nReserveFile\r\nReturn\r\nRMDir\r\nSearchPath\r\nSection\r\nSectionEnd\r\nSectionGetFlags\r\nSectionGetInstTypes\r\nSectionGetSize\r\nSectionGetText\r\nSectionGroup\r\nSectionIn\r\nSectionSetFlags\r\nSectionSetInstTypes\r\nSectionSetSize\r\nSectionSetText\r\nSendMessage\r\nSetAutoClose\r\nSetBrandingImage\r\nSetCompress\r\nSetCompressor\r\nSetCompressorDictSize\r\nSetCtlColors\r\nSetCurInstType\r\nSetDatablockOptimize\r\nSetDateSave\r\nSetDetailsPrint\r\nSetDetailsView\r\nSetErrorLevel\r\nSetErrors\r\nSetFileAttributes\r\nSetFont\r\nSetOutPath\r\nSetOverwrite\r\nSetPluginUnload\r\nSetRebootFlag\r\nSetRegView\r\nSetShellVarContext\r\nSetSilent\r\nShowInstDetails\r\nShowUninstDetails\r\nShowWindow\r\nSilentInstall\r\nSilentUnInstall\r\nSleep\r\nSpaceTexts\r\nSplash\r\nStartMenu\r\nStrCmp\r\nStrCmpS\r\nStrCpy\r\nStrLen\r\nSubCaption\r\nSystem\r\nTarget\r\nUnicode\r\nUninstallButtonText\r\nUninstallCaption\r\nUninstallIcon\r\nUninstallSubCaption\r\nUninstallText\r\nUninstPage\r\nUnRegDLL\r\nUserInfo\r\nVar\r\nVIAddVersionKey\r\nVIFileVersion\r\nVIProductVersion\r\nVPatch\r\nWindowIcon\r\nWriteINIStr\r\nWriteRegBin\r\nWriteRegDWORD\r\nWriteRegExpandStr\r\nWriteRegMultiStr\r\nWriteRegNone\r\nWriteRegStr\r\nWriteUninstaller\r\nXPStyle\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"Abort\"],\r\n\t[\"keyword\", \"AddBrandingImage\"],\r\n\t[\"keyword\", \"AddSize\"],\r\n\t[\"keyword\", \"AdvSplash\"],\r\n\t[\"keyword\", \"AllowRootDirInstall\"],\r\n\t[\"keyword\", \"AllowSkipFiles\"],\r\n\t[\"keyword\", \"AutoCloseWindow\"],\r\n\t[\"keyword\", \"Banner\"],\r\n\t[\"keyword\", \"BGFont\"],\r\n\t[\"keyword\", \"BGGradient\"],\r\n\t[\"keyword\", \"BGImage\"],\r\n\t[\"keyword\", \"BrandingText\"],\r\n\t[\"keyword\", \"BringToFront\"],\r\n\t[\"keyword\", \"Call\"],\r\n\t[\"keyword\", \"CallInstDLL\"],\r\n\t[\"keyword\", \"Caption\"],\r\n\t[\"keyword\", \"ChangeUI\"],\r\n\t[\"keyword\", \"CheckBitmap\"],\r\n\t[\"keyword\", \"ClearErrors\"],\r\n\t[\"keyword\", \"CompletedText\"],\r\n\t[\"keyword\", \"ComponentText\"],\r\n\t[\"keyword\", \"CopyFiles\"],\r\n\t[\"keyword\", \"CRCCheck\"],\r\n\t[\"keyword\", \"CreateDirectory\"],\r\n\t[\"keyword\", \"CreateFont\"],\r\n\t[\"keyword\", \"CreateShortCut\"],\r\n\t[\"keyword\", \"Delete\"],\r\n\t[\"keyword\", \"DeleteINISec\"],\r\n\t[\"keyword\", \"DeleteINIStr\"],\r\n\t[\"keyword\", \"DeleteRegKey\"],\r\n\t[\"keyword\", \"DeleteRegValue\"],\r\n\t[\"keyword\", \"DetailPrint\"],\r\n\t[\"keyword\", \"DetailsButtonText\"],\r\n\t[\"keyword\", \"Dialer\"],\r\n\t[\"keyword\", \"DirText\"],\r\n\t[\"keyword\", \"DirVar\"],\r\n\t[\"keyword\", \"DirVerify\"],\r\n\t[\"keyword\", \"EnableWindow\"],\r\n\t[\"keyword\", \"EnumRegKey\"],\r\n\t[\"keyword\", \"EnumRegValue\"],\r\n\t[\"keyword\", \"Exch\"],\r\n\t[\"keyword\", \"Exec\"],\r\n\t[\"keyword\", \"ExecShell\"],\r\n\t[\"keyword\", \"ExecWait\"],\r\n\t[\"keyword\", \"ExecShellWait\"],\r\n\t[\"keyword\", \"ExpandEnvStrings\"],\r\n\t[\"keyword\", \"File\"],\r\n\t[\"keyword\", \"FileBufSize\"],\r\n\t[\"keyword\", \"FileClose\"],\r\n\t[\"keyword\", \"FileErrorText\"],\r\n\t[\"keyword\", \"FileOpen\"],\r\n\t[\"keyword\", \"FileRead\"],\r\n\t[\"keyword\", \"FileReadByte\"],\r\n\t[\"keyword\", \"FileReadUTF16LE\"],\r\n\t[\"keyword\", \"FileReadWord\"],\r\n\t[\"keyword\", \"FileSeek\"],\r\n\t[\"keyword\", \"FileWrite\"],\r\n\t[\"keyword\", \"FileWriteByte\"],\r\n\t[\"keyword\", \"FileWriteUTF16LE\"],\r\n\t[\"keyword\", \"FileWriteWord\"],\r\n\t[\"keyword\", \"FindClose\"],\r\n\t[\"keyword\", \"FindFirst\"],\r\n\t[\"keyword\", \"FindNext\"],\r\n\t[\"keyword\", \"FindWindow\"],\r\n\t[\"keyword\", \"FlushINI\"],\r\n\t[\"keyword\", \"GetCurInstType\"],\r\n\t[\"keyword\", \"GetCurrentAddress\"],\r\n\t[\"keyword\", \"GetDlgItem\"],\r\n\t[\"keyword\", \"GetDLLVersion\"],\r\n\t[\"keyword\", \"GetDLLVersionLocal\"],\r\n\t[\"keyword\", \"GetErrorLevel\"],\r\n\t[\"keyword\", \"GetFileTime\"],\r\n\t[\"keyword\", \"GetFileTimeLocal\"],\r\n\t[\"keyword\", \"GetFullPathName\"],\r\n\t[\"keyword\", \"GetFunction\"],\r\n\t[\"keyword\", \"GetFunctionAddress\"],\r\n\t[\"keyword\", \"GetFunctionEnd\"],\r\n\t[\"keyword\", \"GetInstDirError\"],\r\n\t[\"keyword\", \"GetKnownFolderPath\"],\r\n\t[\"keyword\", \"GetLabelAddress\"],\r\n\t[\"keyword\", \"GetTempFileName\"],\r\n\t[\"keyword\", \"GetWinVer\"],\r\n\t[\"keyword\", \"Goto\"],\r\n\t[\"keyword\", \"HideWindow\"],\r\n\t[\"keyword\", \"Icon\"],\r\n\t[\"keyword\", \"IfAbort\"],\r\n\t[\"keyword\", \"IfErrors\"],\r\n\t[\"keyword\", \"IfFileExists\"],\r\n\t[\"keyword\", \"IfRebootFlag\"],\r\n\t[\"keyword\", \"IfRtlLanguage\"],\r\n\t[\"keyword\", \"IfShellVarContextAll\"],\r\n\t[\"keyword\", \"IfSilent\"],\r\n\t[\"keyword\", \"InitPluginsDir\"],\r\n\t[\"keyword\", \"InstallButtonText\"],\r\n\t[\"keyword\", \"InstallColors\"],\r\n\t[\"keyword\", \"InstallDir\"],\r\n\t[\"keyword\", \"InstallDirRegKey\"],\r\n\t[\"keyword\", \"InstProgressFlags\"],\r\n\t[\"keyword\", \"InstType\"],\r\n\t[\"keyword\", \"InstTypeGetText\"],\r\n\t[\"keyword\", \"InstTypeSetText\"],\r\n\t[\"keyword\", \"Int64Cmp\"],\r\n\t[\"keyword\", \"Int64CmpU\"],\r\n\t[\"keyword\", \"Int64Fmt\"],\r\n\t[\"keyword\", \"IntCmp\"],\r\n\t[\"keyword\", \"IntCmpU\"],\r\n\t[\"keyword\", \"IntFmt\"],\r\n\t[\"keyword\", \"IntOp\"],\r\n\t[\"keyword\", \"IntPtrCmp\"],\r\n\t[\"keyword\", \"IntPtrCmpU\"],\r\n\t[\"keyword\", \"IntPtrOp\"],\r\n\t[\"keyword\", \"IsWindow\"],\r\n\t[\"keyword\", \"LangDLL\"],\r\n\t[\"keyword\", \"LangString\"],\r\n\t[\"keyword\", \"LicenseBkColor\"],\r\n\t[\"keyword\", \"LicenseData\"],\r\n\t[\"keyword\", \"LicenseForceSelection\"],\r\n\t[\"keyword\", \"LicenseLangString\"],\r\n\t[\"keyword\", \"LicenseText\"],\r\n\t[\"keyword\", \"LoadLanguageFile\"],\r\n\t[\"keyword\", \"LockWindow\"],\r\n\t[\"keyword\", \"LogSet\"],\r\n\t[\"keyword\", \"LogText\"],\r\n\t[\"keyword\", \"ManifestDPIAware\"],\r\n\t[\"keyword\", \"ManifestSupportedOS\"],\r\n\t[\"keyword\", \"Math\"],\r\n\t[\"keyword\", \"MessageBox\"],\r\n\t[\"keyword\", \"MiscButtonText\"],\r\n\t[\"keyword\", \"Name\"],\r\n\t[\"keyword\", \"Nop\"],\r\n\t[\"keyword\", \"nsDialogs\"],\r\n\t[\"keyword\", \"nsExec\"],\r\n\t[\"keyword\", \"NSISdl\"],\r\n\t[\"keyword\", \"OutFile\"],\r\n\t[\"keyword\", \"Page\"],\r\n\t[\"keyword\", \"PageCallbacks\"],\r\n\t[\"keyword\", \"PEDllCharacteristics\"],\r\n\t[\"keyword\", \"PESubsysVer\"],\r\n\t[\"keyword\", \"Pop\"],\r\n\t[\"keyword\", \"Push\"],\r\n\t[\"keyword\", \"Quit\"],\r\n\t[\"keyword\", \"ReadEnvStr\"],\r\n\t[\"keyword\", \"ReadINIStr\"],\r\n\t[\"keyword\", \"ReadRegDWORD\"],\r\n\t[\"keyword\", \"ReadRegStr\"],\r\n\t[\"keyword\", \"Reboot\"],\r\n\t[\"keyword\", \"RegDLL\"],\r\n\t[\"keyword\", \"Rename\"],\r\n\t[\"keyword\", \"RequestExecutionLevel\"],\r\n\t[\"keyword\", \"ReserveFile\"],\r\n\t[\"keyword\", \"Return\"],\r\n\t[\"keyword\", \"RMDir\"],\r\n\t[\"keyword\", \"SearchPath\"],\r\n\t[\"keyword\", \"Section\"],\r\n\t[\"keyword\", \"SectionEnd\"],\r\n\t[\"keyword\", \"SectionGetFlags\"],\r\n\t[\"keyword\", \"SectionGetInstTypes\"],\r\n\t[\"keyword\", \"SectionGetSize\"],\r\n\t[\"keyword\", \"SectionGetText\"],\r\n\t[\"keyword\", \"SectionGroup\"],\r\n\t[\"keyword\", \"SectionIn\"],\r\n\t[\"keyword\", \"SectionSetFlags\"],\r\n\t[\"keyword\", \"SectionSetInstTypes\"],\r\n\t[\"keyword\", \"SectionSetSize\"],\r\n\t[\"keyword\", \"SectionSetText\"],\r\n\t[\"keyword\", \"SendMessage\"],\r\n\t[\"keyword\", \"SetAutoClose\"],\r\n\t[\"keyword\", \"SetBrandingImage\"],\r\n\t[\"keyword\", \"SetCompress\"],\r\n\t[\"keyword\", \"SetCompressor\"],\r\n\t[\"keyword\", \"SetCompressorDictSize\"],\r\n\t[\"keyword\", \"SetCtlColors\"],\r\n\t[\"keyword\", \"SetCurInstType\"],\r\n\t[\"keyword\", \"SetDatablockOptimize\"],\r\n\t[\"keyword\", \"SetDateSave\"],\r\n\t[\"keyword\", \"SetDetailsPrint\"],\r\n\t[\"keyword\", \"SetDetailsView\"],\r\n\t[\"keyword\", \"SetErrorLevel\"],\r\n\t[\"keyword\", \"SetErrors\"],\r\n\t[\"keyword\", \"SetFileAttributes\"],\r\n\t[\"keyword\", \"SetFont\"],\r\n\t[\"keyword\", \"SetOutPath\"],\r\n\t[\"keyword\", \"SetOverwrite\"],\r\n\t[\"keyword\", \"SetPluginUnload\"],\r\n\t[\"keyword\", \"SetRebootFlag\"],\r\n\t[\"keyword\", \"SetRegView\"],\r\n\t[\"keyword\", \"SetShellVarContext\"],\r\n\t[\"keyword\", \"SetSilent\"],\r\n\t[\"keyword\", \"ShowInstDetails\"],\r\n\t[\"keyword\", \"ShowUninstDetails\"],\r\n\t[\"keyword\", \"ShowWindow\"],\r\n\t[\"keyword\", \"SilentInstall\"],\r\n\t[\"keyword\", \"SilentUnInstall\"],\r\n\t[\"keyword\", \"Sleep\"],\r\n\t[\"keyword\", \"SpaceTexts\"],\r\n\t[\"keyword\", \"Splash\"],\r\n\t[\"keyword\", \"StartMenu\"],\r\n\t[\"keyword\", \"StrCmp\"],\r\n\t[\"keyword\", \"StrCmpS\"],\r\n\t[\"keyword\", \"StrCpy\"],\r\n\t[\"keyword\", \"StrLen\"],\r\n\t[\"keyword\", \"SubCaption\"],\r\n\t[\"keyword\", \"System\"],\r\n\t[\"keyword\", \"Target\"],\r\n\t[\"keyword\", \"Unicode\"],\r\n\t[\"keyword\", \"UninstallButtonText\"],\r\n\t[\"keyword\", \"UninstallCaption\"],\r\n\t[\"keyword\", \"UninstallIcon\"],\r\n\t[\"keyword\", \"UninstallSubCaption\"],\r\n\t[\"keyword\", \"UninstallText\"],\r\n\t[\"keyword\", \"UninstPage\"],\r\n\t[\"keyword\", \"UnRegDLL\"],\r\n\t[\"keyword\", \"UserInfo\"],\r\n\t[\"keyword\", \"Var\"],\r\n\t[\"keyword\", \"VIAddVersionKey\"],\r\n\t[\"keyword\", \"VIFileVersion\"],\r\n\t[\"keyword\", \"VIProductVersion\"],\r\n\t[\"keyword\", \"VPatch\"],\r\n\t[\"keyword\", \"WindowIcon\"],\r\n\t[\"keyword\", \"WriteINIStr\"],\r\n\t[\"keyword\", \"WriteRegBin\"],\r\n\t[\"keyword\", \"WriteRegDWORD\"],\r\n\t[\"keyword\", \"WriteRegExpandStr\"],\r\n\t[\"keyword\", \"WriteRegMultiStr\"],\r\n\t[\"keyword\", \"WriteRegNone\"],\r\n\t[\"keyword\", \"WriteRegStr\"],\r\n\t[\"keyword\", \"WriteUninstaller\"],\r\n\t[\"keyword\", \"XPStyle\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/nsis/number_feature.test",
    "content": "0xBadFace\r\n42\r\n3.14159\r\n3.2e4\r\n1.0e-5\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3.2e4\"],\r\n\t[\"number\", \"1.0e-5\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hexadecimal and decimal numbers."
  },
  {
    "path": "tests/languages/nsis/operator_feature.test",
    "content": "+ - ++ --\r\n< <= > >=\r\n= == ===\r\n& && | ||\r\n? * / ~\r\n^ %\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"++\"], [\"operator\", \"--\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"===\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"|\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"~\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"%\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/nsis/property_feature.test",
    "content": "admin all auto both\r\ncolored false force\r\nhide highest lastused\r\nleave listonly none\r\nnormal notset off\r\non open print show\r\nsilent silentlog\r\nsmooth textonly\r\ntrue user\r\n\r\nARCHIVE\r\nFILE_ATTRIBUTE_ARCHIVE\r\nFILE_ATTRIBUTE_NORMAL\r\nFILE_ATTRIBUTE_OFFLINE\r\nFILE_ATTRIBUTE_READONLY\r\nFILE_ATTRIBUTE_SYSTEM\r\nFILE_ATTRIBUTE_TEMPORARY\r\nHKCR HKCU HKLM\r\nHKCR32 HKCU32 HKLM32\r\nHKCR64 HKCU64 HKLM64\r\nHKDD HKPD HKU\r\nHKEY_CLASSES_ROOT\r\nHKEY_CURRENT_CONFIG\r\nHKEY_CURRENT_USER\r\nHKEY_DYN_DATA\r\nHKEY_LOCAL_MACHINE\r\nHKEY_PERFORMANCE_DATA\r\nHKEY_USERS\r\nIDABORT IDCANCEL\r\nIDIGNORE IDNO\r\nIDOK IDRETRY IDYES\r\nMB_ABORTRETRYIGNORE\r\nMB_DEFBUTTON1\r\nMB_DEFBUTTON2\r\nMB_DEFBUTTON3\r\nMB_DEFBUTTON4\r\nMB_ICONEXCLAMATION\r\nMB_ICONINFORMATION\r\nMB_ICONQUESTION\r\nMB_ICONSTOP\r\nMB_OK\r\nMB_OKCANCEL\r\nMB_RETRYCANCEL\r\nMB_RIGHT\r\nMB_RTLREADING\r\nMB_SETFOREGROUND\r\nMB_TOPMOST\r\nMB_USERICON\r\nMB_YESNO\r\nNORMAL OFFLINE\r\nREADONLY SHCTX\r\nSHELL_CONTEXT\r\nSYSTEM TEMPORARY\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"admin\"], [\"property\", \"all\"], [\"property\", \"auto\"], [\"property\", \"both\"],\r\n\t[\"property\", \"colored\"], [\"property\", \"false\"], [\"property\", \"force\"],\r\n\t[\"property\", \"hide\"], [\"property\", \"highest\"], [\"property\", \"lastused\"],\r\n\t[\"property\", \"leave\"], [\"property\", \"listonly\"], [\"property\", \"none\"],\r\n\t[\"property\", \"normal\"], [\"property\", \"notset\"], [\"property\", \"off\"],\r\n\t[\"property\", \"on\"], [\"property\", \"open\"], [\"property\", \"print\"], [\"property\", \"show\"],\r\n\t[\"property\", \"silent\"], [\"property\", \"silentlog\"],\r\n\t[\"property\", \"smooth\"], [\"property\", \"textonly\"],\r\n\t[\"property\", \"true\"], [\"property\", \"user\"],\r\n\t\r\n\t[\"property\", \"ARCHIVE\"],\r\n\t[\"property\", \"FILE_ATTRIBUTE_ARCHIVE\"],\r\n\t[\"property\", \"FILE_ATTRIBUTE_NORMAL\"],\r\n\t[\"property\", \"FILE_ATTRIBUTE_OFFLINE\"],\r\n\t[\"property\", \"FILE_ATTRIBUTE_READONLY\"],\r\n\t[\"property\", \"FILE_ATTRIBUTE_SYSTEM\"],\r\n\t[\"property\", \"FILE_ATTRIBUTE_TEMPORARY\"],\r\n\t[\"property\", \"HKCR\"], [\"property\", \"HKCU\"], [\"property\", \"HKLM\"],\r\n\t[\"property\", \"HKCR32\"], [\"property\", \"HKCU32\"], [\"property\", \"HKLM32\"],\r\n\t[\"property\", \"HKCR64\"], [\"property\", \"HKCU64\"], [\"property\", \"HKLM64\"],\r\n\t[\"property\", \"HKDD\"], [\"property\", \"HKPD\"], [\"property\", \"HKU\"],\r\n\t[\"property\", \"HKEY_CLASSES_ROOT\"],\r\n\t[\"property\", \"HKEY_CURRENT_CONFIG\"],\r\n\t[\"property\", \"HKEY_CURRENT_USER\"],\r\n\t[\"property\", \"HKEY_DYN_DATA\"],\r\n\t[\"property\", \"HKEY_LOCAL_MACHINE\"],\r\n\t[\"property\", \"HKEY_PERFORMANCE_DATA\"],\r\n\t[\"property\", \"HKEY_USERS\"],\r\n\t[\"property\", \"IDABORT\"], [\"property\", \"IDCANCEL\"],\r\n\t[\"property\", \"IDIGNORE\"], [\"property\", \"IDNO\"],\r\n\t[\"property\", \"IDOK\"], [\"property\", \"IDRETRY\"], [\"property\", \"IDYES\"],\r\n\t[\"property\", \"MB_ABORTRETRYIGNORE\"],\r\n\t[\"property\", \"MB_DEFBUTTON1\"],\r\n\t[\"property\", \"MB_DEFBUTTON2\"],\r\n\t[\"property\", \"MB_DEFBUTTON3\"],\r\n\t[\"property\", \"MB_DEFBUTTON4\"],\r\n\t[\"property\", \"MB_ICONEXCLAMATION\"],\r\n\t[\"property\", \"MB_ICONINFORMATION\"],\r\n\t[\"property\", \"MB_ICONQUESTION\"],\r\n\t[\"property\", \"MB_ICONSTOP\"],\r\n\t[\"property\", \"MB_OK\"],\r\n\t[\"property\", \"MB_OKCANCEL\"],\r\n\t[\"property\", \"MB_RETRYCANCEL\"],\r\n\t[\"property\", \"MB_RIGHT\"],\r\n\t[\"property\", \"MB_RTLREADING\"],\r\n\t[\"property\", \"MB_SETFOREGROUND\"],\r\n\t[\"property\", \"MB_TOPMOST\"],\r\n\t[\"property\", \"MB_USERICON\"],\r\n\t[\"property\", \"MB_YESNO\"],\r\n\t[\"property\", \"NORMAL\"], [\"property\", \"OFFLINE\"],\r\n\t[\"property\", \"READONLY\"], [\"property\", \"SHCTX\"],\r\n\t[\"property\", \"SHELL_CONTEXT\"],\r\n\t[\"property\", \"SYSTEM\"], [\"property\", \"TEMPORARY\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all properties."
  },
  {
    "path": "tests/languages/nsis/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n''\r\n'fo\\'o'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo\\\\'o'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-quoted and double-quoted strings."
  },
  {
    "path": "tests/languages/nsis/variable_feature.test",
    "content": "$INTERNET_CACHE\r\n$LANGUAGE\r\n$mui.Button.Next\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n    [\"variable\", \"$INTERNET_CACHE\"],\r\n    [\"variable\", \"$LANGUAGE\"],\r\n    [\"variable\", \"$mui.Button.Next\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/objectivec/char_feature.test",
    "content": "'a'\n'\\n'\n'\\000'\n'\\x00'\n'\\u0000'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"],\n\t[\"char\", \"'\\\\n'\"],\n\t[\"char\", \"'\\\\000'\"],\n\t[\"char\", \"'\\\\x00'\"],\n\t[\"char\", \"'\\\\u0000'\"]\n]\n"
  },
  {
    "path": "tests/languages/objectivec/comment_feature.test",
    "content": "//\r\n// comment\r\n// the comment \\\r\n   continues!\r\n\r\n/**/\r\n/*\r\n * comment\r\n */\r\n\r\n/* open-ended comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// comment\"],\r\n\t[\"comment\", \"// the comment \\\\\\r\\n   continues!\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/*\\r\\n * comment\\r\\n */\"],\r\n\t[\"comment\", \"/* open-ended comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/objectivec/keyword_feature.test",
    "content": "asm typeof inline\r\nauto break case\r\nchar const continue\r\ndefault do double\r\nelse enum extern\r\nfloat for goto\r\nif int long\r\nregister return\r\nshort signed\r\nsizeof static\r\nstruct switch\r\ntypedef union\r\nunsigned void\r\nvolatile while\r\nin self super\r\n\r\n@interface @end\r\n@implementation\r\n@protocol @class\r\n@public @protected\r\n@private @property\r\n@try @catch\r\n@finally @throw\r\n@synthesize\r\n@dynamic @selector\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"asm\"], [\"keyword\", \"typeof\"], [\"keyword\", \"inline\"],\r\n\t[\"keyword\", \"auto\"], [\"keyword\", \"break\"], [\"keyword\", \"case\"],\r\n\t[\"keyword\", \"char\"], [\"keyword\", \"const\"], [\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"default\"], [\"keyword\", \"do\"], [\"keyword\", \"double\"],\r\n\t[\"keyword\", \"else\"], [\"keyword\", \"enum\"], [\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"float\"], [\"keyword\", \"for\"], [\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"if\"], [\"keyword\", \"int\"], [\"keyword\", \"long\"],\r\n\t[\"keyword\", \"register\"], [\"keyword\", \"return\"],\r\n\t[\"keyword\", \"short\"], [\"keyword\", \"signed\"],\r\n\t[\"keyword\", \"sizeof\"], [\"keyword\", \"static\"],\r\n\t[\"keyword\", \"struct\"], [\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"typedef\"], [\"keyword\", \"union\"],\r\n\t[\"keyword\", \"unsigned\"], [\"keyword\", \"void\"],\r\n\t[\"keyword\", \"volatile\"], [\"keyword\", \"while\"],\r\n\t[\"keyword\", \"in\"], [\"keyword\", \"self\"], [\"keyword\", \"super\"],\r\n\r\n\t[\"keyword\", \"@interface\"], [\"keyword\", \"@end\"],\r\n\t[\"keyword\", \"@implementation\"],\r\n\t[\"keyword\", \"@protocol\"], [\"keyword\", \"@class\"],\r\n\t[\"keyword\", \"@public\"], [\"keyword\", \"@protected\"],\r\n\t[\"keyword\", \"@private\"], [\"keyword\", \"@property\"],\r\n\t[\"keyword\", \"@try\"], [\"keyword\", \"@catch\"],\r\n\t[\"keyword\", \"@finally\"], [\"keyword\", \"@throw\"],\r\n\t[\"keyword\", \"@synthesize\"],\r\n\t[\"keyword\", \"@dynamic\"], [\"keyword\", \"@selector\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/objectivec/operator_feature.test",
    "content": "+ - ++ --\r\n! !=\r\n< << <= <<=\r\n> >> >= >>=\r\n-> = ==\r\n^ ~ %\r\n& && | ||\r\n? * / @\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"++\"], [\"operator\", \"--\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<=\"], [\"operator\", \"<<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">=\"], [\"operator\", \">>=\"],\r\n\t[\"operator\", \"->\"], [\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"~\"], [\"operator\", \"%\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"|\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/objectivec/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n\"foo\\\r\nbar\"\r\n\r\n@\"\"\r\n@\"fo\\\"o\"\r\n@\"foo\\\r\nbar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\\\\r\\nbar\\\"\"],\r\n\r\n\t[\"string\", \"@\\\"\\\"\"],\r\n\t[\"string\", \"@\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"@\\\"foo\\\\\\r\\nbar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/ocaml/boolean_feature.test",
    "content": "false\r\ntrue\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"false\"],\r\n\t[\"boolean\", \"true\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/ocaml/char_feature.test",
    "content": "'a'\n'\\n'\n'\\''\n'\\xA9'\n'\\169'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"],\n\t[\"char\", \"'\\\\n'\"],\n\t[\"char\", \"'\\\\''\"],\n\t[\"char\", \"'\\\\xA9'\"],\n\t[\"char\", \"'\\\\169'\"]\n]\n"
  },
  {
    "path": "tests/languages/ocaml/comment_feature.test",
    "content": "(**)\r\n(* foo\r\nbar *)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"(**)\"],\r\n\t[\"comment\", \"(* foo\\r\\nbar *)\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/ocaml/directive_feature.test",
    "content": "#quit\r\n#load\r\n#load_rec\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"#quit\"],\r\n\t[\"directive\", \"#load\"],\r\n\t[\"directive\", \"#load_rec\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directives."
  },
  {
    "path": "tests/languages/ocaml/keyword_feature.test",
    "content": "as\r\nassert\r\nbegin\r\nclass\r\nconstraint\r\ndo\r\ndone\r\ndownto\r\nelse\r\nend\r\nexception\r\nexternal\r\nfor\r\nfun\r\nfunction\r\nfunctor\r\nif\r\nin\r\ninclude\r\ninherit\r\ninitializer\r\nlazy\r\nlet\r\nmatch\r\nmethod\r\nmodule\r\nmutable\r\nnew\r\nnonrec\r\nobject\r\nof\r\nopen\r\nprivate\r\nrec\r\nsig\r\nstruct\r\nthen\r\nto\r\ntry\r\ntype\r\nval\r\nvalue\r\nvirtual\r\nwhen\r\nwhere\r\nwhile\r\nwith\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"assert\"],\r\n\t[\"keyword\", \"begin\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"constraint\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"done\"],\r\n\t[\"keyword\", \"downto\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"exception\"],\r\n\t[\"keyword\", \"external\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"fun\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"functor\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"inherit\"],\r\n\t[\"keyword\", \"initializer\"],\r\n\t[\"keyword\", \"lazy\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"match\"],\r\n\t[\"keyword\", \"method\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"keyword\", \"mutable\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"nonrec\"],\r\n\t[\"keyword\", \"object\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"open\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"rec\"],\r\n\t[\"keyword\", \"sig\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"to\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"val\"],\r\n\t[\"keyword\", \"value\"],\r\n\t[\"keyword\", \"virtual\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"where\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/ocaml/label_feature.test",
    "content": "~foo\n~bar_42\n\n----------------------------------------------------\n\n[\n\t[\"label\", \"~foo\"],\n\t[\"label\", \"~bar_42\"]\n]\n\n----------------------------------------------------\n\nChecks for labels."
  },
  {
    "path": "tests/languages/ocaml/number_feature.test",
    "content": "1234\r\n32.\r\n0xBad_Face\r\n0o754_672\r\n0b1010_1111\r\n42_000\r\n3.14_15_9\r\n3.141_592_653_589_793_12\r\n1e-5\r\n3.2e8\r\n6.1E-7\r\n2.22044604925031308e-16\r\n0.4e+12_415\r\n0x1p-52\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"1234\"],\r\n\t[\"number\", \"32.\"],\r\n\t[\"number\", \"0xBad_Face\"],\r\n\t[\"number\", \"0o754_672\"],\r\n\t[\"number\", \"0b1010_1111\"],\r\n\t[\"number\", \"42_000\"],\r\n\t[\"number\", \"3.14_15_9\"],\r\n\t[\"number\", \"3.141_592_653_589_793_12\"],\r\n\t[\"number\", \"1e-5\"],\r\n\t[\"number\", \"3.2e8\"],\r\n\t[\"number\", \"6.1E-7\"],\r\n\t[\"number\", \"2.22044604925031308e-16\"],\r\n\t[\"number\", \"0.4e+12_415\"],\r\n\t[\"number\", \"0x1p-52\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/ocaml/operator_feature.test",
    "content": "and asr land\r\nlor lsl lsr\r\nlxor mod or\r\n\r\n:= :>\r\n= < > @\r\n^ | & ~ .~\r\n+ - * /\r\n$ % ! ?\r\n..\r\n\r\n~=~\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"and\"], [\"operator\", \"asr\"], [\"operator\", \"land\"],\r\n\t[\"operator\", \"lor\"], [\"operator\", \"lsl\"], [\"operator\", \"lsr\"],\r\n\t[\"operator\", \"lxor\"], [\"operator\", \"mod\"], [\"operator\", \"or\"],\r\n\r\n\t[\"operator\", \":=\"],\r\n\t[\"operator\", \":>\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"@\"],\r\n\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \".~\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\r\n\t[\"operator\", \"$\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"?\"],\r\n\r\n\t[\"operator\", \"..\"],\r\n\r\n\t[\"operator\", \"~=~\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/ocaml/punctuation_feature.test",
    "content": "( ) { } [ ]\n. , : ;\n_\n:: ;;\n\n[< [> [| {<\n>] >} |]\n\n#\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"_\"],\n\n\t[\"punctuation\", \"::\"],\n\t[\"punctuation\", \";;\"],\n\n\t[\"operator-like-punctuation\", \"[<\"],\n\t[\"operator-like-punctuation\", \"[>\"],\n\t[\"operator-like-punctuation\", \"[|\"],\n\t[\"operator-like-punctuation\", \"{<\"],\n\n\t[\"operator-like-punctuation\", \">]\"],\n\t[\"operator-like-punctuation\", \">}\"],\n\t[\"operator-like-punctuation\", \"|]\"],\n\n\t[\"punctuation\", \"#\"]\n]\n"
  },
  {
    "path": "tests/languages/ocaml/string_feature.test",
    "content": "\"\"\r\n\"Fo\\\"obar\"\r\n\"Call me Ishmael. Some years ago — never mind how long \\\r\nprecisely — having little or no money in my purse, and \\\r\nnothing particular to interest me on shore, I thought I\\\r\n\\ would sail about a little and see the watery part of t\\\r\nhe world.\"\r\n\r\n{|This is a quoted string, here, neither \\ nor \" are special characters|}\r\n{|\"Hello, World!\"|}\r\n{|\"\\\\\"|}\r\n{delimiter|the end of this|}quoted string is here|delimiter}\r\n{ext|hello {|world|}|ext}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"Call me Ishmael. Some years ago — never mind how long \\\\\\r\\nprecisely — having little or no money in my purse, and \\\\\\r\\nnothing particular to interest me on shore, I thought I\\\\\\r\\n\\\\ would sail about a little and see the watery part of t\\\\\\r\\nhe world.\\\"\"],\r\n\r\n\t[\"string\", \"{|This is a quoted string, here, neither \\\\ nor \\\" are special characters|}\"],\r\n\t[\"string\", \"{|\\\"Hello, World!\\\"|}\"],\r\n\t[\"string\", \"{|\\\"\\\\\\\\\\\"|}\"],\r\n\t[\"string\", \"{delimiter|the end of this|}quoted string is here|delimiter}\"],\r\n\t[\"string\", \"{ext|hello {|world|}|ext}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/ocaml/type-variable_feature.test",
    "content": "'Foo\r\n'bar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"type-variable\", \"'Foo\"],\r\n\t[\"type-variable\", \"'bar_42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for type variables.\r\n"
  },
  {
    "path": "tests/languages/ocaml/variant_feature.test",
    "content": "`Foo\n`bar32\n`Baz_42\n\n----------------------------------------------------\n\n[\n\t[\"variant\", \"`Foo\"],\n\t[\"variant\", \"`bar32\"],\n\t[\"variant\", \"`Baz_42\"]\n]\n\n----------------------------------------------------\n\nChecks for polymorphic variants."
  },
  {
    "path": "tests/languages/odin/boolean_feature.test",
    "content": "false\nnil\ntrue\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"false\"],\n\t[\"boolean\", \"nil\"],\n\t[\"boolean\", \"true\"]\n]\n"
  },
  {
    "path": "tests/languages/odin/character_feature.test",
    "content": "' '\n'!'\n'\"'\n'0'\n'\\\"'\n'\\''\n'\\000'\n'\\077'\n'\\U000000'\n'\\UFFFFFF'\n'\\Uffffff'\n'\\\\'\n'\\a'\n'\\b'\n'\\e'\n'\\f'\n'\\n'\n'\\r'\n'\\t'\n'\\u0000'\n'\\uFFFF'\n'\\uffff'\n'\\v'\n'\\x00'\n'\\xFF'\n'\\xff'\n'a'\n\n----------------------------------------------------\n\n[\n\t[\"char\", [\"' '\"]],\n\t[\"char\", [\"'!'\"]],\n\t[\"char\", [\"'\\\"'\"]],\n\t[\"char\", [\"'0'\"]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\\\\"\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\'\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\000\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\077\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\U000000\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\UFFFFFF\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\Uffffff\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\\\\\\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\a\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\b\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\e\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\f\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\n\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\r\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\t\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\u0000\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\uFFFF\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\uffff\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\v\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\x00\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\xFF\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\n\t\t\"'\",\n\t\t[\"symbol\", \"\\\\xff\"],\n\t\t\"'\"\n\t]],\n\t[\"char\", [\"'a'\"]]\n]\n"
  },
  {
    "path": "tests/languages/odin/comment_feature.test",
    "content": "#!\n#! A comment\n#!!\n#!\"\"\n#!#!\n#!' '\n#!/**/\n#!//\n#!0\n#!``\n#!false\n#!if\n/*\n*/\n/* 1 /* 2 */ 1 */\n/* A comment */\n/*!*/\n/*\"\"*/\n/*\"\\a\"*/\n/*#!*/\n/*' '*/\n/*'\\a'*/\n/**/\n/*/**/*/\n/*0*/\n/*`\\a`*/\n/*``*/\n/*false*/\n/*if*/\n//\n// A comment\n//!\n//\"\"\n//#!\n//' '\n///**/\n////\n//0\n//``\n//false\n//if\nNot a comment #! A comment\nNot a comment /* A comment */\nNot a comment // A comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"#!\"],\n\t[\"comment\", \"#! A comment\"],\n\t[\"comment\", \"#!!\"],\n\t[\"comment\", \"#!\\\"\\\"\"],\n\t[\"comment\", \"#!#!\"],\n\t[\"comment\", \"#!' '\"],\n\t[\"comment\", \"#!/**/\"],\n\t[\"comment\", \"#!//\"],\n\t[\"comment\", \"#!0\"],\n\t[\"comment\", \"#!``\"],\n\t[\"comment\", \"#!false\"],\n\t[\"comment\", \"#!if\"],\n\t[\"comment\", \"/*\\r\\n*/\"],\n\t[\"comment\", \"/* 1 /* 2 */ 1 */\"],\n\t[\"comment\", \"/* A comment */\"],\n\t[\"comment\", \"/*!*/\"],\n\t[\"comment\", \"/*\\\"\\\"*/\"],\n\t[\"comment\", \"/*\\\"\\\\a\\\"*/\"],\n\t[\"comment\", \"/*#!*/\"],\n\t[\"comment\", \"/*' '*/\"],\n\t[\"comment\", \"/*'\\\\a'*/\"],\n\t[\"comment\", \"/**/\"],\n\t[\"comment\", \"/*/**/*/\"],\n\t[\"comment\", \"/*0*/\"],\n\t[\"comment\", \"/*`\\\\a`*/\"],\n\t[\"comment\", \"/*``*/\"],\n\t[\"comment\", \"/*false*/\"],\n\t[\"comment\", \"/*if*/\"],\n\t[\"comment\", \"//\"],\n\t[\"comment\", \"// A comment\"],\n\t[\"comment\", \"//!\"],\n\t[\"comment\", \"//\\\"\\\"\"],\n\t[\"comment\", \"//#!\"],\n\t[\"comment\", \"//' '\"],\n\t[\"comment\", \"///**/\"],\n\t[\"comment\", \"////\"],\n\t[\"comment\", \"//0\"],\n\t[\"comment\", \"//``\"],\n\t[\"comment\", \"//false\"],\n\t[\"comment\", \"//if\"],\n\t\"\\r\\nNot a comment \", [\"comment\", \"#! A comment\"],\n\t\"\\r\\nNot a comment \", [\"comment\", \"/* A comment */\"],\n\t\"\\r\\nNot a comment \", [\"comment\", \"// A comment\"]\n]\n"
  },
  {
    "path": "tests/languages/odin/constant_parameter_sign_feature.test",
    "content": "$\n\n----------------------------------------------------\n\n[\n\t[\"constant-parameter-sign\", \"$\"]\n]\n"
  },
  {
    "path": "tests/languages/odin/directive_feature.test",
    "content": "#assert\n#no_bounds_check\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"#assert\"],\n\t[\"directive\", \"#no_bounds_check\"]\n]\n"
  },
  {
    "path": "tests/languages/odin/discard_feature.test",
    "content": "_\n\n----------------------------------------------------\n\n[\n\t[\"discard\", \"_\"]\n]\n"
  },
  {
    "path": "tests/languages/odin/keyword_feature.test",
    "content": "asm\nauto_cast\nbit_set\nbreak\ncase\ncast\ncontext\ncontinue\ndefer\ndistinct\ndo\ndynamic\nelse\nenum\nfallthrough\nfor\nforeign\nif\nimport\nin\nmap\nmatrix\nnot_in\nor_else\nor_return\npackage\nproc\nreturn\nstruct\nswitch\ntransmute\ntypeid\nunion\nusing\nwhen\nwhere\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"asm\"],\n\t[\"keyword\", \"auto_cast\"],\n\t[\"keyword\", \"bit_set\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"cast\"],\n\t[\"keyword\", \"context\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"defer\"],\n\t[\"keyword\", \"distinct\"],\n\t[\"keyword\", \"do\"],\n\t[\"keyword\", \"dynamic\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"enum\"],\n\t[\"keyword\", \"fallthrough\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"foreign\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"map\"],\n\t[\"keyword\", \"matrix\"],\n\t[\"keyword\", \"not_in\"],\n\t[\"keyword\", \"or_else\"],\n\t[\"keyword\", \"or_return\"],\n\t[\"keyword\", \"package\"],\n\t[\"keyword\", \"proc\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"struct\"],\n\t[\"keyword\", \"switch\"],\n\t[\"keyword\", \"transmute\"],\n\t[\"keyword\", \"typeid\"],\n\t[\"keyword\", \"union\"],\n\t[\"keyword\", \"using\"],\n\t[\"keyword\", \"when\"],\n\t[\"keyword\", \"where\"]\n]\n"
  },
  {
    "path": "tests/languages/odin/not_a_number_feature.test",
    "content": "0B0\n0D0\n0I\n0O0\n0Z0\n0b\n0b2\n0d\n0h\n0h0\n0h00\n0h000\n0h00000\n0h0000000\n0h000000000\n0h000000000000000\n0h00000000000000000\n0h_\n0o\n0o8\n0x\n0X0\n0xG\n0z\n0zC\n\n----------------------------------------------------\n\n[\n\t\"0B0\\r\\n0D0\\r\\n0I\\r\\n0O0\\r\\n0Z0\\r\\n0b\\r\\n0b2\\r\\n0d\\r\\n0h\\r\\n0h0\\r\\n0h00\\r\\n0h000\\r\\n0h00000\\r\\n0h0000000\\r\\n0h000000000\\r\\n0h000000000000000\\r\\n0h00000000000000000\\r\\n0h_\\r\\n0o\\r\\n0o8\\r\\n0x\\r\\n0X0\\r\\n0xG\\r\\n0z\\r\\n0zC\"\n]\n"
  },
  {
    "path": "tests/languages/odin/number_feature.test",
    "content": ".0\n0\n0.\n0E\n0b0\n0b00\n0b01\n0b0_\n0b_\n0b_0\n0b_1\n0b__\n0d0\n0d00\n0d01\n0d0_\n0d_\n0d_0\n0d_1\n0d__\n0e\n0e+\n0e+0\n0e+0i\n0e+i\n0e-\n0e-0\n0e-0i\n0e-i\n0ei\n0h0000\n0h00000000\n0h0000000000000000\n0i\n0o0\n0o00\n0o01\n0o0_\n0o_\n0o_0\n0o_1\n0o__\n0x0\n0x00\n0x0_\n0x0F\n0x0f\n0x_\n0x_0\n0x__\n0x_F\n0x_f\n0z0\n0z00\n0z0_\n0z0B\n0z0b\n0z_\n0z_0\n0z__\n0z_B\n0z_b\n\n----------------------------------------------------\n\n[\n\t[\"number\", \".0\"],\n\t[\"number\", \"0\"],\n\t[\"number\", \"0.\"],\n\t[\"number\", \"0E\"],\n\t[\"number\", \"0b0\"],\n\t[\"number\", \"0b00\"],\n\t[\"number\", \"0b01\"],\n\t[\"number\", \"0b0_\"],\n\t[\"number\", \"0b_\"],\n\t[\"number\", \"0b_0\"],\n\t[\"number\", \"0b_1\"],\n\t[\"number\", \"0b__\"],\n\t[\"number\", \"0d0\"],\n\t[\"number\", \"0d00\"],\n\t[\"number\", \"0d01\"],\n\t[\"number\", \"0d0_\"],\n\t[\"number\", \"0d_\"],\n\t[\"number\", \"0d_0\"],\n\t[\"number\", \"0d_1\"],\n\t[\"number\", \"0d__\"],\n\t[\"number\", \"0e\"],\n\t[\"number\", \"0e+\"],\n\t[\"number\", \"0e+0\"],\n\t[\"number\", \"0e+0i\"],\n\t[\"number\", \"0e+i\"],\n\t[\"number\", \"0e-\"],\n\t[\"number\", \"0e-0\"],\n\t[\"number\", \"0e-0i\"],\n\t[\"number\", \"0e-i\"],\n\t[\"number\", \"0ei\"],\n\t[\"number\", \"0h0000\"],\n\t[\"number\", \"0h00000000\"],\n\t[\"number\", \"0h0000000000000000\"],\n\t[\"number\", \"0i\"],\n\t[\"number\", \"0o0\"],\n\t[\"number\", \"0o00\"],\n\t[\"number\", \"0o01\"],\n\t[\"number\", \"0o0_\"],\n\t[\"number\", \"0o_\"],\n\t[\"number\", \"0o_0\"],\n\t[\"number\", \"0o_1\"],\n\t[\"number\", \"0o__\"],\n\t[\"number\", \"0x0\"],\n\t[\"number\", \"0x00\"],\n\t[\"number\", \"0x0_\"],\n\t[\"number\", \"0x0F\"],\n\t[\"number\", \"0x0f\"],\n\t[\"number\", \"0x_\"],\n\t[\"number\", \"0x_0\"],\n\t[\"number\", \"0x__\"],\n\t[\"number\", \"0x_F\"],\n\t[\"number\", \"0x_f\"],\n\t[\"number\", \"0z0\"],\n\t[\"number\", \"0z00\"],\n\t[\"number\", \"0z0_\"],\n\t[\"number\", \"0z0B\"],\n\t[\"number\", \"0z0b\"],\n\t[\"number\", \"0z_\"],\n\t[\"number\", \"0z_0\"],\n\t[\"number\", \"0z__\"],\n\t[\"number\", \"0z_B\"],\n\t[\"number\", \"0z_b\"]\n]\n"
  },
  {
    "path": "tests/languages/odin/operator_feature.test",
    "content": "!\n!=\n%\n%%\n%%=\n%=\n&\n&&\n&&=\n&=\n&~\n&~=\n*\n*=\n+\n++\n+=\n-\n--\n-=\n..\n..<\n..=\n/\n/=\n<\n<<\n<<=\n<=\n=\n==\n>\n>=\n>>\n>>=\n?\n^\n|\n|=\n||\n||=\n~\n~=\n\n// ranges\n0..<10\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"%%\"],\n\t[\"operator\", \"%%=\"],\n\t[\"operator\", \"%=\"],\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"&&=\"],\n\t[\"operator\", \"&=\"],\n\t[\"operator\", \"&~\"],\n\t[\"operator\", \"&~=\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"++\"],\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"--\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"..\"],\n\t[\"operator\", \"..<\"],\n\t[\"operator\", \"..=\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \"<<=\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \">>\"],\n\t[\"operator\", \">>=\"],\n\t[\"operator\", \"?\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"|=\"],\n\t[\"operator\", \"||\"],\n\t[\"operator\", \"||=\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"~=\"],\n\n\t[\"comment\", \"// ranges\"],\n\t[\"number\", \"0\"], [\"operator\", \"..<\"], [\"number\", \"10\"]\n]\n"
  },
  {
    "path": "tests/languages/odin/procedure_feature.test",
    "content": "do_math()\nfibonacci()\nlog10()\n\ncross :: proc(a, b: Vector3) -> Vector3\n\n----------------------------------------------------\n\n[\n\t[\"procedure-name\", \"do_math\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\t[\"procedure-name\", \"fibonacci\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\t[\"procedure-name\", \"log10\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\n\t[\"procedure-definition\", \"cross\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \":\"],\n\t[\"keyword\", \"proc\"],\n\t[\"punctuation\", \"(\"],\n\t\"a\",\n\t[\"punctuation\", \",\"],\n\t\" b\",\n\t[\"punctuation\", \":\"],\n\t\" Vector3\",\n\t[\"punctuation\", \")\"],\n\t[\"arrow\", \"->\"],\n\t\" Vector3\"\n]\n"
  },
  {
    "path": "tests/languages/odin/punctuation_feature.test",
    "content": "(\n)\n,\n->\n.\n:\n;\n@\n[\n]\n{\n}\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\t[\"arrow\", \"->\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"@\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/odin/raw_string_feature.test",
    "content": "`\n`\n`!`\n`\"\"`\n`\"\\a\"`\n`' '`\n`'\\a'`\n`/**/`\n`//`\n`0`\n`\\\n`\n`\\\"`\n`\\'`\n`\\000`\n`\\077`\n`\\U000000`\n`\\UFFFFFF`\n`\\Uffffff`\n`\\\\`\n`\\a`\n`\\b`\n`\\e`\n`\\f`\n`\\n`\n`\\r`\n`\\t`\n`\\u0000`\n`\\uFFFF`\n`\\uffff`\n`\\v`\n`\\x00`\n`\\xFF`\n`\\xff`\n`A raw string.`\n``\n`false`\n`if`\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"`\\r\\n`\"],\n\t[\"string\", \"`!`\"],\n\t[\"string\", \"`\\\"\\\"`\"],\n\t[\"string\", \"`\\\"\\\\a\\\"`\"],\n\t[\"string\", \"`' '`\"],\n\t[\"string\", \"`'\\\\a'`\"],\n\t[\"string\", \"`/**/`\"],\n\t[\"string\", \"`//`\"],\n\t[\"string\", \"`0`\"],\n\t[\"string\", \"`\\\\\\r\\n`\"],\n\t[\"string\", \"`\\\\\\\"`\"],\n\t[\"string\", \"`\\\\'`\"],\n\t[\"string\", \"`\\\\000`\"],\n\t[\"string\", \"`\\\\077`\"],\n\t[\"string\", \"`\\\\U000000`\"],\n\t[\"string\", \"`\\\\UFFFFFF`\"],\n\t[\"string\", \"`\\\\Uffffff`\"],\n\t[\"string\", \"`\\\\\\\\`\"],\n\t[\"string\", \"`\\\\a`\"],\n\t[\"string\", \"`\\\\b`\"],\n\t[\"string\", \"`\\\\e`\"],\n\t[\"string\", \"`\\\\f`\"],\n\t[\"string\", \"`\\\\n`\"],\n\t[\"string\", \"`\\\\r`\"],\n\t[\"string\", \"`\\\\t`\"],\n\t[\"string\", \"`\\\\u0000`\"],\n\t[\"string\", \"`\\\\uFFFF`\"],\n\t[\"string\", \"`\\\\uffff`\"],\n\t[\"string\", \"`\\\\v`\"],\n\t[\"string\", \"`\\\\x00`\"],\n\t[\"string\", \"`\\\\xFF`\"],\n\t[\"string\", \"`\\\\xff`\"],\n\t[\"string\", \"`A raw string.`\"],\n\t[\"string\", \"``\"],\n\t[\"string\", \"`false`\"],\n\t[\"string\", \"`if`\"]\n]\n"
  },
  {
    "path": "tests/languages/odin/string_feature.test",
    "content": "\"!\"\n\"\"\n\"' '\"\n\"'\\a'\"\n\"/**/\"\n\"//\"\n\"0\"\n\"\\\"\"\n\"\\'\"\n\"\\000\"\n\"\\077\"\n\"\\U000000\"\n\"\\UFFFFFF\"\n\"\\Uffffff\"\n\"\\\\\"\n\"\\a\"\n\"\\b\"\n\"\\e\"\n\"\\f\"\n\"\\n\"\n\"\\r\"\n\"\\t\"\n\"\\u0000\"\n\"\\uFFFF\"\n\"\\uffff\"\n\"\\v\"\n\"\\x00\"\n\"\\xFF\"\n\"\\xff\"\n\"Not\na\nstring\"\n\"Not\\\na\\\nstring\"\n\"String\"\n\"String\" Not a string\"\n\"`\\a`\"\n\"``\"\n\"false\"\n\"if\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", [\"\\\"!\\\"\"]],\n\t[\"string\", [\"\\\"\\\"\"]],\n\t[\"string\", [\"\\\"' '\\\"\"]],\n\t[\"string\", [\n\t\t\"\\\"'\",\n\t\t[\"symbol\", \"\\\\a\"],\n\t\t\"'\\\"\"\n\t]],\n\t[\"string\", [\"\\\"/**/\\\"\"]],\n\t[\"string\", [\"\\\"//\\\"\"]],\n\t[\"string\", [\"\\\"0\\\"\"]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\\\\"\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\'\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\000\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\077\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\U000000\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\UFFFFFF\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\Uffffff\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\\\\\\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\a\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\b\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\e\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\f\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\n\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\r\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\t\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\u0000\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\uFFFF\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\uffff\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\v\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\x00\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\xFF\"],\n\t\t\"\\\"\"\n\t]],\n\t[\"string\", [\n\t\t\"\\\"\",\n\t\t[\"symbol\", \"\\\\xff\"],\n\t\t\"\\\"\"\n\t]],\n\t\"\\r\\n\\\"Not\\r\\na\\r\\nstring\\\"\\r\\n\\\"Not\\\\\\r\\na\\\\\\r\\nstring\\\"\\r\\n\",\n\t[\"string\", [\"\\\"String\\\"\"]],\n\t[\"string\", [\"\\\"String\\\"\"]], \" Not a string\\\"\\r\\n\",\n\t[\"string\", [\n\t\t\"\\\"`\",\n\t\t[\"symbol\", \"\\\\a\"],\n\t\t\"`\\\"\"\n\t]],\n\t[\"string\", [\"\\\"``\\\"\"]],\n\t[\"string\", [\"\\\"false\\\"\"]],\n\t[\"string\", [\"\\\"if\\\"\"]]\n]\n"
  },
  {
    "path": "tests/languages/odin/undefined_feature.test",
    "content": "---\n\n----------------------------------------------------\n\n[\n\t[\"undefined\", \"---\"]\n]\n"
  },
  {
    "path": "tests/languages/opencl/boolean_feature.test",
    "content": "false\r\ntrue\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"false\"],\r\n\t[\"boolean\", \"true\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans in OpenCL kernel code.\r\n"
  },
  {
    "path": "tests/languages/opencl/builtin-type_feature.test",
    "content": "_cl_command_queue\n_cl_context\n_cl_device_id\n_cl_event\n_cl_kernel\n_cl_mem\n_cl_platform_id\n_cl_program\n_cl_sampler\ncl_image_format\ncl_mem_fence_flags\nclk_event_t\nevent_t\nimage1d_array_t\nimage1d_buffer_t\nimage1d_t\nimage2d_array_depth_t\nimage2d_array_msaa_depth_t\nimage2d_array_msaa_t\nimage2d_array_t\nimage2d_depth_t\nimage2d_msaa_depth_t\nimage2d_msaa_t\nimage2d_t\nimage3d_t\nintptr_t\nndrange_t\nptrdiff_t\nqueue_t\nreserve_id_t\nsampler_t\nsize_t\nuintptr_t\n\n----------------------------------------------------\n\n[\n\t[\"builtin-type\", \"_cl_command_queue\"],\n\t[\"builtin-type\", \"_cl_context\"],\n\t[\"builtin-type\", \"_cl_device_id\"],\n\t[\"builtin-type\", \"_cl_event\"],\n\t[\"builtin-type\", \"_cl_kernel\"],\n\t[\"builtin-type\", \"_cl_mem\"],\n\t[\"builtin-type\", \"_cl_platform_id\"],\n\t[\"builtin-type\", \"_cl_program\"],\n\t[\"builtin-type\", \"_cl_sampler\"],\n\t[\"builtin-type\", \"cl_image_format\"],\n\t[\"builtin-type\", \"cl_mem_fence_flags\"],\n\t[\"builtin-type\", \"clk_event_t\"],\n\t[\"builtin-type\", \"event_t\"],\n\t[\"builtin-type\", \"image1d_array_t\"],\n\t[\"builtin-type\", \"image1d_buffer_t\"],\n\t[\"builtin-type\", \"image1d_t\"],\n\t[\"builtin-type\", \"image2d_array_depth_t\"],\n\t[\"builtin-type\", \"image2d_array_msaa_depth_t\"],\n\t[\"builtin-type\", \"image2d_array_msaa_t\"],\n\t[\"builtin-type\", \"image2d_array_t\"],\n\t[\"builtin-type\", \"image2d_depth_t\"],\n\t[\"builtin-type\", \"image2d_msaa_depth_t\"],\n\t[\"builtin-type\", \"image2d_msaa_t\"],\n\t[\"builtin-type\", \"image2d_t\"],\n\t[\"builtin-type\", \"image3d_t\"],\n\t[\"builtin-type\", \"intptr_t\"],\n\t[\"builtin-type\", \"ndrange_t\"],\n\t[\"builtin-type\", \"ptrdiff_t\"],\n\t[\"builtin-type\", \"queue_t\"],\n\t[\"builtin-type\", \"reserve_id_t\"],\n\t[\"builtin-type\", \"sampler_t\"],\n\t[\"builtin-type\", \"size_t\"],\n\t[\"builtin-type\", \"uintptr_t\"]\n]"
  },
  {
    "path": "tests/languages/opencl/constant_feature.test",
    "content": "CHAR_BIT\nCHAR_MAX\nCHAR_MIN\nCLK_ADDRESS_CLAMP\nCLK_ADDRESS_CLAMP_TO_EDGE\nCLK_ADDRESS_NONE\nCLK_ADDRESS_REPEAT\nCLK_FILTER_LINEAR\nCLK_FILTER_NEAREST\nCLK_GLOBAL_MEM_FENCE\nCLK_LOCAL_MEM_FENCE\nCLK_NORMALIZED_COORDS_FALSE\nCLK_NORMALIZED_COORDS_TRUE\nCL_A\nCL_ARGB\nCL_BGRA\nCL_FLOAT\nCL_HALF_FLOAT\nCL_INTENSITY\nCL_LUMINANCE\nCL_R\nCL_RA\nCL_RG\nCL_RGB\nCL_RGBA\nCL_RGBx\nCL_RGx\nCL_Rx\nCL_SIGNED_INT16\nCL_SIGNED_INT32\nCL_SIGNED_INT8\nCL_SNORM_INT16\nCL_SNORM_INT8\nCL_UNORM_INT16\nCL_UNORM_INT8\nCL_UNORM_INT_101010\nCL_UNORM_SHORT_555\nCL_UNORM_SHORT_565\nCL_UNSIGNED_INT16\nCL_UNSIGNED_INT32\nCL_UNSIGNED_INT8\nDBL_DIG\nDBL_EPSILON\nDBL_MANT_DIG\nDBL_MAX\nDBL_MAX_10_EXP\nDBL_MIN\nDBL_MIN_10_EXP\nDBL_MIN_EXP\nFLT_DIG\nFLT_EPSILON\nFLT_MANT_DIG\nFLT_MAX\nFLT_MAX_10_EXP\nFLT_MAX_EXP\nFLT_MIN\nFLT_MIN_10_EXP\nFLT_MIN_EXP\nFLT_RADIX\nHALF_DIG\nHALF_EPSILON\nHALF_MANT_DIG\nHALF_MAX\nHALF_MAX_10_EXP\nHALF_MAX_EXP\nHALF_MIN\nHALF_MIN_10_EXP\nHALF_MIN_EXP\nHUGE_VALF\nHUGE_VAL\nINFINITY\nINT_MAX\nINT_MIN\nLONG_MAX\nLONG_MIN\nMAXFLOAT\nM_1_PI\nM_2_PI\nM_2_SQRTPI\nM_E\nM_LN10\nM_LN2\nM_LOG10E\nM_LOG2E\nM_PI\nM_PI_2\nM_PI_4\nM_SQRT1_2\nM_SQRT2\nM_1_PI_F\nM_2_PI_F\nM_2_SQRTPI_F\nM_E_F\nM_LN10_F\nM_LN2_F\nM_LOG10E_F\nM_LOG2E_F\nM_PI_F\nM_PI_2_F\nM_PI_4_F\nM_SQRT1_2_F\nM_SQRT2_F\nM_1_PI_H\nM_2_PI_H\nM_2_SQRTPI_H\nM_E_H\nM_LN10_H\nM_LN2_H\nM_LOG10E_H\nM_LOG2E_H\nM_PI_H\nM_PI_2_H\nM_PI_4_H\nM_SQRT1_2_H\nM_SQRT2_H\nNAN\nSCHAR_MAX\nSCHAR_MIN\nSHRT_MAX\nSHRT_MIN\nUCHAR_MAX\nUSHRT_MAX\nUINT_MAX\nULONG_MAX\n\n----------------------------------------------------\n\n[\n\t[\"constant-opencl-kernel\", \"CHAR_BIT\"],\n\t[\"constant-opencl-kernel\", \"CHAR_MAX\"],\n\t[\"constant-opencl-kernel\", \"CHAR_MIN\"],\n\t[\"constant-opencl-kernel\", \"CLK_ADDRESS_CLAMP\"],\n\t[\"constant-opencl-kernel\", \"CLK_ADDRESS_CLAMP_TO_EDGE\"],\n\t[\"constant-opencl-kernel\", \"CLK_ADDRESS_NONE\"],\n\t[\"constant-opencl-kernel\", \"CLK_ADDRESS_REPEAT\"],\n\t[\"constant-opencl-kernel\", \"CLK_FILTER_LINEAR\"],\n\t[\"constant-opencl-kernel\", \"CLK_FILTER_NEAREST\"],\n\t[\"constant-opencl-kernel\", \"CLK_GLOBAL_MEM_FENCE\"],\n\t[\"constant-opencl-kernel\", \"CLK_LOCAL_MEM_FENCE\"],\n\t[\"constant-opencl-kernel\", \"CLK_NORMALIZED_COORDS_FALSE\"],\n\t[\"constant-opencl-kernel\", \"CLK_NORMALIZED_COORDS_TRUE\"],\n\t[\"constant-opencl-kernel\", \"CL_A\"],\n\t[\"constant-opencl-kernel\", \"CL_ARGB\"],\n\t[\"constant-opencl-kernel\", \"CL_BGRA\"],\n\t[\"constant-opencl-kernel\", \"CL_FLOAT\"],\n\t[\"constant-opencl-kernel\", \"CL_HALF_FLOAT\"],\n\t[\"constant-opencl-kernel\", \"CL_INTENSITY\"],\n\t[\"constant-opencl-kernel\", \"CL_LUMINANCE\"],\n\t[\"constant-opencl-kernel\", \"CL_R\"],\n\t[\"constant-opencl-kernel\", \"CL_RA\"],\n\t[\"constant-opencl-kernel\", \"CL_RG\"],\n\t[\"constant-opencl-kernel\", \"CL_RGB\"],\n\t[\"constant-opencl-kernel\", \"CL_RGBA\"],\n\t[\"constant-opencl-kernel\", \"CL_RGBx\"],\n\t[\"constant-opencl-kernel\", \"CL_RGx\"],\n\t[\"constant-opencl-kernel\", \"CL_Rx\"],\n\t[\"constant-opencl-kernel\", \"CL_SIGNED_INT16\"],\n\t[\"constant-opencl-kernel\", \"CL_SIGNED_INT32\"],\n\t[\"constant-opencl-kernel\", \"CL_SIGNED_INT8\"],\n\t[\"constant-opencl-kernel\", \"CL_SNORM_INT16\"],\n\t[\"constant-opencl-kernel\", \"CL_SNORM_INT8\"],\n\t[\"constant-opencl-kernel\", \"CL_UNORM_INT16\"],\n\t[\"constant-opencl-kernel\", \"CL_UNORM_INT8\"],\n\t[\"constant-opencl-kernel\", \"CL_UNORM_INT_101010\"],\n\t[\"constant-opencl-kernel\", \"CL_UNORM_SHORT_555\"],\n\t[\"constant-opencl-kernel\", \"CL_UNORM_SHORT_565\"],\n\t[\"constant-opencl-kernel\", \"CL_UNSIGNED_INT16\"],\n\t[\"constant-opencl-kernel\", \"CL_UNSIGNED_INT32\"],\n\t[\"constant-opencl-kernel\", \"CL_UNSIGNED_INT8\"],\n\t[\"constant-opencl-kernel\", \"DBL_DIG\"],\n\t[\"constant-opencl-kernel\", \"DBL_EPSILON\"],\n\t[\"constant-opencl-kernel\", \"DBL_MANT_DIG\"],\n\t[\"constant-opencl-kernel\", \"DBL_MAX\"],\n\t[\"constant-opencl-kernel\", \"DBL_MAX_10_EXP\"],\n\t[\"constant-opencl-kernel\", \"DBL_MIN\"],\n\t[\"constant-opencl-kernel\", \"DBL_MIN_10_EXP\"],\n\t[\"constant-opencl-kernel\", \"DBL_MIN_EXP\"],\n\t[\"constant-opencl-kernel\", \"FLT_DIG\"],\n\t[\"constant-opencl-kernel\", \"FLT_EPSILON\"],\n\t[\"constant-opencl-kernel\", \"FLT_MANT_DIG\"],\n\t[\"constant-opencl-kernel\", \"FLT_MAX\"],\n\t[\"constant-opencl-kernel\", \"FLT_MAX_10_EXP\"],\n\t[\"constant-opencl-kernel\", \"FLT_MAX_EXP\"],\n\t[\"constant-opencl-kernel\", \"FLT_MIN\"],\n\t[\"constant-opencl-kernel\", \"FLT_MIN_10_EXP\"],\n\t[\"constant-opencl-kernel\", \"FLT_MIN_EXP\"],\n\t[\"constant-opencl-kernel\", \"FLT_RADIX\"],\n\t[\"constant-opencl-kernel\", \"HALF_DIG\"],\n\t[\"constant-opencl-kernel\", \"HALF_EPSILON\"],\n\t[\"constant-opencl-kernel\", \"HALF_MANT_DIG\"],\n\t[\"constant-opencl-kernel\", \"HALF_MAX\"],\n\t[\"constant-opencl-kernel\", \"HALF_MAX_10_EXP\"],\n\t[\"constant-opencl-kernel\", \"HALF_MAX_EXP\"],\n\t[\"constant-opencl-kernel\", \"HALF_MIN\"],\n\t[\"constant-opencl-kernel\", \"HALF_MIN_10_EXP\"],\n\t[\"constant-opencl-kernel\", \"HALF_MIN_EXP\"],\n\t[\"constant-opencl-kernel\", \"HUGE_VALF\"],\n\t[\"constant-opencl-kernel\", \"HUGE_VAL\"],\n\t[\"constant-opencl-kernel\", \"INFINITY\"],\n\t[\"constant-opencl-kernel\", \"INT_MAX\"],\n\t[\"constant-opencl-kernel\", \"INT_MIN\"],\n\t[\"constant-opencl-kernel\", \"LONG_MAX\"],\n\t[\"constant-opencl-kernel\", \"LONG_MIN\"],\n\t[\"constant-opencl-kernel\", \"MAXFLOAT\"],\n\t[\"constant-opencl-kernel\", \"M_1_PI\"],\n\t[\"constant-opencl-kernel\", \"M_2_PI\"],\n\t[\"constant-opencl-kernel\", \"M_2_SQRTPI\"],\n\t[\"constant-opencl-kernel\", \"M_E\"],\n\t[\"constant-opencl-kernel\", \"M_LN10\"],\n\t[\"constant-opencl-kernel\", \"M_LN2\"],\n\t[\"constant-opencl-kernel\", \"M_LOG10E\"],\n\t[\"constant-opencl-kernel\", \"M_LOG2E\"],\n\t[\"constant-opencl-kernel\", \"M_PI\"],\n\t[\"constant-opencl-kernel\", \"M_PI_2\"],\n\t[\"constant-opencl-kernel\", \"M_PI_4\"],\n\t[\"constant-opencl-kernel\", \"M_SQRT1_2\"],\n\t[\"constant-opencl-kernel\", \"M_SQRT2\"],\n\t[\"constant-opencl-kernel\", \"M_1_PI_F\"],\n\t[\"constant-opencl-kernel\", \"M_2_PI_F\"],\n\t[\"constant-opencl-kernel\", \"M_2_SQRTPI_F\"],\n\t[\"constant-opencl-kernel\", \"M_E_F\"],\n\t[\"constant-opencl-kernel\", \"M_LN10_F\"],\n\t[\"constant-opencl-kernel\", \"M_LN2_F\"],\n\t[\"constant-opencl-kernel\", \"M_LOG10E_F\"],\n\t[\"constant-opencl-kernel\", \"M_LOG2E_F\"],\n\t[\"constant-opencl-kernel\", \"M_PI_F\"],\n\t[\"constant-opencl-kernel\", \"M_PI_2_F\"],\n\t[\"constant-opencl-kernel\", \"M_PI_4_F\"],\n\t[\"constant-opencl-kernel\", \"M_SQRT1_2_F\"],\n\t[\"constant-opencl-kernel\", \"M_SQRT2_F\"],\n\t[\"constant-opencl-kernel\", \"M_1_PI_H\"],\n\t[\"constant-opencl-kernel\", \"M_2_PI_H\"],\n\t[\"constant-opencl-kernel\", \"M_2_SQRTPI_H\"],\n\t[\"constant-opencl-kernel\", \"M_E_H\"],\n\t[\"constant-opencl-kernel\", \"M_LN10_H\"],\n\t[\"constant-opencl-kernel\", \"M_LN2_H\"],\n\t[\"constant-opencl-kernel\", \"M_LOG10E_H\"],\n\t[\"constant-opencl-kernel\", \"M_LOG2E_H\"],\n\t[\"constant-opencl-kernel\", \"M_PI_H\"],\n\t[\"constant-opencl-kernel\", \"M_PI_2_H\"],\n\t[\"constant-opencl-kernel\", \"M_PI_4_H\"],\n\t[\"constant-opencl-kernel\", \"M_SQRT1_2_H\"],\n\t[\"constant-opencl-kernel\", \"M_SQRT2_H\"],\n\t[\"constant-opencl-kernel\", \"NAN\"],\n\t[\"constant-opencl-kernel\", \"SCHAR_MAX\"],\n\t[\"constant-opencl-kernel\", \"SCHAR_MIN\"],\n\t[\"constant-opencl-kernel\", \"SHRT_MAX\"],\n\t[\"constant-opencl-kernel\", \"SHRT_MIN\"],\n\t[\"constant-opencl-kernel\", \"UCHAR_MAX\"],\n\t[\"constant-opencl-kernel\", \"USHRT_MAX\"],\n\t[\"constant-opencl-kernel\", \"UINT_MAX\"],\n\t[\"constant-opencl-kernel\", \"ULONG_MAX\"]\n]\n\n----------------------------------------------------\n\nChecks for all constant names in OpenCL kernel code.\n"
  },
  {
    "path": "tests/languages/opencl/keyword_feature.test",
    "content": "__attribute__\n__constant\n__global\n__kernel\n__local\n__private\n__read_only\n__read_write\n__write_only\nauto\nbool\nbool16\nbool2\nbool3\nbool4\nbool8\nbreak\ncase\nchar\nchar16\nchar2\nchar3\nchar4\nchar8\ncomplex\nconst\nconstant\ncontinue\ndo\ndouble\ndouble16\ndouble16x1\ndouble16x16\ndouble16x2\ndouble16x4\ndouble16x8\ndouble1x1\ndouble1x16\ndouble1x2\ndouble1x4\ndouble1x8\ndouble2\ndouble2x1\ndouble2x16\ndouble2x2\ndouble2x4\ndouble2x8\ndouble3\ndouble4\ndouble4x1\ndouble4x16\ndouble4x2\ndouble4x4\ndouble4x8\ndouble8\ndouble8x1\ndouble8x16\ndouble8x2\ndouble8x4\ndouble8x8\nelse\nenum;\nextern\nfloat\nfloat16\nfloat16x1\nfloat16x16\nfloat16x2\nfloat16x4\nfloat16x8\nfloat1x1\nfloat1x16\nfloat1x2\nfloat1x4\nfloat1x8\nfloat2\nfloat2x1\nfloat2x16\nfloat2x2\nfloat2x4\nfloat2x8\nfloat3\nfloat4\nfloat4x1\nfloat4x16\nfloat4x2\nfloat4x4\nfloat4x8\nfloat8\nfloat8x1\nfloat8x16\nfloat8x2\nfloat8x4\nfloat8x8\nfor\nglobal\nhalf\nhalf16\nhalf2\nhalf3\nhalf4\nhalf8\nif\nimaginary\nint\nint16\nint2\nint3\nint4\nint8\nkernel\nlocal\nlong\nlong16\nlong2\nlong3\nlong4\nlong8\npacked\npipe\nprivate\nquad\nquad16\nquad2\nquad3\nquad4\nquad8\nread_only\nread_write\nregister\nrestrict\nshort\nshort16\nshort2\nshort3\nshort4\nshort8\nstatic\nstruct;\nswitch\ntypedef\nuchar\nuchar16\nuchar2\nuchar3\nuchar4\nuchar8\nuint\nuint16\nuint2\nuint3\nuint4\nuint8\nulong\nulong16\nulong2\nulong3\nulong4\nulong8\nuniform\nunion\nunsigned\nushort\nushort16\nushort2\nushort3\nushort4\nushort8\nvoid\nvolatile\nwhile\nwrite_only\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"__attribute__\"],\n\t[\"keyword\", \"__constant\"],\n\t[\"keyword\", \"__global\"],\n\t[\"keyword\", \"__kernel\"],\n\t[\"keyword\", \"__local\"],\n\t[\"keyword\", \"__private\"],\n\t[\"keyword\", \"__read_only\"],\n\t[\"keyword\", \"__read_write\"],\n\t[\"keyword\", \"__write_only\"],\n\t[\"keyword\", \"auto\"],\n\t[\"keyword\", \"bool\"],\n\t[\"keyword\", \"bool16\"],\n\t[\"keyword\", \"bool2\"],\n\t[\"keyword\", \"bool3\"],\n\t[\"keyword\", \"bool4\"],\n\t[\"keyword\", \"bool8\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"char\"],\n\t[\"keyword\", \"char16\"],\n\t[\"keyword\", \"char2\"],\n\t[\"keyword\", \"char3\"],\n\t[\"keyword\", \"char4\"],\n\t[\"keyword\", \"char8\"],\n\t[\"keyword\", \"complex\"],\n\t[\"keyword\", \"const\"],\n\t[\"keyword\", \"constant\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"do\"],\n\t[\"keyword\", \"double\"],\n\t[\"keyword\", \"double16\"],\n\t[\"keyword\", \"double16x1\"],\n\t[\"keyword\", \"double16x16\"],\n\t[\"keyword\", \"double16x2\"],\n\t[\"keyword\", \"double16x4\"],\n\t[\"keyword\", \"double16x8\"],\n\t[\"keyword\", \"double1x1\"],\n\t[\"keyword\", \"double1x16\"],\n\t[\"keyword\", \"double1x2\"],\n\t[\"keyword\", \"double1x4\"],\n\t[\"keyword\", \"double1x8\"],\n\t[\"keyword\", \"double2\"],\n\t[\"keyword\", \"double2x1\"],\n\t[\"keyword\", \"double2x16\"],\n\t[\"keyword\", \"double2x2\"],\n\t[\"keyword\", \"double2x4\"],\n\t[\"keyword\", \"double2x8\"],\n\t[\"keyword\", \"double3\"],\n\t[\"keyword\", \"double4\"],\n\t[\"keyword\", \"double4x1\"],\n\t[\"keyword\", \"double4x16\"],\n\t[\"keyword\", \"double4x2\"],\n\t[\"keyword\", \"double4x4\"],\n\t[\"keyword\", \"double4x8\"],\n\t[\"keyword\", \"double8\"],\n\t[\"keyword\", \"double8x1\"],\n\t[\"keyword\", \"double8x16\"],\n\t[\"keyword\", \"double8x2\"],\n\t[\"keyword\", \"double8x4\"],\n\t[\"keyword\", \"double8x8\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"enum\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"extern\"],\n\t[\"keyword\", \"float\"],\n\t[\"keyword\", \"float16\"],\n\t[\"keyword\", \"float16x1\"],\n\t[\"keyword\", \"float16x16\"],\n\t[\"keyword\", \"float16x2\"],\n\t[\"keyword\", \"float16x4\"],\n\t[\"keyword\", \"float16x8\"],\n\t[\"keyword\", \"float1x1\"],\n\t[\"keyword\", \"float1x16\"],\n\t[\"keyword\", \"float1x2\"],\n\t[\"keyword\", \"float1x4\"],\n\t[\"keyword\", \"float1x8\"],\n\t[\"keyword\", \"float2\"],\n\t[\"keyword\", \"float2x1\"],\n\t[\"keyword\", \"float2x16\"],\n\t[\"keyword\", \"float2x2\"],\n\t[\"keyword\", \"float2x4\"],\n\t[\"keyword\", \"float2x8\"],\n\t[\"keyword\", \"float3\"],\n\t[\"keyword\", \"float4\"],\n\t[\"keyword\", \"float4x1\"],\n\t[\"keyword\", \"float4x16\"],\n\t[\"keyword\", \"float4x2\"],\n\t[\"keyword\", \"float4x4\"],\n\t[\"keyword\", \"float4x8\"],\n\t[\"keyword\", \"float8\"],\n\t[\"keyword\", \"float8x1\"],\n\t[\"keyword\", \"float8x16\"],\n\t[\"keyword\", \"float8x2\"],\n\t[\"keyword\", \"float8x4\"],\n\t[\"keyword\", \"float8x8\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"global\"],\n\t[\"keyword\", \"half\"],\n\t[\"keyword\", \"half16\"],\n\t[\"keyword\", \"half2\"],\n\t[\"keyword\", \"half3\"],\n\t[\"keyword\", \"half4\"],\n\t[\"keyword\", \"half8\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"imaginary\"],\n\t[\"keyword\", \"int\"],\n\t[\"keyword\", \"int16\"],\n\t[\"keyword\", \"int2\"],\n\t[\"keyword\", \"int3\"],\n\t[\"keyword\", \"int4\"],\n\t[\"keyword\", \"int8\"],\n\t[\"keyword\", \"kernel\"],\n\t[\"keyword\", \"local\"],\n\t[\"keyword\", \"long\"],\n\t[\"keyword\", \"long16\"],\n\t[\"keyword\", \"long2\"],\n\t[\"keyword\", \"long3\"],\n\t[\"keyword\", \"long4\"],\n\t[\"keyword\", \"long8\"],\n\t[\"keyword\", \"packed\"],\n\t[\"keyword\", \"pipe\"],\n\t[\"keyword\", \"private\"],\n\t[\"keyword\", \"quad\"],\n\t[\"keyword\", \"quad16\"],\n\t[\"keyword\", \"quad2\"],\n\t[\"keyword\", \"quad3\"],\n\t[\"keyword\", \"quad4\"],\n\t[\"keyword\", \"quad8\"],\n\t[\"keyword\", \"read_only\"],\n\t[\"keyword\", \"read_write\"],\n\t[\"keyword\", \"register\"],\n\t[\"keyword\", \"restrict\"],\n\t[\"keyword\", \"short\"],\n\t[\"keyword\", \"short16\"],\n\t[\"keyword\", \"short2\"],\n\t[\"keyword\", \"short3\"],\n\t[\"keyword\", \"short4\"],\n\t[\"keyword\", \"short8\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"struct\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"switch\"],\n\t[\"keyword\", \"typedef\"],\n\t[\"keyword\", \"uchar\"],\n\t[\"keyword\", \"uchar16\"],\n\t[\"keyword\", \"uchar2\"],\n\t[\"keyword\", \"uchar3\"],\n\t[\"keyword\", \"uchar4\"],\n\t[\"keyword\", \"uchar8\"],\n\t[\"keyword\", \"uint\"],\n\t[\"keyword\", \"uint16\"],\n\t[\"keyword\", \"uint2\"],\n\t[\"keyword\", \"uint3\"],\n\t[\"keyword\", \"uint4\"],\n\t[\"keyword\", \"uint8\"],\n\t[\"keyword\", \"ulong\"],\n\t[\"keyword\", \"ulong16\"],\n\t[\"keyword\", \"ulong2\"],\n\t[\"keyword\", \"ulong3\"],\n\t[\"keyword\", \"ulong4\"],\n\t[\"keyword\", \"ulong8\"],\n\t[\"keyword\", \"uniform\"],\n\t[\"keyword\", \"union\"],\n\t[\"keyword\", \"unsigned\"],\n\t[\"keyword\", \"ushort\"],\n\t[\"keyword\", \"ushort16\"],\n\t[\"keyword\", \"ushort2\"],\n\t[\"keyword\", \"ushort3\"],\n\t[\"keyword\", \"ushort4\"],\n\t[\"keyword\", \"ushort8\"],\n\t[\"keyword\", \"void\"],\n\t[\"keyword\", \"volatile\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"write_only\"]\n]\n\n----------------------------------------------------\n\nChecks for all keywords in OpenCL kernel code."
  },
  {
    "path": "tests/languages/opencl/number_feature.test",
    "content": "42\r\n3.14159\r\n4e10\r\n2.1e-10\r\n2.1e-10f\r\n2.1e-10h\r\n0.4e+2\r\n0xbabe\r\n0xBABE\r\n0x1.2\r\n0x0.3p-3\r\n0x0.3p-3f\r\n0x0.3p-3h\r\n0x0.3p4L\r\n42f\r\n42F\r\n42h\r\n42H\r\n42u\r\n42U\r\n42l\r\n42L\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"4e10\"],\r\n\t[\"number\", \"2.1e-10\"],\r\n\t[\"number\", \"2.1e-10f\"],\r\n\t[\"number\", \"2.1e-10h\"],\r\n\t[\"number\", \"0.4e+2\"],\r\n\t[\"number\", \"0xbabe\"],\r\n\t[\"number\", \"0xBABE\"],\r\n\t[\"number\", \"0x1.2\"],\r\n\t[\"number\", \"0x0.3p-3\"],\r\n\t[\"number\", \"0x0.3p-3f\"],\r\n\t[\"number\", \"0x0.3p-3h\"],\r\n\t[\"number\", \"0x0.3p4L\"],\r\n\t[\"number\", \"42f\"],\r\n\t[\"number\", \"42F\"],\r\n\t[\"number\", \"42h\"],\r\n\t[\"number\", \"42H\"],\r\n\t[\"number\", \"42u\"],\r\n\t[\"number\", \"42U\"],\r\n\t[\"number\", \"42l\"],\r\n\t[\"number\", \"42L\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers in OpenCL kernel code.\r\n"
  },
  {
    "path": "tests/languages/opencl-extensions+c/boolean_feature.test",
    "content": "CL_TRUE\nCL_FALSE\n\n----------------------------------------------------\n\n[\n\t[\"boolean-opencl-host\", \"CL_TRUE\"],\n\t[\"boolean-opencl-host\", \"CL_FALSE\"]\n]\n\n----------------------------------------------------\n\nChecks for reserved boolean types in OpenCL host code (C-API).\n"
  },
  {
    "path": "tests/languages/opencl-extensions+c/constant_feature.test",
    "content": "CL_A\nCL_ABGR\nCL_ADDRESS_CLAMP\nCL_ADDRESS_CLAMP_TO_EDGE\nCL_ADDRESS_MIRRORED_REPEAT\nCL_ADDRESS_NONE\nCL_ADDRESS_REPEAT\nCL_ARGB\nCL_BGRA\nCL_BLOCKING\nCL_BUFFER_CREATE_TYPE_REGION\nCL_BUILD_ERROR\nCL_BUILD_IN_PROGRESS\nCL_BUILD_NONE\nCL_BUILD_PROGRAM_FAILURE\nCL_BUILD_SUCCESS\nCL_COMMAND_ACQUIRE_GL_OBJECTS\nCL_COMMAND_BARRIER\nCL_COMMAND_COPY_BUFFER\nCL_COMMAND_COPY_BUFFER_RECT\nCL_COMMAND_COPY_BUFFER_TO_IMAGE\nCL_COMMAND_COPY_IMAGE\nCL_COMMAND_COPY_IMAGE_TO_BUFFER\nCL_COMMAND_FILL_BUFFER\nCL_COMMAND_FILL_IMAGE\nCL_COMMAND_MAP_BUFFER\nCL_COMMAND_MAP_IMAGE\nCL_COMMAND_MARKER\nCL_COMMAND_MIGRATE_MEM_OBJECTS\nCL_COMMAND_MIGRATE_SVM_MEM_OBJECTS\nCL_COMMAND_NATIVE_KERNEL\nCL_COMMAND_NDRANGE_KERNEL\nCL_COMMAND_READ_BUFFER\nCL_COMMAND_READ_BUFFER_RECT\nCL_COMMAND_READ_IMAGE\nCL_COMMAND_RELEASE_GL_OBJECTS\nCL_COMMAND_SVM_FREE\nCL_COMMAND_SVM_MAP\nCL_COMMAND_SVM_MEMCPY\nCL_COMMAND_SVM_MEMFILL\nCL_COMMAND_SVM_UNMAP\nCL_COMMAND_TASK\nCL_COMMAND_UNMAP_MEM_OBJECT\nCL_COMMAND_USER\nCL_COMMAND_WRITE_BUFFER\nCL_COMMAND_WRITE_BUFFER_RECT\nCL_COMMAND_WRITE_IMAGE\nCL_COMPILER_NOT_AVAILABLE\nCL_COMPILE_PROGRAM_FAILURE\nCL_COMPLETE\nCL_CONTEXT_DEVICES\nCL_CONTEXT_INTEROP_USER_SYNC\nCL_CONTEXT_NUM_DEVICES\nCL_CONTEXT_PLATFORM\nCL_CONTEXT_PROPERTIES\nCL_CONTEXT_REFERENCE_COUNT\nCL_DEPTH\nCL_DEPTH_STENCIL\nCL_DEVICE_ADDRESS_BITS\nCL_DEVICE_AFFINITY_DOMAIN_L1_CACHE\nCL_DEVICE_AFFINITY_DOMAIN_L2_CACHE\nCL_DEVICE_AFFINITY_DOMAIN_L3_CACHE\nCL_DEVICE_AFFINITY_DOMAIN_L4_CACHE\nCL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE\nCL_DEVICE_AFFINITY_DOMAIN_NUMA\nCL_DEVICE_AVAILABLE\nCL_DEVICE_BUILT_IN_KERNELS\nCL_DEVICE_COMPILER_AVAILABLE\nCL_DEVICE_DOUBLE_FP_CONFIG\nCL_DEVICE_ENDIAN_LITTLE\nCL_DEVICE_ERROR_CORRECTION_SUPPORT\nCL_DEVICE_EXECUTION_CAPABILITIES\nCL_DEVICE_EXTENSIONS\nCL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE\nCL_DEVICE_GLOBAL_MEM_CACHE_SIZE\nCL_DEVICE_GLOBAL_MEM_CACHE_TYPE\nCL_DEVICE_GLOBAL_MEM_SIZE\nCL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE\nCL_DEVICE_HOST_UNIFIED_MEMORY\nCL_DEVICE_IL_VERSION\nCL_DEVICE_IMAGE2D_MAX_HEIGHT\nCL_DEVICE_IMAGE2D_MAX_WIDTH\nCL_DEVICE_IMAGE3D_MAX_DEPTH\nCL_DEVICE_IMAGE3D_MAX_HEIGHT\nCL_DEVICE_IMAGE3D_MAX_WIDTH\nCL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT\nCL_DEVICE_IMAGE_MAX_ARRAY_SIZE\nCL_DEVICE_IMAGE_MAX_BUFFER_SIZE\nCL_DEVICE_IMAGE_PITCH_ALIGNMENT\nCL_DEVICE_IMAGE_SUPPORT\nCL_DEVICE_LINKER_AVAILABLE\nCL_DEVICE_LOCAL_MEM_SIZE\nCL_DEVICE_LOCAL_MEM_TYPE\nCL_DEVICE_MAX_CLOCK_FREQUENCY\nCL_DEVICE_MAX_COMPUTE_UNITS\nCL_DEVICE_MAX_CONSTANT_ARGS\nCL_DEVICE_MAX_CONSTANT_BUFFER_SIZE\nCL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE\nCL_DEVICE_MAX_MEM_ALLOC_SIZE\nCL_DEVICE_MAX_NUM_SUB_GROUPS\nCL_DEVICE_MAX_ON_DEVICE_EVENTS\nCL_DEVICE_MAX_ON_DEVICE_QUEUES\nCL_DEVICE_MAX_PARAMETER_SIZE\nCL_DEVICE_MAX_PIPE_ARGS\nCL_DEVICE_MAX_READ_IMAGE_ARGS\nCL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS\nCL_DEVICE_MAX_SAMPLERS\nCL_DEVICE_MAX_WORK_GROUP_SIZE\nCL_DEVICE_MAX_WORK_ITEM_DIMENSIONS\nCL_DEVICE_MAX_WORK_ITEM_SIZES\nCL_DEVICE_MAX_WRITE_IMAGE_ARGS\nCL_DEVICE_MEM_BASE_ADDR_ALIGN\nCL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE\nCL_DEVICE_NAME\nCL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR\nCL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE\nCL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT\nCL_DEVICE_NATIVE_VECTOR_WIDTH_HALF\nCL_DEVICE_NATIVE_VECTOR_WIDTH_INT\nCL_DEVICE_NATIVE_VECTOR_WIDTH_LONG\nCL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT\nCL_DEVICE_NOT_AVAILABLE\nCL_DEVICE_NOT_FOUND\nCL_DEVICE_OPENCL_C_VERSION\nCL_DEVICE_PARENT_DEVICE\nCL_DEVICE_PARTITION_AFFINITY_DOMAIN\nCL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN\nCL_DEVICE_PARTITION_BY_COUNTS\nCL_DEVICE_PARTITION_BY_COUNTS_LIST_END\nCL_DEVICE_PARTITION_EQUALLY\nCL_DEVICE_PARTITION_FAILED\nCL_DEVICE_PARTITION_MAX_SUB_DEVICES\nCL_DEVICE_PARTITION_PROPERTIES\nCL_DEVICE_PARTITION_TYPE\nCL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS\nCL_DEVICE_PIPE_MAX_PACKET_SIZE\nCL_DEVICE_PLATFORM\nCL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT\nCL_DEVICE_PREFERRED_INTEROP_USER_SYNC\nCL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT\nCL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT\nCL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR\nCL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE\nCL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT\nCL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF\nCL_DEVICE_PREFERRED_VECTOR_WIDTH_INT\nCL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG\nCL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT\nCL_DEVICE_PRINTF_BUFFER_SIZE\nCL_DEVICE_PROFILE\nCL_DEVICE_PROFILING_TIMER_RESOLUTION\nCL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE\nCL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE\nCL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES\nCL_DEVICE_QUEUE_ON_HOST_PROPERTIES\nCL_DEVICE_QUEUE_PROPERTIES\nCL_DEVICE_REFERENCE_COUNT\nCL_DEVICE_SINGLE_FP_CONFIG\nCL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS\nCL_DEVICE_SVM_ATOMICS\nCL_DEVICE_SVM_CAPABILITIES\nCL_DEVICE_SVM_COARSE_GRAIN_BUFFER\nCL_DEVICE_SVM_FINE_GRAIN_BUFFER\nCL_DEVICE_SVM_FINE_GRAIN_SYSTEM\nCL_DEVICE_TYPE\nCL_DEVICE_TYPE_ACCELERATOR\nCL_DEVICE_TYPE_ALL\nCL_DEVICE_TYPE_CPU\nCL_DEVICE_TYPE_CUSTOM\nCL_DEVICE_TYPE_DEFAULT\nCL_DEVICE_TYPE_GPU\nCL_DEVICE_VENDOR\nCL_DEVICE_VENDOR_ID\nCL_DEVICE_VERSION\nCL_DRIVER_VERSION\nCL_EVENT_COMMAND_EXECUTION_STATUS\nCL_EVENT_COMMAND_QUEUE\nCL_EVENT_COMMAND_TYPE\nCL_EVENT_CONTEXT\nCL_EVENT_REFERENCE_COUNT\nCL_EXEC_KERNEL\nCL_EXEC_NATIVE_KERNEL\nCL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST\nCL_FILTER_LINEAR\nCL_FILTER_NEAREST\nCL_FLOAT\nCL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT\nCL_FP_DENORM\nCL_FP_FMA\nCL_FP_INF_NAN\nCL_FP_ROUND_TO_INF\nCL_FP_ROUND_TO_NEAREST\nCL_FP_ROUND_TO_ZERO\nCL_FP_SOFT_FLOAT\nCL_GLOBAL\nCL_HALF_FLOAT\nCL_IMAGE_ARRAY_SIZE\nCL_IMAGE_BUFFER\nCL_IMAGE_DEPTH\nCL_IMAGE_ELEMENT_SIZE\nCL_IMAGE_FORMAT\nCL_IMAGE_FORMAT_MISMATCH\nCL_IMAGE_FORMAT_NOT_SUPPORTED\nCL_IMAGE_HEIGHT\nCL_IMAGE_NUM_MIP_LEVELS\nCL_IMAGE_NUM_SAMPLES\nCL_IMAGE_ROW_PITCH\nCL_IMAGE_SLICE_PITCH\nCL_IMAGE_WIDTH\nCL_INTENSITY\nCL_INVALID_ARG_INDEX\nCL_INVALID_ARG_SIZE\nCL_INVALID_ARG_VALUE\nCL_INVALID_BINARY\nCL_INVALID_BUFFER_SIZE\nCL_INVALID_BUILD_OPTIONS\nCL_INVALID_COMMAND_QUEUE\nCL_INVALID_COMPILER_OPTIONS\nCL_INVALID_CONTEXT\nCL_INVALID_DEVICE\nCL_INVALID_DEVICE_PARTITION_COUNT\nCL_INVALID_DEVICE_QUEUE\nCL_INVALID_DEVICE_TYPE\nCL_INVALID_EVENT\nCL_INVALID_EVENT_WAIT_LIST\nCL_INVALID_GLOBAL_OFFSET\nCL_INVALID_GLOBAL_WORK_SIZE\nCL_INVALID_GL_OBJECT\nCL_INVALID_HOST_PTR\nCL_INVALID_IMAGE_DESCRIPTOR\nCL_INVALID_IMAGE_FORMAT_DESCRIPTOR\nCL_INVALID_IMAGE_SIZE\nCL_INVALID_KERNEL\nCL_INVALID_KERNEL_ARGS\nCL_INVALID_KERNEL_DEFINITION\nCL_INVALID_KERNEL_NAME\nCL_INVALID_LINKER_OPTIONS\nCL_INVALID_MEM_OBJECT\nCL_INVALID_MIP_LEVEL\nCL_INVALID_OPERATION\nCL_INVALID_PIPE_SIZE\nCL_INVALID_PLATFORM\nCL_INVALID_PROGRAM\nCL_INVALID_PROGRAM_EXECUTABLE\nCL_INVALID_PROPERTY\nCL_INVALID_QUEUE_PROPERTIES\nCL_INVALID_SAMPLER\nCL_INVALID_VALUE\nCL_INVALID_WORK_DIMENSION\nCL_INVALID_WORK_GROUP_SIZE\nCL_INVALID_WORK_ITEM_SIZE\nCL_KERNEL_ARG_ACCESS_NONE\nCL_KERNEL_ARG_ACCESS_QUALIFIER\nCL_KERNEL_ARG_ACCESS_READ_ONLY\nCL_KERNEL_ARG_ACCESS_READ_WRITE\nCL_KERNEL_ARG_ACCESS_WRITE_ONLY\nCL_KERNEL_ARG_ADDRESS_CONSTANT\nCL_KERNEL_ARG_ADDRESS_GLOBAL\nCL_KERNEL_ARG_ADDRESS_LOCAL\nCL_KERNEL_ARG_ADDRESS_PRIVATE\nCL_KERNEL_ARG_ADDRESS_QUALIFIER\nCL_KERNEL_ARG_INFO_NOT_AVAILABLE\nCL_KERNEL_ARG_NAME\nCL_KERNEL_ARG_TYPE_CONST\nCL_KERNEL_ARG_TYPE_NAME\nCL_KERNEL_ARG_TYPE_NONE\nCL_KERNEL_ARG_TYPE_PIPE\nCL_KERNEL_ARG_TYPE_QUALIFIER\nCL_KERNEL_ARG_TYPE_RESTRICT\nCL_KERNEL_ARG_TYPE_VOLATILE\nCL_KERNEL_ATTRIBUTES\nCL_KERNEL_COMPILE_NUM_SUB_GROUPS\nCL_KERNEL_COMPILE_WORK_GROUP_SIZE\nCL_KERNEL_CONTEXT\nCL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM\nCL_KERNEL_EXEC_INFO_SVM_PTRS\nCL_KERNEL_FUNCTION_NAME\nCL_KERNEL_GLOBAL_WORK_SIZE\nCL_KERNEL_LOCAL_MEM_SIZE\nCL_KERNEL_LOCAL_SIZE_FOR_SUB_GROUP_COUNT\nCL_KERNEL_MAX_NUM_SUB_GROUPS\nCL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE\nCL_KERNEL_NUM_ARGS\nCL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE\nCL_KERNEL_PRIVATE_MEM_SIZE\nCL_KERNEL_PROGRAM\nCL_KERNEL_REFERENCE_COUNT\nCL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE\nCL_KERNEL_WORK_GROUP_SIZE\nCL_LINKER_NOT_AVAILABLE\nCL_LINK_PROGRAM_FAILURE\nCL_LOCAL\nCL_LUMINANCE\nCL_MAP_FAILURE\nCL_MAP_READ\nCL_MAP_WRITE\nCL_MAP_WRITE_INVALIDATE_REGION\nCL_MEM_ALLOC_HOST_PTR\nCL_MEM_ASSOCIATED_MEMOBJECT\nCL_MEM_CONTEXT\nCL_MEM_COPY_HOST_PTR\nCL_MEM_COPY_OVERLAP\nCL_MEM_FLAGS\nCL_MEM_HOST_NO_ACCESS\nCL_MEM_HOST_PTR\nCL_MEM_HOST_READ_ONLY\nCL_MEM_HOST_WRITE_ONLY\nCL_MEM_KERNEL_READ_AND_WRITE\nCL_MEM_MAP_COUNT\nCL_MEM_OBJECT_ALLOCATION_FAILURE\nCL_MEM_OBJECT_BUFFER\nCL_MEM_OBJECT_IMAGE1D\nCL_MEM_OBJECT_IMAGE1D_ARRAY\nCL_MEM_OBJECT_IMAGE1D_BUFFER\nCL_MEM_OBJECT_IMAGE2D\nCL_MEM_OBJECT_IMAGE2D_ARRAY\nCL_MEM_OBJECT_IMAGE3D\nCL_MEM_OBJECT_PIPE\nCL_MEM_OFFSET\nCL_MEM_READ_ONLY\nCL_MEM_READ_WRITE\nCL_MEM_REFERENCE_COUNT\nCL_MEM_SIZE\nCL_MEM_SVM_ATOMICS\nCL_MEM_SVM_FINE_GRAIN_BUFFER\nCL_MEM_TYPE\nCL_MEM_USES_SVM_POINTER\nCL_MEM_USE_HOST_PTR\nCL_MEM_WRITE_ONLY\nCL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED\nCL_MIGRATE_MEM_OBJECT_HOST\nCL_MISALIGNED_SUB_BUFFER_OFFSET\nCL_NONE\nCL_NON_BLOCKING\nCL_OUT_OF_HOST_MEMORY\nCL_OUT_OF_RESOURCES\nCL_PIPE_MAX_PACKETS\nCL_PIPE_PACKET_SIZE\nCL_PLATFORM_EXTENSIONS\nCL_PLATFORM_HOST_TIMER_RESOLUTION\nCL_PLATFORM_NAME\nCL_PLATFORM_PROFILE\nCL_PLATFORM_VENDOR\nCL_PLATFORM_VERSION\nCL_PROFILING_COMMAND_COMPLETE\nCL_PROFILING_COMMAND_END\nCL_PROFILING_COMMAND_QUEUED\nCL_PROFILING_COMMAND_START\nCL_PROFILING_COMMAND_SUBMIT\nCL_PROFILING_INFO_NOT_AVAILABLE\nCL_PROGRAM_BINARIES\nCL_PROGRAM_BINARY_SIZES\nCL_PROGRAM_BINARY_TYPE\nCL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT\nCL_PROGRAM_BINARY_TYPE_EXECUTABLE\nCL_PROGRAM_BINARY_TYPE_LIBRARY\nCL_PROGRAM_BINARY_TYPE_NONE\nCL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE\nCL_PROGRAM_BUILD_LOG\nCL_PROGRAM_BUILD_OPTIONS\nCL_PROGRAM_BUILD_STATUS\nCL_PROGRAM_CONTEXT\nCL_PROGRAM_DEVICES\nCL_PROGRAM_IL\nCL_PROGRAM_KERNEL_NAMES\nCL_PROGRAM_NUM_DEVICES\nCL_PROGRAM_NUM_KERNELS\nCL_PROGRAM_REFERENCE_COUNT\nCL_PROGRAM_SOURCE\nCL_QUEUED\nCL_QUEUE_CONTEXT\nCL_QUEUE_DEVICE\nCL_QUEUE_DEVICE_DEFAULT\nCL_QUEUE_ON_DEVICE\nCL_QUEUE_ON_DEVICE_DEFAULT\nCL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE\nCL_QUEUE_PROFILING_ENABLE\nCL_QUEUE_PROPERTIES\nCL_QUEUE_REFERENCE_COUNT\nCL_QUEUE_SIZE\nCL_R\nCL_RA\nCL_READ_ONLY_CACHE\nCL_READ_WRITE_CACHE\nCL_RG\nCL_RGB\nCL_RGBA\nCL_RGBx\nCL_RGx\nCL_RUNNING\nCL_Rx\nCL_SAMPLER_ADDRESSING_MODE\nCL_SAMPLER_CONTEXT\nCL_SAMPLER_FILTER_MODE\nCL_SAMPLER_LOD_MAX\nCL_SAMPLER_LOD_MIN\nCL_SAMPLER_MIP_FILTER_MODE\nCL_SAMPLER_NORMALIZED_COORDS\nCL_SAMPLER_REFERENCE_COUNT\nCL_SIGNED_INT16\nCL_SIGNED_INT32\nCL_SIGNED_INT8\nCL_SNORM_INT16\nCL_SNORM_INT8\nCL_SUBMITTED\nCL_SUCCESS\nCL_UNORM_INT16\nCL_UNORM_INT24\nCL_UNORM_INT8\nCL_UNORM_INT_101010\nCL_UNORM_INT_101010_2\nCL_UNORM_SHORT_555\nCL_UNORM_SHORT_565\nCL_UNSIGNED_INT16\nCL_UNSIGNED_INT32\nCL_UNSIGNED_INT8\nCL_VERSION_1_0\nCL_VERSION_1_1\nCL_VERSION_1_2\nCL_VERSION_2_0\nCL_VERSION_2_1\nCL_sBGRA\nCL_sRGB\nCL_sRGBA\nCL_sRGBx\n\n----------------------------------------------------\n\n[\n\t[\"constant-opencl-host\", \"CL_A\"],\n\t[\"constant-opencl-host\", \"CL_ABGR\"],\n\t[\"constant-opencl-host\", \"CL_ADDRESS_CLAMP\"],\n\t[\"constant-opencl-host\", \"CL_ADDRESS_CLAMP_TO_EDGE\"],\n\t[\"constant-opencl-host\", \"CL_ADDRESS_MIRRORED_REPEAT\"],\n\t[\"constant-opencl-host\", \"CL_ADDRESS_NONE\"],\n\t[\"constant-opencl-host\", \"CL_ADDRESS_REPEAT\"],\n\t[\"constant-opencl-host\", \"CL_ARGB\"],\n\t[\"constant-opencl-host\", \"CL_BGRA\"],\n\t[\"constant-opencl-host\", \"CL_BLOCKING\"],\n\t[\"constant-opencl-host\", \"CL_BUFFER_CREATE_TYPE_REGION\"],\n\t[\"constant-opencl-host\", \"CL_BUILD_ERROR\"],\n\t[\"constant-opencl-host\", \"CL_BUILD_IN_PROGRESS\"],\n\t[\"constant-opencl-host\", \"CL_BUILD_NONE\"],\n\t[\"constant-opencl-host\", \"CL_BUILD_PROGRAM_FAILURE\"],\n\t[\"constant-opencl-host\", \"CL_BUILD_SUCCESS\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_ACQUIRE_GL_OBJECTS\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_BARRIER\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_COPY_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_COPY_BUFFER_RECT\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_COPY_BUFFER_TO_IMAGE\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_COPY_IMAGE\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_COPY_IMAGE_TO_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_FILL_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_FILL_IMAGE\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_MAP_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_MAP_IMAGE\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_MARKER\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_MIGRATE_MEM_OBJECTS\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_MIGRATE_SVM_MEM_OBJECTS\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_NATIVE_KERNEL\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_NDRANGE_KERNEL\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_READ_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_READ_BUFFER_RECT\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_READ_IMAGE\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_RELEASE_GL_OBJECTS\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_SVM_FREE\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_SVM_MAP\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_SVM_MEMCPY\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_SVM_MEMFILL\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_SVM_UNMAP\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_TASK\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_UNMAP_MEM_OBJECT\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_USER\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_WRITE_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_WRITE_BUFFER_RECT\"],\n\t[\"constant-opencl-host\", \"CL_COMMAND_WRITE_IMAGE\"],\n\t[\"constant-opencl-host\", \"CL_COMPILER_NOT_AVAILABLE\"],\n\t[\"constant-opencl-host\", \"CL_COMPILE_PROGRAM_FAILURE\"],\n\t[\"constant-opencl-host\", \"CL_COMPLETE\"],\n\t[\"constant-opencl-host\", \"CL_CONTEXT_DEVICES\"],\n\t[\"constant-opencl-host\", \"CL_CONTEXT_INTEROP_USER_SYNC\"],\n\t[\"constant-opencl-host\", \"CL_CONTEXT_NUM_DEVICES\"],\n\t[\"constant-opencl-host\", \"CL_CONTEXT_PLATFORM\"],\n\t[\"constant-opencl-host\", \"CL_CONTEXT_PROPERTIES\"],\n\t[\"constant-opencl-host\", \"CL_CONTEXT_REFERENCE_COUNT\"],\n\t[\"constant-opencl-host\", \"CL_DEPTH\"],\n\t[\"constant-opencl-host\", \"CL_DEPTH_STENCIL\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_ADDRESS_BITS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_AFFINITY_DOMAIN_NUMA\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_AVAILABLE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_BUILT_IN_KERNELS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_COMPILER_AVAILABLE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_DOUBLE_FP_CONFIG\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_ENDIAN_LITTLE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_ERROR_CORRECTION_SUPPORT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_EXECUTION_CAPABILITIES\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_EXTENSIONS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_GLOBAL_MEM_CACHE_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_GLOBAL_MEM_CACHE_TYPE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_GLOBAL_MEM_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_HOST_UNIFIED_MEMORY\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_IL_VERSION\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_IMAGE2D_MAX_HEIGHT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_IMAGE2D_MAX_WIDTH\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_IMAGE3D_MAX_DEPTH\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_IMAGE3D_MAX_HEIGHT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_IMAGE3D_MAX_WIDTH\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_IMAGE_MAX_ARRAY_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_IMAGE_MAX_BUFFER_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_IMAGE_PITCH_ALIGNMENT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_IMAGE_SUPPORT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_LINKER_AVAILABLE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_LOCAL_MEM_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_LOCAL_MEM_TYPE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_CLOCK_FREQUENCY\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_COMPUTE_UNITS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_CONSTANT_ARGS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_MEM_ALLOC_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_NUM_SUB_GROUPS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_ON_DEVICE_EVENTS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_ON_DEVICE_QUEUES\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_PARAMETER_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_PIPE_ARGS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_READ_IMAGE_ARGS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_SAMPLERS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_WORK_GROUP_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_WORK_ITEM_SIZES\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MAX_WRITE_IMAGE_ARGS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MEM_BASE_ADDR_ALIGN\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_NAME\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_NATIVE_VECTOR_WIDTH_INT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_NOT_AVAILABLE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_NOT_FOUND\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_OPENCL_C_VERSION\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PARENT_DEVICE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PARTITION_AFFINITY_DOMAIN\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PARTITION_BY_COUNTS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PARTITION_BY_COUNTS_LIST_END\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PARTITION_EQUALLY\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PARTITION_FAILED\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PARTITION_MAX_SUB_DEVICES\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PARTITION_PROPERTIES\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PARTITION_TYPE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PIPE_MAX_PACKET_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PLATFORM\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PREFERRED_INTEROP_USER_SYNC\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PRINTF_BUFFER_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PROFILE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_PROFILING_TIMER_RESOLUTION\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_QUEUE_ON_HOST_PROPERTIES\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_QUEUE_PROPERTIES\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_REFERENCE_COUNT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_SINGLE_FP_CONFIG\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_SVM_ATOMICS\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_SVM_CAPABILITIES\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_SVM_COARSE_GRAIN_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_SVM_FINE_GRAIN_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_SVM_FINE_GRAIN_SYSTEM\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_TYPE\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_TYPE_ACCELERATOR\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_TYPE_ALL\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_TYPE_CPU\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_TYPE_CUSTOM\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_TYPE_DEFAULT\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_TYPE_GPU\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_VENDOR\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_VENDOR_ID\"],\n\t[\"constant-opencl-host\", \"CL_DEVICE_VERSION\"],\n\t[\"constant-opencl-host\", \"CL_DRIVER_VERSION\"],\n\t[\"constant-opencl-host\", \"CL_EVENT_COMMAND_EXECUTION_STATUS\"],\n\t[\"constant-opencl-host\", \"CL_EVENT_COMMAND_QUEUE\"],\n\t[\"constant-opencl-host\", \"CL_EVENT_COMMAND_TYPE\"],\n\t[\"constant-opencl-host\", \"CL_EVENT_CONTEXT\"],\n\t[\"constant-opencl-host\", \"CL_EVENT_REFERENCE_COUNT\"],\n\t[\"constant-opencl-host\", \"CL_EXEC_KERNEL\"],\n\t[\"constant-opencl-host\", \"CL_EXEC_NATIVE_KERNEL\"],\n\t[\"constant-opencl-host\", \"CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST\"],\n\t[\"constant-opencl-host\", \"CL_FILTER_LINEAR\"],\n\t[\"constant-opencl-host\", \"CL_FILTER_NEAREST\"],\n\t[\"constant-opencl-host\", \"CL_FLOAT\"],\n\t[\"constant-opencl-host\", \"CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT\"],\n\t[\"constant-opencl-host\", \"CL_FP_DENORM\"],\n\t[\"constant-opencl-host\", \"CL_FP_FMA\"],\n\t[\"constant-opencl-host\", \"CL_FP_INF_NAN\"],\n\t[\"constant-opencl-host\", \"CL_FP_ROUND_TO_INF\"],\n\t[\"constant-opencl-host\", \"CL_FP_ROUND_TO_NEAREST\"],\n\t[\"constant-opencl-host\", \"CL_FP_ROUND_TO_ZERO\"],\n\t[\"constant-opencl-host\", \"CL_FP_SOFT_FLOAT\"],\n\t[\"constant-opencl-host\", \"CL_GLOBAL\"],\n\t[\"constant-opencl-host\", \"CL_HALF_FLOAT\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_ARRAY_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_DEPTH\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_ELEMENT_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_FORMAT\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_FORMAT_MISMATCH\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_FORMAT_NOT_SUPPORTED\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_HEIGHT\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_NUM_MIP_LEVELS\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_NUM_SAMPLES\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_ROW_PITCH\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_SLICE_PITCH\"],\n\t[\"constant-opencl-host\", \"CL_IMAGE_WIDTH\"],\n\t[\"constant-opencl-host\", \"CL_INTENSITY\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_ARG_INDEX\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_ARG_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_ARG_VALUE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_BINARY\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_BUFFER_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_BUILD_OPTIONS\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_COMMAND_QUEUE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_COMPILER_OPTIONS\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_CONTEXT\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_DEVICE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_DEVICE_PARTITION_COUNT\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_DEVICE_QUEUE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_DEVICE_TYPE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_EVENT\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_EVENT_WAIT_LIST\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_GLOBAL_OFFSET\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_GLOBAL_WORK_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_GL_OBJECT\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_HOST_PTR\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_IMAGE_DESCRIPTOR\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_IMAGE_FORMAT_DESCRIPTOR\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_IMAGE_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_KERNEL\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_KERNEL_ARGS\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_KERNEL_DEFINITION\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_KERNEL_NAME\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_LINKER_OPTIONS\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_MEM_OBJECT\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_MIP_LEVEL\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_OPERATION\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_PIPE_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_PLATFORM\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_PROGRAM\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_PROGRAM_EXECUTABLE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_PROPERTY\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_QUEUE_PROPERTIES\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_SAMPLER\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_VALUE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_WORK_DIMENSION\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_WORK_GROUP_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_INVALID_WORK_ITEM_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_ACCESS_NONE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_ACCESS_QUALIFIER\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_ACCESS_READ_ONLY\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_ACCESS_READ_WRITE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_ACCESS_WRITE_ONLY\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_ADDRESS_CONSTANT\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_ADDRESS_GLOBAL\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_ADDRESS_LOCAL\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_ADDRESS_PRIVATE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_ADDRESS_QUALIFIER\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_INFO_NOT_AVAILABLE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_NAME\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_TYPE_CONST\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_TYPE_NAME\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_TYPE_NONE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_TYPE_PIPE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_TYPE_QUALIFIER\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_TYPE_RESTRICT\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ARG_TYPE_VOLATILE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_ATTRIBUTES\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_COMPILE_NUM_SUB_GROUPS\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_COMPILE_WORK_GROUP_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_CONTEXT\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_EXEC_INFO_SVM_PTRS\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_FUNCTION_NAME\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_GLOBAL_WORK_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_LOCAL_MEM_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_LOCAL_SIZE_FOR_SUB_GROUP_COUNT\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_MAX_NUM_SUB_GROUPS\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_NUM_ARGS\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_PRIVATE_MEM_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_PROGRAM\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_REFERENCE_COUNT\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE\"],\n\t[\"constant-opencl-host\", \"CL_KERNEL_WORK_GROUP_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_LINKER_NOT_AVAILABLE\"],\n\t[\"constant-opencl-host\", \"CL_LINK_PROGRAM_FAILURE\"],\n\t[\"constant-opencl-host\", \"CL_LOCAL\"],\n\t[\"constant-opencl-host\", \"CL_LUMINANCE\"],\n\t[\"constant-opencl-host\", \"CL_MAP_FAILURE\"],\n\t[\"constant-opencl-host\", \"CL_MAP_READ\"],\n\t[\"constant-opencl-host\", \"CL_MAP_WRITE\"],\n\t[\"constant-opencl-host\", \"CL_MAP_WRITE_INVALIDATE_REGION\"],\n\t[\"constant-opencl-host\", \"CL_MEM_ALLOC_HOST_PTR\"],\n\t[\"constant-opencl-host\", \"CL_MEM_ASSOCIATED_MEMOBJECT\"],\n\t[\"constant-opencl-host\", \"CL_MEM_CONTEXT\"],\n\t[\"constant-opencl-host\", \"CL_MEM_COPY_HOST_PTR\"],\n\t[\"constant-opencl-host\", \"CL_MEM_COPY_OVERLAP\"],\n\t[\"constant-opencl-host\", \"CL_MEM_FLAGS\"],\n\t[\"constant-opencl-host\", \"CL_MEM_HOST_NO_ACCESS\"],\n\t[\"constant-opencl-host\", \"CL_MEM_HOST_PTR\"],\n\t[\"constant-opencl-host\", \"CL_MEM_HOST_READ_ONLY\"],\n\t[\"constant-opencl-host\", \"CL_MEM_HOST_WRITE_ONLY\"],\n\t[\"constant-opencl-host\", \"CL_MEM_KERNEL_READ_AND_WRITE\"],\n\t[\"constant-opencl-host\", \"CL_MEM_MAP_COUNT\"],\n\t[\"constant-opencl-host\", \"CL_MEM_OBJECT_ALLOCATION_FAILURE\"],\n\t[\"constant-opencl-host\", \"CL_MEM_OBJECT_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_MEM_OBJECT_IMAGE1D\"],\n\t[\"constant-opencl-host\", \"CL_MEM_OBJECT_IMAGE1D_ARRAY\"],\n\t[\"constant-opencl-host\", \"CL_MEM_OBJECT_IMAGE1D_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_MEM_OBJECT_IMAGE2D\"],\n\t[\"constant-opencl-host\", \"CL_MEM_OBJECT_IMAGE2D_ARRAY\"],\n\t[\"constant-opencl-host\", \"CL_MEM_OBJECT_IMAGE3D\"],\n\t[\"constant-opencl-host\", \"CL_MEM_OBJECT_PIPE\"],\n\t[\"constant-opencl-host\", \"CL_MEM_OFFSET\"],\n\t[\"constant-opencl-host\", \"CL_MEM_READ_ONLY\"],\n\t[\"constant-opencl-host\", \"CL_MEM_READ_WRITE\"],\n\t[\"constant-opencl-host\", \"CL_MEM_REFERENCE_COUNT\"],\n\t[\"constant-opencl-host\", \"CL_MEM_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_MEM_SVM_ATOMICS\"],\n\t[\"constant-opencl-host\", \"CL_MEM_SVM_FINE_GRAIN_BUFFER\"],\n\t[\"constant-opencl-host\", \"CL_MEM_TYPE\"],\n\t[\"constant-opencl-host\", \"CL_MEM_USES_SVM_POINTER\"],\n\t[\"constant-opencl-host\", \"CL_MEM_USE_HOST_PTR\"],\n\t[\"constant-opencl-host\", \"CL_MEM_WRITE_ONLY\"],\n\t[\"constant-opencl-host\", \"CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED\"],\n\t[\"constant-opencl-host\", \"CL_MIGRATE_MEM_OBJECT_HOST\"],\n\t[\"constant-opencl-host\", \"CL_MISALIGNED_SUB_BUFFER_OFFSET\"],\n\t[\"constant-opencl-host\", \"CL_NONE\"],\n\t[\"constant-opencl-host\", \"CL_NON_BLOCKING\"],\n\t[\"constant-opencl-host\", \"CL_OUT_OF_HOST_MEMORY\"],\n\t[\"constant-opencl-host\", \"CL_OUT_OF_RESOURCES\"],\n\t[\"constant-opencl-host\", \"CL_PIPE_MAX_PACKETS\"],\n\t[\"constant-opencl-host\", \"CL_PIPE_PACKET_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_PLATFORM_EXTENSIONS\"],\n\t[\"constant-opencl-host\", \"CL_PLATFORM_HOST_TIMER_RESOLUTION\"],\n\t[\"constant-opencl-host\", \"CL_PLATFORM_NAME\"],\n\t[\"constant-opencl-host\", \"CL_PLATFORM_PROFILE\"],\n\t[\"constant-opencl-host\", \"CL_PLATFORM_VENDOR\"],\n\t[\"constant-opencl-host\", \"CL_PLATFORM_VERSION\"],\n\t[\"constant-opencl-host\", \"CL_PROFILING_COMMAND_COMPLETE\"],\n\t[\"constant-opencl-host\", \"CL_PROFILING_COMMAND_END\"],\n\t[\"constant-opencl-host\", \"CL_PROFILING_COMMAND_QUEUED\"],\n\t[\"constant-opencl-host\", \"CL_PROFILING_COMMAND_START\"],\n\t[\"constant-opencl-host\", \"CL_PROFILING_COMMAND_SUBMIT\"],\n\t[\"constant-opencl-host\", \"CL_PROFILING_INFO_NOT_AVAILABLE\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_BINARIES\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_BINARY_SIZES\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_BINARY_TYPE\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_BINARY_TYPE_EXECUTABLE\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_BINARY_TYPE_LIBRARY\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_BINARY_TYPE_NONE\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_BUILD_LOG\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_BUILD_OPTIONS\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_BUILD_STATUS\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_CONTEXT\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_DEVICES\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_IL\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_KERNEL_NAMES\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_NUM_DEVICES\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_NUM_KERNELS\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_REFERENCE_COUNT\"],\n\t[\"constant-opencl-host\", \"CL_PROGRAM_SOURCE\"],\n\t[\"constant-opencl-host\", \"CL_QUEUED\"],\n\t[\"constant-opencl-host\", \"CL_QUEUE_CONTEXT\"],\n\t[\"constant-opencl-host\", \"CL_QUEUE_DEVICE\"],\n\t[\"constant-opencl-host\", \"CL_QUEUE_DEVICE_DEFAULT\"],\n\t[\"constant-opencl-host\", \"CL_QUEUE_ON_DEVICE\"],\n\t[\"constant-opencl-host\", \"CL_QUEUE_ON_DEVICE_DEFAULT\"],\n\t[\"constant-opencl-host\", \"CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE\"],\n\t[\"constant-opencl-host\", \"CL_QUEUE_PROFILING_ENABLE\"],\n\t[\"constant-opencl-host\", \"CL_QUEUE_PROPERTIES\"],\n\t[\"constant-opencl-host\", \"CL_QUEUE_REFERENCE_COUNT\"],\n\t[\"constant-opencl-host\", \"CL_QUEUE_SIZE\"],\n\t[\"constant-opencl-host\", \"CL_R\"],\n\t[\"constant-opencl-host\", \"CL_RA\"],\n\t[\"constant-opencl-host\", \"CL_READ_ONLY_CACHE\"],\n\t[\"constant-opencl-host\", \"CL_READ_WRITE_CACHE\"],\n\t[\"constant-opencl-host\", \"CL_RG\"],\n\t[\"constant-opencl-host\", \"CL_RGB\"],\n\t[\"constant-opencl-host\", \"CL_RGBA\"],\n\t[\"constant-opencl-host\", \"CL_RGBx\"],\n\t[\"constant-opencl-host\", \"CL_RGx\"],\n\t[\"constant-opencl-host\", \"CL_RUNNING\"],\n\t[\"constant-opencl-host\", \"CL_Rx\"],\n\t[\"constant-opencl-host\", \"CL_SAMPLER_ADDRESSING_MODE\"],\n\t[\"constant-opencl-host\", \"CL_SAMPLER_CONTEXT\"],\n\t[\"constant-opencl-host\", \"CL_SAMPLER_FILTER_MODE\"],\n\t[\"constant-opencl-host\", \"CL_SAMPLER_LOD_MAX\"],\n\t[\"constant-opencl-host\", \"CL_SAMPLER_LOD_MIN\"],\n\t[\"constant-opencl-host\", \"CL_SAMPLER_MIP_FILTER_MODE\"],\n\t[\"constant-opencl-host\", \"CL_SAMPLER_NORMALIZED_COORDS\"],\n\t[\"constant-opencl-host\", \"CL_SAMPLER_REFERENCE_COUNT\"],\n\t[\"constant-opencl-host\", \"CL_SIGNED_INT16\"],\n\t[\"constant-opencl-host\", \"CL_SIGNED_INT32\"],\n\t[\"constant-opencl-host\", \"CL_SIGNED_INT8\"],\n\t[\"constant-opencl-host\", \"CL_SNORM_INT16\"],\n\t[\"constant-opencl-host\", \"CL_SNORM_INT8\"],\n\t[\"constant-opencl-host\", \"CL_SUBMITTED\"],\n\t[\"constant-opencl-host\", \"CL_SUCCESS\"],\n\t[\"constant-opencl-host\", \"CL_UNORM_INT16\"],\n\t[\"constant-opencl-host\", \"CL_UNORM_INT24\"],\n\t[\"constant-opencl-host\", \"CL_UNORM_INT8\"],\n\t[\"constant-opencl-host\", \"CL_UNORM_INT_101010\"],\n\t[\"constant-opencl-host\", \"CL_UNORM_INT_101010_2\"],\n\t[\"constant-opencl-host\", \"CL_UNORM_SHORT_555\"],\n\t[\"constant-opencl-host\", \"CL_UNORM_SHORT_565\"],\n\t[\"constant-opencl-host\", \"CL_UNSIGNED_INT16\"],\n\t[\"constant-opencl-host\", \"CL_UNSIGNED_INT32\"],\n\t[\"constant-opencl-host\", \"CL_UNSIGNED_INT8\"],\n\t[\"constant-opencl-host\", \"CL_VERSION_1_0\"],\n\t[\"constant-opencl-host\", \"CL_VERSION_1_1\"],\n\t[\"constant-opencl-host\", \"CL_VERSION_1_2\"],\n\t[\"constant-opencl-host\", \"CL_VERSION_2_0\"],\n\t[\"constant-opencl-host\", \"CL_VERSION_2_1\"],\n\t[\"constant-opencl-host\", \"CL_sBGRA\"],\n\t[\"constant-opencl-host\", \"CL_sRGB\"],\n\t[\"constant-opencl-host\", \"CL_sRGBA\"],\n\t[\"constant-opencl-host\", \"CL_sRGBx\"]\n]\n\n----------------------------------------------------\n\nChecks for all constants in OpenCL host code (C-API).\n"
  },
  {
    "path": "tests/languages/opencl-extensions+c/function_feature.test",
    "content": "clBuildProgram\nclCloneKernel\nclCompileProgram\nclCreateBuffer\nclCreateCommandQueue\nclCreateCommandQueueWithProperties\nclCreateContext\nclCreateContextFromType\nclCreateImage\nclCreateImage2D\nclCreateImage3D\nclCreateKernel\nclCreateKernelsInProgram\nclCreatePipe\nclCreateProgramWithBinary\nclCreateProgramWithBuiltInKernels\nclCreateProgramWithIL\nclCreateProgramWithSource\nclCreateSampler\nclCreateSamplerWithProperties\nclCreateSubBuffer\nclCreateSubDevices\nclCreateUserEvent\nclEnqueueBarrier\nclEnqueueBarrierWithWaitList\nclEnqueueCopyBuffer\nclEnqueueCopyBufferRect\nclEnqueueCopyBufferToImage\nclEnqueueCopyImage\nclEnqueueCopyImageToBuffer\nclEnqueueFillBuffer\nclEnqueueFillImage\nclEnqueueMapBuffer\nclEnqueueMapImage\nclEnqueueMarker\nclEnqueueMarkerWithWaitList\nclEnqueueMigrateMemObjects\nclEnqueueNDRangeKernel\nclEnqueueNativeKernel\nclEnqueueReadBuffer\nclEnqueueReadBufferRect\nclEnqueueReadImage\nclEnqueueSVMFree\nclEnqueueSVMMap\nclEnqueueSVMMemFill\nclEnqueueSVMMemcpy\nclEnqueueSVMMigrateMem\nclEnqueueSVMUnmap\nclEnqueueTask\nclEnqueueUnmapMemObject\nclEnqueueWaitForEvents\nclEnqueueWriteBuffer\nclEnqueueWriteBufferRect\nclEnqueueWriteImage\nclFinish\nclFlush\nclGetCommandQueueInfo\nclGetContextInfo\nclGetDeviceAndHostTimer\nclGetDeviceIDs\nclGetDeviceInfo\nclGetEventInfo\nclGetEventProfilingInfo\nclGetExtensionFunctionAddress\nclGetExtensionFunctionAddressForPlatform\nclGetHostTimer\nclGetImageInfo\nclGetKernelArgInfo\nclGetKernelInfo\nclGetKernelSubGroupInfo\nclGetKernelWorkGroupInfo\nclGetMemObjectInfo\nclGetPipeInfo\nclGetPlatformIDs\nclGetPlatformInfo\nclGetProgramBuildInfo\nclGetProgramInfo\nclGetSamplerInfo\nclGetSupportedImageFormats\nclLinkProgram\nclReleaseCommandQueue\nclReleaseContext\nclReleaseDevice\nclReleaseEvent\nclReleaseKernel\nclReleaseMemObject\nclReleaseProgram\nclReleaseSampler\nclRetainCommandQueue\nclRetainContext\nclRetainDevice\nclRetainEvent\nclRetainKernel\nclRetainMemObject\nclRetainProgram\nclRetainSampler\nclSVMAlloc\nclSVMFree\nclSetCommandQueueProperty\nclSetDefaultDeviceCommandQueue\nclSetEventCallback\nclSetKernelArg\nclSetKernelArgSVMPointer\nclSetKernelExecInfo\nclSetMemObjectDestructorCallback\nclSetUserEventStatus\nclUnloadCompiler\nclUnloadPlatformCompiler\nclWaitForEvents\n\n----------------------------------------------------\n\n[\n\t[\"function-opencl-host\", \"clBuildProgram\"],\n\t[\"function-opencl-host\", \"clCloneKernel\"],\n\t[\"function-opencl-host\", \"clCompileProgram\"],\n\t[\"function-opencl-host\", \"clCreateBuffer\"],\n\t[\"function-opencl-host\", \"clCreateCommandQueue\"],\n\t[\"function-opencl-host\", \"clCreateCommandQueueWithProperties\"],\n\t[\"function-opencl-host\", \"clCreateContext\"],\n\t[\"function-opencl-host\", \"clCreateContextFromType\"],\n\t[\"function-opencl-host\", \"clCreateImage\"],\n\t[\"function-opencl-host\", \"clCreateImage2D\"],\n\t[\"function-opencl-host\", \"clCreateImage3D\"],\n\t[\"function-opencl-host\", \"clCreateKernel\"],\n\t[\"function-opencl-host\", \"clCreateKernelsInProgram\"],\n\t[\"function-opencl-host\", \"clCreatePipe\"],\n\t[\"function-opencl-host\", \"clCreateProgramWithBinary\"],\n\t[\"function-opencl-host\", \"clCreateProgramWithBuiltInKernels\"],\n\t[\"function-opencl-host\", \"clCreateProgramWithIL\"],\n\t[\"function-opencl-host\", \"clCreateProgramWithSource\"],\n\t[\"function-opencl-host\", \"clCreateSampler\"],\n\t[\"function-opencl-host\", \"clCreateSamplerWithProperties\"],\n\t[\"function-opencl-host\", \"clCreateSubBuffer\"],\n\t[\"function-opencl-host\", \"clCreateSubDevices\"],\n\t[\"function-opencl-host\", \"clCreateUserEvent\"],\n\t[\"function-opencl-host\", \"clEnqueueBarrier\"],\n\t[\"function-opencl-host\", \"clEnqueueBarrierWithWaitList\"],\n\t[\"function-opencl-host\", \"clEnqueueCopyBuffer\"],\n\t[\"function-opencl-host\", \"clEnqueueCopyBufferRect\"],\n\t[\"function-opencl-host\", \"clEnqueueCopyBufferToImage\"],\n\t[\"function-opencl-host\", \"clEnqueueCopyImage\"],\n\t[\"function-opencl-host\", \"clEnqueueCopyImageToBuffer\"],\n\t[\"function-opencl-host\", \"clEnqueueFillBuffer\"],\n\t[\"function-opencl-host\", \"clEnqueueFillImage\"],\n\t[\"function-opencl-host\", \"clEnqueueMapBuffer\"],\n\t[\"function-opencl-host\", \"clEnqueueMapImage\"],\n\t[\"function-opencl-host\", \"clEnqueueMarker\"],\n\t[\"function-opencl-host\", \"clEnqueueMarkerWithWaitList\"],\n\t[\"function-opencl-host\", \"clEnqueueMigrateMemObjects\"],\n\t[\"function-opencl-host\", \"clEnqueueNDRangeKernel\"],\n\t[\"function-opencl-host\", \"clEnqueueNativeKernel\"],\n\t[\"function-opencl-host\", \"clEnqueueReadBuffer\"],\n\t[\"function-opencl-host\", \"clEnqueueReadBufferRect\"],\n\t[\"function-opencl-host\", \"clEnqueueReadImage\"],\n\t[\"function-opencl-host\", \"clEnqueueSVMFree\"],\n\t[\"function-opencl-host\", \"clEnqueueSVMMap\"],\n\t[\"function-opencl-host\", \"clEnqueueSVMMemFill\"],\n\t[\"function-opencl-host\", \"clEnqueueSVMMemcpy\"],\n\t[\"function-opencl-host\", \"clEnqueueSVMMigrateMem\"],\n\t[\"function-opencl-host\", \"clEnqueueSVMUnmap\"],\n\t[\"function-opencl-host\", \"clEnqueueTask\"],\n\t[\"function-opencl-host\", \"clEnqueueUnmapMemObject\"],\n\t[\"function-opencl-host\", \"clEnqueueWaitForEvents\"],\n\t[\"function-opencl-host\", \"clEnqueueWriteBuffer\"],\n\t[\"function-opencl-host\", \"clEnqueueWriteBufferRect\"],\n\t[\"function-opencl-host\", \"clEnqueueWriteImage\"],\n\t[\"function-opencl-host\", \"clFinish\"],\n\t[\"function-opencl-host\", \"clFlush\"],\n\t[\"function-opencl-host\", \"clGetCommandQueueInfo\"],\n\t[\"function-opencl-host\", \"clGetContextInfo\"],\n\t[\"function-opencl-host\", \"clGetDeviceAndHostTimer\"],\n\t[\"function-opencl-host\", \"clGetDeviceIDs\"],\n\t[\"function-opencl-host\", \"clGetDeviceInfo\"],\n\t[\"function-opencl-host\", \"clGetEventInfo\"],\n\t[\"function-opencl-host\", \"clGetEventProfilingInfo\"],\n\t[\"function-opencl-host\", \"clGetExtensionFunctionAddress\"],\n\t[\"function-opencl-host\", \"clGetExtensionFunctionAddressForPlatform\"],\n\t[\"function-opencl-host\", \"clGetHostTimer\"],\n\t[\"function-opencl-host\", \"clGetImageInfo\"],\n\t[\"function-opencl-host\", \"clGetKernelArgInfo\"],\n\t[\"function-opencl-host\", \"clGetKernelInfo\"],\n\t[\"function-opencl-host\", \"clGetKernelSubGroupInfo\"],\n\t[\"function-opencl-host\", \"clGetKernelWorkGroupInfo\"],\n\t[\"function-opencl-host\", \"clGetMemObjectInfo\"],\n\t[\"function-opencl-host\", \"clGetPipeInfo\"],\n\t[\"function-opencl-host\", \"clGetPlatformIDs\"],\n\t[\"function-opencl-host\", \"clGetPlatformInfo\"],\n\t[\"function-opencl-host\", \"clGetProgramBuildInfo\"],\n\t[\"function-opencl-host\", \"clGetProgramInfo\"],\n\t[\"function-opencl-host\", \"clGetSamplerInfo\"],\n\t[\"function-opencl-host\", \"clGetSupportedImageFormats\"],\n\t[\"function-opencl-host\", \"clLinkProgram\"],\n\t[\"function-opencl-host\", \"clReleaseCommandQueue\"],\n\t[\"function-opencl-host\", \"clReleaseContext\"],\n\t[\"function-opencl-host\", \"clReleaseDevice\"],\n\t[\"function-opencl-host\", \"clReleaseEvent\"],\n\t[\"function-opencl-host\", \"clReleaseKernel\"],\n\t[\"function-opencl-host\", \"clReleaseMemObject\"],\n\t[\"function-opencl-host\", \"clReleaseProgram\"],\n\t[\"function-opencl-host\", \"clReleaseSampler\"],\n\t[\"function-opencl-host\", \"clRetainCommandQueue\"],\n\t[\"function-opencl-host\", \"clRetainContext\"],\n\t[\"function-opencl-host\", \"clRetainDevice\"],\n\t[\"function-opencl-host\", \"clRetainEvent\"],\n\t[\"function-opencl-host\", \"clRetainKernel\"],\n\t[\"function-opencl-host\", \"clRetainMemObject\"],\n\t[\"function-opencl-host\", \"clRetainProgram\"],\n\t[\"function-opencl-host\", \"clRetainSampler\"],\n\t[\"function-opencl-host\", \"clSVMAlloc\"],\n\t[\"function-opencl-host\", \"clSVMFree\"],\n\t[\"function-opencl-host\", \"clSetCommandQueueProperty\"],\n\t[\"function-opencl-host\", \"clSetDefaultDeviceCommandQueue\"],\n\t[\"function-opencl-host\", \"clSetEventCallback\"],\n\t[\"function-opencl-host\", \"clSetKernelArg\"],\n\t[\"function-opencl-host\", \"clSetKernelArgSVMPointer\"],\n\t[\"function-opencl-host\", \"clSetKernelExecInfo\"],\n\t[\"function-opencl-host\", \"clSetMemObjectDestructorCallback\"],\n\t[\"function-opencl-host\", \"clSetUserEventStatus\"],\n\t[\"function-opencl-host\", \"clUnloadCompiler\"],\n\t[\"function-opencl-host\", \"clUnloadPlatformCompiler\"],\n\t[\"function-opencl-host\", \"clWaitForEvents\"]\n]\n\n----------------------------------------------------\n\nChecks for all reserved function names in OpenCL host code (C-API).\n"
  },
  {
    "path": "tests/languages/opencl-extensions+c/type_feature.test",
    "content": "cl_GLenum\ncl_GLint\ncl_GLuin\ncl_addressing_mode\ncl_bitfield\ncl_bool\ncl_buffer_create_type\ncl_build_status\ncl_channel_order\ncl_channel_type\ncl_char\ncl_char16\ncl_char2\ncl_char3\ncl_char4\ncl_char8\ncl_command_queue\ncl_command_queue_info\ncl_command_queue_properties\ncl_command_type\ncl_context\ncl_context_info\ncl_context_properties\ncl_device_exec_capabilities\ncl_device_fp_config\ncl_device_id\ncl_device_info\ncl_device_local_mem_type\ncl_device_mem_cache_type\ncl_device_type\ncl_double\ncl_double16\ncl_double2\ncl_double3\ncl_double4\ncl_double8\ncl_event\ncl_event_info\ncl_filter_mode\ncl_float\ncl_float16\ncl_float2\ncl_float3\ncl_float4\ncl_float8\ncl_half\ncl_image_info\ncl_int\ncl_int16\ncl_int2\ncl_int3\ncl_int4\ncl_int8\ncl_kernel\ncl_kernel_info\ncl_kernel_work_group_info\ncl_long\ncl_long16\ncl_long2\ncl_long3\ncl_long4\ncl_long8\ncl_map_flags\ncl_mem\ncl_mem_flags\ncl_mem_info\ncl_mem_object_type\ncl_platform_id\ncl_platform_info\ncl_profiling_info\ncl_program\ncl_program_build_info\ncl_program_info\ncl_sampler\ncl_sampler_info\ncl_short\ncl_short16\ncl_short2\ncl_short3\ncl_short4\ncl_short8\ncl_uchar\ncl_uchar16\ncl_uchar2\ncl_uchar3\ncl_uchar4\ncl_uchar8\ncl_uint\ncl_uint16\ncl_uint2\ncl_uint3\ncl_uint4\ncl_uint8\ncl_ulong\ncl_ulong16\ncl_ulong2\ncl_ulong3\ncl_ulong4\ncl_ulong8\ncl_ushort\ncl_ushort16\ncl_ushort2\ncl_ushort3\ncl_ushort4\ncl_ushort8\n\n----------------------------------------------------\n\n[\n\t[\"type-opencl-host\", \"cl_GLenum\"],\n\t[\"type-opencl-host\", \"cl_GLint\"],\n\t[\"type-opencl-host\", \"cl_GLuin\"],\n\t[\"type-opencl-host\", \"cl_addressing_mode\"],\n\t[\"type-opencl-host\", \"cl_bitfield\"],\n\t[\"type-opencl-host\", \"cl_bool\"],\n\t[\"type-opencl-host\", \"cl_buffer_create_type\"],\n\t[\"type-opencl-host\", \"cl_build_status\"],\n\t[\"type-opencl-host\", \"cl_channel_order\"],\n\t[\"type-opencl-host\", \"cl_channel_type\"],\n\t[\"type-opencl-host\", \"cl_char\"],\n\t[\"type-opencl-host\", \"cl_char16\"],\n\t[\"type-opencl-host\", \"cl_char2\"],\n\t[\"type-opencl-host\", \"cl_char3\"],\n\t[\"type-opencl-host\", \"cl_char4\"],\n\t[\"type-opencl-host\", \"cl_char8\"],\n\t[\"type-opencl-host\", \"cl_command_queue\"],\n\t[\"type-opencl-host\", \"cl_command_queue_info\"],\n\t[\"type-opencl-host\", \"cl_command_queue_properties\"],\n\t[\"type-opencl-host\", \"cl_command_type\"],\n\t[\"type-opencl-host\", \"cl_context\"],\n\t[\"type-opencl-host\", \"cl_context_info\"],\n\t[\"type-opencl-host\", \"cl_context_properties\"],\n\t[\"type-opencl-host\", \"cl_device_exec_capabilities\"],\n\t[\"type-opencl-host\", \"cl_device_fp_config\"],\n\t[\"type-opencl-host\", \"cl_device_id\"],\n\t[\"type-opencl-host\", \"cl_device_info\"],\n\t[\"type-opencl-host\", \"cl_device_local_mem_type\"],\n\t[\"type-opencl-host\", \"cl_device_mem_cache_type\"],\n\t[\"type-opencl-host\", \"cl_device_type\"],\n\t[\"type-opencl-host\", \"cl_double\"],\n\t[\"type-opencl-host\", \"cl_double16\"],\n\t[\"type-opencl-host\", \"cl_double2\"],\n\t[\"type-opencl-host\", \"cl_double3\"],\n\t[\"type-opencl-host\", \"cl_double4\"],\n\t[\"type-opencl-host\", \"cl_double8\"],\n\t[\"type-opencl-host\", \"cl_event\"],\n\t[\"type-opencl-host\", \"cl_event_info\"],\n\t[\"type-opencl-host\", \"cl_filter_mode\"],\n\t[\"type-opencl-host\", \"cl_float\"],\n\t[\"type-opencl-host\", \"cl_float16\"],\n\t[\"type-opencl-host\", \"cl_float2\"],\n\t[\"type-opencl-host\", \"cl_float3\"],\n\t[\"type-opencl-host\", \"cl_float4\"],\n\t[\"type-opencl-host\", \"cl_float8\"],\n\t[\"type-opencl-host\", \"cl_half\"],\n\t[\"type-opencl-host\", \"cl_image_info\"],\n\t[\"type-opencl-host\", \"cl_int\"],\n\t[\"type-opencl-host\", \"cl_int16\"],\n\t[\"type-opencl-host\", \"cl_int2\"],\n\t[\"type-opencl-host\", \"cl_int3\"],\n\t[\"type-opencl-host\", \"cl_int4\"],\n\t[\"type-opencl-host\", \"cl_int8\"],\n\t[\"type-opencl-host\", \"cl_kernel\"],\n\t[\"type-opencl-host\", \"cl_kernel_info\"],\n\t[\"type-opencl-host\", \"cl_kernel_work_group_info\"],\n\t[\"type-opencl-host\", \"cl_long\"],\n\t[\"type-opencl-host\", \"cl_long16\"],\n\t[\"type-opencl-host\", \"cl_long2\"],\n\t[\"type-opencl-host\", \"cl_long3\"],\n\t[\"type-opencl-host\", \"cl_long4\"],\n\t[\"type-opencl-host\", \"cl_long8\"],\n\t[\"type-opencl-host\", \"cl_map_flags\"],\n\t[\"type-opencl-host\", \"cl_mem\"],\n\t[\"type-opencl-host\", \"cl_mem_flags\"],\n\t[\"type-opencl-host\", \"cl_mem_info\"],\n\t[\"type-opencl-host\", \"cl_mem_object_type\"],\n\t[\"type-opencl-host\", \"cl_platform_id\"],\n\t[\"type-opencl-host\", \"cl_platform_info\"],\n\t[\"type-opencl-host\", \"cl_profiling_info\"],\n\t[\"type-opencl-host\", \"cl_program\"],\n\t[\"type-opencl-host\", \"cl_program_build_info\"],\n\t[\"type-opencl-host\", \"cl_program_info\"],\n\t[\"type-opencl-host\", \"cl_sampler\"],\n\t[\"type-opencl-host\", \"cl_sampler_info\"],\n\t[\"type-opencl-host\", \"cl_short\"],\n\t[\"type-opencl-host\", \"cl_short16\"],\n\t[\"type-opencl-host\", \"cl_short2\"],\n\t[\"type-opencl-host\", \"cl_short3\"],\n\t[\"type-opencl-host\", \"cl_short4\"],\n\t[\"type-opencl-host\", \"cl_short8\"],\n\t[\"type-opencl-host\", \"cl_uchar\"],\n\t[\"type-opencl-host\", \"cl_uchar16\"],\n\t[\"type-opencl-host\", \"cl_uchar2\"],\n\t[\"type-opencl-host\", \"cl_uchar3\"],\n\t[\"type-opencl-host\", \"cl_uchar4\"],\n\t[\"type-opencl-host\", \"cl_uchar8\"],\n\t[\"type-opencl-host\", \"cl_uint\"],\n\t[\"type-opencl-host\", \"cl_uint16\"],\n\t[\"type-opencl-host\", \"cl_uint2\"],\n\t[\"type-opencl-host\", \"cl_uint3\"],\n\t[\"type-opencl-host\", \"cl_uint4\"],\n\t[\"type-opencl-host\", \"cl_uint8\"],\n\t[\"type-opencl-host\", \"cl_ulong\"],\n\t[\"type-opencl-host\", \"cl_ulong16\"],\n\t[\"type-opencl-host\", \"cl_ulong2\"],\n\t[\"type-opencl-host\", \"cl_ulong3\"],\n\t[\"type-opencl-host\", \"cl_ulong4\"],\n\t[\"type-opencl-host\", \"cl_ulong8\"],\n\t[\"type-opencl-host\", \"cl_ushort\"],\n\t[\"type-opencl-host\", \"cl_ushort16\"],\n\t[\"type-opencl-host\", \"cl_ushort2\"],\n\t[\"type-opencl-host\", \"cl_ushort3\"],\n\t[\"type-opencl-host\", \"cl_ushort4\"],\n\t[\"type-opencl-host\", \"cl_ushort8\"]\n]\n\n----------------------------------------------------\n\nChecks for all reserved types in OpenCL host code (C-API).\n"
  },
  {
    "path": "tests/languages/opencl-extensions+cpp/type_feature.test",
    "content": "Buffer\nBufferGL\nBufferRenderGL\nCommandQueue\nContext\nDevice\nDeviceCommandQueue\nEnqueueArgs\nEvent\nImage\nImage1D\nImage1DArray\nImage1DBuffer\nImage2D\nImage2DArray\nImage2DGL\nImage3D\nImage3DGL\nImageFormat\nImageGL\nKernel\nKernelFunctor\nLocalSpaceArg\nMemory\nNDRange\nPipe\nPlatform\nProgram\nSampler\nSVMAllocator\nSVMTraitAtomic\nSVMTraitCoarse\nSVMTraitFine\nSVMTraitReadOnly\nSVMTraitReadWrite\nSVMTraitWriteOnly\nUserEvent\n\n----------------------------------------------------\n\n[\n\t[\"type-opencl-host-cpp\", \"Buffer\"],\n\t[\"type-opencl-host-cpp\", \"BufferGL\"],\n\t[\"type-opencl-host-cpp\", \"BufferRenderGL\"],\n\t[\"type-opencl-host-cpp\", \"CommandQueue\"],\n\t[\"type-opencl-host-cpp\", \"Context\"],\n\t[\"type-opencl-host-cpp\", \"Device\"],\n\t[\"type-opencl-host-cpp\", \"DeviceCommandQueue\"],\n\t[\"type-opencl-host-cpp\", \"EnqueueArgs\"],\n\t[\"type-opencl-host-cpp\", \"Event\"],\n\t[\"type-opencl-host-cpp\", \"Image\"],\n\t[\"type-opencl-host-cpp\", \"Image1D\"],\n\t[\"type-opencl-host-cpp\", \"Image1DArray\"],\n\t[\"type-opencl-host-cpp\", \"Image1DBuffer\"],\n\t[\"type-opencl-host-cpp\", \"Image2D\"],\n\t[\"type-opencl-host-cpp\", \"Image2DArray\"],\n\t[\"type-opencl-host-cpp\", \"Image2DGL\"],\n\t[\"type-opencl-host-cpp\", \"Image3D\"],\n\t[\"type-opencl-host-cpp\", \"Image3DGL\"],\n\t[\"type-opencl-host-cpp\", \"ImageFormat\"],\n\t[\"type-opencl-host-cpp\", \"ImageGL\"],\n\t[\"type-opencl-host-cpp\", \"Kernel\"],\n\t[\"type-opencl-host-cpp\", \"KernelFunctor\"],\n\t[\"type-opencl-host-cpp\", \"LocalSpaceArg\"],\n\t[\"type-opencl-host-cpp\", \"Memory\"],\n\t[\"type-opencl-host-cpp\", \"NDRange\"],\n\t[\"type-opencl-host-cpp\", \"Pipe\"],\n\t[\"type-opencl-host-cpp\", \"Platform\"],\n\t[\"type-opencl-host-cpp\", \"Program\"],\n\t[\"type-opencl-host-cpp\", \"Sampler\"],\n\t[\"type-opencl-host-cpp\", \"SVMAllocator\"],\n\t[\"type-opencl-host-cpp\", \"SVMTraitAtomic\"],\n\t[\"type-opencl-host-cpp\", \"SVMTraitCoarse\"],\n\t[\"type-opencl-host-cpp\", \"SVMTraitFine\"],\n\t[\"type-opencl-host-cpp\", \"SVMTraitReadOnly\"],\n\t[\"type-opencl-host-cpp\", \"SVMTraitReadWrite\"],\n\t[\"type-opencl-host-cpp\", \"SVMTraitWriteOnly\"],\n\t[\"type-opencl-host-cpp\", \"UserEvent\"]\n]\n\n----------------------------------------------------\n\nChecks for all types in OpenCL host code (C++-API).\n"
  },
  {
    "path": "tests/languages/openqasm/class-name_feature.test",
    "content": "angle\r\nbit\r\nbool\r\ncreg\r\nfixed\r\nfloat\r\nint\r\nlength\r\nqreg\r\nqubit\r\nstretch\r\nuint\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"class-name\", \"angle\"],\r\n\t[\"class-name\", \"bit\"],\r\n\t[\"class-name\", \"bool\"],\r\n\t[\"class-name\", \"creg\"],\r\n\t[\"class-name\", \"fixed\"],\r\n\t[\"class-name\", \"float\"],\r\n\t[\"class-name\", \"int\"],\r\n\t[\"class-name\", \"length\"],\r\n\t[\"class-name\", \"qreg\"],\r\n\t[\"class-name\", \"qubit\"],\r\n\t[\"class-name\", \"stretch\"],\r\n\t[\"class-name\", \"uint\"]\r\n]"
  },
  {
    "path": "tests/languages/openqasm/comment_feature.test",
    "content": "/*\r\n comment\r\n */\r\n\r\n// comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/*\\r\\n comment\\r\\n */\"],\r\n\r\n\t[\"comment\", \"// comment\"]\r\n]"
  },
  {
    "path": "tests/languages/openqasm/constant_feature.test",
    "content": "pi tau euler\r\nπ τ ℇ\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"pi\"], [\"constant\", \"tau\"], [\"constant\", \"euler\"],\r\n\t[\"constant\", \"π\"], \" τ \", [\"constant\", \"ℇ\"]\r\n]"
  },
  {
    "path": "tests/languages/openqasm/function_feature.test",
    "content": "sin(\ncos(\ntan(\nexp(\nln(\nsqrt(\nrotl(\nrotr(\npopcount(\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"sin\"], [\"punctuation\", \"(\"],\n\t[\"function\", \"cos\"], [\"punctuation\", \"(\"],\n\t[\"function\", \"tan\"], [\"punctuation\", \"(\"],\n\t[\"function\", \"exp\"], [\"punctuation\", \"(\"],\n\t[\"function\", \"ln\"], [\"punctuation\", \"(\"],\n\t[\"function\", \"sqrt\"], [\"punctuation\", \"(\"],\n\t[\"function\", \"rotl\"], [\"punctuation\", \"(\"],\n\t[\"function\", \"rotr\"], [\"punctuation\", \"(\"],\n\t[\"function\", \"popcount\"], [\"punctuation\", \"(\"]\n]\n"
  },
  {
    "path": "tests/languages/openqasm/keyword_feature.test",
    "content": "barrier\r\nboxas\r\nboxto\r\nbreak\r\nconst\r\ncontinue\r\nctrl\r\ndef\r\ndefcal\r\ndefcalgrammar\r\ndelay\r\nelse\r\nend\r\nfor\r\ngate\r\ngphase\r\nif\r\nin\r\ninclude\r\ninv\r\nkernel\r\nlengthof\r\nlet\r\nmeasure\r\npow\r\nreset\r\nreturn\r\nrotary\r\nstretchinf\r\nwhile\r\n\r\nOPENQASM\r\n\r\nCX\r\nU\r\n\r\n#pragma\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"barrier\"],\r\n\t[\"keyword\", \"boxas\"],\r\n\t[\"keyword\", \"boxto\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"ctrl\"],\r\n\t[\"keyword\", \"def\"],\r\n\t[\"keyword\", \"defcal\"],\r\n\t[\"keyword\", \"defcalgrammar\"],\r\n\t[\"keyword\", \"delay\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"gate\"],\r\n\t[\"keyword\", \"gphase\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"inv\"],\r\n\t[\"keyword\", \"kernel\"],\r\n\t[\"keyword\", \"lengthof\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"measure\"],\r\n\t[\"keyword\", \"pow\"],\r\n\t[\"keyword\", \"reset\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"rotary\"],\r\n\t[\"keyword\", \"stretchinf\"],\r\n\t[\"keyword\", \"while\"],\r\n\r\n\t[\"keyword\", \"OPENQASM\"],\r\n\r\n\t[\"keyword\", \"CX\"],\r\n\t[\"keyword\", \"U\"],\r\n\r\n\t[\"keyword\", \"#pragma\"]\r\n]"
  },
  {
    "path": "tests/languages/openqasm/number_feature.test",
    "content": "1234\r\n1e2\r\n.5\r\n\r\n1000ms\r\n1000dt\r\n\r\n// not a number\r\n$0\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"1234\"],\r\n\t[\"number\", \"1e2\"],\r\n\t[\"number\", \".5\"],\r\n\r\n\t[\"number\", \"1000ms\"],\r\n\t[\"number\", \"1000dt\"],\r\n\r\n\t[\"comment\", \"// not a number\"],\r\n\t\"\\r\\n$0\"\r\n]"
  },
  {
    "path": "tests/languages/openqasm/operator_feature.test",
    "content": "> < >= <= == !=\r\n\r\n& | ~ ^ << >>\r\n&= |= ~= ^= <<= >>=\r\n\r\n! && ||\r\n\r\n= -> @\r\n\r\n+ - * / %\r\n+= -= *= /= %=\r\n++ --\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \">>\"],\r\n\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"|=\"],\r\n\t[\"operator\", \"~=\"],\r\n\t[\"operator\", \"^=\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"operator\", \">>=\"],\r\n\r\n\t[\"operator\", \"!\"], [\"operator\", \"&&\"], [\"operator\", \"||\"],\r\n\r\n\t[\"operator\", \"=\"], [\"operator\", \"->\"], [\"operator\", \"@\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"--\"]\r\n]"
  },
  {
    "path": "tests/languages/openqasm/punctuation_feature.test",
    "content": "( ) { } [ ]\n; , : .\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \".\"]\n]\n"
  },
  {
    "path": "tests/languages/openqasm/string_feature.test",
    "content": "\"foo\"\r\n'bar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"'bar'\"]\r\n]"
  },
  {
    "path": "tests/languages/oz/atom_feature.test",
    "content": "''\r\n'fo\\'obar'\r\n'foo\r\nbar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"atom\", \"''\"],\r\n\t[\"atom\", \"'fo\\\\'obar'\"],\r\n\t[\"atom\", \"'foo\\r\\nbar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for atoms."
  },
  {
    "path": "tests/languages/oz/attr-name_feature.test",
    "content": "menubutton(text:'Test' underline:0)\r\n\r\n% negative example\r\nval:=Value\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"menubutton\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"attr-name\", \"text\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"atom\", \"'Test'\"],\r\n\t[\"attr-name\", \"underline\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"comment\", \"% negative example\"],\r\n\t\"\\r\\nval\", [\"operator\", \":=\"], \"Value\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for parameter names.\r\n"
  },
  {
    "path": "tests/languages/oz/comment_feature.test",
    "content": "%\r\n% Foobar\r\n/**/\r\n/* Foo\r\nbar */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"%\"],\r\n\t[\"comment\", \"% Foobar\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* Foo\\r\\nbar */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/oz/function_feature.test",
    "content": "foobar()\r\n{Foobar}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foobar\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"], [\"function\", \"Foobar\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions and procedures."
  },
  {
    "path": "tests/languages/oz/keyword_feature.test",
    "content": "$\r\n_\r\n[]\r\nat\r\nattr\r\ncase\r\ncatch\r\nchoice\r\nclass\r\ncond\r\ndeclare\r\ndefine\r\ndis\r\nelse\r\nelsecase\r\nelseif\r\nend\r\nexport\r\nfail\r\nfalse\r\nfeat\r\nfinally\r\nfrom\r\nfun\r\nfunctor\r\nif\r\nimport\r\nin\r\nlocal\r\nlock\r\nmeth\r\nnil\r\nnot\r\nof\r\nor\r\nprepare\r\nproc\r\nprop\r\nraise\r\nrequire\r\nself\r\nskip\r\nthen\r\nthread\r\ntrue\r\ntry\r\nunit\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"$\"],\r\n\t[\"keyword\", \"_\"],\r\n\t[\"keyword\", \"[]\"],\r\n\t[\"keyword\", \"at\"],\r\n\t[\"keyword\", \"attr\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"choice\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"cond\"],\r\n\t[\"keyword\", \"declare\"],\r\n\t[\"keyword\", \"define\"],\r\n\t[\"keyword\", \"dis\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"elsecase\"],\r\n\t[\"keyword\", \"elseif\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"fail\"],\r\n\t[\"keyword\", \"false\"],\r\n\t[\"keyword\", \"feat\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"keyword\", \"fun\"],\r\n\t[\"keyword\", \"functor\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"local\"],\r\n\t[\"keyword\", \"lock\"],\r\n\t[\"keyword\", \"meth\"],\r\n\t[\"keyword\", \"nil\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"prepare\"],\r\n\t[\"keyword\", \"proc\"],\r\n\t[\"keyword\", \"prop\"],\r\n\t[\"keyword\", \"raise\"],\r\n\t[\"keyword\", \"require\"],\r\n\t[\"keyword\", \"self\"],\r\n\t[\"keyword\", \"skip\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"thread\"],\r\n\t[\"keyword\", \"true\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"unit\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/oz/number_feature.test",
    "content": "0\r\n42\r\n0154\r\n0xBadFace\r\n0B0101\r\n3.14159\r\n2e8\r\n3.E~7\r\n4.8E12\r\n&0\r\n&a\r\n&\\n\r\n&\\124\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"0154\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0B0101\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2e8\"],\r\n\t[\"number\", \"3.E~7\"],\r\n\t[\"number\", \"4.8E12\"],\r\n\t[\"number\", \"&0\"],\r\n\t[\"number\", \"&a\"],\r\n\t[\"number\", \"&\\\\n\"],\r\n\t[\"number\", \"&\\\\124\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/oz/operator_feature.test",
    "content": ":= :: :::\r\n< <- <: <=\r\n= == =: =< =<:\r\n> >= >: >=:\r\n\\= \\=:\r\n! !!\r\n| # + -\r\n* / , ~\r\n^ @\r\nandthen\r\ndiv\r\nmod\r\norelse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \":=\"], [\"operator\", \"::\"], [\"operator\", \":::\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<-\"], [\"operator\", \"<:\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"=:\"], [\"operator\", \"=<\"], [\"operator\", \"=<:\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \">:\"], [\"operator\", \">=:\"],\r\n\t[\"operator\", \"\\\\=\"], [\"operator\", \"\\\\=:\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!!\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"#\"], [\"operator\", \"+\"], [\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \",\"], [\"operator\", \"~\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"@\"],\r\n\t[\"operator\", \"andthen\"],\r\n\t[\"operator\", \"div\"],\r\n\t[\"operator\", \"mod\"],\r\n\t[\"operator\", \"orelse\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/oz/string_feature.test",
    "content": "\"\"\r\n\"Fo\\\"obar\"\r\n\"Foo\r\nbar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"Foo\\r\\nbar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/oz/variable_feature.test",
    "content": "`foo`\n\n----------------------------------------------------\n\n[\n\t[\"variable\", \"`foo`\"]\n]\n"
  },
  {
    "path": "tests/languages/parigp/comment_feature.test",
    "content": "/**/\r\n/* foo\r\nbar */\r\n\\\\\r\n\\\\ foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"\\\\\\\\\"],\r\n\t[\"comment\", \"\\\\\\\\ foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/parigp/function_feature.test",
    "content": "foo()\r\nf o o b a r ( )\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"f o o b a r\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions. Also checks that whitespaces are ignored."
  },
  {
    "path": "tests/languages/parigp/keyword_feature.test",
    "content": "break\r\nbreakpoint\r\ndbg_down\r\ndbg_err\r\ndbg_up\r\ndbg_x\r\nfor\r\nforcomposite\r\nfordiv\r\nforell\r\nforpart\r\nforprime\r\nforstep\r\nforsubgroup\r\nforvec\r\nif\r\niferr\r\nlocal\r\nmy\r\nnext\r\nreturn\r\nuntil\r\nwhile\r\n\r\nbr e ak\r\nbreak point\r\nd b g_down\r\ndbg_e r r\r\ndbg _ up\r\ndb g _x\r\nf o r\r\nfor composite\r\nfor div\r\nfor ell\r\nfor part\r\nfor prime\r\nfor step\r\nfor subgroup\r\nfor vec\r\ni f\r\nif err\r\nl o c a l\r\nm y\r\nne xt\r\nre tu rn\r\nu nti l\r\nwhi le\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"breakpoint\"],\r\n\t[\"keyword\", \"dbg_down\"],\r\n\t[\"keyword\", \"dbg_err\"],\r\n\t[\"keyword\", \"dbg_up\"],\r\n\t[\"keyword\", \"dbg_x\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"forcomposite\"],\r\n\t[\"keyword\", \"fordiv\"],\r\n\t[\"keyword\", \"forell\"],\r\n\t[\"keyword\", \"forpart\"],\r\n\t[\"keyword\", \"forprime\"],\r\n\t[\"keyword\", \"forstep\"],\r\n\t[\"keyword\", \"forsubgroup\"],\r\n\t[\"keyword\", \"forvec\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"iferr\"],\r\n\t[\"keyword\", \"local\"],\r\n\t[\"keyword\", \"my\"],\r\n\t[\"keyword\", \"next\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"until\"],\r\n\t[\"keyword\", \"while\"],\r\n\r\n\t[\"keyword\", \"br e ak\"],\r\n\t[\"keyword\", \"break point\"],\r\n\t[\"keyword\", \"d b g_down\"],\r\n\t[\"keyword\", \"dbg_e r r\"],\r\n\t[\"keyword\", \"dbg _ up\"],\r\n\t[\"keyword\", \"db g _x\"],\r\n\t[\"keyword\", \"f o r\"],\r\n\t[\"keyword\", \"for composite\"],\r\n\t[\"keyword\", \"for div\"],\r\n\t[\"keyword\", \"for ell\"],\r\n\t[\"keyword\", \"for part\"],\r\n\t[\"keyword\", \"for prime\"],\r\n\t[\"keyword\", \"for step\"],\r\n\t[\"keyword\", \"for subgroup\"],\r\n\t[\"keyword\", \"for vec\"],\r\n\t[\"keyword\", \"i f\"],\r\n\t[\"keyword\", \"if err\"],\r\n\t[\"keyword\", \"l o c a l\"],\r\n\t[\"keyword\", \"m y\"],\r\n\t[\"keyword\", \"ne xt\"],\r\n\t[\"keyword\", \"re tu rn\"],\r\n\t[\"keyword\", \"u nti l\"],\r\n\t[\"keyword\", \"whi le\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords. Also checks that whitespaces are ignored."
  },
  {
    "path": "tests/languages/parigp/number_feature.test",
    "content": "0\r\n42\r\n1 2 3 4 5\r\n4.\r\n4 .\r\n.5\r\n. 5\r\n3.14159\r\n3 . 14 15 9\r\n3E8\r\n3 E 8\r\n2.0e-7\r\n2 . 0 e - 7\r\n.28e+12\r\n. 2 8 e + 1 2\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"1 2 3 4 5\"],\r\n\t[\"number\", \"4.\"],\r\n\t[\"number\", \"4 .\"],\r\n\t[\"number\", \".5\"],\r\n\t[\"number\", \". 5\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3 . 14 15 9\"],\r\n\t[\"number\", \"3E8\"],\r\n\t[\"number\", \"3 E 8\"],\r\n\t[\"number\", \"2.0e-7\"],\r\n\t[\"number\", \"2 . 0 e - 7\"],\r\n\t[\"number\", \".28e+12\"],\r\n\t[\"number\", \". 2 8 e + 1 2\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers. Also checks that whitespaces are ignored."
  },
  {
    "path": "tests/languages/parigp/operator_feature.test",
    "content": "..\r\n. .\r\n*\r\n*=\r\n* =\r\n/\r\n/=\r\n/ =\r\n!\r\n!=\r\n! =\r\n%\r\n%=\r\n% =\r\n%#\r\n% #\r\n%'\r\n% '\r\n%#'\r\n% # '\r\n%'''''\r\n% '''''\r\n%#'''''\r\n% # '''''\r\n+\r\n++\r\n+ +\r\n+=\r\n+ =\r\n-\r\n--\r\n- -\r\n-=\r\n- =\r\n->\r\n- >\r\n<\r\n<<\r\n< <\r\n<=\r\n< =\r\n<<=\r\n< < =\r\n<>\r\n< >\r\n>\r\n>>\r\n> >\r\n>=\r\n> =\r\n>>=\r\n> > =\r\n=\r\n==\r\n= =\r\n===\r\n= = =\r\n\\\r\n\\/\r\n\\ /\r\n\\=\r\n\\ =\r\n\\/=\r\n\\ / =\r\n&\r\n&&\r\n& &\r\n||\r\n| |\r\n'\r\n#\r\n~\r\n^\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"..\"],\r\n\t[\"operator\", \". .\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"* =\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"/ =\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"! =\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \"% =\"],\r\n\t[\"operator\", \"%#\"],\r\n\t[\"operator\", \"% #\"],\r\n\t[\"operator\", \"%'\"],\r\n\t[\"operator\", \"% '\"],\r\n\t[\"operator\", \"%#'\"],\r\n\t[\"operator\", \"% # '\"],\r\n\t[\"operator\", \"%'''''\"],\r\n\t[\"operator\", \"% '''''\"],\r\n\t[\"operator\", \"%#'''''\"],\r\n\t[\"operator\", \"% # '''''\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"+ +\"],\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"+ =\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"operator\", \"- -\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"- =\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"operator\", \"- >\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \"< <\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \"< =\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"operator\", \"< < =\"],\r\n\t[\"operator\", \"<>\"],\r\n\t[\"operator\", \"< >\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \"> >\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"> =\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \"> > =\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"= =\"],\r\n\t[\"operator\", \"===\"],\r\n\t[\"operator\", \"= = =\"],\r\n\t[\"operator\", \"\\\\\"],\r\n\t[\"operator\", \"\\\\/\"],\r\n\t[\"operator\", \"\\\\ /\"],\r\n\t[\"operator\", \"\\\\=\"],\r\n\t[\"operator\", \"\\\\ =\"],\r\n\t[\"operator\", \"\\\\/=\"],\r\n\t[\"operator\", \"\\\\ / =\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"& &\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"| |\"],\r\n\t[\"operator\", \"'\"],\r\n\t[\"operator\", \"#\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"^\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators. Also checks that whitespaces are ignored."
  },
  {
    "path": "tests/languages/parigp/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/parser/boolean_feature.test",
    "content": "(true)\r\n(false)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"boolean\", \"false\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans inside expressions."
  },
  {
    "path": "tests/languages/parser/escape_feature.test",
    "content": "^$\r\n^^\r\n^;\r\n^@\r\n^(\r\n^)\r\n^[\r\n^]\r\n^{\r\n^}\r\n^\"\r\n^'\r\n^:\r\n^#\r\n^#20\r\n^#af\r\n^#AF\r\n\r\n^^date::now\r\n^$foobar\r\n\r\n<div class=\"foo^^bar\">\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"escape\", \"^$\"],\r\n\t[\"escape\", \"^^\"],\r\n\t[\"escape\", \"^;\"],\r\n\t[\"escape\", \"^@\"],\r\n\t[\"escape\", \"^(\"],\r\n\t[\"escape\", \"^)\"],\r\n\t[\"escape\", \"^[\"],\r\n\t[\"escape\", \"^]\"],\r\n\t[\"escape\", \"^{\"],\r\n\t[\"escape\", \"^}\"],\r\n\t[\"escape\", \"^\\\"\"],\r\n\t[\"escape\", \"^'\"],\r\n\t[\"escape\", \"^:\"],\r\n\t[\"escape\", \"^#\"],\r\n\t[\"escape\", \"^#20\"],\r\n\t[\"escape\", \"^#af\"],\r\n\t[\"escape\", \"^#AF\"],\r\n\r\n\t[\"escape\", \"^^\"], \"date::now\\r\\n\",\r\n\t[\"escape\", \"^$\"], \"foobar\\r\\n\\r\\n\",\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"foo\",\r\n\t\t\t[\"escape\", \"^^\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for escapes.\r\n"
  },
  {
    "path": "tests/languages/parser/expression_feature.test",
    "content": "((3-(9-2))*4)\r\n^eval(4+2)\r\n\r\n<div class=\"foo-^eval(4+2)\">\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"operator\", \"-\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"9\"],\r\n\t\t[\"operator\", \"-\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"operator\", \"*\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"keyword\", \"^eval\"],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"foo-\",\r\n\t\t\t[\"keyword\", \"^eval\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"number\", \"4\"],\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"number\", \"2\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for expressions, up to 3 levels of depth.\r\n"
  },
  {
    "path": "tests/languages/parser/function_feature.test",
    "content": "@foo[]\r\n@GET_foo[]\r\n@SET_foo[]\r\n^foo[]\r\n^Foo::create[]\r\n^date::now[]\r\n^foo_bar.menu{}\r\n\r\n(^foo[])\r\n\r\n<div class=\"^foo[]\">\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", [\"@foo\"]],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"function\", [\r\n\t\t\"@\",\r\n\t\t[\"keyword\", \"GET_\"],\r\n\t\t\"foo\"\r\n\t]],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"function\", [\r\n\t\t\"@\",\r\n\t\t[\"keyword\", \"SET_\"],\r\n\t\t\"foo\"\r\n\t]],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"function\", [\"^foo\"]],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"function\", [\r\n\t\t\"^Foo\",\r\n\t\t[\"punctuation\", \"::\"],\r\n\t\t\"create\"\r\n\t]],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"function\", [\r\n\t\t\"^date\",\r\n\t\t[\"punctuation\", \"::\"],\r\n\t\t\"now\"\r\n\t]],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"function\", [\r\n\t\t\"^foo_bar\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"menu\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"function\", [\"^foo\"]],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"function\", [\"^foo\"]],\r\n\t\t\t[\"parser-punctuation\", \"[\"],\r\n\t\t\t[\"parser-punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions and methods.\r\n"
  },
  {
    "path": "tests/languages/parser/keyword_feature.test",
    "content": "^case\r\n^eval\r\n^for\r\n^if\r\n^switch\r\n^throw\r\n\r\n@BASE\r\n@CLASS\r\n@GET\r\n@GET_DEFAULT\r\n@OPTIONS\r\n@SET_DEFAULT\r\n@USE\r\n\r\n(^eval(2+2))\r\n\r\n<div class=\"^if($foo){bar}{baz}\">\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"^case\"],\r\n\t[\"keyword\", \"^eval\"],\r\n\t[\"keyword\", \"^for\"],\r\n\t[\"keyword\", \"^if\"],\r\n\t[\"keyword\", \"^switch\"],\r\n\t[\"keyword\", \"^throw\"],\r\n\r\n\t[\"keyword\", \"@BASE\"],\r\n\t[\"keyword\", \"@CLASS\"],\r\n\t[\"keyword\", \"@GET\"],\r\n\t[\"keyword\", \"@GET_DEFAULT\"],\r\n\t[\"keyword\", \"@OPTIONS\"],\r\n\t[\"keyword\", \"@SET_DEFAULT\"],\r\n\t[\"keyword\", \"@USE\"],\r\n\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"keyword\", \"^eval\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"keyword\", \"^if\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"variable\", [\"$foo\"]],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"parser-punctuation\", \"{\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"parser-punctuation\", \"}\"],\r\n\t\t\t[\"parser-punctuation\", \"{\"],\r\n\t\t\t\"baz\",\r\n\t\t\t[\"parser-punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/parser/number_feature.test",
    "content": "(42)\r\n(3.14159)\r\n(3e5)\r\n(0.8E-12)\r\n(3.9e+2)\r\n(0xbadface)\r\n(0XBADFACE)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"3.14159\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"3e5\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"0.8E-12\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"3.9e+2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"0xbadface\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"0XBADFACE\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers inside expressions."
  },
  {
    "path": "tests/languages/parser/operator_feature.test",
    "content": "(~42)\r\n(+42)\r\n(-42)\r\n(4/2)\r\n(9\\2)\r\n(9%2)\r\n(!true)\r\n(4!|2)\r\n(true!||false)\r\n(4!=2)\r\n(4&2)\r\n(true&&false)\r\n(4|2)\r\n(true||false)\r\n(4==2)\r\n(4<2)\r\n(4<=2)\r\n(4<<2)\r\n(4>2)\r\n(4>=2)\r\n(4>>2)\r\n(-f \"foo\")\r\n(-d \"foo\")\r\n(def $foo)\r\n(4 eq 2)\r\n(4 ge 2)\r\n(4 gt 2)\r\n(in \"foo\")\r\n($foo is string)\r\n(4 le 2)\r\n(4 lt 2)\r\n(4 ne 2)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"operator\", \"~\"],\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"operator\", \"-\"],\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"/\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"9\"],\r\n\t\t[\"operator\", \"\\\\\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"9\"],\r\n\t\t[\"operator\", \"%\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"operator\", \"!\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"!|\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"operator\", \"!||\"],\r\n\t\t[\"boolean\", \"false\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"!=\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"&\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"operator\", \"&&\"],\r\n\t\t[\"boolean\", \"false\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"operator\", \"||\"],\r\n\t\t[\"boolean\", \"false\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"<=\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"<<\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \">\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \">=\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \">>\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"operator\", \"-f\"],\r\n\t\t[\"string\", \"\\\"foo\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"operator\", \"-d\"],\r\n\t\t[\"string\", \"\\\"foo\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"operator\", \"def\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"eq\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"ge\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"gt\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"operator\", \"in\"],\r\n\t\t[\"string\", \"\\\"foo\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"is\"],\r\n\t\t\" string\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"le\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"lt\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"operator\", \"ne\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators inside expressions."
  },
  {
    "path": "tests/languages/parser/parser-comment_feature.test",
    "content": "Foo\r\n#\r\n# Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"Foo\\r\\n\",\r\n\t[\"parser-comment\", \"#\"],\r\n\t[\"parser-comment\", \"# Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\nThe first line of this test is needed, since we require a whitespace before the hash\r\nand tests are trimmed."
  },
  {
    "path": "tests/languages/parser/string_feature.test",
    "content": "(\"\")\r\n(\"foo^\"bar\")\r\n(\"foo\r\nbar\")\r\n('')\r\n('foo^'bar')\r\n('foo\r\nbar')\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"\\\"\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"\\\"foo^\\\"bar\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"''\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"'foo^'bar'\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"'foo\\r\\nbar'\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings inside expressions."
  },
  {
    "path": "tests/languages/parser/variable_feature.test",
    "content": "$foo\r\n$foo[bar]\r\n$foo_bar[\r\n\t$.baz[foo]\r\n\t$.1[bar]\r\n]\r\n$foo.$bar\r\n$foo.[$bar.baz]\r\n$math:PI\r\n\r\n($foo)\r\n\r\n<div class=\"$foo\">\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", [\"$foo\"]],\r\n\r\n\t[\"variable\", [\"$foo\"]],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"bar\",\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"variable\", [\"$foo_bar\"]],\r\n\t[\"punctuation\", \"[\"],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"baz\"\r\n\t]],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"foo\",\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"1\"\r\n\t]],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"bar\",\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$foo\",\r\n\t\t[\"punctuation\", \".\"]\r\n\t]],\r\n\t[\"variable\", [\"$bar\"]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$foo\",\r\n\t\t[\"punctuation\", \".\"]\r\n\t]],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"variable\", [\r\n\t\t\"$bar\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"baz\"\r\n\t]],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$math\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"PI\"\r\n\t]],\r\n\r\n\t[\"expression\", [\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"variable\", [\"$foo\"]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables.\r\n"
  },
  {
    "path": "tests/languages/pascal/asm_feature.test",
    "content": "program asmDemo(input, output, stderr);\n\n// The $asmMode directive informs the compiler\n// which syntax is used in asm-blocks.\n// Alternatives are 'att' (AT&T syntax) and 'direct'.\n{$asmMode intel}\n\nvar\n\tn, m: longint;\nbegin\n\tn := 42;\n\tm := -7;\n\twriteLn('n = ', n, '; m = ', m);\n\n\t// instead of declaring another temporary variable\n\t// and writing \"tmp := n; n := m; m := tmp;\":\n\tasm\n\t\tmov eax, n  // eax := n\n\t\t// xchg can only operate at most on one memory address\n\t\txchg eax, m // swaps values in eax and at m\n\t\tmov n, eax  // n := eax (holding the former m value)\n\t// an array of strings after the asm-block closing 'end'\n\t// tells the compiler which registers have changed\n\t// (you don't wanna mess with the compiler's notion\n\t// which registers mean what)\n\tend ['eax'];\n\n\twriteLn('n = ', n, '; m = ', m);\nend.\n\nprogram sign(input, output, stderr);\n\ntype\n\tsignumCodomain = -1..1;\n\n{ returns the sign of an integer }\nfunction signum({$ifNDef CPUx86_64} const {$endIf} x: longint): signumCodomain;\n{$ifDef CPUx86_64} // ============= optimized implementation\nassembler;\n{$asmMode intel}\nasm\n\txor rax, rax                  // ensure result is not wrong\n\t                              // due to any residue\n\n\ttest x, x                     // x ≟ 0\n\tsetnz al                      // al ≔ ¬ZF\n\n\tsar x, 63                     // propagate sign-bit through reg.\n\tcmovs rax, x                  // if SF then rax ≔ −1\nend;\n{$else} // ========================== default implementation\nbegin\n\t// This is what math.sign virtually does.\n\t// The compiled code requires _two_ cmp instructions, though.\n\tif x > 0 then\n\tbegin\n\t\tsignum := 1;\n\tend\n\telse if x < 0 then\n\tbegin\n\t\tsignum := -1;\n\tend\n\telse\n\tbegin\n\t\tsignum := 0;\n\tend;\nend;\n{$endIf}\n\n// M A I N =================================================\nvar\n\tx: longint;\nbegin\n\treadLn(x);\n\twriteLn(signum(x));\nend.\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"program\"],\n\t\" asmDemo\",\n\t[\"punctuation\", \"(\"],\n\t\"input\",\n\t[\"punctuation\", \",\"],\n\t\" output\",\n\t[\"punctuation\", \",\"],\n\t\" stderr\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// The $asmMode directive informs the compiler\"],\n\t[\"comment\", \"// which syntax is used in asm-blocks.\"],\n\t[\"comment\", \"// Alternatives are 'att' (AT&T syntax) and 'direct'.\"],\n\t[\"directive\", \"{$asmMode intel}\"],\n\n\t[\"keyword\", \"var\"],\n\n\t\"\\r\\n\\tn\",\n\t[\"punctuation\", \",\"],\n\t\" m\",\n\t[\"punctuation\", \":\"],\n\t\" longint\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"begin\"],\n\n\t\"\\r\\n\\tn \",\n\t[\"operator\", \":=\"],\n\t[\"number\", \"42\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n\\tm \",\n\t[\"operator\", \":=\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"7\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n\\twriteLn\",\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"'n = '\"],\n\t[\"punctuation\", \",\"],\n\t\" n\",\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"'; m = '\"],\n\t[\"punctuation\", \",\"],\n\t\" m\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// instead of declaring another temporary variable\"],\n\n\t[\"comment\", \"// and writing \\\"tmp := n; n := m; m := tmp;\\\":\"],\n\n\t[\"keyword\", \"asm\"],\n\t[\"asm\", [\n\t\t\"\\r\\n\\t\\tmov eax\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" n  \",\n\t\t[\"comment\", \"// eax := n\"],\n\n\t\t[\"comment\", \"// xchg can only operate at most on one memory address\"],\n\n\t\t\"\\r\\n\\t\\txchg eax\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" m \",\n\t\t[\"comment\", \"// swaps values in eax and at m\"],\n\n\t\t\"\\r\\n\\t\\tmov n\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" eax  \",\n\t\t[\"comment\", \"// n := eax (holding the former m value)\"],\n\n\t\t[\"comment\", \"// an array of strings after the asm-block closing 'end'\"],\n\n\t\t[\"comment\", \"// tells the compiler which registers have changed\"],\n\n\t\t[\"comment\", \"// (you don't wanna mess with the compiler's notion\"],\n\n\t\t[\"comment\", \"// which registers mean what)\"]\n\t]],\n\t[\"keyword\", \"end\"],\n\t[\"punctuation\", \"[\"],\n\t[\"string\", \"'eax'\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n\\r\\n\\twriteLn\",\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"'n = '\"],\n\t[\"punctuation\", \",\"],\n\t\" n\",\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"'; m = '\"],\n\t[\"punctuation\", \",\"],\n\t\" m\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end\"],\n\t[\"punctuation\", \".\"],\n\n\t[\"keyword\", \"program\"],\n\t\" sign\",\n\t[\"punctuation\", \"(\"],\n\t\"input\",\n\t[\"punctuation\", \",\"],\n\t\" output\",\n\t[\"punctuation\", \",\"],\n\t\" stderr\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"type\"],\n\n\t\"\\r\\n\\tsignumCodomain \",\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"1\"],\n\t[\"operator\", \"..\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"{ returns the sign of an integer }\"],\n\n\t[\"keyword\", \"function\"],\n\t\" signum\",\n\t[\"punctuation\", \"(\"],\n\t[\"directive\", \"{$ifNDef CPUx86_64}\"],\n\t[\"keyword\", \"const\"],\n\t[\"directive\", \"{$endIf}\"],\n\t\" x\",\n\t[\"punctuation\", \":\"],\n\t\" longint\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \":\"],\n\t\" signumCodomain\",\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"{$ifDef CPUx86_64}\"],\n\t[\"comment\", \"// ============= optimized implementation\"],\n\n\t[\"keyword\", \"assembler\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"{$asmMode intel}\"],\n\n\t[\"keyword\", \"asm\"],\n\t[\"asm\", [\n\t\t\"\\r\\n\\txor rax\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" rax                  \",\n\t\t[\"comment\", \"// ensure result is not wrong\"],\n\n\t\t[\"comment\", \"// due to any residue\"],\n\n\t\t\"\\r\\n\\r\\n\\ttest x\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" x                     \",\n\t\t[\"comment\", \"// x ≟ 0\"],\n\n\t\t\"\\r\\n\\tsetnz al                      \",\n\t\t[\"comment\", \"// al ≔ ¬ZF\"],\n\n\t\t\"\\r\\n\\r\\n\\tsar x\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"number\", \"63\"],\n\t\t[\"comment\", \"// propagate sign-bit through reg.\"],\n\n\t\t\"\\r\\n\\tcmovs rax\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" x                  \",\n\t\t[\"comment\", \"// if SF then rax ≔ −1\"]\n\t]],\n\t[\"keyword\", \"end\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"{$else}\"],\n\t[\"comment\", \"// ========================== default implementation\"],\n\n\t[\"keyword\", \"begin\"],\n\n\t[\"comment\", \"// This is what math.sign virtually does.\"],\n\n\t[\"comment\", \"// The compiled code requires _two_ cmp instructions, though.\"],\n\n\t[\"keyword\", \"if\"],\n\t\" x \",\n\t[\"operator\", \">\"],\n\t[\"number\", \"0\"],\n\t[\"keyword\", \"then\"],\n\n\t[\"keyword\", \"begin\"],\n\n\t\"\\r\\n\\t\\tsignum \",\n\t[\"operator\", \":=\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"if\"],\n\t\" x \",\n\t[\"operator\", \"<\"],\n\t[\"number\", \"0\"],\n\t[\"keyword\", \"then\"],\n\n\t[\"keyword\", \"begin\"],\n\n\t\"\\r\\n\\t\\tsignum \",\n\t[\"operator\", \":=\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"else\"],\n\n\t[\"keyword\", \"begin\"],\n\n\t\"\\r\\n\\t\\tsignum \",\n\t[\"operator\", \":=\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"directive\", \"{$endIf}\"],\n\n\t[\"comment\", \"// M A I N =================================================\"],\n\n\t[\"keyword\", \"var\"],\n\n\t\"\\r\\n\\tx\",\n\t[\"punctuation\", \":\"],\n\t\" longint\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"begin\"],\n\n\t\"\\r\\n\\treadLn\",\n\t[\"punctuation\", \"(\"],\n\t\"x\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n\\twriteLn\",\n\t[\"punctuation\", \"(\"],\n\t\"signum\",\n\t[\"punctuation\", \"(\"],\n\t\"x\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end\"],\n\t[\"punctuation\", \".\"]\n]\n"
  },
  {
    "path": "tests/languages/pascal/comment_feature.test",
    "content": "(* foo *)\r\n(* foo\r\nbar *)\r\n{ foo }\r\n{ foo\r\nbar }\r\n//\r\n// foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"(* foo *)\"],\r\n\t[\"comment\", \"(* foo\\r\\nbar *)\"],\r\n\t[\"comment\", \"{ foo }\"],\r\n\t[\"comment\", \"{ foo\\r\\nbar }\"],\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/pascal/directive_feature.test",
    "content": "{$ASSERTIONS}\n{$asmMode intel}\n{$ifDef CPUx86_64} // ============= optimized implementation\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"{$ASSERTIONS}\"],\n\t[\"directive\", \"{$asmMode intel}\"],\n\t[\"directive\", \"{$ifDef CPUx86_64}\"],\n\t[\"comment\", \"// ============= optimized implementation\"]\n]\n"
  },
  {
    "path": "tests/languages/pascal/keyword_feature.test",
    "content": "absolute array asm\r\nbegin case const\r\nconstructor\r\ndestructor\r\ndo downto else\r\nend file for\r\nfunction goto\r\nif implementation\r\ninherited inline\r\ninterface label\r\nnil object of\r\noperator packed\r\nprocedure program\r\nrecord reintroduce\r\nrepeat self\r\nset string then\r\nto type unit\r\nuntil uses var\r\nwhile with\r\n\r\ndispose exit false\r\nnew true\r\n\r\nclass dispinterface\r\nexcept exports\r\nfinalization\r\nfinally\r\ninitialization\r\ninline library\r\non out packed\r\nproperty raise\r\nresourcestring\r\nthreadvar try\r\n\r\nabsolute abstract\r\nalias assembler\r\nbitpacked break\r\ncdecl continue\r\ncppdecl cvar\r\ndefault deprecated\r\ndynamic enumerator\r\nexperimental\r\nexport external\r\nfar far16\r\nforward generic\r\nhelper implements\r\nindex interrupt\r\niochecks local\r\nmessage name near\r\nnodefault noreturn\r\nnostackframe\r\noldfpccall\r\notherwise\r\noverload override \r\npascal platform\r\nprivate protected\r\npublic published\r\nread register\r\nreintroduce result\r\nsafecall saveregisters\r\nsoftfloat specialize\r\nstatic stdcall\r\nstored strict\r\nunaligned\r\nunimplemented\r\nvarargs virtual\r\nwrite\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"absolute\"], [\"keyword\", \"array\"], [\"keyword\", \"asm\"],\r\n\t[\"keyword\", \"begin\"], [\"keyword\", \"case\"], [\"keyword\", \"const\"],\r\n\t[\"keyword\", \"constructor\"],\r\n\t[\"keyword\", \"destructor\"],\r\n\t[\"keyword\", \"do\"], [\"keyword\", \"downto\"], [\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end\"], [\"keyword\", \"file\"], [\"keyword\", \"for\"],\r\n\t[\"keyword\", \"function\"], [\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"if\"], [\"keyword\", \"implementation\"],\r\n\t[\"keyword\", \"inherited\"], [\"keyword\", \"inline\"],\r\n\t[\"keyword\", \"interface\"], [\"keyword\", \"label\"],\r\n\t[\"keyword\", \"nil\"], [\"keyword\", \"object\"], [\"keyword\", \"of\"],\r\n\t[\"keyword\", \"operator\"], [\"keyword\", \"packed\"],\r\n\t[\"keyword\", \"procedure\"], [\"keyword\", \"program\"],\r\n\t[\"keyword\", \"record\"], [\"keyword\", \"reintroduce\"],\r\n\t[\"keyword\", \"repeat\"], [\"keyword\", \"self\"],\r\n\t[\"keyword\", \"set\"], [\"keyword\", \"string\"], [\"keyword\", \"then\"],\r\n\t[\"keyword\", \"to\"], [\"keyword\", \"type\"], [\"keyword\", \"unit\"],\r\n\t[\"keyword\", \"until\"], [\"keyword\", \"uses\"], [\"keyword\", \"var\"],\r\n\t[\"keyword\", \"while\"], [\"keyword\", \"with\"],\r\n\r\n\t[\"keyword\", \"dispose\"], [\"keyword\", \"exit\"], [\"keyword\", \"false\"],\r\n\t[\"keyword\", \"new\"], [\"keyword\", \"true\"],\r\n\r\n\t[\"keyword\", \"class\"], [\"keyword\", \"dispinterface\"],\r\n\t[\"keyword\", \"except\"], [\"keyword\", \"exports\"],\r\n\t[\"keyword\", \"finalization\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"initialization\"],\r\n\t[\"keyword\", \"inline\"], [\"keyword\", \"library\"],\r\n\t[\"keyword\", \"on\"], [\"keyword\", \"out\"], [\"keyword\", \"packed\"],\r\n\t[\"keyword\", \"property\"], [\"keyword\", \"raise\"],\r\n\t[\"keyword\", \"resourcestring\"],\r\n\t[\"keyword\", \"threadvar\"], [\"keyword\", \"try\"],\r\n\r\n\t[\"keyword\", \"absolute\"], [\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"alias\"], [\"keyword\", \"assembler\"],\r\n\t[\"keyword\", \"bitpacked\"], [\"keyword\", \"break\"],\r\n\t[\"keyword\", \"cdecl\"], [\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"cppdecl\"], [\"keyword\", \"cvar\"],\r\n\t[\"keyword\", \"default\"], [\"keyword\", \"deprecated\"],\r\n\t[\"keyword\", \"dynamic\"], [\"keyword\", \"enumerator\"],\r\n\t[\"keyword\", \"experimental\"],\r\n\t[\"keyword\", \"export\"], [\"keyword\", \"external\"],\r\n\t[\"keyword\", \"far\"], [\"keyword\", \"far16\"],\r\n\t[\"keyword\", \"forward\"], [\"keyword\", \"generic\"],\r\n\t[\"keyword\", \"helper\"], [\"keyword\", \"implements\"],\r\n\t[\"keyword\", \"index\"], [\"keyword\", \"interrupt\"],\r\n\t[\"keyword\", \"iochecks\"], [\"keyword\", \"local\"],\r\n\t[\"keyword\", \"message\"], [\"keyword\", \"name\"], [\"keyword\", \"near\"],\r\n\t[\"keyword\", \"nodefault\"], [\"keyword\", \"noreturn\"],\r\n\t[\"keyword\", \"nostackframe\"],\r\n\t[\"keyword\", \"oldfpccall\"],\r\n\t[\"keyword\", \"otherwise\"],\r\n\t[\"keyword\", \"overload\"], [\"keyword\", \"override\"],\r\n\t[\"keyword\", \"pascal\"], [\"keyword\", \"platform\"],\r\n\t[\"keyword\", \"private\"], [\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"public\"], [\"keyword\", \"published\"],\r\n\t[\"keyword\", \"read\"], [\"keyword\", \"register\"],\r\n\t[\"keyword\", \"reintroduce\"], [\"keyword\", \"result\"],\r\n\t[\"keyword\", \"safecall\"], [\"keyword\", \"saveregisters\"],\r\n\t[\"keyword\", \"softfloat\"], [\"keyword\", \"specialize\"],\r\n\t[\"keyword\", \"static\"], [\"keyword\", \"stdcall\"],\r\n\t[\"keyword\", \"stored\"], [\"keyword\", \"strict\"],\r\n\t[\"keyword\", \"unaligned\"],\r\n\t[\"keyword\", \"unimplemented\"],\r\n\t[\"keyword\", \"varargs\"], [\"keyword\", \"virtual\"],\r\n\t[\"keyword\", \"write\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/pascal/number_feature.test",
    "content": "42\r\n3.14159\r\n2.1e4\r\n1.0e-1\r\n3.8e+24\r\n$7aff\r\n&17\r\n%11110101\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2.1e4\"],\r\n\t[\"number\", \"1.0e-1\"],\r\n\t[\"number\", \"3.8e+24\"],\r\n\t[\"number\", \"$7aff\"],\r\n\t[\"number\", \"&17\"],\r\n\t[\"number\", \"%11110101\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal, hexadecimal, octal and binary numbers."
  },
  {
    "path": "tests/languages/pascal/operator_feature.test",
    "content": ".. ** :=\r\n< << <= > >> >=\r\n+ - * /\r\n+= -= *= /=\r\n@ ^ =\r\n\r\nand as div\r\nexclude in\r\ninclude is\r\nmod not or\r\nshl shr xor\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"..\"], [\"operator\", \"**\"], [\"operator\", \":=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"+=\"], [\"operator\", \"-=\"], [\"operator\", \"*=\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"@\"], [\"operator\", \"^\"], [\"operator\", \"=\"],\r\n\r\n\t[\"operator\", \"and\"], [\"operator\", \"as\"], [\"operator\", \"div\"],\r\n\t[\"operator\", \"exclude\"], [\"operator\", \"in\"],\r\n\t[\"operator\", \"include\"], [\"operator\", \"is\"],\r\n\t[\"operator\", \"mod\"], [\"operator\", \"not\"], [\"operator\", \"or\"],\r\n\t[\"operator\", \"shl\"], [\"operator\", \"shr\"], [\"operator\", \"xor\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/pascal/string_feature.test",
    "content": "''\r\n'fo''o'\r\n^G\r\n#7\r\n#$f4\r\n'foo'#9'bar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo''o'\"],\r\n\t[\"string\", \"^G\"],\r\n\t[\"string\", \"#7\"],\r\n\t[\"string\", \"#$f4\"],\r\n\t[\"string\", \"'foo'#9'bar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and chars."
  },
  {
    "path": "tests/languages/pascaligo/boolean_feature.test",
    "content": "True False\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"True\"], [\"boolean\", \"False\"]\n]\n\n----------------------------------------------------\n\nChecks for all booleans.\n"
  },
  {
    "path": "tests/languages/pascaligo/builtin_feature.test",
    "content": "int unit\nstring nat map\nlist record bool\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"int\"], [\"builtin\", \"unit\"],\n\t[\"builtin\", \"string\"], [\"builtin\", \"nat\"], [\"builtin\", \"map\"],\n\t[\"builtin\", \"list\"], [\"builtin\", \"record\"], [\"builtin\", \"bool\"]\n]\n\n----------------------------------------------------\n\nChecks for builtins.\n"
  },
  {
    "path": "tests/languages/pascaligo/class-name_feature.test",
    "content": "type storage is int\n\nfunction add (const store : storage; const delta : int) : storage is store + delta\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"type\"],\n\t[\"class-name\", [\n\t\t\"storage\"\n\t]],\n\t[\"keyword\", \"is\"],\n\t[\"class-name\", [\n\t\t[\"builtin\", \"int\"]\n\t]],\n\n\t[\"keyword\", \"function\"],\n\t[\"function\", \"add\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"const\"],\n\t\" store \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t\"storage\"\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"const\"],\n\t\" delta \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t[\"builtin\", \"int\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t\"storage\"\n\t]],\n\t[\"keyword\", \"is\"],\n\t\" store \",\n\t[\"operator\", \"+\"],\n\t\" delta\"\n]\n"
  },
  {
    "path": "tests/languages/pascaligo/comment_feature.test",
    "content": "(* foo *)\r\n(* foo\r\nbar *)\r\n//\r\n// foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"(* foo *)\"],\r\n\t[\"comment\", \"(* foo\\r\\nbar *)\"],\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/pascaligo/function_feature.test",
    "content": "somefunc()\nsome_func()\nsomefunc42()\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"somefunc\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"function\", \"some_func\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"function\", \"somefunc42\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for functions."
  },
  {
    "path": "tests/languages/pascaligo/keyword_feature.test",
    "content": "if while for\r\nreturn nil\r\nremove\r\nfrom else\r\nthen skip\r\nwith; is function\r\nvar\r\nconst type\r\nend begin block\r\ncase of\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"if\"], [\"keyword\", \"while\"], [\"keyword\", \"for\"],\r\n\t[\"keyword\", \"return\"], [\"keyword\", \"nil\"],\r\n\t[\"keyword\", \"remove\"],\r\n\t[\"keyword\", \"from\"], [\"keyword\", \"else\"],\r\n\t[\"keyword\", \"then\"], [\"keyword\", \"skip\"],\r\n\t[\"keyword\", \"with\"], [\"punctuation\", \";\"], [\"keyword\", \"is\"], [\"keyword\", \"function\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"const\"], [\"keyword\", \"type\"],\r\n\t[\"keyword\", \"end\"], [\"keyword\", \"begin\"], [\"keyword\", \"block\"],\r\n\t[\"keyword\", \"case\"], [\"keyword\", \"of\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/pascaligo/number_feature.test",
    "content": "42\r\n3.14159\r\n2.1e4\r\n1.0e-1\r\n3.8e+24\r\n$7aff\r\n&17\r\n%11110101\r\n\r\n123n\r\n123mtz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2.1e4\"],\r\n\t[\"number\", \"1.0e-1\"],\r\n\t[\"number\", \"3.8e+24\"],\r\n\t[\"number\", \"$7aff\"],\r\n\t[\"number\", \"&17\"],\r\n\t[\"number\", \"%11110101\"],\r\n\r\n\t[\"number\", \"123n\"],\r\n\t[\"number\", \"123mtz\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal, hexadecimal, octal and binary numbers.\r\n"
  },
  {
    "path": "tests/languages/pascaligo/operator_feature.test",
    "content": ".. ** :=\r\n< << <= > >> >=\r\n+ - * /\r\n+= -= *= /=\r\n@ ^ = =/=\r\n-> |\r\n\r\nmod and or\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"..\"], [\"operator\", \"**\"], [\"operator\", \":=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"+=\"], [\"operator\", \"-=\"], [\"operator\", \"*=\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"@\"], [\"operator\", \"^\"], [\"operator\", \"=\"], [\"operator\", \"=/=\"],\r\n\t[\"operator\", \"->\"], [\"operator\", \"|\"],\r\n\r\n\t[\"operator\", \"mod\"], [\"operator\", \"and\"], [\"operator\", \"or\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/pascaligo/string_feature.test",
    "content": "'a'\r\n'ä'\r\n'本'\r\n'\\t'\r\n'\\xff'\r\n'\\u12e4'\r\n\r\n\"日本語\"\r\n\"\\xff\\u00FF\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"'a'\"],\r\n\t[\"string\", \"'ä'\"],\r\n\t[\"string\", \"'本'\"],\r\n\t[\"string\", \"'\\\\t'\"],\r\n\t[\"string\", \"'\\\\xff'\"],\r\n\t[\"string\", \"'\\\\u12e4'\"],\r\n\r\n\r\n\t[\"string\", \"\\\"日本語\\\"\"],\r\n\t[\"string\", \"\\\"\\\\xff\\\\u00FF\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for runes and strings.\r\n"
  },
  {
    "path": "tests/languages/pcaxis/boolean_feature.test",
    "content": "YES\nNO\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"YES\"],\n\t[\"boolean\", \"NO\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans.\n"
  },
  {
    "path": "tests/languages/pcaxis/keyword_feature.test",
    "content": "FOO=0;\nFOO[en]=1;\nFOO(\"param\")=0;\nFOO(\"param1\",\"param2\")=0;\nFOO-BAR[en](\"param1\",\"param2\")=1;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", [\n\t\t[\"keyword\", \"FOO\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", [\n\t\t[\"keyword\", \"FOO\"],\n\t\t[\"language\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"property\", \"en\"],\n\t\t\t[\"punctuation\", \"]\"]\n\t\t]]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", [\n\t\t[\"keyword\", \"FOO\"],\n\t\t[\"sub-key\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"parameter\", \"\\\"param\\\"\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", [\n\t\t[\"keyword\", \"FOO\"],\n\t\t[\"sub-key\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"parameter\", \"\\\"param1\\\"\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"parameter\", \"\\\"param2\\\"\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", [\n\t\t[\"keyword\", \"FOO-BAR\"],\n\t\t[\"language\", [\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"property\", \"en\"],\n\t\t\t[\"punctuation\", \"]\"]\n\t\t]],\n\t\t[\"sub-key\", [\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t[\"parameter\", \"\\\"param1\\\"\"],\n\t\t\t[\"punctuation\", \",\"],\n\t\t\t[\"parameter\", \"\\\"param2\\\"\"],\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/pcaxis/number_feature.test",
    "content": "0\n123456789\n123.456\n0.123\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"123456789\"],\n\t[\"number\", \"123.456\"],\n\t[\"number\", \"0.123\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers.\n"
  },
  {
    "path": "tests/languages/pcaxis/string_feature.test",
    "content": "\"foo ,; ()[] bar\"\n\"\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"foo ,; ()[] bar\\\"\"],\n\t[\"string\", \"\\\"\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/pcaxis/tlist_feature.test",
    "content": "FOO=TLIST(A1),\"bar\",\"baz\";\nFOO=TLIST(A1);\nFOO=TLIST(A1,\"bar\",\"baz\");\nFOO=TLIST(A1,\"1\"-\"100\");\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", [\n\t\t[\"keyword\", \"FOO\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"tlist\", [\n\t\t[\"function\", \"TLIST\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"property\", \"A1\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"bar\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"baz\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", [\n\t\t[\"keyword\", \"FOO\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"tlist\", [\n\t\t[\"function\", \"TLIST\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"property\", \"A1\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", [\n\t\t[\"keyword\", \"FOO\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"tlist\", [\n\t\t[\"function\", \"TLIST\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"property\", \"A1\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"string\", \"\\\"bar\\\"\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"string\", \"\\\"baz\\\"\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", [\n\t\t[\"keyword\", \"FOO\"]\n\t]],\n\t[\"operator\", \"=\"],\n\t[\"tlist\", [\n\t\t[\"function\", \"TLIST\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"property\", \"A1\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"string\", \"\\\"1\\\"\"],\n\t\t[\"operator\", \"-\"],\n\t\t[\"string\", \"\\\"100\\\"\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for TLIST.\n"
  },
  {
    "path": "tests/languages/peoplecode/boolean_feature.test",
    "content": "false\ntrue\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"false\"],\n\t[\"boolean\", \"true\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans.\n"
  },
  {
    "path": "tests/languages/peoplecode/class-name_feature.test",
    "content": "class FactorialClass\n\tmethod factorial(&I as number) returns number;\nend-class;\n\nclass Fruit\n\tproperty number FruitCount;\nend-class;\n\nclass Banana extends Fruit\n\tproperty number BananaCount;\nend-class;\n\nlocal Banana &MyBanana = Create Banana();\nlocal Fruit &MyFruit = &MyBanana; /* okay, Banana is a subtype of Fruit */\nlocal number &Num = &MyBanana.BananaCount;\n\n/* generic building class */\nclass BuildingAsset\n\tmethod Acquire();\n\tmethod DisasterPrep();\nend-class;\n\nmethod Acquire\n\t%This.DisasterPrep();\nend-method;method DisasterPrep\n\tPrepareForFire();\nend-method;\n\n/* building in Vancouver */\nclass VancouverBuilding extends BuildingAssetmethod DisasterPrep();\nend-class;\n\nmethod DisasterPrep\n\tPrepareForEarthquake();%Super.DisasterPrep(); /* call superclass method */\nend-method;\n\n/* building in Edmonton */\nclass EdmontonBuilding extends BuildingAssetmethod DisasterPrep();\nend-class;\n\nmethod DisasterPrep\n\tPrepareForFreezing();%Super.DisasterPrep(); /* call superclass method */\nend-method;\n\nlocal BuildingAsset &Building = Create VancouverBuilding();\n\n&Building.Acquire(); /* calls PrepareForEarthquake then PrepareForFire */\n\n&Building = Create EdmontonBuilding();\n\n&Building.Acquire(); /* calls PrepareForFreezing then PrepareForFire */\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"FactorialClass\"]],\n\n\t[\"keyword\", \"method\"],\n\t[\"function-definition\", \"factorial\"],\n\t[\"punctuation\", \"(\"],\n\t\"&I \",\n\t[\"keyword\", \"as\"],\n\t[\"class-name\", [\"number\"]],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"returns\"],\n\t[\"class-name\", [\"number\"]],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end-class\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"Fruit\"]],\n\n\t[\"keyword\", \"property\"],\n\t[\"class-name\", [\"number\"]],\n\t\" FruitCount\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end-class\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"Banana\"]],\n\t[\"keyword\", \"extends\"],\n\t[\"class-name\", [\"Fruit\"]],\n\n\t[\"keyword\", \"property\"],\n\t[\"class-name\", [\"number\"]],\n\t\" BananaCount\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end-class\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"local\"],\n\t[\"class-name\", [\"Banana\"]],\n\t\" &MyBanana \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"Create\"],\n\t[\"class-name\", [\"Banana\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"local\"],\n\t[\"class-name\", [\"Fruit\"]],\n\t\" &MyFruit \",\n\t[\"operator\", \"=\"],\n\t\" &MyBanana\",\n\t[\"punctuation\", \";\"],\n\t[\"comment\", \"/* okay, Banana is a subtype of Fruit */\"],\n\n\t[\"keyword\", \"local\"],\n\t[\"class-name\", [\"number\"]],\n\t\" &Num \",\n\t[\"operator\", \"=\"],\n\t\" &MyBanana\",\n\t[\"punctuation\", \".\"],\n\t\"BananaCount\",\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"/* generic building class */\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"BuildingAsset\"]],\n\n\t[\"keyword\", \"method\"],\n\t[\"function-definition\", \"Acquire\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"method\"],\n\t[\"function-definition\", \"DisasterPrep\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end-class\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"method\"],\n\t[\"function-definition\", \"Acquire\"],\n\n\t[\"variable\", \"%This\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"DisasterPrep\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end-method\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"method\"],\n\t[\"function-definition\", \"DisasterPrep\"],\n\n\t[\"function\", \"PrepareForFire\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end-method\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"/* building in Vancouver */\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"VancouverBuilding\"]],\n\t[\"keyword\", \"extends\"],\n\t[\"class-name\", [\"BuildingAssetmethod\"]],\n\t[\"function\", \"DisasterPrep\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end-class\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"method\"],\n\t[\"function-definition\", \"DisasterPrep\"],\n\n\t[\"function\", \"PrepareForEarthquake\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"variable\", \"%Super\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"DisasterPrep\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"comment\", \"/* call superclass method */\"],\n\n\t[\"keyword\", \"end-method\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"/* building in Edmonton */\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"EdmontonBuilding\"]],\n\t[\"keyword\", \"extends\"],\n\t[\"class-name\", [\"BuildingAssetmethod\"]],\n\t[\"function\", \"DisasterPrep\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"end-class\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"method\"],\n\t[\"function-definition\", \"DisasterPrep\"],\n\n\t[\"function\", \"PrepareForFreezing\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"variable\", \"%Super\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"DisasterPrep\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"comment\", \"/* call superclass method */\"],\n\n\t[\"keyword\", \"end-method\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"local\"],\n\t[\"class-name\", [\"BuildingAsset\"]],\n\t\" &Building \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"Create\"],\n\t[\"class-name\", [\"VancouverBuilding\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n\\r\\n&Building\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"Acquire\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"comment\", \"/* calls PrepareForEarthquake then PrepareForFire */\"],\n\n\t\"\\r\\n\\r\\n&Building \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"Create\"],\n\t[\"class-name\", [\"EdmontonBuilding\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n\\r\\n&Building\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"Acquire\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"comment\", \"/* calls PrepareForFreezing then PrepareForFire */\"]\n]\n"
  },
  {
    "path": "tests/languages/peoplecode/comment_feature.test",
    "content": "/*\ncomment\n*/\n\nREM comment;\nREM comment\nstatement;\n\n<*\ncomment\n*>\n\n<*\n<*\ncomment\n*>\n*>\n\n/+\ncomment\n+/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"/*\\r\\ncomment\\r\\n*/\"],\n\n\t[\"comment\", \"REM comment;\"],\n\t[\"comment\", \"REM comment\\r\\nstatement;\"],\n\n\t[\"comment\", \"<*\\r\\ncomment\\r\\n*>\"],\n\n\t[\"comment\", \"<*\\r\\n<*\\r\\ncomment\\r\\n*>\\r\\n*>\"],\n\n\t[\"comment\", \"/+\\r\\ncomment\\r\\n+/\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/peoplecode/function_feature.test",
    "content": "GetCurrEffRow()\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"GetCurrEffRow\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/peoplecode/keyword_feature.test",
    "content": "abstract\nalias\nas;\ncatch;\nclass;\ncomponent;\nconstant;\ncreate;\ndeclare\nelse\nend-class\nend-evaluate\nend-for\nend-function\nend-get\nend-if\nend-method\nend-set\nend-try\nend-while\nevaluate\nextends;\nfor\nfunction\nget\nglobal;\nimplements;\nimport\ninstance;\nif\nlibrary\nlocal;\nmethod\nnull\nof;\nout\npeopleCode\nprivate\nprogram\nproperty;\nprotected\nreadonly\nref\nrepeat\nreturn\nreturns;\nset\nstep\nthen\nthrow\nto\ntry\nuntil\nvalue\nwhen\nwhen-other\nwhile\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"abstract\"],\n\t[\"keyword\", \"alias\"],\n\t[\"keyword\", \"as\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"catch\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"component\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"constant\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"create\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"declare\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"end-class\"],\n\t[\"keyword\", \"end-evaluate\"],\n\t[\"keyword\", \"end-for\"],\n\t[\"keyword\", \"end-function\"],\n\t[\"keyword\", \"end-get\"],\n\t[\"keyword\", \"end-if\"],\n\t[\"keyword\", \"end-method\"],\n\t[\"keyword\", \"end-set\"],\n\t[\"keyword\", \"end-try\"],\n\t[\"keyword\", \"end-while\"],\n\t[\"keyword\", \"evaluate\"],\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"function\"],\n\t[\"function-definition\", \"get\"],\n\t[\"keyword\", \"global\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"instance\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"library\"],\n\t[\"keyword\", \"local\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"method\"],\n\t[\"function-definition\", \"null\"],\n\t[\"keyword\", \"of\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"out\"],\n\t[\"keyword\", \"peopleCode\"],\n\t[\"keyword\", \"private\"],\n\t[\"keyword\", \"program\"],\n\t[\"keyword\", \"property\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"protected\"],\n\t[\"keyword\", \"readonly\"],\n\t[\"keyword\", \"ref\"],\n\t[\"keyword\", \"repeat\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"returns\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"set\"],\n\t[\"keyword\", \"step\"],\n\t[\"keyword\", \"then\"],\n\t[\"keyword\", \"throw\"],\n\t[\"keyword\", \"to\"],\n\t[\"keyword\", \"try\"],\n\t[\"keyword\", \"until\"],\n\t[\"keyword\", \"value\"],\n\t[\"keyword\", \"when\"],\n\t[\"keyword\", \"when-other\"],\n\t[\"keyword\", \"while\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/peoplecode/operator_feature.test",
    "content": "+ - * / **\n> >= < <= = != <>\n| @\n\nand or not\nAND OR NOT\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"**\"],\n\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<>\"],\n\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"@\"],\n\n\t[\"operator-keyword\", \"and\"],\n\t[\"operator-keyword\", \"or\"],\n\t[\"operator-keyword\", \"not\"],\n\t[\"operator-keyword\", \"AND\"],\n\t[\"operator-keyword\", \"OR\"],\n\t[\"operator-keyword\", \"NOT\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/peoplecode/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"\"\"foo\"\" \"\n\n''\n'foo'\n'''foo'\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"\\\"\\\"foo\\\"\\\" \\\"\"],\n\t[\"string\", \"''\"],\n\t[\"string\", \"'foo'\"],\n\t[\"string\", \"'''foo'\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/perl/comment_feature.test",
    "content": "=label foo\r\nbar\r\n=cut\r\n#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"=label foo\\r\\nbar\\r\\n=cut\"],\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/perl/filehandle_feature.test",
    "content": "_\r\n<>\r\n<STDIN>\r\n<FOOBAR>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filehandle\", \"_\"],\r\n\t[\"filehandle\", \"<>\"],\r\n\t[\"filehandle\", \"<STDIN>\"],\r\n\t[\"filehandle\", \"<FOOBAR>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for file handles."
  },
  {
    "path": "tests/languages/perl/function_feature.test",
    "content": "sub foo\r\nsub Foo_Bar42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"sub\"], [\"function\", \"foo\"],\r\n\t[\"keyword\", \"sub\"], [\"function\", \"Foo_Bar42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/perl/keyword_feature.test",
    "content": "any break continue\r\ndefault delete die\r\ndo else elsif eval\r\nfor foreach given\r\ngoto if last local\r\nmy next our package\r\nprint redo require\r\nreturn say state sub\r\nswitch undef unless\r\nuntil use when while\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"any\"], [\"keyword\", \"break\"], [\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"default\"], [\"keyword\", \"delete\"], [\"keyword\", \"die\"],\r\n\t[\"keyword\", \"do\"], [\"keyword\", \"else\"], [\"keyword\", \"elsif\"], [\"keyword\", \"eval\"],\r\n\t[\"keyword\", \"for\"], [\"keyword\", \"foreach\"], [\"keyword\", \"given\"],\r\n\t[\"keyword\", \"goto\"], [\"keyword\", \"if\"], [\"keyword\", \"last\"], [\"keyword\", \"local\"],\r\n\t[\"keyword\", \"my\"], [\"keyword\", \"next\"], [\"keyword\", \"our\"], [\"keyword\", \"package\"],\r\n\t[\"keyword\", \"print\"], [\"keyword\", \"redo\"], [\"keyword\", \"require\"],\r\n\t[\"keyword\", \"return\"], [\"keyword\", \"say\"], [\"keyword\", \"state\"], [\"keyword\", \"sub\"],\r\n\t[\"keyword\", \"switch\"], [\"keyword\", \"undef\"], [\"keyword\", \"unless\"],\r\n\t[\"keyword\", \"until\"], [\"keyword\", \"use\"], [\"keyword\", \"when\"], [\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/perl/number_feature.test",
    "content": "0xFF\r\n0xBad_Face\r\n\r\n0b1100\r\n0b1111_0000\r\n\r\n42\r\n42_000\r\n3.14_15_9\r\n1.2e4\r\n1_423.6E-2\r\n0.8E+12\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0xFF\"],\r\n\t[\"number\", \"0xBad_Face\"],\r\n\r\n\t[\"number\", \"0b1100\"],\r\n\t[\"number\", \"0b1111_0000\"],\r\n\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"42_000\"],\r\n\t[\"number\", \"3.14_15_9\"],\r\n\t[\"number\", \"1.2e4\"],\r\n\t[\"number\", \"1_423.6E-2\"],\r\n\t[\"number\", \"0.8E+12\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hexadecimal, binary and decimal numbers."
  },
  {
    "path": "tests/languages/perl/operator_feature.test",
    "content": "-r -w -x -o -R\r\n-W -X -O -e -z\r\n-s -f -d -l -p\r\n-S -b -c -t -u\r\n-g -k -T -B -M\r\n-A -C\r\n\r\n+ ++ +=\r\n- -- -= ->\r\n* ** *= **=\r\n1 / 2\r\n1 // 2\r\n$a /= 2\r\n$a //= 2\r\n= == =~ =>\r\n~ ~~ ~=\r\n| || |= ||=\r\n& && &= &&=\r\n< <= << <<= <=>\r\n> >= >> >>=\r\n! !~ !=\r\n% %=\r\n^ ^=\r\n. .= .. ...\r\n\\ ?\r\n\r\nlt gt le ge\r\neq ne cmp not\r\nand or xor\r\nx x=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\r\n\t[\"operator\", \"-r\"], [\"operator\", \"-w\"], [\"operator\", \"-x\"], [\"operator\", \"-o\"], [\"operator\", \"-R\"],\r\n\t[\"operator\", \"-W\"], [\"operator\", \"-X\"], [\"operator\", \"-O\"], [\"operator\", \"-e\"], [\"operator\", \"-z\"],\r\n\t[\"operator\", \"-s\"], [\"operator\", \"-f\"], [\"operator\", \"-d\"], [\"operator\", \"-l\"], [\"operator\", \"-p\"],\r\n\t[\"operator\", \"-S\"], [\"operator\", \"-b\"], [\"operator\", \"-c\"], [\"operator\", \"-t\"], [\"operator\", \"-u\"],\r\n\t[\"operator\", \"-g\"], [\"operator\", \"-k\"], [\"operator\", \"-T\"], [\"operator\", \"-B\"], [\"operator\", \"-M\"],\r\n\t[\"operator\", \"-A\"], [\"operator\", \"-C\"],\r\n\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"-=\"], [\"operator\", \"->\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"**\"], [\"operator\", \"*=\"], [\"operator\", \"**=\"],\r\n\t[\"number\", \"1\"], [\"operator\", \"/\"], [\"number\", \"2\"],\r\n\t[\"number\", \"1\"], [\"operator\", \"//\"], [\"number\", \"2\"],\r\n\t[\"variable\", \"$a\"], [\"operator\", \"/=\"], [\"number\", \"2\"],\r\n\t[\"variable\", \"$a\"], [\"operator\", \"//=\"], [\"number\", \"2\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"=~\"], [\"operator\", \"=>\"],\r\n\t[\"operator\", \"~\"], [\"operator\", \"~~\"], [\"operator\", \"~=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"], [\"operator\", \"|=\"], [\"operator\", \"||=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"&=\"], [\"operator\", \"&&=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<<\"], [\"operator\", \"<<=\"], [\"operator\", \"<=>\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \">>\"], [\"operator\", \">>=\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!~\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%=\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \".\"], [\"operator\", \".=\"], [\"operator\", \"..\"], [\"operator\", \"...\"],\r\n\t[\"operator\", \"\\\\\"], [\"operator\", \"?\"],\r\n\r\n\t[\"operator\", \"lt\"], [\"operator\", \"gt\"], [\"operator\", \"le\"], [\"operator\", \"ge\"],\r\n\t[\"operator\", \"eq\"], [\"operator\", \"ne\"], [\"operator\", \"cmp\"], [\"operator\", \"not\"],\r\n\t[\"operator\", \"and\"], [\"operator\", \"or\"], [\"operator\", \"xor\"],\r\n\t[\"operator\", \"x\"], [\"operator\", \"x=\"]\r\n\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/perl/regex_feature.test",
    "content": "m//\r\nqr!foo\\!bar!msix\r\nm,foo\r\nbar,aa\r\n\r\nqr aa\r\nm afoob\\araaa\r\nqr pfoo\r\nbarpxpn\r\n\r\nm()c\r\nqr(foo\\(\\)bar)u\r\nm(foo\r\nbar)l\r\n\r\nqr{}d\r\nm{foo\\{\\}bar}\r\nqr{foo\r\nbar}\r\n\r\nm[]\r\nqr[foo\\[\\]bar]\r\nm[foo\r\nbar]\r\n\r\nqr<>s\r\nm<foo\\<\\>bar>i\r\nqr<foo\r\nbar>x\r\n\r\ns///\r\ntr%foo\\%bar%baz%c\r\ny!foo\r\nbar!foo\r\nbaz!d\r\n\r\ns kkkmsix\r\ntr afoob\\arab\\azas\r\ny pfoo\r\nbarpfoo\r\nbazpr\r\n\r\ns()()\r\ntr(foo\\(bar)(ba\\)z)\r\ny(foo\r\nbar)(foo\r\nbaz)csr\r\n\r\ns{}{}\r\ntr{foo\\{bar}{ba\\}z}\r\ny{foo\r\nbar}{foo\r\nbaz}\r\n\r\ny[][]\r\ns[foo\\[bar][ba\\]z]u\r\ny[foo\r\nbar][foo\r\nbaz]\r\n\r\ntr<><>c\r\ny<foo\\<bar><ba\\>a>\r\ns<foo\r\nbar><foo\r\nbaz>\r\n\r\ntr()<>c\r\ny{foo\\<bar}[ba\\>a]\r\ns<foo\r\nbar>(foo\r\nbaz)\r\n\r\n//\r\n/foo/gsx\r\n/foo\\/bar/n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"regex\", \"m//\"],\r\n\t[\"regex\", \"qr!foo\\\\!bar!msix\"],\r\n\t[\"regex\", \"m,foo\\r\\nbar,aa\"],\r\n\r\n\t[\"regex\", \"qr aa\"],\r\n\t[\"regex\", \"m afoob\\\\araaa\"],\r\n\t[\"regex\", \"qr pfoo\\r\\nbarpxpn\"],\r\n\r\n\t[\"regex\", \"m()c\"],\r\n\t[\"regex\", \"qr(foo\\\\(\\\\)bar)u\"],\r\n\t[\"regex\", \"m(foo\\r\\nbar)l\"],\r\n\r\n\t[\"regex\", \"qr{}d\"],\r\n\t[\"regex\", \"m{foo\\\\{\\\\}bar}\"],\r\n\t[\"regex\", \"qr{foo\\r\\nbar}\"],\r\n\r\n\t[\"regex\", \"m[]\"],\r\n\t[\"regex\", \"qr[foo\\\\[\\\\]bar]\"],\r\n\t[\"regex\", \"m[foo\\r\\nbar]\"],\r\n\r\n\t[\"regex\", \"qr<>s\"],\r\n\t[\"regex\", \"m<foo\\\\<\\\\>bar>i\"],\r\n\t[\"regex\", \"qr<foo\\r\\nbar>x\"],\r\n\r\n\t[\"regex\", \"s///\"],\r\n\t[\"regex\", \"tr%foo\\\\%bar%baz%c\"],\r\n\t[\"regex\", \"y!foo\\r\\nbar!foo\\r\\nbaz!d\"],\r\n\r\n\t[\"regex\", \"s kkkmsix\"],\r\n\t[\"regex\", \"tr afoob\\\\arab\\\\azas\"],\r\n\t[\"regex\", \"y pfoo\\r\\nbarpfoo\\r\\nbazpr\"],\r\n\r\n\t[\"regex\", \"s()()\"],\r\n\t[\"regex\", \"tr(foo\\\\(bar)(ba\\\\)z)\"],\r\n\t[\"regex\", \"y(foo\\r\\nbar)(foo\\r\\nbaz)csr\"],\r\n\r\n\t[\"regex\", \"s{}{}\"],\r\n\t[\"regex\", \"tr{foo\\\\{bar}{ba\\\\}z}\"],\r\n\t[\"regex\", \"y{foo\\r\\nbar}{foo\\r\\nbaz}\"],\r\n\r\n\t[\"regex\", \"y[][]\"],\r\n\t[\"regex\", \"s[foo\\\\[bar][ba\\\\]z]u\"],\r\n\t[\"regex\", \"y[foo\\r\\nbar][foo\\r\\nbaz]\"],\r\n\r\n\t[\"regex\", \"tr<><>c\"],\r\n\t[\"regex\", \"y<foo\\\\<bar><ba\\\\>a>\"],\r\n\t[\"regex\", \"s<foo\\r\\nbar><foo\\r\\nbaz>\"],\r\n\r\n\t[\"regex\", \"tr()<>c\"],\r\n\t[\"regex\", \"y{foo\\\\<bar}[ba\\\\>a]\"],\r\n\t[\"regex\", \"s<foo\\r\\nbar>(foo\\r\\nbaz)\"],\r\n\r\n\t[\"regex\", \"//\"],\r\n\t[\"regex\", \"/foo/gsx\"],\r\n\t[\"regex\", \"/foo\\\\/bar/n\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for regex and regex quote-like operators.\r\n"
  },
  {
    "path": "tests/languages/perl/string_feature.test",
    "content": "q//\r\nq/foobar/\r\nq/foo\\/bar/\r\nq/foo\r\nbar/\r\n\r\nqq!!\r\nqq!foobar!\r\nqq!foo\\!bar!\r\nqq!foo\r\nbar!\r\n\r\nqw__\r\nqx_foobar_\r\nqx_foo\\_bar_\r\nqw_foo\r\nbar_\r\n\r\nqw??\r\nqw?foobar?\r\nqw?foo\\?bar?\r\nqw?foo\r\nbar?\r\n\r\nq aa\r\nq afoob\\ara\r\nq 4foobar4\r\nq pfoo\r\nbarp\r\n\r\nqq()\r\nqq(foobar)\r\nqq(foo\\(\\)bar)\r\nqq(foo\r\nbar)\r\n\r\nqx{}\r\nqx{foobar}\r\nqx{foo\\{\\}bar}\r\nqx{foo\r\nbar}\r\n\r\nqw[]\r\nqw[foobar]\r\nqw[foo\\[\\]bar]\r\nqw[foo\r\nbar]\r\n\r\nq<>\r\nq<foobar>\r\nq<foo\\<\\>bar>\r\nq<foo\r\nbar>\r\n\r\n\"\"\r\n\"foo\\\"bar\"\r\n\"foo\r\nbar\"\r\n\r\n''\r\n'foo\\'bar'\r\n\r\n``\r\n`foo\\`bar`\r\n`foo\r\nbar`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"q//\"],\r\n\t[\"string\", \"q/foobar/\"],\r\n\t[\"string\", \"q/foo\\\\/bar/\"],\r\n\t[\"string\", \"q/foo\\r\\nbar/\"],\r\n\r\n\t[\"string\", \"qq!!\"],\r\n\t[\"string\", \"qq!foobar!\"],\r\n\t[\"string\", \"qq!foo\\\\!bar!\"],\r\n\t[\"string\", \"qq!foo\\r\\nbar!\"],\r\n\r\n\t[\"string\", \"qw__\"],\r\n\t[\"string\", \"qx_foobar_\"],\r\n\t[\"string\", \"qx_foo\\\\_bar_\"],\r\n\t[\"string\", \"qw_foo\\r\\nbar_\"],\r\n\r\n\t[\"string\", \"qw??\"],\r\n\t[\"string\", \"qw?foobar?\"],\r\n\t[\"string\", \"qw?foo\\\\?bar?\"],\r\n\t[\"string\", \"qw?foo\\r\\nbar?\"],\r\n\r\n\t[\"string\", \"q aa\"],\r\n\t[\"string\", \"q afoob\\\\ara\"],\r\n\t[\"string\", \"q 4foobar4\"],\r\n\t[\"string\", \"q pfoo\\r\\nbarp\"],\r\n\r\n\t[\"string\", \"qq()\"],\r\n\t[\"string\", \"qq(foobar)\"],\r\n\t[\"string\", \"qq(foo\\\\(\\\\)bar)\"],\r\n\t[\"string\", \"qq(foo\\r\\nbar)\"],\r\n\r\n\t[\"string\", \"qx{}\"],\r\n\t[\"string\", \"qx{foobar}\"],\r\n\t[\"string\", \"qx{foo\\\\{\\\\}bar}\"],\r\n\t[\"string\", \"qx{foo\\r\\nbar}\"],\r\n\r\n\t[\"string\", \"qw[]\"],\r\n\t[\"string\", \"qw[foobar]\"],\r\n\t[\"string\", \"qw[foo\\\\[\\\\]bar]\"],\r\n\t[\"string\", \"qw[foo\\r\\nbar]\"],\r\n\r\n\t[\"string\", \"q<>\"],\r\n\t[\"string\", \"q<foobar>\"],\r\n\t[\"string\", \"q<foo\\\\<\\\\>bar>\"],\r\n\t[\"string\", \"q<foo\\r\\nbar>\"],\r\n\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\\\\\"bar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"],\r\n\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'foo\\\\'bar'\"],\r\n\r\n\t[\"string\", \"``\"],\r\n\t[\"string\", \"`foo\\\\`bar`\"],\r\n\t[\"string\", \"`foo\\r\\nbar`\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and quote operators."
  },
  {
    "path": "tests/languages/perl/v-string_feature.test",
    "content": "v1.2\n1.2.3\n\n----------------------------------------------------\n\n[\n\t[\"v-string\", \"v1.2\"],\n\t[\"v-string\", \"1.2.3\"]\n]\n\n----------------------------------------------------\n\nChecks for v-strings.\n"
  },
  {
    "path": "tests/languages/perl/variable_feature.test",
    "content": "$foo\r\n$#foo\r\n\r\n${^POSTMATCH}\r\n\r\n${...}\r\n\r\n$^V\r\n\r\n@1\r\n$42\r\n\r\n$$\r\n$_\r\n%!\r\n\r\n%'foo\r\n$foo'bar\r\n\r\n$::::'foo\r\n$foo::'bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"variable\", \"$#foo\"],\r\n\r\n\t[\"variable\", \"${^POSTMATCH}\"],\r\n\r\n\t[\"variable\", \"$\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"operator\", \"...\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"variable\", \"$^V\"],\r\n\r\n\t[\"variable\", \"@1\"],\r\n\t[\"variable\", \"$42\"],\r\n\r\n\t[\"variable\", \"$$\"],\r\n\t[\"variable\", \"$_\"],\r\n\t[\"variable\", \"%!\"],\r\n\r\n\t[\"variable\", \"%'foo\"],\r\n\t[\"variable\", \"$foo'bar\"],\r\n\r\n\t[\"variable\", \"$::::'foo\"],\r\n\t[\"variable\", \"$foo::'bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables.\r\n"
  },
  {
    "path": "tests/languages/php/argument-name_feature.test",
    "content": "foo(\r\n    a: 'bar',\r\n    qux: 'baz'\r\n);\r\n\r\nfoo(a: 'bar', qux: 'baz' );\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", [\"foo\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"argument-name\", \"a\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"string\", \"'bar'\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"argument-name\", \"qux\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"string\", \"'baz'\"],\r\n\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\r\n\t[\"function\", [\"foo\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"argument-name\", \"a\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"string\", \"'bar'\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"argument-name\", \"qux\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"string\", \"'baz'\"],\r\n\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for named arguments.\r\n"
  },
  {
    "path": "tests/languages/php/array_feature.test",
    "content": "$a = [\r\n\t1 => [0, 1],\r\n\t2 => [2, 3],\r\n\t3 => [\r\n\t\t[0, 1],\r\n\t\t[2, 3]\r\n\t]\r\n];\r\n\r\n$b = array(\r\n\tArray(1, 2)\r\n);\r\n\r\n$c = [...$a, ...$b, [5, 6]];\r\n\r\n$d = [0, 1] + [2];\r\n\r\n[$e] = [2, 3];\r\n\r\n$f[] = 3;\r\n\r\n$g['key'] = 3;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$a\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"variable\", \"$b\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"array\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"Array\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"variable\", \"$c\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"operator\", \"...\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"operator\", \"...\"],\r\n\t[\"variable\", \"$b\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"5\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"6\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"variable\", \"$d\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"variable\", \"$e\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"variable\", \"$f\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"variable\", \"$g\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"'key'\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for arrays."
  },
  {
    "path": "tests/languages/php/attribute_feature.test",
    "content": "// #[Foo]\r\n\r\n#[]\r\n\r\n#[\r\n\t// something ]\r\n\tFoo,\r\n\t/* something\r\n\telse #[] */\r\n\tBar\r\n\t# shell comments aren't confusing at all in here\r\n]\r\n\r\n#[Foo([0, 1])]\r\n\r\n#[\r\n\tFoo(\r\n\t\t[\r\n\t\t\t1 => [0, 1],\r\n\t\t\t2 => [2, 3],\r\n\t\t\t3 => [\r\n\t\t\t\t[0, 1],\r\n\t\t\t\t[2, 3]\r\n\t\t\t]\r\n\t\t]\r\n\t)\r\n]\r\n\r\n#[Foo]\r\n#[Foo\\Bar\\Baz]\r\n#[Route(Http::POST, '/products/create', 1)]\r\n#[\r\n\tHttp\\Route(Http::POST, '/products/create', 1),\r\n\tFoo\\Bar\\Baz,\r\n\tAttributeFoo('value')\r\n]\r\n\r\n#[A1(1), A1(2), A2(3)]\r\nclass Foo {\r\n\tpublic function foo(#[A1(5)] $a, #[A1(6)] $b) { }\r\n}\r\n\r\n$object = new #[A1(7)] class () {};\r\n\r\nfunction foo(\r\n    #[Attribute] $param1,\r\n    $param2\r\n) {}\r\n\r\n$f1 = #[ExampleAttribute] function () {};\r\n\r\n$ref = new \\ReflectionFunction(#[A1] #[A2] function () { });\r\n\r\n#[DeprecationReason('reason: <https://some-website/reason?>')]\r\nfunction main() {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// #[Foo]\"],\r\n\r\n\t\"\\r\\n\\r\\n#\", [\"punctuation\", \"[\"], [\"punctuation\", \"]\"],\r\n\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"comment\", \"// something ]\"],\r\n\t\t\t[\"attribute-class-name\", \"Foo\"], [\"punctuation\", \",\"],\r\n\t\t\t[\"comment\", \"/* something\\r\\n\\telse #[] */\"],\r\n\t\t\t[\"attribute-class-name\", \"Bar\"],\r\n\t\t\t[\"comment\", \"# shell comments aren't confusing at all in here\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"Foo\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"0\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"Foo\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"0\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"number\", \"2\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"2\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"3\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"number\", \"3\"],\r\n\t\t\t[\"operator\", \"=>\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"0\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"2\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"3\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"Foo\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", [\r\n\t\t\t\t\"Foo\",\r\n\t\t\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\t\t\"Bar\",\r\n\t\t\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\t\t\"Baz\"\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"Route\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"attribute-class-name\", \"Http\"],\r\n\t\t\t[\"operator\", \"::\"],\r\n\t\t\t[\"constant\", \"POST\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"'/products/create'\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", [\r\n\t\t\t\t\"Http\",\r\n\t\t\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\t\t\"Route\"\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"attribute-class-name\", \"Http\"],\r\n\t\t\t[\"operator\", \"::\"],\r\n\t\t\t[\"constant\", \"POST\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"'/products/create'\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"attribute-class-name\", [\r\n\t\t\t\t\"Foo\",\r\n\t\t\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\t\t\"Bar\",\r\n\t\t\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\t\t\"Baz\"\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"attribute-class-name\", \"AttributeFoo\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"'value'\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"A1\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"attribute-class-name\", \"A1\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"2\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"attribute-class-name\", \"A2\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"3\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name-definition\", \"Foo\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"A1\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"5\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"A1\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"6\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\t[\"variable\", \"$b\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"variable\", \"$object\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"A1\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"7\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"Attribute\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\t[\"variable\", \"$param1\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"variable\", \"$param2\"],\r\n\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"variable\", \"$f1\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"ExampleAttribute\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"variable\", \"$ref\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"ReflectionFunction\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"A1\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"A2\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"attribute\", [\r\n\t\t[\"delimiter\", \"#[\"],\r\n\t\t[\"attribute-content\", [\r\n\t\t\t[\"attribute-class-name\", \"DeprecationReason\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"'reason: <https://some-website/reason?>'\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"]\"]\r\n\t]],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"main\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for attributes.\r\n"
  },
  {
    "path": "tests/languages/php/boolean_feature.test",
    "content": "FALSE\r\nfalse\r\nTRUE\r\ntrue\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"FALSE\"],\r\n\t[\"constant\", \"false\"],\r\n\t[\"constant\", \"TRUE\"],\r\n\t[\"constant\", \"true\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/php/class-name_feature.test",
    "content": "public Foo $a;\r\n\r\nFoo::bar();\r\n\r\n\\Foo::bar();\r\n\r\n\\Package\\Foo::bar();\r\n\r\nfunction f(Foo $variable): Foo {}\r\n\r\nfunction f(\\Foo $variable): \\Foo {}\r\n\r\nfunction f(\\Package\\Foo $variable): \\Package\\Foo {}\r\n\r\nfunction f($variable): ?Foo {}\r\n\r\nfunction f(Foo|Bar $variable): Foo|Bar {}\r\n\r\nfunction f(Foo|false $variable): Foo|Bar {}\r\nfunction f(Foo|null $variable): Foo|Bar {}\r\n\r\nfunction f(\\Package\\Foo|\\Package\\Bar $variable): \\Package\\Foo|\\Package\\Bar {}\r\n\r\nclass Foo extends Bar implements Baz {}\r\n\r\nclass Foo extends \\Package\\Bar implements App\\Baz {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"public\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"function\", [\"bar\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"operator\", \"::\"],\r\n\t[\"function\", [\"bar\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Package\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"operator\", \"::\"],\r\n\t[\"function\", [\"bar\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Package\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Package\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"class-name\", \"Bar\"],\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"class-name\", \"Bar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"keyword\", \"false\"],\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"class-name\", \"Bar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"class-name\", \"Bar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Package\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"operator\", \"|\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Package\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Bar\"\r\n\t]],\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Package\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"operator\", \"|\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Package\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Bar\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name-definition\", \"Foo\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", \"Bar\"],\r\n\t[\"keyword\", \"implements\"],\r\n\t[\"class-name\", \"Baz\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name-definition\", \"Foo\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Package\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Bar\"\r\n\t]],\r\n\t[\"keyword\", \"implements\"],\r\n\t[\"class-name\", [\r\n\t\t\"App\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"Baz\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names.\r\n"
  },
  {
    "path": "tests/languages/php/comment_feature.test",
    "content": "//\r\n// foobar\r\n/* foo\r\nbar */\r\n/* <me@example.com> */\r\n/**/\r\n/** doc comment */\r\n#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foobar\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"/* <me@example.com> */\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"doc-comment\", \"/** doc comment */\"],\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments.\r\n"
  },
  {
    "path": "tests/languages/php/constant_feature.test",
    "content": "null\r\n_\r\nX\r\nAZ\r\nPRISM\r\nFOOBAR_42\r\n\r\nclass Foo{\r\n\tconst BAR = 1;\r\n\tconst baz = 2;\r\n}\r\n\r\nFoo::BAR;\r\nFoo::baz;\r\n\r\n\r\nswitch ($i) {\r\n\tcase NULL:\r\n\t\tbreak;\r\n\tcase X:\r\n\t\tbreak;\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"null\"],\r\n\t[\"constant\", \"_\"],\r\n\t[\"constant\", \"X\"],\r\n\t[\"constant\", \"AZ\"],\r\n\t[\"constant\", \"PRISM\"],\r\n\t[\"constant\", \"FOOBAR_42\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name-definition\", \"Foo\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"constant\", \"BAR\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"constant\", \"baz\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"class-name\", \"Foo\"], [\"operator\", \"::\"], [\"constant\", \"BAR\"], [\"punctuation\", \";\"],\r\n\t[\"class-name\", \"Foo\"], [\"operator\", \"::\"], [\"constant\", \"baz\"], [\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"$i\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"constant\", \"NULL\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"constant\", \"X\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"]\r\n\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants."
  },
  {
    "path": "tests/languages/php/delimiter_feature.test",
    "content": "<? ?>\r\n<?php ?>\r\n<?= // ?>\r\n\r\n<?php\r\n#[DeprecationReason('reason: <https://some-website/reason?>')]\r\nfunction main() {}\r\n// php is not ended yet\r\n?>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?\"],\r\n\t\t[\"delimiter\", \"?>\"]\r\n\t]],\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?php\"],\r\n\t\t[\"delimiter\", \"?>\"]\r\n\t]],\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?=\"],\r\n\t\t[\"comment\", \"// \"],\r\n\t\t[\"delimiter\", \"?>\"]\r\n\t]],\r\n\r\n\t[\"php\", [\r\n\t\t[\"delimiter\", \"<?php\"],\r\n\r\n\t\t[\"attribute\", [\r\n\t\t\t[\"delimiter\", \"#[\"],\r\n\t\t\t[\"attribute-content\", [\r\n\t\t\t\t[\"attribute-class-name\", \"DeprecationReason\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"string\", \"'reason: <https://some-website/reason?>'\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"]\"]\r\n\t\t]],\r\n\r\n\t\t[\"keyword\", \"function\"],\r\n\t\t[\"function-definition\", \"main\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"punctuation\", \"}\"],\r\n\r\n\t\t[\"comment\", \"// php is not ended yet\"],\r\n\r\n\t\t[\"delimiter\", \"?>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for delimiters.\r\n"
  },
  {
    "path": "tests/languages/php/enum_feature.test",
    "content": "enum Foo implements Bar {}\r\n\r\nenum Suit {\r\n\tcase Hearts;\r\n\tcase Diamonds = 'D';\r\n}\r\n\r\n$val = Suit::Diamonds;\r\n\r\nSuit::Spades->name;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"class-name-definition\", \"Foo\"],\r\n\t[\"keyword\", \"implements\"],\r\n\t[\"class-name\", \"Bar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"class-name-definition\", \"Suit\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"constant\", \"Hearts\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"constant\", \"Diamonds\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"'D'\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"variable\", \"$val\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"class-name\", \"Suit\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"constant\", \"Diamonds\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"class-name\", \"Suit\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"constant\", \"Spades\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"property\", \"name\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for enums.\r\n"
  },
  {
    "path": "tests/languages/php/function_feature.test",
    "content": "class A {\r\n  function __call() {}\r\n}\r\n\r\n$a = new A();\r\n$a->if(); // it's allowed to call a magic method with keyword since forever in PHP\r\n\r\nclass A {\r\n  function if() {} // error before 7.0, allowed now\r\n}\r\n\r\n$variable->foreach(); // this \"foreach\" is a method\r\n$variable->method();  // this is also a method\r\n$var->match()\r\n\r\nforeach ($list as $value) { // this \"foreach\" is a keyword\r\n}\r\n\r\nTest::foreach(); // this is \"foreach\" static method\r\nTest::method();  // this is \"method\" static method\r\n\r\n// The only exception: class\r\n$variable->class(); // this \"class\" should be interpreted as \"keyword\"\r\nTest::class; // This \"class\" should still be a keyword\r\n\r\nmb_string(); // call to a global function\r\n\\mb_string(); // namespace \\ is global\r\n\\a\\b\\c\\mb_string(); // function in \\a\\b\\c namespace\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name-definition\", \"A\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"__call\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"variable\", \"$a\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"class-name\", \"A\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"variable\", \"$a\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"function\", [\"if\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"// it's allowed to call a magic method with keyword since forever in PHP\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name-definition\", \"A\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"comment\", \"// error before 7.0, allowed now\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"function\", [\"foreach\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"// this \\\"foreach\\\" is a method\"],\r\n\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"function\", [\"method\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"// this is also a method\"],\r\n\r\n\t[\"variable\", \"$var\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"function\", [\"match\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"$list\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"variable\", \"$value\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"comment\", \"// this \\\"foreach\\\" is a keyword\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"class-name\", \"Test\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"function\", [\"foreach\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"// this is \\\"foreach\\\" static method\"],\r\n\r\n\t[\"class-name\", \"Test\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"function\", [\"method\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"// this is \\\"method\\\" static method\"],\r\n\r\n\t[\"comment\", \"// The only exception: class\"],\r\n\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"// this \\\"class\\\" should be interpreted as \\\"keyword\\\"\"],\r\n\r\n\t[\"class-name\", \"Test\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"// This \\\"class\\\" should still be a keyword\"],\r\n\r\n\t[\"function\", [\"mb_string\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"// call to a global function\"],\r\n\r\n\t[\"function\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"mb_string\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"// namespace \\\\ is global\"],\r\n\r\n\t[\"function\", [\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"a\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"b\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"c\",\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\"mb_string\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"// function in \\\\a\\\\b\\\\c namespace\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/php/issue2156.test",
    "content": "<?\n\t// Session starten und confog.php includen\n\tsession_start();\n\tinclude (\"config.php\");\n\n\t// CaptchaCodes abfragen\n\t$CAPTCHA_RandomText = \"\";\n\tif (isset($_POST['txtCode'])){\n\t$CAPTCHA_EnteredText = str_replace(\"<\",\"\",str_replace(\">\",\"\",str_replace(\"'\",\"\",str_replace(\"[\",\"\",str_replace(\"]\",\"\",$_POST['txtCode'])))));\n\t}\n\tif (isset($_SESSION['CAPTCHA_RndText'])) {\n\t$CAPTCHA_RandomText = $_SESSION['CAPTCHA_RndText'];\n\t}\n\n\t// Eingabefelder abfragen\n\t$_SESSION['company'] = $_POST['company'];\n\t$_SESSION['name'] = $_POST['name'];\n\t$_SESSION['address'] = $_POST['address'];\n\t$_SESSION['zip_code'] = $_POST['zip_code'];\n\t$_SESSION['city'] = $_POST['city'];\n\t$_SESSION['county'] = $_POST['county'];\n\t$_SESSION['country'] = $_POST['country'];\n\t$_SESSION['phone'] = $_POST['phone'];\n\t$_SESSION['fax'] = $_POST['fax'];\n\t$_SESSION['email'] = $_POST['email'];\n\t$_SESSION['nachricht'] = $_POST['nachricht'];\n\n\t$email_i = $_SESSION['email'];\n\n\t// Email Funktion\n\tfunction pruefe_mail($email_i) {\n\t\t  if(strstr($email_i, \"@\")) {\n\t\t\t$email_i = explode (\"@\", $email_i);\n\t\t\tif(strstr($email_i[1], \".\")) $ok = TRUE;\n\t\t  }\n\t\t  return $ok;\n\t\t}\n\n\t// Eingaben prüfen\n\t$fehler = \"\";\n\tif(!pruefe_mail($email_i) && !empty($email_i)) {\n\t\t\t$fehler .= \"<li>email</li>\";\n\t\t\t}\n\t\t\tif ($_SESSION['name'] == \"\"){\n\t\t\t$fehler .= \"<li>name</li>\";\n\t\t\t}\n\t\t\tif ($_SESSION['city'] == \"\"){\n\t\t\t$fehler .= \"<li>city</li>\";\n\t\t\t}\n\t\t\tif ($_SESSION['country'] == \"\"){\n\t\t\t$fehler .= \"<li>country</li>\";\n\t\t\t}\n\t\t\tif ($_SESSION['phone'] == \"\"){\n\t\t\t$fehler .= \"<li>phone</li>\";\n\t\t\t}\n\t\t\tif ($_SESSION['email'] == \"\"){\n\t\t\t$fehler .= \"<li>email</li>\";\n\t\t\t}\n\t\t\tif ($_SESSION['message'] == \"\"){\n\t\t\t$fehler .= \"<li>message</li>\";\n\t\t\t}\n\t\t\tif ($CAPTCHA_EnteredText == $CAPTCHA_RandomText and isset($_POST['txtCode']) == true and isset($_SESSION['CAPTCHA_RndText'])){\n\t\t\t$captcha = true;\n\t\t\t} else {\n\t\t\t$fehler .= \"<li>code</li>\";\n\t\t\t}\n\techo '<div>';\n\tif ($fehler == \"\"){\n\t// Email zumsammensetzen\n\t$email = \"From: \" . $_SESSION['email'];\n\n\n\t$nachrichtfertig =\n\t\"Company: \" . $_SESSION['company'] \"n\\\"\n\t\"Name: \" $_SESSION['name'] \"n\\\"\n\t\"Address: \" $_SESSION['address'] \"n\\\"\n\t\"ZIP Code: \" $_SESSION['zip_code'] \"n\\\"\n\t\"City: \" $_SESSION['city'] \"n\\\"\n\t\"County: \" $_SESSION['county'] \"n\\\"\n\t\"Country: \" $_SESSION['country'] \"n\\\"\n\t\"Phone: \" $_SESSION['phone'] \"n\\\"\n\t\"Fax: \" $_SESSION['fax'] \"n\\\"\n\t\"eMail: \" $_SESSION['email'] \"n\\n\\\"\n\t\"Message: \" $_SESSION['message'];\n\n\n\t$versand = mail($empfaenger, $betreff, $nachrichtfertig, $email);\n\t\t\tif ($versand) {\n\t\t\techo '<p class=titles>Thank you very much!</p>\n\t\t\t\t  <p>The message were send successfully</p>';\n\n\t\t\t// Sessionvariablen löschen\n\t\t\tunset($_SESSION['company']);\n\t\t\tunset($_SESSION['name']);\n\t\t\tunset($_SESSION['address']);\n\t\t\tunset($_SESSION['zip_code']);\n\t\t\tunset($_SESSION['city']);\n\t\t\tunset($_SESSION['county']);\n\t\t\tunset($_SESSION['country']);\n\t\t\tunset($_SESSION['phone']);\n\t\t\tunset($_SESSION['fax']);\n\t\t\tunset($_SESSION['email']);\n\t\t\tunset($_SESSION['nachricht']);\n\t\t\t}\n\n\t} else {\n\techo '<p class=titles>Error</p>';\n\techo '<p>Please fill in all the $fehler field. <a href=\"contact.php\">back</a></p>';\n\t}\n\techo '</div>';\n\n\t// Session unset\n\tunset($_SESSION['CAPTCHA_RndText']);\n\n?>\n\n----------------------------------------------------\n\n[\n\t[\"prolog\", \"<?\\r\\n\\t// Session starten und confog.php includen\\r\\n\\tsession_start();\\r\\n\\tinclude (\\\"config.php\\\");\\r\\n\\r\\n\\t// CaptchaCodes abfragen\\r\\n\\t$CAPTCHA_RandomText = \\\"\\\";\\r\\n\\tif (isset($_POST['txtCode'])){\\r\\n\\t$CAPTCHA_EnteredText = str_replace(\\\"<\\\",\\\"\\\",str_replace(\\\">\\\",\\\"\\\",str_replace(\\\"'\\\",\\\"\\\",str_replace(\\\"[\\\",\\\"\\\",str_replace(\\\"]\\\",\\\"\\\",$_POST['txtCode'])))));\\r\\n\\t}\\r\\n\\tif (isset($_SESSION['CAPTCHA_RndText'])) {\\r\\n\\t$CAPTCHA_RandomText = $_SESSION['CAPTCHA_RndText'];\\r\\n\\t}\\r\\n\\r\\n\\t// Eingabefelder abfragen\\r\\n\\t$_SESSION['company'] = $_POST['company'];\\r\\n\\t$_SESSION['name'] = $_POST['name'];\\r\\n\\t$_SESSION['address'] = $_POST['address'];\\r\\n\\t$_SESSION['zip_code'] = $_POST['zip_code'];\\r\\n\\t$_SESSION['city'] = $_POST['city'];\\r\\n\\t$_SESSION['county'] = $_POST['county'];\\r\\n\\t$_SESSION['country'] = $_POST['country'];\\r\\n\\t$_SESSION['phone'] = $_POST['phone'];\\r\\n\\t$_SESSION['fax'] = $_POST['fax'];\\r\\n\\t$_SESSION['email'] = $_POST['email'];\\r\\n\\t$_SESSION['nachricht'] = $_POST['nachricht'];\\r\\n\\r\\n\\t$email_i = $_SESSION['email'];\\r\\n\\r\\n\\t// Email Funktion\\r\\n\\tfunction pruefe_mail($email_i) {\\r\\n\\t\\t  if(strstr($email_i, \\\"@\\\")) {\\r\\n\\t\\t\\t$email_i = explode (\\\"@\\\", $email_i);\\r\\n\\t\\t\\tif(strstr($email_i[1], \\\".\\\")) $ok = TRUE;\\r\\n\\t\\t  }\\r\\n\\t\\t  return $ok;\\r\\n\\t\\t}\\r\\n\\r\\n\\t// Eingaben prüfen\\r\\n\\t$fehler = \\\"\\\";\\r\\n\\tif(!pruefe_mail($email_i) && !empty($email_i)) {\\r\\n\\t\\t\\t$fehler .= \\\"<li>email</li>\\\";\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tif ($_SESSION['name'] == \\\"\\\"){\\r\\n\\t\\t\\t$fehler .= \\\"<li>name</li>\\\";\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tif ($_SESSION['city'] == \\\"\\\"){\\r\\n\\t\\t\\t$fehler .= \\\"<li>city</li>\\\";\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tif ($_SESSION['country'] == \\\"\\\"){\\r\\n\\t\\t\\t$fehler .= \\\"<li>country</li>\\\";\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tif ($_SESSION['phone'] == \\\"\\\"){\\r\\n\\t\\t\\t$fehler .= \\\"<li>phone</li>\\\";\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tif ($_SESSION['email'] == \\\"\\\"){\\r\\n\\t\\t\\t$fehler .= \\\"<li>email</li>\\\";\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tif ($_SESSION['message'] == \\\"\\\"){\\r\\n\\t\\t\\t$fehler .= \\\"<li>message</li>\\\";\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tif ($CAPTCHA_EnteredText == $CAPTCHA_RandomText and isset($_POST['txtCode']) == true and isset($_SESSION['CAPTCHA_RndText'])){\\r\\n\\t\\t\\t$captcha = true;\\r\\n\\t\\t\\t} else {\\r\\n\\t\\t\\t$fehler .= \\\"<li>code</li>\\\";\\r\\n\\t\\t\\t}\\r\\n\\techo '<div>';\\r\\n\\tif ($fehler == \\\"\\\"){\\r\\n\\t// Email zumsammensetzen\\r\\n\\t$email = \\\"From: \\\" . $_SESSION['email'];\\r\\n\\r\\n\\r\\n\\t$nachrichtfertig =\\r\\n\\t\\\"Company: \\\" . $_SESSION['company'] \\\"n\\\\\\\"\\r\\n\\t\\\"Name: \\\" $_SESSION['name'] \\\"n\\\\\\\"\\r\\n\\t\\\"Address: \\\" $_SESSION['address'] \\\"n\\\\\\\"\\r\\n\\t\\\"ZIP Code: \\\" $_SESSION['zip_code'] \\\"n\\\\\\\"\\r\\n\\t\\\"City: \\\" $_SESSION['city'] \\\"n\\\\\\\"\\r\\n\\t\\\"County: \\\" $_SESSION['county'] \\\"n\\\\\\\"\\r\\n\\t\\\"Country: \\\" $_SESSION['country'] \\\"n\\\\\\\"\\r\\n\\t\\\"Phone: \\\" $_SESSION['phone'] \\\"n\\\\\\\"\\r\\n\\t\\\"Fax: \\\" $_SESSION['fax'] \\\"n\\\\\\\"\\r\\n\\t\\\"eMail: \\\" $_SESSION['email'] \\\"n\\\\n\\\\\\\"\\r\\n\\t\\\"Message: \\\" $_SESSION['message'];\\r\\n\\r\\n\\r\\n\\t$versand = mail($empfaenger, $betreff, $nachrichtfertig, $email);\\r\\n\\t\\t\\tif ($versand) {\\r\\n\\t\\t\\techo '<p class=titles>Thank you very much!</p>\\r\\n\\t\\t\\t\\t  <p>The message were send successfully</p>';\\r\\n\\r\\n\\t\\t\\t// Sessionvariablen löschen\\r\\n\\t\\t\\tunset($_SESSION['company']);\\r\\n\\t\\t\\tunset($_SESSION['name']);\\r\\n\\t\\t\\tunset($_SESSION['address']);\\r\\n\\t\\t\\tunset($_SESSION['zip_code']);\\r\\n\\t\\t\\tunset($_SESSION['city']);\\r\\n\\t\\t\\tunset($_SESSION['county']);\\r\\n\\t\\t\\tunset($_SESSION['country']);\\r\\n\\t\\t\\tunset($_SESSION['phone']);\\r\\n\\t\\t\\tunset($_SESSION['fax']);\\r\\n\\t\\t\\tunset($_SESSION['email']);\\r\\n\\t\\t\\tunset($_SESSION['nachricht']);\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t} else {\\r\\n\\techo '<p class=titles>Error</p>';\\r\\n\\techo '<p>Please fill in all the $fehler field. <a href=\\\"contact.php\\\">back</a></p>';\\r\\n\\t}\\r\\n\\techo '</div>';\\r\\n\\r\\n\\t// Session unset\\r\\n\\tunset($_SESSION['CAPTCHA_RndText']);\\r\\n\\r\\n?>\"]\n]\n\n----------------------------------------------------\n\nChecks for issue #2156.\n"
  },
  {
    "path": "tests/languages/php/issue2614.test",
    "content": "class First {}\r\nclass Second {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name-definition\", \"First\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name-definition\", \"Second\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n\r\n----------------------------------------------------\r\n\r\nChecks for issue #2614."
  },
  {
    "path": "tests/languages/php/keyword_feature.test",
    "content": "__halt_compiler\r\nabstract\r\nand\r\narray()\r\nas\r\nbreak\r\ncallable\r\ncase\r\ncatch\r\nclass;\r\nclone\r\nconst\r\ncontinue\r\ndeclare\r\ndefault\r\ndie\r\ndo\r\necho\r\nelse\r\nelseif\r\nempty\r\nenddeclare\r\nendfor\r\nendforeach\r\nendif\r\nendswitch\r\nendwhile\r\neval\r\nexit\r\nextends;\r\nfinal\r\nfinally\r\nfn\r\nfor\r\nforeach\r\nfunction\r\nglobal\r\ngoto\r\nif\r\nimplements;\r\ninclude\r\ninclude_once\r\ninstanceof;\r\ninsteadof\r\ninterface;\r\nisset\r\nlist\r\nnamespace;\r\nmatch\r\nnever\r\nnew;\r\nor\r\nparent\r\nparent::;\r\nprint\r\nprivate\r\nprotected\r\npublic\r\nreadonly\r\nrequire\r\nrequire_once\r\nreturn\r\nself\r\nnew self\r\nself::;\r\nstatic\r\nstatic::;\r\nswitch\r\nthrow\r\ntrait;\r\ntry\r\nunset\r\nuse;\r\nvar\r\nvoid\r\nwhile\r\nxor\r\nyield\r\nyield from\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"__halt_compiler\"],\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"and\"],\r\n\t[\"keyword\", \"array\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"callable\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"clone\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"declare\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"die\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"echo\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"elseif\"],\r\n\t[\"keyword\", \"empty\"],\r\n\t[\"keyword\", \"enddeclare\"],\r\n\t[\"keyword\", \"endfor\"],\r\n\t[\"keyword\", \"endforeach\"],\r\n\t[\"keyword\", \"endif\"],\r\n\t[\"keyword\", \"endswitch\"],\r\n\t[\"keyword\", \"endwhile\"],\r\n\t[\"keyword\", \"eval\"],\r\n\t[\"keyword\", \"exit\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"global\"],\r\n\t[\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"include_once\"],\r\n\t[\"keyword\", \"instanceof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"insteadof\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"isset\"],\r\n\t[\"keyword\", \"list\"],\r\n\t[\"keyword\", \"namespace\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"match\"],\r\n\t[\"keyword\", \"never\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"parent\"],\r\n\t[\"keyword\", \"parent\"], [\"operator\", \"::\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"print\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"readonly\"],\r\n\t[\"keyword\", \"require\"],\r\n\t[\"keyword\", \"require_once\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"self\"],\r\n\t[\"keyword\", \"new\"], [\"keyword\", \"self\"],\r\n\t[\"keyword\", \"self\"], [\"operator\", \"::\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"static\"], [\"operator\", \"::\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"trait\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"unset\"],\r\n\t[\"keyword\", \"use\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"xor\"],\r\n\t[\"keyword\", \"yield\"],\r\n\t[\"keyword\", \"yield\"], [\"keyword\", \"from\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/php/number_feature.test",
    "content": "664.6\r\n107_925_284.88_4\r\n1e7\r\n1.2e3\r\n1E-7\r\n0b10100111001\r\n0x539\r\n0x1A\r\n0123\r\n0o123\r\n0O123\r\n0b1111_0000_111\r\n0o1111_0000_123\r\n0O1111_0000_123\r\n01111_0000_123\r\n0xAAAA_FFF_0123\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"664.6\"],\r\n\t[\"number\", \"107_925_284.88_4\"],\r\n\t[\"number\", \"1e7\"],\r\n\t[\"number\", \"1.2e3\"],\r\n\t[\"number\", \"1E-7\"],\r\n\t[\"number\", \"0b10100111001\"],\r\n\t[\"number\", \"0x539\"],\r\n\t[\"number\", \"0x1A\"],\r\n\t[\"number\", \"0123\"],\r\n\t[\"number\", \"0o123\"],\r\n\t[\"number\", \"0O123\"],\r\n\t[\"number\", \"0b1111_0000_111\"],\r\n\t[\"number\", \"0o1111_0000_123\"],\r\n\t[\"number\", \"0O1111_0000_123\"],\r\n\t[\"number\", \"01111_0000_123\"],\r\n\t[\"number\", \"0xAAAA_FFF_0123\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/php/operators_feature.test",
    "content": "=>\r\n<=>\r\n??\r\n??=\r\n->\r\n?->\r\n::\r\n...\r\n/\r\n/=\r\n^\r\n^=\r\n|\r\n||\r\n|=\r\n%\r\n%=\r\n*\r\n*=\r\n**\r\n**=\r\n&\r\n&&\r\n&=\r\n<\r\n<=\r\n>\r\n>=\r\n.\r\n.=\r\n+\r\n++\r\n+=\r\n-\r\n--\r\n>>\r\n<<\r\n-=\r\n?\r\n~\r\n==\r\n!=\r\n===\r\n!==\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"=>\"],\r\n\t[\"operator\", \"<=>\"],\r\n\t[\"operator\", \"??\"],\r\n\t[\"operator\", \"??=\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"operator\", \"?->\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"operator\", \"...\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"^=\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"|=\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"**\"],\r\n\t[\"operator\", \"**=\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \".\"],\r\n\t[\"operator\", \".=\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"===\"],\r\n\t[\"operator\", \"!==\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/php/package_feature.test",
    "content": "namespace App\r\nnamespace \\foo\r\nnamespace \\foo\\bar\\baz\r\nuse \\foo\r\nuse \\foo\\bar\\baz\r\nuse function \\foo\r\nuse function \\foo\\bar\\baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"namespace\"],\r\n\t[\"package\", [\"App\"]],\r\n\t[\"keyword\", \"namespace\"],\r\n\t[\"package\", [[\"punctuation\", \"\\\\\"], \"foo\"]],\r\n\t[\"keyword\", \"namespace\"],\r\n\t[\"package\", [\r\n\t\t[\"punctuation\", \"\\\\\"], \"foo\",\r\n\t\t[\"punctuation\", \"\\\\\"], \"bar\",\r\n\t\t[\"punctuation\", \"\\\\\"], \"baz\"\r\n\t]],\r\n\t[\"keyword\", \"use\"],\r\n\t[\"package\", [[\"punctuation\", \"\\\\\"], \"foo\"]],\r\n\t[\"keyword\", \"use\"],\r\n\t[\"package\", [\r\n\t\t[\"punctuation\", \"\\\\\"], \"foo\",\r\n\t\t[\"punctuation\", \"\\\\\"], \"bar\",\r\n\t\t[\"punctuation\", \"\\\\\"], \"baz\"\r\n\t]],\r\n\t[\"keyword\", \"use\"],\r\n\t[\"keyword\", \"function\"],\r\n    [\"package\", [[\"punctuation\", \"\\\\\"], \"foo\"]],\r\n\t[\"keyword\", \"use\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"package\", [\r\n\t\t[\"punctuation\", \"\\\\\"], \"foo\",\r\n\t\t[\"punctuation\", \"\\\\\"], \"bar\",\r\n\t\t[\"punctuation\", \"\\\\\"], \"baz\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for packages."
  },
  {
    "path": "tests/languages/php/property_feature.test",
    "content": "$variable->property;\r\n$foo->bar->baz;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$variable\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"property\", \"property\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"property\", \"bar\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"property\", \"baz\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties."
  },
  {
    "path": "tests/languages/php/punctuation_feature.test",
    "content": "{\r\n}\r\n[\r\n]\r\n(\r\n)\r\n,\r\n:\r\n;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for punctuation."
  },
  {
    "path": "tests/languages/php/string-interpolation_feature.test",
    "content": "\"This $variable is interpolated\"\r\n\"$foo[2], $bar[-4], $foo[$bar]\"\r\n\"$foo->bar\"\r\n\"More {$interpolation}\"\r\n\"{$arr['key']}, {$arr['foo'][3]}\"\r\n\"{${$name}}, but not {\\${\\$name}}\"\r\n\"the return value of getName(): {${getName()}}\"\r\n\"the return value of \\$object->getName(): {${$object->getName()}}\"\r\n\"{$foo->$bar}, {$foo->{$baz[1]}}\"\r\n<<<FOO\r\nHeredoc strings $also->support {${$string->interpolation()}}\r\nFOO;\r\n<<<\"FOO_BAR\"\r\n\t{${$name}}, but not {\\${\\$name}}\r\nFOO_BAR;\r\n\r\n$value = \"$this->property->property\";\r\n$value = \"$foo[0][1]\";\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\r\n\t\t\"\\\"This \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"variable\", \"$variable\"]\r\n\t\t]],\r\n\t\t\" is interpolated\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"2\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t\", \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"variable\", \"$bar\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"operator\", \"-\"],\r\n\t\t\t[\"number\", \"4\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t\", \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"variable\", \"$bar\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t[\"operator\", \"->\"],\r\n\t\t\t[\"property\", \"bar\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"More \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$interpolation\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$arr\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"string\", \"'key'\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\", \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$arr\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"string\", \"'foo'\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"3\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$name\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\", but not {\\\\${\\\\$name}}\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"the return value of getName(): \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"function\", [\"getName\"]],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"the return value of \\\\$object->getName(): \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$object\"],\r\n\t\t\t[\"operator\", \"->\"],\r\n\t\t\t[\"function\", [\"getName\"]],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t[\"operator\", \"->\"],\r\n\t\t\t[\"variable\", \"$bar\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\", \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t[\"operator\", \"->\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$baz\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"punctuation\", \"<<<\"],\r\n\t\t\t\"FOO\"\r\n\t\t]],\r\n\r\n\t\t\"\\r\\nHeredoc strings \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"variable\", \"$also\"],\r\n\t\t\t[\"operator\", \"->\"],\r\n\t\t\t[\"property\", \"support\"]\r\n\t\t]],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$string\"],\r\n\t\t\t[\"operator\", \"->\"],\r\n\t\t\t[\"function\", [\"interpolation\"]],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\r\n\t\t[\"delimiter\", [\r\n\t\t\t\"FOO\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"string\", [\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"punctuation\", \"<<<\\\"\"],\r\n\t\t\t\"FOO_BAR\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$name\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\", but not {\\\\${\\\\$name}}\\r\\n\",\r\n\r\n\t\t[\"delimiter\", [\r\n\t\t\t\"FOO_BAR\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"variable\", \"$value\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"variable\", \"$this\"],\r\n\t\t\t[\"operator\", \"->\"],\r\n\t\t\t[\"property\", \"property\"]\r\n\t\t]],\r\n\t\t\"->property\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"variable\", \"$value\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"0\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t\"[1]\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for interpolation inside strings.\r\n"
  },
  {
    "path": "tests/languages/php/string_feature.test",
    "content": "<<<FOO_BAR\r\nHeredoc string\r\nFOO_BAR;\r\n<<<\"FOO\"\r\n\tsome\r\n\tcontent\r\nFOO;\r\n<<<'NOWDOC'\r\nThis is a nowdoc string\r\nNOWDOC;\r\n\"https://example.com\"\r\n\" /* not a comment */ \"\r\n\"multi-line\r\nstring\"\r\n'multi-line\r\nstring'\r\n`multi-line\r\nshell exec string`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"punctuation\", \"<<<\"], \"FOO_BAR\"\r\n\t\t]],\r\n\t\t\"\\r\\nHeredoc string\\r\\n\",\r\n\t\t[\"delimiter\", [\r\n\t\t\t\"FOO_BAR\", [\"punctuation\", \";\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"string\", [\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"punctuation\", \"<<<\\\"\"], \"FOO\", [\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t\"\\r\\n\\tsome\\r\\n\\tcontent\\r\\n\",\r\n\t\t[\"delimiter\", [\r\n\t\t\t\"FOO\", [\"punctuation\", \";\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"string\", [\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"punctuation\", \"<<<'\"], \"NOWDOC\", [\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t\"\\r\\nThis is a nowdoc string\\r\\n\",\r\n\t\t[\"delimiter\", [\r\n\t\t\t\"NOWDOC\", [\"punctuation\", \";\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"string\", [\"\\\"https://example.com\\\"\"]],\r\n\t[\"string\", [\"\\\" /* not a comment */ \\\"\"]],\r\n\t[\"string\", [\"\\\"multi-line\\r\\nstring\\\"\"]],\r\n\t[\"string\", \"'multi-line\\r\\nstring'\"],\r\n\t[\"string\", \"`multi-line\\r\\nshell exec string`\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/php/type_feature.test",
    "content": "public bool $a;\r\npublic int $a;\r\npublic float $a;\r\npublic string $a;\r\npublic object $a;\r\npublic array $a;\r\npublic mixed $a;\r\npublic int|null $a;\r\npublic int|false $a;\r\npublic false | int $a;\r\n\r\n(int) $a;\r\n(string) $a;\r\n(object) $a;\r\n(array) $a;\r\n(boolean) $a;\r\n(integer) $a;\r\n\r\nfunction f(): int {}\r\nfunction f() :string {}\r\nfunction f() : object {}\r\nfunction f(): ?array {}\r\nfunction f(): self {}\r\nfunction f(): static {}\r\nfunction f(): int|null {}\r\nfunction f(): int|false {}\r\n\r\nfunction foo(int $a,  string $b, ? object $c, ?array $d, self $e, static $f, int|null $g) {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"bool\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"float\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"object\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"array\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"mixed\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"keyword\", \"false\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"false\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"object\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"array\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"boolean\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"integer\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"object\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"keyword\", \"array\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"self\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"keyword\", \"false\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function-definition\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"variable\", \"$a\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"variable\", \"$b\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"keyword\", \"object\"],\r\n\t[\"variable\", \"$c\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"keyword\", \"array\"],\r\n\t[\"variable\", \"$d\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"self\"],\r\n\t[\"variable\", \"$e\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"variable\", \"$f\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"variable\", \"$g\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for types.\r\n"
  },
  {
    "path": "tests/languages/php/variable_feature.test",
    "content": "$f\r\n$foo\r\n$foobar_42\r\n$$bar\r\n${$foo}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$f\"],\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"variable\", \"$foobar_42\"],\r\n\t[\"variable\", \"$$bar\"],\r\n\t[\"variable\", \"$\"], [\"punctuation\", \"{\"], [\"variable\", \"$foo\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/php!+css+css-extras/issue2008.test",
    "content": "<img style=\"width:<?php echo (80 / count($images)) ?>%\"/>\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"img\"]],\n\t\t[\"special-attr\", [\n\t\t\t[\"attr-name\", \"style\"],\n\t\t\t[\"attr-value\", [\n\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t[\"value\", [\n\t\t\t\t\t[\"property\", \"width\"],\n\t\t\t\t\t[\"punctuation\", \":\"],\n\t\t\t\t\t[\"php\", [\n\t\t\t\t\t\t[\"delimiter\", \"<?php\"],\n\t\t\t\t\t\t[\"keyword\", \"echo\"],\n\t\t\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t\t\t[\"number\", \"80\"],\n\t\t\t\t\t\t[\"operator\", \"/\"],\n\t\t\t\t\t\t[\"function\", [\"count\"]],\n\t\t\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t\t\t[\"variable\", \"$images\"],\n\t\t\t\t\t\t[\"punctuation\", \")\"],\n\t\t\t\t\t\t[\"punctuation\", \")\"],\n\t\t\t\t\t\t[\"delimiter\", \"?>\"]\n\t\t\t\t\t]],\n\t\t\t\t\t\"%\"\n\t\t\t\t]],\n\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t]]\n\t\t]],\n\t\t[\"punctuation\", \"/>\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for #2008 where a part of markup templating's placeholder was tokenized as `number` by CSS Extras.\n"
  },
  {
    "path": "tests/languages/php!+php-extras/global_feature.test",
    "content": "$GLOBALS\r\n$_SERVER\r\n$_GET\r\n$_POST\r\n$_FILES\r\n$_REQUEST\r\n$_SESSION\r\n$_ENV\r\n$_COOKIE\r\n$php_errormsg\r\n$HTTP_RAW_POST_DATA\r\n$http_response_header\r\n$argc\r\n$argv\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"global\", \"$GLOBALS\"],\r\n\t[\"global\", \"$_SERVER\"],\r\n\t[\"global\", \"$_GET\"],\r\n\t[\"global\", \"$_POST\"],\r\n\t[\"global\", \"$_FILES\"],\r\n\t[\"global\", \"$_REQUEST\"],\r\n\t[\"global\", \"$_SESSION\"],\r\n\t[\"global\", \"$_ENV\"],\r\n\t[\"global\", \"$_COOKIE\"],\r\n\t[\"global\", \"$php_errormsg\"],\r\n\t[\"global\", \"$HTTP_RAW_POST_DATA\"],\r\n\t[\"global\", \"$http_response_header\"],\r\n\t[\"global\", \"$argc\"],\r\n\t[\"global\", \"$argv\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for superglobals."
  },
  {
    "path": "tests/languages/php!+php-extras/scope_feature.test",
    "content": "static::foo()\r\nself::bar()\r\nparent::baz()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"scope\", [\r\n\t\t[\"keyword\", \"static\"],\r\n\t\t[\"punctuation\", \"::\"]\r\n\t]],\r\n\t[\"function\", [\"foo\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"scope\", [\r\n\t\t[\"keyword\", \"self\"],\r\n\t\t[\"punctuation\", \"::\"]\r\n\t]],\r\n\t[\"function\", [\"bar\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"scope\", [\r\n\t\t[\"keyword\", \"parent\"],\r\n\t\t[\"punctuation\", \"::\"]\r\n\t]],\r\n\t[\"function\", [\"baz\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for scopes.\r\n"
  },
  {
    "path": "tests/languages/php!+php-extras/this_feature.test",
    "content": "$this\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"this\", \"$this\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for $this."
  },
  {
    "path": "tests/languages/phpdoc/class-name_feature.test",
    "content": "/**\n * @param string|null $parameter a parameter\n * @return self\n * @var MyClass[int]\n * @throws \\foo\\MyException if something bad happens\n */\n\n/**\n * @param callback $parameter\n * @param resource $parameter\n * @param boolean $parameter\n * @param integer $parameter\n * @param double $parameter\n * @param object $parameter\n * @param string $parameter\n * @param array $parameter\n * @param false $parameter\n * @param float $parameter\n * @param mixed $parameter\n * @param bool $parameter\n * @param null $parameter\n * @param self $parameter\n * @param true $parameter\n * @param void $parameter\n * @param int $parameter\n */\n\n----------------------------------------------------\n\n[\n\t\"/**\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"string\"],\n\t\t[\"punctuation\", \"|\"],\n\t\t[\"keyword\", \"null\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\t\" a parameter\\r\\n * \",\n\t[\"keyword\", \"@return\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"self\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@var\"],\n\t[\"class-name\", [\n\t\t\"MyClass\",\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"keyword\", \"int\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@throws\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"\\\\\"],\n\t\t\"foo\",\n\t\t[\"punctuation\", \"\\\\\"],\n\t\t\"MyException\"\n\t]],\n\t\" if something bad happens\\r\\n */\\r\\n\\r\\n/**\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"callback\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"resource\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"boolean\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"integer\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"double\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"object\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"string\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"array\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"false\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"float\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"mixed\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"bool\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"null\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"self\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"true\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"void\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"int\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\n\t\"\\r\\n */\"\n]\n\n----------------------------------------------------\n\nChecks for class names.\n"
  },
  {
    "path": "tests/languages/phpdoc/issue2197.test",
    "content": "/** @var Git_Driver_Gerrit_ProjectCreator_Factory */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"/** \",\r\n\t[\"keyword\", \"@var\"],\r\n\t[\"class-name\", [\r\n\t\t\"Git_Driver_Gerrit_ProjectCreator_Factory\"\r\n\t]],\r\n\t\" */\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks exponential backtracking for types. See #2197.\r\n"
  },
  {
    "path": "tests/languages/phpdoc/keyword_feature.test",
    "content": "/**\n * @api\n * @author\n * @category\n * @copyright\n * @deprecated\n * @example\n * @filesource\n * @global\n * @ignore\n * @internal\n * @license\n * @link\n * @method\n * @package\n * @param\n * @property\n * @property-read\n * @property-write\n * @return\n * @see\n * @since\n * @source\n * @subpackage\n * @throws\n * @todo\n * @uses\n * @used-by\n * @var\n * @version\n */\n\n----------------------------------------------------\n\n[\n\t\"/**\\r\\n * \", [\"keyword\", \"@api\"],\n\t\"\\r\\n * \", [\"keyword\", \"@author\"],\n\t\"\\r\\n * \", [\"keyword\", \"@category\"],\n\t\"\\r\\n * \", [\"keyword\", \"@copyright\"],\n\t\"\\r\\n * \", [\"keyword\", \"@deprecated\"],\n\t\"\\r\\n * \", [\"keyword\", \"@example\"],\n\t\"\\r\\n * \", [\"keyword\", \"@filesource\"],\n\t\"\\r\\n * \", [\"keyword\", \"@global\"],\n\t\"\\r\\n * \", [\"keyword\", \"@ignore\"],\n\t\"\\r\\n * \", [\"keyword\", \"@internal\"],\n\t\"\\r\\n * \", [\"keyword\", \"@license\"],\n\t\"\\r\\n * \", [\"keyword\", \"@link\"],\n\t\"\\r\\n * \", [\"keyword\", \"@method\"],\n\t\"\\r\\n * \", [\"keyword\", \"@package\"],\n\t\"\\r\\n * \", [\"keyword\", \"@param\"],\n\t\"\\r\\n * \", [\"keyword\", \"@property\"],\n\t\"\\r\\n * \", [\"keyword\", \"@property-read\"],\n\t\"\\r\\n * \", [\"keyword\", \"@property-write\"],\n\t\"\\r\\n * \", [\"keyword\", \"@return\"],\n\t\"\\r\\n * \", [\"keyword\", \"@see\"],\n\t\"\\r\\n * \", [\"keyword\", \"@since\"],\n\t\"\\r\\n * \", [\"keyword\", \"@source\"],\n\t\"\\r\\n * \", [\"keyword\", \"@subpackage\"],\n\t\"\\r\\n * \", [\"keyword\", \"@throws\"],\n\t\"\\r\\n * \", [\"keyword\", \"@todo\"],\n\t\"\\r\\n * \", [\"keyword\", \"@uses\"],\n\t\"\\r\\n * \", [\"keyword\", \"@used-by\"],\n\t\"\\r\\n * \", [\"keyword\", \"@var\"],\n\t\"\\r\\n * \", [\"keyword\", \"@version\"],\n\t\"\\r\\n */\"\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/phpdoc/parameter_feature.test",
    "content": "/**\n * @param string $parameter a parameter\n * @param $arg2 a second parameter\n */\n\n----------------------------------------------------\n\n[\n\t\"/**\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"string\"]\n\t]],\n\t[\"parameter\", \"$parameter\"],\n\t\" a parameter\\r\\n * \",\n\t[\"keyword\", \"@param\"],\n\t[\"parameter\", \"$arg2\"],\n\t\" a second parameter\\r\\n */\"\n]\n\n----------------------------------------------------\n\nChecks for parameters.\n"
  },
  {
    "path": "tests/languages/phpdoc+php/phpdoc_inclusion.test",
    "content": "/**\n * @param string|null $parameter a parameter\n * @return self\n * @var MyClass[int]\n * @throws \\foo\\MyException if something bad happens\n */\n\n----------------------------------------------------\n\n[\n\t[\"doc-comment\", [\n\t\t\"/**\\r\\n * \",\n\t\t[\"keyword\", \"@param\"],\n\t\t[\"class-name\", [\n\t\t\t[\"keyword\", \"string\"],\n\t\t\t[\"punctuation\", \"|\"],\n\t\t\t[\"keyword\", \"null\"]\n\t\t]],\n\t\t[\"parameter\", \"$parameter\"],\n\t\t\" a parameter\\r\\n * \",\n\t\t[\"keyword\", \"@return\"],\n\t\t[\"class-name\", [\n\t\t\t[\"keyword\", \"self\"]\n\t\t]],\n\n\t\t\"\\r\\n * \",\n\t\t[\"keyword\", \"@var\"],\n\t\t[\"class-name\", [\n\t\t\t\"MyClass\",\n\t\t\t[\"punctuation\", \"[\"],\n\t\t\t[\"keyword\", \"int\"],\n\t\t\t[\"punctuation\", \"]\"]\n\t\t]],\n\n\t\t\"\\r\\n * \",\n\t\t[\"keyword\", \"@throws\"],\n\t\t[\"class-name\", [\n\t\t\t[\"punctuation\", \"\\\\\"],\n\t\t\t\"foo\",\n\t\t\t[\"punctuation\", \"\\\\\"],\n\t\t\t\"MyException\"\n\t\t]],\n\t\t\" if something bad happens\\r\\n */\"\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for PHPDoc doc comments in PHP.\n"
  },
  {
    "path": "tests/languages/plant-uml/arrow_feature.test",
    "content": "-> --> <- <-- <-> <-->\n->> -->> <<- <<-- <<->> <<-->>\n-/ --/ /- /-- /-/ /--/\n-// --// //- //-- //-// //--//\n-\\ --\\ \\- \\-- \\-\\ \\--\\\n-\\\\ --\\\\ \\\\- \\\\-- \\\\-\\\\ \\\\--\\\\\n\n\n@startuml\nBob ->x Alice\nBob -> Alice\nBob ->> Alice\nBob -\\ Alice\nBob \\\\- Alice\nBob //-- Alice\n\nBob ->o Alice\nBob o\\\\-- Alice\n\nBob <-> Alice\nBob <->o Alice\n@enduml\n\n@startuml\nBob -[#red]> Alice : hello\nAlice -[#0000FF]->Bob : ok\n@enduml\n\n@startuml\nparticipant Alice\nparticipant Bob #lightblue\nAlice -> Bob\nBob -> Carol\n...\n[-> Bob\n[o-> Bob\n[o->o Bob\n[x-> Bob\n...\n[<- Bob\n[x<- Bob\n...\nBob ->]\nBob ->o]\nBob o->o]\nBob ->x]\n...\nBob <-]\nBob x<-]\n@enduml\n\n@startuml\n?-> Alice\n[-> Alice\n[-> Bob\n?-> Bob\nAlice ->]\nAlice ->?\nAlice -> Bob\n@enduml\n\n@startuml\n(Use case 1) <.. :user:\n(Use case 2) <- :user:\n@enduml\n\n@startuml\n:user: -left-> (dummyLeft)\n:user: -right-> (dummyRight)\n:user: -up-> (dummyUp)\n:user: -down-> (dummyDown)\n@enduml\n\n@startuml\nClass11 <|.. Class12\nClass13 --> Class14\nClass15 ..> Class16\nClass17 ..|> Class18\nClass19 <--* Class20\nClass21 #-- Class22\nClass23 x-- Class24\nClass25 }-- Class26\nClass27 +-- Class28\nClass29 ^-- Class30\n@enduml\n\n----------------------------------------------------\n\n[\n\t[\"arrow\", [\"->\"]],\n\t[\"arrow\", [\"-->\"]],\n\t[\"arrow\", [\"<-\"]],\n\t[\"arrow\", [\"<--\"]],\n\t[\"arrow\", [\"<->\"]],\n\t[\"arrow\", [\"<-->\"]],\n\n\t[\"arrow\", [\"->>\"]],\n\t[\"arrow\", [\"-->>\"]],\n\t[\"arrow\", [\"<<-\"]],\n\t[\"arrow\", [\"<<--\"]],\n\t[\"arrow\", [\"<<->>\"]],\n\t[\"arrow\", [\"<<-->>\"]],\n\n\t[\"arrow\", [\"-/\"]],\n\t[\"arrow\", [\"--/\"]],\n\t[\"arrow\", [\"/-\"]],\n\t[\"arrow\", [\"/--\"]],\n\t[\"arrow\", [\"/-/\"]],\n\t[\"arrow\", [\"/--/\"]],\n\n\t[\"arrow\", [\"-//\"]],\n\t[\"arrow\", [\"--//\"]],\n\t[\"arrow\", [\"//-\"]],\n\t[\"arrow\", [\"//--\"]],\n\t[\"arrow\", [\"//-//\"]],\n\t[\"arrow\", [\"//--//\"]],\n\n\t[\"arrow\", [\"-\\\\\"]],\n\t[\"arrow\", [\"--\\\\\"]],\n\t[\"arrow\", [\"\\\\-\"]],\n\t[\"arrow\", [\"\\\\--\"]],\n\t[\"arrow\", [\"\\\\-\\\\\"]],\n\t[\"arrow\", [\"\\\\--\\\\\"]],\n\n\t[\"arrow\", [\"-\\\\\\\\\"]],\n\t[\"arrow\", [\"--\\\\\\\\\"]],\n\t[\"arrow\", [\"\\\\\\\\-\"]],\n\t[\"arrow\", [\"\\\\\\\\--\"]],\n\t[\"arrow\", [\"\\\\\\\\-\\\\\\\\\"]],\n\t[\"arrow\", [\"\\\\\\\\--\\\\\\\\\"]],\n\n\t[\"delimiter\", \"@startuml\"],\n\n\t\"\\r\\nBob \",\n\t[\"arrow\", [\"->x\"]],\n\t\" Alice\\r\\nBob \",\n\t[\"arrow\", [\"->\"]],\n\t\" Alice\\r\\nBob \",\n\t[\"arrow\", [\"->>\"]],\n\t\" Alice\\r\\nBob \",\n\t[\"arrow\", [\"-\\\\\"]],\n\t\" Alice\\r\\nBob \",\n\t[\"arrow\", [\"\\\\\\\\-\"]],\n\t\" Alice\\r\\nBob \",\n\t[\"arrow\", [\"//--\"]],\n\t\" Alice\\r\\n\\r\\nBob \",\n\t[\"arrow\", [\"->o\"]],\n\t\" Alice\\r\\nBob \",\n\t[\"arrow\", [\"o\\\\\\\\--\"]],\n\t\" Alice\\r\\n\\r\\nBob \",\n\t[\"arrow\", [\"<->\"]],\n\t\" Alice\\r\\nBob \",\n\t[\"arrow\", [\"<->o\"]],\n\t\" Alice\\r\\n\",\n\n\t[\"delimiter\", \"@enduml\"],\n\n\t[\"delimiter\", \"@startuml\"],\n\n\t\"\\r\\nBob \",\n\t[\"arrow\", [\n\t\t\"-\",\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"expression\", [\n\t\t\t[\"color\", \"#red\"]\n\t\t]],\n\t\t[\"punctuation\", \"]\"],\n\t\t\">\"\n\t]],\n\t\" Alice \",\n\t[\"punctuation\", \":\"],\n\t\" hello\\r\\nAlice \",\n\t[\"arrow\", [\n\t\t\"-\",\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"expression\", [\n\t\t\t[\"color\", \"#0000FF\"]\n\t\t]],\n\t\t[\"punctuation\", \"]\"],\n\t\t\"->\"\n\t]],\n\t\"Bob \",\n\t[\"punctuation\", \":\"],\n\t\" ok\\r\\n\",\n\n\t[\"delimiter\", \"@enduml\"],\n\n\t[\"delimiter\", \"@startuml\"],\n\t[\"keyword\", \"participant\"],\n\t\" Alice\\r\\n\",\n\t[\"keyword\", \"participant\"],\n\t\" Bob \",\n\t[\"color\", \"#lightblue\"],\n\t\"\\r\\nAlice \",\n\t[\"arrow\", [\"->\"]],\n\t\" Bob\\r\\nBob \",\n\t[\"arrow\", [\"->\"]],\n\t\" Carol\\r\\n\",\n\t[\"punctuation\", \"...\"],\n\t[\"arrow\", [\"[->\"]],\n\t\" Bob\\r\\n\",\n\t[\"arrow\", [\"[o->\"]],\n\t\" Bob\\r\\n\",\n\t[\"arrow\", [\"[o->o\"]],\n\t\" Bob\\r\\n\",\n\t[\"arrow\", [\"[x->\"]],\n\t\" Bob\\r\\n\",\n\t[\"punctuation\", \"...\"],\n\t[\"arrow\", [\"[<-\"]],\n\t\" Bob\\r\\n\",\n\t[\"arrow\", [\"[x<-\"]],\n\t\" Bob\\r\\n\",\n\t[\"punctuation\", \"...\"],\n\t\"\\r\\nBob \",\n\t[\"arrow\", [\"->]\"]],\n\t\"\\r\\nBob \",\n\t[\"arrow\", [\"->o]\"]],\n\t\"\\r\\nBob \",\n\t[\"arrow\", [\"o->o]\"]],\n\t\"\\r\\nBob \",\n\t[\"arrow\", [\"->x]\"]],\n\t[\"punctuation\", \"...\"],\n\t\"\\r\\nBob \",\n\t[\"arrow\", [\"<-]\"]],\n\t\"\\r\\nBob \",\n\t[\"arrow\", [\"x<-]\"]],\n\t[\"delimiter\", \"@enduml\"],\n\n\t[\"delimiter\", \"@startuml\"],\n\t[\"arrow\", [\"?->\"]], \" Alice\\r\\n\",\n\t[\"arrow\", [\"[->\"]], \" Alice\\r\\n\",\n\t[\"arrow\", [\"[->\"]], \" Bob\\r\\n\",\n\t[\"arrow\", [\"?->\"]], \" Bob\\r\\nAlice \", [\"arrow\", [\"->]\"]],\n\t\"\\r\\nAlice \", [\"arrow\", [\"->?\"]],\n\t\"\\r\\nAlice \", [\"arrow\", [\"->\"]], \" Bob\\r\\n\",\n\t[\"delimiter\", \"@enduml\"],\n\n\t[\"delimiter\", \"@startuml\"],\n\n\t[\"punctuation\", \"(\"],\n\t\"Use case 1\",\n\t[\"punctuation\", \")\"],\n\t[\"arrow\", [\"<..\"]],\n\t[\"punctuation\", \":\"],\n\t\"user\",\n\t[\"punctuation\", \":\"],\n\n\t[\"punctuation\", \"(\"],\n\t\"Use case 2\",\n\t[\"punctuation\", \")\"],\n\t[\"arrow\", [\"<-\"]],\n\t[\"punctuation\", \":\"],\n\t\"user\",\n\t[\"punctuation\", \":\"],\n\n\t[\"delimiter\", \"@enduml\"],\n\n\t[\"delimiter\", \"@startuml\"],\n\n\t[\"punctuation\", \":\"],\n\t\"user\",\n\t[\"punctuation\", \":\"],\n\t[\"arrow\", [\"-left->\"]],\n\t[\"punctuation\", \"(\"],\n\t\"dummyLeft\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"user\",\n\t[\"punctuation\", \":\"],\n\t[\"arrow\", [\"-right->\"]],\n\t[\"punctuation\", \"(\"],\n\t\"dummyRight\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"user\",\n\t[\"punctuation\", \":\"],\n\t[\"arrow\", [\"-up->\"]],\n\t[\"punctuation\", \"(\"],\n\t\"dummyUp\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"user\",\n\t[\"punctuation\", \":\"],\n\t[\"arrow\", [\"-down->\"]],\n\t[\"punctuation\", \"(\"],\n\t\"dummyDown\",\n\t[\"punctuation\", \")\"],\n\n\t[\"delimiter\", \"@enduml\"],\n\n\t[\"delimiter\", \"@startuml\"],\n\n\t\"\\r\\nClass11 \",\n\t[\"arrow\", [\"<|..\"]],\n\t\" Class12\\r\\nClass13 \",\n\t[\"arrow\", [\"-->\"]],\n\t\" Class14\\r\\nClass15 \",\n\t[\"arrow\", [\"..>\"]],\n\t\" Class16\\r\\nClass17 \",\n\t[\"arrow\", [\"..|>\"]],\n\t\" Class18\\r\\nClass19 \",\n\t[\"arrow\", [\"<--*\"]],\n\t\" Class20\\r\\nClass21 \",\n\t[\"arrow\", [\"#--\"]],\n\t\" Class22\\r\\nClass23 \",\n\t[\"arrow\", [\"x--\"]],\n\t\" Class24\\r\\nClass25 \",\n\t[\"arrow\", [\"}--\"]],\n\t\" Class26\\r\\nClass27 \",\n\t[\"arrow\", [\"+--\"]],\n\t\" Class28\\r\\nClass29 \",\n\t[\"arrow\", [\"^--\"]],\n\t\" Class30\\r\\n\",\n\n\t[\"delimiter\", \"@enduml\"]\n]\n"
  },
  {
    "path": "tests/languages/plant-uml/color_feature.test",
    "content": "#palegreen\n#gold\n#FF00FF\n\n----------------------------------------------------\n\n[\n\t[\"color\", \"#palegreen\"],\n\t[\"color\", \"#gold\"],\n\t[\"color\", \"#FF00FF\"]\n]\n"
  },
  {
    "path": "tests/languages/plant-uml/comment_feature.test",
    "content": "' comment\n/'\n comment\n'/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"' comment\"],\n\t[\"comment\", \"/'\\r\\n comment\\r\\n'/\"]\n]\n"
  },
  {
    "path": "tests/languages/plant-uml/delimiter_feature.test",
    "content": "@startuml\n@enduml\n\n----------------------------------------------------\n\n[\n\t[\"delimiter\", \"@startuml\"],\n\t[\"delimiter\", \"@enduml\"]\n]\n"
  },
  {
    "path": "tests/languages/plant-uml/divider_feature.test",
    "content": "== Initialization ==\n\nAlice -> Bob: Authentication Request\nBob --> Alice: Authentication Response\n\n== Repetition ==\n\nAlice -> Bob: Another authentication Request\nAlice <-- Bob: another authentication Response\n\n----------------------------------------------------\n\n[\n\t[\"divider\", \"== Initialization ==\"],\n\n\t\"\\r\\n\\r\\nAlice \",\n\t[\"arrow\", [\"->\"]],\n\t\" Bob\",\n\t[\"punctuation\", \":\"],\n\t\" Authentication Request\\r\\nBob \",\n\t[\"arrow\", [\"-->\"]],\n\t\" Alice\",\n\t[\"punctuation\", \":\"],\n\t\" Authentication Response\\r\\n\\r\\n\",\n\n\t[\"divider\", \"== Repetition ==\"],\n\n\t\"\\r\\n\\r\\nAlice \",\n\t[\"arrow\", [\"->\"]],\n\t\" Bob\",\n\t[\"punctuation\", \":\"],\n\t\" Another authentication Request\\r\\nAlice \",\n\t[\"arrow\", [\"<--\"]],\n\t\" Bob\",\n\t[\"punctuation\", \":\"],\n\t\" another authentication Response\"\n]\n"
  },
  {
    "path": "tests/languages/plant-uml/keyword_feature.test",
    "content": "if \"Some Test\" then\n  -->[true] \"Some Action\"\n  --> \"Another Action\"\n  -right-> (*)\nelse\n  ->[false] \"Something else\"\n  -->[Ending process] (*)\nendif\n\nif (Graphviz installed?) then (yes)\n  :process all\\ndiagrams;\nelse (no)\n  :process only\n  __sequence__ and __activity__ diagrams;\nendif\n\nif (color?) is (<color:red>red) then\n:print red;\nelse\n:print not red;\n\nif (counter?) equals (5) then\n:print 5;\nelse\n:print not 5;\n\nstart\nif (condition A) then (yes)\n  :Text 1;\nelseif (condition B) then (yes)\n  :Text 2;\n  stop\n(no) elseif (condition C) then (yes)\n  :Text 3;\n(no) elseif (condition D) then (yes)\n  :Text 4;\nelse (nothing)\n  :Text else;\nendif\nstop\n\nswitch (test?)\ncase ( condition A )\n  :Text 1;\ncase ( condition B )\n  :Text 2;\ncase ( condition C )\n  :Text 3;\ncase ( condition D )\n  :Text 4;\ncase ( condition E )\n  :Text 5;\nendswitch\n\nrepeat\n  :read data;\n  :generate diagrams;\nrepeat while (more data?) is (yes)\n->no;\n\nrepeat while (Something went wrong with long text?) is (yes) not (no)\n->//merged step//;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"if\"],\n\t[\"string\", \"\\\"Some Test\\\"\"],\n\t[\"keyword\", \"then\"],\n\n\t[\"arrow\", [\"-->\"]],\n\t[\"punctuation\", \"[\"],\n\t\"true\",\n\t[\"punctuation\", \"]\"],\n\t[\"string\", \"\\\"Some Action\\\"\"],\n\n\t[\"arrow\", [\"-->\"]],\n\t[\"string\", \"\\\"Another Action\\\"\"],\n\n\t[\"arrow\", [\"-right->\"]],\n\t[\"punctuation\", \"(\"],\n\t\"*\",\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"else\"],\n\n\t[\"arrow\", [\"->\"]],\n\t[\"punctuation\", \"[\"],\n\t\"false\",\n\t[\"punctuation\", \"]\"],\n\t[\"string\", \"\\\"Something else\\\"\"],\n\n\t[\"arrow\", [\"-->\"]],\n\t[\"punctuation\", \"[\"],\n\t\"Ending process\",\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"(\"],\n\t\"*\",\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"endif\"],\n\n\t[\"keyword\", \"if\"],\n\t[\"punctuation\", \"(\"],\n\t\"Graphviz installed?\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"then\"],\n\t[\"punctuation\", \"(\"],\n\t\"yes\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"process all\\\\ndiagrams\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"else\"],\n\t[\"punctuation\", \"(\"],\n\t\"no\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"process only\\r\\n  __sequence__ and __activity__ diagrams\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"endif\"],\n\n\t[\"keyword\", \"if\"],\n\t[\"punctuation\", \"(\"],\n\t\"color?\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"is\"],\n\t[\"punctuation\", \"(\"],\n\t\"<color\",\n\t[\"punctuation\", \":\"],\n\t\"red>red\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"then\"],\n\n\t[\"punctuation\", \":\"],\n\t\"print red\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"else\"],\n\n\t[\"punctuation\", \":\"],\n\t\"print not red\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"if\"],\n\t[\"punctuation\", \"(\"],\n\t\"counter?\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"equals\"],\n\t[\"punctuation\", \"(\"],\n\t\"5\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"then\"],\n\n\t[\"punctuation\", \":\"],\n\t\"print 5\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"else\"],\n\n\t[\"punctuation\", \":\"],\n\t\"print not 5\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"start\"],\n\n\t[\"keyword\", \"if\"],\n\t[\"punctuation\", \"(\"],\n\t\"condition A\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"then\"],\n\t[\"punctuation\", \"(\"],\n\t\"yes\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"Text 1\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"elseif\"],\n\t[\"punctuation\", \"(\"],\n\t\"condition B\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"then\"],\n\t[\"punctuation\", \"(\"],\n\t\"yes\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"Text 2\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"stop\"],\n\n\t[\"punctuation\", \"(\"],\n\t\"no\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"elseif\"],\n\t[\"punctuation\", \"(\"],\n\t\"condition C\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"then\"],\n\t[\"punctuation\", \"(\"],\n\t\"yes\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"Text 3\",\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"(\"],\n\t\"no\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"elseif\"],\n\t[\"punctuation\", \"(\"],\n\t\"condition D\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"then\"],\n\t[\"punctuation\", \"(\"],\n\t\"yes\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"Text 4\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"else\"],\n\t[\"punctuation\", \"(\"],\n\t\"nothing\",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"Text else\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"endif\"],\n\n\t[\"keyword\", \"stop\"],\n\n\t[\"keyword\", \"switch\"],\n\t[\"punctuation\", \"(\"],\n\t\"test?\",\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"punctuation\", \"(\"],\n\t\" condition A \",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"Text 1\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"punctuation\", \"(\"],\n\t\" condition B \",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"Text 2\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"punctuation\", \"(\"],\n\t\" condition C \",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"Text 3\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"punctuation\", \"(\"],\n\t\" condition D \",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"Text 4\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"case\"],\n\t[\"punctuation\", \"(\"],\n\t\" condition E \",\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \":\"],\n\t\"Text 5\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"endswitch\"],\n\n\t[\"keyword\", \"repeat\"],\n\n\t[\"punctuation\", \":\"],\n\t\"read data\",\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \":\"],\n\t\"generate diagrams\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"repeat\"],\n\t[\"keyword\", \"while\"],\n\t[\"punctuation\", \"(\"],\n\t\"more data?\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"is\"],\n\t[\"punctuation\", \"(\"],\n\t\"yes\",\n\t[\"punctuation\", \")\"],\n\n\t[\"arrow\", [\"->\"]],\n\t\"no\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"repeat\"],\n\t[\"keyword\", \"while\"],\n\t[\"punctuation\", \"(\"],\n\t\"Something went wrong with long text?\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"is\"],\n\t[\"punctuation\", \"(\"],\n\t\"yes\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"not\"],\n\t[\"punctuation\", \"(\"],\n\t\"no\",\n\t[\"punctuation\", \")\"],\n\n\t[\"arrow\", [\"->\"]],\n\t\"//merged step//\",\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/plant-uml/preprocessor_feature.test",
    "content": "!pragma useVerticalIf on\n\n----------------------------------------------------\n\n[\n\t[\"preprocessor\", [\"!pragma useVerticalIf on\"]]\n]\n"
  },
  {
    "path": "tests/languages/plant-uml/string_feature.test",
    "content": "\"foo\"\n\"\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/plant-uml/text_feature.test",
    "content": "Alice -> Bob: Authentication request\nBob --> Alice: Response\n\nparticipant Participant [\n    =Title\n    ----\n    \"\"SubTitle\"\"\n]\n\n----------------------------------------------------\n\n[\n\t\"Alice \",\n\t[\"arrow\", [\"->\"]],\n\t\" Bob\",\n\t[\"punctuation\", \":\"],\n\t\" Authentication request\\r\\nBob \",\n\t[\"arrow\", [\"-->\"]],\n\t\" Alice\",\n\t[\"punctuation\", \":\"],\n\t\" Response\\r\\n\\r\\n\",\n\n\t[\"keyword\", \"participant\"],\n\t\" Participant \",\n\t[\"punctuation\", \"[\"],\n\n\t[\"text\", \"    =Title\\r\\n    ----\\r\\n    \\\"\\\"SubTitle\\\"\\\"\\r\\n\"],\n\t[\"punctuation\", \"]\"]\n]\n"
  },
  {
    "path": "tests/languages/plant-uml/time_feature.test",
    "content": "@startuml\nclock clk with period 1\nbinary \"enable\" as EN\nconcise \"dataBus\" as db\n\n@0 as :start\n@5 as :en_high\n@10 as :en_low\n@:en_high-2 as :en_highMinus2\n\n@:start\nEN is low\ndb is \"0x0000\"\n\n@:en_high\nEN is high\n\n@:en_low\nEN is low\n\n@:en_highMinus2\ndb is \"0xf23a\"\n\n@:en_high+6\ndb is \"0x0000\"\n@enduml\n\n@1:15:00\n@2000/12/31\n\n----------------------------------------------------\n\n[\n\t[\"delimiter\", \"@startuml\"],\n\n\t[\"keyword\", \"clock\"],\n\t\" clk with period 1\\r\\n\",\n\n\t[\"keyword\", \"binary\"],\n\t[\"string\", \"\\\"enable\\\"\"],\n\t[\"keyword\", \"as\"],\n\t\" EN\\r\\n\",\n\n\t[\"keyword\", \"concise\"],\n\t[\"string\", \"\\\"dataBus\\\"\"],\n\t[\"keyword\", \"as\"],\n\t\" db\\r\\n\\r\\n\",\n\n\t[\"time\", \"@0\"],\n\t[\"keyword\", \"as\"],\n\t[\"punctuation\", \":\"],\n\t\"start\\r\\n\",\n\n\t[\"time\", \"@5\"],\n\t[\"keyword\", \"as\"],\n\t[\"punctuation\", \":\"],\n\t\"en_high\\r\\n\",\n\n\t[\"time\", \"@10\"],\n\t[\"keyword\", \"as\"],\n\t[\"punctuation\", \":\"],\n\t\"en_low\\r\\n\",\n\n\t[\"time\", \"@:en_high-2\"],\n\t[\"keyword\", \"as\"],\n\t[\"punctuation\", \":\"],\n\t\"en_highMinus2\\r\\n\\r\\n\",\n\n\t[\"time\", \"@:start\"],\n\n\t\"\\r\\nEN \",\n\t[\"keyword\", \"is\"],\n\t\" low\\r\\ndb \",\n\t[\"keyword\", \"is\"],\n\t[\"string\", \"\\\"0x0000\\\"\"],\n\n\t[\"time\", \"@:en_high\"],\n\t\"\\r\\nEN \", [\"keyword\", \"is\"], \" high\\r\\n\\r\\n\",\n\n\t[\"time\", \"@:en_low\"],\n\t\"\\r\\nEN \", [\"keyword\", \"is\"], \" low\\r\\n\\r\\n\",\n\n\t[\"time\", \"@:en_highMinus2\"],\n\t\"\\r\\ndb \", [\"keyword\", \"is\"], [\"string\", \"\\\"0xf23a\\\"\"],\n\n\t[\"time\", \"@:en_high+6\"],\n\t\"\\r\\ndb \", [\"keyword\", \"is\"], [\"string\", \"\\\"0x0000\\\"\"],\n\t[\"delimiter\", \"@enduml\"],\n\n\t[\"time\", \"@1:15:00\"],\n\t[\"time\", \"@2000/12/31\"]\n]\n"
  },
  {
    "path": "tests/languages/plant-uml/variable_feature.test",
    "content": "$foo\n$bar\n\n%autonumber%\n%page%\n\n----------------------------------------------------\n\n[\n\t[\"variable\", \"$foo\"],\n\t[\"variable\", \"$bar\"],\n\n\t[\"variable\", \"%autonumber%\"],\n\t[\"variable\", \"%page%\"]\n]\n"
  },
  {
    "path": "tests/languages/plsql/comment_feature.test",
    "content": "/**/\r\n/* foo\r\nbar */\r\n--\r\n-- foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"--\"],\r\n\t[\"comment\", \"-- foo\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/plsql/keyword_feature.test",
    "content": "A\r\nACCESSIBLE\r\nADD\r\nAGENT\r\nAGGREGATE\r\nALL\r\nALTER\r\nAND\r\nANY\r\nARRAY\r\nAS\r\nASC\r\nAT\r\nATTRIBUTE\r\nAUTHID\r\nAVG\r\nBEGIN\r\nBETWEEN\r\nBFILE_BASE\r\nBINARY\r\nBLOB_BASE\r\nBLOCK\r\nBODY\r\nBOTH\r\nBOUND\r\nBULK\r\nBY\r\nBYTE\r\nC\r\nCALL\r\nCALLING\r\nCASCADE\r\nCASE\r\nCHAR\r\nCHAR_BASE\r\nCHARACTER\r\nCHARSET\r\nCHARSETFORM\r\nCHARSETID\r\nCHECK\r\nCLOB_BASE\r\nCLONE\r\nCLOSE\r\nCLUSTER\r\nCLUSTERS\r\nCOLAUTH\r\nCOLLECT\r\nCOLUMNS\r\nCOMMENT\r\nCOMMIT\r\nCOMMITTED\r\nCOMPILED\r\nCOMPRESS\r\nCONNECT\r\nCONSTANT\r\nCONSTRUCTOR\r\nCONTEXT\r\nCONTINUE\r\nCONVERT\r\nCOUNT\r\nCRASH\r\nCREATE\r\nCREDENTIAL\r\nCURRENT\r\nCURSOR\r\nCUSTOMDATUM\r\nDANGLING\r\nDATA\r\nDATE\r\nDATE_BASE\r\nDAY\r\nDECLARE\r\nDEFAULT\r\nDEFINE\r\nDELETE\r\nDESC\r\nDETERMINISTIC\r\nDIRECTORY\r\nDISTINCT\r\nDOUBLE\r\nDROP\r\nDURATION\r\nELEMENT\r\nELSE\r\nELSIF\r\nEMPTY\r\nEND\r\nESCAPE\r\nEXCEPT\r\nEXCEPTION\r\nEXCEPTIONS\r\nEXCLUSIVE\r\nEXECUTE\r\nEXISTS\r\nEXIT\r\nEXTERNAL\r\nFETCH\r\nFINAL\r\nFIRST\r\nFIXED\r\nFLOAT\r\nFOR\r\nFORALL\r\nFORCE\r\nFROM\r\nFUNCTION\r\nGENERAL\r\nGOTO\r\nGRANT\r\nGROUP\r\nHASH\r\nHAVING\r\nHEAP\r\nHIDDEN\r\nHOUR\r\nIDENTIFIED\r\nIF\r\nIMMEDIATE\r\nIMMUTABLE\r\nIN\r\nINCLUDING\r\nINDEX\r\nINDEXES\r\nINDICATOR\r\nINDICES\r\nINFINITE\r\nINSERT\r\nINSTANTIABLE\r\nINT\r\nINTERFACE\r\nINTERSECT\r\nINTERVAL\r\nINTO\r\nINVALIDATE\r\nIS\r\nISOLATION\r\nJAVA\r\nLANGUAGE\r\nLARGE\r\nLEADING\r\nLENGTH\r\nLEVEL\r\nLIBRARY\r\nLIKE\r\nLIKE2\r\nLIKE4\r\nLIKEC\r\nLIMIT\r\nLIMITED\r\nLOCAL\r\nLOCK\r\nLONG\r\nLOOP\r\nMAP\r\nMAX\r\nMAXLEN\r\nMEMBER\r\nMERGE\r\nMIN\r\nMINUS\r\nMINUTE\r\nMOD\r\nMODE\r\nMODIFY\r\nMONTH\r\nMULTISET\r\nMUTABLE\r\nNAME\r\nNAN\r\nNATIONAL\r\nNATIVE\r\nNCHAR\r\nNEW\r\nNOCOMPRESS\r\nNOCOPY\r\nNOT\r\nNOWAIT\r\nNULL\r\nNUMBER_BASE\r\nOBJECT\r\nOCICOLL\r\nOCIDATE\r\nOCIDATETIME\r\nOCIDURATION\r\nOCIINTERVAL\r\nOCILOBLOCATOR\r\nOCINUMBER\r\nOCIRAW\r\nOCIREF\r\nOCIREFCURSOR\r\nOCIROWID\r\nOCISTRING\r\nOCITYPE\r\nOF\r\nOLD\r\nON\r\nONLY\r\nOPAQUE\r\nOPEN\r\nOPERATOR\r\nOPTION\r\nOR\r\nORACLE\r\nORADATA\r\nORDER\r\nORGANIZATION\r\nORLANY\r\nORLVARY\r\nOTHERS\r\nOUT\r\nOVERLAPS\r\nOVERRIDING\r\nPACKAGE\r\nPARALLEL_ENABLE\r\nPARAMETER\r\nPARAMETERS\r\nPARENT\r\nPARTITION\r\nPASCAL\r\nPERSISTABLE\r\nPIPE\r\nPIPELINED\r\nPLUGGABLE\r\nPOLYMORPHIC\r\nPRAGMA\r\nPRECISION\r\nPRIOR\r\nPRIVATE\r\nPROCEDURE\r\nPUBLIC\r\nRAISE\r\nRANGE\r\nRAW\r\nREAD\r\nRECORD\r\nREF\r\nREFERENCE\r\nRELIES_ON\r\nREM\r\nREMAINDER\r\nRENAME\r\nRESOURCE\r\nRESULT\r\nRESULT_CACHE\r\nRETURN\r\nRETURNING\r\nREVERSE\r\nREVOKE\r\nROLLBACK\r\nROW\r\nSAMPLE\r\nSAVE\r\nSAVEPOINT\r\nSB1\r\nSB2\r\nSB4\r\nSECOND\r\nSEGMENT\r\nSELECT\r\nSELF\r\nSEPARATE\r\nSEQUENCE\r\nSERIALIZABLE\r\nSET\r\nSHARE\r\nSHORT\r\nSIZE\r\nSIZE_T\r\nSOME\r\nSPARSE\r\nSQL\r\nSQLCODE\r\nSQLDATA\r\nSQLNAME\r\nSQLSTATE\r\nSTANDARD\r\nSTART\r\nSTATIC\r\nSTDDEV\r\nSTORED\r\nSTRING\r\nSTRUCT\r\nSTYLE\r\nSUBMULTISET\r\nSUBPARTITION\r\nSUBSTITUTABLE\r\nSUBTYPE\r\nSUM\r\nSYNONYM\r\nTABAUTH\r\nTABLE\r\nTDO\r\nTHE\r\nTHEN\r\nTIME\r\nTIMESTAMP\r\nTIMEZONE_ABBR\r\nTIMEZONE_HOUR\r\nTIMEZONE_MINUTE\r\nTIMEZONE_REGION\r\nTO\r\nTRAILING\r\nTRANSACTION\r\nTRANSACTIONAL\r\nTRUSTED\r\nTYPE\r\nUB1\r\nUB2\r\nUB4\r\nUNDER\r\nUNION\r\nUNIQUE\r\nUNPLUG\r\nUNSIGNED\r\nUNTRUSTED\r\nUPDATE\r\nUSE\r\nUSING\r\nVALIST\r\nVALUE\r\nVALUES\r\nVARIABLE\r\nVARIANCE\r\nVARRAY\r\nVARYING\r\nVIEW\r\nVIEWS\r\nVOID\r\nWHEN\r\nWHERE\r\nWHILE\r\nWITH\r\nWORK\r\nWRAPPED\r\nWRITE\r\nYEAR\r\nZONE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"A\"],\r\n\t[\"keyword\", \"ACCESSIBLE\"],\r\n\t[\"keyword\", \"ADD\"],\r\n\t[\"keyword\", \"AGENT\"],\r\n\t[\"keyword\", \"AGGREGATE\"],\r\n\t[\"keyword\", \"ALL\"],\r\n\t[\"keyword\", \"ALTER\"],\r\n\t[\"keyword\", \"AND\"],\r\n\t[\"keyword\", \"ANY\"],\r\n\t[\"keyword\", \"ARRAY\"],\r\n\t[\"keyword\", \"AS\"],\r\n\t[\"keyword\", \"ASC\"],\r\n\t[\"keyword\", \"AT\"],\r\n\t[\"keyword\", \"ATTRIBUTE\"],\r\n\t[\"keyword\", \"AUTHID\"],\r\n\t[\"keyword\", \"AVG\"],\r\n\t[\"keyword\", \"BEGIN\"],\r\n\t[\"keyword\", \"BETWEEN\"],\r\n\t[\"keyword\", \"BFILE_BASE\"],\r\n\t[\"keyword\", \"BINARY\"],\r\n\t[\"keyword\", \"BLOB_BASE\"],\r\n\t[\"keyword\", \"BLOCK\"],\r\n\t[\"keyword\", \"BODY\"],\r\n\t[\"keyword\", \"BOTH\"],\r\n\t[\"keyword\", \"BOUND\"],\r\n\t[\"keyword\", \"BULK\"],\r\n\t[\"keyword\", \"BY\"],\r\n\t[\"keyword\", \"BYTE\"],\r\n\t[\"keyword\", \"C\"],\r\n\t[\"keyword\", \"CALL\"],\r\n\t[\"keyword\", \"CALLING\"],\r\n\t[\"keyword\", \"CASCADE\"],\r\n\t[\"keyword\", \"CASE\"],\r\n\t[\"keyword\", \"CHAR\"],\r\n\t[\"keyword\", \"CHAR_BASE\"],\r\n\t[\"keyword\", \"CHARACTER\"],\r\n\t[\"keyword\", \"CHARSET\"],\r\n\t[\"keyword\", \"CHARSETFORM\"],\r\n\t[\"keyword\", \"CHARSETID\"],\r\n\t[\"keyword\", \"CHECK\"],\r\n\t[\"keyword\", \"CLOB_BASE\"],\r\n\t[\"keyword\", \"CLONE\"],\r\n\t[\"keyword\", \"CLOSE\"],\r\n\t[\"keyword\", \"CLUSTER\"],\r\n\t[\"keyword\", \"CLUSTERS\"],\r\n\t[\"keyword\", \"COLAUTH\"],\r\n\t[\"keyword\", \"COLLECT\"],\r\n\t[\"keyword\", \"COLUMNS\"],\r\n\t[\"keyword\", \"COMMENT\"],\r\n\t[\"keyword\", \"COMMIT\"],\r\n\t[\"keyword\", \"COMMITTED\"],\r\n\t[\"keyword\", \"COMPILED\"],\r\n\t[\"keyword\", \"COMPRESS\"],\r\n\t[\"keyword\", \"CONNECT\"],\r\n\t[\"keyword\", \"CONSTANT\"],\r\n\t[\"keyword\", \"CONSTRUCTOR\"],\r\n\t[\"keyword\", \"CONTEXT\"],\r\n\t[\"keyword\", \"CONTINUE\"],\r\n\t[\"keyword\", \"CONVERT\"],\r\n\t[\"keyword\", \"COUNT\"],\r\n\t[\"keyword\", \"CRASH\"],\r\n\t[\"keyword\", \"CREATE\"],\r\n\t[\"keyword\", \"CREDENTIAL\"],\r\n\t[\"keyword\", \"CURRENT\"],\r\n\t[\"keyword\", \"CURSOR\"],\r\n\t[\"keyword\", \"CUSTOMDATUM\"],\r\n\t[\"keyword\", \"DANGLING\"],\r\n\t[\"keyword\", \"DATA\"],\r\n\t[\"keyword\", \"DATE\"],\r\n\t[\"keyword\", \"DATE_BASE\"],\r\n\t[\"keyword\", \"DAY\"],\r\n\t[\"keyword\", \"DECLARE\"],\r\n\t[\"keyword\", \"DEFAULT\"],\r\n\t[\"keyword\", \"DEFINE\"],\r\n\t[\"keyword\", \"DELETE\"],\r\n\t[\"keyword\", \"DESC\"],\r\n\t[\"keyword\", \"DETERMINISTIC\"],\r\n\t[\"keyword\", \"DIRECTORY\"],\r\n\t[\"keyword\", \"DISTINCT\"],\r\n\t[\"keyword\", \"DOUBLE\"],\r\n\t[\"keyword\", \"DROP\"],\r\n\t[\"keyword\", \"DURATION\"],\r\n\t[\"keyword\", \"ELEMENT\"],\r\n\t[\"keyword\", \"ELSE\"],\r\n\t[\"keyword\", \"ELSIF\"],\r\n\t[\"keyword\", \"EMPTY\"],\r\n\t[\"keyword\", \"END\"],\r\n\t[\"keyword\", \"ESCAPE\"],\r\n\t[\"keyword\", \"EXCEPT\"],\r\n\t[\"keyword\", \"EXCEPTION\"],\r\n\t[\"keyword\", \"EXCEPTIONS\"],\r\n\t[\"keyword\", \"EXCLUSIVE\"],\r\n\t[\"keyword\", \"EXECUTE\"],\r\n\t[\"keyword\", \"EXISTS\"],\r\n\t[\"keyword\", \"EXIT\"],\r\n\t[\"keyword\", \"EXTERNAL\"],\r\n\t[\"keyword\", \"FETCH\"],\r\n\t[\"keyword\", \"FINAL\"],\r\n\t[\"keyword\", \"FIRST\"],\r\n\t[\"keyword\", \"FIXED\"],\r\n\t[\"keyword\", \"FLOAT\"],\r\n\t[\"keyword\", \"FOR\"],\r\n\t[\"keyword\", \"FORALL\"],\r\n\t[\"keyword\", \"FORCE\"],\r\n\t[\"keyword\", \"FROM\"],\r\n\t[\"keyword\", \"FUNCTION\"],\r\n\t[\"keyword\", \"GENERAL\"],\r\n\t[\"keyword\", \"GOTO\"],\r\n\t[\"keyword\", \"GRANT\"],\r\n\t[\"keyword\", \"GROUP\"],\r\n\t[\"keyword\", \"HASH\"],\r\n\t[\"keyword\", \"HAVING\"],\r\n\t[\"keyword\", \"HEAP\"],\r\n\t[\"keyword\", \"HIDDEN\"],\r\n\t[\"keyword\", \"HOUR\"],\r\n\t[\"keyword\", \"IDENTIFIED\"],\r\n\t[\"keyword\", \"IF\"],\r\n\t[\"keyword\", \"IMMEDIATE\"],\r\n\t[\"keyword\", \"IMMUTABLE\"],\r\n\t[\"keyword\", \"IN\"],\r\n\t[\"keyword\", \"INCLUDING\"],\r\n\t[\"keyword\", \"INDEX\"],\r\n\t[\"keyword\", \"INDEXES\"],\r\n\t[\"keyword\", \"INDICATOR\"],\r\n\t[\"keyword\", \"INDICES\"],\r\n\t[\"keyword\", \"INFINITE\"],\r\n\t[\"keyword\", \"INSERT\"],\r\n\t[\"keyword\", \"INSTANTIABLE\"],\r\n\t[\"keyword\", \"INT\"],\r\n\t[\"keyword\", \"INTERFACE\"],\r\n\t[\"keyword\", \"INTERSECT\"],\r\n\t[\"keyword\", \"INTERVAL\"],\r\n\t[\"keyword\", \"INTO\"],\r\n\t[\"keyword\", \"INVALIDATE\"],\r\n\t[\"keyword\", \"IS\"],\r\n\t[\"keyword\", \"ISOLATION\"],\r\n\t[\"keyword\", \"JAVA\"],\r\n\t[\"keyword\", \"LANGUAGE\"],\r\n\t[\"keyword\", \"LARGE\"],\r\n\t[\"keyword\", \"LEADING\"],\r\n\t[\"keyword\", \"LENGTH\"],\r\n\t[\"keyword\", \"LEVEL\"],\r\n\t[\"keyword\", \"LIBRARY\"],\r\n\t[\"keyword\", \"LIKE\"],\r\n\t[\"keyword\", \"LIKE2\"],\r\n\t[\"keyword\", \"LIKE4\"],\r\n\t[\"keyword\", \"LIKEC\"],\r\n\t[\"keyword\", \"LIMIT\"],\r\n\t[\"keyword\", \"LIMITED\"],\r\n\t[\"keyword\", \"LOCAL\"],\r\n\t[\"keyword\", \"LOCK\"],\r\n\t[\"keyword\", \"LONG\"],\r\n\t[\"keyword\", \"LOOP\"],\r\n\t[\"keyword\", \"MAP\"],\r\n\t[\"keyword\", \"MAX\"],\r\n\t[\"keyword\", \"MAXLEN\"],\r\n\t[\"keyword\", \"MEMBER\"],\r\n\t[\"keyword\", \"MERGE\"],\r\n\t[\"keyword\", \"MIN\"],\r\n\t[\"keyword\", \"MINUS\"],\r\n\t[\"keyword\", \"MINUTE\"],\r\n\t[\"keyword\", \"MOD\"],\r\n\t[\"keyword\", \"MODE\"],\r\n\t[\"keyword\", \"MODIFY\"],\r\n\t[\"keyword\", \"MONTH\"],\r\n\t[\"keyword\", \"MULTISET\"],\r\n\t[\"keyword\", \"MUTABLE\"],\r\n\t[\"keyword\", \"NAME\"],\r\n\t[\"keyword\", \"NAN\"],\r\n\t[\"keyword\", \"NATIONAL\"],\r\n\t[\"keyword\", \"NATIVE\"],\r\n\t[\"keyword\", \"NCHAR\"],\r\n\t[\"keyword\", \"NEW\"],\r\n\t[\"keyword\", \"NOCOMPRESS\"],\r\n\t[\"keyword\", \"NOCOPY\"],\r\n\t[\"keyword\", \"NOT\"],\r\n\t[\"keyword\", \"NOWAIT\"],\r\n\t[\"keyword\", \"NULL\"],\r\n\t[\"keyword\", \"NUMBER_BASE\"],\r\n\t[\"keyword\", \"OBJECT\"],\r\n\t[\"keyword\", \"OCICOLL\"],\r\n\t[\"keyword\", \"OCIDATE\"],\r\n\t[\"keyword\", \"OCIDATETIME\"],\r\n\t[\"keyword\", \"OCIDURATION\"],\r\n\t[\"keyword\", \"OCIINTERVAL\"],\r\n\t[\"keyword\", \"OCILOBLOCATOR\"],\r\n\t[\"keyword\", \"OCINUMBER\"],\r\n\t[\"keyword\", \"OCIRAW\"],\r\n\t[\"keyword\", \"OCIREF\"],\r\n\t[\"keyword\", \"OCIREFCURSOR\"],\r\n\t[\"keyword\", \"OCIROWID\"],\r\n\t[\"keyword\", \"OCISTRING\"],\r\n\t[\"keyword\", \"OCITYPE\"],\r\n\t[\"keyword\", \"OF\"],\r\n\t[\"keyword\", \"OLD\"],\r\n\t[\"keyword\", \"ON\"],\r\n\t[\"keyword\", \"ONLY\"],\r\n\t[\"keyword\", \"OPAQUE\"],\r\n\t[\"keyword\", \"OPEN\"],\r\n\t[\"keyword\", \"OPERATOR\"],\r\n\t[\"keyword\", \"OPTION\"],\r\n\t[\"keyword\", \"OR\"],\r\n\t[\"keyword\", \"ORACLE\"],\r\n\t[\"keyword\", \"ORADATA\"],\r\n\t[\"keyword\", \"ORDER\"],\r\n\t[\"keyword\", \"ORGANIZATION\"],\r\n\t[\"keyword\", \"ORLANY\"],\r\n\t[\"keyword\", \"ORLVARY\"],\r\n\t[\"keyword\", \"OTHERS\"],\r\n\t[\"keyword\", \"OUT\"],\r\n\t[\"keyword\", \"OVERLAPS\"],\r\n\t[\"keyword\", \"OVERRIDING\"],\r\n\t[\"keyword\", \"PACKAGE\"],\r\n\t[\"keyword\", \"PARALLEL_ENABLE\"],\r\n\t[\"keyword\", \"PARAMETER\"],\r\n\t[\"keyword\", \"PARAMETERS\"],\r\n\t[\"keyword\", \"PARENT\"],\r\n\t[\"keyword\", \"PARTITION\"],\r\n\t[\"keyword\", \"PASCAL\"],\r\n\t[\"keyword\", \"PERSISTABLE\"],\r\n\t[\"keyword\", \"PIPE\"],\r\n\t[\"keyword\", \"PIPELINED\"],\r\n\t[\"keyword\", \"PLUGGABLE\"],\r\n\t[\"keyword\", \"POLYMORPHIC\"],\r\n\t[\"keyword\", \"PRAGMA\"],\r\n\t[\"keyword\", \"PRECISION\"],\r\n\t[\"keyword\", \"PRIOR\"],\r\n\t[\"keyword\", \"PRIVATE\"],\r\n\t[\"keyword\", \"PROCEDURE\"],\r\n\t[\"keyword\", \"PUBLIC\"],\r\n\t[\"keyword\", \"RAISE\"],\r\n\t[\"keyword\", \"RANGE\"],\r\n\t[\"keyword\", \"RAW\"],\r\n\t[\"keyword\", \"READ\"],\r\n\t[\"keyword\", \"RECORD\"],\r\n\t[\"keyword\", \"REF\"],\r\n\t[\"keyword\", \"REFERENCE\"],\r\n\t[\"keyword\", \"RELIES_ON\"],\r\n\t[\"keyword\", \"REM\"],\r\n\t[\"keyword\", \"REMAINDER\"],\r\n\t[\"keyword\", \"RENAME\"],\r\n\t[\"keyword\", \"RESOURCE\"],\r\n\t[\"keyword\", \"RESULT\"],\r\n\t[\"keyword\", \"RESULT_CACHE\"],\r\n\t[\"keyword\", \"RETURN\"],\r\n\t[\"keyword\", \"RETURNING\"],\r\n\t[\"keyword\", \"REVERSE\"],\r\n\t[\"keyword\", \"REVOKE\"],\r\n\t[\"keyword\", \"ROLLBACK\"],\r\n\t[\"keyword\", \"ROW\"],\r\n\t[\"keyword\", \"SAMPLE\"],\r\n\t[\"keyword\", \"SAVE\"],\r\n\t[\"keyword\", \"SAVEPOINT\"],\r\n\t[\"keyword\", \"SB1\"],\r\n\t[\"keyword\", \"SB2\"],\r\n\t[\"keyword\", \"SB4\"],\r\n\t[\"keyword\", \"SECOND\"],\r\n\t[\"keyword\", \"SEGMENT\"],\r\n\t[\"keyword\", \"SELECT\"],\r\n\t[\"keyword\", \"SELF\"],\r\n\t[\"keyword\", \"SEPARATE\"],\r\n\t[\"keyword\", \"SEQUENCE\"],\r\n\t[\"keyword\", \"SERIALIZABLE\"],\r\n\t[\"keyword\", \"SET\"],\r\n\t[\"keyword\", \"SHARE\"],\r\n\t[\"keyword\", \"SHORT\"],\r\n\t[\"keyword\", \"SIZE\"],\r\n\t[\"keyword\", \"SIZE_T\"],\r\n\t[\"keyword\", \"SOME\"],\r\n\t[\"keyword\", \"SPARSE\"],\r\n\t[\"keyword\", \"SQL\"],\r\n\t[\"keyword\", \"SQLCODE\"],\r\n\t[\"keyword\", \"SQLDATA\"],\r\n\t[\"keyword\", \"SQLNAME\"],\r\n\t[\"keyword\", \"SQLSTATE\"],\r\n\t[\"keyword\", \"STANDARD\"],\r\n\t[\"keyword\", \"START\"],\r\n\t[\"keyword\", \"STATIC\"],\r\n\t[\"keyword\", \"STDDEV\"],\r\n\t[\"keyword\", \"STORED\"],\r\n\t[\"keyword\", \"STRING\"],\r\n\t[\"keyword\", \"STRUCT\"],\r\n\t[\"keyword\", \"STYLE\"],\r\n\t[\"keyword\", \"SUBMULTISET\"],\r\n\t[\"keyword\", \"SUBPARTITION\"],\r\n\t[\"keyword\", \"SUBSTITUTABLE\"],\r\n\t[\"keyword\", \"SUBTYPE\"],\r\n\t[\"keyword\", \"SUM\"],\r\n\t[\"keyword\", \"SYNONYM\"],\r\n\t[\"keyword\", \"TABAUTH\"],\r\n\t[\"keyword\", \"TABLE\"],\r\n\t[\"keyword\", \"TDO\"],\r\n\t[\"keyword\", \"THE\"],\r\n\t[\"keyword\", \"THEN\"],\r\n\t[\"keyword\", \"TIME\"],\r\n\t[\"keyword\", \"TIMESTAMP\"],\r\n\t[\"keyword\", \"TIMEZONE_ABBR\"],\r\n\t[\"keyword\", \"TIMEZONE_HOUR\"],\r\n\t[\"keyword\", \"TIMEZONE_MINUTE\"],\r\n\t[\"keyword\", \"TIMEZONE_REGION\"],\r\n\t[\"keyword\", \"TO\"],\r\n\t[\"keyword\", \"TRAILING\"],\r\n\t[\"keyword\", \"TRANSACTION\"],\r\n\t[\"keyword\", \"TRANSACTIONAL\"],\r\n\t[\"keyword\", \"TRUSTED\"],\r\n\t[\"keyword\", \"TYPE\"],\r\n\t[\"keyword\", \"UB1\"],\r\n\t[\"keyword\", \"UB2\"],\r\n\t[\"keyword\", \"UB4\"],\r\n\t[\"keyword\", \"UNDER\"],\r\n\t[\"keyword\", \"UNION\"],\r\n\t[\"keyword\", \"UNIQUE\"],\r\n\t[\"keyword\", \"UNPLUG\"],\r\n\t[\"keyword\", \"UNSIGNED\"],\r\n\t[\"keyword\", \"UNTRUSTED\"],\r\n\t[\"keyword\", \"UPDATE\"],\r\n\t[\"keyword\", \"USE\"],\r\n\t[\"keyword\", \"USING\"],\r\n\t[\"keyword\", \"VALIST\"],\r\n\t[\"keyword\", \"VALUE\"],\r\n\t[\"keyword\", \"VALUES\"],\r\n\t[\"keyword\", \"VARIABLE\"],\r\n\t[\"keyword\", \"VARIANCE\"],\r\n\t[\"keyword\", \"VARRAY\"],\r\n\t[\"keyword\", \"VARYING\"],\r\n\t[\"keyword\", \"VIEW\"],\r\n\t[\"keyword\", \"VIEWS\"],\r\n\t[\"keyword\", \"VOID\"],\r\n\t[\"keyword\", \"WHEN\"],\r\n\t[\"keyword\", \"WHERE\"],\r\n\t[\"keyword\", \"WHILE\"],\r\n\t[\"keyword\", \"WITH\"],\r\n\t[\"keyword\", \"WORK\"],\r\n\t[\"keyword\", \"WRAPPED\"],\r\n\t[\"keyword\", \"WRITE\"],\r\n\t[\"keyword\", \"YEAR\"],\r\n\t[\"keyword\", \"ZONE\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/plsql/label_feature.test",
    "content": "<< foo >>\n\n----------------------------------------------------\n\n[\n\t[\"label\", \"<< foo >>\"]\n]\n"
  },
  {
    "path": "tests/languages/plsql/operator_feature.test",
    "content": "+ - * / **\r\n:= :\r\n=>\r\n%\r\n||\r\n..\r\n\r\n= != <> ~= ^= < > <= >=\r\n@\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"**\"],\r\n\t[\"operator\", \":=\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"..\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"~=\"],\r\n\t[\"operator\", \"^=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">=\"],\r\n\r\n\t[\"operator\", \"@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/powerquery/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for boolean."
  },
  {
    "path": "tests/languages/powerquery/comment_feature.test",
    "content": "/**/\r\n/* foo\r\nbar */\r\n//\r\n// foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foo\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/powerquery/constant_feature.test",
    "content": "Day.Sunday\r\nDay.Monday\r\nDay.Tuesday\r\nDay.Wednesday\r\nDay.Thursday\r\nDay.Friday\r\nDay.Saturday\r\nTraceLevel.Critical\r\nTraceLevel.Error\r\nTraceLevel.Information\r\nTraceLevel.Verbose\r\nTraceLevel.Warning\r\nOccurrence.First\r\nOccurrence.Last\r\nOccurrence.All\r\nOrder.Ascending\r\nOrder.Descending\r\nRoundingMode.AwayFromZero\r\nRoundingMode.Down\r\nRoundingMode.ToEven\r\nRoundingMode.TowardZero\r\nRoundingMode.Up\r\nMissingField.Error\r\nMissingField.Ignore\r\nMissingField.UseNull\r\nQuoteStyle.Csv\r\nQuoteStyle.None\r\nJoinKind.Inner\r\nJoinKind.LeftOuter\r\nJoinKind.RightOuter\r\nJoinKind.FullOuter\r\nJoinKind.LeftAnti\r\nJoinKind.RightAnti\r\nGroupKind.Global\r\nGroupKind.Local\r\nExtraValues.List\r\nExtraValues.Ignore\r\nExtraValues.Error\r\nJoinAlgorithm.Dynamic\r\nJoinAlgorithm.PairwiseHash\r\nJoinAlgorithm.SortMerge\r\nJoinAlgorithm.LeftHash\r\nJoinAlgorithm.RightHash\r\nJoinAlgorithm.LeftIndex\r\nJoinAlgorithm.RightIndex\r\nJoinSide.Left\r\nJoinSide.Right\r\nPrecision.Double\r\nPrecision.Decimal\r\nRelativePosition.FromEnd\r\nRelativePosition.FromStart\r\nTextEncoding.Ascii\r\nTextEncoding.BigEndianUnicode\r\nTextEncoding.Unicode\r\nTextEncoding.Utf8\r\nTextEncoding.Utf16\r\nTextEncoding.Windows\r\nAny.Type\r\nBinary.Type\r\nDate.Type\r\nDateTime.Type\r\nDateTimeZone.Type\r\nDuration.Type\r\nInt8.Type\r\nInt16.Type\r\nInt32.Type\r\nInt64.Type\r\nFunction.Type\r\nList.Type\r\nLogical.Type\r\nNone.Type\r\nNumber.Type\r\nRecord.Type\r\nTable.Type\r\nText.Type\r\nTime.Type\r\nnull\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"Day.Sunday\"],\r\n\t[\"constant\", \"Day.Monday\"],\r\n\t[\"constant\", \"Day.Tuesday\"],\r\n\t[\"constant\", \"Day.Wednesday\"],\r\n\t[\"constant\", \"Day.Thursday\"],\r\n\t[\"constant\", \"Day.Friday\"],\r\n\t[\"constant\", \"Day.Saturday\"],\r\n\t[\"constant\", \"TraceLevel.Critical\"],\r\n\t[\"constant\", \"TraceLevel.Error\"],\r\n\t[\"constant\", \"TraceLevel.Information\"],\r\n\t[\"constant\", \"TraceLevel.Verbose\"],\r\n\t[\"constant\", \"TraceLevel.Warning\"],\r\n\t[\"constant\", \"Occurrence.First\"],\r\n\t[\"constant\", \"Occurrence.Last\"],\r\n\t[\"constant\", \"Occurrence.All\"],\r\n\t[\"constant\", \"Order.Ascending\"],\r\n\t[\"constant\", \"Order.Descending\"],\r\n\t[\"constant\", \"RoundingMode.AwayFromZero\"],\r\n\t[\"constant\", \"RoundingMode.Down\"],\r\n\t[\"constant\", \"RoundingMode.ToEven\"],\r\n\t[\"constant\", \"RoundingMode.TowardZero\"],\r\n\t[\"constant\", \"RoundingMode.Up\"],\r\n\t[\"constant\", \"MissingField.Error\"],\r\n\t[\"constant\", \"MissingField.Ignore\"],\r\n\t[\"constant\", \"MissingField.UseNull\"],\r\n\t[\"constant\", \"QuoteStyle.Csv\"],\r\n\t[\"constant\", \"QuoteStyle.None\"],\r\n\t[\"constant\", \"JoinKind.Inner\"],\r\n\t[\"constant\", \"JoinKind.LeftOuter\"],\r\n\t[\"constant\", \"JoinKind.RightOuter\"],\r\n\t[\"constant\", \"JoinKind.FullOuter\"],\r\n\t[\"constant\", \"JoinKind.LeftAnti\"],\r\n\t[\"constant\", \"JoinKind.RightAnti\"],\r\n\t[\"constant\", \"GroupKind.Global\"],\r\n\t[\"constant\", \"GroupKind.Local\"],\r\n\t[\"constant\", \"ExtraValues.List\"],\r\n\t[\"constant\", \"ExtraValues.Ignore\"],\r\n\t[\"constant\", \"ExtraValues.Error\"],\r\n\t[\"constant\", \"JoinAlgorithm.Dynamic\"],\r\n\t[\"constant\", \"JoinAlgorithm.PairwiseHash\"],\r\n\t[\"constant\", \"JoinAlgorithm.SortMerge\"],\r\n\t[\"constant\", \"JoinAlgorithm.LeftHash\"],\r\n\t[\"constant\", \"JoinAlgorithm.RightHash\"],\r\n\t[\"constant\", \"JoinAlgorithm.LeftIndex\"],\r\n\t[\"constant\", \"JoinAlgorithm.RightIndex\"],\r\n\t[\"constant\", \"JoinSide.Left\"],\r\n\t[\"constant\", \"JoinSide.Right\"],\r\n\t[\"constant\", \"Precision.Double\"],\r\n\t[\"constant\", \"Precision.Decimal\"],\r\n\t[\"constant\", \"RelativePosition.FromEnd\"],\r\n\t[\"constant\", \"RelativePosition.FromStart\"],\r\n\t[\"constant\", \"TextEncoding.Ascii\"],\r\n\t[\"constant\", \"TextEncoding.BigEndianUnicode\"],\r\n\t[\"constant\", \"TextEncoding.Unicode\"],\r\n\t[\"constant\", \"TextEncoding.Utf8\"],\r\n\t[\"constant\", \"TextEncoding.Utf16\"],\r\n\t[\"constant\", \"TextEncoding.Windows\"],\r\n\t[\"constant\", \"Any.Type\"],\r\n\t[\"constant\", \"Binary.Type\"],\r\n\t[\"constant\", \"Date.Type\"],\r\n\t[\"constant\", \"DateTime.Type\"],\r\n\t[\"constant\", \"DateTimeZone.Type\"],\r\n\t[\"constant\", \"Duration.Type\"],\r\n\t[\"constant\", \"Int8.Type\"],\r\n\t[\"constant\", \"Int16.Type\"],\r\n\t[\"constant\", \"Int32.Type\"],\r\n\t[\"constant\", \"Int64.Type\"],\r\n\t[\"constant\", \"Function.Type\"],\r\n\t[\"constant\", \"List.Type\"],\r\n\t[\"constant\", \"Logical.Type\"],\r\n\t[\"constant\", \"None.Type\"],\r\n\t[\"constant\", \"Number.Type\"],\r\n\t[\"constant\", \"Record.Type\"],\r\n\t[\"constant\", \"Table.Type\"],\r\n\t[\"constant\", \"Text.Type\"],\r\n\t[\"constant\", \"Time.Type\"],\r\n\t[\"constant\", \"null\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for contant."
  },
  {
    "path": "tests/languages/powerquery/datatype_feature.test",
    "content": "any\r\nanynonnull\r\nbinary\r\ndate\r\ndatetime\r\ndatetimezone\r\nduration\r\nfunction\r\nlist\r\nlogical\r\nnone\r\nnumber\r\nrecord\r\ntable\r\ntext\r\ntime\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"data-type\", \"any\"],\r\n\t[\"data-type\", \"anynonnull\"],\r\n\t[\"data-type\", \"binary\"],\r\n\t[\"data-type\", \"date\"],\r\n\t[\"data-type\", \"datetime\"],\r\n\t[\"data-type\", \"datetimezone\"],\r\n\t[\"data-type\", \"duration\"],\r\n\t[\"data-type\", \"function\"],\r\n\t[\"data-type\", \"list\"],\r\n\t[\"data-type\", \"logical\"],\r\n\t[\"data-type\", \"none\"],\r\n\t[\"data-type\", \"number\"],\r\n\t[\"data-type\", \"record\"],\r\n\t[\"data-type\", \"table\"],\r\n\t[\"data-type\", \"text\"],\r\n\t[\"data-type\", \"time\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for data-type."
  },
  {
    "path": "tests/languages/powerquery/function_feature.test",
    "content": "Table.ReplaceValue (\r\nUserDefinedFunction (\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"Table.ReplaceValue\"], [\"punctuation\",\"(\"],\r\n\t[\"function\", \"UserDefinedFunction\"], [\"punctuation\",\"(\"]\r\n\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/powerquery/keyword_feature.test",
    "content": "and\r\nas\r\neach\r\nelse\r\nerror\r\nif\r\nin\r\nis\r\nlet\r\nmeta\r\nnot\r\notherwise\r\nor\r\nsection\r\nshared\r\nthen\r\ntry\r\ntype\r\n#binary\r\n#date\r\n#datetime\r\n#datetimezone\r\n#duration\r\n#infinity\r\n#nan\r\n#sections\r\n#shared\r\n#table\r\n#time\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"and\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"each\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"error\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"meta\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"otherwise\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"section\"],\r\n\t[\"keyword\", \"shared\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"#binary\"],\r\n\t[\"keyword\", \"#date\"],\r\n\t[\"keyword\", \"#datetime\"],\r\n\t[\"keyword\", \"#datetimezone\"],\r\n\t[\"keyword\", \"#duration\"],\r\n\t[\"keyword\", \"#infinity\"],\r\n\t[\"keyword\", \"#nan\"],\r\n\t[\"keyword\", \"#sections\"],\r\n\t[\"keyword\", \"#shared\"],\r\n\t[\"keyword\", \"#table\"],\r\n\t[\"keyword\", \"#time\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/powerquery/number_feature.test",
    "content": "42\r\n-42\r\n+42\r\n0.154\r\n.123\r\n0xF2\r\n42e5\r\n42.5e2\r\n123\r\n123e45\r\n123e+45\r\n123e-45\r\n123E45\r\n123E+45\r\n123E-45\r\n123.78e-45\r\n.78e-45\r\n123..456\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"-42\"],\r\n\t[\"number\", \"+42\"],\r\n\t[\"number\", \"0.154\"],\r\n\t[\"number\", \".123\"],\r\n\t[\"number\", \"0xF2\"],\r\n\t[\"number\", \"42e5\"],\r\n\t[\"number\", \"42.5e2\"],\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"123e45\"],\r\n\t[\"number\", \"123e+45\"],\r\n\t[\"number\", \"123e-45\"],\r\n\t[\"number\", \"123E45\"],\r\n\t[\"number\", \"123E+45\"],\r\n\t[\"number\", \"123E-45\"],\r\n\t[\"number\", \"123.78e-45\"],\r\n\t[\"number\", \".78e-45\"],\r\n\t[\"number\", \"123\"], [\"operator\", \"..\"], [\"number\", \"456\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for number feature."
  },
  {
    "path": "tests/languages/powerquery/operator_feature.test",
    "content": "+ - * / ^\r\n= > >= < <= <> \r\n& @ ?\r\n=>\r\n.. ...\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"^\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<>\"],     \r\n\t[\"operator\", \"&\"], [\"operator\", \"@\"], [\"operator\", \"?\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"operator\", \"..\"], [\"operator\", \"...\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/powerquery/quoted_identifier_feature.test",
    "content": "#\"foo\"\r\n#\"foo bar\"\r\n#\"foo'bar\"\r\n#\"foo\"\"bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"quoted-identifier\", \"#\\\"foo\\\"\"],\r\n\t[\"quoted-identifier\", \"#\\\"foo bar\\\"\"],\r\n\t[\"quoted-identifier\", \"#\\\"foo'bar\\\"\"],\r\n\t[\"quoted-identifier\", \"#\\\"foo\\\"\\\"bar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for quoted-identifier."
  },
  {
    "path": "tests/languages/powerquery/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n\"foo\"\"bar\"\r\n\r\n#!\"Hello world#(cr,lf)\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\\\"bar\\\"\"],\r\n\r\n\t[\"string\", \"#!\\\"Hello world#(cr,lf)\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/powershell/boolean_feature.test",
    "content": "$true $True $TRUE\r\n$false $False $FALSE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"$true\"],\r\n\t[\"boolean\", \"$True\"],\r\n\t[\"boolean\", \"$TRUE\"],\r\n\t\r\n\t[\"boolean\", \"$false\"],\r\n\t[\"boolean\", \"$False\"],\r\n\t[\"boolean\", \"$FALSE\"]\r\n\r\n]\r\n----------------------------------------------------\r\n\r\nTesting Booleans"
  },
  {
    "path": "tests/languages/powershell/comment_feature.test",
    "content": "# single comment\r\n# comment with $variable\r\n<# multi\r\n\tline\r\n\tcomment\r\n#>\r\nnot a `# comment # is a comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"# single comment\"],\r\n\t[\"comment\", \"# comment with $variable\"],\r\n\t[\"comment\", \"<# multi\\r\\n\\tline\\r\\n\\tcomment\\r\\n#>\"],\r\n\t\"\\r\\nnot a `# comment \",\r\n\t[\"comment\", \"# is a comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTesting comments"
  },
  {
    "path": "tests/languages/powershell/function_feature.test",
    "content": "ac cat chdir clc cli clp clv compare copy cp cpi cpp cvpa dbp del diff dir ebp\r\necho epal epcsv epsn erase fc fl ft fw gal gbp gc gci gcs gdr gi gl gm gp gps\r\ngroup gsv gu gv gwmi iex ii ipal ipcsv ipsn irm iwmi iwr kill lp ls measure mi\r\nmount move mp mv nal ndr ni nv ogv popd ps pushd pwd rbp rd rdr ren ri rm rmdir\r\nrni rnp rp rv rvpa rwmi sal saps sasv sbp sc select set shcm si sl sleep sls\r\nsort sp spps spsv start sv swmi tee trcm type write\r\n\r\nAdd-Computer Add-Content Add-History Add-Member Add-PSSnapin Add-Type\r\nCheckpoint-Computer Clear-Content Clear-EventLog Clear-History Clear-Item\r\nClear-ItemProperty Clear-Variable Compare-Object Complete-Transaction\r\nConnect-PSSession ConvertFrom-Csv ConvertFrom-Json ConvertFrom-StringData\r\nConvert-Path ConvertTo-Csv ConvertTo-Html ConvertTo-Json ConvertTo-Xml\r\nCopy-Item Copy-ItemProperty Debug-Process Disable-ComputerRestore\r\nDisable-PSBreakpoint Disable-PSRemoting Disable-PSSessionConfiguration\r\nDisconnect-PSSession Enable-ComputerRestore Enable-PSBreakpoint\r\nEnable-PSRemoting Enable-PSSessionConfiguration Enter-PSSession Exit-PSSession\r\nExport-Alias Export-Clixml Export-Console Export-Csv Export-FormatData\r\nExport-ModuleMember Export-PSSession ForEach-Object Format-Custom Format-List\r\nFormat-Table Format-Wide Get-Alias Get-ChildItem Get-Command\r\nGet-ComputerRestorePoint Get-Content Get-ControlPanelItem Get-Culture Get-Date\r\nGet-Event Get-EventLog Get-EventSubscriber Get-FormatData Get-Help Get-History\r\nGet-Host Get-HotFix Get-Item Get-ItemProperty Get-Job Get-Location Get-Member\r\nGet-Module Get-Process Get-PSBreakpoint Get-PSCallStack Get-PSDrive\r\nGet-PSProvider Get-PSSession Get-PSSessionConfiguration Get-PSSnapin Get-Random\r\nGet-Service Get-TraceSource Get-Transaction Get-TypeData Get-UICulture\r\nGet-Unique Get-Variable Get-WmiObject Group-Object Import-Alias Import-Clixml\r\nImport-Csv Import-LocalizedData Import-Module Import-PSSession Invoke-Command\r\nInvoke-Expression Invoke-History Invoke-Item Invoke-RestMethod Invoke-WebRequest\r\nInvoke-WmiMethod Join-Path Limit-EventLog Measure-Command Measure-Object\r\nMove-Item Move-ItemProperty New-Alias New-Event New-EventLog New-Item\r\nNew-ItemProperty New-Module New-ModuleManifest New-Object New-PSDrive\r\nNew-PSSession New-PSSessionConfigurationFile New-PSSessionOption\r\nNew-PSTransportOption New-Service New-TimeSpan New-Variable New-WebServiceProxy\r\nOut-Default Out-File Out-GridView Out-Host Out-Null Out-Printer Out-String\r\nPop-Location Push-Location Read-Host Receive-Job Receive-PSSession\r\nRegister-EngineEvent Register-ObjectEvent Register-PSSessionConfiguration\r\nRegister-WmiEvent Remove-Computer Remove-Event Remove-EventLog Remove-Item\r\nRemove-ItemProperty Remove-Job Remove-Module Remove-PSBreakpoint Remove-PSDrive\r\nRemove-PSSession Remove-PSSnapin Remove-TypeData Remove-Variable\r\nRemove-WmiObject Rename-Computer Rename-Item Rename-ItemProperty\r\nReset-ComputerMachinePassword Resolve-Path Restart-Computer Restart-Service\r\nRestore-Computer Resume-Job Resume-Service Save-Help Select-Object Select-String\r\nSelect-Xml Send-MailMessage Set-Alias Set-Content Set-Date Set-Item\r\nSet-ItemProperty Set-Location Set-PSBreakpoint Set-PSDebug\r\nSet-PSSessionConfiguration Set-Service Set-StrictMode Set-TraceSource\r\nSet-Variable Set-WmiInstance Show-Command Show-ControlPanelItem Show-EventLog\r\nSort-Object Split-Path Start-Job Start-Process Start-Service Start-Sleep\r\nStart-Transaction Stop-Computer Stop-Job Stop-Process Stop-Service Suspend-Job\r\nSuspend-Service Tee-Object Test-ComputerSecureChannel Test-Connection\r\nTest-ModuleManifest Test-Path Test-PSSessionConfigurationFile Trace-Command\r\nUnblock-File Undo-Transaction Unregister-Event\r\nUnregister-PSSessionConfiguration Update-FormatData Update-Help Update-List\r\nUpdate-TypeData Use-Transaction Wait-Event Wait-Job Wait-Process Where-Object\r\nWrite-Debug Write-Error Write-EventLog Write-Host Write-Output Write-Progress\r\nWrite-Verbose Write-Warning\r\nGet-AppxPackage\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"ac\"],\r\n\t[\"function\", \"cat\"],\r\n\t[\"function\", \"chdir\"],\r\n\t[\"function\", \"clc\"],\r\n\t[\"function\", \"cli\"],\r\n\t[\"function\", \"clp\"],\r\n\t[\"function\", \"clv\"],\r\n\t[\"function\", \"compare\"],\r\n\t[\"function\", \"copy\"],\r\n\t[\"function\", \"cp\"],\r\n\t[\"function\", \"cpi\"],\r\n\t[\"function\", \"cpp\"],\r\n\t[\"function\", \"cvpa\"],\r\n\t[\"function\", \"dbp\"],\r\n\t[\"function\", \"del\"],\r\n\t[\"function\", \"diff\"],\r\n\t[\"function\", \"dir\"],\r\n\t[\"function\", \"ebp\"],\r\n\t[\"function\", \"echo\"],\r\n\t[\"function\", \"epal\"],\r\n\t[\"function\", \"epcsv\"],\r\n\t[\"function\", \"epsn\"],\r\n\t[\"function\", \"erase\"],\r\n\t[\"function\", \"fc\"],\r\n\t[\"function\", \"fl\"],\r\n\t[\"function\", \"ft\"],\r\n\t[\"function\", \"fw\"],\r\n\t[\"function\", \"gal\"],\r\n\t[\"function\", \"gbp\"],\r\n\t[\"function\", \"gc\"],\r\n\t[\"function\", \"gci\"],\r\n\t[\"function\", \"gcs\"],\r\n\t[\"function\", \"gdr\"],\r\n\t[\"function\", \"gi\"],\r\n\t[\"function\", \"gl\"],\r\n\t[\"function\", \"gm\"],\r\n\t[\"function\", \"gp\"],\r\n\t[\"function\", \"gps\"],\r\n\t[\"function\", \"group\"],\r\n\t[\"function\", \"gsv\"],\r\n\t[\"function\", \"gu\"],\r\n\t[\"function\", \"gv\"],\r\n\t[\"function\", \"gwmi\"],\r\n\t[\"function\", \"iex\"],\r\n\t[\"function\", \"ii\"],\r\n\t[\"function\", \"ipal\"],\r\n\t[\"function\", \"ipcsv\"],\r\n\t[\"function\", \"ipsn\"],\r\n\t[\"function\", \"irm\"],\r\n\t[\"function\", \"iwmi\"],\r\n\t[\"function\", \"iwr\"],\r\n\t[\"function\", \"kill\"],\r\n\t[\"function\", \"lp\"],\r\n\t[\"function\", \"ls\"],\r\n\t[\"function\", \"measure\"],\r\n\t[\"function\", \"mi\"],\r\n\t[\"function\", \"mount\"],\r\n\t[\"function\", \"move\"],\r\n\t[\"function\", \"mp\"],\r\n\t[\"function\", \"mv\"],\r\n\t[\"function\", \"nal\"],\r\n\t[\"function\", \"ndr\"],\r\n\t[\"function\", \"ni\"],\r\n\t[\"function\", \"nv\"],\r\n\t[\"function\", \"ogv\"],\r\n\t[\"function\", \"popd\"],\r\n\t[\"function\", \"ps\"],\r\n\t[\"function\", \"pushd\"],\r\n\t[\"function\", \"pwd\"],\r\n\t[\"function\", \"rbp\"],\r\n\t[\"function\", \"rd\"],\r\n\t[\"function\", \"rdr\"],\r\n\t[\"function\", \"ren\"],\r\n\t[\"function\", \"ri\"],\r\n\t[\"function\", \"rm\"],\r\n\t[\"function\", \"rmdir\"],\r\n\t[\"function\", \"rni\"],\r\n\t[\"function\", \"rnp\"],\r\n\t[\"function\", \"rp\"],\r\n\t[\"function\", \"rv\"],\r\n\t[\"function\", \"rvpa\"],\r\n\t[\"function\", \"rwmi\"],\r\n\t[\"function\", \"sal\"],\r\n\t[\"function\", \"saps\"],\r\n\t[\"function\", \"sasv\"],\r\n\t[\"function\", \"sbp\"],\r\n\t[\"function\", \"sc\"],\r\n\t[\"function\", \"select\"],\r\n\t[\"function\", \"set\"],\r\n\t[\"function\", \"shcm\"],\r\n\t[\"function\", \"si\"],\r\n\t[\"function\", \"sl\"],\r\n\t[\"function\", \"sleep\"],\r\n\t[\"function\", \"sls\"],\r\n\t[\"function\", \"sort\"],\r\n\t[\"function\", \"sp\"],\r\n\t[\"function\", \"spps\"],\r\n\t[\"function\", \"spsv\"],\r\n\t[\"function\", \"start\"],\r\n\t[\"function\", \"sv\"],\r\n\t[\"function\", \"swmi\"],\r\n\t[\"function\", \"tee\"],\r\n\t[\"function\", \"trcm\"],\r\n\t[\"function\", \"type\"],\r\n\t[\"function\", \"write\"],\r\n\r\n\t[\"function\", \"Add-Computer\"],\r\n\t[\"function\", \"Add-Content\"],\r\n\t[\"function\", \"Add-History\"],\r\n\t[\"function\", \"Add-Member\"],\r\n\t[\"function\", \"Add-PSSnapin\"],\r\n\t[\"function\", \"Add-Type\"],\r\n\t[\"function\", \"Checkpoint-Computer\"],\r\n\t[\"function\", \"Clear-Content\"],\r\n\t[\"function\", \"Clear-EventLog\"],\r\n\t[\"function\", \"Clear-History\"],\r\n\t[\"function\", \"Clear-Item\"],\r\n\t[\"function\", \"Clear-ItemProperty\"],\r\n\t[\"function\", \"Clear-Variable\"],\r\n\t[\"function\", \"Compare-Object\"],\r\n\t[\"function\", \"Complete-Transaction\"],\r\n\t[\"function\", \"Connect-PSSession\"],\r\n\t[\"function\", \"ConvertFrom-Csv\"],\r\n\t[\"function\", \"ConvertFrom-Json\"],\r\n\t[\"function\", \"ConvertFrom-StringData\"],\r\n\t[\"function\", \"Convert-Path\"],\r\n\t[\"function\", \"ConvertTo-Csv\"],\r\n\t[\"function\", \"ConvertTo-Html\"],\r\n\t[\"function\", \"ConvertTo-Json\"],\r\n\t[\"function\", \"ConvertTo-Xml\"],\r\n\t[\"function\", \"Copy-Item\"],\r\n\t[\"function\", \"Copy-ItemProperty\"],\r\n\t[\"function\", \"Debug-Process\"],\r\n\t[\"function\", \"Disable-ComputerRestore\"],\r\n\t[\"function\", \"Disable-PSBreakpoint\"],\r\n\t[\"function\", \"Disable-PSRemoting\"],\r\n\t[\"function\", \"Disable-PSSessionConfiguration\"],\r\n\t[\"function\", \"Disconnect-PSSession\"],\r\n\t[\"function\", \"Enable-ComputerRestore\"],\r\n\t[\"function\", \"Enable-PSBreakpoint\"],\r\n\t[\"function\", \"Enable-PSRemoting\"],\r\n\t[\"function\", \"Enable-PSSessionConfiguration\"],\r\n\t[\"function\", \"Enter-PSSession\"],\r\n\t[\"function\", \"Exit-PSSession\"],\r\n\t[\"function\", \"Export-Alias\"],\r\n\t[\"function\", \"Export-Clixml\"],\r\n\t[\"function\", \"Export-Console\"],\r\n\t[\"function\", \"Export-Csv\"],\r\n\t[\"function\", \"Export-FormatData\"],\r\n\t[\"function\", \"Export-ModuleMember\"],\r\n\t[\"function\", \"Export-PSSession\"],\r\n\t[\"function\", \"ForEach-Object\"],\r\n\t[\"function\", \"Format-Custom\"],\r\n\t[\"function\", \"Format-List\"],\r\n\t[\"function\", \"Format-Table\"],\r\n\t[\"function\", \"Format-Wide\"],\r\n\t[\"function\", \"Get-Alias\"],\r\n\t[\"function\", \"Get-ChildItem\"],\r\n\t[\"function\", \"Get-Command\"],\r\n\t[\"function\", \"Get-ComputerRestorePoint\"],\r\n\t[\"function\", \"Get-Content\"],\r\n\t[\"function\", \"Get-ControlPanelItem\"],\r\n\t[\"function\", \"Get-Culture\"],\r\n\t[\"function\", \"Get-Date\"],\r\n\t[\"function\", \"Get-Event\"],\r\n\t[\"function\", \"Get-EventLog\"],\r\n\t[\"function\", \"Get-EventSubscriber\"],\r\n\t[\"function\", \"Get-FormatData\"],\r\n\t[\"function\", \"Get-Help\"],\r\n\t[\"function\", \"Get-History\"],\r\n\t[\"function\", \"Get-Host\"],\r\n\t[\"function\", \"Get-HotFix\"],\r\n\t[\"function\", \"Get-Item\"],\r\n\t[\"function\", \"Get-ItemProperty\"],\r\n\t[\"function\", \"Get-Job\"],\r\n\t[\"function\", \"Get-Location\"],\r\n\t[\"function\", \"Get-Member\"],\r\n\t[\"function\", \"Get-Module\"],\r\n\t[\"function\", \"Get-Process\"],\r\n\t[\"function\", \"Get-PSBreakpoint\"],\r\n\t[\"function\", \"Get-PSCallStack\"],\r\n\t[\"function\", \"Get-PSDrive\"],\r\n\t[\"function\", \"Get-PSProvider\"],\r\n\t[\"function\", \"Get-PSSession\"],\r\n\t[\"function\", \"Get-PSSessionConfiguration\"],\r\n\t[\"function\", \"Get-PSSnapin\"],\r\n\t[\"function\", \"Get-Random\"],\r\n\t[\"function\", \"Get-Service\"],\r\n\t[\"function\", \"Get-TraceSource\"],\r\n\t[\"function\", \"Get-Transaction\"],\r\n\t[\"function\", \"Get-TypeData\"],\r\n\t[\"function\", \"Get-UICulture\"],\r\n\t[\"function\", \"Get-Unique\"],\r\n\t[\"function\", \"Get-Variable\"],\r\n\t[\"function\", \"Get-WmiObject\"],\r\n\t[\"function\", \"Group-Object\"],\r\n\t[\"function\", \"Import-Alias\"],\r\n\t[\"function\", \"Import-Clixml\"],\r\n\t[\"function\", \"Import-Csv\"],\r\n\t[\"function\", \"Import-LocalizedData\"],\r\n\t[\"function\", \"Import-Module\"],\r\n\t[\"function\", \"Import-PSSession\"],\r\n\t[\"function\", \"Invoke-Command\"],\r\n\t[\"function\", \"Invoke-Expression\"],\r\n\t[\"function\", \"Invoke-History\"],\r\n\t[\"function\", \"Invoke-Item\"],\r\n\t[\"function\", \"Invoke-RestMethod\"],\r\n\t[\"function\", \"Invoke-WebRequest\"],\r\n\t[\"function\", \"Invoke-WmiMethod\"],\r\n\t[\"function\", \"Join-Path\"],\r\n\t[\"function\", \"Limit-EventLog\"],\r\n\t[\"function\", \"Measure-Command\"],\r\n\t[\"function\", \"Measure-Object\"],\r\n\t[\"function\", \"Move-Item\"],\r\n\t[\"function\", \"Move-ItemProperty\"],\r\n\t[\"function\", \"New-Alias\"],\r\n\t[\"function\", \"New-Event\"],\r\n\t[\"function\", \"New-EventLog\"],\r\n\t[\"function\", \"New-Item\"],\r\n\t[\"function\", \"New-ItemProperty\"],\r\n\t[\"function\", \"New-Module\"],\r\n\t[\"function\", \"New-ModuleManifest\"],\r\n\t[\"function\", \"New-Object\"],\r\n\t[\"function\", \"New-PSDrive\"],\r\n\t[\"function\", \"New-PSSession\"],\r\n\t[\"function\", \"New-PSSessionConfigurationFile\"],\r\n\t[\"function\", \"New-PSSessionOption\"],\r\n\t[\"function\", \"New-PSTransportOption\"],\r\n\t[\"function\", \"New-Service\"],\r\n\t[\"function\", \"New-TimeSpan\"],\r\n\t[\"function\", \"New-Variable\"],\r\n\t[\"function\", \"New-WebServiceProxy\"],\r\n\t[\"function\", \"Out-Default\"],\r\n\t[\"function\", \"Out-File\"],\r\n\t[\"function\", \"Out-GridView\"],\r\n\t[\"function\", \"Out-Host\"],\r\n\t[\"function\", \"Out-Null\"],\r\n\t[\"function\", \"Out-Printer\"],\r\n\t[\"function\", \"Out-String\"],\r\n\t[\"function\", \"Pop-Location\"],\r\n\t[\"function\", \"Push-Location\"],\r\n\t[\"function\", \"Read-Host\"],\r\n\t[\"function\", \"Receive-Job\"],\r\n\t[\"function\", \"Receive-PSSession\"],\r\n\t[\"function\", \"Register-EngineEvent\"],\r\n\t[\"function\", \"Register-ObjectEvent\"],\r\n\t[\"function\", \"Register-PSSessionConfiguration\"],\r\n\t[\"function\", \"Register-WmiEvent\"],\r\n\t[\"function\", \"Remove-Computer\"],\r\n\t[\"function\", \"Remove-Event\"],\r\n\t[\"function\", \"Remove-EventLog\"],\r\n\t[\"function\", \"Remove-Item\"],\r\n\t[\"function\", \"Remove-ItemProperty\"],\r\n\t[\"function\", \"Remove-Job\"],\r\n\t[\"function\", \"Remove-Module\"],\r\n\t[\"function\", \"Remove-PSBreakpoint\"],\r\n\t[\"function\", \"Remove-PSDrive\"],\r\n\t[\"function\", \"Remove-PSSession\"],\r\n\t[\"function\", \"Remove-PSSnapin\"],\r\n\t[\"function\", \"Remove-TypeData\"],\r\n\t[\"function\", \"Remove-Variable\"],\r\n\t[\"function\", \"Remove-WmiObject\"],\r\n\t[\"function\", \"Rename-Computer\"],\r\n\t[\"function\", \"Rename-Item\"],\r\n\t[\"function\", \"Rename-ItemProperty\"],\r\n\t[\"function\", \"Reset-ComputerMachinePassword\"],\r\n\t[\"function\", \"Resolve-Path\"],\r\n\t[\"function\", \"Restart-Computer\"],\r\n\t[\"function\", \"Restart-Service\"],\r\n\t[\"function\", \"Restore-Computer\"],\r\n\t[\"function\", \"Resume-Job\"],\r\n\t[\"function\", \"Resume-Service\"],\r\n\t[\"function\", \"Save-Help\"],\r\n\t[\"function\", \"Select-Object\"],\r\n\t[\"function\", \"Select-String\"],\r\n\t[\"function\", \"Select-Xml\"],\r\n\t[\"function\", \"Send-MailMessage\"],\r\n\t[\"function\", \"Set-Alias\"],\r\n\t[\"function\", \"Set-Content\"],\r\n\t[\"function\", \"Set-Date\"],\r\n\t[\"function\", \"Set-Item\"],\r\n\t[\"function\", \"Set-ItemProperty\"],\r\n\t[\"function\", \"Set-Location\"],\r\n\t[\"function\", \"Set-PSBreakpoint\"],\r\n\t[\"function\", \"Set-PSDebug\"],\r\n\t[\"function\", \"Set-PSSessionConfiguration\"],\r\n\t[\"function\", \"Set-Service\"],\r\n\t[\"function\", \"Set-StrictMode\"],\r\n\t[\"function\", \"Set-TraceSource\"],\r\n\t[\"function\", \"Set-Variable\"],\r\n\t[\"function\", \"Set-WmiInstance\"],\r\n\t[\"function\", \"Show-Command\"],\r\n\t[\"function\", \"Show-ControlPanelItem\"],\r\n\t[\"function\", \"Show-EventLog\"],\r\n\t[\"function\", \"Sort-Object\"],\r\n\t[\"function\", \"Split-Path\"],\r\n\t[\"function\", \"Start-Job\"],\r\n\t[\"function\", \"Start-Process\"],\r\n\t[\"function\", \"Start-Service\"],\r\n\t[\"function\", \"Start-Sleep\"],\r\n\t[\"function\", \"Start-Transaction\"],\r\n\t[\"function\", \"Stop-Computer\"],\r\n\t[\"function\", \"Stop-Job\"],\r\n\t[\"function\", \"Stop-Process\"],\r\n\t[\"function\", \"Stop-Service\"],\r\n\t[\"function\", \"Suspend-Job\"],\r\n\t[\"function\", \"Suspend-Service\"],\r\n\t[\"function\", \"Tee-Object\"],\r\n\t[\"function\", \"Test-ComputerSecureChannel\"],\r\n\t[\"function\", \"Test-Connection\"],\r\n\t[\"function\", \"Test-ModuleManifest\"],\r\n\t[\"function\", \"Test-Path\"],\r\n\t[\"function\", \"Test-PSSessionConfigurationFile\"],\r\n\t[\"function\", \"Trace-Command\"],\r\n\t[\"function\", \"Unblock-File\"],\r\n\t[\"function\", \"Undo-Transaction\"],\r\n\t[\"function\", \"Unregister-Event\"],\r\n\t[\"function\", \"Unregister-PSSessionConfiguration\"],\r\n\t[\"function\", \"Update-FormatData\"],\r\n\t[\"function\", \"Update-Help\"],\r\n\t[\"function\", \"Update-List\"],\r\n\t[\"function\", \"Update-TypeData\"],\r\n\t[\"function\", \"Use-Transaction\"],\r\n\t[\"function\", \"Wait-Event\"],\r\n\t[\"function\", \"Wait-Job\"],\r\n\t[\"function\", \"Wait-Process\"],\r\n\t[\"function\", \"Where-Object\"],\r\n\t[\"function\", \"Write-Debug\"],\r\n\t[\"function\", \"Write-Error\"],\r\n\t[\"function\", \"Write-EventLog\"],\r\n\t[\"function\", \"Write-Host\"],\r\n\t[\"function\", \"Write-Output\"],\r\n\t[\"function\", \"Write-Progress\"],\r\n\t[\"function\", \"Write-Verbose\"],\r\n\t[\"function\", \"Write-Warning\"],\r\n\t[\"function\", \"Get-AppxPackage\"]\r\n]\r\n----------------------------------------------------\r\n\r\nTesting functions and aliases\r\n"
  },
  {
    "path": "tests/languages/powershell/issue1407.test",
    "content": "While($true){\r\n    Write-Output \"$($($InFiles | Where-Object {$_.ToCopy -eq 0}).count)\"\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"While\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"boolean\", \"$true\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"function\", \"Write-Output\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"function\", [\r\n\t\t\t\"$\",\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"$\",\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"variable\", \"$InFiles\"],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"function\", \"Where-Object\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"variable\", \"$_\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"ToCopy \",\r\n\t\t\t[\"operator\", \"-eq\"],\r\n\t\t\t\" 0\",\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"count\",\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for nested expressions in strings. See #1407"
  },
  {
    "path": "tests/languages/powershell/keyword_feature.test",
    "content": "Begin Break Catch Class Continue Data Define Do DynamicParam Else ElseIf End\r\nExit Filter Finally For ForEach From Function If InlineScript Parallel Param\r\nProcess Return Sequence Switch Throw Trap Try Until Using Var While Workflow\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"Begin\"],\r\n\t[\"keyword\", \"Break\"],\r\n\t[\"keyword\", \"Catch\"],\r\n\t[\"keyword\", \"Class\"],\r\n\t[\"keyword\", \"Continue\"],\r\n\t[\"keyword\", \"Data\"],\r\n\t[\"keyword\", \"Define\"],\r\n\t[\"keyword\", \"Do\"],\r\n\t[\"keyword\", \"DynamicParam\"],\r\n\t[\"keyword\", \"Else\"],\r\n\t[\"keyword\", \"ElseIf\"],\r\n\t[\"keyword\", \"End\"],\r\n\t[\"keyword\", \"Exit\"],\r\n\t[\"keyword\", \"Filter\"],\r\n\t[\"keyword\", \"Finally\"],\r\n\t[\"keyword\", \"For\"],\r\n\t[\"keyword\", \"ForEach\"],\r\n\t[\"keyword\", \"From\"],\r\n\t[\"keyword\", \"Function\"],\r\n\t[\"keyword\", \"If\"],\r\n\t[\"keyword\", \"InlineScript\"],\r\n\t[\"keyword\", \"Parallel\"],\r\n\t[\"keyword\", \"Param\"],\r\n\t[\"keyword\", \"Process\"],\r\n\t[\"keyword\", \"Return\"],\r\n\t[\"keyword\", \"Sequence\"],\r\n\t[\"keyword\", \"Switch\"],\r\n\t[\"keyword\", \"Throw\"],\r\n\t[\"keyword\", \"Trap\"],\r\n\t[\"keyword\", \"Try\"],\r\n\t[\"keyword\", \"Until\"],\r\n\t[\"keyword\", \"Using\"],\r\n\t[\"keyword\", \"Var\"],\r\n\t[\"keyword\", \"While\"],\r\n\t[\"keyword\", \"Workflow\"]\r\n]\r\n----------------------------------------------------\r\n\r\nTesting keywords"
  },
  {
    "path": "tests/languages/powershell/namespace_feature.test",
    "content": "[System.String]::Empty;\r\n[Foo.Bar+Baz]::Abc;\r\n[int] 42;\r\n[string[]]\r\n[OutputType([System.Collections.Generic.List[int]])]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"namespace\", \"[System.String]\"],\"::Empty\",[\"punctuation\", \";\"],\r\n\t[\"namespace\", \"[Foo.Bar+Baz]\"],\"::Abc\",[\"punctuation\", \";\"],\r\n\t[\"namespace\", \"[int]\"],\" 42\",[\"punctuation\", \";\"],\r\n\t[\"namespace\", \"[string[]]\"],\r\n\t[\"namespace\", \"[OutputType([System.Collections.Generic.List[int]])]\"]\r\n]\r\n----------------------------------------------------\r\n\r\nTesting namespaces"
  },
  {
    "path": "tests/languages/powershell/operator_feature.test",
    "content": "! -eq -ne -gt -ge -lt -le -shl -shr -not -band -and -bxor -bor -or\r\n-Like -Match -Contains -In -NotLike -NotMatch -NotContains -NotIn -Replace -Join\r\n-is -isNot -as\r\n-= += *= /= %= - + * / % -- ++\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"!\"], \r\n\t[\"operator\", \"-eq\"], \r\n\t[\"operator\", \"-ne\"], \r\n\t[\"operator\", \"-gt\"], \r\n\t[\"operator\", \"-ge\"], \r\n\t[\"operator\", \"-lt\"], \r\n\t[\"operator\", \"-le\"], \r\n\t[\"operator\", \"-shl\"], \r\n\t[\"operator\", \"-shr\"], \r\n\t[\"operator\", \"-not\"], \r\n\t[\"operator\", \"-band\"], \r\n\t[\"operator\", \"-and\"], \r\n\t[\"operator\", \"-bxor\"], \r\n\t[\"operator\", \"-bor\"], \r\n\t[\"operator\", \"-or\"], \r\n\t\r\n\t[\"operator\", \"-Like\"], \r\n\t[\"operator\", \"-Match\"], \r\n\t[\"operator\", \"-Contains\"], \r\n\t[\"operator\", \"-In\"], \r\n\t[\"operator\", \"-NotLike\"], \r\n\t[\"operator\", \"-NotMatch\"], \r\n\t[\"operator\", \"-NotContains\"], \r\n\t[\"operator\", \"-NotIn\"], \r\n\t[\"operator\", \"-Replace\"], \r\n\t[\"operator\", \"-Join\"], \r\n\t[\"operator\", \"-is\"], \r\n\t[\"operator\", \"-isNot\"], \r\n\t[\"operator\", \"-as\"], \r\n\t\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"operator\", \"++\"]\r\n\r\n]\r\n----------------------------------------------------\r\n\r\nTesting operators."
  },
  {
    "path": "tests/languages/powershell/string_feature.test",
    "content": "\"a simple string\"\r\n\"has $interpolated variables\"\r\n\"has $($nesting -and 'interpolation')\"\r\n\"string `\"with`\" escaping\"\r\n'non-interpolated $string'\r\n'also ''with'' escaping'\r\n'''twas also escaped'\r\nan empty '' string\r\n'can''t'\r\n\"a simple #comment string\"\r\n\"has $interpolated <# variables #>\"\r\n\"$($expression)\"\r\n\"`$(escaped expression)\"\r\n\"$($($exp))\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"a simple string\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"\\\"has \", [\"variable\", \"$interpolated\"], \" variables\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"has \",\r\n\t\t[\r\n\t\t\t\"function\",\r\n\t\t\t[\r\n\t\t\t\t\"$\",\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"variable\", \"$nesting\"],\r\n\t\t\t\t[\"operator\", \"-and\"],\r\n\t\t\t\t[\"string\", \"'interpolation'\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]\r\n\t\t],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\"\\\"string `\\\"with`\\\" escaping\\\"\"]],\r\n\t[\"string\", \"'non-interpolated $string'\"],\r\n\t[\"string\", \"'also ''with'' escaping'\"],\r\n\t[\"string\", \"'''twas also escaped'\"],\r\n\t\"\\r\\nan empty \", [\"string\", \"''\"], \" string\\r\\n\",\r\n\t[\"string\", \"'can''t'\"],\r\n\t[\"string\", [\"\\\"a simple #comment string\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"\\\"has \", [\"variable\", \"$interpolated\"], \" <# variables #>\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"function\", [\r\n\t\t\t\"$\",\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"variable\", \"$expression\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"`$(escaped expression)\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"function\", [\r\n\t\t\t\"$\",\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"$\",\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"variable\", \"$exp\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTesting strings\r\n"
  },
  {
    "path": "tests/languages/powershell/variable_feature.test",
    "content": "$foo $bar_baz $var4u $1 $true_as $falsey\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"variable\", \"$bar_baz\"],\r\n\t[\"variable\", \"$var4u\"],\r\n\t[\"variable\", \"$1\"],\r\n\t[\"variable\", \"$true_as\"],\r\n\t[\"variable\", \"$falsey\"]\r\n]\r\n----------------------------------------------------\r\n\r\nTesting variables"
  },
  {
    "path": "tests/languages/processing/constant_feature.test",
    "content": "FOOBAR\r\nFOO_BAR_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"FOOBAR\"],\r\n\t[\"constant\", \"FOO_BAR_42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants."
  },
  {
    "path": "tests/languages/processing/function_feature.test",
    "content": "foo(\r\nfoo_bar_42 (\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo_bar_42\"], [\"punctuation\", \"(\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/processing/keyword_feature.test",
    "content": "break\r\ncatch\r\ncase\r\nclass;\r\ncontinue\r\ndefault\r\nelse\r\nextends;\r\nfinal\r\nfor\r\nif\r\nimplements;\r\nimport\r\nnew;\r\nnull\r\nprivate\r\npublic\r\nreturn\r\nstatic\r\nsuper\r\nswitch\r\nthis\r\ntry\r\nvoid\r\nwhile\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/processing/operator_feature.test",
    "content": "< << <=\r\n> >> >=\r\n& &&\r\n| ||\r\n% ?\r\n! !=\r\n= ==\r\n+ +=\r\n- -=\r\n* *=\r\n/ /=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"?\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/processing/type_feature.test",
    "content": "boolean\r\nbyte\r\nchar\r\ncolor\r\ndouble\r\nfloat\r\nint\r\nXML\r\n\r\nFoobar\r\nFoo_bar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"type\", \"boolean\"],\r\n\t[\"type\", \"byte\"],\r\n\t[\"type\", \"char\"],\r\n\t[\"type\", \"color\"],\r\n\t[\"type\", \"double\"],\r\n\t[\"type\", \"float\"],\r\n\t[\"type\", \"int\"],\r\n\t[\"type\", \"XML\"],\r\n\r\n\t[\"type\", \"Foobar\"],\r\n\t[\"type\", \"Foo_bar_42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for types."
  },
  {
    "path": "tests/languages/prolog/builtin_feature.test",
    "content": "fx\r\nfy\r\nxf xfx xfy\r\nyf yfx\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"fx\"],\r\n\t[\"builtin\", \"fy\"],\r\n\t[\"builtin\", \"xf\"], [\"builtin\", \"xfx\"], [\"builtin\", \"xfy\"],\r\n\t[\"builtin\", \"yf\"], [\"builtin\", \"yfx\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for builtins."
  },
  {
    "path": "tests/languages/prolog/comment_feature.test",
    "content": "% Foobar\r\n/**/\r\n/* Foo\r\nbar */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"% Foobar\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* Foo\\r\\nbar */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/prolog/function_feature.test",
    "content": "foobar(\r\nfoo_bar_42(\r\nabs/1\r\natan/2\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foobar\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo_bar_42\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"abs/1\"],\r\n\t[\"function\", \"atan/2\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/prolog/number_feature.test",
    "content": "42\r\n3.14159\r\n0\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"0\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/prolog/operator_feature.test",
    "content": "is mod not xor\r\n\r\n: \\ =\r\n> < -\r\n? * @\r\n/ ; +\r\n^ | !\r\n$ .\r\n\r\n=@=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"is\"], [\"operator\", \"mod\"], [\"operator\", \"not\"], [\"operator\", \"xor\"],\r\n\r\n\t[\"operator\", \":\"], [\"operator\", \"\\\\\"], [\"operator\", \"=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \"<\"], [\"operator\", \"-\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \"*\"], [\"operator\", \"@\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \";\"], [\"operator\", \"+\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"|\"], [\"operator\", \"!\"],\r\n\t[\"operator\", \"$\"], [\"operator\", \".\"],\r\n\r\n\t[\"operator\", \"=@=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/prolog/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\"fo\"\"obar\"\r\n\"foo\\\r\nbar\"\r\n''\r\n'fo\\'obar'\r\n'fo''obar'\r\n'foo\\\r\nbar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\"\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\\\\r\\nbar\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo\\\\'obar'\"],\r\n\t[\"string\", \"'fo''obar'\"],\r\n\t[\"string\", \"'foo\\\\\\r\\nbar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/promql/aggregate_selection.test",
    "content": "sum by (job) (\r\n\trate(http_requests_total[5m])\r\n)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"sum\"],\r\n\t[\"keyword\", \"by\"],\r\n\t[\"vector-match\", [\r\n        [\"punctuation\", \"(\"],\r\n        [\"label-key\", \"job\"],\r\n        [\"punctuation\", \")\"]\r\n    ]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"rate\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"http_requests_total\",\r\n\t[\"context-range\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"range-duration\", \"5m\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks aggregate query.\r\n"
  },
  {
    "path": "tests/languages/promql/comment_feature.test",
    "content": "# These examples are taken from ...\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"# These examples are taken from ...\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/promql/keyword_feature.test",
    "content": "sum\nmin\nmax\navg\ngroup\nstddev\nstdvar\ncount\ncount_values\nbottomk\ntopk\nquantile\non\nignoring\ngroup_right\ngroup_left\nby\nwithout\noffset\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"sum\"],\n\t[\"keyword\", \"min\"],\n\t[\"keyword\", \"max\"],\n\t[\"keyword\", \"avg\"],\n\t[\"keyword\", \"group\"],\n\t[\"keyword\", \"stddev\"],\n\t[\"keyword\", \"stdvar\"],\n\t[\"keyword\", \"count\"],\n\t[\"keyword\", \"count_values\"],\n\t[\"keyword\", \"bottomk\"],\n\t[\"keyword\", \"topk\"],\n\t[\"keyword\", \"quantile\"],\n\t[\"keyword\", \"on\"],\n\t[\"keyword\", \"ignoring\"],\n\t[\"keyword\", \"group_right\"],\n\t[\"keyword\", \"group_left\"],\n\t[\"keyword\", \"by\"],\n\t[\"keyword\", \"without\"],\n\t[\"keyword\", \"offset\"]\n]\n"
  },
  {
    "path": "tests/languages/promql/number_feature.test",
    "content": "23\n-2.43\n3.4e-9\n0x8f\n-Inf\nNaN\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"23\"],\n\t[\"number\", \"-2.43\"],\n\t[\"number\", \"3.4e-9\"],\n\t[\"number\", \"0x8f\"],\n\t[\"number\", \"-Inf\"],\n\t[\"number\", \"NaN\"]\n]\n"
  },
  {
    "path": "tests/languages/promql/operator_feature.test",
    "content": "^ * / % + -\n== != <= < >= >\n\nand unless or\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \">\"],\n\n\t[\"operator\", \"and\"],\n\t[\"operator\", \"unless\"],\n\t[\"operator\", \"or\"]\n]\n"
  },
  {
    "path": "tests/languages/promql/subquery_selection.test",
    "content": "max_over_time(deriv(rate(distance_covered_total[5s])[30s:5s])[10m:])\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"max_over_time\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"deriv\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"rate\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"distance_covered_total\",\r\n\t[\"context-range\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"range-duration\", \"5s\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"context-range\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"range-duration\", \"30s\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"range-duration\", \"5s\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"context-range\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"range-duration\", \"10m\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks subquery.\r\n"
  },
  {
    "path": "tests/languages/promql/time_series_selection.test",
    "content": "http_requests_total{job=\"apiserver\", handler=\"/api/comments\"}[5m]\r\n\r\nhttp_requests_total offset 5m\r\n\r\nhttp_requests_total{job=~\".*server\"}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"http_requests_total\",\r\n\t[\"context-labels\", [\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"label-key\", \"job\"],\r\n\t\t[\"punctuation\", \"=\"],\r\n\t\t[\"label-value\", \"\\\"apiserver\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"label-key\", \"handler\"],\r\n\t\t[\"punctuation\", \"=\"],\r\n\t\t[\"label-value\", \"\\\"/api/comments\\\"\"],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\t[\"context-range\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"range-duration\", \"5m\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t\"\\r\\n\\r\\nhttp_requests_total \",\r\n\t[\"keyword\", \"offset\"],\r\n\t[\"context-range\", [\r\n\t\t[\"range-duration\", \"5m\"]\r\n\t]],\r\n\r\n\t\"\\r\\n\\r\\nhttp_requests_total\",\r\n\t[\"context-labels\", [\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"label-key\", \"job\"],\r\n\t\t[\"punctuation\", \"=~\"],\r\n\t\t[\"label-value\", \"\\\".*server\\\"\"],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks simple time series queries.\r\n"
  },
  {
    "path": "tests/languages/properties/comment_feature.test",
    "content": "#\r\n!\r\n# Foobar baz\r\n! Foobar baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"!\"],\r\n\t[\"comment\", \"# Foobar baz\"],\r\n\t[\"comment\", \"! Foobar baz\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/properties/key_value_feature.test",
    "content": "foo bar\r\nfoo\\:\\=\\ bar bar\\:\\= \\\r\nbaz\r\nfoo = bar\r\nfoo\\:\\=\\ bar = bar\\:\\= \\\r\nbaz\r\nfoo : bar\r\nfoo\\:\\=\\ bar : bar\\:\\= \\\r\nbaz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"key\", \"foo\"],\r\n\t[\"value\", \"bar\"],\r\n\t[\"key\", \"foo\\\\:\\\\=\\\\ bar\"],\r\n\t[\"value\", \"bar\\\\:\\\\= \\\\\\r\\nbaz\"],\r\n\r\n\t[\"key\", \"foo\"],\r\n\t[\"punctuation\", \"=\"],\r\n\t[\"value\", \"bar\"],\r\n\t[\"key\", \"foo\\\\:\\\\=\\\\ bar\"],\r\n\t[\"punctuation\", \"=\"],\r\n\t[\"value\", \"bar\\\\:\\\\= \\\\\\r\\nbaz\"],\r\n\r\n\t[\"key\", \"foo\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"value\", \"bar\"],\r\n\t[\"key\", \"foo\\\\:\\\\=\\\\ bar\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"value\", \"bar\\\\:\\\\= \\\\\\r\\nbaz\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keys and values.\r\n"
  },
  {
    "path": "tests/languages/protobuf/annotation_feature.test",
    "content": "int32 foo = 1 [deprecated=true];\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"int32\"],\n\t\" foo \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \"[\"],\n\t[\"annotation\", \"deprecated\"],\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nCheck for annotations.\n"
  },
  {
    "path": "tests/languages/protobuf/builtin_feature.test",
    "content": "double\nfloat\nint32\nint64\nuint32\nuint64\nsint32\nsint64\nfixed32\nfixed64\nsfixed32\nsfixed64\nbool\nstring\nbytes\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"double\"],\n\t[\"builtin\", \"float\"],\n\t[\"builtin\", \"int32\"],\n\t[\"builtin\", \"int64\"],\n\t[\"builtin\", \"uint32\"],\n\t[\"builtin\", \"uint64\"],\n\t[\"builtin\", \"sint32\"],\n\t[\"builtin\", \"sint64\"],\n\t[\"builtin\", \"fixed32\"],\n\t[\"builtin\", \"fixed64\"],\n\t[\"builtin\", \"sfixed32\"],\n\t[\"builtin\", \"sfixed64\"],\n\t[\"builtin\", \"bool\"],\n\t[\"builtin\", \"string\"],\n\t[\"builtin\", \"bytes\"]\n]\n\n----------------------------------------------------\n\nCheck for builtin types.\n"
  },
  {
    "path": "tests/languages/protobuf/class-name_feature.test",
    "content": "syntax = \"proto2\";\nsyntax = \"proto3\";\n\noption java_multiple_files = true;\n\nimport public \"new.proto\";\nimport \"other.proto\";\n\nenum Foo {}\nextend Foo {}\nservice Foo {}\nmessage Foo {\n\tBar Bar = 0;\n\tfoo.Bar Bar2 = 0;\n\t.baz.Bar Bar3 = 0;\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"syntax\"],\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"proto2\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"syntax\"],\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"proto3\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\n\t[\"keyword\", \"option\"],\n\t\" java_multiple_files \",\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\t[\"punctuation\", \";\"],\n\n\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"public\"],\n\t[\"string\", \"\\\"new.proto\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"string\", \"\\\"other.proto\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\n\t[\"keyword\", \"enum\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"extend\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"service\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"message\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"positional-class-name\", [\n\t\t\"Bar\"\n\t]],\n\t\" Bar \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"positional-class-name\", [\n\t\t\"foo\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Bar\"\n\t]],\n\t\" Bar2 \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"positional-class-name\", [\n\t\t[\"punctuation\", \".\"],\n\t\t\"baz\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Bar\"\n\t]],\n\t\" Bar3 \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nCheck for class names\n"
  },
  {
    "path": "tests/languages/protobuf/keyword_feature.test",
    "content": "enum\nextend\nextensions\nimport\nmessage\noneof\noption\noptional\npackage\npublic\nrepeated\nrequired\nreserved\nreturns\nrpc LotsOfReplies(\nservice\nstream\nsyntax\nto\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"enum\"],\n\t[\"keyword\", \"extend\"],\n\t[\"keyword\", \"extensions\"],\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"message\"],\n\t[\"keyword\", \"oneof\"],\n\t[\"keyword\", \"option\"],\n\t[\"keyword\", \"optional\"],\n\t[\"keyword\", \"package\"],\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"repeated\"],\n\t[\"keyword\", \"required\"],\n\t[\"keyword\", \"reserved\"],\n\t[\"keyword\", \"returns\"],\n\t[\"keyword\", \"rpc\"],\n\t[\"function\", \"LotsOfReplies\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"service\"],\n\t[\"keyword\", \"stream\"],\n\t[\"keyword\", \"syntax\"],\n\t[\"keyword\", \"to\"]\n]\n\n----------------------------------------------------\n\nCheck for keywords\n"
  },
  {
    "path": "tests/languages/protobuf/map_feature.test",
    "content": "map<string, .foo.Foo> bar;\n\n----------------------------------------------------\n\n[\n\t[\"map\", [\n\t\t\"map\",\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"builtin\", \"string\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"punctuation\", \".\"],\n\t\t\"foo\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Foo\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\" bar\",\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nCheck for maps.\n"
  },
  {
    "path": "tests/languages/protobuf/rpc_feature.test",
    "content": "rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);\nrpc BidiHello(stream HelloRequest) returns (stream HelloResponse);\nrpc CancelOperation(CancelOperationRequest) returns (google.protobuf.Empty) {\n\toption (google.api.http) = { post: \"/v1/{name=operations/**}:cancel\" body: \"*\" };\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"rpc\"],\n\t[\"function\", \"LotsOfReplies\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", \"HelloRequest\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"returns\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"stream\"],\n\t[\"class-name\", \"HelloResponse\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"rpc\"],\n\t[\"function\", \"BidiHello\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"stream\"],\n\t[\"class-name\", \"HelloRequest\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"returns\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"stream\"],\n\t[\"class-name\", \"HelloResponse\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"rpc\"],\n\t[\"function\", \"CancelOperation\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", \"CancelOperationRequest\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"returns\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", \"google.protobuf.Empty\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"keyword\", \"option\"],\n\t[\"punctuation\", \"(\"],\n\t\"google\",\n\t[\"punctuation\", \".\"],\n\t\"api\",\n\t[\"punctuation\", \".\"],\n\t\"http\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\t\" post\",\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"\\\"/v1/{name=operations/**}:cancel\\\"\"],\n\t\" body\",\n\t[\"punctuation\", \":\"],\n\t[\"string\", \"\\\"*\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nCheck for RPC definitions.\n"
  },
  {
    "path": "tests/languages/protobuf/string_feature.test",
    "content": "\"\"\n''\n\"foo\"\n'foo'\n\"'foo'\"\n'\"bar\"'\n\"  // comment  \"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"''\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"'foo'\"],\n\t[\"string\", \"\\\"'foo'\\\"\"],\n\t[\"string\", \"'\\\"bar\\\"'\"],\n\t[\"string\", \"\\\"  // comment  \\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for single-quoted and double-quoted strings.\n"
  },
  {
    "path": "tests/languages/psl/boolean_feature.test",
    "content": "FALSE\nFalse\nfalse\n\nTRUE\nTrue\ntrue\n\nNO\nNo\nno\n\nYES\nYes\nyes\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"FALSE\"],\n\t[\"boolean\", \"False\"],\n\t[\"boolean\", \"false\"],\n\n\t[\"boolean\", \"TRUE\"],\n\t[\"boolean\", \"True\"],\n\t[\"boolean\", \"true\"],\n\n\t[\"boolean\", \"NO\"],\n\t[\"boolean\", \"No\"],\n\t[\"boolean\", \"no\"],\n\n\t[\"boolean\", \"YES\"],\n\t[\"boolean\", \"Yes\"],\n\t[\"boolean\", \"yes\"]\n]\n"
  },
  {
    "path": "tests/languages/psl/builtin_feature.test",
    "content": "acos\r\nadd_diary\r\nannotate\r\nannotate_get\r\nasctime\r\nasin\r\natan\r\natexit\r\nascii_to_ebcdic\r\nbatch_set\r\nblackout\r\ncat\r\nceil\r\nchan_exists\r\nchange_state\r\nclose\r\ncode_cvt\r\ncond_signal\r\ncond_wait\r\nconsole_type\r\nconvert_base\r\nconvert_date\r\nconvert_locale_date\r\ncos\r\ncosh\r\ncreate\r\ndestroy_lock\r\ndump_hist\r\ndate\r\ndestroy\r\ndifference\r\ndget_text\r\ndcget_text\r\nebcdic_to_ascii\r\nencrypt\r\nevent_archive\r\nevent_catalog_get\r\nevent_check\r\nevent_query\r\nevent_range_manage\r\nevent_range_query\r\nevent_report\r\nevent_schedule\r\nevent_trigger\r\nevent_trigger2\r\nexecute\r\nexists\r\nexp\r\nfabs\r\nfloor\r\nfmod\r\nfull_discovery\r\nfile\r\nfopen\r\nftell\r\nfseek\r\ngrep\r\nget_vars\r\ngetenv\r\nget\r\nget_chan_info\r\nget_ranges\r\nget_text\r\ngethostinfo\r\ngetpid\r\ngetpname\r\nhistory_get_retention\r\nhistory\r\nindex\r\nint\r\nis_var\r\nintersection\r\nisnumber\r\ninternal\r\nin_transition\r\njoin\r\nkill\r\nlength\r\nlines\r\nlock\r\nlock_info\r\nlog\r\nloge\r\nlog10\r\nmatchline\r\nmsg_check\r\nmsg_get_format\r\nmsg_get_severity\r\nmsg_printf\r\nmsg_sprintf\r\nntharg\r\nnum_consoles\r\nnthargf\r\nnthline\r\nnthlinef\r\nnum_bytes\r\nprint\r\nproc_exists\r\nprocess\r\npopen\r\nprintf\r\npconfig\r\npoplines\r\npow\r\nPslExecute\r\nPslFunctionCall\r\nPslFunctionExists\r\nPslSetOptions\r\nrandom\r\nread\r\nreadln\r\nrefresh_parameters\r\nremote_check\r\nremote_close\r\nremote_event_query\r\nremote_event_trigger\r\nremote_file_send\r\nremote_open\r\nremove\r\nreplace\r\nrindex\r\nsec_check_priv\r\nsec_store_get\r\nsec_store_set\r\nset_alarm_ranges\r\nset_locale\r\nshare\r\nsin\r\nsinh\r\nsleep\r\nsopen\r\nsqrt\r\nsrandom\r\nsubset\r\nset\r\nsubstr\r\nsystem\r\nsprintf\r\nsort\r\nsubset\r\nsnmp_agent_config\r\n_snmp_debug\r\nsnmp_agent_stop\r\nsnmp_agent_start\r\nsnmp_h_set\r\nsnmp_h_get_next\r\nsnmp_h_get\r\nsnmp_set\r\nsnmp_walk\r\nsnmp_get_next\r\nsnmp_get\r\nsnmp_config\r\nsnmp_close\r\nsnmp_open\r\nsnmp_trap_receive\r\nsnmp_trap_ignore\r\nsnmp_trap_listen\r\nsnmp_trap_send\r\nsnmp_trap_raise_std_trap\r\nsnmp_trap_register_im\r\nsplitline\r\nstrcasecmp\r\nstr_repeat\r\ntrim\r\ntail\r\ntan\r\ntanh\r\ntime\r\ntmpnam\r\ntolower\r\ntoupper\r\ntrace_psl_process\r\ntext_domain\r\nunlock\r\nunique\r\nunion\r\nunset\r\nva_arg\r\nva_start\r\nwrite\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"acos\"],\r\n\t[\"builtin\", \"add_diary\"],\r\n\t[\"builtin\", \"annotate\"],\r\n\t[\"builtin\", \"annotate_get\"],\r\n\t[\"builtin\", \"asctime\"],\r\n\t[\"builtin\", \"asin\"],\r\n\t[\"builtin\", \"atan\"],\r\n\t[\"builtin\", \"atexit\"],\r\n\t[\"builtin\", \"ascii_to_ebcdic\"],\r\n\t[\"builtin\", \"batch_set\"],\r\n\t[\"builtin\", \"blackout\"],\r\n\t[\"builtin\", \"cat\"],\r\n\t[\"builtin\", \"ceil\"],\r\n\t[\"builtin\", \"chan_exists\"],\r\n\t[\"builtin\", \"change_state\"],\r\n\t[\"builtin\", \"close\"],\r\n\t[\"builtin\", \"code_cvt\"],\r\n\t[\"builtin\", \"cond_signal\"],\r\n\t[\"builtin\", \"cond_wait\"],\r\n\t[\"builtin\", \"console_type\"],\r\n\t[\"builtin\", \"convert_base\"],\r\n\t[\"builtin\", \"convert_date\"],\r\n\t[\"builtin\", \"convert_locale_date\"],\r\n\t[\"builtin\", \"cos\"],\r\n\t[\"builtin\", \"cosh\"],\r\n\t[\"builtin\", \"create\"],\r\n\t[\"builtin\", \"destroy_lock\"],\r\n\t[\"builtin\", \"dump_hist\"],\r\n\t[\"builtin\", \"date\"],\r\n\t[\"builtin\", \"destroy\"],\r\n\t[\"builtin\", \"difference\"],\r\n\t[\"builtin\", \"dget_text\"],\r\n\t[\"builtin\", \"dcget_text\"],\r\n\t[\"builtin\", \"ebcdic_to_ascii\"],\r\n\t[\"builtin\", \"encrypt\"],\r\n\t[\"builtin\", \"event_archive\"],\r\n\t[\"builtin\", \"event_catalog_get\"],\r\n\t[\"builtin\", \"event_check\"],\r\n\t[\"builtin\", \"event_query\"],\r\n\t[\"builtin\", \"event_range_manage\"],\r\n\t[\"builtin\", \"event_range_query\"],\r\n\t[\"builtin\", \"event_report\"],\r\n\t[\"builtin\", \"event_schedule\"],\r\n\t[\"builtin\", \"event_trigger\"],\r\n\t[\"builtin\", \"event_trigger2\"],\r\n\t[\"builtin\", \"execute\"],\r\n\t[\"builtin\", \"exists\"],\r\n\t[\"builtin\", \"exp\"],\r\n\t[\"builtin\", \"fabs\"],\r\n\t[\"builtin\", \"floor\"],\r\n\t[\"builtin\", \"fmod\"],\r\n\t[\"builtin\", \"full_discovery\"],\r\n\t[\"builtin\", \"file\"],\r\n\t[\"builtin\", \"fopen\"],\r\n\t[\"builtin\", \"ftell\"],\r\n\t[\"builtin\", \"fseek\"],\r\n\t[\"builtin\", \"grep\"],\r\n\t[\"builtin\", \"get_vars\"],\r\n\t[\"builtin\", \"getenv\"],\r\n\t[\"builtin\", \"get\"],\r\n\t[\"builtin\", \"get_chan_info\"],\r\n\t[\"builtin\", \"get_ranges\"],\r\n\t[\"builtin\", \"get_text\"],\r\n\t[\"builtin\", \"gethostinfo\"],\r\n\t[\"builtin\", \"getpid\"],\r\n\t[\"builtin\", \"getpname\"],\r\n\t[\"builtin\", \"history_get_retention\"],\r\n\t[\"builtin\", \"history\"],\r\n\t[\"builtin\", \"index\"],\r\n\t[\"builtin\", \"int\"],\r\n\t[\"builtin\", \"is_var\"],\r\n\t[\"builtin\", \"intersection\"],\r\n\t[\"builtin\", \"isnumber\"],\r\n\t[\"builtin\", \"internal\"],\r\n\t[\"builtin\", \"in_transition\"],\r\n\t[\"builtin\", \"join\"],\r\n\t[\"builtin\", \"kill\"],\r\n\t[\"builtin\", \"length\"],\r\n\t[\"builtin\", \"lines\"],\r\n\t[\"builtin\", \"lock\"],\r\n\t[\"builtin\", \"lock_info\"],\r\n\t[\"builtin\", \"log\"],\r\n\t[\"builtin\", \"loge\"],\r\n\t[\"builtin\", \"log10\"],\r\n\t[\"builtin\", \"matchline\"],\r\n\t[\"builtin\", \"msg_check\"],\r\n\t[\"builtin\", \"msg_get_format\"],\r\n\t[\"builtin\", \"msg_get_severity\"],\r\n\t[\"builtin\", \"msg_printf\"],\r\n\t[\"builtin\", \"msg_sprintf\"],\r\n\t[\"builtin\", \"ntharg\"],\r\n\t[\"builtin\", \"num_consoles\"],\r\n\t[\"builtin\", \"nthargf\"],\r\n\t[\"builtin\", \"nthline\"],\r\n\t[\"builtin\", \"nthlinef\"],\r\n\t[\"builtin\", \"num_bytes\"],\r\n\t[\"builtin\", \"print\"],\r\n\t[\"builtin\", \"proc_exists\"],\r\n\t[\"builtin\", \"process\"],\r\n\t[\"builtin\", \"popen\"],\r\n\t[\"builtin\", \"printf\"],\r\n\t[\"builtin\", \"pconfig\"],\r\n\t[\"builtin\", \"poplines\"],\r\n\t[\"builtin\", \"pow\"],\r\n\t[\"builtin\", \"PslExecute\"],\r\n\t[\"builtin\", \"PslFunctionCall\"],\r\n\t[\"builtin\", \"PslFunctionExists\"],\r\n\t[\"builtin\", \"PslSetOptions\"],\r\n\t[\"builtin\", \"random\"],\r\n\t[\"builtin\", \"read\"],\r\n\t[\"builtin\", \"readln\"],\r\n\t[\"builtin\", \"refresh_parameters\"],\r\n\t[\"builtin\", \"remote_check\"],\r\n\t[\"builtin\", \"remote_close\"],\r\n\t[\"builtin\", \"remote_event_query\"],\r\n\t[\"builtin\", \"remote_event_trigger\"],\r\n\t[\"builtin\", \"remote_file_send\"],\r\n\t[\"builtin\", \"remote_open\"],\r\n\t[\"builtin\", \"remove\"],\r\n\t[\"builtin\", \"replace\"],\r\n\t[\"builtin\", \"rindex\"],\r\n\t[\"builtin\", \"sec_check_priv\"],\r\n\t[\"builtin\", \"sec_store_get\"],\r\n\t[\"builtin\", \"sec_store_set\"],\r\n\t[\"builtin\", \"set_alarm_ranges\"],\r\n\t[\"builtin\", \"set_locale\"],\r\n\t[\"builtin\", \"share\"],\r\n\t[\"builtin\", \"sin\"],\r\n\t[\"builtin\", \"sinh\"],\r\n\t[\"builtin\", \"sleep\"],\r\n\t[\"builtin\", \"sopen\"],\r\n\t[\"builtin\", \"sqrt\"],\r\n\t[\"builtin\", \"srandom\"],\r\n\t[\"builtin\", \"subset\"],\r\n\t[\"builtin\", \"set\"],\r\n\t[\"builtin\", \"substr\"],\r\n\t[\"builtin\", \"system\"],\r\n\t[\"builtin\", \"sprintf\"],\r\n\t[\"builtin\", \"sort\"],\r\n\t[\"builtin\", \"subset\"],\r\n\t[\"builtin\", \"snmp_agent_config\"],\r\n\t[\"builtin\", \"_snmp_debug\"],\r\n\t[\"builtin\", \"snmp_agent_stop\"],\r\n\t[\"builtin\", \"snmp_agent_start\"],\r\n\t[\"builtin\", \"snmp_h_set\"],\r\n\t[\"builtin\", \"snmp_h_get_next\"],\r\n\t[\"builtin\", \"snmp_h_get\"],\r\n\t[\"builtin\", \"snmp_set\"],\r\n\t[\"builtin\", \"snmp_walk\"],\r\n\t[\"builtin\", \"snmp_get_next\"],\r\n\t[\"builtin\", \"snmp_get\"],\r\n\t[\"builtin\", \"snmp_config\"],\r\n\t[\"builtin\", \"snmp_close\"],\r\n\t[\"builtin\", \"snmp_open\"],\r\n\t[\"builtin\", \"snmp_trap_receive\"],\r\n\t[\"builtin\", \"snmp_trap_ignore\"],\r\n\t[\"builtin\", \"snmp_trap_listen\"],\r\n\t[\"builtin\", \"snmp_trap_send\"],\r\n\t[\"builtin\", \"snmp_trap_raise_std_trap\"],\r\n\t[\"builtin\", \"snmp_trap_register_im\"],\r\n\t[\"builtin\", \"splitline\"],\r\n\t[\"builtin\", \"strcasecmp\"],\r\n\t[\"builtin\", \"str_repeat\"],\r\n\t[\"builtin\", \"trim\"],\r\n\t[\"builtin\", \"tail\"],\r\n\t[\"builtin\", \"tan\"],\r\n\t[\"builtin\", \"tanh\"],\r\n\t[\"builtin\", \"time\"],\r\n\t[\"builtin\", \"tmpnam\"],\r\n\t[\"builtin\", \"tolower\"],\r\n\t[\"builtin\", \"toupper\"],\r\n\t[\"builtin\", \"trace_psl_process\"],\r\n\t[\"builtin\", \"text_domain\"],\r\n\t[\"builtin\", \"unlock\"],\r\n\t[\"builtin\", \"unique\"],\r\n\t[\"builtin\", \"union\"],\r\n\t[\"builtin\", \"unset\"],\r\n\t[\"builtin\", \"va_arg\"],\r\n\t[\"builtin\", \"va_start\"],\r\n\t[\"builtin\", \"write\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTest for PSL built-in functions"
  },
  {
    "path": "tests/languages/psl/comment_feature.test",
    "content": "# Comment\r\n# This is not a \"string\"\r\n# This is not a <<<HERE_DOC document HERE_DOC\r\n### Comment\r\n\"string # with hash\"#comment\r\n        # Indented comment\r\n\t\t\t\t# Tab-indented comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"# Comment\"],\r\n\t[\"comment\", \"# This is not a \\\"string\\\"\"],\r\n\t[\"comment\", \"# This is not a <<<HERE_DOC document HERE_DOC\"],\r\n\t[\"comment\", \"### Comment\"],\r\n\t[\"string\", [\"\\\"string # with hash\\\"\"]], [\"comment\", \"#comment\"],\r\n\t[\"comment\", \"# Indented comment\"],\r\n\t[\"comment\", \"# Tab-indented comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTest for comments"
  },
  {
    "path": "tests/languages/psl/constant_feature.test",
    "content": "ALARM\r\nCHART_ADD_GRAPH\r\nCHART_DELETE_GRAPH\r\nCHART_DESTROY\r\nCHART_LOAD\r\nCHART_PRINT\r\nEOF\r\nOFFLINE\r\nOK\r\nPSL_PROF_LOG\r\nR_CHECK_HORIZ\r\nR_CHECK_VERT\r\nR_CLICKER\r\nR_COLUMN\r\nR_FRAME\r\nR_ICON\r\nR_LABEL\r\nR_LABEL_CENTER\r\nR_LIST_MULTIPLE\r\nR_LIST_MULTIPLE_ND\r\nR_LIST_SINGLE\r\nR_LIST_SINGLE_ND\r\nR_MENU\r\nR_POPUP\r\nR_POPUP_SCROLLED\r\nR_RADIO_HORIZ\r\nR_RADIO_VERT\r\nR_ROW\r\nR_SCALE_HORIZ\r\nR_SCALE_VERT\r\nR_SEP_HORIZ\r\nR_SEP_VERT\r\nR_SPINNER\r\nR_TEXT_FIELD\r\nR_TEXT_FIELD_LABEL\r\nR_TOGGLE\r\nTRIM_LEADING\r\nTRIM_LEADING_AND_TRAILING\r\nTRIM_REDUNDANT\r\nTRIM_TRAILING\r\nVOID\r\nWARN\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"ALARM\"],\r\n\t[\"constant\", \"CHART_ADD_GRAPH\"],\r\n\t[\"constant\", \"CHART_DELETE_GRAPH\"],\r\n\t[\"constant\", \"CHART_DESTROY\"],\r\n\t[\"constant\", \"CHART_LOAD\"],\r\n\t[\"constant\", \"CHART_PRINT\"],\r\n\t[\"constant\", \"EOF\"],\r\n\t[\"constant\", \"OFFLINE\"],\r\n\t[\"constant\", \"OK\"],\r\n\t[\"constant\", \"PSL_PROF_LOG\"],\r\n\t[\"constant\", \"R_CHECK_HORIZ\"],\r\n\t[\"constant\", \"R_CHECK_VERT\"],\r\n\t[\"constant\", \"R_CLICKER\"],\r\n\t[\"constant\", \"R_COLUMN\"],\r\n\t[\"constant\", \"R_FRAME\"],\r\n\t[\"constant\", \"R_ICON\"],\r\n\t[\"constant\", \"R_LABEL\"],\r\n\t[\"constant\", \"R_LABEL_CENTER\"],\r\n\t[\"constant\", \"R_LIST_MULTIPLE\"],\r\n\t[\"constant\", \"R_LIST_MULTIPLE_ND\"],\r\n\t[\"constant\", \"R_LIST_SINGLE\"],\r\n\t[\"constant\", \"R_LIST_SINGLE_ND\"],\r\n\t[\"constant\", \"R_MENU\"],\r\n\t[\"constant\", \"R_POPUP\"],\r\n\t[\"constant\", \"R_POPUP_SCROLLED\"],\r\n\t[\"constant\", \"R_RADIO_HORIZ\"],\r\n\t[\"constant\", \"R_RADIO_VERT\"],\r\n\t[\"constant\", \"R_ROW\"],\r\n\t[\"constant\", \"R_SCALE_HORIZ\"],\r\n\t[\"constant\", \"R_SCALE_VERT\"],\r\n\t[\"constant\", \"R_SEP_HORIZ\"],\r\n\t[\"constant\", \"R_SEP_VERT\"],\r\n\t[\"constant\", \"R_SPINNER\"],\r\n\t[\"constant\", \"R_TEXT_FIELD\"],\r\n\t[\"constant\", \"R_TEXT_FIELD_LABEL\"],\r\n\t[\"constant\", \"R_TOGGLE\"],\r\n\t[\"constant\", \"TRIM_LEADING\"],\r\n\t[\"constant\", \"TRIM_LEADING_AND_TRAILING\"],\r\n\t[\"constant\", \"TRIM_REDUNDANT\"],\r\n\t[\"constant\", \"TRIM_TRAILING\"],\r\n\t[\"constant\", \"VOID\"],\r\n\t[\"constant\", \"WARN\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTest for constants\r\n"
  },
  {
    "path": "tests/languages/psl/function-foreach_feature.test",
    "content": "function test() { return \"a\"; }\r\nforeach __single \";\" entry ([\"a;b;c\"]) { test(); }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"test\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"string\", [\"\\\"a\\\"\"]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"keyword\", \"__single\"],\r\n\t[\"string\", [\"\\\";\\\"\"]],\r\n\t[\"foreach-variable\", \"entry\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", [\"\\\"a;b;c\\\"\"]],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"function\", \"test\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTest for user-defind functions... and the foreach statement!\r\n(lookalike, but different)"
  },
  {
    "path": "tests/languages/psl/heredoc_feature.test",
    "content": "<<<ABC_1\r\nText \"not a string\"\r\n# not a comment \"not a string\"\r\nABC_1;\r\n\r\n<<<ABC_2\r\n2nd here_doc \\n\\t\r\nABC_2;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"heredoc-string\", \"<<<ABC_1\\r\\nText \\\"not a string\\\"\\r\\n# not a comment \\\"not a string\\\"\\r\\nABC_1\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"heredoc-string\", \"<<<ABC_2\\r\\n2nd here_doc \\\\n\\\\t\\r\\nABC_2\"], [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTest for \"here_documents\""
  },
  {
    "path": "tests/languages/psl/keyword_feature.test",
    "content": "__multi\r\n__single\r\ncase\r\ndefault\r\ndo\r\nelse\r\nelsif\r\nexit\r\nexport\r\nfor\r\nforeach\r\nfunction\r\nif\r\nlast\r\nline\r\nlocal\r\nnext\r\nrequires\r\nreturn\r\nswitch\r\nuntil\r\nwhile\r\nword\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"__multi\"],\r\n\t[\"keyword\", \"__single\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"elsif\"],\r\n\t[\"keyword\", \"exit\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"last\"],\r\n\t[\"keyword\", \"line\"],\r\n\t[\"keyword\", \"local\"],\r\n\t[\"keyword\", \"next\"],\r\n\t[\"keyword\", \"requires\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"until\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"word\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTest for keywords"
  },
  {
    "path": "tests/languages/psl/number_feature.test",
    "content": "1\r\n1.3\r\n1.0\r\n01.2\r\n0xF0\r\n0xbcde0\r\n0XA390\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"1\"],\r\n\t[\"number\", \"1.3\"],\r\n\t[\"number\", \"1.0\"],\r\n\t[\"number\", \"01.2\"],\r\n\t[\"number\", \"0xF0\"],\r\n\t[\"number\", \"0xbcde0\"],\r\n\t[\"number\", \"0XA390\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTest for numbers"
  },
  {
    "path": "tests/languages/psl/operator_feature.test",
    "content": "1=2\r\n1+=2\r\n1-=2\r\n1<<=2\r\n1>>=2\r\n1^=2\r\n1*=2\r\n1/=2\r\n1%=2\r\n1|=2\r\n1&=2\r\n1||2\r\n1&&2\r\n1|2\r\n1^2\r\n1&2\r\n1!=2\r\n1==2\r\n1=~2\r\n1!~2\r\n1<2\r\n1<=2\r\n1>2\r\n1>=2\r\n1<<2\r\n1>>2\r\n1+2\r\n1*2\r\n1/2\r\n1%2\r\n\"a\".\"b\"\r\n1-2\r\n!1\r\n1++2\r\n1--2\r\n1?2:3\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"+=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"^=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"|=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"&=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"=~\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"!~\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \">>\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"string\", [\"\\\"a\\\"\"]],\r\n\t[\"operator\", \".\"],\r\n\t[\"string\", [\"\\\"b\\\"\"]],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"operator\", \"!\"],\r\n\t[\"number\", \"1\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"++\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"number\", \"2\"],\r\n\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"3\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTest for oper1tors"
  },
  {
    "path": "tests/languages/psl/overall_feature.test",
    "content": "function test(limit) {\r\n\tfor (i = 0 ; i < limit ; i++) {\r\n\t\ts = s + i; # s has not been initialized!\r\n\t}\r\n\tprint(s.\"\\n\");\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"test\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"limit\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"for\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"i \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \";\"],\r\n\t\" i \",\r\n\t[\"operator\", \"<\"],\r\n\t\" limit \",\r\n\t[\"punctuation\", \";\"],\r\n\t\" i\",\r\n\t[\"operator\", \"++\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t\"\\r\\n\\t\\ts \",\r\n\t[\"operator\", \"=\"],\r\n\t\" s \",\r\n\t[\"operator\", \"+\"],\r\n\t\" i\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"comment\", \"# s has not been initialized!\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"builtin\", \"print\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"s\",\r\n\t[\"operator\", \".\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"symbol\", \"\\\\n\"],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nGeneral test for the most common PSL statements, all mixed together"
  },
  {
    "path": "tests/languages/psl/string_feature.test",
    "content": "\"abc\"\r\n\"a \\\"bc\\\"\"\r\n\"a\\nbc\"\r\n\"a\\invalid\"\r\n\"foo # not a comment\"\r\n\"multi\r\nline string\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"abc\\\"\"]],\r\n\t[\"string\", [\r\n\t\t\"\\\"a \",\r\n\t\t[\"symbol\", \"\\\\\\\"\"],\r\n\t\t\"bc\",\r\n\t\t[\"symbol\", \"\\\\\\\"\"],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"\\\"a\",\r\n\t\t[\"symbol\", \"\\\\n\"],\r\n\t\t\"bc\\\"\"\r\n\t]],\r\n\t[\"string\", [\"\\\"a\\\\invalid\\\"\"]],\r\n\t[\"string\", [\"\\\"foo # not a comment\\\"\"]],\r\n\t[\"string\", [\"\\\"multi\\r\\nline string\\\"\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTest for strings"
  },
  {
    "path": "tests/languages/psl/variable_feature.test",
    "content": "errno\r\nexit_status\r\nPslDebug\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"errno\"],\r\n\t[\"variable\", \"exit_status\"],\r\n\t[\"variable\", \"PslDebug\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTest for variables"
  },
  {
    "path": "tests/languages/pug/code_feature.test",
    "content": "- if(foo)\r\n\r\np= 'This code is' + ' <escaped>!'\r\n\r\nspan\r\n\t!= 'Not escaped'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"-\"],\r\n\t[\"code\", [\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"foo\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\"p\"]],\r\n\t[\"punctuation\", \"=\"],\r\n\t[\"code\", [\r\n\t\t[\"string\", \"'This code is'\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"string\", \"' <escaped>!'\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\"span\"]],\r\n\t[\"punctuation\", \"!=\"],\r\n\t[\"code\", [\r\n\t\t[\"string\", \"'Not escaped'\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for inline code."
  },
  {
    "path": "tests/languages/pug/comment_feature.test",
    "content": "// foo\r\n bar\r\n\r\n\t// foo\r\n\t\tbar baz\r\n\r\n// foo\r\n\r\n\t// bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// foo\\r\\n bar\"],\r\n\t[\"comment\", \"// foo\\r\\n\\t\\tbar baz\"],\r\n\t[\"comment\", \"// foo\"],\r\n\t[\"comment\", \"// bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line comments."
  },
  {
    "path": "tests/languages/pug/doctype_feature.test",
    "content": "doctype html\r\ndoctype 1.1\r\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"doctype\", \"doctype html\"],\r\n\t[\"doctype\", \"doctype 1.1\"],\r\n\t[\"doctype\", \"doctype html PUBLIC \\\"-//W3C//DTD XHTML Basic 1.1//EN\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for doctypes."
  },
  {
    "path": "tests/languages/pug/filter_feature.test",
    "content": ":language\n\tcode\n\n----------------------------------------------------\n\n[\n\t[\"filter\", [\n\t\t[\"filter-name\", \":language\"],\n\t\t[\"text\", \"code\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/pug/flow-control_feature.test",
    "content": "each val, index in [1,2,3]\r\n\r\nif foo\r\nelse if bar\r\nelse\r\n\r\nunless foo\r\n\r\nwhile n < 4\r\n\r\ncase foo\r\n\twhen \"bar\"\r\n\tdefault\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"flow-control\", [\r\n\t\t[\"each\", [\r\n\t\t\t[\"keyword\", \"each\"],\r\n\t\t\t\" val\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\" index \",\r\n\t\t\t[\"keyword\", \"in\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t[\"flow-control\", [\r\n\t\t[\"branch\", \"if\"],\r\n\t\t\" foo\"\r\n\t]],\r\n\t[\"flow-control\", [\r\n        [\"branch\", \"else\"],\r\n        [\"keyword\", \"if\"],\r\n        \" bar\"\r\n    ]],\r\n    [\"flow-control\", [\r\n        [\"branch\", \"else\"]\r\n    ]],\r\n\r\n    [\"flow-control\", [\r\n        [\"branch\", \"unless\"],\r\n        \" foo\"\r\n    ]],\r\n\r\n    [\"flow-control\", [\r\n        [\"branch\", \"while\"],\r\n        \" n \",\r\n        [\"operator\", \"<\"],\r\n        [\"number\", \"4\"]\r\n    ]],\r\n\r\n    [\"flow-control\", [\r\n        [\"branch\", \"case\"],\r\n        \" foo\"\r\n    ]],\r\n    [\"flow-control\", [\r\n        [\"branch\", \"when\"],\r\n        [\"string\", \"\\\"bar\\\"\"]\r\n    ]],\r\n    [\"flow-control\", [\r\n        [\"branch\", \"default\"]\r\n    ]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all flow-control structures."
  },
  {
    "path": "tests/languages/pug/keyword_feature.test",
    "content": "block title\r\n\r\n\textends ./foo.pug\r\n\r\ninclude ./bar.pug\r\n\r\nblock append foo\r\nappend bar\r\n\r\nblock prepend foo\r\nprepend bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"block title\"],\r\n\t[\"keyword\", \"extends ./foo.pug\"],\r\n\t[\"keyword\", \"include ./bar.pug\"],\r\n\t[\"keyword\", \"block append foo\"],\r\n\t[\"keyword\", \"append bar\"],\r\n\t[\"keyword\", \"block prepend foo\"],\r\n\t[\"keyword\", \"prepend bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/pug/mixin_feature.test",
    "content": "mixin foo\r\nmixin pet(name)\r\n\r\n+foo\r\n+pet('cat')\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"mixin\", [\r\n\t\t[\"keyword\", \"mixin\"],\r\n\t\t[\"function\", \"foo\"]\r\n\t]],\r\n\t[\"mixin\", [\r\n\t\t[\"keyword\", \"mixin\"],\r\n\t\t[\"function\", \"pet\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"name\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"mixin\", [\r\n\t\t[\"name\", \"+foo\"]\r\n\t]],\r\n\t[\"mixin\", [\r\n\t\t[\"name\", \"+pet\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"'cat'\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for mixins declaration and usage."
  },
  {
    "path": "tests/languages/pug/multiline-plain-text_feature.test",
    "content": "div.\r\n foobar\r\n\r\n baz\r\n.\r\n\tdiv.\r\n\t\tfoobar\r\n\t\tbaz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t\"div\"\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"multiline-plain-text\", \"\\r\\n foobar\\r\\n\\r\\n baz\"],\r\n\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"tag\", [\r\n\t\t\"div\"\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"multiline-plain-text\", \"\\r\\n\\t\\tfoobar\\r\\n\\t\\tbaz\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for multi-line plain text."
  },
  {
    "path": "tests/languages/pug/multiline-script_feature.test",
    "content": "script.\r\n alert(42);\r\n\r\n.\r\n\tscript(type='text/javascript').\r\n\r\n\t\tif(foo) {\r\n\t\t\tbar(1 + 5);\r\n\t\t}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t\"script\"\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"multiline-script\", [\r\n\t\t[\"function\", \"alert\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"tag\", [\r\n\t\t\"script\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"attr-name\", \"type\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"attr-value\", [[\"string\", \"'text/javascript'\"]]],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"multiline-script\", [\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"foo\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"function\", \"bar\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"number\", \"5\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for multi-line scripts. The alone dot serves as a separator."
  },
  {
    "path": "tests/languages/pug/plain-text_feature.test",
    "content": "div foo\r\n\tspan foo bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t\"div\"\r\n\t]],\r\n\t[\"plain-text\", \"foo\"],\r\n\t[\"tag\", [\r\n\t\t\"span\"\r\n\t]],\r\n\t[\"plain-text\", \"foo bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line plain text."
  },
  {
    "path": "tests/languages/pug/script_feature.test",
    "content": "script alert(42);\r\n\tscript(type='text/javascript') alert(42);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t\"script\"\r\n\t]],\r\n\t[\"script\", [\r\n\t\t[\"function\", \"alert\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t\"script\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"attr-name\", \"type\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"attr-value\", [[\"string\", \"'text/javascript'\"]]],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"script\", [\r\n\t\t[\"function\", \"alert\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line scripts."
  },
  {
    "path": "tests/languages/pug/tag_feature.test",
    "content": "div\r\n\tspan&attributes({'data-foo': 'bar'})\r\n\r\ninput(data-bar=\"foo\", type='checkbox', checked)\r\n\r\na(style={color: 'red', background: 'green'})\r\n\r\ndiv(unescaped!=\"<code>\")\r\n\r\na.button\r\n.content\r\n\r\na#main-link\r\n#content\r\n\r\ndiv#test-id.test-class1.test-class2\r\n.test-class1#test-id.test-class2\r\n\r\na: span\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\"div\"]],\r\n\t[\"tag\", [\r\n\t\t\"span\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"operator\", \"&\"],\r\n\t\t\t[\"function\", \"attributes\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"string-property\", \"'data-foo'\"],\r\n\t\t\t[\"operator\", \":\"],\r\n\t\t\t[\"string\", \"'bar'\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"input\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"attr-name\", \"data-bar\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"string\", \"\\\"foo\\\"\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"attr-name\", \"type\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"string\", \"'checkbox'\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"attr-name\", \"checked\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"a\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"attr-name\", \"style\"],\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\t[\"literal-property\", \"color\"],\r\n\t\t\t\t[\"operator\", \":\"],\r\n\t\t\t\t[\"string\", \"'red'\"],\r\n\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t[\"literal-property\", \"background\"],\r\n\t\t\t\t[\"operator\", \":\"],\r\n\t\t\t\t[\"string\", \"'green'\"],\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"div\",\r\n\t\t[\"attributes\", [\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"attr-name\", \"unescaped\"],\r\n\t\t\t[\"punctuation\", \"!=\"],\r\n\t\t\t[\"attr-value\", [\r\n\t\t\t\t[\"string\", \"\\\"<code>\\\"\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"a\",\r\n\t\t[\"attr-class\", \".button\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"attr-class\", \".content\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"a\",\r\n\t\t[\"attr-id\", \"#main-link\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"attr-id\", \"#content\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"div\",\r\n\t\t[\"attr-id\", \"#test-id\"],\r\n\t\t[\"attr-class\", \".test-class1\"],\r\n\t\t[\"attr-class\", \".test-class2\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"attr-class\", \".test-class1\"],\r\n\t\t[\"attr-id\", \"#test-id\"],\r\n\t\t[\"attr-class\", \".test-class2\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t\"a\",\r\n\t\t[\"punctuation\", \":\"]\r\n\t]],\r\n\t[\"tag\", [\"span\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags and attributes.\r\n"
  },
  {
    "path": "tests/languages/puppet/attr-name_feature.test",
    "content": "foo {\r\n  bar => bar,\r\n  * => {}\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"foo \", [\"punctuation\", \"{\"],\r\n\t[\"attr-name\", \"bar\"], [\"operator\", \"=>\"],\r\n\t\" bar\", [\"punctuation\", \",\"],\r\n\t[\"attr-name\", \"*\"], [\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for attributes."
  },
  {
    "path": "tests/languages/puppet/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/puppet/comment_feature.test",
    "content": "#\r\n# Foobar\r\n/* Foo\r\nbar */\r\n/* @(foo) */\r\n# @(foo)\r\n# foo /* bar */ baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# Foobar\"],\r\n\t[\"multiline-comment\", \"/* Foo\\r\\nbar */\"],\r\n\t[\"multiline-comment\", \"/* @(foo) */\"],\r\n\t[\"comment\", \"# @(foo)\"],\r\n\t[\"comment\", \"# foo /* bar */ baz\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/puppet/datatype_feature.test",
    "content": "Any\r\nArray\r\nBoolean\r\nCallable\r\nCatalogentry\r\nClass\r\nCollection\r\nData\r\nDefault\r\nEnum\r\nFloat\r\nHash\r\nInteger\r\nNotUndef\r\nNumeric\r\nOptional\r\nPattern\r\nRegexp\r\nResource\r\nRuntime\r\nScalar\r\nString\r\nStruct\r\nTuple\r\nType\r\nUndef\r\nVariant\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"datatype\", \"Any\"],\r\n\t[\"datatype\", \"Array\"],\r\n\t[\"datatype\", \"Boolean\"],\r\n\t[\"datatype\", \"Callable\"],\r\n\t[\"datatype\", \"Catalogentry\"],\r\n\t[\"datatype\", \"Class\"],\r\n\t[\"datatype\", \"Collection\"],\r\n\t[\"datatype\", \"Data\"],\r\n\t[\"datatype\", \"Default\"],\r\n\t[\"datatype\", \"Enum\"],\r\n\t[\"datatype\", \"Float\"],\r\n\t[\"datatype\", \"Hash\"],\r\n\t[\"datatype\", \"Integer\"],\r\n\t[\"datatype\", \"NotUndef\"],\r\n\t[\"datatype\", \"Numeric\"],\r\n\t[\"datatype\", \"Optional\"],\r\n\t[\"datatype\", \"Pattern\"],\r\n\t[\"datatype\", \"Regexp\"],\r\n\t[\"datatype\", \"Resource\"],\r\n\t[\"datatype\", \"Runtime\"],\r\n\t[\"datatype\", \"Scalar\"],\r\n\t[\"datatype\", \"String\"],\r\n\t[\"datatype\", \"Struct\"],\r\n\t[\"datatype\", \"Tuple\"],\r\n\t[\"datatype\", \"Type\"],\r\n\t[\"datatype\", \"Undef\"],\r\n\t[\"datatype\", \"Variant\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for data types."
  },
  {
    "path": "tests/languages/puppet/function_feature.test",
    "content": "$foo.foobar\r\nfoo_bar_42()\r\n\r\ncontain\r\ndebug\r\nerr\r\nfail\r\ninclude\r\ninfo\r\nnotice\r\nrealize\r\nrequire\r\ntag\r\nwarning\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", [\"$foo\"]], [\"punctuation\", \".\"], [\"function\", \"foobar\"],\r\n\t[\"function\", \"foo_bar_42\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"contain\"],\r\n\t[\"function\", \"debug\"],\r\n\t[\"function\", \"err\"],\r\n\t[\"function\", \"fail\"],\r\n\t[\"function\", \"include\"],\r\n\t[\"function\", \"info\"],\r\n\t[\"function\", \"notice\"],\r\n\t[\"function\", \"realize\"],\r\n\t[\"function\", \"require\"],\r\n\t[\"function\", \"tag\"],\r\n\t[\"function\", \"warning\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/puppet/heredoc_feature.test",
    "content": "@(\"FOO\")\r\n\tbar\r\n\t$baz\r\nFOO\r\n\r\n@(FOO BAR/)\r\n\tbar\r\n\t$baz\r\n\t| FOO BAR\r\n\r\n@(foo!)\r\nbar\r\n|-foo!\r\n\r\n@(\"some text...\"/nrts$uL)\r\nsome text\r\nsome text..\r\nsome text...\r\n\r\n$foo = @(FOOBAR) == $bar\r\n\tFoobar\r\n\t-FOOBAR\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"heredoc\", [\"@(\", [\"punctuation\", \"\\\"FOO\\\"\"], \")\"]],\r\n\t[\"heredoc\", [\r\n\t\t\"\\tbar\\r\\n\\t\",\r\n\t\t[\"interpolation\", [\"$baz\"]],\r\n\t\t[\"punctuation\", \"FOO\"]\r\n\t]],\r\n\t[\"heredoc\", [\"@(\", [\"punctuation\", \"FOO BAR/\"], \")\"]],\r\n\t[\"heredoc\", [\r\n\t\t\"\\tbar\\r\\n\\t$baz\\r\\n\\t\",\r\n\t\t[\"punctuation\", \"| FOO BAR\"]\r\n\t]],\r\n\t[\"heredoc\", [\"@(\", [\"punctuation\", \"foo!\"], \")\"]],\r\n\t[\"heredoc\", [\"bar\\r\\n\", [\"punctuation\", \"|-foo!\"]]],\r\n\t[\"heredoc\", [\"@(\", [\"punctuation\", \"\\\"some text...\\\"/nrts$uL\"], \")\"]],\r\n\t[\"heredoc\", [\"some text\\r\\nsome text..\\r\\n\", [\"punctuation\", \"some text...\"]]],\r\n\t[\"variable\", [\"$foo\"]], [\"operator\", \"=\"],\r\n\t[\"heredoc\", [\"@(\", [\"punctuation\", \"FOOBAR\"], \")\"]],\r\n\t[\"operator\", \"==\"], [\"variable\", [\"$bar\"]],\r\n\t[\"heredoc\", [\"\\tFoobar\\r\\n\\t\", [\"punctuation\", \"-FOOBAR\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for heredoc strings.\r\nAlso checks that string interpolation applies only inside quoted heredoc strings."
  },
  {
    "path": "tests/languages/puppet/interpolation_feature.test",
    "content": "\"$foo ${::foo} ${foo::bar.foobar}\r\n${foobar(42)} ${::interfaces.split(\",\")[3]}\r\n${[1,20,3].filter |$value| { $value < 10 }}\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [[\"double-quoted\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"interpolation\", [\"$foo\"]],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"$\"], [\"punctuation\", \"{\"],\r\n\t\t\t[\"short-variable\", [[\"punctuation\", \"::\"], \"foo\"]],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"$\"], [\"punctuation\", \"{\"],\r\n\t\t\t[\"short-variable\", [\"foo\", [\"punctuation\", \"::\"], \"bar\"]],\r\n\t\t\t[\"punctuation\", \".\"], [\"function\", \"foobar\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"$\"], [\"punctuation\", \"{\"],\r\n\t\t\t[\"function\", \"foobar\"], [\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"42\"], [\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"$\"], [\"punctuation\", \"{\"],\r\n\t\t\t[\"short-variable\", [[\"punctuation\", \"::\"], \"interfaces\"]],\r\n\t\t\t[\"punctuation\", \".\"], [\"function\", \"split\"],\r\n\t\t\t[\"punctuation\", \"(\"], [\"string\", [[\"double-quoted\", [\"\\\",\\\"\"]]]],\r\n\t\t\t[\"punctuation\", \")\"], [\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"3\"], [\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"$\"], [\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"[\"], [\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \",\"], [\"number\", \"20\"],\r\n\t\t\t[\"punctuation\", \",\"], [\"number\", \"3\"], [\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \".\"], [\"function\", \"filter\"],\r\n\t\t\t[\"operator\", \"|\"], [\"variable\", [\"$value\"]], [\"operator\", \"|\"],\r\n\t\t\t[\"punctuation\", \"{\"], [\"variable\", [\"$value\"]],\r\n\t\t\t[\"operator\", \"<\"], [\"number\", \"10\"], [\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for interpolation."
  },
  {
    "path": "tests/languages/puppet/keyword_feature.test",
    "content": "application\r\nattr\r\ncase\r\nclass\r\nconsumes\r\ndefault\r\ndefine\r\nelse\r\nelsif\r\nfunction\r\nif\r\nimport\r\ninherits\r\nnode\r\nprivate\r\nproduces\r\ntype\r\nundef\r\nunless\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"application\"],\r\n\t[\"keyword\", \"attr\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"consumes\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"define\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"elsif\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"inherits\"],\r\n\t[\"keyword\", \"node\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"produces\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"undef\"],\r\n\t[\"keyword\", \"unless\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/puppet/number_feature.test",
    "content": "0\r\n42\r\n3.14159\r\n3e8\r\n3.2E-7\r\n0777\r\n0xBadFace\r\n0XBADFACE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3e8\"],\r\n\t[\"number\", \"3.2E-7\"],\r\n\t[\"number\", \"0777\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0XBADFACE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/puppet/operator_feature.test",
    "content": "= == =~ =>\r\n! != !~\r\n< << <<|\r\n<= <~ <| <-\r\n> >> >=\r\n- ->\r\n~>\r\n| |> |>>\r\n* / % + ?\r\nand in or\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"=~\"], [\"operator\", \"=>\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"], [\"operator\", \"!~\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<<|\"],\r\n\t[\"operator\", \"<=\"], [\"operator\", \"<~\"], [\"operator\", \"<|\"], [\"operator\", \"<-\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"->\"],\r\n\t[\"operator\", \"~>\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"|>\"], [\"operator\", \"|>>\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"%\"], [\"operator\", \"+\"], [\"operator\", \"?\"],\r\n\t[\"operator\", \"and\"], [\"operator\", \"in\"], [\"operator\", \"or\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/puppet/regex_feature.test",
    "content": "node /f(o)\"o\"[b]?a\\/r/\r\n$foo = /foo\r\nbar # baz\r\n/m\r\n$foo = /foo\r\nbar # baz\r\n/ixm\r\n$foo = /@(foo)/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"node\"],\r\n\t[\"regex\", [\"/f(o)\\\"o\\\"[b]?a\\\\/r/\"]],\r\n\t[\"variable\", [\"$foo\"]], [\"operator\", \"=\"],\r\n\t[\"regex\", [\"/foo\\r\\nbar # baz\\r\\n/m\"]],\r\n\t[\"variable\", [\"$foo\"]], [\"operator\", \"=\"],\r\n\t[\"regex\", [\r\n\t\t[\"extended-regex\", [\r\n\t\t\t\"/foo\\r\\nbar \",\r\n\t\t\t[\"comment\", \"# baz\"],\r\n\t\t\t\"\\r\\n/ixm\"\r\n\t\t]]\r\n\t]],\r\n\t[\"variable\", [\"$foo\"]], [\"operator\", \"=\"],\r\n\t[\"regex\", [\"/@(foo)/\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for regular expressions.\r\nAlso checks that extended-regex accept inline comments."
  },
  {
    "path": "tests/languages/puppet/string_feature.test",
    "content": "''\r\n'fo\\'obar'\r\n'foo\r\n$bar\r\nbaz'\r\n\"\"\r\n\"fo\\\"obar\"\r\n\"foo\r\n$bar\r\nbaz\"\r\n\" @(foo) \"\r\n\"foo /* bar */ baz\"\r\n\"foo #bar baz\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"''\"]],\r\n\t[\"string\", [\"'fo\\\\'obar'\"]],\r\n\t[\"string\", [\"'foo\\r\\n$bar\\r\\nbaz'\"]],\r\n\t[\"string\", [[\"double-quoted\", [\"\\\"\\\"\"]]]],\r\n\t[\"string\", [[\"double-quoted\", [\"\\\"fo\\\\\\\"obar\\\"\"]]]],\r\n\t[\"string\", [[\"double-quoted\", [\r\n\t\t\"\\\"foo\\r\\n\",\r\n\t\t[\"interpolation\", [\"$bar\"]],\r\n\t\t\"\\r\\nbaz\\\"\"\r\n\t]]]],\r\n\t[\"string\", [[\"double-quoted\", [\"\\\" @(foo) \\\"\"]]]],\r\n\t[\"string\", [[\"double-quoted\", [\"\\\"foo /* bar */ baz\\\"\"]]]],\r\n\t[\"string\", [[\"double-quoted\", [\"\\\"foo #bar baz\\\"\"]]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\nAlso checks that string interpolation only applies to double-quoted strings."
  },
  {
    "path": "tests/languages/puppet/variable_feature.test",
    "content": "$foo\r\n$::foobar_42\r\n$Foo::Bar_42::baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", [\"$foo\"]],\r\n\t[\"variable\", [\"$\", [\"punctuation\", \"::\"], \"foobar_42\"]],\r\n\t[\"variable\", [\"$Foo\", [\"punctuation\", \"::\"], \"Bar_42\", [\"punctuation\", \"::\"], \"baz\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/pure/comment_feature.test",
    "content": "//\r\n// Foobar\r\n/**/\r\n/* Foo\r\nbar */\r\n#! --nochecks\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// Foobar\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* Foo\\r\\nbar */\"],\r\n\t[\"comment\", \"#! --nochecks\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/pure/function_feature.test",
    "content": "abs\r\nadd_fundef\r\nadd_fundef_at\r\nadd_interface\r\nadd_interface_at\r\nadd_macdef\r\nadd_macdef_at\r\nadd_typedef\r\nadd_typedef_at\r\nadd_addr\r\nadd_constdef\r\nadd_vardef\r\nall\r\nany\r\nappl\r\napplp\r\narity\r\nbigint\r\nbigintp\r\nblob\r\nblob_crc\r\nblob_size\r\nblobp\r\nbool\r\nboolp\r\nbyte_matrix\r\nbyte_pointer\r\nbyte_string\r\nbyte_cstring\r\nbyte_string_pointer\r\nbyte_cstring_pointer\r\ncalloc\r\ncat\r\ncatmap\r\nceil\r\nchar\r\ncharp\r\nchars\r\ncheck_ptrtag\r\nchr\r\nclear_sentry\r\nclearsym\r\nclosure\r\nclosurep\r\ncmatrix\r\ncmatrixp\r\ncol\r\ncols\r\ncolcat\r\ncolcatmap\r\ncolmap\r\ncolrev\r\ncolvector\r\ncolvectorp\r\ncolvectorseq\r\ncomplex\r\ncomplex_float_matrix\r\ncomplex_float_pointer\r\ncomplex_matrix\r\ncomplex_matrix_view\r\ncomplex_pointer\r\ncomplexp\r\nconj\r\ncooked\r\ncookedp\r\ncst\r\ncstring\r\ncstring_dup\r\ncstring_list\r\ncstring_vector\r\ncurry\r\ncurry3\r\ncycle\r\ncyclen\r\ndel_constdef\r\ndel_fundef\r\ndel_interface\r\ndel_macdef\r\ndel_typedef\r\ndel_vardef\r\ndelete\r\ndiag\r\ndiagmat\r\ndim\r\ndmatrix\r\ndmatrixp\r\ndo\r\ndouble\r\ndouble_matrix\r\ndouble_matrix_view\r\ndouble_pointer\r\ndoublep\r\ndowith\r\ndowith3\r\ndrop\r\ndropwhile\r\neval\r\nevalcmd\r\nexactp\r\nfilter\r\nfix\r\nfixity\r\nflip\r\nfloat_matrix\r\nfloat_pointer\r\nfloor\r\nfoldl\r\nfoldl1\r\nfoldr\r\nfoldr1\r\nfrac\r\nfree\r\nfun\r\nfunp\r\nfunction\r\nfunctionp\r\ngcd\r\nget\r\nget_byte\r\nget_constdef\r\nget_double\r\nget_float\r\nget_fundef\r\nget_int\r\nget_int64\r\nget_interface\r\nget_interface_typedef\r\nget_long\r\nget_macdef\r\nget_pointer\r\nget_ptrtag\r\nget_short\r\nget_sentry\r\nget_string\r\nget_typedef\r\nget_vardef\r\nglobsym\r\nhash\r\nhead\r\nid\r\nim\r\nimatrix\r\nimatrixp\r\nindex\r\ninexactp\r\ninfp\r\ninit\r\ninsert\r\nint\r\nint_matrix\r\nint_matrix_view\r\nint_pointer\r\nintp\r\nint64_matrix\r\nint64_pointer\r\ninteger\r\nintegerp\r\niterate\r\niteraten\r\niterwhile\r\njoin\r\nkey\r\nkeys\r\nlambda\r\nlambdap\r\nlast\r\nlasterr\r\nlasterrpos\r\nlcd\r\nlist\r\nlist2\r\nlistp\r\nlistmap\r\nmake_ptrtag\r\nmalloc\r\nmap\r\nmatcat\r\nmatrix\r\nmatrixp\r\nmax\r\nmember\r\nmin\r\nnanp\r\nnargs\r\nnmatrix\r\nnmatrixp\r\nnull\r\nnumber\r\nnumberp\r\nord\r\npack\r\npacked\r\npointer\r\npointer_cast\r\npointer_tag\r\npointer_type\r\npointerp\r\npow\r\npred\r\nptrtag\r\nput\r\nput_byte\r\nput_double\r\nput_float\r\nput_int\r\nput_int64\r\nput_long\r\nput_pointer\r\nput_short\r\nput_string\r\nrational\r\nrationalp\r\nre\r\nreal\r\nrealp\r\nrealloc\r\nrecord\r\nrecordp\r\nredim\r\nreduce\r\nreduce_with\r\nref\r\nrefp\r\nrepeat\r\nrepeatn\r\nreverse\r\nrlist\r\nrlistp\r\nround\r\nrow\r\nrows\r\nrowcat\r\nrowcatmap\r\nrowmap\r\nrowrev\r\nrowvector\r\nrowvectorp\r\nrowvectorseq\r\nsame\r\nscanl\r\nscanl1\r\nscanr\r\nscanr1\r\nsentry\r\nsgn\r\nshort_matrix\r\nshort_pointer\r\nslice\r\nsmatrix\r\nsmatrixp\r\nsort\r\nsplit\r\nstr\r\nstrcat\r\nstream\r\nstride\r\nstring\r\nstring_dup\r\nstring_list\r\nstring_vector\r\nstringp\r\nsubdiag\r\nsubdiagmat\r\nsubmat\r\nsubseq\r\nsubseq2\r\nsubstr\r\nsucc\r\nsupdiag\r\nsupdiagmat\r\nsymbol\r\nsymbolp\r\ntail\r\ntake\r\ntakewhile\r\nthunk\r\nthunkp\r\ntranspose\r\ntrunc\r\ntuple\r\ntuplep\r\ntypep\r\nubyte\r\nuint\r\nuint64\r\nulong\r\nuncurry\r\nuncurry3\r\nunref\r\nunzip\r\nunzip3\r\nupdate\r\nushort\r\nval\r\nvals\r\nvar\r\nvarp\r\nvector\r\nvectorp\r\nvectorseq\r\nvoid\r\nzip\r\nzip3\r\nzipwith\r\nzipwith3\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"abs\"],\r\n\t[\"function\", \"add_fundef\"],\r\n\t[\"function\", \"add_fundef_at\"],\r\n\t[\"function\", \"add_interface\"],\r\n\t[\"function\", \"add_interface_at\"],\r\n\t[\"function\", \"add_macdef\"],\r\n\t[\"function\", \"add_macdef_at\"],\r\n\t[\"function\", \"add_typedef\"],\r\n\t[\"function\", \"add_typedef_at\"],\r\n\t[\"function\", \"add_addr\"],\r\n\t[\"function\", \"add_constdef\"],\r\n\t[\"function\", \"add_vardef\"],\r\n\t[\"function\", \"all\"],\r\n\t[\"function\", \"any\"],\r\n\t[\"function\", \"appl\"],\r\n\t[\"function\", \"applp\"],\r\n\t[\"function\", \"arity\"],\r\n\t[\"function\", \"bigint\"],\r\n\t[\"function\", \"bigintp\"],\r\n\t[\"function\", \"blob\"],\r\n\t[\"function\", \"blob_crc\"],\r\n\t[\"function\", \"blob_size\"],\r\n\t[\"function\", \"blobp\"],\r\n\t[\"function\", \"bool\"],\r\n\t[\"function\", \"boolp\"],\r\n\t[\"function\", \"byte_matrix\"],\r\n\t[\"function\", \"byte_pointer\"],\r\n\t[\"function\", \"byte_string\"],\r\n\t[\"function\", \"byte_cstring\"],\r\n\t[\"function\", \"byte_string_pointer\"],\r\n\t[\"function\", \"byte_cstring_pointer\"],\r\n\t[\"function\", \"calloc\"],\r\n\t[\"function\", \"cat\"],\r\n\t[\"function\", \"catmap\"],\r\n\t[\"function\", \"ceil\"],\r\n\t[\"function\", \"char\"],\r\n\t[\"function\", \"charp\"],\r\n\t[\"function\", \"chars\"],\r\n\t[\"function\", \"check_ptrtag\"],\r\n\t[\"function\", \"chr\"],\r\n\t[\"function\", \"clear_sentry\"],\r\n\t[\"function\", \"clearsym\"],\r\n\t[\"function\", \"closure\"],\r\n\t[\"function\", \"closurep\"],\r\n\t[\"function\", \"cmatrix\"],\r\n\t[\"function\", \"cmatrixp\"],\r\n\t[\"function\", \"col\"],\r\n\t[\"function\", \"cols\"],\r\n\t[\"function\", \"colcat\"],\r\n\t[\"function\", \"colcatmap\"],\r\n\t[\"function\", \"colmap\"],\r\n\t[\"function\", \"colrev\"],\r\n\t[\"function\", \"colvector\"],\r\n\t[\"function\", \"colvectorp\"],\r\n\t[\"function\", \"colvectorseq\"],\r\n\t[\"function\", \"complex\"],\r\n\t[\"function\", \"complex_float_matrix\"],\r\n\t[\"function\", \"complex_float_pointer\"],\r\n\t[\"function\", \"complex_matrix\"],\r\n\t[\"function\", \"complex_matrix_view\"],\r\n\t[\"function\", \"complex_pointer\"],\r\n\t[\"function\", \"complexp\"],\r\n\t[\"function\", \"conj\"],\r\n\t[\"function\", \"cooked\"],\r\n\t[\"function\", \"cookedp\"],\r\n\t[\"function\", \"cst\"],\r\n\t[\"function\", \"cstring\"],\r\n\t[\"function\", \"cstring_dup\"],\r\n\t[\"function\", \"cstring_list\"],\r\n\t[\"function\", \"cstring_vector\"],\r\n\t[\"function\", \"curry\"],\r\n\t[\"function\", \"curry3\"],\r\n\t[\"function\", \"cycle\"],\r\n\t[\"function\", \"cyclen\"],\r\n\t[\"function\", \"del_constdef\"],\r\n\t[\"function\", \"del_fundef\"],\r\n\t[\"function\", \"del_interface\"],\r\n\t[\"function\", \"del_macdef\"],\r\n\t[\"function\", \"del_typedef\"],\r\n\t[\"function\", \"del_vardef\"],\r\n\t[\"function\", \"delete\"],\r\n\t[\"function\", \"diag\"],\r\n\t[\"function\", \"diagmat\"],\r\n\t[\"function\", \"dim\"],\r\n\t[\"function\", \"dmatrix\"],\r\n\t[\"function\", \"dmatrixp\"],\r\n\t[\"function\", \"do\"],\r\n\t[\"function\", \"double\"],\r\n\t[\"function\", \"double_matrix\"],\r\n\t[\"function\", \"double_matrix_view\"],\r\n\t[\"function\", \"double_pointer\"],\r\n\t[\"function\", \"doublep\"],\r\n\t[\"function\", \"dowith\"],\r\n\t[\"function\", \"dowith3\"],\r\n\t[\"function\", \"drop\"],\r\n\t[\"function\", \"dropwhile\"],\r\n\t[\"function\", \"eval\"],\r\n\t[\"function\", \"evalcmd\"],\r\n\t[\"function\", \"exactp\"],\r\n\t[\"function\", \"filter\"],\r\n\t[\"function\", \"fix\"],\r\n\t[\"function\", \"fixity\"],\r\n\t[\"function\", \"flip\"],\r\n\t[\"function\", \"float_matrix\"],\r\n\t[\"function\", \"float_pointer\"],\r\n\t[\"function\", \"floor\"],\r\n\t[\"function\", \"foldl\"],\r\n\t[\"function\", \"foldl1\"],\r\n\t[\"function\", \"foldr\"],\r\n\t[\"function\", \"foldr1\"],\r\n\t[\"function\", \"frac\"],\r\n\t[\"function\", \"free\"],\r\n\t[\"function\", \"fun\"],\r\n\t[\"function\", \"funp\"],\r\n\t[\"function\", \"function\"],\r\n\t[\"function\", \"functionp\"],\r\n\t[\"function\", \"gcd\"],\r\n\t[\"function\", \"get\"],\r\n\t[\"function\", \"get_byte\"],\r\n\t[\"function\", \"get_constdef\"],\r\n\t[\"function\", \"get_double\"],\r\n\t[\"function\", \"get_float\"],\r\n\t[\"function\", \"get_fundef\"],\r\n\t[\"function\", \"get_int\"],\r\n\t[\"function\", \"get_int64\"],\r\n\t[\"function\", \"get_interface\"],\r\n\t[\"function\", \"get_interface_typedef\"],\r\n\t[\"function\", \"get_long\"],\r\n\t[\"function\", \"get_macdef\"],\r\n\t[\"function\", \"get_pointer\"],\r\n\t[\"function\", \"get_ptrtag\"],\r\n\t[\"function\", \"get_short\"],\r\n\t[\"function\", \"get_sentry\"],\r\n\t[\"function\", \"get_string\"],\r\n\t[\"function\", \"get_typedef\"],\r\n\t[\"function\", \"get_vardef\"],\r\n\t[\"function\", \"globsym\"],\r\n\t[\"function\", \"hash\"],\r\n\t[\"function\", \"head\"],\r\n\t[\"function\", \"id\"],\r\n\t[\"function\", \"im\"],\r\n\t[\"function\", \"imatrix\"],\r\n\t[\"function\", \"imatrixp\"],\r\n\t[\"function\", \"index\"],\r\n\t[\"function\", \"inexactp\"],\r\n\t[\"function\", \"infp\"],\r\n\t[\"function\", \"init\"],\r\n\t[\"function\", \"insert\"],\r\n\t[\"function\", \"int\"],\r\n\t[\"function\", \"int_matrix\"],\r\n\t[\"function\", \"int_matrix_view\"],\r\n\t[\"function\", \"int_pointer\"],\r\n\t[\"function\", \"intp\"],\r\n\t[\"function\", \"int64_matrix\"],\r\n\t[\"function\", \"int64_pointer\"],\r\n\t[\"function\", \"integer\"],\r\n\t[\"function\", \"integerp\"],\r\n\t[\"function\", \"iterate\"],\r\n\t[\"function\", \"iteraten\"],\r\n\t[\"function\", \"iterwhile\"],\r\n\t[\"function\", \"join\"],\r\n\t[\"function\", \"key\"],\r\n\t[\"function\", \"keys\"],\r\n\t[\"function\", \"lambda\"],\r\n\t[\"function\", \"lambdap\"],\r\n\t[\"function\", \"last\"],\r\n\t[\"function\", \"lasterr\"],\r\n\t[\"function\", \"lasterrpos\"],\r\n\t[\"function\", \"lcd\"],\r\n\t[\"function\", \"list\"],\r\n\t[\"function\", \"list2\"],\r\n\t[\"function\", \"listp\"],\r\n\t[\"function\", \"listmap\"],\r\n\t[\"function\", \"make_ptrtag\"],\r\n\t[\"function\", \"malloc\"],\r\n\t[\"function\", \"map\"],\r\n\t[\"function\", \"matcat\"],\r\n\t[\"function\", \"matrix\"],\r\n\t[\"function\", \"matrixp\"],\r\n\t[\"function\", \"max\"],\r\n\t[\"function\", \"member\"],\r\n\t[\"function\", \"min\"],\r\n\t[\"function\", \"nanp\"],\r\n\t[\"function\", \"nargs\"],\r\n\t[\"function\", \"nmatrix\"],\r\n\t[\"function\", \"nmatrixp\"],\r\n\t[\"function\", \"null\"],\r\n\t[\"function\", \"number\"],\r\n\t[\"function\", \"numberp\"],\r\n\t[\"function\", \"ord\"],\r\n\t[\"function\", \"pack\"],\r\n\t[\"function\", \"packed\"],\r\n\t[\"function\", \"pointer\"],\r\n\t[\"function\", \"pointer_cast\"],\r\n\t[\"function\", \"pointer_tag\"],\r\n\t[\"function\", \"pointer_type\"],\r\n\t[\"function\", \"pointerp\"],\r\n\t[\"function\", \"pow\"],\r\n\t[\"function\", \"pred\"],\r\n\t[\"function\", \"ptrtag\"],\r\n\t[\"function\", \"put\"],\r\n\t[\"function\", \"put_byte\"],\r\n\t[\"function\", \"put_double\"],\r\n\t[\"function\", \"put_float\"],\r\n\t[\"function\", \"put_int\"],\r\n\t[\"function\", \"put_int64\"],\r\n\t[\"function\", \"put_long\"],\r\n\t[\"function\", \"put_pointer\"],\r\n\t[\"function\", \"put_short\"],\r\n\t[\"function\", \"put_string\"],\r\n\t[\"function\", \"rational\"],\r\n\t[\"function\", \"rationalp\"],\r\n\t[\"function\", \"re\"],\r\n\t[\"function\", \"real\"],\r\n\t[\"function\", \"realp\"],\r\n\t[\"function\", \"realloc\"],\r\n\t[\"function\", \"record\"],\r\n\t[\"function\", \"recordp\"],\r\n\t[\"function\", \"redim\"],\r\n\t[\"function\", \"reduce\"],\r\n\t[\"function\", \"reduce_with\"],\r\n\t[\"function\", \"ref\"],\r\n\t[\"function\", \"refp\"],\r\n\t[\"function\", \"repeat\"],\r\n\t[\"function\", \"repeatn\"],\r\n\t[\"function\", \"reverse\"],\r\n\t[\"function\", \"rlist\"],\r\n\t[\"function\", \"rlistp\"],\r\n\t[\"function\", \"round\"],\r\n\t[\"function\", \"row\"],\r\n\t[\"function\", \"rows\"],\r\n\t[\"function\", \"rowcat\"],\r\n\t[\"function\", \"rowcatmap\"],\r\n\t[\"function\", \"rowmap\"],\r\n\t[\"function\", \"rowrev\"],\r\n\t[\"function\", \"rowvector\"],\r\n\t[\"function\", \"rowvectorp\"],\r\n\t[\"function\", \"rowvectorseq\"],\r\n\t[\"function\", \"same\"],\r\n\t[\"function\", \"scanl\"],\r\n\t[\"function\", \"scanl1\"],\r\n\t[\"function\", \"scanr\"],\r\n\t[\"function\", \"scanr1\"],\r\n\t[\"function\", \"sentry\"],\r\n\t[\"function\", \"sgn\"],\r\n\t[\"function\", \"short_matrix\"],\r\n\t[\"function\", \"short_pointer\"],\r\n\t[\"function\", \"slice\"],\r\n\t[\"function\", \"smatrix\"],\r\n\t[\"function\", \"smatrixp\"],\r\n\t[\"function\", \"sort\"],\r\n\t[\"function\", \"split\"],\r\n\t[\"function\", \"str\"],\r\n\t[\"function\", \"strcat\"],\r\n\t[\"function\", \"stream\"],\r\n\t[\"function\", \"stride\"],\r\n\t[\"function\", \"string\"],\r\n\t[\"function\", \"string_dup\"],\r\n\t[\"function\", \"string_list\"],\r\n\t[\"function\", \"string_vector\"],\r\n\t[\"function\", \"stringp\"],\r\n\t[\"function\", \"subdiag\"],\r\n\t[\"function\", \"subdiagmat\"],\r\n\t[\"function\", \"submat\"],\r\n\t[\"function\", \"subseq\"],\r\n\t[\"function\", \"subseq2\"],\r\n\t[\"function\", \"substr\"],\r\n\t[\"function\", \"succ\"],\r\n\t[\"function\", \"supdiag\"],\r\n\t[\"function\", \"supdiagmat\"],\r\n\t[\"function\", \"symbol\"],\r\n\t[\"function\", \"symbolp\"],\r\n\t[\"function\", \"tail\"],\r\n\t[\"function\", \"take\"],\r\n\t[\"function\", \"takewhile\"],\r\n\t[\"function\", \"thunk\"],\r\n\t[\"function\", \"thunkp\"],\r\n\t[\"function\", \"transpose\"],\r\n\t[\"function\", \"trunc\"],\r\n\t[\"function\", \"tuple\"],\r\n\t[\"function\", \"tuplep\"],\r\n\t[\"function\", \"typep\"],\r\n\t[\"function\", \"ubyte\"],\r\n\t[\"function\", \"uint\"],\r\n\t[\"function\", \"uint64\"],\r\n\t[\"function\", \"ulong\"],\r\n\t[\"function\", \"uncurry\"],\r\n\t[\"function\", \"uncurry3\"],\r\n\t[\"function\", \"unref\"],\r\n\t[\"function\", \"unzip\"],\r\n\t[\"function\", \"unzip3\"],\r\n\t[\"function\", \"update\"],\r\n\t[\"function\", \"ushort\"],\r\n\t[\"function\", \"val\"],\r\n\t[\"function\", \"vals\"],\r\n\t[\"function\", \"var\"],\r\n\t[\"function\", \"varp\"],\r\n\t[\"function\", \"vector\"],\r\n\t[\"function\", \"vectorp\"],\r\n\t[\"function\", \"vectorseq\"],\r\n\t[\"function\", \"void\"],\r\n\t[\"function\", \"zip\"],\r\n\t[\"function\", \"zip3\"],\r\n\t[\"function\", \"zipwith\"],\r\n\t[\"function\", \"zipwith3\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/pure/keyword_feature.test",
    "content": "ans\r\nbreak\r\nbt\r\ncase\r\ncatch\r\ncd\r\nclear\r\nconst\r\ndef\r\ndel\r\ndump\r\nelse\r\nend\r\nexit\r\nextern\r\nfalse\r\nforce\r\nhelp\r\nif\r\ninfix\r\ninfixl\r\ninfixr\r\ninterface\r\nlet\r\nls\r\nmem\r\nnamespace\r\nnonfix\r\nNULL\r\nof\r\notherwise\r\noutfix\r\noverride\r\npostfix\r\nprefix\r\nprivate\r\npublic\r\npwd\r\nquit\r\nrun\r\nsave\r\nshow\r\nstats\r\nthen\r\nthrow\r\ntrace\r\ntrue\r\ntype\r\nunderride\r\nusing\r\nwhen\r\nwith\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"ans\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"bt\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"cd\"],\r\n\t[\"keyword\", \"clear\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"def\"],\r\n\t[\"keyword\", \"del\"],\r\n\t[\"keyword\", \"dump\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"exit\"],\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"false\"],\r\n\t[\"keyword\", \"force\"],\r\n\t[\"keyword\", \"help\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"infix\"],\r\n\t[\"keyword\", \"infixl\"],\r\n\t[\"keyword\", \"infixr\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"ls\"],\r\n\t[\"keyword\", \"mem\"],\r\n\t[\"keyword\", \"namespace\"],\r\n\t[\"keyword\", \"nonfix\"],\r\n\t[\"keyword\", \"NULL\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"otherwise\"],\r\n\t[\"keyword\", \"outfix\"],\r\n\t[\"keyword\", \"override\"],\r\n\t[\"keyword\", \"postfix\"],\r\n\t[\"keyword\", \"prefix\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"pwd\"],\r\n\t[\"keyword\", \"quit\"],\r\n\t[\"keyword\", \"run\"],\r\n\t[\"keyword\", \"save\"],\r\n\t[\"keyword\", \"show\"],\r\n\t[\"keyword\", \"stats\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"trace\"],\r\n\t[\"keyword\", \"true\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"underride\"],\r\n\t[\"keyword\", \"using\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"with\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/pure/number_feature.test",
    "content": "inf\r\nnan\r\n\r\n0xBadFace\r\n0b01010\r\n42\r\n4711L\r\n3.14159\r\n3e8\r\n4.2E-7\r\n0.9e+12\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"inf\"],\r\n\t[\"number\", \"nan\"],\r\n\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0b01010\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"4711L\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3e8\"],\r\n\t[\"number\", \"4.2E-7\"],\r\n\t[\"number\", \"0.9e+12\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/pure/operator_feature.test",
    "content": "and div mod not or\r\n\r\n! \" # $ % &\r\n' * + - . /\r\n: < = > ? @\r\n\\ ^ _ ` ~\r\n\r\n¡ ¢ × ÷\r\n\r\n<,|\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"and\"], [\"operator\", \"div\"], [\"operator\", \"mod\"], [\"operator\", \"not\"], [\"operator\", \"or\"],\r\n\r\n\t[\"operator\", \"!\"], [\"operator\", \"\\\"\"], [\"operator\", \"#\"], [\"operator\", \"$\"], [\"operator\", \"%\"], [\"operator\", \"&\"],\r\n\t[\"operator\", \"'\"], [\"operator\", \"*\"], [\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \".\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \":\"], [\"operator\", \"<\"], [\"operator\", \"=\"], [\"operator\", \">\"], [\"operator\", \"?\"], [\"operator\", \"@\"],\r\n\t[\"operator\", \"\\\\\"], [\"operator\", \"^\"], [\"operator\", \"_\"], [\"operator\", \"`\"], [\"operator\", \"~\"],\r\n\r\n\t[\"operator\", \"¡\"], [\"operator\", \"¢\"], [\"operator\", \"×\"], [\"operator\", \"÷\"],\r\n\r\n\t[\"operator\", \"<,|\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for some operators."
  },
  {
    "path": "tests/languages/pure/punctuation_feature.test",
    "content": "( ) { } [ ] ;\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/pure/special_feature.test",
    "content": "__show__\r\n__cmd__\r\n__with__\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"special\", \"__show__\"],\r\n\t[\"special\", \"__cmd__\"],\r\n\t[\"special\", \"__with__\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for special functions."
  },
  {
    "path": "tests/languages/pure/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/purebasic/asm_feature.test",
    "content": "Procedure.i XorTwoBlocks2(*buffer1, *buffer2, length)\n  ; move all the required data to source reg, destination reg and counter reg\n  !mov esi, [p.p_buffer1]           ; read 32-bit integer from p.p_buffer1 and move to esi\n  !mov edi, [p.p_buffer2]           ; read 32-bit integer from p.p_buffer2 and move to edi\n  !mov ecx, [p.v_length]            ; read 32-bit integer from p.v_length and move to ecx\n\n  !@@:                              ; anonymous label, can be reached by @b (back) or @f (forward)\n    !mov al, byte [edi + ecx - 1]   ; read byte from destination\n    !xor byte [esi + ecx - 1], al   ; xor source with destination (i.e. xor bytes from both blocks)\n    !dec ecx                        ; decrease counter\n  !jne @b                           ; jumb back to first anonymous label behind\n  ProcedureReturn 0\nEndProcedure\n\n!jne label1\n!jmp @b\n!EXTERN printf\n!DEFAULT rel\n\n; source: http://www.jose.it-berater.org/smfforum/index.php?topic=5091.0\nProcedure PopCount64(x.q)\n  !mov rax, [p.v_x]\n  !mov rdx, rax\n  !shr rdx, 1\n  !and rdx, [popcount64_v55]\n  !sub rax, rdx\n  ;x = (x & $3333333333333333) + ((x >> 2) & $3333333333333333)\n  !mov rdx, rax       ;x\n  !and rax, [popcount64_v33]\n  !shr rdx, 2\n  !and rdx, [popcount64_v33]\n  !add rax, rdx\n  ;x = (x + (x >> 4)) & $0f0f0f0f0f0f0f0f0f0f\n  !mov rdx, rax\n  !shr rdx, 4\n  !add rax, rdx\n  !and rax, [popcount64_v0f]\n  ;x * $0101010101010101 >> 56\n  !imul rax, [popcount64_v01]\n  !shr rax, 56\n  ProcedureReturn\n  !popcount64_v01: dq 0x0101010101010101\n  !popcount64_v0f: dq 0x0f0f0f0f0f0f0f0f\n  !popcount64_v33: dq 0x3333333333333333\n  !popcount64_v55: dq 0x5555555555555555\nEndProcedure\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"Procedure\"],\n\t[\"punctuation\", \".\"],\n\t\"i \",\n\t[\"function\", \"XorTwoBlocks2\"],\n\t[\"punctuation\", \"(\"],\n\t[\"operator\", \"*buffer1\"],\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \"*buffer2\"],\n\t[\"punctuation\", \",\"],\n\t\" length\",\n\t[\"punctuation\", \")\"],\n\n\t[\"comment\", \"; move all the required data to source reg, destination reg and counter reg\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"mov\"],\n\t\t[\"register\", \"esi\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"operator\", \"[\"],\n\t\t\"p\",\n\t\t[\"operator\", \".\"],\n\t\t\"p_buffer1\",\n\t\t[\"operator\", \"]\"]\n\t]],\n\t[\"comment\", \"; read 32-bit integer from p.p_buffer1 and move to esi\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"mov\"],\n\t\t[\"register\", \"edi\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"operator\", \"[\"],\n\t\t\"p\",\n\t\t[\"operator\", \".\"],\n\t\t\"p_buffer2\",\n\t\t[\"operator\", \"]\"]\n\t]],\n\t[\"comment\", \"; read 32-bit integer from p.p_buffer2 and move to edi\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"mov\"],\n\t\t[\"register\", \"ecx\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"operator\", \"[\"],\n\t\t\"p\",\n\t\t[\"operator\", \".\"],\n\t\t\"v_length\",\n\t\t[\"operator\", \"]\"]\n\t]],\n\t[\"comment\", \"; read 32-bit integer from p.v_length and move to ecx\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"label\", \"@@\"],\n\t\t[\"operator\", \":\"]\n\t]],\n\t[\"comment\", \"; anonymous label, can be reached by @b (back) or @f (forward)\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"mov\"],\n\t\t[\"register\", \"al\"],\n\t\t[\"operator\", \",\"],\n\t\t\" byte \",\n\t\t[\"operator\", \"[\"],\n\t\t[\"register\", \"edi\"],\n\t\t[\"operator\", \"+\"],\n\t\t[\"register\", \"ecx\"],\n\t\t[\"operator\", \"-\"],\n\t\t[\"number\", \"1\"],\n\t\t[\"operator\", \"]\"]\n\t]],\n\t[\"comment\", \"; read byte from destination\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"xor\"],\n\t\t\" byte \",\n\t\t[\"operator\", \"[\"],\n\t\t[\"register\", \"esi\"],\n\t\t[\"operator\", \"+\"],\n\t\t[\"register\", \"ecx\"],\n\t\t[\"operator\", \"-\"],\n\t\t[\"number\", \"1\"],\n\t\t[\"operator\", \"]\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"register\", \"al\"]\n\t]],\n\t[\"comment\", \"; xor source with destination (i.e. xor bytes from both blocks)\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"dec\"],\n\t\t[\"register\", \"ecx\"]\n\t]],\n\t[\"comment\", \"; decrease counter\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"jne\"],\n\t\t[\"label-reference-anonymous\", \"@b\"]\n\t]],\n\t[\"comment\", \"; jumb back to first anonymous label behind\"],\n\n\t[\"keyword\", \"ProcedureReturn\"],\n\t[\"number\", \"0\"],\n\n\t[\"keyword\", \"EndProcedure\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"jne\"],\n\t\t[\"label-reference-addressed\", \"label1\"]\n\t]],\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"jmp\"],\n\t\t[\"label-reference-anonymous\", \"@b\"]\n\t]],\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"keyword\", \"EXTERN printf\"]\n\t]],\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"keyword\", \"DEFAULT rel\"]\n\t]],\n\n\t[\"comment\", \"; source: http://www.jose.it-berater.org/smfforum/index.php?topic=5091.0\"],\n\n\t[\"keyword\", \"Procedure\"],\n\t[\"function\", \"PopCount64\"],\n\t[\"punctuation\", \"(\"],\n\t\"x\",\n\t[\"punctuation\", \".\"],\n\t\"q\",\n\t[\"punctuation\", \")\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"mov\"],\n\t\t[\"register\", \"rax\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"operator\", \"[\"],\n\t\t\"p\",\n\t\t[\"operator\", \".\"],\n\t\t\"v_x\",\n\t\t[\"operator\", \"]\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"mov\"],\n\t\t[\"register\", \"rdx\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"register\", \"rax\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"shr\"],\n\t\t[\"register\", \"rdx\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"number\", \"1\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"and\"],\n\t\t[\"register\", \"rdx\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"operator\", \"[\"],\n\t\t\"popcount64_v55\",\n\t\t[\"operator\", \"]\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"sub\"],\n\t\t[\"register\", \"rax\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"register\", \"rdx\"]\n\t]],\n\n\t[\"comment\", \";x = (x & $3333333333333333) + ((x >> 2) & $3333333333333333)\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"mov\"],\n\t\t[\"register\", \"rdx\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"register\", \"rax\"]\n\t]],\n\t[\"comment\", \";x\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"and\"],\n\t\t[\"register\", \"rax\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"operator\", \"[\"],\n\t\t\"popcount64_v33\",\n\t\t[\"operator\", \"]\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"shr\"],\n\t\t[\"register\", \"rdx\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"number\", \"2\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"and\"],\n\t\t[\"register\", \"rdx\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"operator\", \"[\"],\n\t\t\"popcount64_v33\",\n\t\t[\"operator\", \"]\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"add\"],\n\t\t[\"register\", \"rax\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"register\", \"rdx\"]\n\t]],\n\n\t[\"comment\", \";x = (x + (x >> 4)) & $0f0f0f0f0f0f0f0f0f0f\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"mov\"],\n\t\t[\"register\", \"rdx\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"register\", \"rax\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"shr\"],\n\t\t[\"register\", \"rdx\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"number\", \"4\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"add\"],\n\t\t[\"register\", \"rax\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"register\", \"rdx\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"and\"],\n\t\t[\"register\", \"rax\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"operator\", \"[\"],\n\t\t\"popcount64_v0f\",\n\t\t[\"operator\", \"]\"]\n\t]],\n\n\t[\"comment\", \";x * $0101010101010101 >> 56\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"imul\"],\n\t\t[\"register\", \"rax\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"operator\", \"[\"],\n\t\t\"popcount64_v01\",\n\t\t[\"operator\", \"]\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"function\", \"shr\"],\n\t\t[\"register\", \"rax\"],\n\t\t[\"operator\", \",\"],\n\t\t[\"number\", \"56\"]\n\t]],\n\n\t[\"keyword\", \"ProcedureReturn\"],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"label\", \"popcount64_v01\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"function-inline\", \"dq\"],\n\t\t[\"number\", \"0x0101010101010101\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"label\", \"popcount64_v0f\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"function-inline\", \"dq\"],\n\t\t[\"number\", \"0x0f0f0f0f0f0f0f0f\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"label\", \"popcount64_v33\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"function-inline\", \"dq\"],\n\t\t[\"number\", \"0x3333333333333333\"]\n\t]],\n\n\t[\"asm\", [\n\t\t[\"operator\", \"!\"],\n\t\t[\"label\", \"popcount64_v55\"],\n\t\t[\"operator\", \":\"],\n\t\t[\"function-inline\", \"dq\"],\n\t\t[\"number\", \"0x5555555555555555\"]\n\t]],\n\n\t[\"keyword\", \"EndProcedure\"]\n]\n"
  },
  {
    "path": "tests/languages/purebasic/comment_feature.test",
    "content": ";\r\n; comment\r\n\r\na$ = 2 ;Test\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \";\"],\r\n\t[\"comment\", \"; comment\"],\r\n\r\n\t\"\\r\\n\\r\\na$ \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"comment\", \";Test\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/purebasic/function_feature.test",
    "content": "foo()\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/purebasic/keyword_feature.test",
    "content": "DECLARECDLL\nDECLAREDLL\nCOMPILERSELECT\nCOMPILERCASE\nCOMPILERDEFAULT\nCOMPILERENDSELECT\nCOMPILERERROR\nENABLEEXPLICIT\nDISABLEEXPLICIT\nNOT\nAND\nOR\nXOR\nCALLDEBUGGER\nDEBUGLEVEL\nENABLEDEBUGGER\nDISABLEDEBUGGER\nRESTORE\nREAD\nINCLUDEPATH\nINCLUDEBINARY\nTHREADED\nRUNTIME\nWITH\nENDWITH\nSTRUCTUREUNION\nENDSTRUCTUREUNION\nALIGN\nNEWLIST\nNEWMAP\nINTERFACE\nENDINTERFACE\nEXTENDS\nENUMERATION\nENDENUMERATION\nSWAP\nFOREACH\nCONTINUE\nFAKERETURN\nGOTO\nGOSUB\nRETURN\nBREAK\nMODULE\nENDMODULE\nDECLAREMODULE\nENDDECLAREMODULE\nDECLARE\nDECLAREC\nPROTOTYPE\nPROTOTYPEC\nENABLEASM\nDISABLEASM\nDIM\nREDIM\nDATA\nDATASECTION\nENDDATASECTION\nTO\nPROCEDURERETURN\nDEBUG\nDEFAULT\nCASE\nSELECT\nENDSELECT\nAS\nIMPORT\nENDIMPORT\nIMPORTC\nCOMPILERIF\nCOMPILERELSE\nCOMPILERENDIF\nCOMPILERELSEIF\nEND\nSTRUCTURE\nENDSTRUCTURE\nWHILE\nWEND\nFOR\nNEXT\nSTEP\nIF\nELSE\nELSEIF\nENDIF\nREPEAT\nUNTIL\nPROCEDURE\nPROCEDUREDLL\nPROCEDUREC\nPROCEDURECDLL\nENDPROCEDURE\nPROTECTED\nSHARED\nSTATIC\nGLOBAL\nDEFINE\nINCLUDEFILE\nXINCLUDEFILE\nMACRO\nENDMACRO\nFOREVER\n\n----------------------------------------------------\n\n[\n \t[\"keyword\", \"DECLARECDLL\"],\n\t[\"keyword\", \"DECLAREDLL\"],\n\t[\"keyword\", \"COMPILERSELECT\"],\n\t[\"keyword\", \"COMPILERCASE\"],\n\t[\"keyword\", \"COMPILERDEFAULT\"],\n\t[\"keyword\", \"COMPILERENDSELECT\"],\n\t[\"keyword\", \"COMPILERERROR\"],\n\t[\"keyword\", \"ENABLEEXPLICIT\"],\n\t[\"keyword\", \"DISABLEEXPLICIT\"],\n\t[\"keyword\", \"NOT\"],\n\t[\"keyword\", \"AND\"],\n\t[\"keyword\", \"OR\"],\n\t[\"keyword\", \"XOR\"],\n\t[\"keyword\", \"CALLDEBUGGER\"],\n\t[\"keyword\", \"DEBUGLEVEL\"],\n\t[\"keyword\", \"ENABLEDEBUGGER\"],\n\t[\"keyword\", \"DISABLEDEBUGGER\"],\n\t[\"keyword\", \"RESTORE\"],\n\t[\"keyword\", \"READ\"],\n\t[\"keyword\", \"INCLUDEPATH\"],\n\t[\"keyword\", \"INCLUDEBINARY\"],\n\t[\"keyword\", \"THREADED\"],\n\t[\"keyword\", \"RUNTIME\"],\n\t[\"keyword\", \"WITH\"],\n\t[\"keyword\", \"ENDWITH\"],\n\t[\"keyword\", \"STRUCTUREUNION\"],\n\t[\"keyword\", \"ENDSTRUCTUREUNION\"],\n\t[\"keyword\", \"ALIGN\"],\n\t[\"keyword\", \"NEWLIST\"],\n\t[\"keyword\", \"NEWMAP\"],\n\t[\"keyword\", \"INTERFACE\"],\n  [\"keyword\", \"ENDINTERFACE\"],\n\t[\"keyword\", \"EXTENDS\"],\n\t[\"keyword\", \"ENUMERATION\"],\n\t[\"keyword\", \"ENDENUMERATION\"],\n\t[\"keyword\", \"SWAP\"],\n\t[\"keyword\", \"FOREACH\"],\n\t[\"keyword\", \"CONTINUE\"],\n\t[\"keyword\", \"FAKERETURN\"],\n\t[\"keyword\", \"GOTO\"],\n\t[\"keyword\", \"GOSUB\"],\n\t[\"keyword\", \"RETURN\"],\n\t[\"keyword\", \"BREAK\"],\n\t[\"keyword\", \"MODULE\"],\n\t[\"keyword\", \"ENDMODULE\"],\n\t[\"keyword\", \"DECLAREMODULE\"],\n\t[\"keyword\", \"ENDDECLAREMODULE\"],\n\t[\"keyword\", \"DECLARE\"],\n\t[\"keyword\", \"DECLAREC\"],\n\t[\"keyword\", \"PROTOTYPE\"],\n\t[\"keyword\", \"PROTOTYPEC\"],\n\t[\"keyword\", \"ENABLEASM\"],\n\t[\"keyword\", \"DISABLEASM\"],\n\t[\"keyword\", \"DIM\"],\n\t[\"keyword\", \"REDIM\"],\n\t[\"keyword\", \"DATA\"],\n\t[\"keyword\", \"DATASECTION\"],\n\t[\"keyword\", \"ENDDATASECTION\"],\n\t[\"keyword\", \"TO\"],\n\t[\"keyword\", \"PROCEDURERETURN\"],\n\t[\"keyword\", \"DEBUG\"],\n\t[\"keyword\", \"DEFAULT\"],\n\t[\"keyword\", \"CASE\"],\n  [\"keyword\", \"SELECT\"],\n\t[\"keyword\", \"ENDSELECT\"],\n\t[\"keyword\", \"AS\"],\n\t[\"keyword\", \"IMPORT\"],\n\t[\"keyword\", \"ENDIMPORT\"],\n\t[\"keyword\", \"IMPORTC\"],\n\t[\"keyword\", \"COMPILERIF\"],\n\t[\"keyword\", \"COMPILERELSE\"],\n\t[\"keyword\", \"COMPILERENDIF\"],\n\t[\"keyword\", \"COMPILERELSEIF\"],\n\t[\"keyword\", \"END\"],\n\t[\"keyword\", \"STRUCTURE\"],\n\t[\"keyword\", \"ENDSTRUCTURE\"],\n\t[\"keyword\", \"WHILE\"],\n\t[\"keyword\", \"WEND\"],\n\t[\"keyword\", \"FOR\"],\n\t[\"keyword\", \"NEXT\"],\n\t[\"keyword\", \"STEP\"],\n\t[\"keyword\", \"IF\"],\n\t[\"keyword\", \"ELSE\"],\n\t[\"keyword\", \"ELSEIF\"],\n\t[\"keyword\", \"ENDIF\"],\n  [\"keyword\", \"REPEAT\"],\n\t[\"keyword\", \"UNTIL\"],\n\t[\"keyword\", \"PROCEDURE\"],\n\t[\"keyword\", \"PROCEDUREDLL\"],\n\t[\"keyword\", \"PROCEDUREC\"],\n\t[\"keyword\", \"PROCEDURECDLL\"],\n\t[\"keyword\", \"ENDPROCEDURE\"],\n\t[\"keyword\", \"PROTECTED\"],\n\t[\"keyword\", \"SHARED\"],\n\t[\"keyword\", \"STATIC\"],\n\t[\"keyword\", \"GLOBAL\"],\n\t[\"keyword\", \"DEFINE\"],\n\t[\"keyword\", \"INCLUDEFILE\"],\n\t[\"keyword\", \"XINCLUDEFILE\"],\n\t[\"keyword\", \"MACRO\"],\n\t[\"keyword\", \"ENDMACRO\"],\n  [\"keyword\", \"FOREVER\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords."
  },
  {
    "path": "tests/languages/purebasic/number_feature.test",
    "content": "42\r\n3.14159\r\n2e8\r\n3.4E-9\r\n0.7E+12\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2e8\"],\r\n\t[\"number\", \"3.4E-9\"],\r\n\t[\"number\", \"0.7E+12\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/purebasic/operator_feature.test",
    "content": "< <=\r\n> >=\r\n+ - *\r\n@ab$\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"],\r\n\t[\"operator\", \"@ab$\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/purebasic/string_feature.test",
    "content": "\"\"\r\n\"foobar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foobar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/purebasic/tag_feature.test",
    "content": "#foo\n#NULL$\n\n----------------------------------------------------\n\n[\n\t[\"tag\", \"#foo\"],\n\t[\"tag\", \"#NULL$\"]\n]\n"
  },
  {
    "path": "tests/languages/purescript/builtin_feature.test",
    "content": "when\r\nunless\r\nliftA1\r\napply\r\nbind\r\ndiscard\r\njoin\r\nifM\r\nidentity\r\nwhenM\r\nunlessM\r\nliftM1\r\nap\r\ncompose\r\notherwise\r\ntop\r\nbottom\r\nrecip\r\neq\r\nnotEq\r\ndegree\r\ndiv\r\nmod\r\nlcm\r\ngcd\r\nflip\r\nconst\r\nmap\r\nvoid\r\nflap\r\nconj\r\ndisj\r\nnot\r\nmempty\r\ncompare\r\nmin\r\nmax\r\ncomparing\r\nclamp\r\nbetween\r\nsub\r\nnegate\r\nappend\r\nadd\r\nzero\r\nmul\r\none\r\nshow\r\nunit\r\nabsurd\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n  [\"builtin\", \"when\"],\r\n  [\"builtin\", \"unless\"],\r\n  [\"builtin\", \"liftA1\"],\r\n  [\"builtin\", \"apply\"],\r\n  [\"builtin\", \"bind\"],\r\n  [\"builtin\", \"discard\"],\r\n  [\"builtin\", \"join\"],\r\n  [\"builtin\", \"ifM\"],\r\n  [\"builtin\", \"identity\"],\r\n  [\"builtin\", \"whenM\"],\r\n  [\"builtin\", \"unlessM\"],\r\n  [\"builtin\", \"liftM1\"],\r\n  [\"builtin\", \"ap\"],\r\n  [\"builtin\", \"compose\"],\r\n  [\"builtin\", \"otherwise\"],\r\n  [\"builtin\", \"top\"],\r\n  [\"builtin\", \"bottom\"],\r\n  [\"builtin\", \"recip\"],\r\n  [\"builtin\", \"eq\"],\r\n  [\"builtin\", \"notEq\"],\r\n  [\"builtin\", \"degree\"],\r\n  [\"builtin\", \"div\"],\r\n  [\"builtin\", \"mod\"],\r\n  [\"builtin\", \"lcm\"],\r\n  [\"builtin\", \"gcd\"],\r\n  [\"builtin\", \"flip\"],\r\n  [\"builtin\", \"const\"],\r\n  [\"builtin\", \"map\"],\r\n  [\"builtin\", \"void\"],\r\n  [\"builtin\", \"flap\"],\r\n  [\"builtin\", \"conj\"],\r\n  [\"builtin\", \"disj\"],\r\n  [\"builtin\", \"not\"],\r\n  [\"builtin\", \"mempty\"],\r\n  [\"builtin\", \"compare\"],\r\n  [\"builtin\", \"min\"],\r\n  [\"builtin\", \"max\"],\r\n  [\"builtin\", \"comparing\"],\r\n  [\"builtin\", \"clamp\"],\r\n  [\"builtin\", \"between\"],\r\n  [\"builtin\", \"sub\"],\r\n  [\"builtin\", \"negate\"],\r\n  [\"builtin\", \"append\"],\r\n  [\"builtin\", \"add\"],\r\n  [\"builtin\", \"zero\"],\r\n  [\"builtin\", \"mul\"],\r\n  [\"builtin\", \"one\"],\r\n  [\"builtin\", \"show\"],\r\n  [\"builtin\", \"unit\"],\r\n  [\"builtin\", \"absurd\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all builtin.\r\n"
  },
  {
    "path": "tests/languages/purescript/char_feature.test",
    "content": "'a'\r\n'\\n'\r\n'\\23'\r\n'\\xFE'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"char\", \"'a'\"],\r\n\t[\"char\", \"'\\\\n'\"],\r\n\t[\"char\", \"'\\\\23'\"],\r\n\t[\"char\", \"'\\\\xFE'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for chars."
  },
  {
    "path": "tests/languages/purescript/comment_feature.test",
    "content": "-- foo\r\n{- foo\r\nbar -}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"-- foo\"],\r\n\t[\"comment\", \"{- foo\\r\\nbar -}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments."
  },
  {
    "path": "tests/languages/purescript/constant_feature.test",
    "content": "Foo\r\nFoo.Bar\r\nBaz.Foobar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", [\"Foo\"]],\r\n\t[\"constant\", [\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Bar\"\r\n\t]],\r\n\t[\"constant\", [\r\n\t\t\"Baz\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Foobar_42\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants.\r\n"
  },
  {
    "path": "tests/languages/purescript/hvariable_feature.test",
    "content": "foo\r\nFoo.bar\r\nBaz.foobar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"hvariable\", [\"foo\"]],\r\n\t[\"hvariable\", [\r\n\t\t\"Foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"bar\"\r\n\t]],\r\n\t[\"hvariable\", [\r\n\t\t\"Baz\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"foobar_42\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hvariables.\r\n"
  },
  {
    "path": "tests/languages/purescript/import_statement_feature.test",
    "content": "import Foo\r\nimport Foo_42.Bar as Foobar\r\nimport Foo.Bar as Foo.Baz hiding\r\nimport Foo.Bar (test)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" Foo\"\r\n\t]],\r\n\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" Foo_42\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Bar \",\r\n\t\t[\"keyword\", \"as\"],\r\n\t\t\" Foobar\"\r\n\t]],\r\n\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" Foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Bar \",\r\n\t\t[\"keyword\", \"as\"],\r\n\t\t\" Foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Baz \",\r\n\t\t[\"keyword\", \"hiding\"]\r\n\t]],\r\n\r\n\t[\"import-statement\", [\r\n\t\t[\"keyword\", \"import\"],\r\n\t\t\" Foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Bar\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"hvariable\", [\"test\"]],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for import statement.\r\n"
  },
  {
    "path": "tests/languages/purescript/issue3006.test",
    "content": "readBooleanOrIntAsBoolean ∷ Foreign → Foreign.F Boolean\nreadBooleanOrIntAsBoolean value =\n  Foreign.readBoolean value\n    <|> (toBool =<< Foreign.readInt value)\n  where\n  toBool ∷ Int → Foreign.F Boolean\n  toBool = case _ of\n    0 → pure false\n    1 → pure true\n    int → Foreign.fail (Foreign.ForeignError (\"Invalid integer: \" <> show int))\n\nisSuccessResponse ∷ ∀ a. AX.Response a → Boolean\nisSuccessResponse { status } = status >= (StatusCode 200) && status < (StatusCode 400)\n\ninfix 4 eq as ≡\n\nisMempty ∷ ∀ m. Monoid m → Boolean\nisMempty = _ ≡ mempty\n\n----------------------------------------------------\n\n[\n\t[\"hvariable\", [\"readBooleanOrIntAsBoolean\"]],\n\t[\"operator\", \"∷\"],\n\t[\"constant\", [\"Foreign\"]],\n\t[\"operator\", \"→\"],\n\t[\"constant\", [\n\t\t\"Foreign\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"F\"\n\t]],\n\t[\"constant\", [\"Boolean\"]],\n\n\t[\"hvariable\", [\"readBooleanOrIntAsBoolean\"]],\n\t[\"hvariable\", [\"value\"]],\n\t[\"operator\", \"=\"],\n\n\t[\"hvariable\", [\n\t\t\"Foreign\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"readBoolean\"\n\t]],\n\t[\"hvariable\", [\"value\"]],\n\n\t[\"operator\", \"<|>\"],\n\t[\"punctuation\", \"(\"],\n\t[\"hvariable\", [\"toBool\"]],\n\t[\"operator\", \"=<<\"],\n\t[\"hvariable\", [\n\t\t\"Foreign\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"readInt\"\n\t]],\n\t[\"hvariable\", [\"value\"]],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"where\"],\n\n\t[\"hvariable\", [\"toBool\"]],\n\t[\"operator\", \"∷\"],\n\t[\"constant\", [\"Int\"]],\n\t[\"operator\", \"→\"],\n\t[\"constant\", [\n\t\t\"Foreign\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"F\"\n\t]],\n\t[\"constant\", [\"Boolean\"]],\n\n\t[\"hvariable\", [\"toBool\"]],\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"case\"],\n\t[\"hvariable\", [\"_\"]],\n\t[\"keyword\", \"of\"],\n\n\t[\"number\", \"0\"],\n\t[\"operator\", \"→\"],\n\t[\"hvariable\", [\"pure\"]],\n\t[\"hvariable\", [\"false\"]],\n\n\t[\"number\", \"1\"],\n\t[\"operator\", \"→\"],\n\t[\"hvariable\", [\"pure\"]],\n\t[\"hvariable\", [\"true\"]],\n\n\t[\"hvariable\", [\"int\"]],\n\t[\"operator\", \"→\"],\n\t[\"hvariable\", [\n\t\t\"Foreign\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"fail\"\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"constant\", [\n\t\t\"Foreign\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"ForeignError\"\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Invalid integer: \\\"\"],\n\t[\"operator\", \"<>\"],\n\t[\"builtin\", \"show\"],\n\t[\"hvariable\", [\"int\"]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"hvariable\", [\"isSuccessResponse\"]],\n\t[\"operator\", \"∷\"],\n\t[\"keyword\", \"∀\"],\n\t[\"hvariable\", [\"a\"]],\n\t[\"punctuation\", \".\"],\n\t[\"constant\", [\n\t\t\"AX\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"Response\"\n\t]],\n\t[\"hvariable\", [\"a\"]],\n\t[\"operator\", \"→\"],\n\t[\"constant\", [\"Boolean\"]],\n\n\t[\"hvariable\", [\"isSuccessResponse\"]],\n\t[\"punctuation\", \"{\"],\n\t[\"hvariable\", [\"status\"]],\n\t[\"punctuation\", \"}\"],\n\t[\"operator\", \"=\"],\n\t[\"hvariable\", [\"status\"]],\n\t[\"operator\", \">=\"],\n\t[\"punctuation\", \"(\"],\n\t[\"constant\", [\"StatusCode\"]],\n\t[\"number\", \"200\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"&&\"],\n\t[\"hvariable\", [\"status\"]],\n\t[\"operator\", \"<\"],\n\t[\"punctuation\", \"(\"],\n\t[\"constant\", [\"StatusCode\"]],\n\t[\"number\", \"400\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"hvariable\", [\"infix\"]],\n\t[\"number\", \"4\"],\n\t[\"builtin\", \"eq\"],\n\t[\"hvariable\", [\"as\"]],\n\t[\"operator\", \"≡\"],\n\n\t[\"hvariable\", [\"isMempty\"]],\n\t[\"operator\", \"∷\"],\n\t[\"keyword\", \"∀\"],\n\t[\"hvariable\", [\"m\"]],\n\t[\"punctuation\", \".\"],\n\t[\"constant\", [\"Monoid\"]],\n\t[\"hvariable\", [\"m\"]],\n\t[\"operator\", \"→\"],\n\t[\"constant\", [\"Boolean\"]],\n\n\t[\"hvariable\", [\"isMempty\"]],\n\t[\"operator\", \"=\"],\n\t[\"hvariable\", [\"_\"]],\n\t[\"operator\", \"≡\"],\n\t[\"builtin\", \"mempty\"]\n]\n"
  },
  {
    "path": "tests/languages/purescript/keyword_feature.test",
    "content": "ado\r\ncase\r\nclass\r\ndata\r\nderive\r\ndo\r\nelse\r\nforall\r\nif\r\nin\r\ninfixl\r\ninfixr\r\ninstance\r\nlet\r\nmodule\r\nnewtype\r\nof\r\nprimitive\r\nthen\r\ntype\r\nwhere\r\n∀\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"ado\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"data\"],\r\n\t[\"keyword\", \"derive\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"forall\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"infixl\"],\r\n\t[\"keyword\", \"infixr\"],\r\n\t[\"keyword\", \"instance\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"keyword\", \"newtype\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"primitive\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"where\"],\r\n\t[\"keyword\", \"∀\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/purescript/number_feature.test",
    "content": "42\r\n3.14159\r\n2E3\r\n1.2e-4\r\n0.9e+1\r\n0o47\r\n0xBadFace\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2E3\"],\r\n\t[\"number\", \"1.2e-4\"],\r\n\t[\"number\", \"0.9e+1\"],\r\n\t[\"number\", \"0o47\"],\r\n\t[\"number\", \"0xBadFace\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal, octal and hexadecimal numbers."
  },
  {
    "path": "tests/languages/purescript/operator_feature.test",
    "content": "..\r\nreverse <<< sort\r\n`foo`\r\n`Foo.bar`\r\n+ - * /\r\n^ ^^ **\r\n&& ||\r\n< <= == /=\r\n>= > \\ |\r\n++ : !!\r\n\\\\ <- ->\r\n= :: =>\r\n>> >>= >@>\r\n~ ! @\r\n\r\n∷\r\n→ ←\r\n⇒ ⇐\r\n∘\r\n\r\n∘ × ÷ ≡ ≠ ⫽ ⩓ ⩔ ∧ ∨ ↝ ⨁ ⊹\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"..\"],\r\n\r\n\t[\"hvariable\", [\"reverse\"]],\r\n\t[\"operator\", \"<<<\"],\r\n\t[\"hvariable\", [\"sort\"]],\r\n\r\n\t[\"operator\", \"`foo`\"],\r\n\r\n\t[\"operator\", \"`Foo.bar`\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"^^\"],\r\n\t[\"operator\", \"**\"],\r\n\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"/=\"],\r\n\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"\\\\\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"operator\", \"!!\"],\r\n\r\n\t[\"operator\", \"\\\\\\\\\"],\r\n\t[\"operator\", \"<-\"],\r\n\t[\"operator\", \"->\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"::\"],\r\n\t[\"operator\", \"=>\"],\r\n\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \">@>\"],\r\n\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"@\"],\r\n\r\n\t[\"operator\", \"∷\"],\r\n\t[\"operator\", \"→\"], [\"operator\", \"←\"],\r\n\t[\"operator\", \"⇒\"], [\"operator\", \"⇐\"],\r\n\t[\"operator\", \"∘\"],\r\n\r\n\t[\"operator\", \"∘\"],\r\n\t[\"operator\", \"×\"],\r\n\t[\"operator\", \"÷\"],\r\n\t[\"operator\", \"≡\"],\r\n\t[\"operator\", \"≠\"],\r\n\t[\"operator\", \"⫽\"],\r\n\t[\"operator\", \"⩓\"],\r\n\t[\"operator\", \"⩔\"],\r\n\t[\"operator\", \"∧\"],\r\n\t[\"operator\", \"∨\"],\r\n\t[\"operator\", \"↝\"],\r\n\t[\"operator\", \"⨁\"],\r\n\t[\"operator\", \"⊹\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/purescript/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n\"foo \\\r\n  \\ bar\"\r\n\"foo -- comment lookalike \\\r\n  \\ bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"\\\"foo \\\\\\r\\n  \\\\ bar\\\"\"],\r\n\t[\"string\", \"\\\"foo -- comment lookalike \\\\\\r\\n  \\\\ bar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/python/boolean_feature.test",
    "content": "True\r\nFalse\r\nNone\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"True\"],\r\n\t[\"boolean\", \"False\"],\r\n\t[\"boolean\", \"None\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/python/builtin_feature.test",
    "content": "abs all any apply\r\nascii basestring bin bool\r\nbuffer bytearray bytes callable\r\nchr classmethod cmp coerce\r\ncompile complex delattr\r\ndict dir divmod enumerate\r\neval execfile file\r\nfilter float format frozenset\r\ngetattr globals hasattr hash\r\nhelp hex id input\r\nint intern isinstance issubclass\r\niter len list locals\r\nlong map max memoryview\r\nmin next object oct\r\nopen ord pow property\r\nrange raw_input reduce reload\r\nrepr reversed round set\r\nsetattr slice sorted staticmethod\r\nstr sum super tuple\r\ntype unichr unicode vars\r\nxrange()\r\nzip(\r\n__import__\r\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"abs\"], [\"builtin\", \"all\"], [\"builtin\", \"any\"], [\"builtin\", \"apply\"],\r\n\t[\"builtin\", \"ascii\"], [\"builtin\", \"basestring\"], [\"builtin\", \"bin\"], [\"builtin\", \"bool\"],\r\n\t[\"builtin\", \"buffer\"], [\"builtin\", \"bytearray\"], [\"builtin\", \"bytes\"], [\"builtin\", \"callable\"],\r\n\t[\"builtin\", \"chr\"], [\"builtin\", \"classmethod\"], [\"builtin\", \"cmp\"], [\"builtin\", \"coerce\"],\r\n\t[\"builtin\", \"compile\"], [\"builtin\", \"complex\"], [\"builtin\", \"delattr\"],\r\n\t[\"builtin\", \"dict\"], [\"builtin\", \"dir\"], [\"builtin\", \"divmod\"], [\"builtin\", \"enumerate\"],\r\n\t[\"builtin\", \"eval\"], [\"builtin\", \"execfile\"], [\"builtin\", \"file\"],\r\n\t[\"builtin\", \"filter\"], [\"builtin\", \"float\"], [\"builtin\", \"format\"], [\"builtin\", \"frozenset\"],\r\n\t[\"builtin\", \"getattr\"], [\"builtin\", \"globals\"], [\"builtin\", \"hasattr\"], [\"builtin\", \"hash\"],\r\n\t[\"builtin\", \"help\"], [\"builtin\", \"hex\"], [\"builtin\", \"id\"], [\"builtin\", \"input\"],\r\n\t[\"builtin\", \"int\"], [\"builtin\", \"intern\"], [\"builtin\", \"isinstance\"], [\"builtin\", \"issubclass\"],\r\n\t[\"builtin\", \"iter\"], [\"builtin\", \"len\"], [\"builtin\", \"list\"], [\"builtin\", \"locals\"],\r\n\t[\"builtin\", \"long\"], [\"builtin\", \"map\"], [\"builtin\", \"max\"], [\"builtin\", \"memoryview\"],\r\n\t[\"builtin\", \"min\"], [\"builtin\", \"next\"], [\"builtin\", \"object\"], [\"builtin\", \"oct\"],\r\n\t[\"builtin\", \"open\"], [\"builtin\", \"ord\"], [\"builtin\", \"pow\"], [\"builtin\", \"property\"],\r\n\t[\"builtin\", \"range\"], [\"builtin\", \"raw_input\"], [\"builtin\", \"reduce\"], [\"builtin\", \"reload\"],\r\n\t[\"builtin\", \"repr\"], [\"builtin\", \"reversed\"], [\"builtin\", \"round\"], [\"builtin\", \"set\"],\r\n\t[\"builtin\", \"setattr\"], [\"builtin\", \"slice\"], [\"builtin\", \"sorted\"], [\"builtin\", \"staticmethod\"],\r\n\t[\"builtin\", \"str\"], [\"builtin\", \"sum\"], [\"builtin\", \"super\"], [\"builtin\", \"tuple\"],\r\n\t[\"builtin\", \"type\"], [\"builtin\", \"unichr\"], [\"builtin\", \"unicode\"], [\"builtin\", \"vars\"],\r\n\t[\"builtin\", \"xrange\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"builtin\", \"zip\"], [\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"__import__\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all builtins."
  },
  {
    "path": "tests/languages/python/class-name_feature.test",
    "content": "class Foo\r\nclass foobar_42\r\nclass _\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"], [\"class-name\", \"Foo\"],\r\n\t[\"keyword\", \"class\"], [\"class-name\", \"foobar_42\"],\r\n\t[\"keyword\", \"class\"], [\"class-name\", \"_\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names."
  },
  {
    "path": "tests/languages/python/comment_feature.test",
    "content": "#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/python/decorator_feature.test",
    "content": "@some.decorator(foobar)\ndef foo(bar):\n\tpass\n\n@decorator\ndef foo(bar):\n\tpass\n\n@decorator\ndef foo(bar):\n\tpass\n\n----------------------------------------------------\n\n[\n\t[\"decorator\", [\n\t\t\"@some\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"decorator\"\n\t]],\n\t[\"punctuation\", \"(\"],\n\t\"foobar\",\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"def\"],\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t\"bar\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \":\"],\n\t[\"keyword\", \"pass\"],\n\n\t[\"decorator\", [\n\t\t\"@decorator\"\n\t]],\n\t[\"keyword\", \"def\"],\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t\"bar\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \":\"],\n\t[\"keyword\", \"pass\"],\n\n\t[\"decorator\", [\n\t\t\"@decorator\"\n\t]],\n\t[\"keyword\", \"def\"],\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t\"bar\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \":\"],\n\t[\"keyword\", \"pass\"]\n]\n\n----------------------------------------------------\n\nChecks for decorators.\n"
  },
  {
    "path": "tests/languages/python/function_feature.test",
    "content": "def Foo(\r\ndef foo_bar_42(\r\ndef _(\r\ndef foo_ ()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"def\"], [\"function\", \"Foo\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"def\"], [\"function\", \"foo_bar_42\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"def\"], [\"function\", \"_\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"def\"], [\"function\", \"foo_\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/python/issue1355.test",
    "content": "print('\"\"#')\r\nprint('\"trigger=\"#T'+str(3))\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"print\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"'\\\"\\\"#'\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"print\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"'\\\"trigger=\\\"#T'\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"builtin\", \"str\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comment-like substrings. See #1355"
  },
  {
    "path": "tests/languages/python/keyword_feature.test",
    "content": "as assert async await\r\nbreak class;\r\ncontinue def;\r\ndel elif else\r\nexcept exec finally\r\nfor from global if\r\nimport in is lambda\r\npass print raise return\r\ntry while with yield\r\nnonlocal\r\nand not or\r\nmatch case _:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"], [\"keyword\", \"assert\"], [\"keyword\", \"async\"], [\"keyword\", \"await\"],\r\n\t[\"keyword\", \"break\"], [\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"keyword\", \"def\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"del\"], [\"keyword\", \"elif\"], [\"keyword\", \"else\"],\r\n\t[\"keyword\", \"except\"], [\"keyword\", \"exec\"], [\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"for\"], [\"keyword\", \"from\"], [\"keyword\", \"global\"], [\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"], [\"keyword\", \"in\"], [\"keyword\", \"is\"], [\"keyword\", \"lambda\"],\r\n\t[\"keyword\", \"pass\"], [\"keyword\", \"print\"], [\"keyword\", \"raise\"], [\"keyword\", \"return\"],\r\n\t[\"keyword\", \"try\"], [\"keyword\", \"while\"], [\"keyword\", \"with\"], [\"keyword\", \"yield\"],\r\n\t[\"keyword\", \"nonlocal\"],\r\n\t[\"keyword\", \"and\"], [\"keyword\", \"not\"], [\"keyword\", \"or\"],\r\n\t[\"keyword\", \"match\"], [\"keyword\", \"case\"], [\"keyword\", \"_\"], [\"punctuation\", \":\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/python/number_feature.test",
    "content": "0b0001\r\n0o754\r\n0xBadFace\r\n42\r\n3.14159\r\n10.\r\n2.1E10\r\n0.3e-7\r\n4.8e+1\r\n42j\r\n0b_0001\r\n0b0_001\r\n0o_754\r\n0o7_540\r\n0x_BadFace\r\n0xBad_Face\r\n4_200\r\n4_200j\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0b0001\"],\r\n\t[\"number\", \"0o754\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"10.\"],\r\n\t[\"number\", \"2.1E10\"],\r\n\t[\"number\", \"0.3e-7\"],\r\n\t[\"number\", \"4.8e+1\"],\r\n\t[\"number\", \"42j\"],\r\n\t[\"number\", \"0b_0001\"],\r\n\t[\"number\", \"0b0_001\"],\r\n\t[\"number\", \"0o_754\"],\r\n\t[\"number\", \"0o7_540\"],\r\n\t[\"number\", \"0x_BadFace\"],\r\n\t[\"number\", \"0xBad_Face\"],\r\n\t[\"number\", \"4_200\"],\r\n\t[\"number\", \"4_200j\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hexadecimal, octal, binary and decimal numbers.\r\n"
  },
  {
    "path": "tests/languages/python/operator_feature.test",
    "content": "+ +=\r\n- -=\r\n* ** *= **=\r\n/ /= // //=\r\n% %=\r\n< <= <> <<\r\n> >= >>\r\n= ==\r\n!=\r\n:=\r\n& | ^ ~\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"**\"], [\"operator\", \"*=\"], [\"operator\", \"**=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"], [\"operator\", \"//\"], [\"operator\", \"//=\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<>\"], [\"operator\", \"<<\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \">>\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \":=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"|\"], [\"operator\", \"^\"], [\"operator\", \"~\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/python/string-interpolation_feature.test",
    "content": "f'The value is {value}.'\r\n\r\nf\"The value is {'4'}.\"\r\n\r\nf'input={value!s:#06x}'\r\n\r\nf'{{{4*10}}}'\r\n\r\nfr'x={4*10}\\n'\r\n\r\nf'''{x\r\n+1}'''\r\n\r\nf'mapping is { {a:b for (a, b) in ((1, 2), (3, 4))} }'\r\n\r\nf'{(lambda x: x*2)(3)}'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"f'The value is \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"value\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \".'\"]\r\n\t]],\r\n\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"f\\\"The value is \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"string\", \"'4'\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \".\\\"\"]\r\n\t]],\r\n\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"f'input=\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"value\",\r\n\t\t\t[\"conversion-option\", \"!s\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"format-spec\", \"#06x\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"'\"]\r\n\t]],\r\n\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"f'{{\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"4\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t[\"number\", \"10\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"}}'\"]\r\n\t]],\r\n\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"fr'x=\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"number\", \"4\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t[\"number\", \"10\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\\\n'\"]\r\n\t]],\r\n\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"f'''\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"x\\r\\n\",\r\n\t\t\t[\"operator\", \"+\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"'''\"]\r\n\t]],\r\n\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"f'mapping is \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"a\",\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\"b \",\r\n\t\t\t[\"keyword\", \"for\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"a\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\" b\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"keyword\", \"in\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"2\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"3\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"number\", \"4\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"'\"]\r\n\t]],\r\n\r\n\t[\"string-interpolation\", [\r\n\t\t[\"string\", \"f'\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"keyword\", \"lambda\"],\r\n\t\t\t\" x\",\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\" x\",\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t[\"number\", \"2\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"number\", \"3\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"'\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for string interpolation.\r\n"
  },
  {
    "path": "tests/languages/python/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n''\r\n'fo\\'obar'\r\n\"fo\\\" # comment obar\"\r\n\r\nr\"\\n\"\r\nb'foo'\r\nrb\"foo\\n\"\r\nu\"foo\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo\\\\'obar'\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\" # comment obar\\\"\"],\r\n\r\n\t[\"string\", \"r\\\"\\\\n\\\"\"],\r\n\t[\"string\", \"b'foo'\"],\r\n\t[\"string\", \"rb\\\"foo\\\\n\\\"\"],\r\n\t[\"string\", \"u\\\"foo\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/python/triple-quoted-string_feature.test",
    "content": "\"\"\"\"\"\"\r\n\"\"\"foobar\"\"\"\r\n\"\"\"fo\"o\r\n#bar\r\nbaz\"\"\"\r\n''''''\r\n'''foobar'''\r\n'''fo'o\r\n#bar\r\nbaz'''\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"\\\"\\\"\\\"\"],\r\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"foobar\\\"\\\"\\\"\"],\r\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"fo\\\"o\\r\\n#bar\\r\\nbaz\\\"\\\"\\\"\"],\r\n\t[\"triple-quoted-string\", \"''''''\"],\r\n\t[\"triple-quoted-string\", \"'''foobar'''\"],\r\n\t[\"triple-quoted-string\", \"'''fo'o\\r\\n#bar\\r\\nbaz'''\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for triple-quoted strings.\r\n"
  },
  {
    "path": "tests/languages/q/adverb_feature.test",
    "content": "' ':\r\n+/ +/:\r\n\\ \\:\r\neach\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"adverb\", \"'\"], [\"adverb\", \"':\"],\r\n\t[\"verb\", \"+\"], [\"adverb\", \"/\"], [\"verb\", \"+\"], [\"adverb\", \"/:\"],\r\n\t[\"adverb\", \"\\\\\"], [\"adverb\", \"\\\\:\"],\r\n\t[\"adverb\", \"each\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for adverbs."
  },
  {
    "path": "tests/languages/q/comment_feature.test",
    "content": "#!/usr/bin/env q\r\n/ Foobar \"baz\"\r\n\r\n/\r\nFoo\r\nbar \"baz\"\r\n\\\r\n\r\n`john / an atom of type symbol\r\n\r\n\\\r\nFoo\r\nBar \"baz\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#!/usr/bin/env q\"],\r\n\t[\"comment\", \"/ Foobar \\\"baz\\\"\"],\r\n\r\n\t[\"comment\", \"/\\r\\nFoo\\r\\nbar \\\"baz\\\"\\r\\n\\\\\"],\r\n\r\n\t[\"symbol\", \"`john\"], [\"comment\", \"/ an atom of type symbol\"],\r\n\r\n\t[\"comment\", \"\\\\\\r\\nFoo\\r\\nBar \\\"baz\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/q/datetime_feature.test",
    "content": "0Nm 0Nd 0Nz 0Nu 0Nv 0Nt\r\n0Wd 0Wt 0Wz\r\n\r\n2015.09m\r\n2015.09.08\r\n2015.09.08d\r\n2015.09.08z\r\n2015.09.08T08:25:32\r\n2015.09.08T08:25:32.000\r\n08:25\r\n08:25u\r\n08:25v\r\n08:25t\r\n08:25:32\r\n08:25:32:000\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"datetime\", \"0Nm\"], [\"datetime\", \"0Nd\"], [\"datetime\", \"0Nz\"], [\"datetime\", \"0Nu\"], [\"datetime\", \"0Nv\"], [\"datetime\", \"0Nt\"],\r\n\t[\"datetime\", \"0Wd\"], [\"datetime\", \"0Wt\"], [\"datetime\", \"0Wz\"],\r\n\r\n\t[\"datetime\", \"2015.09m\"],\r\n\t[\"datetime\", \"2015.09.08\"],\r\n\t[\"datetime\", \"2015.09.08d\"],\r\n\t[\"datetime\", \"2015.09.08z\"],\r\n\t[\"datetime\", \"2015.09.08T08:25:32\"],\r\n\t[\"datetime\", \"2015.09.08T08:25:32.000\"],\r\n\t[\"datetime\", \"08:25\"],\r\n\t[\"datetime\", \"08:25u\"],\r\n\t[\"datetime\", \"08:25v\"],\r\n\t[\"datetime\", \"08:25t\"],\r\n\t[\"datetime\", \"08:25:32\"],\r\n\t[\"datetime\", \"08:25:32:000\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for dates, times and datetimes."
  },
  {
    "path": "tests/languages/q/keyword_feature.test",
    "content": "\\foo\r\n\\foo_bar_42\r\n\r\nabs\r\nacos\r\naj\r\naj0\r\nall\r\nand\r\nany\r\nasc\r\nasin\r\nasof\r\natan\r\nattr\r\navg\r\navgs\r\nbin\r\nbinr\r\nby\r\nceiling\r\ncols\r\ncor\r\ncos\r\ncount\r\ncov\r\ncross\r\ncsv\r\ncut\r\ndelete\r\ndeltas\r\ndesc\r\ndev\r\ndiffer\r\ndistinct\r\ndiv\r\ndo\r\ndsave\r\nej\r\nenlist\r\neval\r\nexcept\r\nexec\r\nexit\r\nexp\r\nfby\r\nfills\r\nfirst\r\nfkeys\r\nflip\r\nfloor\r\nfrom\r\nget\r\ngetenv\r\ngroup\r\ngtime\r\nhclose\r\nhcount\r\nhdel\r\nhopen\r\nhsym\r\niasc\r\nidentity\r\nidesc\r\nif\r\nij\r\nin\r\ninsert\r\ninter\r\ninv\r\nkey\r\nkeys\r\nlast\r\nlike\r\nlist\r\nlj\r\nljf\r\nload\r\nlog\r\nlower\r\nlsq\r\nltime\r\nltrim\r\nmavg\r\nmax\r\nmaxs\r\nmcount\r\nmd5\r\nmdev\r\nmed\r\nmeta\r\nmin\r\nmins\r\nmmax\r\nmmin\r\nmmu\r\nmod\r\nmsum\r\nneg\r\nnext\r\nnot\r\nnull\r\nor\r\nover\r\nparse\r\npeach\r\npj\r\nplist\r\nprd\r\nprds\r\nprev\r\nprior\r\nrand\r\nrank\r\nratios\r\nraze\r\nread0\r\nread1\r\nreciprocal\r\nreval\r\nreverse\r\nrload\r\nrotate\r\nrsave\r\nrtrim\r\nsave\r\nscan\r\nscov\r\nsdev\r\nselect\r\nset\r\nsetenv\r\nshow\r\nsignum\r\nsin\r\nsqrt\r\nss\r\nssr\r\nstring\r\nsublist\r\nsum\r\nsums\r\nsv\r\nsvar\r\nsystem\r\ntables\r\ntan\r\ntil\r\ntrim\r\ntxf\r\ntype\r\nuj\r\nungroup\r\nunion\r\nupdate\r\nupper\r\nupsert\r\nvalue\r\nvar\r\nview\r\nviews\r\nvs\r\nwavg\r\nwhere\r\nwhile\r\nwithin\r\nwj\r\nwj1\r\nwsum\r\nww\r\nxasc\r\nxbar\r\nxcol\r\nxcols\r\nxdesc\r\nxexp\r\nxgroup\r\nxkey\r\nxlog\r\nxprev\r\nxrank\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"\\\\foo\"],\r\n\t[\"keyword\", \"\\\\foo_bar_42\"],\r\n\r\n\t[\"keyword\", \"abs\"],\r\n\t[\"keyword\", \"acos\"],\r\n\t[\"keyword\", \"aj\"],\r\n\t[\"keyword\", \"aj0\"],\r\n\t[\"keyword\", \"all\"],\r\n\t[\"keyword\", \"and\"],\r\n\t[\"keyword\", \"any\"],\r\n\t[\"keyword\", \"asc\"],\r\n\t[\"keyword\", \"asin\"],\r\n\t[\"keyword\", \"asof\"],\r\n\t[\"keyword\", \"atan\"],\r\n\t[\"keyword\", \"attr\"],\r\n\t[\"keyword\", \"avg\"],\r\n\t[\"keyword\", \"avgs\"],\r\n\t[\"keyword\", \"bin\"],\r\n\t[\"keyword\", \"binr\"],\r\n\t[\"keyword\", \"by\"],\r\n\t[\"keyword\", \"ceiling\"],\r\n\t[\"keyword\", \"cols\"],\r\n\t[\"keyword\", \"cor\"],\r\n\t[\"keyword\", \"cos\"],\r\n\t[\"keyword\", \"count\"],\r\n\t[\"keyword\", \"cov\"],\r\n\t[\"keyword\", \"cross\"],\r\n\t[\"keyword\", \"csv\"],\r\n\t[\"keyword\", \"cut\"],\r\n\t[\"keyword\", \"delete\"],\r\n\t[\"keyword\", \"deltas\"],\r\n\t[\"keyword\", \"desc\"],\r\n\t[\"keyword\", \"dev\"],\r\n\t[\"keyword\", \"differ\"],\r\n\t[\"keyword\", \"distinct\"],\r\n\t[\"keyword\", \"div\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"dsave\"],\r\n\t[\"keyword\", \"ej\"],\r\n\t[\"keyword\", \"enlist\"],\r\n\t[\"keyword\", \"eval\"],\r\n\t[\"keyword\", \"except\"],\r\n\t[\"keyword\", \"exec\"],\r\n\t[\"keyword\", \"exit\"],\r\n\t[\"keyword\", \"exp\"],\r\n\t[\"keyword\", \"fby\"],\r\n\t[\"keyword\", \"fills\"],\r\n\t[\"keyword\", \"first\"],\r\n\t[\"keyword\", \"fkeys\"],\r\n\t[\"keyword\", \"flip\"],\r\n\t[\"keyword\", \"floor\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"keyword\", \"getenv\"],\r\n\t[\"keyword\", \"group\"],\r\n\t[\"keyword\", \"gtime\"],\r\n\t[\"keyword\", \"hclose\"],\r\n\t[\"keyword\", \"hcount\"],\r\n\t[\"keyword\", \"hdel\"],\r\n\t[\"keyword\", \"hopen\"],\r\n\t[\"keyword\", \"hsym\"],\r\n\t[\"keyword\", \"iasc\"],\r\n\t[\"keyword\", \"identity\"],\r\n\t[\"keyword\", \"idesc\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"ij\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"insert\"],\r\n\t[\"keyword\", \"inter\"],\r\n\t[\"keyword\", \"inv\"],\r\n\t[\"keyword\", \"key\"],\r\n\t[\"keyword\", \"keys\"],\r\n\t[\"keyword\", \"last\"],\r\n\t[\"keyword\", \"like\"],\r\n\t[\"keyword\", \"list\"],\r\n\t[\"keyword\", \"lj\"],\r\n\t[\"keyword\", \"ljf\"],\r\n\t[\"keyword\", \"load\"],\r\n\t[\"keyword\", \"log\"],\r\n\t[\"keyword\", \"lower\"],\r\n\t[\"keyword\", \"lsq\"],\r\n\t[\"keyword\", \"ltime\"],\r\n\t[\"keyword\", \"ltrim\"],\r\n\t[\"keyword\", \"mavg\"],\r\n\t[\"keyword\", \"max\"],\r\n\t[\"keyword\", \"maxs\"],\r\n\t[\"keyword\", \"mcount\"],\r\n\t[\"keyword\", \"md5\"],\r\n\t[\"keyword\", \"mdev\"],\r\n\t[\"keyword\", \"med\"],\r\n\t[\"keyword\", \"meta\"],\r\n\t[\"keyword\", \"min\"],\r\n\t[\"keyword\", \"mins\"],\r\n\t[\"keyword\", \"mmax\"],\r\n\t[\"keyword\", \"mmin\"],\r\n\t[\"keyword\", \"mmu\"],\r\n\t[\"keyword\", \"mod\"],\r\n\t[\"keyword\", \"msum\"],\r\n\t[\"keyword\", \"neg\"],\r\n\t[\"keyword\", \"next\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"over\"],\r\n\t[\"keyword\", \"parse\"],\r\n\t[\"keyword\", \"peach\"],\r\n\t[\"keyword\", \"pj\"],\r\n\t[\"keyword\", \"plist\"],\r\n\t[\"keyword\", \"prd\"],\r\n\t[\"keyword\", \"prds\"],\r\n\t[\"keyword\", \"prev\"],\r\n\t[\"keyword\", \"prior\"],\r\n\t[\"keyword\", \"rand\"],\r\n\t[\"keyword\", \"rank\"],\r\n\t[\"keyword\", \"ratios\"],\r\n\t[\"keyword\", \"raze\"],\r\n\t[\"keyword\", \"read0\"],\r\n\t[\"keyword\", \"read1\"],\r\n\t[\"keyword\", \"reciprocal\"],\r\n\t[\"keyword\", \"reval\"],\r\n\t[\"keyword\", \"reverse\"],\r\n\t[\"keyword\", \"rload\"],\r\n\t[\"keyword\", \"rotate\"],\r\n\t[\"keyword\", \"rsave\"],\r\n\t[\"keyword\", \"rtrim\"],\r\n\t[\"keyword\", \"save\"],\r\n\t[\"keyword\", \"scan\"],\r\n\t[\"keyword\", \"scov\"],\r\n\t[\"keyword\", \"sdev\"],\r\n\t[\"keyword\", \"select\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"keyword\", \"setenv\"],\r\n\t[\"keyword\", \"show\"],\r\n\t[\"keyword\", \"signum\"],\r\n\t[\"keyword\", \"sin\"],\r\n\t[\"keyword\", \"sqrt\"],\r\n\t[\"keyword\", \"ss\"],\r\n\t[\"keyword\", \"ssr\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"keyword\", \"sublist\"],\r\n\t[\"keyword\", \"sum\"],\r\n\t[\"keyword\", \"sums\"],\r\n\t[\"keyword\", \"sv\"],\r\n\t[\"keyword\", \"svar\"],\r\n\t[\"keyword\", \"system\"],\r\n\t[\"keyword\", \"tables\"],\r\n\t[\"keyword\", \"tan\"],\r\n\t[\"keyword\", \"til\"],\r\n\t[\"keyword\", \"trim\"],\r\n\t[\"keyword\", \"txf\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"uj\"],\r\n\t[\"keyword\", \"ungroup\"],\r\n\t[\"keyword\", \"union\"],\r\n\t[\"keyword\", \"update\"],\r\n\t[\"keyword\", \"upper\"],\r\n\t[\"keyword\", \"upsert\"],\r\n\t[\"keyword\", \"value\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"view\"],\r\n\t[\"keyword\", \"views\"],\r\n\t[\"keyword\", \"vs\"],\r\n\t[\"keyword\", \"wavg\"],\r\n\t[\"keyword\", \"where\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"within\"],\r\n\t[\"keyword\", \"wj\"],\r\n\t[\"keyword\", \"wj1\"],\r\n\t[\"keyword\", \"wsum\"],\r\n\t[\"keyword\", \"ww\"],\r\n\t[\"keyword\", \"xasc\"],\r\n\t[\"keyword\", \"xbar\"],\r\n\t[\"keyword\", \"xcol\"],\r\n\t[\"keyword\", \"xcols\"],\r\n\t[\"keyword\", \"xdesc\"],\r\n\t[\"keyword\", \"xexp\"],\r\n\t[\"keyword\", \"xgroup\"],\r\n\t[\"keyword\", \"xkey\"],\r\n\t[\"keyword\", \"xlog\"],\r\n\t[\"keyword\", \"xprev\"],\r\n\t[\"keyword\", \"xrank\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/q/number_feature.test",
    "content": "0w 0n\r\n0W 0Wh 0Wj\r\n0N 0Nh 0Nj 0Ne\r\n\r\n0xBadFace\r\n42\r\n3.14159\r\n3e8\r\n0.4e-7\r\n3.12e+42\r\n42h 42j 42f\r\n4.00e 1b\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0w\"], [\"number\", \"0n\"],\r\n\t[\"number\", \"0W\"], [\"number\", \"0Wh\"], [\"number\", \"0Wj\"],\r\n\t[\"number\", \"0N\"], [\"number\", \"0Nh\"], [\"number\", \"0Nj\"], [\"number\", \"0Ne\"],\r\n\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3e8\"],\r\n\t[\"number\", \"0.4e-7\"],\r\n\t[\"number\", \"3.12e+42\"],\r\n\t[\"number\", \"42h\"], [\"number\", \"42j\"], [\"number\", \"42f\"],\r\n\t[\"number\", \"4.00e\"], [\"number\", \"1b\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/q/punctuation_feature.test",
    "content": "( ) { } [ ] ;\n\nsp.s\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\n\\r\\nsp\", [\"punctuation\", \".\"], \"s\"\n]\n"
  },
  {
    "path": "tests/languages/q/string_feature.test",
    "content": "\"\"\r\n\"Fo\\\"obar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Fo\\\\\\\"obar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/q/symbol_feature.test",
    "content": "`\r\n`foobar\r\n`:www.example.com:8888\r\n`.foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"symbol\", \"`\"],\r\n\t[\"symbol\", \"`foobar\"],\r\n\t[\"symbol\", \"`:www.example.com:8888\"],\r\n\t[\"symbol\", \"`.foo\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for symbols."
  },
  {
    "path": "tests/languages/q/verb_feature.test",
    "content": ". .:\r\n0: 1:\r\n< <: <> <>: <= <=:\r\n> >: >= >=:\r\n: ::\r\n+ +: - -:\r\n* *: % %:\r\n, ,: ! !:\r\n? ?: _ _:\r\n~ ~: = =:\r\n| |: $ $:\r\n& &: # #:\r\n@ @: ^ ^:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"verb\", \".\"], [\"verb\", \".:\"],\r\n\t[\"verb\", \"0:\"], [\"verb\", \"1:\"],\r\n\t[\"verb\", \"<\"], [\"verb\", \"<:\"], [\"verb\", \"<>\"], [\"verb\", \"<>:\"], [\"verb\", \"<=\"], [\"verb\", \"<=:\"],\r\n\t[\"verb\", \">\"], [\"verb\", \">:\"], [\"verb\", \">=\"], [\"verb\", \">=:\"],\r\n\t[\"verb\", \":\"], [\"verb\", \"::\"],\r\n\t[\"verb\", \"+\"], [\"verb\", \"+:\"], [\"verb\", \"-\"], [\"verb\", \"-:\"],\r\n\t[\"verb\", \"*\"], [\"verb\", \"*:\"], [\"verb\", \"%\"], [\"verb\", \"%:\"],\r\n\t[\"verb\", \",\"], [\"verb\", \",:\"], [\"verb\", \"!\"], [\"verb\", \"!:\"],\r\n\t[\"verb\", \"?\"], [\"verb\", \"?:\"], [\"verb\", \"_\"], [\"verb\", \"_:\"],\r\n\t[\"verb\", \"~\"], [\"verb\", \"~:\"], [\"verb\", \"=\"], [\"verb\", \"=:\"],\r\n\t[\"verb\", \"|\"], [\"verb\", \"|:\"], [\"verb\", \"$\"], [\"verb\", \"$:\"],\r\n\t[\"verb\", \"&\"], [\"verb\", \"&:\"], [\"verb\", \"#\"], [\"verb\", \"#:\"],\r\n\t[\"verb\", \"@\"], [\"verb\", \"@:\"], [\"verb\", \"^\"], [\"verb\", \"^:\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for verbs."
  },
  {
    "path": "tests/languages/qml/class-name_feature.test",
    "content": "Foo {\r\n\tbar: FooBar {}\r\n\tBaz {}\r\n\tRotationAnimation on rotation {\r\n\t\tloops: Animation.Infinite\r\n\t\tfrom: 0\r\n\t\tto: 360\r\n\t}\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"bar\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", \"FooBar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"class-name\", \"Baz\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"class-name\", \"RotationAnimation\"],\r\n\t[\"keyword\", \"on\"],\r\n\t\" rotation \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"loops\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t\"Animation\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Infinite\"\r\n\t]],\r\n\t[\"property\", \"from\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"number\", \"0\"]\r\n\t]],\r\n\t[\"property\", \"to\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"number\", \"360\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names.\r\n"
  },
  {
    "path": "tests/languages/qml/comment_feature.test",
    "content": "// foo\r\n/*\r\n bar\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// foo\"],\r\n\t[\"comment\", \"/*\\r\\n bar\\r\\n */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/qml/import_feature.test",
    "content": "import QtQuick 2.9\nimport QtQml.Models 2.2\nimport Person 1.0\nimport \"componentCreation.js\" as MyScript\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"import\"],\n\t\" QtQuick 2.9\\r\\n\",\n\n\t[\"keyword\", \"import\"],\n\t\" QtQml.Models 2.2\\r\\n\",\n\n\t[\"keyword\", \"import\"],\n\t\" Person 1.0\\r\\n\",\n\n\t[\"keyword\", \"import\"],\n\t[\"string\", \"\\\"componentCreation.js\\\"\"],\n\t[\"keyword\", \"as\"],\n\t\" MyScript\"\n]\n\n----------------------------------------------------\n\nChecks for imports.\n"
  },
  {
    "path": "tests/languages/qml/javascript-function_feature.test",
    "content": "Foo {\r\n\tfunction onClicked(mouse) { foo(mouse) }\r\n\r\n\tfunction calculateMyHeight() {\r\n\t\treturn Math.max(otherItem.height, thirdItem.height);\r\n\t\tvar foo = \"//\";\r\n\t\tlet bar = (1 / 1);\r\n\t\tif (true) {} else {}\r\n\t}\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"javascript-function\", [\r\n\t\t[\"keyword\", \"function\"],\r\n\t\t[\"function\", \"onClicked\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"parameter\", [\r\n\t\t\t\"mouse\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"function\", \"foo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"mouse\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\t[\"javascript-function\", [\r\n\t\t[\"keyword\", \"function\"],\r\n\t\t[\"function\", \"calculateMyHeight\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"keyword\", \"return\"],\r\n\t\t\" Math\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"max\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"otherItem\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"height\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" thirdItem\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"height\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"keyword\", \"var\"],\r\n\t\t\" foo \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"//\\\"\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t\" bar \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"/\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"keyword\", \"else\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/qml/keyword_feature.test",
    "content": "as\r\nimport\r\non\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"on\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/qml/property_feature.test",
    "content": "Foo {\r\n\tbar: 4\r\n\ta: 0; b: 1; c: 2\r\n\tComponents.foo: 2\r\n\r\n\tBar { a: 0; b: Baz {}; c: 2 }\r\n\r\n\tproperty Component mycomponent: comp1\r\n\tproperty color color: \"green\"\r\n\r\n\t// produces warning: \"Unable to assign [undefined] to double value\"\r\n\tvalue: if (mouse.pressed) mouse.mouseX\r\n}\r\n\r\nBirthdayParty {\r\n\tguests: [\r\n\t\tPerson { name: \"Leo Hodges\" },\r\n\t\tPerson { name: \"Jack Smith\" },\r\n\t\tPerson { name: \"Anne Brown\" }\r\n\t]\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"bar\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"number\", \"4\"]\r\n\t]],\r\n\t[\"property\", \"a\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"number\", \"0\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"property\", \"b\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"number\", \"1\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"property\", \"c\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"number\", \"2\"]\r\n\t]],\r\n\t[\"property\", \"Components.foo\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"number\", \"2\"]\r\n\t]],\r\n\r\n\t[\"class-name\", \"Bar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"a\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"number\", \"0\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"property\", \"b\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", \"Baz\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"property\", \"c\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"number\", \"2\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"property\", [\r\n\t\t[\"keyword\", \"property\"],\r\n\t\t[\"property\", \"Component\"],\r\n\t\t[\"property\", \"mycomponent\"]\r\n\t]],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t\"comp1\"\r\n\t]],\r\n\t[\"property\", [\r\n\t\t[\"keyword\", \"property\"],\r\n\t\t[\"property\", \"color\"],\r\n\t\t[\"property\", \"color\"]\r\n\t]],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"string\", \"\\\"green\\\"\"]\r\n\t]],\r\n\r\n\t[\"comment\", \"// produces warning: \\\"Unable to assign [undefined] to double value\\\"\"],\r\n\t[\"property\", \"value\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"mouse\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"pressed\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t\" mouse\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"mouseX\"\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\r\n\t[\"class-name\", \"BirthdayParty\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"guests\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"class-name\", \"Person\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"name\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"string\", \"\\\"Leo Hodges\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", \"Person\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"name\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"string\", \"\\\"Jack Smith\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", \"Person\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"name\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"javascript-expression\", [\r\n\t\t[\"string\", \"\\\"Anne Brown\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties.\r\n"
  },
  {
    "path": "tests/languages/qml/punctuation_feature.test",
    "content": "{} [] : ; ,\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \",\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for punctuation.\r\n"
  },
  {
    "path": "tests/languages/qore/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/qore/comment_feature.test",
    "content": "/* foo */\r\n/* foo\r\nbar */\r\n//\r\n// foobar\r\n#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/* foo */\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foobar\"],\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/qore/function_feature.test",
    "content": "foo()\r\nfoo_bar()\r\nFoo_bar_42()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"foo_bar\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"Foo_bar_42\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/qore/keyword_feature.test",
    "content": "abstract any assert binary\r\nbool boolean break byte\r\ncase catch char\r\nclass;\r\ncode const continue data\r\ndefault do double else\r\nenum\r\nextends;\r\nfinal finally float for\r\ngoto hash if\r\nimplements;\r\nimport inherits\r\ninstanceof;\r\nint\r\ninterface;\r\nlong my native\r\nnew;\r\nnothing null object our\r\nown private reference\r\nrethrow return short\r\nsoftint softfloat softnumber\r\nsoftbool softstring softdate\r\nsoftlist static strictfp\r\nstring sub super switch\r\nsynchronized this throw\r\nthrows transient try\r\nvoid volatile while\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"], [\"keyword\", \"any\"], [\"keyword\", \"assert\"], [\"keyword\", \"binary\"],\r\n\t[\"keyword\", \"bool\"], [\"keyword\", \"boolean\"], [\"keyword\", \"break\"], [\"keyword\", \"byte\"],\r\n\t[\"keyword\", \"case\"], [\"keyword\", \"catch\"], [\"keyword\", \"char\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"code\"], [\"keyword\", \"const\"], [\"keyword\", \"continue\"], [\"keyword\", \"data\"],\r\n\t[\"keyword\", \"default\"], [\"keyword\", \"do\"], [\"keyword\", \"double\"], [\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"final\"], [\"keyword\", \"finally\"], [\"keyword\", \"float\"], [\"keyword\", \"for\"],\r\n\t[\"keyword\", \"goto\"], [\"keyword\", \"hash\"], [\"keyword\", \"if\"],\r\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"import\"], [\"keyword\", \"inherits\"],\r\n\t[\"keyword\", \"instanceof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"long\"], [\"keyword\", \"my\"], [\"keyword\", \"native\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"nothing\"], [\"keyword\", \"null\"], [\"keyword\", \"object\"], [\"keyword\", \"our\"],\r\n\t[\"keyword\", \"own\"], [\"keyword\", \"private\"], [\"keyword\", \"reference\"],\r\n\t[\"keyword\", \"rethrow\"], [\"keyword\", \"return\"], [\"keyword\", \"short\"],\r\n\t[\"keyword\", \"softint\"], [\"keyword\", \"softfloat\"], [\"keyword\", \"softnumber\"],\r\n\t[\"keyword\", \"softbool\"], [\"keyword\", \"softstring\"], [\"keyword\", \"softdate\"],\r\n\t[\"keyword\", \"softlist\"], [\"keyword\", \"static\"], [\"keyword\", \"strictfp\"],\r\n\t[\"keyword\", \"string\"], [\"keyword\", \"sub\"], [\"keyword\", \"super\"], [\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"synchronized\"], [\"keyword\", \"this\"], [\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"throws\"], [\"keyword\", \"transient\"], [\"keyword\", \"try\"],\r\n\t[\"keyword\", \"void\"], [\"keyword\", \"volatile\"], [\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/qore/number_feature.test",
    "content": "0b11110000\r\n0xBadFace\r\n0xabp-3\r\n42\r\n3.14159\r\n3.2e8f\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0b11110000\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0xabp-3\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3.2e8f\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/qore/operator_feature.test",
    "content": "+ ++ +=\r\n- -- -=\r\n! != !== !~\r\n~\r\n* *=\r\n/ /=\r\n% %=\r\n^ ^=\r\n?\r\n= == === =~\r\n> >= >> >>=\r\n< <= <=> << <<=\r\n& && &=\r\n| || |=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"++\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"--\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"], [\"operator\", \"!==\"], [\"operator\", \"!~\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%=\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"===\"], [\"operator\", \"=~\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \">>\"], [\"operator\", \">>=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<=>\"], [\"operator\", \"<<\"], [\"operator\", \"<<=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"&=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"], [\"operator\", \"|=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/qore/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\r\nbar\"\r\n''\r\n'fo\\'o\r\nbar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\r\\nbar\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo\\\\'o\\r\\nbar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/qore/variable_feature.test",
    "content": "$foobar\r\n$foo_bar_42\r\n$Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$foobar\"],\r\n\t[\"variable\", \"$foo_bar_42\"],\r\n\t[\"variable\", \"$Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/qsharp/comments_feature.test",
    "content": "// The following using block creates a fresh qubit and initializes it\r\n// in the |0> state.\r\n\r\nuse qubit = Qubit();\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// The following using block creates a fresh qubit and initializes it\"],\r\n\t[\"comment\", \"// in the |0> state.\"],\r\n\t[\"keyword\", \"use\"],\r\n\t\" qubit \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"Qubit\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments\r\n"
  },
  {
    "path": "tests/languages/qsharp/if_with_function_feature.test",
    "content": "if result == One { \r\n\tX(qubit); \r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"if\"],\r\n\t\" result \",\r\n\t[\"operator\", \"==\"],\r\n\t[\"keyword\", \"One\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"function\", \"X\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"qubit\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n\r\n----------------------------------------------------\r\n\r\nChecks for if, equality and function\r\n"
  },
  {
    "path": "tests/languages/qsharp/keyword_feature.test",
    "content": "// type\nAdj\nBigInt\nBool\nCtl\nDouble\nfalse\nInt\nOne\nPauli\nPauliI\nPauliX\nPauliY\nPauliZ\nQubit\nRange\nResult\nString\ntrue\nUnit\nZero\n\n// other\nAdjoint\nadjoint\napply\nas\nauto\nbody\nborrow\nborrowing\nControlled\ncontrolled\ndistribute\nelif\nelse\nfail\nfixup\nfor\nfunction\nif\nin\ninternal\nintrinsic\ninvert\nis\nlet\nmutable\nnamespace\nnew\nnewtype\nopen\noperation\nrepeat\nreturn\nself\nset\nuntil\nuse\nusing\nwhile\nwithin\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// type\"],\n\t[\"keyword\", \"Adj\"],\n\t[\"keyword\", \"BigInt\"],\n\t[\"keyword\", \"Bool\"],\n\t[\"keyword\", \"Ctl\"],\n\t[\"keyword\", \"Double\"],\n\t[\"keyword\", \"false\"],\n\t[\"keyword\", \"Int\"],\n\t[\"keyword\", \"One\"],\n\t[\"keyword\", \"Pauli\"],\n\t[\"keyword\", \"PauliI\"],\n\t[\"keyword\", \"PauliX\"],\n\t[\"keyword\", \"PauliY\"],\n\t[\"keyword\", \"PauliZ\"],\n\t[\"keyword\", \"Qubit\"],\n\t[\"keyword\", \"Range\"],\n\t[\"keyword\", \"Result\"],\n\t[\"keyword\", \"String\"],\n\t[\"keyword\", \"true\"],\n\t[\"keyword\", \"Unit\"],\n\t[\"keyword\", \"Zero\"],\n\n\t[\"comment\", \"// other\"],\n\t[\"keyword\", \"Adjoint\"],\n\t[\"keyword\", \"adjoint\"],\n\t[\"keyword\", \"apply\"],\n\t[\"keyword\", \"as\"],\n\t[\"keyword\", \"auto\"],\n\t[\"keyword\", \"body\"],\n\t[\"keyword\", \"borrow\"],\n\t[\"keyword\", \"borrowing\"],\n\t[\"keyword\", \"Controlled\"],\n\t[\"keyword\", \"controlled\"],\n\t[\"keyword\", \"distribute\"],\n\t[\"keyword\", \"elif\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"fail\"],\n\t[\"keyword\", \"fixup\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"function\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"internal\"],\n\t[\"keyword\", \"intrinsic\"],\n\t[\"keyword\", \"invert\"],\n\t[\"keyword\", \"is\"],\n\t[\"keyword\", \"let\"],\n\t[\"keyword\", \"mutable\"],\n\t[\"keyword\", \"namespace\"],\n\t[\"keyword\", \"new\"],\n\t[\"keyword\", \"newtype\"],\n\t[\"keyword\", \"open\"],\n\t[\"keyword\", \"operation\"],\n\t[\"keyword\", \"repeat\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"self\"],\n\t[\"keyword\", \"set\"],\n\t[\"keyword\", \"until\"],\n\t[\"keyword\", \"use\"],\n\t[\"keyword\", \"using\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"within\"]\n]\n"
  },
  {
    "path": "tests/languages/qsharp/namespace_feature.test",
    "content": "namespace Quantum.App1 {\r\n    open Microsoft.Quantum.Canon;\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"namespace\"],\r\n\t[\"class-name\", [\r\n\t\t\"Quantum\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"App1\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"open\"],\r\n\t[\"class-name\", [\r\n\t\t\"Microsoft\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Quantum\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Canon\"\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n\r\n----------------------------------------------------\r\n\r\nChecks for namespace declaration and import\r\n"
  },
  {
    "path": "tests/languages/qsharp/operators_feature.test",
    "content": "and or not\r\nand= or=\r\n<- <= -> =>\r\n* / + - = ^ ! %\r\n*= /= += -= == ^= != %=\r\n>>> >>>= <<< <<<= \r\n^^^ ^^^= \r\n||| |||=\r\n&&& &&&=\r\nw/ w/=\r\n~~~\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"and\"], [\"operator\", \"or\"], [\"operator\", \"not\"],\r\n\t[\"operator\", \"and=\"], [\"operator\", \"or=\"],\r\n\t[\"operator\", \"<-\"], [\"operator\", \"<=\"], [\"operator\", \"->\"], [\"operator\", \"=>\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"=\"], [\"operator\", \"^\"], [\"operator\", \"!\"], [\"operator\", \"%\"],\r\n\t[\"operator\", \"*=\"], [\"operator\", \"/=\"], [\"operator\", \"+=\"], [\"operator\", \"-=\"], [\"operator\", \"==\"], [\"operator\", \"^=\"], [\"operator\", \"!=\"], [\"operator\", \"%=\"],\r\n\t[\"operator\", \">>>\"], [\"operator\", \">>>=\"], [\"operator\", \"<<<\"], [\"operator\", \"<<<=\"],\r\n\t[\"operator\", \"^^^\"], [\"operator\", \"^^^=\"],\r\n\t[\"operator\", \"|||\"], [\"operator\", \"|||=\"],\r\n\t[\"operator\", \"&&&\"], [\"operator\", \"&&&=\"],\r\n\t[\"operator\", \"w/\"], [\"operator\", \"w/=\"],\r\n\t[\"operator\", \"~~~\"]\r\n]\r\n\r\n\r\n----------------------------------------------------\r\n\r\nChecks for opertors\r\n"
  },
  {
    "path": "tests/languages/qsharp/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"foo\\\"\\n\"\n\n$\"\"\n$\"foo\"\n$\"\\\"\"\n$\"foo{1+1}baz\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"foo\\\\\\\"\\\\n\\\"\"],\n\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"$\\\"\\\"\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"$\\\"foo\\\"\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"$\\\"\\\\\\\"\\\"\"]\n\t]],\n\t[\"interpolation-string\", [\n\t\t[\"string\", \"$\\\"foo\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"{\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"number\", \"1\"],\n\t\t\t\t[\"operator\", \"+\"],\n\t\t\t\t[\"number\", \"1\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"baz\\\"\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/qsharp/variable_assignment_numbers_feature.test",
    "content": "let var1 = 3; \r\nmutable var2 = 5L; \r\nset var2 = var2 + 1.5;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"let\"],\r\n\t\" var1 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"mutable\"],\r\n\t\" var2 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"5L\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"set\"],\r\n\t\" var2 \",\r\n\t[\"operator\", \"=\"],\r\n\t\" var2 \",\r\n\t[\"operator\", \"+\"],\r\n\t[\"number\", \"1.5\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variable assignment and numbers\r\n"
  },
  {
    "path": "tests/languages/r/boolean_feature.test",
    "content": "TRUE\r\nFALSE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"TRUE\"],\r\n\t[\"boolean\", \"FALSE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/r/comment_feature.test",
    "content": "#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/r/ellipsis_feature.test",
    "content": "...\r\n..1\r\n..42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"ellipsis\", \"...\"],\r\n\t[\"ellipsis\", \"..1\"],\r\n\t[\"ellipsis\", \"..42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for ellipsis and special identifiers."
  },
  {
    "path": "tests/languages/r/keyword_feature.test",
    "content": "if else repeat\r\nwhile function\r\nfor in next\r\nbreak NULL NA\r\nNA_integer_\r\nNA_real_\r\nNA_complex_\r\nNA_character_\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"if\"], [\"keyword\", \"else\"], [\"keyword\", \"repeat\"],\r\n\t[\"keyword\", \"while\"], [\"keyword\", \"function\"],\r\n\t[\"keyword\", \"for\"], [\"keyword\", \"in\"], [\"keyword\", \"next\"],\r\n\t[\"keyword\", \"break\"], [\"keyword\", \"NULL\"], [\"keyword\", \"NA\"],\r\n\t[\"keyword\", \"NA_integer_\"],\r\n\t[\"keyword\", \"NA_real_\"],\r\n\t[\"keyword\", \"NA_complex_\"],\r\n\t[\"keyword\", \"NA_character_\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/r/number_feature.test",
    "content": "NaN Inf\r\n0xBadFace\r\n0xf4.42\r\n0x21.2p2\r\n0xffP+4\r\n0xeap-1\r\n42\r\n42L\r\n3.14159\r\n3.2E4\r\n4e+8\r\n0.1e-12\r\n2i\r\n4.1i\r\n1e-2i\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"NaN\"], [\"number\", \"Inf\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0xf4.42\"],\r\n\t[\"number\", \"0x21.2p2\"],\r\n\t[\"number\", \"0xffP+4\"],\r\n\t[\"number\", \"0xeap-1\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"42L\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3.2E4\"],\r\n\t[\"number\", \"4e+8\"],\r\n\t[\"number\", \"0.1e-12\"],\r\n\t[\"number\", \"2i\"],\r\n\t[\"number\", \"4.1i\"],\r\n\t[\"number\", \"1e-2i\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hexadecimal, decimal and complex numbers."
  },
  {
    "path": "tests/languages/r/operator_feature.test",
    "content": "+ * / ^\r\n~ $ @\r\n- -> ->>\r\n> >=\r\n< <= <- <<-\r\n= ==\r\n! !=\r\n& &&\r\n| ||\r\n: ::\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"^\"],\r\n\t[\"operator\", \"~\"], [\"operator\", \"$\"], [\"operator\", \"@\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"->\"], [\"operator\", \"->>\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<-\"], [\"operator\", \"<<-\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \":\"], [\"operator\", \"::\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/r/percent-operator_feature.test",
    "content": "%% %*% %/%\r\n%in% %o% %x%\r\n%foobar%\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"percent-operator\", \"%%\"], [\"percent-operator\", \"%*%\"], [\"percent-operator\", \"%/%\"],\r\n\t[\"percent-operator\", \"%in%\"], [\"percent-operator\", \"%o%\"], [\"percent-operator\", \"%x%\"],\r\n\t[\"percent-operator\", \"%foobar%\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for user-defined operators and operators starting with %."
  },
  {
    "path": "tests/languages/r/punctuation_feature.test",
    "content": "( ) { } [ ] , ;\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/r/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n''\r\n'fo\\'obar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo\\\\'obar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-quoted and double-quoted strings."
  },
  {
    "path": "tests/languages/racket/boolean_feature.test",
    "content": "#t\r\n#f\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"#t\"],\r\n\t[\"boolean\", \"#f\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/racket/builtin_feature.test",
    "content": "(cons)\r\n(car)\r\n(cdr)\r\n(null?)\r\n(pair?)\r\n(boolean?)\r\n(eof-object?)\r\n(char?)\r\n(procedure?)\r\n(number?)\r\n(port?)\r\n(string?)\r\n(vector?)\r\n(symbol?)\r\n(bytevector?)\r\n(list)\r\n(call-with-current-continuation)\r\n(call/cc)\r\n(append)\r\n(abs)\r\n(apply)\r\n(eval)\r\n\r\n[cons]\r\n[car]\r\n[cdr]\r\n[null?]\r\n[pair?]\r\n[boolean?]\r\n[eof-object?]\r\n[char?]\r\n[procedure?]\r\n[number?]\r\n[port?]\r\n[string?]\r\n[vector?]\r\n[symbol?]\r\n[bytevector?]\r\n[list]\r\n[call-with-current-continuation]\r\n[call/cc]\r\n[append]\r\n[abs]\r\n[apply]\r\n[eval]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"cons\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"car\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"cdr\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"null?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"pair?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"boolean?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"eof-object?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"char?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"procedure?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"number?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"port?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"symbol?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"bytevector?\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"list\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"call-with-current-continuation\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"call/cc\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"append\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"abs\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"apply\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"eval\"], [\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"cons\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"car\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"cdr\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"null?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"pair?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"boolean?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"eof-object?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"char?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"procedure?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"number?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"port?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"string?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"vector?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"symbol?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"bytevector?\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"list\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"call-with-current-continuation\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"call/cc\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"append\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"abs\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"apply\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"eval\"], [\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for builtins.\r\n"
  },
  {
    "path": "tests/languages/racket/char_feature.test",
    "content": "#\\a                     ; lowercase letter\n#\\A                     ; uppercase letter\n#\\(                     ; left parenthesis\n#\\space                 ; the space character\n#\\newline               ; the newline character\n\n#\\c-a                   ; Control-a\n#\\meta-b                ; Meta-b\n#\\c-s-m-h-a             ; Control-Meta-Super-Hyper-A\n\n#\\; #\\' #\\\"\n\n#\\u0041\n#\\x10FFFF\n#\\λ\n#\\)\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"#\\\\a\"], [\"comment\", \"; lowercase letter\"],\n\t[\"char\", \"#\\\\A\"], [\"comment\", \"; uppercase letter\"],\n\t[\"char\", \"#\\\\(\"], [\"comment\", \"; left parenthesis\"],\n\t[\"char\", \"#\\\\space\"], [\"comment\", \"; the space character\"],\n\t[\"char\", \"#\\\\newline\"], [\"comment\", \"; the newline character\"],\n\n\t[\"char\", \"#\\\\c-a\"], [\"comment\", \"; Control-a\"],\n\t[\"char\", \"#\\\\meta-b\"], [\"comment\", \"; Meta-b\"],\n\t[\"char\", \"#\\\\c-s-m-h-a\"], [\"comment\", \"; Control-Meta-Super-Hyper-A\"],\n\n\t[\"char\", \"#\\\\;\"], [\"char\", \"#\\\\'\"], [\"char\", \"#\\\\\\\"\"],\n\n\t[\"char\", \"#\\\\u0041\"],\n\t[\"char\", \"#\\\\x10FFFF\"],\n\t[\"char\", \"#\\\\λ\"],\n\t[\"char\", \"#\\\\)\"]\n]\n\n----------------------------------------------------\n\nChecks for character literals.\n"
  },
  {
    "path": "tests/languages/racket/comment_feature.test",
    "content": ";\r\n; foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \";\"],\r\n\t[\"comment\", \"; foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/racket/function_feature.test",
    "content": "(fl= 1 2)\r\n(flmin 2 3)\r\n(inexact->exact 3)\r\n(!fact)\r\n(** 10)\r\n(**\r\n(defined foo)\r\n\r\n[fl= 1 2]\r\n[flmin 2 3]\r\n[inexact->exact 3]\r\n[!fact]\r\n[** 10]\r\n[**\r\n[defined foo]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"function\", \"fl=\"], [\"number\", \"1\"], [\"number\", \"2\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"function\", \"flmin\"], [\"number\", \"2\"], [\"number\", \"3\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"function\", \"inexact->exact\"], [\"number\", \"3\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"function\", \"!fact\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"function\", \"**\"], [\"number\", \"10\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"], [\"function\", \"**\"],\r\n\t[\"punctuation\", \"(\"], [\"function\", \"defined\"], \" foo\", [\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"[\"], [\"function\", \"fl=\"], [\"number\", \"1\"], [\"number\", \"2\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"function\", \"flmin\"], [\"number\", \"2\"], [\"number\", \"3\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"function\", \"inexact->exact\"], [\"number\", \"3\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"function\", \"!fact\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"function\", \"**\"], [\"number\", \"10\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"function\", \"**\"],\r\n\t[\"punctuation\", \"[\"], [\"function\", \"defined\"], \" foo\", [\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/racket/identifier_feature.test",
    "content": "|\\x9;\\x9;|\n\n----------------------------------------------------\n\n[\n\t[\"identifier\", \"|\\\\x9;\\\\x9;|\"]\n]\n"
  },
  {
    "path": "tests/languages/racket/keyword_feature.test",
    "content": "(define)\r\n[define]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"define\"], [\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"], [\"keyword\", \"define\"], [\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/racket/lambda_parameter_feature.test",
    "content": "(lambda (foo bar) (concat foo bar))\r\n\r\n(lambda [foo bar] [concat foo bar])\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"lambda\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"lambda-parameter\", \"foo\"],\r\n\t\" bar\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"concat\"],\r\n\t\" foo bar\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"lambda\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"lambda-parameter\", \"foo\"],\r\n\t\" bar\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"concat\"],\r\n\t\" foo bar\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for lambda parameters.\r\n"
  },
  {
    "path": "tests/languages/racket/lang_feature.test",
    "content": "#lang racket\r\n#lang racket/base\r\n#lang s-exp \"html.rkt\"\r\n#lang s-exp pollen/private/dialect\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"lang\", \"#lang racket\"],\r\n\t[\"lang\", \"#lang racket/base\"],\r\n\t[\"lang\", \"#lang s-exp \\\"html.rkt\\\"\"],\r\n\t[\"lang\", \"#lang s-exp pollen/private/dialect\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for #lang.\r\n"
  },
  {
    "path": "tests/languages/racket/number_feature.test",
    "content": "123\r\n\r\n(foo 42 +42 -42)\r\n(foo 1e3 +1e3 -1e3)\r\n(foo 1e+3 1e-3 3.14159 3.14159e-1)\r\n(foo 8/3)\r\n(foo 3+4i 2.5+0.0i 2.5+0.0i -2.5e4+0.0e4i 3+0i -2e-5i)\r\n(list +10i -10i 10+10i 10.10+10.10i 10-10i 10+10e+10i)\r\n\r\n(list #d123 #e#d123e-4 #d#i12 #i-1.234i)\r\n\r\n(list #xBAD #b1110011 #o777)\r\n(list #i#x10 #i#x10+10i #b10+10i)\r\n\r\n10+i\r\n10+.1i\r\n10+1.i\r\n\r\n; not a number but a symbol\r\n(define 1+2 10)\r\n\r\n\r\n[foo 42]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"+42\"],\r\n\t[\"number\", \"-42\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"number\", \"1e3\"],\r\n\t[\"number\", \"+1e3\"],\r\n\t[\"number\", \"-1e3\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"number\", \"1e+3\"],\r\n\t[\"number\", \"1e-3\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3.14159e-1\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"number\", \"8/3\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"number\", \"3+4i\"],\r\n\t[\"number\", \"2.5+0.0i\"],\r\n\t[\"number\", \"2.5+0.0i\"],\r\n\t[\"number\", \"-2.5e4+0.0e4i\"],\r\n\t[\"number\", \"3+0i\"],\r\n\t[\"number\", \"-2e-5i\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"list\"],\r\n\t[\"number\", \"+10i\"],\r\n\t[\"number\", \"-10i\"],\r\n\t[\"number\", \"10+10i\"],\r\n\t[\"number\", \"10.10+10.10i\"],\r\n\t[\"number\", \"10-10i\"],\r\n\t[\"number\", \"10+10e+10i\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"list\"],\r\n\t[\"number\", \"#d123\"],\r\n\t[\"number\", \"#e#d123e-4\"],\r\n\t[\"number\", \"#d#i12\"],\r\n\t[\"number\", \"#i-1.234i\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"list\"],\r\n\t[\"number\", \"#xBAD\"],\r\n\t[\"number\", \"#b1110011\"],\r\n\t[\"number\", \"#o777\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"list\"],\r\n\t[\"number\", \"#i#x10\"],\r\n\t[\"number\", \"#i#x10+10i\"],\r\n\t[\"number\", \"#b10+10i\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"number\", \"10+i\"],\r\n\t[\"number\", \"10+.1i\"],\r\n\t[\"number\", \"10+1.i\"],\r\n\r\n\t[\"comment\", \"; not a number but a symbol\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"define\"],\r\n\t\" 1+2 \",\r\n\t[\"number\", \"10\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers, rational numbers, and complex numbers.\r\n"
  },
  {
    "path": "tests/languages/racket/operator_feature.test",
    "content": "(+\r\n(-\r\n(*\r\n(/\r\n(%\r\n(<\r\n(<=\r\n(>\r\n(>=\r\n(=\r\n(=>\r\n\r\n[+\r\n[-\r\n[*\r\n[/\r\n[%\r\n[<\r\n[<=\r\n[>\r\n[>=\r\n[=\r\n[=>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"+\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"-\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"*\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"/\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"%\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"<\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"<=\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \">\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \">=\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"=>\"],\r\n\r\n\t[\"punctuation\", \"[\"], [\"operator\", \"+\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \"-\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \"*\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \"/\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \"%\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \"<\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \"<=\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \">\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \">=\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \"=\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \"=>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/racket/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\"\r\nmulti\r\nline\r\n\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"\\r\\nmulti\\r\\nline\\r\\n\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/racket/symbol_feature.test",
    "content": "'turkey\r\n(define a 'foo)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"symbol\", \"'turkey\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"define\"], \" a \", [\"symbol\",\"'foo\"], [\"punctuation\",\")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for symbols.\r\n"
  },
  {
    "path": "tests/languages/reason/char_feature.test",
    "content": "'a'\n'\\''\n'\\\\'\n'\\xff'\n'\\o214'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"],\n\t[\"char\", \"'\\\\''\"],\n\t[\"char\", \"'\\\\\\\\'\"],\n\t[\"char\", \"'\\\\xff'\"],\n\t[\"char\", \"'\\\\o214'\"]\n]\n\n----------------------------------------------------\n\nChecks for characters.\n"
  },
  {
    "path": "tests/languages/reason/class-name_feature.test",
    "content": "String.foo\r\nFoo_bar.baz\r\nA.bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"class-name\", \"String\"], [\"punctuation\", \".\"], \"foo\\r\\n\",\r\n\t[\"class-name\", \"Foo_bar\"], [\"punctuation\", \".\"], \"baz\\r\\n\",\r\n\t[\"class-name\", \"A\"], [\"punctuation\", \".\"], \"bar\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names."
  },
  {
    "path": "tests/languages/reason/comment_feature.test",
    "content": "// foobar\r\n/**/\r\n/* Single line comment */\r\n/* Multiline\r\ncomment */\r\n/**\r\nDoc comment\r\n*/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// foobar\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* Single line comment */\"],\r\n\t[\"comment\", \"/* Multiline\\r\\ncomment */\"],\r\n\t[\"comment\", \"/**\\r\\nDoc comment\\r\\n*/\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/reason/constructor_feature.test",
    "content": "Yes\r\nFoo_bar\r\nA\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constructor\", \"Yes\"],\r\n\t[\"constructor\", \"Foo_bar\"],\r\n\t[\"constructor\", \"A\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constructors."
  },
  {
    "path": "tests/languages/reason/keyword_feature.test",
    "content": "and\r\nas\r\nassert\r\nbegin\r\nclass\r\nconstraint\r\ndo\r\ndone\r\ndownto\r\nelse\r\nend\r\nexception\r\nexternal\r\nfor\r\nfun\r\nfunction\r\nfunctor\r\nif\r\nin\r\ninclude\r\ninherit\r\ninitializer\r\nlazy\r\nlet\r\nmethod\r\nmodule\r\nmutable\r\nnew\r\nnonrec\r\nobject\r\nof\r\nopen\r\nor\r\nprivate\r\nrec\r\nsig\r\nstruct\r\nswitch\r\nthen\r\nto\r\ntry\r\ntype\r\nval\r\nvirtual\r\nwhen\r\nwhile\r\nwith\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"and\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"assert\"],\r\n\t[\"keyword\", \"begin\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"constraint\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"done\"],\r\n\t[\"keyword\", \"downto\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"exception\"],\r\n\t[\"keyword\", \"external\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"fun\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"functor\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"inherit\"],\r\n\t[\"keyword\", \"initializer\"],\r\n\t[\"keyword\", \"lazy\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"method\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"keyword\", \"mutable\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"nonrec\"],\r\n\t[\"keyword\", \"object\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"open\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"rec\"],\r\n\t[\"keyword\", \"sig\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"to\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"val\"],\r\n\t[\"keyword\", \"virtual\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/reason/label_feature.test",
    "content": "foo::bar\r\na::baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"label\", \"foo\"], [\"operator\", \"::\"], \"bar\\r\\n\",\r\n\t[\"label\", \"a\"], [\"operator\", \"::\"], \"baz\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for labels."
  },
  {
    "path": "tests/languages/reason/operator_feature.test",
    "content": "...\r\n:: :=\r\n= == ===\r\n< <= > >=\r\n| ^ ? '\r\n# ! ~ `\r\n+ - * /\r\n+. -. *. /.\r\nmod land lor lxor\r\nlsl lsr asr\r\n|> ->\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"...\"],\r\n\t[\"operator\", \"::\"], [\"operator\", \":=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"===\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"^\"], [\"operator\", \"?\"], [\"operator\", \"'\"],\r\n\t[\"operator\", \"#\"], [\"operator\", \"!\"], [\"operator\", \"~\"], [\"operator\", \"`\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"+.\"], [\"operator\", \"-.\"], [\"operator\", \"*.\"], [\"operator\", \"/.\"],\r\n\t[\"operator\", \"mod\"], [\"operator\", \"land\"], [\"operator\", \"lor\"], [\"operator\", \"lxor\"],\r\n\t[\"operator\", \"lsl\"], [\"operator\", \"lsr\"], [\"operator\", \"asr\"],\r\n\t[\"operator\", \"|>\"], [\"operator\", \"->\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/reason/string_feature.test",
    "content": "\"\"\r\n\"foo\\\"bar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\\\\\"bar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/regex/anchor_feature.test",
    "content": "^\n$\n\\A\n\\G\n\\Z\n\\z\n\\b\n\\B\n\n----------------------------------------------------\n\n[\n\t[\"anchor\", \"^\"],\n\t[\"anchor\", \"$\"],\n\t[\"anchor\", \"\\\\A\"],\n\t[\"anchor\", \"\\\\G\"],\n\t[\"anchor\", \"\\\\Z\"],\n\t[\"anchor\", \"\\\\z\"],\n\t[\"anchor\", \"\\\\b\"],\n\t[\"anchor\", \"\\\\B\"]\n]\n\n----------------------------------------------------\n\nChecks for anchors.\n"
  },
  {
    "path": "tests/languages/regex/backreference_feature.test",
    "content": "\\1 \\2 \\3 \\4 \\5 \\6 \\7 \\8 \\9\n\\k<name>\n\n----------------------------------------------------\n\n[\n\t[\"backreference\", \"\\\\1\"],\n\t[\"backreference\", \"\\\\2\"],\n\t[\"backreference\", \"\\\\3\"],\n\t[\"backreference\", \"\\\\4\"],\n\t[\"backreference\", \"\\\\5\"],\n\t[\"backreference\", \"\\\\6\"],\n\t[\"backreference\", \"\\\\7\"],\n\t[\"backreference\", \"\\\\8\"],\n\t[\"backreference\", \"\\\\9\"],\n\n\t[\"backreference\", [\n\t\t\"\\\\k<\",\n\t\t[\"group-name\", \"name\"],\n\t\t\">\"\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for backreferences.\n"
  },
  {
    "path": "tests/languages/regex/char-class_feature.test",
    "content": "[]\n[^]\n[foo]\n[\\]\\b]\n[.^$\\1]\n[\\d\\D\\p{L}]\n\n----------------------------------------------------\n\n[\n\t[\"char-class\", [\n\t\t[\"char-class-punctuation\", \"[\"],\n\t\t[\"char-class-punctuation\", \"]\"]\n\t]],\n\t[\"char-class\", [\n\t\t[\"char-class-punctuation\", \"[\"],\n\t\t[\"char-class-negation\", \"^\"],\n\t\t[\"char-class-punctuation\", \"]\"]\n\t]],\n\t[\"char-class\", [\n\t\t[\"char-class-punctuation\", \"[\"],\n\t\t\"foo\",\n\t\t[\"char-class-punctuation\", \"]\"]\n\t]],\n\t[\"char-class\", [\n\t\t[\"char-class-punctuation\", \"[\"],\n\t\t[\"special-escape\", \"\\\\]\"],\n\t\t[\"escape\", \"\\\\b\"],\n\t\t[\"char-class-punctuation\", \"]\"]\n\t]],\n\t[\"char-class\", [\n\t\t[\"char-class-punctuation\", \"[\"],\n\t\t\".^$\",\n\t\t[\"escape\", \"\\\\1\"],\n\t\t[\"char-class-punctuation\", \"]\"]\n\t]],\n\t[\"char-class\", [\n\t\t[\"char-class-punctuation\", \"[\"],\n\t\t[\"char-set\", \"\\\\d\"],\n\t\t[\"char-set\", \"\\\\D\"],\n\t\t[\"char-set\", \"\\\\p{L}\"],\n\t\t[\"char-class-punctuation\", \"]\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for character sets.\n"
  },
  {
    "path": "tests/languages/regex/char-set_feature.test",
    "content": ".\n\\w \\W\n\\s \\S\n\\d \\D\n\\p{ASCII}\n\\P{ASCII}\n\n----------------------------------------------------\n\n[\n\t[\"char-set\", \".\"],\n\t[\"char-set\", \"\\\\w\"], [\"char-set\", \"\\\\W\"],\n\t[\"char-set\", \"\\\\s\"], [\"char-set\", \"\\\\S\"],\n\t[\"char-set\", \"\\\\d\"], [\"char-set\", \"\\\\D\"],\n\t[\"char-set\", \"\\\\p{ASCII}\"],\n\t[\"char-set\", \"\\\\P{ASCII}\"]\n]\n\n----------------------------------------------------\n\nChecks for character classes.\n"
  },
  {
    "path": "tests/languages/regex/escape_feature.test",
    "content": "\\0 \\\\ \\. \\+\n\\xFF\n\\uFFFF \\u{10FFFF}\n\\cA \\cZ\n\\01 \\077 \\377\n\\n \\r \\t \\f \\a\n\n\\[ \\]\n\n----------------------------------------------------\n\n[\n\t[\"escape\", \"\\\\0\"],\n\t[\"special-escape\", \"\\\\\\\\\"],\n\t[\"special-escape\", \"\\\\.\"],\n\t[\"special-escape\", \"\\\\+\"],\n\n\t[\"escape\", \"\\\\xFF\"],\n\n\t[\"escape\", \"\\\\uFFFF\"],\n\t[\"escape\", \"\\\\u{10FFFF}\"],\n\n\t[\"escape\", \"\\\\cA\"],\n\t[\"escape\", \"\\\\cZ\"],\n\n\t[\"escape\", \"\\\\01\"],\n\t[\"escape\", \"\\\\077\"],\n\t[\"escape\", \"\\\\377\"],\n\n\t[\"escape\", \"\\\\n\"],\n\t[\"escape\", \"\\\\r\"],\n\t[\"escape\", \"\\\\t\"],\n\t[\"escape\", \"\\\\f\"],\n\t[\"escape\", \"\\\\a\"],\n\n\t[\"special-escape\", \"\\\\[\"],\n\t[\"special-escape\", \"\\\\]\"]\n]\n\n----------------------------------------------------\n\nChecks for escapes.\n"
  },
  {
    "path": "tests/languages/regex/group_feature.test",
    "content": "()\n(?:)\n(?>)\n(?=) (?!)\n(?<=) (?<!)\n\n(?<name>)\n(?'name')\n\n(?i)\n(?i:)\n(?idmsuxU-idmsuxU)\n(?idmsux-idmsux:X)\n\n----------------------------------------------------\n\n[\n\t[\"group\", [\"(\"]],\n\t[\"group\", \")\"],\n\n\t[\"group\", [\"(?:\"]],\n\t[\"group\", \")\"],\n\n\t[\"group\", [\"(?>\"]],\n\t[\"group\", \")\"],\n\n\t[\"group\", [\"(?=\"]],\n\t[\"group\", \")\"],\n\t[\"group\", [\"(?!\"]],\n\t[\"group\", \")\"],\n\n\t[\"group\", [\"(?<=\"]],\n\t[\"group\", \")\"],\n\t[\"group\", [\"(?<!\"]],\n\t[\"group\", \")\"],\n\n\t[\"group\", [\n\t\t\"(?<\",\n\t\t[\"group-name\", \"name\"],\n\t\t\">\"]\n\t],\n\t[\"group\", \")\"],\n\n\t[\"group\", [\n\t\t\"(?'\",\n\t\t[\"group-name\", \"name\"],\n\t\t\"'\"]\n\t],\n\t[\"group\", \")\"],\n\n\t[\"group\", [\"(?i\"]],\n\t[\"group\", \")\"],\n\t[\"group\", [\"(?i:\"]],\n\t[\"group\", \")\"],\n\t[\"group\", [\"(?idmsuxU-idmsuxU\"]],\n\t[\"group\", \")\"],\n\t[\"group\", [\"(?idmsux-idmsux:\"]],\n\t\"X\",\n\t[\"group\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for groups.\n"
  },
  {
    "path": "tests/languages/regex/quantifier_feature.test",
    "content": "* + ?\n{2} {2,} {0,1}\n\n*? +? ??\n{2}? {2,}? {0,1}?\n\n*+ ++ ?+\n{2}+ {2,}+ {0,1}+\n\n----------------------------------------------------\n\n[\n\t[\"quantifier\", \"*\"],\n\t[\"quantifier\", \"+\"],\n\t[\"quantifier\", \"?\"],\n\t[\"quantifier\", \"{2}\"],\n\t[\"quantifier\", \"{2,}\"],\n\t[\"quantifier\", \"{0,1}\"],\n\n\t[\"quantifier\", \"*?\"],\n\t[\"quantifier\", \"+?\"],\n\t[\"quantifier\", \"??\"],\n\t[\"quantifier\", \"{2}?\"],\n\t[\"quantifier\", \"{2,}?\"],\n\t[\"quantifier\", \"{0,1}?\"],\n\n\t[\"quantifier\", \"*+\"],\n\t[\"quantifier\", \"++\"],\n\t[\"quantifier\", \"?+\"],\n\t[\"quantifier\", \"{2}+\"],\n\t[\"quantifier\", \"{2,}+\"],\n\t[\"quantifier\", \"{0,1}+\"]\n]\n\n----------------------------------------------------\n\nChecks for quantifiers.\n"
  },
  {
    "path": "tests/languages/regex/range_feature.test",
    "content": "[a-zA-Z0-9]\n[\\xa1-Z\\u00FF-\\u{256}]\n[^-aaa-]\n\n----------------------------------------------------\n\n[\n\t[\"char-class\", [\n\t\t[\"char-class-punctuation\", \"[\"],\n\t\t[\"range\", [\n\t\t\t\"a\",\n\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\"z\"\n\t\t]],\n\t\t[\"range\", [\n\t\t\t\"A\",\n\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\"Z\"\n\t\t]],\n\t\t[\"range\", [\n\t\t\t\"0\",\n\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\"9\"\n\t\t]],\n\t\t[\"char-class-punctuation\", \"]\"]\n\t]],\n\t[\"char-class\", [\n\t\t[\"char-class-punctuation\", \"[\"],\n\t\t[\"range\", [\n\t\t\t[\"escape\", \"\\\\xa1\"],\n\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t\"Z\"\n\t\t]],\n\t\t[\"range\", [\n\t\t\t[\"escape\", \"\\\\u00FF\"],\n\t\t\t[\"range-punctuation\", \"-\"],\n\t\t\t[\"escape\", \"\\\\u{256}\"]\n\t\t]],\n\t\t[\"char-class-punctuation\", \"]\"]\n\t]],\n\t[\"char-class\", [\n\t\t[\"char-class-punctuation\", \"[\"],\n\t\t[\"char-class-negation\", \"^\"],\n\t\t\"-aaa-\",\n\t\t[\"char-class-punctuation\", \"]\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for character ranges in sets.\n"
  },
  {
    "path": "tests/languages/rego/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/rego/comment_feature.test",
    "content": "#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/rego/function_feature.test",
    "content": "object.remove({\"a\": {\"b\": {\"c\": 2}}, \"x\": 123}, {\"a\": 1}) == {\"x\": 123}\r\n\r\noutput := is_set(x)\r\noutput := intersection(set[set])\r\noutput := regex.match(pattern, value)\r\noutput := glob.match(\"*.github.com\", [], \"api.github.com\")\r\noutput := bits.rsh(x, s)\r\noutput := io.jwt.verify_ps384(string, certificate)\r\n\r\nio.jwt.encode_sign({\r\n    \"typ\": \"JWT\",\r\n    \"alg\": \"HS256\"},\r\n    {}, {\r\n    \"kty\": \"oct\",\r\n    \"k\": \"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow\"\r\n})\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", [\r\n\t\t[\"namespace\", \"object\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"remove\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"a\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"b\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"c\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"\\\"x\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"123\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"a\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"x\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"number\", \"123\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t\"\\r\\n\\r\\noutput \",\r\n\t[\"operator\", \":=\"],\r\n\t[\"function\", [\"is_set\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"x\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\noutput \",\r\n\t[\"operator\", \":=\"],\r\n\t[\"function\", [\"intersection\"]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"set\",\r\n\t[\"punctuation\", \"[\"],\r\n\t\"set\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\noutput \",\r\n\t[\"operator\", \":=\"],\r\n\t[\"function\", [\r\n\t\t[\"namespace\", \"regex\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"match\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"pattern\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" value\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\noutput \",\r\n\t[\"operator\", \":=\"],\r\n\t[\"function\", [\r\n\t\t[\"namespace\", \"glob\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"match\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\"*.github.com\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"\\\"api.github.com\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\noutput \",\r\n\t[\"operator\", \":=\"],\r\n\t[\"function\", [\r\n\t\t[\"namespace\", \"bits\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"rsh\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"x\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" s\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t\"\\r\\noutput \",\r\n\t[\"operator\", \":=\"],\r\n\t[\"function\", [\r\n\t\t[\"namespace\", \"io\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"namespace\", \"jwt\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"verify_ps384\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"string\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" certificate\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", [\r\n\t\t[\"namespace\", \"io\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"namespace\", \"jwt\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"encode_sign\"\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"\\\"typ\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"JWT\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"property\", \"\\\"alg\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"HS256\\\"\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"\\\"kty\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"oct\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"property\", \"\\\"k\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow\\\"\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all functions.\r\n"
  },
  {
    "path": "tests/languages/rego/keyword_feature.test",
    "content": "as\r\ndefault\r\nelse\r\nimport\r\npackage\r\nnot\r\nnull\r\nsome\r\nwith\r\n\r\nset()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"some\"],\r\n\t[\"keyword\", \"with\"],\r\n\r\n\t[\"keyword\", \"set\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/rego/number_feature.test",
    "content": "0\r\n123\r\n3.14159\r\n5.0e8\r\n0.2E+2\r\n47e-5\r\n-1.23\r\n-2.34E33\r\n-4.34E-33\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"5.0e8\"],\r\n\t[\"number\", \"0.2E+2\"],\r\n\t[\"number\", \"47e-5\"],\r\n\t[\"number\", \"-1.23\"],\r\n\t[\"number\", \"-2.34E33\"],\r\n\t[\"number\", \"-4.34E-33\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/rego/operator_feature.test",
    "content": ":= = :\r\n== != < <= > >=\r\n+ - / * %\r\n& |\r\n_\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \":=\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \":\"],\r\n\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"%\"],\r\n\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"operator\", \"_\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/rego/property_feature.test",
    "content": "instances[instance] {\r\n    server := sites[_].servers[_]\r\n    instance := {\"address\": server.hostname, \"name\": server.name}\r\n} {\r\n    container := containers[_]\r\n    instance := {\"address\": container.ipaddress, \"name\": container.name}\r\n}\r\n\r\napps := [\r\n    {\r\n        \"name\": \"web\",\r\n        \"servers\": [\"web-0\", \"web-1\", \"web-1000\", \"web-1001\", \"web-dev\"]\r\n    },\r\n    {\r\n        \"name\": \"mysql\",\r\n        \"servers\": [\"db-0\", \"db-1000\"]\r\n    },\r\n    {\r\n        \"name\": \"mongodb\",\r\n        \"servers\": [\"db-dev\"]\r\n    }\r\n]\r\n\r\nnot allow with input as {\"user\": \"charlie\", \"method\": \"GET\"} with data.roles as {\"dev\": [\"bob\"]}\r\n\r\nallow with input as {\"user\": \"charlie\", \"method\": \"GET\"} with data.roles as {\"dev\": [\"charlie\"]}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"instances\",\r\n\t[\"punctuation\", \"[\"],\r\n\t\"instance\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t\"\\r\\n    server \",\r\n\t[\"operator\", \":=\"],\r\n\t\" sites\",\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"operator\", \"_\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"servers\",\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"operator\", \"_\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t\"\\r\\n    instance \",\r\n\t[\"operator\", \":=\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"address\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t\" server\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"hostname\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"\\\"name\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t\" server\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"name\",\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t\"\\r\\n    container \",\r\n\t[\"operator\", \":=\"],\r\n\t\" containers\",\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"operator\", \"_\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t\"\\r\\n    instance \",\r\n\t[\"operator\", \":=\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"address\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t\" container\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"ipaddress\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"\\\"name\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t\" container\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"name\",\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t\"\\r\\n\\r\\napps \",\r\n\t[\"operator\", \":=\"],\r\n\t[\"punctuation\", \"[\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"\\\"name\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"web\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"property\", \"\\\"servers\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"\\\"web-0\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"\\\"web-1\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"\\\"web-1000\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"\\\"web-1001\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"\\\"web-dev\\\"\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"\\\"name\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"mysql\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"property\", \"\\\"servers\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"\\\"db-0\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"\\\"db-1000\\\"\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"property\", \"\\\"name\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"mongodb\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"property\", \"\\\"servers\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"\\\"db-dev\\\"\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"keyword\", \"not\"],\r\n\t\" allow \",\r\n\t[\"keyword\", \"with\"],\r\n\t\" input \",\r\n\t[\"keyword\", \"as\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"user\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"charlie\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"\\\"method\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"GET\\\"\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"with\"],\r\n\t\" data\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"roles \",\r\n\t[\"keyword\", \"as\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"dev\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"\\\"bob\\\"\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t\"\\r\\n\\r\\nallow \",\r\n\t[\"keyword\", \"with\"],\r\n\t\" input \",\r\n\t[\"keyword\", \"as\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"user\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"charlie\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"property\", \"\\\"method\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"\\\"GET\\\"\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"with\"],\r\n\t\" data\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"roles \",\r\n\t[\"keyword\", \"as\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"property\", \"\\\"dev\\\"\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"\\\"charlie\\\"\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"}\"]\r\n]"
  },
  {
    "path": "tests/languages/rego/punctuation_feature.test",
    "content": ", ; .\r\n( ) [ ] { }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \".\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/rego/string_feature.test",
    "content": "\"\"\r\n\"foo\\\"bar\"\r\n`raw-string`\r\n\r\njwks = `{\r\n    \"keys\": [{\r\n        \"kty\":\"EC\",\r\n        \"crv\":\"P-256\",\r\n        \"x\":\"z8J91ghFy5o6f2xZ4g8LsLH7u2wEpT2ntj8loahnlsE\",\r\n        \"y\":\"7bdeXLH61KrGWRdh7ilnbcGQACxykaPKfmBccTHIOUo\"\r\n    }]\r\n}`\r\n\r\ncert = `-----BEGIN CERTIFICATE-----\r\nMIIBcDCCARagAwIBAgIJAMZmuGSIfvgzMAoGCCqGSM49BAMCMBMxETAPBgNVBAMM\r\nCHdoYXRldmVyMB4XDTE4MDgxMDE0Mjg1NFoXDTE4MDkwOTE0Mjg1NFowEzERMA8G\r\nA1UEAwwId2hhdGV2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATPwn3WCEXL\r\nmjp/bFniDwuwsfu7bASlPae2PyWhqGeWwe23Xlyx+tSqxlkXYe4pZ23BkAAscpGj\r\nyn5gXHExyDlKo1MwUTAdBgNVHQ4EFgQUElRjSoVgKjUqY5AXz2o74cLzzS8wHwYD\r\nVR0jBBgwFoAUElRjSoVgKjUqY5AXz2o74cLzzS8wDwYDVR0TAQH/BAUwAwEB/zAK\r\nBggqhkjOPQQDAgNIADBFAiEA4yQ/88ZrUX68c6kOe9G11u8NUaUzd8pLOtkKhniN\r\nOHoCIHmNX37JOqTcTzGn2u9+c8NlnvZ0uDvsd1BmKPaUmjmm\r\n-----END CERTIFICATE-----`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\\\\\"bar\\\"\"],\r\n\t[\"string\", \"`raw-string`\"],\r\n\r\n\t\"\\r\\n\\r\\njwks \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"`{\\r\\n    \\\"keys\\\": [{\\r\\n        \\\"kty\\\":\\\"EC\\\",\\r\\n        \\\"crv\\\":\\\"P-256\\\",\\r\\n        \\\"x\\\":\\\"z8J91ghFy5o6f2xZ4g8LsLH7u2wEpT2ntj8loahnlsE\\\",\\r\\n        \\\"y\\\":\\\"7bdeXLH61KrGWRdh7ilnbcGQACxykaPKfmBccTHIOUo\\\"\\r\\n    }]\\r\\n}`\"],\r\n\r\n\t\"\\r\\n\\r\\ncert \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"`-----BEGIN CERTIFICATE-----\\r\\nMIIBcDCCARagAwIBAgIJAMZmuGSIfvgzMAoGCCqGSM49BAMCMBMxETAPBgNVBAMM\\r\\nCHdoYXRldmVyMB4XDTE4MDgxMDE0Mjg1NFoXDTE4MDkwOTE0Mjg1NFowEzERMA8G\\r\\nA1UEAwwId2hhdGV2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATPwn3WCEXL\\r\\nmjp/bFniDwuwsfu7bASlPae2PyWhqGeWwe23Xlyx+tSqxlkXYe4pZ23BkAAscpGj\\r\\nyn5gXHExyDlKo1MwUTAdBgNVHQ4EFgQUElRjSoVgKjUqY5AXz2o74cLzzS8wHwYD\\r\\nVR0jBBgwFoAUElRjSoVgKjUqY5AXz2o74cLzzS8wDwYDVR0TAQH/BAUwAwEB/zAK\\r\\nBggqhkjOPQQDAgNIADBFAiEA4yQ/88ZrUX68c6kOe9G11u8NUaUzd8pLOtkKhniN\\r\\nOHoCIHmNX37JOqTcTzGn2u9+c8NlnvZ0uDvsd1BmKPaUmjmm\\r\\n-----END CERTIFICATE-----`\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/renpy/boolean_feature.test",
    "content": "true false\nTrue False\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"], [\"boolean\", \"false\"],\n\t[\"boolean\", \"True\"], [\"boolean\", \"False\"]\n]\n"
  },
  {
    "path": "tests/languages/renpy/comment_feature.test",
    "content": "# comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"# comment\"]\n]\n"
  },
  {
    "path": "tests/languages/renpy/function_feature.test",
    "content": "renpy.register_bmfont(\"bmfont\", 22, filename=\"bmfont.fnt\")\n\n# Resize the background of the text window if it's too small.\ninit python:\n    style.window.background = Frame(\"frame.png\", 10, 10)\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"renpy\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"register_bmfont\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"bmfont\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"22\"],\n\t[\"punctuation\", \",\"],\n\t\" filename\",\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"bmfont.fnt\\\"\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"comment\", \"# Resize the background of the text window if it's too small.\"],\n\n\t[\"keyword\", \"init\"],\n\t[\"keyword\", \"python\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"keyword\", \"style\"],\n\t[\"punctuation\", \".\"],\n\t[\"tag\", \"window\"],\n\t[\"punctuation\", \".\"],\n\t[\"property\", \"background\"],\n\t[\"operator\", \"=\"],\n\t[\"function\", \"Frame\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"frame.png\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"10\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"10\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/renpy/keyword_feature.test",
    "content": "; None\n; add\n; adjustment\n; alignaround\n; allow\n; angle\n; animation\n; around\n; as\n; assert\n; behind\n; box_layout\n; break\n; build\n; cache\n; call\n; center\n; changed\n; child_size\n; choice\n; circles\n; class\n; clear\n; clicked\n; clipping\n; clockwise\n; config\n; contains\n; continue\n; corner1\n; corner2\n; counterclockwise\n; def\n; default\n; define\n; del\n; delay\n; disabled\n; disabled_text\n; dissolve\n; elif\n; else\n; event\n; except\n; exclude\n; exec\n; expression\n; fade\n; finally\n; for\n; from\n; function\n; global\n; gm_root\n; has\n; hide\n; id\n; if\n; import\n; in\n; init\n; is\n; jump\n; knot\n; lambda\n; left\n; less_rounded\n; mm_root\n; movie\n; music\n; null\n; on\n; onlayer\n; pass\n; pause\n; persistent\n; play\n; print\n; python\n; queue\n; raise\n; random\n; renpy\n; repeat\n; return\n; right\n; rounded_window\n; scene\n; scope\n; set\n; show\n; slow\n; slow_abortable\n; slow_done\n; sound\n; stop\n; store\n; style\n; style_group\n; substitute\n; suffix\n; theme\n; transform\n; transform_anchor\n; transpose\n; try\n; ui\n; unhovered\n; updater\n; use\n; voice\n; while\n; widget\n; widget_hover\n; widget_selected\n; widget_text\n; yield\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \";\"], [\"keyword\", \"None\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"add\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"adjustment\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"alignaround\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"allow\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"angle\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"animation\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"around\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"as\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"assert\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"behind\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"box_layout\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"break\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"build\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"cache\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"call\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"center\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"changed\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"child_size\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"choice\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"circles\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"class\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"clear\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"clicked\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"clipping\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"clockwise\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"config\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"contains\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"continue\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"corner1\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"corner2\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"counterclockwise\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"def\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"default\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"define\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"del\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"delay\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"disabled\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"disabled_text\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"dissolve\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"elif\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"else\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"event\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"except\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"exclude\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"exec\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"expression\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"fade\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"finally\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"for\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"from\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"function\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"global\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"gm_root\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"has\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"hide\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"id\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"if\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"import\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"in\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"init\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"is\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"jump\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"knot\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"lambda\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"left\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"less_rounded\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"mm_root\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"movie\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"music\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"null\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"on\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"onlayer\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"pass\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"pause\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"persistent\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"play\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"print\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"python\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"queue\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"raise\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"random\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"renpy\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"repeat\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"return\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"right\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"rounded_window\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"scene\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"scope\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"set\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"show\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"slow\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"slow_abortable\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"slow_done\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"sound\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"stop\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"store\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"style\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"style_group\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"substitute\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"suffix\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"theme\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"transform\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"transform_anchor\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"transpose\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"try\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"ui\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"unhovered\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"updater\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"use\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"voice\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"while\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"widget\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"widget_hover\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"widget_selected\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"widget_text\"],\n\t[\"punctuation\", \";\"], [\"keyword\", \"yield\"]\n]\n"
  },
  {
    "path": "tests/languages/renpy/property_feature.test",
    "content": "insensitive\nidle\nhover\nselected_idle\nselected_hover\nbackground\nposition\nalt\nxpos\nypos\npos\nxanchor\nyanchor\nanchor\nxalign\nyalign\nalign\nxcenter\nycenter\nxofsset\nyoffset\nymaximum\nmaximum\nxmaximum\nxminimum\nyminimum\nminimum\nxsize\nysizexysize\nxfill\nyfill\narea\nantialias\nblack_color\nbold\ncaret\ncolor\nfirst_indent\nfont\nsize\nitalic\njustify\nkerning\nlanguage\nlayout\nline_leading\nline_overlap_split\nline_spacing\nmin_width\nnewline_indent\noutlines\nrest_indent\nruby_style\nslow_cps\nslow_cps_multiplier\nstrikethrough\ntext_align\nunderline\nhyperlink_functions\nvertical\nhinting\nforeground\nleft_margin\nxmargin\ntop_margin\nbottom_margin\nymargin\nleft_padding\nright_padding\nxpadding\ntop_padding\nbottom_padding\nypadding\nsize_group\nchild\nhover_sound\nactivate_sound\nmouse\nfocus_mask\nkeyboard_focus\nbar_vertical\nbar_invert\nbar_resizing\nleft_gutter\nright_gutter\ntop_gutter\nbottom_gutter\nleft_bar\nright_bar\ntop_bar\nbottom_bar\nthumb\nthumb_shadow\nthumb_offset\nunscrollable\nspacing\nfirst_spacing\nbox_reverse\nbox_wrap\norder_reverse\nfit_first\nysize\nthumbnail_width\nthumbnail_height\nhelp\ntext_ypos\ntext_xpos\nidle_color\nhover_color\nselected_idle_color\nselected_hover_color\ninsensitive_color\nalpha\ninsensitive_background\nhover_background\nzorder\nvalue\nwidth\nxadjustment\nxanchoraround\nxaround\nxinitial\nxoffset\nxzoom\nyadjustment\nyanchoraround\nyaround\nyinitial\nyzoom\nzoom\nground\nheight\ntext_style\ntext_y_fudge\nselected_insensitive\nhas_sound\nhas_music\nhas_voice\nfocus\nhovered\nimage_style\nlength\nminwidth\nmousewheel\noffset\nprefix\nradius\nrange\nright_margin\nrotate\nrotate_pad\ndeveloper\nscreen_width\nscreen_height\nwindow_title\nname\nversion\nwindows_icon\ndefault_fullscreen\ndefault_text_cps\ndefault_afm_time\nmain_menu_music\nsample_sound\nenter_sound\nexit_sound\nsave_directory\nenter_transition\nexit_transition\nintra_transition\nmain_game_transition\ngame_main_transition\nend_splash_transition\nend_game_transition\nafter_load_transition\nwindow_show_transition\nwindow_hide_transition\nadv_nvl_transition\nnvl_adv_transition\nenter_yesno_transition\nexit_yesno_transition\nenter_replay_transition\nexit_replay_transition\nsay_attribute_transition\ndirectory_name\nexecutable_name\ninclude_update\nwindow_icon\nmodal\ngoogle_play_key\ngoogle_play_salt\ndrag_name\ndrag_handle\ndraggable\ndragged\ndroppable\ndropped\nnarrator_menu\naction\ndefault_afm_enable\nversion_name\nversion_tuple\ninside\nfadeout\nfadein\nlayers\nlayer_clipping\nlinear\nscrollbars\nside_xpos\nside_ypos\nside_spacing\nedgescroll\ndrag_joined\ndrag_raise\ndrop_shadow\ndrop_shadow_color\nsubpixel\neasein\neaseout\ntime\ncrop\nauto\nupdate\nget_installed_packages\ncan_update\nUpdateVersion\nUpdate\noverlay_functions\ntranslations\nwindow_left_padding\nshow_side_image\nshow_two_window\n\n----------------------------------------------------\n\n[\n\t[\"property\", \"insensitive\"],\n\t[\"property\", \"idle\"],\n\t[\"property\", \"hover\"],\n\t[\"property\", \"selected_idle\"],\n\t[\"property\", \"selected_hover\"],\n\t[\"property\", \"background\"],\n\t[\"property\", \"position\"],\n\t[\"property\", \"alt\"],\n\t[\"property\", \"xpos\"],\n\t[\"property\", \"ypos\"],\n\t[\"property\", \"pos\"],\n\t[\"property\", \"xanchor\"],\n\t[\"property\", \"yanchor\"],\n\t[\"property\", \"anchor\"],\n\t[\"property\", \"xalign\"],\n\t[\"property\", \"yalign\"],\n\t[\"property\", \"align\"],\n\t[\"property\", \"xcenter\"],\n\t[\"property\", \"ycenter\"],\n\t[\"property\", \"xofsset\"],\n\t[\"property\", \"yoffset\"],\n\t[\"property\", \"ymaximum\"],\n\t[\"property\", \"maximum\"],\n\t[\"property\", \"xmaximum\"],\n\t[\"property\", \"xminimum\"],\n\t[\"property\", \"yminimum\"],\n\t[\"property\", \"minimum\"],\n\t[\"property\", \"xsize\"],\n\t[\"property\", \"ysizexysize\"],\n\t[\"property\", \"xfill\"],\n\t[\"property\", \"yfill\"],\n\t[\"property\", \"area\"],\n\t[\"property\", \"antialias\"],\n\t[\"property\", \"black_color\"],\n\t[\"property\", \"bold\"],\n\t[\"property\", \"caret\"],\n\t[\"property\", \"color\"],\n\t[\"property\", \"first_indent\"],\n\t[\"property\", \"font\"],\n\t[\"property\", \"size\"],\n\t[\"property\", \"italic\"],\n\t[\"property\", \"justify\"],\n\t[\"property\", \"kerning\"],\n\t[\"property\", \"language\"],\n\t[\"property\", \"layout\"],\n\t[\"property\", \"line_leading\"],\n\t[\"property\", \"line_overlap_split\"],\n\t[\"property\", \"line_spacing\"],\n\t[\"property\", \"min_width\"],\n\t[\"property\", \"newline_indent\"],\n\t[\"property\", \"outlines\"],\n\t[\"property\", \"rest_indent\"],\n\t[\"property\", \"ruby_style\"],\n\t[\"property\", \"slow_cps\"],\n\t[\"property\", \"slow_cps_multiplier\"],\n\t[\"property\", \"strikethrough\"],\n\t[\"property\", \"text_align\"],\n\t[\"property\", \"underline\"],\n\t[\"property\", \"hyperlink_functions\"],\n\t[\"property\", \"vertical\"],\n\t[\"property\", \"hinting\"],\n\t[\"property\", \"foreground\"],\n\t[\"property\", \"left_margin\"],\n\t[\"property\", \"xmargin\"],\n\t[\"property\", \"top_margin\"],\n\t[\"property\", \"bottom_margin\"],\n\t[\"property\", \"ymargin\"],\n\t[\"property\", \"left_padding\"],\n\t[\"property\", \"right_padding\"],\n\t[\"property\", \"xpadding\"],\n\t[\"property\", \"top_padding\"],\n\t[\"property\", \"bottom_padding\"],\n\t[\"property\", \"ypadding\"],\n\t[\"property\", \"size_group\"],\n\t[\"property\", \"child\"],\n\t[\"property\", \"hover_sound\"],\n\t[\"property\", \"activate_sound\"],\n\t[\"property\", \"mouse\"],\n\t[\"property\", \"focus_mask\"],\n\t[\"property\", \"keyboard_focus\"],\n\t[\"property\", \"bar_vertical\"],\n\t[\"property\", \"bar_invert\"],\n\t[\"property\", \"bar_resizing\"],\n\t[\"property\", \"left_gutter\"],\n\t[\"property\", \"right_gutter\"],\n\t[\"property\", \"top_gutter\"],\n\t[\"property\", \"bottom_gutter\"],\n\t[\"property\", \"left_bar\"],\n\t[\"property\", \"right_bar\"],\n\t[\"property\", \"top_bar\"],\n\t[\"property\", \"bottom_bar\"],\n\t[\"property\", \"thumb\"],\n\t[\"property\", \"thumb_shadow\"],\n\t[\"property\", \"thumb_offset\"],\n\t[\"property\", \"unscrollable\"],\n\t[\"property\", \"spacing\"],\n\t[\"property\", \"first_spacing\"],\n\t[\"property\", \"box_reverse\"],\n\t[\"property\", \"box_wrap\"],\n\t[\"property\", \"order_reverse\"],\n\t[\"property\", \"fit_first\"],\n\t[\"property\", \"ysize\"],\n\t[\"property\", \"thumbnail_width\"],\n\t[\"property\", \"thumbnail_height\"],\n\t[\"property\", \"help\"],\n\t[\"property\", \"text_ypos\"],\n\t[\"property\", \"text_xpos\"],\n\t[\"property\", \"idle_color\"],\n\t[\"property\", \"hover_color\"],\n\t[\"property\", \"selected_idle_color\"],\n\t[\"property\", \"selected_hover_color\"],\n\t[\"property\", \"insensitive_color\"],\n\t[\"property\", \"alpha\"],\n\t[\"property\", \"insensitive_background\"],\n\t[\"property\", \"hover_background\"],\n\t[\"property\", \"zorder\"],\n\t[\"property\", \"value\"],\n\t[\"property\", \"width\"],\n\t[\"property\", \"xadjustment\"],\n\t[\"property\", \"xanchoraround\"],\n\t[\"property\", \"xaround\"],\n\t[\"property\", \"xinitial\"],\n\t[\"property\", \"xoffset\"],\n\t[\"property\", \"xzoom\"],\n\t[\"property\", \"yadjustment\"],\n\t[\"property\", \"yanchoraround\"],\n\t[\"property\", \"yaround\"],\n\t[\"property\", \"yinitial\"],\n\t[\"property\", \"yzoom\"],\n\t[\"property\", \"zoom\"],\n\t[\"property\", \"ground\"],\n\t[\"property\", \"height\"],\n\t[\"property\", \"text_style\"],\n\t[\"property\", \"text_y_fudge\"],\n\t[\"property\", \"selected_insensitive\"],\n\t[\"property\", \"has_sound\"],\n\t[\"property\", \"has_music\"],\n\t[\"property\", \"has_voice\"],\n\t[\"property\", \"focus\"],\n\t[\"property\", \"hovered\"],\n\t[\"property\", \"image_style\"],\n\t[\"property\", \"length\"],\n\t[\"property\", \"minwidth\"],\n\t[\"property\", \"mousewheel\"],\n\t[\"property\", \"offset\"],\n\t[\"property\", \"prefix\"],\n\t[\"property\", \"radius\"],\n\t[\"property\", \"range\"],\n\t[\"property\", \"right_margin\"],\n\t[\"property\", \"rotate\"],\n\t[\"property\", \"rotate_pad\"],\n\t[\"property\", \"developer\"],\n\t[\"property\", \"screen_width\"],\n\t[\"property\", \"screen_height\"],\n\t[\"property\", \"window_title\"],\n\t[\"property\", \"name\"],\n\t[\"property\", \"version\"],\n\t[\"property\", \"windows_icon\"],\n\t[\"property\", \"default_fullscreen\"],\n\t[\"property\", \"default_text_cps\"],\n\t[\"property\", \"default_afm_time\"],\n\t[\"property\", \"main_menu_music\"],\n\t[\"property\", \"sample_sound\"],\n\t[\"property\", \"enter_sound\"],\n\t[\"property\", \"exit_sound\"],\n\t[\"property\", \"save_directory\"],\n\t[\"property\", \"enter_transition\"],\n\t[\"property\", \"exit_transition\"],\n\t[\"property\", \"intra_transition\"],\n\t[\"property\", \"main_game_transition\"],\n\t[\"property\", \"game_main_transition\"],\n\t[\"property\", \"end_splash_transition\"],\n\t[\"property\", \"end_game_transition\"],\n\t[\"property\", \"after_load_transition\"],\n\t[\"property\", \"window_show_transition\"],\n\t[\"property\", \"window_hide_transition\"],\n\t[\"property\", \"adv_nvl_transition\"],\n\t[\"property\", \"nvl_adv_transition\"],\n\t[\"property\", \"enter_yesno_transition\"],\n\t[\"property\", \"exit_yesno_transition\"],\n\t[\"property\", \"enter_replay_transition\"],\n\t[\"property\", \"exit_replay_transition\"],\n\t[\"property\", \"say_attribute_transition\"],\n\t[\"property\", \"directory_name\"],\n\t[\"property\", \"executable_name\"],\n\t[\"property\", \"include_update\"],\n\t[\"property\", \"window_icon\"],\n\t[\"property\", \"modal\"],\n\t[\"property\", \"google_play_key\"],\n\t[\"property\", \"google_play_salt\"],\n\t[\"property\", \"drag_name\"],\n\t[\"property\", \"drag_handle\"],\n\t[\"property\", \"draggable\"],\n\t[\"property\", \"dragged\"],\n\t[\"property\", \"droppable\"],\n\t[\"property\", \"dropped\"],\n\t[\"property\", \"narrator_menu\"],\n\t[\"property\", \"action\"],\n\t[\"property\", \"default_afm_enable\"],\n\t[\"property\", \"version_name\"],\n\t[\"property\", \"version_tuple\"],\n\t[\"property\", \"inside\"],\n\t[\"property\", \"fadeout\"],\n\t[\"property\", \"fadein\"],\n\t[\"property\", \"layers\"],\n\t[\"property\", \"layer_clipping\"],\n\t[\"property\", \"linear\"],\n\t[\"property\", \"scrollbars\"],\n\t[\"property\", \"side_xpos\"],\n\t[\"property\", \"side_ypos\"],\n\t[\"property\", \"side_spacing\"],\n\t[\"property\", \"edgescroll\"],\n\t[\"property\", \"drag_joined\"],\n\t[\"property\", \"drag_raise\"],\n\t[\"property\", \"drop_shadow\"],\n\t[\"property\", \"drop_shadow_color\"],\n\t[\"property\", \"subpixel\"],\n\t[\"property\", \"easein\"],\n\t[\"property\", \"easeout\"],\n\t[\"property\", \"time\"],\n\t[\"property\", \"crop\"],\n\t[\"property\", \"auto\"],\n\t[\"property\", \"update\"],\n\t[\"property\", \"get_installed_packages\"],\n\t[\"property\", \"can_update\"],\n\t[\"property\", \"UpdateVersion\"],\n\t[\"property\", \"Update\"],\n\t[\"property\", \"overlay_functions\"],\n\t[\"property\", \"translations\"],\n\t[\"property\", \"window_left_padding\"],\n\t[\"property\", \"show_side_image\"],\n\t[\"property\", \"show_two_window\"]\n]\n"
  },
  {
    "path": "tests/languages/renpy/string_feature.test",
    "content": "\"# This isn't a comment, since it's part of a string.\"\n\n\"Since this line contains a string, it continues\n even when the line ends.\"\n\n$ a = [ \"Because of parenthesis, this line also\",\n        \"spans more than one line.\" ]\n\n'Strings can\\'t contain their delimiter, unless you escape it.'\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"# This isn't a comment, since it's part of a string.\\\"\"],\n\n\t[\"string\", \"\\\"Since this line contains a string, it continues\\r\\n even when the line ends.\\\"\"],\n\n\t[\"tag\", \"$\"],\n\t\" a \",\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"[\"],\n\t[\"string\", \"\\\"Because of parenthesis, this line also\\\"\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"string\", \"\\\"spans more than one line.\\\"\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"string\", \"'Strings can\\\\'t contain their delimiter, unless you escape it.'\"]\n]\n"
  },
  {
    "path": "tests/languages/renpy/tag_feature.test",
    "content": "label\nimage\nmenu\nhbox\nvbox\nframe\ntext\nimagemap\nimagebutton\nbar\nvbar\nscreen\ntextbutton\nbuttoscreenn\nfixed\ngrid\ninput\nkey\nmousearea\nside\ntimer\nviewport\nwindow\nhotspot\nhotbar\nself\nbutton\ndrag\ndraggroup\ntag\nmm_menu_frame\nnvl\nblock\n\n$\n\n----------------------------------------------------\n\n[\n\t[\"tag\", \"label\"],\n\t[\"tag\", \"image\"],\n\t[\"tag\", \"menu\"],\n\t[\"tag\", \"hbox\"],\n\t[\"tag\", \"vbox\"],\n\t[\"tag\", \"frame\"],\n\t[\"tag\", \"text\"],\n\t[\"tag\", \"imagemap\"],\n\t[\"tag\", \"imagebutton\"],\n\t[\"tag\", \"bar\"],\n\t[\"tag\", \"vbar\"],\n\t[\"tag\", \"screen\"],\n\t[\"tag\", \"textbutton\"],\n\t[\"tag\", \"buttoscreenn\"],\n\t[\"tag\", \"fixed\"],\n\t[\"tag\", \"grid\"],\n\t[\"tag\", \"input\"],\n\t[\"tag\", \"key\"],\n\t[\"tag\", \"mousearea\"],\n\t[\"tag\", \"side\"],\n\t[\"tag\", \"timer\"],\n\t[\"tag\", \"viewport\"],\n\t[\"tag\", \"window\"],\n\t[\"tag\", \"hotspot\"],\n\t[\"tag\", \"hotbar\"],\n\t[\"tag\", \"self\"],\n\t[\"tag\", \"button\"],\n\t[\"tag\", \"drag\"],\n\t[\"tag\", \"draggroup\"],\n\t[\"tag\", \"tag\"],\n\t[\"tag\", \"mm_menu_frame\"],\n\t[\"tag\", \"nvl\"],\n\t[\"tag\", \"block\"],\n\n\t[\"tag\", \"$\"]\n]\n"
  },
  {
    "path": "tests/languages/rescript/attr-value_feature.test",
    "content": "<button onClick={Js.log}>\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"<\"],\n\t[\"tag\", [\"button\"]],\n\t[\"attr-value\", \"onClick\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\t[\"class-name\", \"Js\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"log\"],\n\t[\"punctuation\", \"}\"],\n\t[\"operator\", \">\"]\n]\n\n----------------------------------------------------\n\nChecks for attr-value.\n"
  },
  {
    "path": "tests/languages/rescript/boolean_feature.test",
    "content": "false\ntrue\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"false\"],\n\t[\"boolean\", \"true\"]\n]\n\n----------------------------------------------------\n\nChecks for boolean.\n"
  },
  {
    "path": "tests/languages/rescript/char_feature.test",
    "content": "'b'\n'\\''\n'\\\\'\n'\\xff'\n'\\o214'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'b'\"],\n\t[\"char\", \"'\\\\''\"],\n\t[\"char\", \"'\\\\\\\\'\"],\n\t[\"char\", \"'\\\\xff'\"],\n\t[\"char\", \"'\\\\o214'\"]\n]\n\n----------------------------------------------------\n\nChecks for characters.\n"
  },
  {
    "path": "tests/languages/rescript/class-name_feature.test",
    "content": "Belt.Int.toString(n)\n<Button />\n@react.component\ntype poly = [ | #Poly | #Variant ]\n\n----------------------------------------------------\n\n[\n\t[\"class-name\", \"Belt\"],\n\t[\"punctuation\", \".\"],\n\t[\"class-name\", \"Int\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"toString\"],\n\t[\"punctuation\", \"(\"],\n\t\"n\",\n\t[\"punctuation\", \")\"],\n\n\t[\"operator\", \"<\"],\n\t[\"class-name\", \"Button\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \">\"],\n\n\t[\"class-name\", \"@react.component\"],\n\n\t[\"keyword\", \"type\"],\n\t[\"constant\", \"poly\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"[\"],\n\t[\"operator\", \"|\"],\n\t[\"class-name\", \"#Poly\"],\n\t[\"operator\", \"|\"],\n\t[\"class-name\", \"#Variant\"],\n\t[\"punctuation\", \"]\"]\n]\n\n----------------------------------------------------\n\nChecks for class names.\n"
  },
  {
    "path": "tests/languages/rescript/comment_feature.test",
    "content": "// foobar\n/**/\n/* one line */\n/* multiline\ncomment */\n/**\nanother comment\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// foobar\"],\n\t[\"comment\", \"/**/\"],\n\t[\"comment\", \"/* one line */\"],\n\t[\"comment\", \"/* multiline\\r\\ncomment */\"],\n\t[\"comment\", \"/**\\r\\nanother comment\\r\\n*/\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/rescript/function_feature.test",
    "content": "sum(a, b)\nBelt.Int.toString(n)\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"sum\"],\n\t[\"punctuation\", \"(\"],\n\t\"a\",\n\t[\"punctuation\", \",\"],\n\t\" b\",\n\t[\"punctuation\", \")\"],\n\n\t[\"class-name\", \"Belt\"],\n\t[\"punctuation\", \".\"],\n\t[\"class-name\", \"Int\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"toString\"],\n\t[\"punctuation\", \"(\"],\n\t\"n\",\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for functions.\n"
  },
  {
    "path": "tests/languages/rescript/keyword_feature.test",
    "content": "and\nas\nassert\nbegin\nbool\nclass\nconstraint\ndo\ndone\ndownto\nelse\nend\nexception\nexternal\nfloat\nfor\nfun\nfunction\nif\nin\ninclude\ninherit\ninitializer\nint\nlazy\nlet\nmethod\nmodule\nmutable\nnew\nnonrec\nobject\nof\nopen\nor\nprivate\nrec\nstring\nswitch\nthen\nto\ntry\nwhen\nwhile\nwith\ntype\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"and\"],\n\t[\"keyword\", \"as\"],\n\t[\"keyword\", \"assert\"],\n\t[\"keyword\", \"begin\"],\n\t[\"keyword\", \"bool\"],\n\t[\"keyword\", \"class\"],\n\t[\"keyword\", \"constraint\"],\n\t[\"keyword\", \"do\"],\n\t[\"keyword\", \"done\"],\n\t[\"keyword\", \"downto\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"end\"],\n\t[\"keyword\", \"exception\"],\n\t[\"keyword\", \"external\"],\n\t[\"keyword\", \"float\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"fun\"],\n\t[\"keyword\", \"function\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"include\"],\n\t[\"keyword\", \"inherit\"],\n\t[\"keyword\", \"initializer\"],\n\t[\"keyword\", \"int\"],\n\t[\"keyword\", \"lazy\"],\n\t[\"keyword\", \"let\"],\n\t[\"keyword\", \"method\"],\n\t[\"keyword\", \"module\"],\n\t[\"keyword\", \"mutable\"],\n\t[\"keyword\", \"new\"],\n\t[\"keyword\", \"nonrec\"],\n\t[\"keyword\", \"object\"],\n\t[\"keyword\", \"of\"],\n\t[\"keyword\", \"open\"],\n\t[\"keyword\", \"or\"],\n\t[\"keyword\", \"private\"],\n\t[\"keyword\", \"rec\"],\n\t[\"keyword\", \"string\"],\n\t[\"keyword\", \"switch\"],\n\t[\"keyword\", \"then\"],\n\t[\"keyword\", \"to\"],\n\t[\"keyword\", \"try\"],\n\t[\"keyword\", \"when\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"with\"],\n\t[\"keyword\", \"type\"]\n]\n\n----------------------------------------------------\n\nChecks for keyword.\n"
  },
  {
    "path": "tests/languages/rescript/number_feature.test",
    "content": "let value = 1\n1 + 2\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"let\"], \" value \", [\"operator\", \"=\"], [\"number\", \"1\"],\n\t[\"number\", \"1\"], [\"operator\", \"+\"], [\"number\", \"2\"]\n]\n\n----------------------------------------------------\n\nChecks for number.\n"
  },
  {
    "path": "tests/languages/rescript/operator_feature.test",
    "content": "...\n:: :=\n= == ===\n< <= > >=\n| ^ ? ' :\n# ! ~ `\n+ - * /\n+. -. *. /.\nmod land lor lxor\nlsl lsr asr\n|> ->\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"...\"],\n\n\t[\"operator\", \"::\"],\n\t[\"operator\", \":=\"],\n\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"===\"],\n\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"?\"],\n\t[\"operator\", \"'\"],\n\t[\"operator\", \":\"],\n\n\t[\"operator\", \"#\"],\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"`\"],\n\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\n\t[\"operator\", \"+.\"],\n\t[\"operator\", \"-.\"],\n\t[\"operator\", \"*.\"],\n\t[\"operator\", \"/.\"],\n\n\t[\"operator\", \"mod\"],\n\t[\"operator\", \"land\"],\n\t[\"operator\", \"lor\"],\n\t[\"operator\", \"lxor\"],\n\n\t[\"operator\", \"lsl\"],\n\t[\"operator\", \"lsr\"],\n\t[\"operator\", \"asr\"],\n\n\t[\"operator\", \"|>\"],\n\t[\"operator\", \"->\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/rescript/punctuation_feature.test",
    "content": "type poly = [ | #Poly | #Variant ]\ntype person = { name: string }\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"type\"],\n\t[\"constant\", \"poly\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"[\"],\n\t[\"operator\", \"|\"],\n\t[\"class-name\", \"#Poly\"],\n\t[\"operator\", \"|\"],\n\t[\"class-name\", \"#Variant\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"keyword\", \"type\"],\n\t[\"constant\", \"person\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\t\" name\",\n\t[\"operator\", \":\"],\n\t[\"keyword\", \"string\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/rescript/string_feature.test",
    "content": "\"\"\n\"foo\\\"bar\"\n`foo bar`\n\nlet greeting = `Hello\nWorld\n👋\n${name}\n`\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\\\\\"bar\\\"\"],\n\t[\"template-string\", [\n\t\t[\"template-punctuation\", \"`\"],\n\t\t[\"string\", \"foo bar\"],\n\t\t[\"template-punctuation\", \"`\"]\n\t]],\n\n\t[\"keyword\", \"let\"],\n\t\" greeting \",\n\t[\"operator\", \"=\"],\n\t[\"template-string\", [\n\t\t[\"template-punctuation\", \"`\"],\n\t\t[\"string\", \"Hello\\r\\nWorld\\r\\n👋\\r\\n\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"${\"],\n\t\t\t\"name\",\n\t\t\t[\"interpolation-punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"\\r\\n\"],\n\t\t[\"template-punctuation\", \"`\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/rescript/tag_feature.test",
    "content": "<button></button>\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"<\"],\n\t[\"tag\", [\"button\"]],\n\t[\"operator\", \">\"],\n\t[\"tag\", [\n\t\t[\"operator\", \"<\"],\n\t\t[\"operator\", \"/\"],\n\t\t\"button\"\n\t]],\n\t[\"operator\", \">\"]\n]\n\n----------------------------------------------------\n\nChecks for tag.\n"
  },
  {
    "path": "tests/languages/rest/command-line-option_feature.test",
    "content": "-a  Simple option\r\n-b\r\n  Simple option on next line\r\n--very-long-option    Long option\r\n+f  Option using +\r\n-f FILE  Option with value 1\r\n--file=FILE  Option with value 2\r\n-2, --two  Two options in a row.\r\n-f FILE, --file=FILE  Two options with values in a row.\r\n/V    A VMS/DOS-style option.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"command-line-option\", \"-a\"],\r\n\t\"  Simple option\\r\\n\",\r\n\t[\"command-line-option\", \"-b\"],\r\n\t\"\\r\\n  Simple option on next line\\r\\n\",\r\n\t[\"command-line-option\", \"--very-long-option\"],\r\n\t\"    Long option\\r\\n\",\r\n\t[\"command-line-option\", \"+f\"],\r\n\t\"  Option using +\\r\\n\",\r\n\t[\"command-line-option\", \"-f FILE\"],\r\n\t\"  Option with value 1\\r\\n\",\r\n\t[\"command-line-option\", \"--file=FILE\"],\r\n\t\"  Option with value 2\\r\\n\",\r\n\t[\"command-line-option\", \"-2, --two\"],\r\n\t\"  Two options in a row.\\r\\n\",\r\n\t[\"command-line-option\", \"-f FILE, --file=FILE\"],\r\n\t\"  Two options with values in a row.\\r\\n\",\r\n\t[\"command-line-option\", \"/V\"],\r\n\t\"    A VMS/DOS-style option.\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for command line options."
  },
  {
    "path": "tests/languages/rest/comment_feature.test",
    "content": ".. foo\r\n\r\n.. foo\r\nbar\r\n\r\n..\r\n\t_foo:\r\n\t[bar]\r\n\t|baz|\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"comment\", \" foo\"],\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"comment\", \" foo\\r\\nbar\"],\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"comment\", \"\\r\\n\\t_foo:\\r\\n\\t[bar]\\r\\n\\t|baz|\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/rest/directive_feature.test",
    "content": ".. image:: mylogo.jpeg\r\n.. figure:: foo.png\r\n\r\n.. note:: This is a paragraph.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"directive\", [\r\n\t\t\"image\",\r\n\t\t[\"punctuation\", \"::\"]\r\n\t]],\r\n\t\" mylogo.jpeg\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"directive\", [\r\n\t\t\"figure\",\r\n\t\t[\"punctuation\", \"::\"]\r\n\t]],\r\n\t\" foo.png\\r\\n\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"directive\", [\r\n\t\t\"note\",\r\n\t\t[\"punctuation\", \"::\"]\r\n\t]],\r\n\t\" This is a paragraph.\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directives."
  },
  {
    "path": "tests/languages/rest/doctest-block_feature.test",
    "content": ">>> Foo\r\n\r\n>>> foo\r\nbar\r\nbaz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"doctest-block\", [\r\n\t\t[\"punctuation\", \">>>\"],\r\n\t\t\" Foo\"\r\n\t]],\r\n\t[\"doctest-block\", [\r\n\t\t[\"punctuation\", \">>>\"],\r\n\t\t\" foo\\r\\nbar\\r\\nbaz\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for doctest blocks."
  },
  {
    "path": "tests/languages/rest/field_feature.test",
    "content": ":scale: 50 %\r\n\t:alt: map to buried treasure\r\n\r\n:width: 11\r\n:height: 11\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"field\", \":scale:\"], \" 50 %\\r\\n\\t\",\r\n\t[\"field\", \":alt:\"], \" map to buried treasure\\r\\n\\r\\n\",\r\n\r\n\t[\"field\", \":width:\"], \" 11\\r\\n\",\r\n\t[\"field\", \":height:\"], \" 11\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for fields."
  },
  {
    "path": "tests/languages/rest/hr_feature.test",
    "content": "Foo\r\n\r\n!!!!\r\n\r\n\"\"\"\"\r\n\r\n####\r\n\r\n$$$$\r\n\r\n%%%%\r\n\r\n&&&&\r\n\r\n''''\r\n\r\n((((\r\n\r\n))))\r\n\r\n****\r\n\r\n++++\r\n\r\n,,,,\r\n\r\n----\r\n\r\n....\r\n\r\n////\r\n\r\n::::\r\n\r\n;;;;\r\n\r\n<<<<\r\n\r\n====\r\n\r\n>>>>\r\n\r\n????\r\n\r\n@@@@\r\n\r\n[[[[\r\n\r\n\\\\\\\\\r\n\r\n]]]]\r\n\r\n^^^^\r\n\r\n____\r\n\r\n````\r\n\r\n{{{{\r\n\r\n||||\r\n\r\n}}}}\r\n\r\n~~~~\r\n\r\nFoo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"Foo\\r\\n\\r\\n\",\r\n\t[\"hr\", \"!!!!\"],\r\n\t[\"hr\", \"\\\"\\\"\\\"\\\"\"],\r\n\t[\"hr\", \"####\"],\r\n\t[\"hr\", \"$$$$\"],\r\n\t[\"hr\", \"%%%%\"],\r\n\t[\"hr\", \"&&&&\"],\r\n\t[\"hr\", \"''''\"],\r\n\t[\"hr\", \"((((\"],\r\n\t[\"hr\", \"))))\"],\r\n\t[\"hr\", \"****\"],\r\n\t[\"hr\", \"++++\"],\r\n\t[\"hr\", \",,,,\"],\r\n\t[\"hr\", \"----\"],\r\n\t[\"hr\", \"....\"],\r\n\t[\"hr\", \"////\"],\r\n\t[\"hr\", \"::::\"],\r\n\t[\"hr\", \";;;;\"],\r\n\t[\"hr\", \"<<<<\"],\r\n\t[\"hr\", \"====\"],\r\n\t[\"hr\", \">>>>\"],\r\n\t[\"hr\", \"????\"],\r\n\t[\"hr\", \"@@@@\"],\r\n\t[\"hr\", \"[[[[\"],\r\n\t[\"hr\", \"\\\\\\\\\\\\\\\\\"],\r\n\t[\"hr\", \"]]]]\"],\r\n\t[\"hr\", \"^^^^\"],\r\n\t[\"hr\", \"____\"],\r\n\t[\"hr\", \"````\"],\r\n\t[\"hr\", \"{{{{\"],\r\n\t[\"hr\", \"||||\"],\r\n\t[\"hr\", \"}}}}\"],\r\n\t[\"hr\", \"~~~~\"],\r\n\t\"\\r\\n\\r\\nFoo\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for horizontal lines, with every possible characters.\r\nThe \"Foo\"s are required since tests are trimmed and horizontal lines\r\nrequire line feeds before and after."
  },
  {
    "path": "tests/languages/rest/inline_feature.test",
    "content": "Foo *emphasis*.\r\n**Strong** bar.\r\nThis is `interpreted text`.\r\n:role:`interpreted text`\r\n`interpreted text`:role:\r\n``inline literals``\r\nThis is a regexp: ``[+-]?(\\d+(\\.\\d*)?|\\.\\d+)``\r\nUsage of |substitution|.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"Foo \",\r\n\t[\"inline\", [\r\n\t    [\"punctuation\", \"*\"], [\"italic\", \"emphasis\"], [\"punctuation\", \"*\"]\r\n    ]],\r\n    \".\\r\\n\",\r\n    [\"inline\", [\r\n        [\"punctuation\", \"**\"], [\"bold\", \"Strong\"], [\"punctuation\", \"**\"]\r\n    ]],\r\n    \" bar.\\r\\nThis is \",\r\n    [\"inline\", [\r\n        [\"punctuation\", \"`\"], [\"interpreted-text\", \"interpreted text\"], [\"punctuation\", \"`\"]\r\n    ]],\r\n    \".\\r\\n\",\r\n    [\"inline\", [\r\n        [\"role\", [\r\n            [\"punctuation\", \":\"], \"role\", [\"punctuation\", \":\"]\r\n        ]],\r\n        [\"punctuation\", \"`\"], [\"interpreted-text\", \"interpreted text\"], [\"punctuation\", \"`\"]\r\n    ]],\r\n    [\"inline\", [\r\n        [\"punctuation\", \"`\"], [\"interpreted-text\", \"interpreted text\"], [\"punctuation\", \"`\"],\r\n        [\"role\", [\r\n            [\"punctuation\", \":\"], \"role\", [\"punctuation\", \":\"]\r\n        ]]\r\n    ]],\r\n    [\"inline\", [\r\n        [\"punctuation\", \"``\"], [\"inline-literal\", \"inline literals\"], [\"punctuation\", \"``\"]\r\n    ]],\r\n    \"\\r\\nThis is a regexp: \",\r\n    [\"inline\", [\r\n        [\"punctuation\", \"``\"], [\"inline-literal\", \"[+-]?(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)\"], [\"punctuation\", \"``\"]\r\n    ]],\r\n    \"\\r\\nUsage of \",\r\n    [\"inline\", [\r\n        [\"punctuation\", \"|\"], [\"substitution\", \"substitution\"], [\"punctuation\", \"|\"]\r\n    ]],\r\n    \".\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for most inline markup: emphasis, bold, interpreted text,\r\nroles, inline literals and substitutions."
  },
  {
    "path": "tests/languages/rest/issue2940.test",
    "content": "`ALTER ROLE <https://www.postgresql.org/docs/12/sql-alterrole.html>`_ or ``ALTER_ROLE``\n\n`ALTER ROLE <https://www.postgresql.org/docs/12/sql-alterrole.html>`_\nor ``ALTER_ROLE``\n\n----------------------------------------------------\n\n[\n\t[\"link\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"ALTER ROLE <https://www.postgresql.org/docs/12/sql-alterrole.html>\",\n\t\t[\"punctuation\", \"`_\"]\n\t]],\n\t\" or \",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"``\"],\n\t\t[\"inline-literal\", \"ALTER_ROLE\"],\n\t\t[\"punctuation\", \"``\"]\n\t]],\n\n\t[\"link\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"ALTER ROLE <https://www.postgresql.org/docs/12/sql-alterrole.html>\",\n\t\t[\"punctuation\", \"`_\"]\n\t]],\n\n\t\"\\r\\nor \",\n\t[\"inline\", [\n\t\t[\"punctuation\", \"``\"],\n\t\t[\"inline-literal\", \"ALTER_ROLE\"],\n\t\t[\"punctuation\", \"``\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/rest/link-target_feature.test",
    "content": ".. [1] Foo\r\n.. [2] Bar\r\n.. [#] Baz\r\n.. [#foobar] Foobar\r\n.. [CIT2002] Foobar\r\n\r\n.. _foobar: Foobar\r\n.. _foo\\:bar: Foobar\r\n.. _`foo:bar`: Foobar\r\n.. __: Anonymous\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"link-target\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"1\",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t\" Foo\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"link-target\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"2\",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t\" Bar\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"link-target\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"#\",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t\" Baz\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"link-target\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"#foobar\",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t\" Foobar\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"link-target\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"CIT2002\",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\t\" Foobar\\r\\n\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"link-target\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t\"foobar\",\r\n\t\t[\"punctuation\", \":\"]\r\n\t]],\r\n\t\" Foobar\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"link-target\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t\"foo\\\\:bar\",\r\n\t\t[\"punctuation\", \":\"]\r\n\t]],\r\n\t\" Foobar\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"link-target\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t\"`foo:bar`\",\r\n\t\t[\"punctuation\", \":\"]\r\n\t]],\r\n\t\" Foobar\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"link-target\", [\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t[\"punctuation\", \"_\"],\r\n\t\t[\"punctuation\", \":\"]\r\n\t]],\r\n\t\" Anonymous\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for link targets."
  },
  {
    "path": "tests/languages/rest/link_feature.test",
    "content": "[1]_\r\n[2]_\r\n[#]_\r\n[#foobar]_\r\n[CIT2002]_\r\n\r\nfoobar_\r\nfoo__\r\nfoo:bar_\r\n`foo:bar`_\r\n`foo bar baz`__\r\n_`inline internal target`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"link\", [[\"punctuation\", \"[\"], \"1\", [\"punctuation\", \"]_\"]]],\r\n\t[\"link\", [[\"punctuation\", \"[\"], \"2\", [\"punctuation\", \"]_\"]]],\r\n\t[\"link\", [[\"punctuation\", \"[\"], \"#\", [\"punctuation\", \"]_\"]]],\r\n\t[\"link\", [[\"punctuation\", \"[\"], \"#foobar\", [\"punctuation\", \"]_\"]]],\r\n\t[\"link\", [[\"punctuation\", \"[\"], \"CIT2002\", [\"punctuation\", \"]_\"]]],\r\n\r\n\t[\"link\", [\"foobar\", [\"punctuation\", \"_\"]]],\r\n\t[\"link\", [\"foo\", [\"punctuation\", \"__\"]]],\r\n\t[\"link\", [\"foo:bar\", [\"punctuation\", \"_\"]]],\r\n\t[\"link\", [[\"punctuation\", \"`\"], \"foo:bar\", [\"punctuation\", \"`_\"]]],\r\n\t[\"link\", [[\"punctuation\", \"`\"], \"foo bar baz\", [\"punctuation\", \"`__\"]]],\r\n\t[\"link\", [[\"punctuation\", \"_`\"], \"inline internal target\", [\"punctuation\", \"`\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for links."
  },
  {
    "path": "tests/languages/rest/list-bullet_feature.test",
    "content": "* foo\r\n+ bar\r\n- baz\r\n• foo\r\n‣ bar\r\n⁃ baz\r\n\r\n(42) foo\r\n(a) bar\r\n(xvii) baz\r\n\r\n4) foo\r\nh) bar\r\nMLCDXVI) 1666\r\n\r\n1. foo\r\nz. bar\r\nmlcdxvi. baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"list-bullet\", \"*\"], \" foo\\r\\n\",\r\n\t[\"list-bullet\", \"+\"], \" bar\\r\\n\",\r\n\t[\"list-bullet\", \"-\"], \" baz\\r\\n\",\r\n\t[\"list-bullet\", \"•\"], \" foo\\r\\n\",\r\n\t[\"list-bullet\", \"‣\"], \" bar\\r\\n\",\r\n\t[\"list-bullet\", \"⁃\"], \" baz\\r\\n\\r\\n\",\r\n\r\n\t[\"list-bullet\", \"(42)\"], \" foo\\r\\n\",\r\n\t[\"list-bullet\", \"(a)\"], \" bar\\r\\n\",\r\n\t[\"list-bullet\", \"(xvii)\"], \" baz\\r\\n\\r\\n\",\r\n\r\n\t[\"list-bullet\", \"4)\"], \" foo\\r\\n\",\r\n\t[\"list-bullet\", \"h)\"], \" bar\\r\\n\",\r\n\t[\"list-bullet\", \"MLCDXVI)\"], \" 1666\\r\\n\\r\\n\",\r\n\r\n\t[\"list-bullet\", \"1.\"], \" foo\\r\\n\",\r\n\t[\"list-bullet\", \"z.\"], \" bar\\r\\n\",\r\n\t[\"list-bullet\", \"mlcdxvi.\"], \" baz\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for list bullets."
  },
  {
    "path": "tests/languages/rest/literal-block_feature.test",
    "content": "::\r\n\tFoo\r\n\tBar\r\n\tBaz\r\n\r\nFoobar::\r\n  Foo\r\n  Bar\r\n  Baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t\"\\r\\n\\tFoo\\r\\n\\tBar\\r\\n\\tBaz\"\r\n\t]],\r\n\t\"\\r\\n\\r\\nFoobar\",\r\n\t[\"literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t\"\\r\\n  Foo\\r\\n  Bar\\r\\n  Baz\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for literal blocks."
  },
  {
    "path": "tests/languages/rest/quoted-literal-block_feature.test",
    "content": "::\r\n! Foo\r\n!! Bar\r\n! Baz\r\n\r\nFoobar ::\r\n\" Foo\r\n\" Bar\r\n\"\" Baz\r\n\r\n::\r\n# Foo\r\n# Bar\r\n\r\n::\r\n$ Foo\r\n$ Bar\r\n\r\n::\r\n% Foo\r\n% Bar\r\n\r\n::\r\n& Foo\r\n& Bar\r\n\r\n::\r\n' Foo\r\n' Bar\r\n\r\n::\r\n( Foo\r\n( Bar\r\n\r\n::\r\n) Foo\r\n) Bar\r\n\r\n::\r\n* Foo\r\n* Bar\r\n\r\n::\r\n+ Foo\r\n+ Bar\r\n\r\n::\r\n, Foo\r\n, Bar\r\n\r\n::\r\n- Foo\r\n- Bar\r\n\r\n::\r\n. Foo\r\n. Bar\r\n\r\n::\r\n/ Foo\r\n/ Bar\r\n\r\n::\r\n: Foo\r\n: Bar\r\n\r\n::\r\n; Foo\r\n; Bar\r\n\r\n::\r\n< Foo\r\n< Bar\r\n\r\n::\r\n= Foo\r\n= Bar\r\n\r\n::\r\n> Foo\r\n> Bar\r\n\r\n::\r\n? Foo\r\n? Bar\r\n\r\n::\r\n@ Foo\r\n@ Bar\r\n\r\n::\r\n[ Foo\r\n[ Bar\r\n\r\n::\r\n\\ Foo\r\n\\ Bar\r\n\r\n::\r\n] Foo\r\n] Bar\r\n\r\n::\r\n^ Foo\r\n^ Bar\r\n\r\n::\r\n_ Foo\r\n_ Bar\r\n\r\n::\r\n` Foo\r\n` Bar\r\n\r\n::\r\n{ Foo\r\n{ Bar\r\n\r\n::\r\n| Foo\r\n| Bar\r\n\r\n::\r\n} Foo\r\n} Bar\r\n\r\n::\r\n~ Foo\r\n~ Bar\r\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"!\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"!!\"], \" Bar\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"!\"], \" Baz\"\r\n\t]],\r\n\t\r\n\t\"\\r\\n\\r\\nFoobar \",\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"\\\"\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"\\\"\"], \" Bar\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"\\\"\\\"\"], \" Baz\"\r\n\t]],\r\n\t\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"#\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"#\"], \" Bar\"\r\n\t]],\r\n\t\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"$\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"$\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"%\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"%\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"&\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"&\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"'\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"'\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"(\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"(\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \")\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \")\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"*\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"*\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"+\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"+\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \",\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \",\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"-\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"-\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \".\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \".\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"/\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"/\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \":\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \":\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \";\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \";\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"<\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"<\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"=\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"=\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \">\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \">\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"?\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"?\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"@\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"@\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"[\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"[\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"\\\\\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"\\\\\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"]\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"]\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"^\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"^\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"_\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"_\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"`\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"`\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"{\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"{\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"|\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"|\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"}\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"}\"], \" Bar\"\r\n\t]],\r\n\r\n\t[\"quoted-literal-block\", [\r\n\t\t[\"literal-block-punctuation\", \"::\"],\r\n\t\t[\"literal-block-punctuation\", \"~\"], \" Foo\\r\\n\",\r\n\t\t[\"literal-block-punctuation\", \"~\"], \" Bar\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for quoted literal blocks, with every possible character."
  },
  {
    "path": "tests/languages/rest/substitution-def_feature.test",
    "content": ".. |biohazard| image:: biohazard.png\r\n.. |Red light| image:: red_light.png\r\n\r\n.. |Michael| user:: mjones\r\n.. |Jon|     user:: jhl\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"substitution-def\", [\r\n\t\t[\"substitution\", [\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\"biohazard\",\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]],\r\n\t\t[\"directive\", [\r\n\t\t\t\"image\",\r\n\t\t\t[\"punctuation\", \"::\"]\r\n\t\t]]\r\n\t]],\r\n\t\" biohazard.png\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"substitution-def\", [\r\n\t\t[\"substitution\", [\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\"Red light\",\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]],\r\n\t\t[\"directive\", [\r\n\t\t\t\"image\",\r\n\t\t\t[\"punctuation\", \"::\"]\r\n\t\t]]\r\n\t]],\r\n\t\" red_light.png\\r\\n\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"substitution-def\", [\r\n\t\t[\"substitution\", [\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\"Michael\",\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]],\r\n\t\t[\"directive\", [\r\n\t\t\t\"user\",\r\n\t\t\t[\"punctuation\", \"::\"]\r\n\t\t]]\r\n\t]],\r\n\t\" mjones\\r\\n\",\r\n\r\n\t[\"punctuation\", \"..\"],\r\n\t[\"substitution-def\", [\r\n\t\t[\"substitution\", [\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\"Jon\",\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]],\r\n\t\t[\"directive\", [\r\n\t\t\t\"user\",\r\n\t\t\t[\"punctuation\", \"::\"]\r\n\t\t]]\r\n\t]],\r\n\t\" jhl\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for substitution definitions."
  },
  {
    "path": "tests/languages/rest/table_feature.test",
    "content": "+-----+---------+\r\n| foo |   bar   |\r\n+=====+=========+\r\n| foo |   bar   |\r\n+-----+---------+\r\n\r\n\t+---+\r\n\t| 1 |\r\n\t+---+\r\n\r\n=== ===\r\n a   b\r\n=== ===\r\n 1   2\r\n=== ===\r\n\r\n\t==== ==== =====\r\n\t   foo     bar\r\n\t--------- -----\r\n\t ab   cd    e\r\n\t==== ==== =====\r\n\t  1    2    3\r\n\t  4    5    6\r\n\t==== ==== =====\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"+-----+---------+\"],\r\n\t\t[\"punctuation\", \"|\"], \" foo \", [\"punctuation\", \"|\"], \"   bar   \", [\"punctuation\", \"|\"],\r\n\t\t[\"punctuation\", \"+=====+=========+\"],\r\n\t\t[\"punctuation\", \"|\"], \" foo \", [\"punctuation\", \"|\"], \"   bar   \", [\"punctuation\", \"|\"],\r\n\t\t[\"punctuation\", \"+-----+---------+\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"+---+\"],\r\n\t\t[\"punctuation\", \"|\"], \" 1 \", [\"punctuation\", \"|\"],\r\n\t\t[\"punctuation\", \"+---+\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"===\"], [\"punctuation\", \"===\"],\r\n\t\t\"\\r\\n a   b\\r\\n\",\r\n\t\t[\"punctuation\", \"===\"], [\"punctuation\", \"===\"],\r\n\t\t\"\\r\\n 1   2\\r\\n\",\r\n\t\t[\"punctuation\", \"===\"], [\"punctuation\", \"===\"]\r\n\t]],\r\n\r\n\t[\"table\", [\r\n\t\t[\"punctuation\", \"====\"], [\"punctuation\", \"====\"], [\"punctuation\", \"=====\"],\r\n\t\t\"\\r\\n\\t   foo     bar\\r\\n\\t\",\r\n\t\t[\"punctuation\", \"---------\"], [\"punctuation\", \"-----\"],\r\n\t\t\"\\r\\n\\t ab   cd    e\\r\\n\\t\",\r\n\t\t[\"punctuation\", \"====\"], [\"punctuation\", \"====\"], [\"punctuation\", \"=====\"],\r\n\t\t\"\\r\\n\\t  1    2    3\\r\\n\\t  4    5    6\\r\\n\\t\",\r\n\t\t[\"punctuation\", \"====\"], [\"punctuation\", \"====\"], [\"punctuation\", \"=====\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for grid tables and simple tables."
  },
  {
    "path": "tests/languages/rest/title_feature.test",
    "content": "!!!!\r\nFoo\r\n!!!!\r\n\r\n\"\"\"\"\r\nFoo\r\n\"\"\"\"\r\n\r\n####\r\nFoo\r\n####\r\n\r\n$$$$\r\nFoo\r\n$$$$\r\n\r\n%%%%\r\nFoo\r\n%%%%\r\n\r\n&&&&\r\nFoo\r\n&&&&\r\n\r\n''''\r\nFoo\r\n''''\r\n\r\n((((\r\nFoo\r\n((((\r\n\r\n))))\r\nFoo\r\n))))\r\n\r\n****\r\nFoo\r\n****\r\n\r\n++++\r\nFoo\r\n++++\r\n\r\n,,,,\r\nFoo\r\n,,,,\r\n\r\n---\r\nFoo\r\n---\r\n\r\n....\r\nFoo\r\n....\r\n\r\n////\r\nFoo\r\n////\r\n\r\n::::\r\nFoo\r\n::::\r\n\r\n;;;;\r\nFoo\r\n;;;;\r\n\r\n<<<<\r\nFoo\r\n<<<<\r\n\r\n====\r\nFoo\r\n====\r\n\r\n>>>>\r\nFoo\r\n>>>>\r\n\r\n????\r\nFoo\r\n????\r\n\r\n@@@@\r\nFoo\r\n@@@@\r\n\r\n[[[[\r\nFoo\r\n[[[[\r\n\r\n\\\\\\\\\r\nFoo\r\n\\\\\\\\\r\n\r\n]]]]\r\nFoo\r\n]]]]\r\n\r\n^^^^\r\nFoo\r\n^^^^\r\n\r\n____\r\nFoo\r\n____\r\n\r\n````\r\nFoo\r\n````\r\n\r\n{{{{\r\nFoo\r\n{{{{\r\n\r\n||||\r\nFoo\r\n||||\r\n\r\n}}}}\r\nFoo\r\n}}}}\r\n\r\n~~~~\r\nFoo\r\n~~~~\r\n\r\n\r\nBar\r\n!!!!\r\n\r\nBar\r\n\"\"\"\"\r\n\r\nBar\r\n####\r\n\r\nBar\r\n$$$$\r\n\r\nBar\r\n%%%%\r\n\r\nBar\r\n&&&&\r\n\r\nBar\r\n''''\r\n\r\nBar\r\n((((\r\n\r\nBar\r\n))))\r\n\r\nBar\r\n****\r\n\r\nBar\r\n++++\r\n\r\nBar\r\n,,,,\r\n\r\nBar\r\n---\r\n\r\nBar\r\n....\r\n\r\nBar\r\n////\r\n\r\nBar\r\n::::\r\n\r\nBar\r\n;;;;\r\n\r\nBar\r\n<<<<\r\n\r\nBar\r\n====\r\n\r\nBar\r\n>>>>\r\n\r\nBar\r\n????\r\n\r\nBar\r\n@@@@\r\n\r\nBar\r\n[[[[\r\n\r\nBar\r\n\\\\\\\\\r\n\r\nBar\r\n]]]]\r\n\r\nBar\r\n^^^^\r\n\r\nBar\r\n____\r\n\r\nBar\r\n````\r\n\r\nBar\r\n{{{{\r\n\r\nBar\r\n||||\r\n\r\nBar\r\n}}}}\r\n\r\nBar\r\n~~~~\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"!!!!\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"!!!!\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"\\\"\\\"\\\"\\\"\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"\\\"\\\"\\\"\\\"\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"####\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"####\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"$$$$\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"$$$$\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"%%%%\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"%%%%\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"&&&&\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"&&&&\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"''''\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"''''\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"((((\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"((((\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"))))\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"))))\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"****\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"****\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"++++\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"++++\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \",,,,\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \",,,,\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"---\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"---\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"....\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"....\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"////\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"////\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"::::\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"::::\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \";;;;\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \";;;;\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"<<<<\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"<<<<\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"====\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"====\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \">>>>\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \">>>>\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"????\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"????\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"@@@@\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"@@@@\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"[[[[\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"[[[[\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"\\\\\\\\\\\\\\\\\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"\\\\\\\\\\\\\\\\\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"]]]]\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"]]]]\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"^^^^\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"^^^^\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"____\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"____\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"````\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"````\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"{{{{\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"{{{{\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"||||\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"||||\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"}}}}\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"}}}}\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"punctuation\", \"~~~~\"],\r\n\t\t[\"important\", \"Foo\"],\r\n\t\t[\"punctuation\", \"~~~~\"]\r\n\t]],\r\n\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"!!!!\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"\\\"\\\"\\\"\\\"\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"####\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"$$$$\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"%%%%\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"&&&&\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"''''\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"((((\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"))))\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"****\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"++++\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \",,,,\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"---\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"....\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"////\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"::::\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \";;;;\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"<<<<\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"====\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \">>>>\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"????\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"@@@@\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"[[[[\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"\\\\\\\\\\\\\\\\\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"]]]]\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"^^^^\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"____\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"````\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"{{{{\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"||||\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"}}}}\"]\r\n\t]],\r\n\r\n\t[\"title\", [\r\n\t\t[\"important\", \"Bar\"],\r\n\t\t[\"punctuation\", \"~~~~\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for titles, overlined and underlined or underlined only, with every possible adornments."
  },
  {
    "path": "tests/languages/rip/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/rip/builtin_feature.test",
    "content": "@\r\nSystem\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"@\"],\r\n\t[\"builtin\", \"System\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for builtins."
  },
  {
    "path": "tests/languages/rip/char_feature.test",
    "content": "`a\n`b\n`Z\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"`a\"],\n\t[\"char\", \"`b\"],\n\t[\"char\", \"`Z\"]\n]\n\n----------------------------------------------------\n\nChecks for characters.\n"
  },
  {
    "path": "tests/languages/rip/comment_feature.test",
    "content": "#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/rip/date_time_feature.test",
    "content": "2015-08-30\r\n1970-01-01\r\n\r\n17:43:21\r\n00:00:00\r\n\r\n2015-08-30T17:43:21\r\n1970-01-01T00:00:00\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"date\", \"2015-08-30\"],\r\n\t[\"date\", \"1970-01-01\"],\r\n\t[\"time\", \"17:43:21\"],\r\n\t[\"time\", \"00:00:00\"],\r\n\t[\"datetime\", \"2015-08-30T17:43:21\"],\r\n\t[\"datetime\", \"1970-01-01T00:00:00\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for dates, times and datetimes."
  },
  {
    "path": "tests/languages/rip/keyword_feature.test",
    "content": "=> ->\r\nclass if else\r\nswitch case\r\nreturn exit\r\ntry catch\r\nfinally raise\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"=>\"], [\"keyword\", \"->\"],\r\n\t[\"keyword\", \"class\"], [\"keyword\", \"if\"], [\"keyword\", \"else\"],\r\n\t[\"keyword\", \"switch\"], [\"keyword\", \"case\"],\r\n\t[\"keyword\", \"return\"], [\"keyword\", \"exit\"],\r\n\t[\"keyword\", \"try\"], [\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"finally\"], [\"keyword\", \"raise\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/rip/number_feature.test",
    "content": "42\r\n3.14159\r\n+18\r\n+0.14\r\n-242\r\n-85.21\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"+18\"],\r\n\t[\"number\", \"+0.14\"],\r\n\t[\"number\", \"-242\"],\r\n\t[\"number\", \"-85.21\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/rip/punctuation_feature.test",
    "content": ".. ...\n\n` , . : ; = / \\\n( ) < > [ ] { }\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"..\"], [\"punctuation\", \"...\"],\n\n\t[\"punctuation\", \"`\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"=\"],\n\t[\"punctuation\", \"/\"],\n\t[\"punctuation\", \"\\\\\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"<\"],\n\t[\"punctuation\", \">\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/rip/reference_feature.test",
    "content": "foo\r\nfoo_bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"reference\", \"foo\"],\r\n\t[\"reference\", \"foo_bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for reference."
  },
  {
    "path": "tests/languages/rip/regex_feature.test",
    "content": "/foobar/\r\n/fo[o](?=bar)/\r\n/\\/\\\\\\[\\]/\r\n/(fo|o?)+b*ar?/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"regex\", \"/foobar/\"],\r\n\t[\"regex\", \"/fo[o](?=bar)/\"],\r\n\t[\"regex\", \"/\\\\/\\\\\\\\\\\\[\\\\]/\"],\r\n\t[\"regex\", \"/(fo|o?)+b*ar?/\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for regexes."
  },
  {
    "path": "tests/languages/rip/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n''\r\n'fo\\'obar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo\\\\'obar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-quoted and double-quoted strings."
  },
  {
    "path": "tests/languages/rip/symbol_feature.test",
    "content": ":foo\r\n:foobar42\r\n:foo_bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"symbol\", \":foo\"],\r\n\t[\"symbol\", \":foobar42\"],\r\n\t[\"symbol\", \":foo_bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for symbols."
  },
  {
    "path": "tests/languages/roboconf/comment_feature.test",
    "content": "#\r\n# Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/roboconf/component_feature.test",
    "content": "ApacheServer {}\r\nlb--apache-mod-jk--puppet {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"component\", \"ApacheServer\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"component\", \"lb--apache-mod-jk--puppet\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for component names."
  },
  {
    "path": "tests/languages/roboconf/keyword_feature.test",
    "content": "facet Foo {}\r\ninstance of Bar {}\r\nexternal\r\nimport\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"facet\"],\r\n\t[\"component\", \"Foo\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"instance of\"],\r\n\t[\"component\", \"Bar\"], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"external\"],\r\n\t[\"keyword\", \"import\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/roboconf/optional_feature.test",
    "content": "(optional)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"optional\", \"(optional)\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for optional flag."
  },
  {
    "path": "tests/languages/roboconf/property_feature.test",
    "content": "extends :\r\nimports:\r\ninstaller:\r\ndata.ec2.elastic.ip:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", \"extends\"], [\"punctuation\", \":\"],\r\n\t[\"property\", \"imports\"], [\"punctuation\", \":\"],\r\n\t[\"property\", \"installer\"], [\"punctuation\", \":\"],\r\n\t[\"property\", \"data.ec2.elastic.ip\"], [\"punctuation\", \":\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties."
  },
  {
    "path": "tests/languages/roboconf/value_feature.test",
    "content": "port = 8080;\r\nMySQL.port = 3307, My-Client-Database.port = 3308;\r\nmy-own-variable = something;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"port \", [\"punctuation\", \"=\"],\r\n\t[\"value\", \"8080\"], [\"punctuation\", \";\"],\r\n\t\"\\r\\nMySQL\", [\"punctuation\", \".\"], \"port \", [\"punctuation\", \"=\"],\r\n\t[\"value\", \"3307\"], [\"punctuation\", \",\"],\r\n\t\" My-Client-Database\", [\"punctuation\", \".\"], \"port \", [\"punctuation\", \"=\"],\r\n\t[\"value\", \"3308\"], [\"punctuation\", \";\"],\r\n\t\"\\r\\nmy-own-variable \", [\"punctuation\", \"=\"],\r\n\t[\"value\", \"something\"], [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for default values."
  },
  {
    "path": "tests/languages/roboconf/wildcard_feature.test",
    "content": "load-balance-able.*\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"load-balance-able\", [\"punctuation\", \".\"],\r\n\t[\"wildcard\", \"*\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for wildcards."
  },
  {
    "path": "tests/languages/robotframework/comment_feature.test",
    "content": "# comment\r\n\r\n*** Keywords ***   # comment\r\nRun Program        # comment\r\n\t[Arguments]    @{args}     # comment\r\n\tRun Process    program.py    @{args}    # comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"# comment\"],\r\n\t[\"keywords\", [\r\n\t\t[\"section-header\", \"*** Keywords ***\"],\r\n\t\t[\"comment\", \"# comment\"],\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"Run Program\"\r\n\t\t]],\r\n\t\t[\"comment\", \"# comment\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Arguments\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"args\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"# comment\"],\r\n\t\t[\"property\", [\r\n\t\t\t\"Run Process\"\r\n\t\t]],\r\n\t\t\"    program.py    \",\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"args\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"comment\", \"# comment\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/robotframework/documentation_feature.test",
    "content": "*** Settings ***\r\nDocumentation    Example using the space separated plain text format.\r\nDocumentation    This is documentation for this test suite.\r\n...              This kind of documentation can often be get quite long...\r\n\r\n*** Keywords ***\r\nOne line documentation\r\n\t[Documentation]    One line documentation.\r\n\r\nMultiline documentation\r\n\t[Documentation]    The first line creates the short doc.\r\n\t...\r\n\t...                This is the body of the documentation.\r\n\t...                It is not shown in Libdoc outputs but only\r\n\t...                the short doc is shown in logs.\r\n\tNo Operation\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"settings\", [\r\n\t\t[\"section-header\", \"*** Settings ***\"],\r\n\t\t[\"property\", \"Documentation\"],\r\n\t\t[\"documentation\", \"Example using the space separated plain text format.\"],\r\n\t\t[\"property\", \"Documentation\"],\r\n\t\t[\"documentation\", \"This is documentation for this test suite.\\r\\n...              This kind of documentation can often be get quite long...\"]\r\n\t]],\r\n\t[\"keywords\", [\r\n\t\t[\"section-header\", \"*** Keywords ***\"],\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"One line documentation\"\r\n\t\t]],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Documentation\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"documentation\", \"One line documentation.\"],\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"Multiline documentation\"\r\n\t\t]],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Documentation\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"documentation\", \"The first line creates the short doc.\\r\\n\\t...\\r\\n\\t...                This is the body of the documentation.\\r\\n\\t...                It is not shown in Libdoc outputs but only\\r\\n\\t...                the short doc is shown in logs.\"],\r\n\t\t[\"property\", [\r\n\t\t\t\"No Operation\"\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for documentation.\r\n"
  },
  {
    "path": "tests/languages/robotframework/name_and_property_feature.test",
    "content": "*** Test Cases ***\r\nAnother Test\r\n\tShould Be Equal    ${MESSAGE}    Hello, world!\r\n\r\n*** Keywords ***\r\nMy Keyword\r\n\tDirectory Should Exist    ${path}\r\n\r\nI have ${program} open\r\n\tStart Program    ${program}\r\n\r\nResult should be ${expected}\r\n\t${result} =    Get Result\r\n\tShould Be Equal    ${result}    ${expected}\r\n\r\n*** Tasks ***\r\nProcess invoice\r\n\tRead information from PDF\r\n\tValidate information\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"test-cases\", [\r\n\t\t[\"section-header\", \"*** Test Cases ***\"],\r\n\t\t[\"test-name\", [\r\n\t\t\t\"Another Test\"\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t\"Should Be Equal\"\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"MESSAGE\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"    Hello, world!\\r\\n\\r\"\r\n\t]],\r\n\t[\"keywords\", [\r\n\t\t[\"section-header\", \"*** Keywords ***\"],\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"My Keyword\"\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t\"Directory Should Exist\"\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"path\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"I have \",\r\n\t\t\t[\"variable\", [\r\n\t\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\t\"program\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t\" open\"\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t\"Start Program\"\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"program\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"Result should be \",\r\n\t\t\t[\"variable\", [\r\n\t\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\t\"expected\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t[\"variable\", [\r\n\t\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\t\"result\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t\" =\"\r\n\t\t]],\r\n\t\t\"    Get Result\\r\\n\\t\",\r\n\t\t[\"property\", [\r\n\t\t\t\"Should Be Equal\"\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"result\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"expected\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"tasks\", [\r\n\t\t[\"section-header\", \"*** Tasks ***\"],\r\n\t\t[\"task-name\", [\r\n\t\t\t\"Process invoice\"\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t\"Read information from PDF\"\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t\"Validate information\"\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for names and properties.\r\n"
  },
  {
    "path": "tests/languages/robotframework/sections_feature.test",
    "content": "*** Settings ***\r\n# foo\r\n\r\n*** Variables ***\r\n# foo\r\n\r\n*** Test Cases ***\r\n# foo\r\n\r\n*** Keywords ***\r\n# foo\r\n\r\n*** Tasks ***\r\n# foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"settings\", [\r\n\t\t[\"section-header\", \"*** Settings ***\"],\r\n\t\t[\"comment\", \"# foo\"]\r\n\t]],\r\n\t[\"variables\", [\r\n\t\t[\"section-header\", \"*** Variables ***\"],\r\n\t\t[\"comment\", \"# foo\"]\r\n\t]],\r\n\t[\"test-cases\", [\r\n\t\t[\"section-header\", \"*** Test Cases ***\"],\r\n\t\t[\"comment\", \"# foo\"]\r\n\t]],\r\n\t[\"keywords\", [\r\n\t\t[\"section-header\", \"*** Keywords ***\"],\r\n\t\t[\"comment\", \"# foo\"]\r\n\t]],\r\n\t[\"tasks\", [\r\n\t\t[\"section-header\", \"*** Tasks ***\"],\r\n\t\t[\"comment\", \"# foo\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all known section types.\r\n"
  },
  {
    "path": "tests/languages/robotframework/settings_property_feature.test",
    "content": "*** Settings ***\r\nDocumentation    Example using the space separated plain text format.\r\nLibrary          OperatingSystem\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"settings\", [\r\n\t\t[\"section-header\", \"*** Settings ***\"],\r\n\t\t[\"property\", \"Documentation\"],\r\n\t\t[\"documentation\", \"Example using the space separated plain text format.\"],\r\n\t\t[\"property\", \"Library\"],\r\n\t\t\"          OperatingSystem\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for setting properties.\r\n"
  },
  {
    "path": "tests/languages/robotframework/tag_feature.test",
    "content": "*** Keywords ***\r\nWrapper With Customizable Timeout\r\n\t[Arguments]    ${timeout}    @{args}\r\n\t[Documentation]    Same as the above but timeout given as an argument.\r\n\t[Timeout]    NONE\r\n\r\nWith Teardown\r\n\tDo Something\r\n\t[Teardown]    Log    keyword teardown\r\n\r\nReturn Three Values\r\n\t[Return]    foo    bar    zap\r\n\r\nSettings tags using separate setting\r\n\t[Tags]    my    fine    tags\r\n\tNo Operation\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keywords\", [\r\n\t\t[\"section-header\", \"*** Keywords ***\"],\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"Wrapper With Customizable Timeout\"\r\n\t\t]],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Arguments\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"timeout\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"args\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Documentation\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"documentation\", \"Same as the above but timeout given as an argument.\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Timeout\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t\"    NONE\\r\\n\\r\\n\",\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"With Teardown\"\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t\"Do Something\"\r\n\t\t]],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Teardown\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t\"    Log    keyword teardown\\r\\n\\r\\n\",\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"Return Three Values\"\r\n\t\t]],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Return\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t\"    foo    bar    zap\\r\\n\\r\\n\",\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"Settings tags using separate setting\"\r\n\t\t]],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Tags\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t\"    my    fine    tags\\r\\n\\t\",\r\n\t\t[\"property\", [\r\n\t\t\t\"No Operation\"\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags.\r\n"
  },
  {
    "path": "tests/languages/robotframework/variable_feature.test",
    "content": "*** Test Cases ***\r\nVariables\r\n\tLog    ${GREET}, ${NAME}!!\r\n\tLogin  &{USER}\r\n\r\nEnvironment variables for ${name}\r\n\tLog    Current user: %{USER}\r\n\tRun    %{JAVA_HOME}${/}javac\r\n\r\nAssign multiple\r\n\t${a}    ${b}    ${c} =    Get Three\r\n\t${first}    @{rest} =    Get Three\r\n\t@{before}    ${last} =    Get Three\r\n\t${begin}    @{middle}    ${end} =    Get Three\r\n\r\n*** Keywords ***\r\nWith Positional\r\n\t[Arguments]    ${positional}    @{}    ${named}\r\n\tLog Many    ${positional}    ${named}\r\n\r\nWith Free Named\r\n\t[Arguments]    @{varargs}    ${named only}    &{free named}\r\n\tLog Many    @{varargs}    ${named only}    &{free named}\r\n\r\n*** Settings ***\r\nSuite Setup     Some Keyword        @{KW ARGS}\r\nSuite Setup     ${KEYWORD}          @{KW ARGS}\r\n\r\n*** Variables ***\r\n${ANOTHER VARIABLE}    This is pretty easy!\r\n${INTEGER}             ${42}\r\n@{STRINGS}             one          two           kolme         four\r\n@{NUMBERS}             ${1}         ${INTEGER}    ${3.14}\r\n&{MAPPING}             one=${1}     two=${2}      three=${3}\r\n@{ANIMALS}             cat          dog\r\n&{FINNISH}             cat=kissa    dog=koira\r\n${MULTILINE}           SEPARATOR=\\n    First line\r\n...                    Second line     Third line\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"test-cases\", [\r\n\t\t[\"section-header\", \"*** Test Cases ***\"],\r\n\t\t[\"test-name\", [\r\n\t\t\t\"Variables\"\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t\"Log\"\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"GREET\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\", \",\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"NAME\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"!!\\r\\n\\t\",\r\n\t\t[\"property\", [\r\n\t\t\t\"Login\"\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"&{\"],\r\n\t\t\t\"USER\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"test-name\", [\r\n\t\t\t\"Environment variables for \",\r\n\t\t\t[\"variable\", [\r\n\t\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\t\"name\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t\"Log\"\r\n\t\t]],\r\n\t\t\"    Current user: \",\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"%{\"],\r\n\t\t\t\"USER\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t\"Run\"\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"%{\"],\r\n\t\t\t\"JAVA_HOME\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"/\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"javac\\r\\n\\r\\n\",\r\n\t\t[\"test-name\", [\r\n\t\t\t\"Assign multiple\"\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t[\"variable\", [\r\n\t\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\t\"a\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"b\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"c\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\" =    Get Three\\r\\n\\t\",\r\n\t\t[\"property\", [\r\n\t\t\t[\"variable\", [\r\n\t\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\t\"first\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"rest\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\" =    Get Three\\r\\n\\t\",\r\n\t\t[\"property\", [\r\n\t\t\t[\"variable\", [\r\n\t\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\t\"before\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"last\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\" =    Get Three\\r\\n\\t\",\r\n\t\t[\"property\", [\r\n\t\t\t[\"variable\", [\r\n\t\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\t\"begin\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"middle\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"end\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\" =    Get Three\\r\\n\\r\"\r\n\t]],\r\n\t[\"keywords\", [\r\n\t\t[\"section-header\", \"*** Keywords ***\"],\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"With Positional\"\r\n\t\t]],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Arguments\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"positional\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"named\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t\"Log Many\"\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"positional\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"named\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"keyword-name\", [\r\n\t\t\t\"With Free Named\"\r\n\t\t]],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\"Arguments\",\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"varargs\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"named only\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"&{\"],\r\n\t\t\t\"free named\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"property\", [\r\n\t\t\t\"Log Many\"\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"varargs\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"named only\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"&{\"],\r\n\t\t\t\"free named\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"settings\", [\r\n\t\t[\"section-header\", \"*** Settings ***\"],\r\n\t\t[\"property\", \"Suite Setup\"],\r\n\t\t\"     Some Keyword        \",\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"KW ARGS\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"property\", \"Suite Setup\"],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"KEYWORD\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"KW ARGS\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"variables\", [\r\n\t\t[\"section-header\", \"*** Variables ***\"],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"ANOTHER VARIABLE\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"    This is pretty easy!\\r\\n\",\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"INTEGER\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"42\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"STRINGS\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"             one          two           kolme         four\\r\\n\",\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"NUMBERS\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"1\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"INTEGER\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"3.14\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"&{\"],\r\n\t\t\t\"MAPPING\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"             one=\",\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"1\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"     two=\",\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"2\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"      three=\",\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"3\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"@{\"],\r\n\t\t\t\"ANIMALS\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"             cat          dog\\r\\n\",\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"&{\"],\r\n\t\t\t\"FINNISH\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"             cat=kissa    dog=koira\\r\\n\",\r\n\t\t[\"variable\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t\"MULTILINE\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"           SEPARATOR=\\\\n    First line\\r\\n...                    Second line     Third line\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables in different positions.\r\n"
  },
  {
    "path": "tests/languages/ruby/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/ruby/builtin_feature.test",
    "content": "Array Bignum Binding\r\nClass;\r\nContinuation Dir Exception\r\nFalseClass File Stat File\r\nFixnum Float Hash Integer\r\nIO MatchData Method Module\r\nNilClass Numeric Object\r\nProc Range Regexp String\r\nStruct TMS Symbol ThreadGroup\r\nThread Time TrueClass\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"Array\"], [\"builtin\", \"Bignum\"], [\"builtin\", \"Binding\"],\r\n\t[\"builtin\", \"Class\"], [\"punctuation\", \";\"],\r\n\t[\"builtin\", \"Continuation\"], [\"builtin\", \"Dir\"], [\"builtin\", \"Exception\"],\r\n\t[\"builtin\", \"FalseClass\"], [\"builtin\", \"File\"], [\"builtin\", \"Stat\"], [\"builtin\", \"File\"],\r\n\t[\"builtin\", \"Fixnum\"], [\"builtin\", \"Float\"], [\"builtin\", \"Hash\"], [\"builtin\", \"Integer\"],\r\n\t[\"builtin\", \"IO\"], [\"builtin\", \"MatchData\"], [\"builtin\", \"Method\"], [\"builtin\", \"Module\"],\r\n\t[\"builtin\", \"NilClass\"], [\"builtin\", \"Numeric\"], [\"builtin\", \"Object\"],\r\n\t[\"builtin\", \"Proc\"], [\"builtin\", \"Range\"], [\"builtin\", \"Regexp\"], [\"builtin\", \"String\"],\r\n\t[\"builtin\", \"Struct\"], [\"builtin\", \"TMS\"], [\"builtin\", \"Symbol\"], [\"builtin\", \"ThreadGroup\"],\r\n\t[\"builtin\", \"Thread\"], [\"builtin\", \"Time\"], [\"builtin\", \"TrueClass\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all builtins."
  },
  {
    "path": "tests/languages/ruby/class-name_feature.test",
    "content": "class Customer\n   @@no_of_customers = 0\nend\n\ncust1 = Customer. new\ncust2 = Customer. new\n\nclass Accounts\n   def reading_charge\n   end\n   def Accounts.return_date\n   end\nend\n\nclass Salad\n  def self.buy_olive_oil\n  end\nend\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"class\"], [\"class-name\", [\"Customer\"]],\n\t[\"variable\", \"@@no_of_customers\"], [\"operator\", \"=\"], [\"number\", \"0\"],\n\t[\"keyword\", \"end\"],\n\n\t\"\\r\\n\\r\\ncust1 \",\n\t[\"operator\", \"=\"],\n\t[\"class-name\", [\"Customer\"]],\n\t[\"punctuation\", \".\"],\n\t[\"keyword\", \"new\"],\n\n\t\"\\r\\ncust2 \",\n\t[\"operator\", \"=\"],\n\t[\"class-name\", [\"Customer\"]],\n\t[\"punctuation\", \".\"],\n\t[\"keyword\", \"new\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"Accounts\"]],\n\n\t[\"keyword\", \"def\"],\n\t[\"method-definition\", [\n\t\t[\"function\", \"reading_charge\"]\n\t]],\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"def\"],\n\t[\"method-definition\", [\n\t\t[\"class-name\", \"Accounts\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"return_date\"]\n\t]],\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"Salad\"]],\n\n\t[\"keyword\", \"def\"],\n\t[\"method-definition\", [\n\t\t[\"keyword\", \"self\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"buy_olive_oil\"]\n\t]],\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"end\"]\n]\n"
  },
  {
    "path": "tests/languages/ruby/command_feature.test",
    "content": "`echo foo`\n`echo #{user_input}`\n`grep hosts /private/etc/* 2>&1`\n\n%x[ ls ]\n%x{ ls }\n%x<ls -al #{dir}>\n\n%x!foo #{ 42 }!\n%x(foo #{ 42 })\n%x{foo #{ 42 }}\n%x[foo #{ 42 }]\n%x<foo #{ 42 }>\n\n----------------------------------------------------\n\n[\n\t[\"command-literal\", [\n\t\t[\"command\", \"`echo foo`\"]\n\t]],\n\t[\"command-literal\", [\n\t\t[\"command\", \"`echo \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\"user_input\"]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"command\", \"`\"]\n\t]],\n\t[\"command-literal\", [\n\t\t[\"command\", \"`grep hosts /private/etc/* 2>&1`\"]\n\t]],\n\n\t[\"command-literal\", [\n\t\t[\"command\", \"%x[ ls ]\"]\n\t]],\n\t[\"command-literal\", [\n\t\t[\"command\", \"%x{ ls }\"]\n\t]],\n\t[\"command-literal\", [\n\t\t[\"command\", \"%x<ls -al \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\"dir\"]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"command\", \">\"]\n\t]],\n\n\t[\"command-literal\", [\n\t\t[\"command\", \"%x!foo \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"number\", \"42\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"command\", \"!\"]\n\t]],\n\t[\"command-literal\", [\n\t\t[\"command\", \"%x(foo \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"number\", \"42\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"command\", \")\"]\n\t]],\n\t[\"command-literal\", [\n\t\t[\"command\", \"%x{foo \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"number\", \"42\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"command\", \"}\"]\n\t]],\n\t[\"command-literal\", [\n\t\t[\"command\", \"%x[foo \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"number\", \"42\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"command\", \"]\"]\n\t]],\n\t[\"command-literal\", [\n\t\t[\"command\", \"%x<foo \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"delimiter\", \"#{\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"number\", \"42\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"}\"]\n\t\t]],\n\t\t[\"command\", \">\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/ruby/comment_feature.test",
    "content": "#\r\n# foobar\r\n=begin\r\nfoo bar baz\r\n=end\r\n=begin\r\n=end\r\n=begin foo\r\n=end\r\n#{comment}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"],\r\n\t[\"comment\", \"=begin\\r\\nfoo bar baz\\r\\n=end\"],\r\n\t[\"comment\", \"=begin\\r\\n=end\"],\r\n\t[\"comment\", \"=begin foo\\r\\n=end\"],\r\n\t[\"comment\", \"#{comment}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/ruby/constant_feature.test",
    "content": "FOO_BAR_42\r\nF\r\nFOO\r\nBAR?\r\nBAZ!\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"FOO_BAR_42\"],\r\n\t[\"constant\", \"F\"],\r\n\t[\"constant\", \"FOO\"],\r\n\t[\"constant\", \"BAR?\"],\r\n\t[\"constant\", \"BAZ!\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants.\r\n"
  },
  {
    "path": "tests/languages/ruby/issue1336.test",
    "content": ":Foo\r\nFoo::Bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"symbol\", \":Foo\"],\r\n\t\"\\r\\nFoo\", [\"double-colon\", \"::\"], \"Bar\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nEnsures module syntax is not confused with symbols. See #1336\r\n"
  },
  {
    "path": "tests/languages/ruby/keyword_feature.test",
    "content": "alias\r\nand\r\nBEGIN\r\nbegin\r\nbreak\r\ncase\r\nclass;\r\ndef;\r\ndefine_method\r\ndefined\r\ndo\r\neach\r\nelse\r\nelsif\r\nEND\r\nend\r\nensure\r\nextend\r\nfor\r\nif\r\nin\r\ninclude\r\nmodule;\r\nnew;\r\nnext\r\nnil\r\nnot\r\nor\r\nprepend\r\nprotected\r\nprivate\r\npublic\r\nraise\r\nredo\r\nrequire\r\nrescue\r\nretry\r\nreturn\r\nself\r\nsuper\r\nthen\r\nthrow\r\nundef\r\nunless\r\nuntil\r\nwhen\r\nwhile\r\nyield\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"alias\"],\r\n\t[\"keyword\", \"and\"],\r\n\t[\"keyword\", \"BEGIN\"],\r\n\t[\"keyword\", \"begin\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"def\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"define_method\"],\r\n\t[\"keyword\", \"defined\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"each\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"elsif\"],\r\n\t[\"keyword\", \"END\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"ensure\"],\r\n\t[\"keyword\", \"extend\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"module\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"next\"],\r\n\t[\"keyword\", \"nil\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"prepend\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"raise\"],\r\n\t[\"keyword\", \"redo\"],\r\n\t[\"keyword\", \"require\"],\r\n\t[\"keyword\", \"rescue\"],\r\n\t[\"keyword\", \"retry\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"self\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"undef\"],\r\n\t[\"keyword\", \"unless\"],\r\n\t[\"keyword\", \"until\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"yield\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/ruby/method_definition_feature.test",
    "content": "class Circle\n  def self.of_diameter(diameter)\n    new diameter / 2\n  end\n\n  def initialize(radius)\n    @radius = radius\n  end\n\n  def circumference\n    Math::PI * radius ** 2\n  end\n\n  # Seattle style\n  def grow_by factor:\n    @radius = @radius * factor\n  end\nend\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", [\"Circle\"]],\n\n\t[\"keyword\", \"def\"],\n\t[\"method-definition\", [\n\t\t[\"keyword\", \"self\"],\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"of_diameter\"]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t\"diameter\",\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"new\"],\n\t\" diameter \",\n\t[\"operator\", \"/\"],\n\t[\"number\", \"2\"],\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"def\"],\n\t[\"method-definition\", [\n\t\t[\"function\", \"initialize\"]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t\"radius\",\n\t[\"punctuation\", \")\"],\n\n\t[\"variable\", \"@radius\"],\n\t[\"operator\", \"=\"],\n\t\" radius\\r\\n  \",\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"def\"],\n\t[\"method-definition\", [\n\t\t[\"function\", \"circumference\"]\n\t]],\n\n\t\"\\r\\n    Math\",\n\t[\"double-colon\", \"::\"],\n\t[\"constant\", \"PI\"],\n\t[\"operator\", \"*\"],\n\t\" radius \",\n\t[\"operator\", \"**\"],\n\t[\"number\", \"2\"],\n\n\t[\"keyword\", \"end\"],\n\n\t[\"comment\", \"# Seattle style\"],\n\n\t[\"keyword\", \"def\"],\n\t[\"method-definition\", [\n\t\t[\"function\", \"grow_by\"]\n\t]],\n\t\" factor\",\n\t[\"operator\", \":\"],\n\n\t[\"variable\", \"@radius\"],\n\t[\"operator\", \"=\"],\n\t[\"variable\", \"@radius\"],\n\t[\"operator\", \"*\"],\n\t\" factor\\r\\n  \",\n\n\t[\"keyword\", \"end\"],\n\n\t[\"keyword\", \"end\"]\n]\n\n----------------------------------------------------\n\nChecks that method definitions are highlighted correctly\n"
  },
  {
    "path": "tests/languages/ruby/operator_feature.test",
    "content": "+ - * / % **\n+= -= *= /= %= **=\n\n== != < > <= >= <=> ===\n!~ =~\n=\n& | ^ ~ << >>\n&= |= ^= <<= >>=\n&& || !\n&&= ||=\n\n=>\n\n&.\n\n? :\n.. ...\n\nand or not\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"**\"],\n\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"%=\"],\n\t[\"operator\", \"**=\"],\n\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<=>\"],\n\t[\"operator\", \"===\"],\n\n\t[\"operator\", \"!~\"],\n\t[\"operator\", \"=~\"],\n\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \">>\"],\n\n\t[\"operator\", \"&=\"],\n\t[\"operator\", \"|=\"],\n\t[\"operator\", \"^=\"],\n\t[\"operator\", \"<<=\"],\n\t[\"operator\", \">>=\"],\n\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\t[\"operator\", \"!\"],\n\n\t[\"operator\", \"&&=\"],\n\t[\"operator\", \"||=\"],\n\n\t[\"operator\", \"=>\"],\n\n\t[\"operator\", \"&.\"],\n\n\t[\"operator\", \"?\"], [\"operator\", \":\"],\n\t[\"operator\", \"..\"], [\"operator\", \"...\"],\n\n\t[\"keyword\", \"and\"], [\"keyword\", \"or\"], [\"keyword\", \"not\"]\n]\n"
  },
  {
    "path": "tests/languages/ruby/punctuation_feature.test",
    "content": "( ) { } [ ]\n. , ;\n::\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"double-colon\", \"::\"]\n]\n"
  },
  {
    "path": "tests/languages/ruby/regex_feature.test",
    "content": "/[foo]\\/bar/gim\r\n/[bar]/,\r\n/./i;\r\n/foo#{bar}/;\r\n/ab+c/ix\r\n%r!foo?bar#{39+3}!\r\n%r(foo?bar#{39+3})\r\n%r{foo?bar#{39+3}}\r\n%r[foo?bar#{39+3}]\r\n%r<foo?bar#{39+3}>\r\n\r\n/foo/ # comment\r\n/foo#{bar}/ # comment\r\n\r\n# flags\r\n/abc/e\r\n/abc/g\r\n/abc/i\r\n/abc/m\r\n/abc/n\r\n/abc/o\r\n/abc/s\r\n/abc/u\r\n/abc/x\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/[foo]\\\\/bar/gim\"]\r\n\t]],\r\n\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/[bar]/\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/./i\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/foo\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"regex\", \"/\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/ab+c/ix\"]\r\n\t]],\r\n\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"%r!foo?bar\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"39\"],\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"number\", \"3\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"regex\", \"!\"]\r\n\t]],\r\n\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"%r(foo?bar\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"39\"],\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"number\", \"3\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"regex\", \")\"]\r\n\t]],\r\n\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"%r{foo?bar\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"39\"],\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"number\", \"3\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"regex\", \"}\"]\r\n\t]],\r\n\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"%r[foo?bar\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"39\"],\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"number\", \"3\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"regex\", \"]\"]\r\n\t]],\r\n\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"%r<foo?bar\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"39\"],\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"number\", \"3\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"regex\", \">\"]\r\n\t]],\r\n\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/foo/\"]\r\n\t]],\r\n\t[\"comment\", \"# comment\"],\r\n\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/foo\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\"bar\"]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"regex\", \"/\"]\r\n\t]],\r\n\t[\"comment\", \"# comment\"],\r\n\r\n\t[\"comment\", \"# flags\"],\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/abc/e\"]\r\n\t]],\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/abc/g\"]\r\n\t]],\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/abc/i\"]\r\n\t]],\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/abc/m\"]\r\n\t]],\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/abc/n\"]\r\n\t]],\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/abc/o\"]\r\n\t]],\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/abc/s\"]\r\n\t]],\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/abc/u\"]\r\n\t]],\r\n\t[\"regex-literal\", [\r\n\t\t[\"regex\", \"/abc/x\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for regex.\r\n"
  },
  {
    "path": "tests/languages/ruby/string_feature.test",
    "content": "''\r\n\"\"\r\n'foo'\r\n\"foo\"\r\n'foo\\\r\nbar'\r\n\"foo\\\r\nbar\"\r\n\r\n\"foo #bar\"\r\n\"foo #{ 42 } bar\"\r\n\"\\#{a + b}\"\r\n\r\n%!foo #{ 42 }!\r\n%(foo #{ 42 })\r\n%{foo #{ 42 }}\r\n%[foo #{ 42 }]\r\n%<foo #{ 42 }>\r\n%Q!foo #{ 42 }!\r\n%Q(foo #{ 42 })\r\n%Q{foo #{ 42 }}\r\n%Q[foo #{ 42 }]\r\n%Q<foo #{ 42 }>\r\n%I!foo #{ 42 }!\r\n%I(foo #{ 42 })\r\n%I{foo #{ 42 }}\r\n%I[foo #{ 42 }]\r\n%I<foo #{ 42 }>\r\n%W!foo #{ 42 }!\r\n%W(foo #{ 42 })\r\n%W{foo #{ 42 }}\r\n%W[foo #{ 42 }]\r\n%W<foo #{ 42 }>\r\n\r\n<<STRING\r\n  foo #{42} bar\r\nSTRING\r\n  <<-STRING\r\n    foo #{42} bar\r\n  STRING\r\n  <<~STRING\r\n    foo #{42} bar\r\n  STRING\r\n<<'STRING'\r\n  foo #{42} bar\r\nSTRING\r\n  <<-'STRING'\r\n    foo #{42} bar\r\n  STRING\r\n  <<~'STRING'\r\n    foo #{42} bar\r\n  STRING\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"''\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"'foo'\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"foo\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"'foo\\\\\\r\\nbar'\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"foo\\\\\\r\\nbar\\\"\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"foo #bar\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \" bar\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"\\\\#{a + b}\\\"\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%!foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"!\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%(foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \")\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%{foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"}\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%[foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"]\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%<foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \">\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%Q!foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"!\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%Q(foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \")\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%Q{foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"}\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%Q[foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"]\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%Q<foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \">\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%I!foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"!\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%I(foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \")\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%I{foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"}\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%I[foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"]\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%I<foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \">\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%W!foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"!\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%W(foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \")\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%W{foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"}\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%W[foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"]\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"%W<foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \">\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"punctuation\", \"<<\"],\r\n\t\t\t[\"symbol\", \"STRING\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\r\\n  foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \" bar\\r\\n\"],\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"symbol\", \"STRING\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"punctuation\", \"<<-\"],\r\n\t\t\t[\"symbol\", \"STRING\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\r\\n    foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \" bar\\r\\n  \"],\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"symbol\", \"STRING\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"punctuation\", \"<<~\"],\r\n\t\t\t[\"symbol\", \"STRING\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\r\\n    foo \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"#{\"],\r\n\t\t\t[\"content\", [\r\n\t\t\t\t[\"number\", \"42\"]\r\n\t\t\t]],\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \" bar\\r\\n  \"],\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"symbol\", \"STRING\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"punctuation\", \"<<'\"],\r\n\t\t\t[\"symbol\", \"STRING\"],\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\r\\n  foo #{42} bar\\r\\n\"],\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"symbol\", \"STRING\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"punctuation\", \"<<-'\"],\r\n\t\t\t[\"symbol\", \"STRING\"],\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\r\\n    foo #{42} bar\\r\\n  \"],\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"symbol\", \"STRING\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"punctuation\", \"<<~'\"],\r\n\t\t\t[\"symbol\", \"STRING\"],\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\r\\n    foo #{42} bar\\r\\n  \"],\r\n\t\t[\"delimiter\", [\r\n\t\t\t[\"symbol\", \"STRING\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and string interpolation.\r\n"
  },
  {
    "path": "tests/languages/ruby/symbol_feature.test",
    "content": ":_\r\n:foo\r\n:BAR?\r\n:Baz_42!\r\n:あ\r\n:\"name\"\r\n:\"\\u{c4 d6 dc}\"\r\n:question?\r\n:exclamation!\r\n:$;\r\n\r\n:foo.object_id\r\n\r\n# in hashes\r\n\r\n{ :one => \"eins\", :two => \"zwei\", :three => \"drei\" }\r\n{ one: \"eins\", two: \"zwei\", three: \"drei\" }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"symbol\", \":_\"],\r\n\t[\"symbol\", \":foo\"],\r\n\t[\"symbol\", \":BAR?\"],\r\n\t[\"symbol\", \":Baz_42!\"],\r\n\t[\"symbol\", \":あ\"],\r\n\t[\"symbol\", \":\\\"name\\\"\"],\r\n\t[\"symbol\", \":\\\"\\\\u{c4 d6 dc}\\\"\"],\r\n\t[\"symbol\", \":question?\"],\r\n\t[\"symbol\", \":exclamation!\"],\r\n\t[\"symbol\", \":$;\"],\r\n\r\n\t[\"symbol\", \":foo\"], [\"punctuation\", \".\"], \"object_id\\r\\n\\r\\n\",\r\n\r\n\t[\"comment\", \"# in hashes\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"symbol\", \":one\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"eins\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"symbol\", \":two\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"zwei\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"symbol\", \":three\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"drei\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"symbol\", \"one\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"eins\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"symbol\", \"two\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"zwei\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"symbol\", \"three\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"drei\\\"\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for symbols.\r\n"
  },
  {
    "path": "tests/languages/ruby/variable_feature.test",
    "content": "$_\r\n$foo\r\n$BAR?\r\n$Baz_42!\r\n\r\n@_\r\n@foo\r\n@BAR?\r\n@Baz_42!\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$_\"],\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"variable\", \"$BAR?\"],\r\n\t[\"variable\", \"$Baz_42!\"],\r\n\r\n\t[\"variable\", \"@_\"],\r\n\t[\"variable\", \"@foo\"],\r\n\t[\"variable\", \"@BAR?\"],\r\n\t[\"variable\", \"@Baz_42!\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/ruby+haml/ruby_inclusion.test",
    "content": ":ruby\n\tdef circumference\n\t\tMath::PI * radius ** 2\n\tend\n\n~\n\t:ruby\n\t\tdef circumference\n\t\t\tMath::PI * radius ** 2\n\t\tend\n\n----------------------------------------------------\n\n[\n\t[\"filter-ruby\", [\n\t\t[\"filter-name\", \":ruby\"],\n\t\t[\"text\", [\n\t\t\t[\"keyword\", \"def\"],\n\t\t\t[\"method-definition\", [\n\t\t\t\t[\"function\", \"circumference\"]\n\t\t\t]],\n\n\t\t\t\"\\r\\n\\t\\tMath\",\n\t\t\t[\"double-colon\", \"::\"],\n\t\t\t[\"constant\", \"PI\"],\n\t\t\t[\"operator\", \"*\"],\n\t\t\t\" radius \",\n\t\t\t[\"operator\", \"**\"],\n\t\t\t[\"number\", \"2\"],\n\n\t\t\t[\"keyword\", \"end\"]\n\t\t]]\n\t]],\n\n\t[\"punctuation\", \"~\"],\n\n\t[\"filter-ruby\", [\n\t\t[\"filter-name\", \":ruby\"],\n\t\t[\"text\", [\n\t\t\t[\"keyword\", \"def\"],\n\t\t\t[\"method-definition\", [\n\t\t\t\t[\"function\", \"circumference\"]\n\t\t\t]],\n\n\t\t\t\"\\r\\n\\t\\t\\tMath\",\n\t\t\t[\"double-colon\", \"::\"],\n\t\t\t[\"constant\", \"PI\"],\n\t\t\t[\"operator\", \"*\"],\n\t\t\t\" radius \",\n\t\t\t[\"operator\", \"**\"],\n\t\t\t[\"number\", \"2\"],\n\n\t\t\t[\"keyword\", \"end\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/rust/attribute_feature.test",
    "content": "#[test]\r\n#![warn(unstable)]\r\n#[doc(hidden)]\r\n#[unstable(\r\n\tfeature = \"thread_local_internals\",\r\n\treason = \"recently added to create a key\",\r\n\tissue = \"none\"\r\n)]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"attribute\", [\r\n\t\t\"#[test]\"\r\n\t]],\r\n\t[\"attribute\", [\r\n\t\t\"#![warn(unstable)]\"\r\n\t]],\r\n\t[\"attribute\", [\r\n\t\t\"#[doc(hidden)]\"\r\n\t]],\r\n\t[\"attribute\", [\r\n\t\t\"#[unstable(\\r\\n\\tfeature = \",\r\n\t\t[\"string\", \"\\\"thread_local_internals\\\"\"],\r\n\t\t\",\\r\\n\\treason = \",\r\n\t\t[\"string\", \"\\\"recently added to create a key\\\"\"],\r\n\t\t\",\\r\\n\\tissue = \",\r\n\t\t[\"string\", \"\\\"none\\\"\"],\r\n\t\t\"\\r\\n)]\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for attributes.\r\n"
  },
  {
    "path": "tests/languages/rust/boolean_feature.test",
    "content": "false\r\ntrue\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"false\"],\r\n\t[\"boolean\", \"true\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/rust/char_feature.test",
    "content": "'a'\r\n'स'\r\n'\\''\r\n'\\n'\r\n'\\u{00e9}'\r\n'\\x41'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"char\", \"'a'\"],\r\n\t[\"char\", \"'स'\"],\r\n\t[\"char\", \"'\\\\''\"],\r\n\t[\"char\", \"'\\\\n'\"],\r\n\t[\"char\", \"'\\\\u{00e9}'\"],\r\n\t[\"char\", \"'\\\\x41'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for chars.\r\n"
  },
  {
    "path": "tests/languages/rust/class-name_feature.test",
    "content": "struct foo {}\n\nlet foo: CStr;\nlet foo: &'a CStr;\nlet foo: &'a Foo<dyn Bar>;\nOption::Some(foo);\nOption::None;\n\n// we can differentiate between enum variants and class names\n// so let's make the bug a feature!\nenum Foo {\n\tConst,\n\tTuple(i8,i8),\n\tStruct {\n\t\tfoo: u8\n\t}\n}\n\npub trait Summary {\n\tfn summarize(&self) -> String;\n}\n\ntype Point = (u8, u8);\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"struct\"],\n\t[\"type-definition\", \"foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"let\"],\n\t\" foo\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"CStr\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"let\"],\n\t\" foo\",\n\t[\"punctuation\", \":\"],\n\t[\"operator\", \"&\"],\n\t[\"lifetime-annotation\", \"'a\"],\n\t[\"class-name\", \"CStr\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"let\"],\n\t\" foo\",\n\t[\"punctuation\", \":\"],\n\t[\"operator\", \"&\"],\n\t[\"lifetime-annotation\", \"'a\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"operator\", \"<\"],\n\t[\"keyword\", \"dyn\"],\n\t[\"class-name\", \"Bar\"],\n\t[\"operator\", \">\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", \"Option\"],\n\t[\"punctuation\", \"::\"],\n\t[\"class-name\", \"Some\"],\n\t[\"punctuation\", \"(\"],\n\t\"foo\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", \"Option\"],\n\t[\"punctuation\", \"::\"],\n\t[\"class-name\", \"None\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// we can differentiate between enum variants and class names\"],\n\n\t[\"comment\", \"// so let's make the bug a feature!\"],\n\n\t[\"keyword\", \"enum\"],\n\t[\"type-definition\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"class-name\", \"Const\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"class-name\", \"Tuple\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"i8\"],\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"i8\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"class-name\", \"Struct\"],\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\n\\t\\tfoo\",\n\t[\"punctuation\", \":\"],\n\t[\"keyword\", \"u8\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"pub\"],\n\t[\"keyword\", \"trait\"],\n\t[\"type-definition\", \"Summary\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"fn\"],\n\t[\"function-definition\", \"summarize\"],\n\t[\"punctuation\", \"(\"],\n\t[\"operator\", \"&\"],\n\t[\"keyword\", \"self\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"->\"],\n\t[\"class-name\", \"String\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"type\"],\n\t[\"type-definition\", \"Point\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"(\"],\n\t[\"keyword\", \"u8\"],\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"u8\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for class names and enum variants.\n"
  },
  {
    "path": "tests/languages/rust/closure-params_feature.test",
    "content": "|x: int, y: int| -> int {}\r\n|| {}\r\n\r\nvec1.iter().any(|&x| x == 2);\r\nfoo(123, || x * x);\r\n\r\nlet add_one_v2 = |x: u32| -> u32 { x + 1 };\r\nlet add_one_v3 = |x|             { x + 1 };\r\nlet add_one_v4 = |x|               x + 1  ;\r\nmove || println!(\"This is a: {}\", text)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"closure-params\", [\r\n\t\t[\"closure-punctuation\", \"|\"],\r\n\t\t\"x\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" int\",\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t\" y\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" int\",\r\n\t\t[\"closure-punctuation\", \"|\"]\r\n\t]],\r\n\t[\"punctuation\", \"->\"],\r\n\t\" int \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"closure-params\", [\r\n\t\t[\"closure-punctuation\", \"|\"],\r\n\t\t[\"closure-punctuation\", \"|\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t\"\\r\\n\\r\\nvec1\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"iter\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"any\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"closure-params\", [\r\n\t\t[\"closure-punctuation\", \"|\"],\r\n\t\t[\"operator\", \"&\"],\r\n\t\t\"x\",\r\n\t\t[\"closure-punctuation\", \"|\"]\r\n\t]],\r\n\t\" x \",\r\n\t[\"operator\", \"==\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"123\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"closure-params\", [\r\n\t\t[\"closure-punctuation\", \"|\"],\r\n\t\t[\"closure-punctuation\", \"|\"]\r\n\t]],\r\n\t\" x \",\r\n\t[\"operator\", \"*\"],\r\n\t\" x\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" add_one_v2 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"closure-params\", [\r\n\t\t[\"closure-punctuation\", \"|\"],\r\n\t\t\"x\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"u32\"],\r\n\t\t[\"closure-punctuation\", \"|\"]\r\n\t]],\r\n\t[\"punctuation\", \"->\"],\r\n\t[\"keyword\", \"u32\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" x \",\r\n\t[\"operator\", \"+\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" add_one_v3 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"closure-params\", [\r\n\t\t[\"closure-punctuation\", \"|\"],\r\n\t\t\"x\",\r\n\t\t[\"closure-punctuation\", \"|\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" x \",\r\n\t[\"operator\", \"+\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" add_one_v4 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"closure-params\", [\r\n\t\t[\"closure-punctuation\", \"|\"],\r\n\t\t\"x\",\r\n\t\t[\"closure-punctuation\", \"|\"]\r\n\t]],\r\n\t\"               x \",\r\n\t[\"operator\", \"+\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"move\"],\r\n\t[\"closure-params\", [\r\n\t\t[\"closure-punctuation\", \"|\"],\r\n\t\t[\"closure-punctuation\", \"|\"]\r\n\t]],\r\n\t[\"macro\", \"println!\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\"This is a: {}\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" text\",\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for closure params.\r\n"
  },
  {
    "path": "tests/languages/rust/comment_feature.test",
    "content": "//\r\n// foobar\r\n/**/\r\n/* foo\r\nbar */\r\n\r\n/*   /* */  /** */  /*! */  */\r\n/*!  /* */  /** */  /*! */  */\r\n/**  /* */  /** */  /*! */  */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foobar\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"/*   /* */  /** */  /*! */  */\"],\r\n\t[\"comment\", \"/*!  /* */  /** */  /*! */  */\"],\r\n\t[\"comment\", \"/**  /* */  /** */  /*! */  */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/rust/constant_feature.test",
    "content": "MAX\nSOME_CONSTANT\n\n// not a constant\nT\n\n----------------------------------------------------\n\n[\n\t[\"constant\", \"MAX\"],\n\t[\"constant\", \"SOME_CONSTANT\"],\n\n\t[\"comment\", \"// not a constant\"],\n\t[\"class-name\", \"T\"]\n]\n\n----------------------------------------------------\n\nChecks for constants.\n"
  },
  {
    "path": "tests/languages/rust/function_feature.test",
    "content": "foo (\r\nfoobar(\r\nfoo_bar_42(\r\n\r\nfoo_generic::<T, Option<T>>()\r\n\r\nmem::transmute::<Box<dyn FnOnce() + 'a>, Box<dyn FnOnce() + 'static>>()\r\n\r\nfn apply<F>(f: F) where F: FnOnce() {\r\n\tf();\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foobar\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo_bar_42\"],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"function\", \"foo_generic\"],\r\n\t[\"punctuation\", \"::\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"class-name\", \"T\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", \"Option\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"class-name\", \"T\"],\r\n\t[\"operator\", \">>\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"namespace\", [\r\n\t\t\"mem\",\r\n\t\t[\"punctuation\", \"::\"]\r\n\t]],\r\n\t[\"function\", \"transmute\"],\r\n\t[\"punctuation\", \"::\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"class-name\", \"Box\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"keyword\", \"dyn\"],\r\n\t[\"class-name\", \"FnOnce\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"lifetime-annotation\", \"'a\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", \"Box\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"keyword\", \"dyn\"],\r\n\t[\"class-name\", \"FnOnce\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"lifetime-annotation\", \"'static\"],\r\n\t[\"operator\", \">>\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function-definition\", \"apply\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"class-name\", \"F\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"f\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", \"F\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"where\"],\r\n\t[\"class-name\", \"F\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", \"FnOnce\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"function\", \"f\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions and macros.\r\n"
  },
  {
    "path": "tests/languages/rust/issue1339.test",
    "content": "const ALL_CARDS: &'static [&'static char] = &[\"2\"]\r\n\r\nfn foo<'a> (first: &'a str, second: &'a str) => () { }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"const\"],\r\n\t[\"constant\", \"ALL_CARDS\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"lifetime-annotation\", \"'static\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"lifetime-annotation\", \"'static\"],\r\n\t[\"keyword\", \"char\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"string\", \"\\\"2\\\"\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function-definition\", \"foo\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"lifetime-annotation\", \"'a\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"first\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"lifetime-annotation\", \"'a\"],\r\n\t[\"keyword\", \"str\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" second\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"lifetime-annotation\", \"'a\"],\r\n\t[\"keyword\", \"str\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for lifetime annotations in real-world examples. See #1339.\r\n"
  },
  {
    "path": "tests/languages/rust/issue1353.test",
    "content": "(*e 0 b'a')\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"operator\", \"*\"],\r\n\t\"e \",\r\n\t[\"number\", \"0\"],\r\n\t[\"char\", \"b'a'\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nMakes sure lifetime annotations do not mess with bytes. See #1353."
  },
  {
    "path": "tests/languages/rust/keyword_feature.test",
    "content": "abstract;\r\nas;\r\nasync;\r\nawait;\r\nbecome;\r\nbox;\r\nbreak;\r\nconst;\r\ncontinue;\r\ncrate;\r\ndo;\r\ndyn;\r\nelse;\r\nenum;\r\nextern;\r\nfinal;\r\nfn;\r\nfor;\r\nif;\r\nimpl;\r\nin;\r\nlet;\r\nloop;\r\nmacro;\r\nmatch;\r\nmod;\r\nmove;\r\nmut;\r\noverride;\r\npriv;\r\npub;\r\nref;\r\nreturn;\r\nself;\r\nSelf;\r\nstatic;\r\nstruct;\r\nsuper;\r\ntrait;\r\ntry;\r\ntype;\r\ntypeof;\r\nunion;\r\nunsafe;\r\nunsized;\r\nuse;\r\nvirtual;\r\nwhere;\r\nwhile;\r\nyield;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"as\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"async\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"await\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"become\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"box\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"crate\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"dyn\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"extern\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"final\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"fn\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"impl\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"let\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"loop\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"macro\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"match\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"mod\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"move\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"mut\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"override\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"priv\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"pub\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"ref\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"self\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"Self\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"struct\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"super\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"trait\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"try\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"type\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"typeof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"union\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"unsafe\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"unsized\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"use\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"virtual\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"where\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"yield\"], [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/rust/lifetime-annotation_feature.test",
    "content": "'static\r\n'foo\r\n'a\r\n'_\r\n<'a>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"lifetime-annotation\", \"'static\"],\r\n\t[\"lifetime-annotation\", \"'foo\"],\r\n\t[\"lifetime-annotation\", \"'a\"],\r\n\t[\"lifetime-annotation\", \"'_\"],\r\n\t[\"operator\", \"<\"], [\"lifetime-annotation\", \"'a\"], [\"operator\", \">\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for lifetime annotations.\r\n"
  },
  {
    "path": "tests/languages/rust/macro_example.test",
    "content": "macro_rules! write_html {\n\t($w:expr, ) => (());\n\n\t($w:expr, $e:tt) => (write!($w, \"{}\", $e));\n\n\t($w:expr, $tag:ident [ $($inner:tt)* ] $($rest:tt)*) => {{\n\t\twrite!($w, \"<{}>\", stringify!($tag));\n\t\twrite_html!($w, $($inner)*);\n\t\twrite!($w, \"</{}>\", stringify!($tag));\n\t\twrite_html!($w, $($rest)*);\n\t}};\n}\n\n----------------------------------------------------\n\n[\n\t[\"macro\", \"macro_rules!\"],\n\t\" write_html \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$w\"],\n\t[\"punctuation\", \":\"],\n\t[\"fragment-specifier\", \"expr\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=>\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$w\"],\n\t[\"punctuation\", \":\"],\n\t[\"fragment-specifier\", \"expr\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$e\"],\n\t[\"punctuation\", \":\"],\n\t[\"fragment-specifier\", \"tt\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=>\"],\n\t[\"punctuation\", \"(\"],\n\t[\"macro\", \"write!\"],\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$w\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"{}\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$e\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$w\"],\n\t[\"punctuation\", \":\"],\n\t[\"fragment-specifier\", \"expr\"],\n\t[\"punctuation\", \",\"],\n\t[\"variable\", \"$tag\"],\n\t[\"punctuation\", \":\"],\n\t[\"fragment-specifier\", \"ident\"],\n\t[\"punctuation\", \"[\"],\n\t\" $\",\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$inner\"],\n\t[\"punctuation\", \":\"],\n\t[\"fragment-specifier\", \"tt\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"*\"],\n\t[\"punctuation\", \"]\"],\n\t\" $\",\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$rest\"],\n\t[\"punctuation\", \":\"],\n\t[\"fragment-specifier\", \"tt\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"*\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"=>\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"macro\", \"write!\"],\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$w\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"<{}>\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"macro\", \"stringify!\"],\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$tag\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"macro\", \"write_html!\"],\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$w\"],\n\t[\"punctuation\", \",\"],\n\t\" $\",\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$inner\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"*\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"macro\", \"write!\"],\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$w\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"</{}>\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"macro\", \"stringify!\"],\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$tag\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"macro\", \"write_html!\"],\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$w\"],\n\t[\"punctuation\", \",\"],\n\t\" $\",\n\t[\"punctuation\", \"(\"],\n\t[\"variable\", \"$rest\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"*\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks this macro example.\n"
  },
  {
    "path": "tests/languages/rust/macro_feature.test",
    "content": "foo!\r\nfoo_bar!\r\nfoo_bar_42!\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"macro\", \"foo!\"],\r\n\t[\"macro\", \"foo_bar!\"],\r\n\t[\"macro\", \"foo_bar_42!\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for macros.\r\n"
  },
  {
    "path": "tests/languages/rust/namespace_feature.test",
    "content": "use std::{\n\tfs::File,\n\tio::{BufRead, BufReader},\n\tpath::PathBuf,\n};\nuse ::serde::de::{Error, Visitor};\nuse std::sync::atomic::{AtomicBool, Ordering};\npub mod sample;\nextern crate test;\n\nResult<Self, D::Error>\n\nwhere D: serde::Deserializer<'de>,\n\nserde_json::from_str(&line)\nself.read_records::<smol_str::SmolStr>()\n\npub static ALLOCATOR: alloc::Tracing = alloc::Tracing::new();\n\nunsafe fn alloc(&self, layout: std::alloc::Layout) -> *mut u8 {}\n\nuse crate::cool::function as root_function;\nself::cool::function();\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"use\"],\n\t[\"namespace\", [\n\t\t\"std\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"punctuation\", \"{\"],\n\n\t[\"namespace\", [\n\t\t\"fs\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"class-name\", \"File\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"namespace\", [\n\t\t\"io\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"punctuation\", \"{\"],\n\t[\"class-name\", \"BufRead\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"BufReader\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"namespace\", [\n\t\t\"path\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"class-name\", \"PathBuf\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"use\"],\n\t[\"punctuation\", \"::\"],\n\t[\"namespace\", [\n\t\t\"serde\",\n\t\t[\"punctuation\", \"::\"],\n\t\t\"de\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"punctuation\", \"{\"],\n\t[\"class-name\", \"Error\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"Visitor\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"use\"],\n\t[\"namespace\", [\n\t\t\"std\",\n\t\t[\"punctuation\", \"::\"],\n\t\t\"sync\",\n\t\t[\"punctuation\", \"::\"],\n\t\t\"atomic\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"punctuation\", \"{\"],\n\t[\"class-name\", \"AtomicBool\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"Ordering\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"pub\"],\n\t[\"keyword\", \"mod\"],\n\t[\"module-declaration\", \"sample\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"extern\"],\n\t[\"keyword\", \"crate\"],\n\t[\"module-declaration\", \"test\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", \"Result\"],\n\t[\"operator\", \"<\"],\n\t[\"keyword\", \"Self\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"D\"],\n\t[\"punctuation\", \"::\"],\n\t[\"class-name\", \"Error\"],\n\t[\"operator\", \">\"],\n\n\t[\"keyword\", \"where\"],\n\t[\"class-name\", \"D\"],\n\t[\"punctuation\", \":\"],\n\t[\"namespace\", [\n\t\t\"serde\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"class-name\", \"Deserializer\"],\n\t[\"operator\", \"<\"],\n\t[\"lifetime-annotation\", \"'de\"],\n\t[\"operator\", \">\"],\n\t[\"punctuation\", \",\"],\n\n\t[\"namespace\", [\n\t\t\"serde_json\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"function\", \"from_str\"],\n\t[\"punctuation\", \"(\"],\n\t[\"operator\", \"&\"],\n\t\"line\",\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"self\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"read_records\"],\n\t[\"punctuation\", \"::\"],\n\t[\"operator\", \"<\"],\n\t[\"namespace\", [\n\t\t\"smol_str\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"class-name\", \"SmolStr\"],\n\t[\"operator\", \">\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"pub\"],\n\t[\"keyword\", \"static\"],\n\t[\"constant\", \"ALLOCATOR\"],\n\t[\"punctuation\", \":\"],\n\t[\"namespace\", [\n\t\t\"alloc\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"class-name\", \"Tracing\"],\n\t[\"operator\", \"=\"],\n\t[\"namespace\", [\n\t\t\"alloc\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"class-name\", \"Tracing\"],\n\t[\"punctuation\", \"::\"],\n\t[\"function\", \"new\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"unsafe\"],\n\t[\"keyword\", \"fn\"],\n\t[\"function-definition\", \"alloc\"],\n\t[\"punctuation\", \"(\"],\n\t[\"operator\", \"&\"],\n\t[\"keyword\", \"self\"],\n\t[\"punctuation\", \",\"],\n\t\" layout\",\n\t[\"punctuation\", \":\"],\n\t[\"namespace\", [\n\t\t\"std\",\n\t\t[\"punctuation\", \"::\"],\n\t\t\"alloc\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"class-name\", \"Layout\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"->\"],\n\t[\"operator\", \"*\"],\n\t[\"keyword\", \"mut\"],\n\t[\"keyword\", \"u8\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"use\"],\n\t[\"keyword\", \"crate\"],\n\t[\"module-declaration\", [\n\t\t[\"punctuation\", \"::\"],\n\t\t\"cool\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t\"function \",\n\t[\"keyword\", \"as\"],\n\t\" root_function\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"self\"],\n\t[\"module-declaration\", [\n\t\t[\"punctuation\", \"::\"],\n\t\t\"cool\",\n\t\t[\"punctuation\", \"::\"]\n\t]],\n\t[\"function\", \"function\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for namespaces.\n"
  },
  {
    "path": "tests/languages/rust/number_feature.test",
    "content": "0xBad_Face\r\n0o741_123\r\n0b0000_1111\r\n42_000\r\n3.14_15_9\r\n3e4\r\n3.5E-8\r\n4.6e+41\r\n\r\n0xBad_Faceu8\r\n0o741_123i8\r\n0b0000_1111u16\r\n42_000i16\r\n3.14_15_9u32\r\n3e4i32\r\n3.5E-8u64\r\n4.6e+41i64\r\n4.2f32\r\n4.2f64\r\n\r\n0usize\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0xBad_Face\"],\r\n\t[\"number\", \"0o741_123\"],\r\n\t[\"number\", \"0b0000_1111\"],\r\n\t[\"number\", \"42_000\"],\r\n\t[\"number\", \"3.14_15_9\"],\r\n\t[\"number\", \"3e4\"],\r\n\t[\"number\", \"3.5E-8\"],\r\n\t[\"number\", \"4.6e+41\"],\r\n\r\n\t[\"number\", \"0xBad_Faceu8\"],\r\n\t[\"number\", \"0o741_123i8\"],\r\n\t[\"number\", \"0b0000_1111u16\"],\r\n\t[\"number\", \"42_000i16\"],\r\n\t[\"number\", \"3.14_15_9u32\"],\r\n\t[\"number\", \"3e4i32\"],\r\n\t[\"number\", \"3.5E-8u64\"],\r\n\t[\"number\", \"4.6e+41i64\"],\r\n\t[\"number\", \"4.2f32\"],\r\n\t[\"number\", \"4.2f64\"],\r\n\r\n\t[\"number\", \"0usize\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/rust/operator_feature.test",
    "content": "+ +=\r\n- -=\r\n* *=\r\n/ /=\r\n% %=\r\n! !=\r\n^ ^=\r\n= == =>\r\n& && &= ;\r\n| || |=\r\n< << <= <<=\r\n> >> >= >>=\r\n@ ?\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"],\r\n\t[\"operator\", \"%\"], [\"operator\", \"%=\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"=>\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"], [\"operator\", \"&=\"], [\"punctuation\", \";\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"], [\"operator\", \"|=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<<\"], [\"operator\", \"<=\"], [\"operator\", \"<<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">=\"], [\"operator\", \">>=\"],\r\n\t[\"operator\", \"@\"], [\"operator\", \"?\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/rust/punctuation_feature.test",
    "content": "->\n. .. ... ..=\n::\n{} [] ()\n; , :\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"->\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \"..\"],\n\t[\"punctuation\", \"...\"],\n\t[\"punctuation\", \"..=\"],\n\t[\"punctuation\", \"::\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \":\"]\n]\n\n----------------------------------------------------\n\nChecks for all punctuation.\n"
  },
  {
    "path": "tests/languages/rust/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\"foo\\\r\n\tbar\"\r\n\"foo\r\nbar\"\r\n\r\nb\"\"\r\nb\"fo\\\"obar\"\r\n\r\nr#\"\"#\r\nr#\"fo\"obar\"#\r\nr###\"foo\r\n#\r\nbar\"###\r\n\r\nbr#\"\"#\r\nbr#\"fo\"obar\"#\r\nbr###\"foo#bar\"###\r\n\r\nr\"(?x)\r\n(?P<year>\\d{4})  # the year\r\n-\r\n(?P<month>\\d{2}) # the month\r\n-\r\n(?P<day>\\d{2})   # the day\r\n\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\\\\r\\n\\tbar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"],\r\n\r\n\t[\"string\", \"b\\\"\\\"\"],\r\n\t[\"string\", \"b\\\"fo\\\\\\\"obar\\\"\"],\r\n\r\n\t[\"string\", \"r#\\\"\\\"#\"],\r\n\t[\"string\", \"r#\\\"fo\\\"obar\\\"#\"],\r\n\t[\"string\", \"r###\\\"foo\\r\\n#\\r\\nbar\\\"###\"],\r\n\r\n\t[\"string\", \"br#\\\"\\\"#\"],\r\n\t[\"string\", \"br#\\\"fo\\\"obar\\\"#\"],\r\n\t[\"string\", \"br###\\\"foo#bar\\\"###\"],\r\n\r\n\t[\"string\", \"r\\\"(?x)\\r\\n(?P<year>\\\\d{4})  # the year\\r\\n-\\r\\n(?P<month>\\\\d{2}) # the month\\r\\n-\\r\\n(?P<day>\\\\d{2})   # the day\\r\\n\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/sas/comment_feature.test",
    "content": "* foobar;\r\nfoo; * foobar;\r\n/* foo\r\nbar */\r\n\r\n/*options cashost=\"cloud.example.com\" casport=5570;*/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"* foobar;\"],\r\n\t\"\\r\\nfoo\", [\"punctuation\", \";\"],\r\n\t[\"comment\", \"* foobar;\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"/*options cashost=\\\"cloud.example.com\\\" casport=5570;*/\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/sas/datalines_feature.test",
    "content": "datalines;\r\n1993 2,819 1,120 422 391 63 98\r\n1994 2,477 1,160 500 172 47 70\r\n;\r\n\r\nlines;\r\nfoo bar baz\r\n;\r\n\r\ncards;\r\nfoo\r\nbar\r\nbaz\r\n;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"datalines\", [\r\n\t\t[\"keyword\", \"datalines\"], [\"punctuation\", \";\"],\r\n\t\t\"\\r\\n1993 2,819 1,120 422 391 63 98\\r\\n1994 2,477 1,160 500 172 47 70\\r\\n\",\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"datalines\", [\r\n\t\t[\"keyword\", \"lines\"], [\"punctuation\", \";\"],\r\n\t\t\"\\r\\nfoo bar baz\\r\\n\",\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"datalines\", [\r\n\t\t[\"keyword\", \"cards\"], [\"punctuation\", \";\"],\r\n\t\t\"\\r\\nfoo\\r\\nbar\\r\\nbaz\\r\\n\",\r\n\t\t[\"punctuation\", \";\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for datalines.\r\n"
  },
  {
    "path": "tests/languages/sas/datetime_feature.test",
    "content": "'1jan2013'd\r\n'9:25:19pm't\r\n'18jan2003:9:27:05am'dt\r\n\r\n* don't match the following just because of \"'t\";\r\n\r\n'foo'¦¦'test';\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"datetime\", \"'1jan2013'd\"],\r\n\t[\"datetime\", \"'9:25:19pm't\"],\r\n\t[\"datetime\", \"'18jan2003:9:27:05am'dt\"],\r\n\t[\"comment\", \"* don't match the following just because of \\\"'t\\\";\"],\r\n\t[\"string\", \"'foo'\"],\r\n\t[\"operator\", \"¦¦\"],\r\n\t[\"string\", \"'test'\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for date, times and datetimes.\r\n"
  },
  {
    "path": "tests/languages/sas/format_feature.test",
    "content": "put x $hex16.;\r\nformat salary uscurrency.;\r\nformat=dollar12.;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"altformat\",\r\n\t\t[\r\n\t\t\t[\"keyword\", \"put\"],\r\n\t\t\t\" x \",\r\n\t\t\t[\"format\", \"$hex16.\"]\r\n\t\t]\r\n\t],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"altformat\",\r\n\t\t[\r\n\t\t\t[\"keyword\",\"format\"],\r\n\t\t\t\" salary \",\r\n\t\t\t[\"format\", \"uscurrency.\"]\r\n\t\t]\r\n\t],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"format\",\r\n\t\t[\r\n\t\t\t[\"keyword\", \"format\"],\r\n\t\t\t[\"equals\", \"=\"],\r\n\t\t\t[\"format\", \"dollar12.\"]\r\n\t\t]\r\n\t],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that options captures \"options\" and correctly tags following text.\r\n"
  },
  {
    "path": "tests/languages/sas/function_feature.test",
    "content": "function()\r\nx=addrlong(item);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t\"\\r\\nx\",\r\n\t[\"operator\", \"=\"],\r\n\t[\"function\", \"addrlong\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"item\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that options captures \"options\" and correctly tags following text.\r\n"
  },
  {
    "path": "tests/languages/sas/input_feature.test",
    "content": "input name $ score1 score2 score3 team $;\r\ninput name $ & score;\r\ninput outlook $ 1-8 temperature humidity windy $ 16 - 21 /* golf $22 - 32 */;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\r\n\t\t\"input\",\r\n\t\t[\r\n\t\t\t[\"input\", \"input\"],\r\n\t\t\t\" name $ score1 score2 score3 team $;\"\r\n\t\t]\r\n\t],\r\n\t[\r\n\t\t\"input\",\r\n\t\t[\r\n\t\t\t[\"input\", \"input\"],\r\n\t\t\t\" name $ & score;\"\r\n\t\t]\r\n\t],\r\n\t[\"input\",\r\n\t\t[\r\n\t\t\t[\"input\", \"input\"],\r\n\t\t\t\" outlook $ \",\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t\"-\",\r\n\t\t\t[\"number\", \"8\"],\r\n\t\t\t\" temperature humidity windy $ \",\r\n\t\t\t[\"number\", \"16\"],\r\n\t\t\t\" - \",\r\n\t\t\t[\"number\", \"21\"],\r\n\t\t\t[\"comment\", \"/* golf $22 - 32 */\"],\r\n\t\t\t\";\"\r\n\t\t]\r\n\t]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that input captures \"input\" and text that follows up to and including\r\nthe semicolon.\r\n"
  },
  {
    "path": "tests/languages/sas/keyword_feature.test",
    "content": "after analysis and array barchart barwidth begingraph by\r\ncas cbarline cfill class classlev close column compute computed contains data=\r\ndefine document do do over dol drop dul end entryTitle else endcomp eval\r\nevaluate exec execute fill fillattrs filename group groupby headline headskip\r\nhistogram if infile keep keylabel keyword label layout legendlabel length\r\nlibname merge midpoints name noobs nowd ods or out output overlay plot ranexp\r\nrannor rbreak retain set session sessref statgraph sum summarize table temp then\r\nthen do title to var where xaxisopts yaxisopts y2axisopts\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"after\"], [\"keyword\", \"analysis\"],\r\n\t[\"keyword\", \"and\"], [\"keyword\", \"array\"], [\"keyword\", \"barchart\"],\r\n\t[\"keyword\", \"barwidth\"], [\"keyword\", \"begingraph\"], [\"keyword\", \"by\"],\r\n\t[\"keyword\", \"cas\"], [\"keyword\", \"cbarline\"], [\"keyword\", \"cfill\"],\r\n\t[\"keyword\", \"class\"], [\"keyword\", \"classlev\"],\r\n\t[\"keyword\", \"close\"], [\"keyword\", \"column\"], [\"keyword\", \"compute\"],\r\n\t[\"keyword\", \"computed\"], [\"keyword\", \"contains\"], [\"keyword\", \"data\"],\r\n\t[\"operator\", \"=\"], [\"keyword\", \"define\"],\t[\"keyword\", \"document\"],\r\n\t[\"keyword\", \"do\"], [\"keyword\", \"do over\"], [\"keyword\", \"dol\"],\r\n\t[\"keyword\", \"drop\"], [\"keyword\", \"dul\"], [\"keyword\", \"end\"],\r\n\t[\"keyword\", \"entryTitle\"], [\"keyword\", \"else\"], [\"keyword\", \"endcomp\"],\r\n\t[\"keyword\", \"eval\"], [\"keyword\", \"evaluate\"], [\"keyword\", \"exec\"],\r\n\t[\"keyword\", \"execute\"], [\"keyword\", \"fill\"], [\"keyword\", \"fillattrs\"],\r\n\t[\"keyword\", \"filename\"], [\"keyword\", \"group\"], [\"keyword\", \"groupby\"],\r\n\t[\"keyword\", \"headline\"], [\"keyword\", \"headskip\"], [\"keyword\", \"histogram\"],\r\n\t[\"keyword\", \"if\"],\t[\"keyword\", \"infile\"], [\"keyword\", \"keep\"],\r\n\t[\"keyword\", \"keylabel\"], [\"keyword\", \"keyword\"], [\"keyword\", \"label\"],\r\n\t[\"keyword\", \"layout\"], [\"keyword\", \"legendlabel\"], [\"keyword\", \"length\"],\r\n\t[\"keyword\", \"libname\"], [\"keyword\", \"merge\"], [\"keyword\", \"midpoints\"],\r\n\t[\"keyword\", \"name\"], [\"keyword\", \"noobs\"], [\"keyword\", \"nowd\"],\r\n\t[\"keyword\", \"ods\"], [\"keyword\", \"or\"], [\"keyword\", \"out\"],\r\n\t[\"keyword\", \"output\"], [\"keyword\", \"overlay\"], [\"keyword\", \"plot\"],\r\n\t[\"keyword\", \"ranexp\"], [\"keyword\", \"rannor\"], [\"keyword\", \"rbreak\"],\r\n\t[\"keyword\", \"retain\"], [\"keyword\", \"set\"], [\"keyword\", \"session\"],\r\n\t[\"keyword\", \"sessref\"], [\"keyword\", \"statgraph\"], [\"keyword\", \"sum\"],\r\n\t[\"keyword\", \"summarize\"], [\"keyword\", \"table\"], [\"keyword\", \"temp\"],\r\n\t[\"keyword\", \"then\"], [\"keyword\", \"then do\"], [\"keyword\", \"title\"],\r\n\t[\"keyword\", \"to\"],\t[\"keyword\", \"var\"], [\"keyword\", \"where\"],\r\n\t[\"keyword\", \"xaxisopts\"], [\"keyword\", \"yaxisopts\"], [\"keyword\", \"y2axisopts\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/sas/macro_feature.test",
    "content": "%_zscore(length);\r\n%_test(string, 0.3);\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"macro\", \"%_zscore\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"length\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"macro\", \"%_test\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"string\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0.3\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that options captures \"options\" and correctly tags following text.\r\n"
  },
  {
    "path": "tests/languages/sas/macro_string_function_feature.test",
    "content": "%let a=%bquote(' \");\n%let b=%nrbquote(' \");\n%let c=%nrquote(%' %\");\n%let d=%nrstr(%' %\");\n%let e=%quote(%' %\");\n%let f=%str(%' %\");\n%let char1 = %bquote(%substr(&infile,1,1));\n\n----------------------------------------------------\n\n[\n    [\"macro-keyword\", \"%let\"],\n    \" a\",\n    [\"operator\", \"=\"],\n    [\"macro-string-functions\", [\n        [\"function\", \"%bquote\"],\n        [\"punctuation\", \"(\"],\n        \"' \\\"\",\n        [\"punctuation\", \")\"]\n    ]],\n    [\"punctuation\", \";\"],\n    [\"macro-keyword\", \"%let\"],\n    \" b\",\n    [\"operator\", \"=\"],\n    [\"macro-string-functions\", [\n        [\"function\", \"%nrbquote\"],\n        [\"punctuation\", \"(\"],\n        \"' \\\"\",\n        [\"punctuation\", \")\"]\n    ]],\n    [\"punctuation\", \";\"],\n    [\"macro-keyword\", \"%let\"],\n    \" c\",\n    [\"operator\", \"=\"],\n    [\"macro-string-functions\", [\n        [\"function\", \"%nrquote\"],\n        [\"punctuation\", \"(\"],\n        [\"escaped-char\", \"%'\"],\n        [\"escaped-char\", \"%\\\"\"],\n        [\"punctuation\", \")\"]\n    ]],\n    [\"punctuation\", \";\"],\n    [\"macro-keyword\", \"%let\"],\n    \" d\",\n    [\"operator\", \"=\"],\n    [\"macro-string-functions\", [\n        [\"function\", \"%nrstr\"],\n        [\"punctuation\", \"(\"],\n        [\"escaped-char\", \"%'\"],\n        [\"escaped-char\", \"%\\\"\"],\n        [\"punctuation\", \")\"]\n    ]],\n    [\"punctuation\", \";\"],\n    [\"macro-keyword\", \"%let\"],\n    \" e\",\n    [\"operator\", \"=\"],\n    [\"macro-string-functions\", [\n        [\"function\", \"%quote\"],\n        [\"punctuation\", \"(\"],\n        [\"escaped-char\", \"%'\"],\n        [\"escaped-char\", \"%\\\"\"],\n        [\"punctuation\", \")\"]\n    ]],\n    [\"punctuation\", \";\"],\n    [\"macro-keyword\", \"%let\"],\n    \" f\",\n    [\"operator\", \"=\"],\n    [\"macro-string-functions\", [\n        [\"function\", \"%str\"],\n        [\"punctuation\", \"(\"],\n        [\"escaped-char\", \"%'\"],\n        [\"escaped-char\", \"%\\\"\"],\n        [\"punctuation\", \")\"]\n    ]],\n    [\"punctuation\", \";\"],\n\t[\"macro-keyword\", \"%let\"],\n    \" char1 \",\n    [\"operator\", \"=\"],\n    [\"function\", \"%bquote\"],\n    [\"punctuation\", \"(\"],\n    [\"macro-keyword\", \"%substr\"],\n    [\"punctuation\", \"(\"],\n    [\"macro-variable\", \"&infile\"],\n    [\"punctuation\", \",\"],\n    [\"number\", \"1\"],\n    [\"punctuation\", \",\"],\n    [\"number\", \"1\"],\n    [\"punctuation\", \")\"],\n    [\"punctuation\", \")\"],\n    [\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for all macro string functions.\n"
  },
  {
    "path": "tests/languages/sas/macrodefinition_feature.test",
    "content": "%macro prnt(var,sum);\r\n\tproc print data=srhigh;\r\n\t\tvar &var;\r\n\t\tsum &sum;\r\n\trun;\r\n%mend prnt;\r\n\r\n%macro printz/parmbuff;\r\n\t%let num=1;\r\n\t%let dsname=%scan(&syspbuff,&num);\r\n\t%do %while(&dsname ne);\r\n\t\tproc print data=&dsname;\r\n\t\trun;\r\n\t\t%let num=%eval(&num+1);\r\n\t\t%let dsname=%scan(&syspbuff,&num);\r\n\t%end;\r\n%mend printz;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n    [\"macro-declaration\", [\r\n        [\"keyword\", \"%macro\"],\r\n        \" prnt(var,sum)\"\r\n    ]],\r\n    [\"punctuation\", \";\"],\r\n    [\"step\", \"proc print\"],\r\n    [\"keyword\", \"data\"],\r\n    [\"operator\", \"=\"],\r\n    \"srhigh\",\r\n    [\"punctuation\", \";\"],\r\n    [\"keyword\", \"var\"],\r\n    [\"macro-variable\", \"&var\"],\r\n    [\"punctuation\", \";\"],\r\n    [\"keyword\", \"sum\"],\r\n    [\"macro-variable\", \"&sum\"],\r\n    [\"punctuation\", \";\"],\r\n    [\"step\", \"run\"],\r\n    [\"punctuation\", \";\"],\r\n    [\"macro-end\", [\r\n        [\"keyword\", \"%mend\"],\r\n        \" prnt\"\r\n    ]],\r\n    [\"punctuation\", \";\"],\r\n\r\n    [\"macro-declaration\", [\r\n        [\"keyword\", \"%macro\"],\r\n        \" printz/parmbuff\"\r\n    ]],\r\n    [\"punctuation\", \";\"],\r\n    [\"macro-keyword\", \"%let\"],\r\n    \" num\",\r\n    [\"operator\", \"=\"],\r\n    [\"number\", \"1\"],\r\n    [\"punctuation\", \";\"],\r\n    [\"macro-keyword\", \"%let\"],\r\n    \" dsname\",\r\n    [\"operator\", \"=\"],\r\n    [\"macro-keyword\", \"%scan\"],\r\n    [\"punctuation\", \"(\"],\r\n    [\"macro-variable\", \"&syspbuff\"],\r\n    [\"punctuation\", \",\"],\r\n    [\"macro-variable\", \"&num\"],\r\n    [\"punctuation\", \")\"],\r\n    [\"punctuation\", \";\"],\r\n    [\"macro-keyword\", \"%do\"],\r\n    [\"macro-keyword\", \"%while\"],\r\n    [\"punctuation\", \"(\"],\r\n    [\"macro-variable\", \"&dsname\"],\r\n    [\"operator-keyword\", \"ne\"],\r\n    [\"punctuation\", \")\"],\r\n    [\"punctuation\", \";\"],\r\n    [\"step\", \"proc print\"],\r\n    [\"keyword\", \"data\"],\r\n    [\"operator\", \"=\"],\r\n    [\"macro-variable\", \"&dsname\"],\r\n    [\"punctuation\", \";\"],\r\n    [\"step\", \"run\"],\r\n    [\"punctuation\", \";\"],\r\n    [\"macro-keyword\", \"%let\"],\r\n    \" num\",\r\n    [\"operator\", \"=\"],\r\n    [\"macro-keyword\", \"%eval\"],\r\n    [\"punctuation\", \"(\"],\r\n    [\"macro-variable\", \"&num\"],\r\n    [\"operator\", \"+\"],\r\n    [\"number\", \"1\"],\r\n    [\"punctuation\", \")\"],\r\n    [\"punctuation\", \";\"],\r\n    [\"macro-keyword\", \"%let\"],\r\n    \" dsname\",\r\n    [\"operator\", \"=\"],\r\n    [\"macro-keyword\", \"%scan\"],\r\n    [\"punctuation\", \"(\"],\r\n    [\"macro-variable\", \"&syspbuff\"],\r\n    [\"punctuation\", \",\"],\r\n    [\"macro-variable\", \"&num\"],\r\n    [\"punctuation\", \")\"],\r\n    [\"punctuation\", \";\"],\r\n    [\"macro-keyword\", \"%end\"],\r\n    [\"punctuation\", \";\"],\r\n    [\"macro-end\", [\r\n        [\"keyword\", \"%mend\"],\r\n        \" printz\"\r\n    ]],\r\n    [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nCheck that macro definition correctly recognizes %macro and %mend.\r\n"
  },
  {
    "path": "tests/languages/sas/macrokeyword_feature.test",
    "content": "%ABORT %BY %CMS %COPY %DISPLAY %DO %ELSE %END %EVAL %GLOBAL %GO %GOTO %IF %INC %INCLUDE\r\n%INDEX %INPUT %KTRIM %LENGTH %LET %LIST %LOCAL %PUT %QKTRIM %QSCAN\r\n%QSUBSTR %QSYSFUNC %QUPCASE %RETURN %RUN %SCAN %SUBSTR %SUPERQ %SYMDEL %SYMGLOBL\r\n%SYMLOCAL %SYMEXIST %SYSCALL %SYSEVALF %SYSEXEC %SYSFUNC %SYSGET %SYSRPUT %THEN %TO %TSO\r\n%UNQUOTE %UNTIL %UPCASE %WHILE %WINDOW\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"macro-keyword\", \"%ABORT\"], [\"macro-keyword\", \"%BY\"],\r\n\t[\"macro-keyword\", \"%CMS\"], [\"macro-keyword\", \"%COPY\"], [\"macro-keyword\", \"%DISPLAY\"],\r\n\t[\"macro-keyword\", \"%DO\"], [\"macro-keyword\", \"%ELSE\"], [\"macro-keyword\", \"%END\"],\r\n\t[\"macro-keyword\", \"%EVAL\"], [\"macro-keyword\", \"%GLOBAL\"], [\"macro-keyword\", \"%GO\"],\r\n\t[\"macro-keyword\", \"%GOTO\"], [\"macro-keyword\", \"%IF\"], [\"macro-keyword\", \"%INC\"],\r\n\t[\"macro-keyword\", \"%INCLUDE\"], [\"macro-keyword\", \"%INDEX\"],\r\n\t[\"macro-keyword\", \"%INPUT\"], [\"macro-keyword\", \"%KTRIM\"],\r\n\t[\"macro-keyword\", \"%LENGTH\"], [\"macro-keyword\", \"%LET\"], [\"macro-keyword\", \"%LIST\"],\r\n\t[\"macro-keyword\", \"%LOCAL\"], \r\n\t[\"macro-keyword\", \"%PUT\"], [\"macro-keyword\", \"%QKTRIM\"],\r\n\t[\"macro-keyword\", \"%QSCAN\"], [\"macro-keyword\", \"%QSUBSTR\"],\r\n\t[\"macro-keyword\", \"%QSYSFUNC\"],\r\n\t[\"macro-keyword\", \"%QUPCASE\"], [\"macro-keyword\", \"%RETURN\"],\r\n\t[\"macro-keyword\", \"%RUN\"], [\"macro-keyword\", \"%SCAN\"],\r\n\t[\"macro-keyword\", \"%SUBSTR\"], [\"macro-keyword\", \"%SUPERQ\"],\r\n\t[\"macro-keyword\", \"%SYMDEL\"], [\"macro-keyword\", \"%SYMGLOBL\"],\r\n\t[\"macro-keyword\", \"%SYMLOCAL\"], [\"macro-keyword\", \"%SYMEXIST\"],\r\n\t[\"macro-keyword\", \"%SYSCALL\"], [\"macro-keyword\", \"%SYSEVALF\"],\r\n\t[\"macro-keyword\", \"%SYSEXEC\"], [\"macro-keyword\", \"%SYSFUNC\"],\r\n\t[\"macro-keyword\", \"%SYSGET\"], [\"macro-keyword\", \"%SYSRPUT\"],\r\n\t[\"macro-keyword\", \"%THEN\"], [\"macro-keyword\", \"%TO\"], [\"macro-keyword\", \"%TSO\"],\r\n\t[\"macro-keyword\", \"%UNQUOTE\"], [\"macro-keyword\", \"%UNTIL\"],\r\n\t[\"macro-keyword\", \"%UPCASE\"], [\"macro-keyword\", \"%WHILE\"],\r\n\t[\"macro-keyword\", \"%WINDOW\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/sas/number_feature.test",
    "content": "42\r\n3.14159\r\n3.2e10\r\n0.4e-8\r\n1.4E+2\r\nBadFacex\r\n0c1x\r\n0b0ax\r\n\r\n\"3132,3334\"x\r\n'3132,3334'x\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3.2e10\"],\r\n\t[\"number\", \"0.4e-8\"],\r\n\t[\"number\", \"1.4E+2\"],\r\n\t\"\\r\\nBadFacex\\r\\n\",\r\n\t[\"number\", \"0c1x\"],\r\n\t[\"number\", \"0b0ax\"],\r\n\r\n\t[\"numeric-constant\", \"\\\"3132,3334\\\"x\"],\r\n\t[\"numeric-constant\", \"'3132,3334'x\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal and hexadecimal numbers.\r\n"
  },
  {
    "path": "tests/languages/sas/operator_feature.test",
    "content": "* **\r\n| ||\r\n! !!\r\n¦ ¦¦\r\n< <> <=\r\n> >< >=\r\n~ ~=\r\n¬ ¬=\r\n^ ^=\r\n= / +\r\n- &\r\n\r\neq ne gt lt\r\nge le in not\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"*\"], [\"operator\", \"**\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!!\"],\r\n\t[\"operator\", \"¦\"], [\"operator\", \"¦¦\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<>\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \"><\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"~\"], [\"operator\", \"~=\"],\r\n\t[\"operator\", \"¬\"], [\"operator\", \"¬=\"],\r\n\t[\"operator\", \"^\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"/\"], [\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"&\"],\r\n\t[\"operator-keyword\", \"eq\"], [\"operator-keyword\", \"ne\"], [\"operator-keyword\", \"gt\"], [\"operator-keyword\", \"lt\"],\r\n\t[\"operator-keyword\", \"ge\"], [\"operator-keyword\", \"le\"], [\"operator-keyword\", \"in\"], [\"operator-keyword\", \"not\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/sas/options_feature.test",
    "content": "options nodate linesize=72;\r\noptions validmemname=extend validvarname=any;\r\noptions insert=(fmtsearch=\"c:/myformats\");\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"options\"],\r\n\t[\r\n\t\t\"options-args\",\r\n\t\t[\r\n\t\t\t[\"arg\",\"nodate\"],\r\n\t\t\t[\"arg\", \"linesize\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"number\", \"72\"]\r\n\t\t]\r\n\t],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"options\"],\r\n\t[\r\n\t\t\"options-args\",\r\n\t\t[\r\n\t\t\t[\"arg\", \"validmemname\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"arg-value\", \"extend\"],\r\n\t\t\t[\"arg\", \"validvarname\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"arg-value\", \"any\"]\r\n\t\t]\r\n\t],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"options\"],\r\n\t[\r\n\t\t\"options-args\",\r\n\t\t[\r\n\t\t\t[\"arg\", \"insert\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"arg\", \"fmtsearch\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"\\\"c:/myformats\\\"\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]\r\n\t],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that options captures \"options\" and correctly tags following text.\r\n"
  },
  {
    "path": "tests/languages/sas/proccas_feature.test",
    "content": "proc cas;\r\n   session casauto;\r\n   builtins.actionSetInfo result=results;\r\n   print results.setinfo[,{'actionset', 'label'}];\r\nrun;\r\nquit;\r\n\r\nproc cas;\r\n  /* Testing a comment */\r\n  session casauto;\r\n  output log;\r\n  table.loadTable / path=\"iris.sashdat\";\r\n  simple.summary result=iris / table={name=\"iris\"};\r\n  tableIris=findtable(iris);\r\n  saveresult tableIris csv=\"sum.csv\";\r\nrun;\r\nquit;\r\n\r\nproc cas;\r\n  action table.fileinfo / path=\"%.csv\";\r\nrun;\r\nquit;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"step\", \"proc cas\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"proc-cas\",\r\n\t\t[\r\n\t\t\t[\"keyword\", \"session\"],\r\n\t\t\t\" casauto\",\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"cas-actions\", [\r\n\t\t\t\t\t[\"keyword\", \"builtins.actionSetInfo\"],\r\n\t\t\t\t\t[\"argument\", \"result\"],\r\n\t\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"arg-value\", \"results\"]\r\n\t\t\t\t]\r\n\t\t\t],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"keyword\", \"print\"],\r\n\t\t\t\" results\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"setinfo\",\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"string\", \"'actionset'\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"string\", \"'label'\"],\r\n\t\t\t[\"punctuation\", \"}\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"step\", \"run\"],\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]\r\n\t],\r\n\t[\"step\", \"quit\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"step\", \"proc cas\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"proc-cas\",\r\n\t\t[\r\n\t\t\t[\"comment\", \"/* Testing a comment */\"],\r\n\t\t\t[\"keyword\", \"session\"],\r\n\t\t\t\" casauto\",\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"statement\", [\r\n\t\t\t\t[\"arg\", \"output\"],\r\n\t\t\t\t[\"arg\", \"log\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"cas-actions\", [\r\n\t\t\t\t\t[\"keyword\", \"table.loadTable\"],\r\n\t\t\t\t\t\" / \",\r\n\t\t\t\t\t[\"argument\", \"path\"],\r\n\t\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t\t[\"string\", \"\\\"iris.sashdat\\\"\"]\r\n\t\t\t\t\t]\r\n\t\t],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"cas-actions\", [\r\n\t\t\t\t[\"keyword\", \"simple.summary\"],\r\n\t\t\t\t[\"argument\", \"result\"],\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"arg-value\", \"iris\"],\r\n\t\t\t\t\" / \",\r\n\t\t\t\t[\"argument\", \"table\"],\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\t[\"argument\", \"name\"],\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"string\", \"\\\"iris\\\"\"],\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]\r\n\t\t],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t\"\\r\\n  tableIris=\",\r\n\t\t[\"function\", \"findtable\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"iris\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"statement-var\", [\r\n\t\t\t[ \"statement\", [\r\n\t\t\t\t\t[\"keyword\", \"saveresult\"],\r\n\t\t\t\t\t\" tableIris\"\r\n\t\t\t\t]\r\n\t\t\t],\r\n\t\t\t[\"arg\", \"csv\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"\\\"sum.csv\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \";\"],\r\n\t\t[\"step\", \"run\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t\t]\r\n\t],\r\n\t[\"step\", \"quit\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"step\", \"proc cas\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"proc-cas\",\r\n\t\t[\r\n\t\t\t[\"cas-actions\",\r\n\t\t\t\t\t[\r\n\t\t\t\t\t[\"action\", \"action\"],\r\n\t\t\t\t\t[\"keyword\", \"table.fileinfo\"],\r\n\t\t\t\t\t\" / \",\r\n\t\t\t\t\t[\"argument\", \"path\"],\r\n\t\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t\t[\"string\", \"\\\"%.csv\\\"\"]\r\n\t\t\t\t]\r\n\t\t\t],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\t\t\t[\"step\", \"run\"],\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]\r\n\t],\r\n\t[\"step\", \"quit\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/sas/step_feature.test",
    "content": "data carsurvey;\r\nproc format;\r\nproc sort data=allacty;\r\nrun;\r\nquit;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"step\", \"data\"],\r\n\t\" carsurvey\",\r\n\t[\"punctuation\", \";\"],\r\n\t[\"step\", \"proc format\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"step\", \"proc sort\"],\r\n\t[\"proc-args\",[\r\n\t\t[\"arg\", \"data\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"arg-value\", \"allacty\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"step\", \"run\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"step\", \"quit\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that options captures \"options\" and correctly tags following text.\r\n"
  },
  {
    "path": "tests/languages/sas/string_feature.test",
    "content": "\"\"\r\n\"fo\"\"o\"\r\n\"foo\r\nbar\"\r\n''\r\n'fo''o'\r\n'foo\r\nbar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\"\\\"o\\\"\"],\r\n\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo''o'\"],\r\n\t[\"string\", \"'foo\\r\\nbar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-quoted and double-quoted strings.\r\n"
  },
  {
    "path": "tests/languages/sass/atrule-line_feature.test",
    "content": "@mixin foobar\r\n@media (min-width: 600px)\r\n\t@include foobar\r\n\r\n=foobar\r\n+foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"atrule-line\", [\r\n\t\t[\"atrule\", \"@mixin\"],\r\n\t\t\" foobar\"\r\n\t]],\r\n\t[\"atrule-line\", [\r\n\t\t[\"atrule\", \"@media\"],\r\n\t\t\" (min-width: 600px)\"\r\n\t]],\r\n\t[\"atrule-line\", [\r\n\t\t[\"atrule\", \"@include\"],\r\n\t\t\" foobar\"\r\n\t]],\r\n\t[\"atrule-line\", [\r\n\t\t[\"atrule\", \"=\"],\r\n\t\t\"foobar\"\r\n\t]],\r\n\t[\"atrule-line\", [\r\n\t\t[\"atrule\", \"+\"],\r\n\t\t\"foobar\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for at-rules."
  },
  {
    "path": "tests/languages/sass/comment_feature.test",
    "content": "//\r\n// foobar\r\n/*\r\n/* foo\r\n\tbar\r\n\r\n\t/* foo\r\n\t bar\r\n\t baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foobar\"],\r\n\t[\"comment\", \"/*\"],\r\n\t[\"comment\", \"/* foo\\r\\n\\tbar\"],\r\n\t[\"comment\", \"/* foo\\r\\n\\t bar\\r\\n\\t baz\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/sass/property-line_feature.test",
    "content": "foo: bar\r\n\tcolor: $color !important\r\n-moz-border-radius: 10px\r\ntransition-timing-function: ease-in-out\r\n\r\n\t:color #{$color}\r\n:font-size 0.5em + 3em\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property-line\", [\r\n\t\t[\"property\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" bar\"\r\n\t]],\r\n\t[\"property-line\", [\r\n\t\t[\"property\", \"color\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"variable\", \"$color\"],\r\n\t\t[\"important\", \"!important\"]\r\n\t]],\r\n\t[\"property-line\", [\r\n\t\t[\"property\", \"-moz-border-radius\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 10px\"\r\n\t]],\r\n\t[\"property-line\", [\r\n\t\t[\"property\", \"transition-timing-function\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" ease-in-out\"\r\n\t]],\r\n\t[\"property-line\", [\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"property\", \"color\"],\r\n\t\t[\"variable\", \"#{$color}\"]\r\n\t]],\r\n\t[\"property-line\", [\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"property\", \"font-size\"],\r\n\t\t\" 0.5em \", [\"operator\", \"+\"], \" 3em\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties."
  },
  {
    "path": "tests/languages/sass/selector_feature.test",
    "content": "div, span\r\n.foo .bar + div\r\n#foobar .baz:first-child\r\n\r\ndiv,\r\n  .bar\r\n\r\n\t#foo,\r\n\t\t.bar,\r\n\t\t.baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"selector\", \"div, span\"],\r\n\t[\"selector\", \".foo .bar + div\"],\r\n\t[\"selector\", \"#foobar .baz:first-child\"],\r\n\t[\"selector\", \"div,\\r\\n  .bar\"],\r\n\t[\"selector\", \"#foo,\\r\\n\\t\\t.bar,\\r\\n\\t\\t.baz\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for selectors."
  },
  {
    "path": "tests/languages/sass/variable-line_feature.test",
    "content": "$width: 5em\r\n$foo: $bar + $baz\r\n$foo: $bar - $baz\r\n$bar: #{$baz}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable-line\", [\r\n\t\t[\"variable\", \"$width\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 5em\"\r\n\t]],\r\n\t[\"variable-line\", [\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"variable\", \"$bar\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"variable\", \"$baz\"]\r\n\t]],\r\n\t[\"variable-line\", [\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"variable\", \"$bar\"],\r\n\t\t[\"operator\", \"-\"],\r\n\t\t[\"variable\", \"$baz\"]\r\n\t]],\r\n\t[\"variable-line\", [\r\n\t\t[\"variable\", \"$bar\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"variable\", \"#{$baz}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variable declarations.\r\n"
  },
  {
    "path": "tests/languages/scala/builtin_feature.test",
    "content": "String Int Long Short\r\nByte Boolean Double\r\nFloat Char Any AnyRef\r\nAnyVal Unit Nothing\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"String\"], [\"builtin\", \"Int\"], [\"builtin\", \"Long\"], [\"builtin\", \"Short\"],\r\n\t[\"builtin\", \"Byte\"], [\"builtin\", \"Boolean\"], [\"builtin\", \"Double\"],\r\n\t[\"builtin\", \"Float\"], [\"builtin\", \"Char\"], [\"builtin\", \"Any\"], [\"builtin\", \"AnyRef\"],\r\n\t[\"builtin\", \"AnyVal\"], [\"builtin\", \"Unit\"], [\"builtin\", \"Nothing\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for builtins."
  },
  {
    "path": "tests/languages/scala/char_feature.test",
    "content": "'a'\n'\\u0041'\n'\\n'\n'\\t'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'a'\"],\n\t[\"char\", \"'\\\\u0041'\"],\n\t[\"char\", \"'\\\\n'\"],\n\t[\"char\", \"'\\\\t'\"]\n]\n"
  },
  {
    "path": "tests/languages/scala/keyword_feature.test",
    "content": "<- =>\r\n\r\nabstract case catch\r\nclass def derives do\r\nelse enum extends extension\r\nfinal finally\r\nfor forSome given if\r\nimplicit import;\r\ninfix inline lazy\r\nmatch new null object\r\nopaque open\r\noverride package private\r\nprotected return sealed\r\nself super this throw\r\ntrait transparent try\r\ntype using val\r\nvar while with yield\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"<-\"], [\"keyword\", \"=>\"],\r\n\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"catch\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"def\"],\r\n\t[\"keyword\", \"derives\"],\r\n\t[\"keyword\", \"do\"],\r\n\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"keyword\", \"extension\"],\r\n\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"finally\"],\r\n\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"forSome\"],\r\n\t[\"keyword\", \"given\"],\r\n\t[\"keyword\", \"if\"],\r\n\r\n\t[\"keyword\", \"implicit\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"infix\"],\r\n\t[\"keyword\", \"inline\"],\r\n\t[\"keyword\", \"lazy\"],\r\n\r\n\t[\"keyword\", \"match\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"object\"],\r\n\r\n\t[\"keyword\", \"opaque\"],\r\n\t[\"keyword\", \"open\"],\r\n\r\n\t[\"namespace\", [\"override\"]],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"private\"],\r\n\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"sealed\"],\r\n\r\n\t[\"keyword\", \"self\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"throw\"],\r\n\r\n\t[\"keyword\", \"trait\"],\r\n\t[\"keyword\", \"transparent\"],\r\n\t[\"keyword\", \"try\"],\r\n\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"using\"],\r\n\t[\"keyword\", \"val\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"keyword\", \"yield\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/scala/number_feature.test",
    "content": "0xBadFace\r\n0xf7.fb\r\n42\r\n3.14159\r\n3e4\r\n0.1E8\r\n42d\r\n0777L\r\n1e30f\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0xf7.fb\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3e4\"],\r\n\t[\"number\", \"0.1E8\"],\r\n\t[\"number\", \"42d\"],\r\n\t[\"number\", \"0777L\"],\r\n\t[\"number\", \"1e30f\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/scala/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\r\n\"\"\"fo\"o\r\nbar\"\"\"\r\n\"\"\"fo\"o\r\n// comment\r\nbar\"\"\"\r\n\"\"\"{\"name\":\"James\"}\"\"\"\r\n\"foo /* comment */ bar\"\r\n\r\ns\"Hello, $name\"\r\ns\"1 + 1 = ${1 + 1}\"\r\ns\"New offers starting at $$14.99\"\r\nf\"$name%s is $height%2.2f meters tall\"\r\njson\"{ name: $name, id: $id }\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\r\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"fo\\\"o\\r\\nbar\\\"\\\"\\\"\"],\r\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"fo\\\"o\\r\\n// comment\\r\\nbar\\\"\\\"\\\"\"],\r\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"{\\\"name\\\":\\\"James\\\"}\\\"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo /* comment */ bar\\\"\"],\r\n\r\n\t[\"string-interpolation\", [\r\n\t\t[\"id\", \"s\"],\r\n\t\t[\"string\", \"\\\"Hello, \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"expression\", [\"name\"]]\r\n\t\t]],\r\n\t\t[\"string\", \"\\\"\"]\r\n\t]],\r\n\t[\"string-interpolation\", [\r\n\t\t[\"id\", \"s\"],\r\n\t\t[\"string\", \"\\\"1 + 1 = \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"${\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t[\"number\", \"1\"],\r\n\t\t\t\t[\"operator\", \"+\"],\r\n\t\t\t\t[\"number\", \"1\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"string\", \"\\\"\"]\r\n\t]],\r\n\t[\"string-interpolation\", [\r\n\t\t[\"id\", \"s\"],\r\n\t\t[\"string\", \"\\\"New offers starting at \"],\r\n\t\t[\"escape\", \"$$\"],\r\n\t\t[\"string\", \"14.99\\\"\"]\r\n\t]],\r\n\t[\"string-interpolation\", [\r\n\t\t[\"id\", \"f\"],\r\n\t\t[\"string\", \"\\\"\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"expression\", [\"name\"]]\r\n\t\t]],\r\n\t\t[\"string\", \"%s is \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"expression\", [\"height\"]]\r\n\t\t]],\r\n\t\t[\"string\", \"%2.2f meters tall\\\"\"]\r\n\t]],\r\n\t[\"string-interpolation\", [\r\n\t\t[\"id\", \"json\"],\r\n\t\t[\"string\", \"\\\"{ name: \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"expression\", [\"name\"]]\r\n\t\t]],\r\n\t\t[\"string\", \", id: \"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"punctuation\", \"$\"],\r\n\t\t\t[\"expression\", [\"id\"]]\r\n\t\t]],\r\n\t\t[\"string\", \" }\\\"\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/scala/symbol_feature.test",
    "content": "'foo\r\n'foo_42\r\n'foo_bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"symbol\", \"'foo\"],\r\n\t[\"symbol\", \"'foo_42\"],\r\n\t[\"symbol\", \"'foo_bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for symbols."
  },
  {
    "path": "tests/languages/scheme/boolean_feature.test",
    "content": "#t\r\n#f\r\n#true\r\n#false\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"#t\"],\r\n\t[\"boolean\", \"#f\"],\r\n\t[\"boolean\", \"#true\"],\r\n\t[\"boolean\", \"#false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/scheme/builtin_feature.test",
    "content": "(abs\r\n(and\r\n(append\r\n(apply\r\n(assoc\r\n(assq\r\n(assv\r\n(binary-port?\r\n(boolean=?\r\n(boolean?\r\n(bytevector\r\n(bytevector-append\r\n(bytevector-copy\r\n(bytevector-copy!\r\n(bytevector-length\r\n(bytevector-u8-ref\r\n(bytevector-u8-set!\r\n(bytevector?\r\n(caar\r\n(cadr\r\n(call-with-current-continuation\r\n(call-with-port\r\n(call-with-values\r\n(call/cc\r\n(car\r\n(cdar\r\n(cddr\r\n(cdr\r\n(ceiling\r\n(char->integer\r\n(char-ready?\r\n(char<=?\r\n(char<?\r\n(char=?\r\n(char>=?\r\n(char>?\r\n(char?\r\n(close-input-port\r\n(close-output-port\r\n(close-port\r\n(complex?\r\n(cons\r\n(current-error-port\r\n(current-input-port\r\n(current-output-port\r\n(denominator\r\n(dynamic-wind\r\n(eof-object\r\n(eof-object?\r\n(eq?\r\n(equal?\r\n(eqv?\r\n(error\r\n(error-object-irritants\r\n(error-object-message\r\n(error-object?\r\n(eval\r\n(even?\r\n(exact\r\n(exact-integer-sqrt\r\n(exact-integer?\r\n(exact?\r\n(expt\r\n(features\r\n(file-error?\r\n(floor\r\n(floor-quotient\r\n(floor-remainder\r\n(floor/\r\n(flush-output-port\r\n(for-each\r\n(gcd\r\n(get-output-bytevector\r\n(get-output-string\r\n(inexact\r\n(inexact?\r\n(input-port-open?\r\n(input-port?\r\n(integer->char\r\n(integer?\r\n(lcm\r\n(length\r\n(list\r\n(list->string\r\n(list->vector\r\n(list-copy\r\n(list-ref\r\n(list-set!\r\n(list-tail\r\n(list?\r\n(make-bytevector\r\n(make-list\r\n(make-parameter\r\n(make-string\r\n(make-vector\r\n(map\r\n(max\r\n(member\r\n(memq\r\n(memv\r\n(min\r\n(modulo\r\n(negative?\r\n(newline\r\n(not\r\n(null?\r\n(number->string\r\n(number?\r\n(numerator\r\n(odd?\r\n(open-input-bytevector\r\n(open-input-string\r\n(open-output-bytevector\r\n(open-output-string\r\n(or\r\n(output-port-open?\r\n(output-port?\r\n(pair?\r\n(peek-char\r\n(peek-u8\r\n(port?\r\n(positive?\r\n(procedure?\r\n(quotient\r\n(raise\r\n(raise-continuable\r\n(rational?\r\n(rationalize\r\n(read-bytevector\r\n(read-bytevector!\r\n(read-char\r\n(read-error?\r\n(read-line\r\n(read-string\r\n(read-u8\r\n(real?\r\n(remainder\r\n(reverse\r\n(round\r\n(set-car!\r\n(set-cdr!\r\n(square\r\n(string\r\n(string->list\r\n(string->number\r\n(string->symbol\r\n(string->utf8\r\n(string->vector\r\n(string-append\r\n(string-copy\r\n(string-copy!\r\n(string-fill!\r\n(string-for-each\r\n(string-length\r\n(string-map\r\n(string-ref\r\n(string-set!\r\n(string<=?\r\n(string<?\r\n(string=?\r\n(string>=?\r\n(string>?\r\n(string?\r\n(substring\r\n(symbol->string\r\n(symbol=?\r\n(symbol?\r\n(syntax-error\r\n(textual-port?\r\n(truncate\r\n(truncate-quotient\r\n(truncate-remainder\r\n(truncate/\r\n(u8-ready?\r\n(utf8->string\r\n(values\r\n(vector\r\n(vector->list\r\n(vector->string\r\n(vector-append\r\n(vector-copy\r\n(vector-copy!\r\n(vector-fill!\r\n(vector-for-each\r\n(vector-length\r\n(vector-map\r\n(vector-ref\r\n(vector-set!\r\n(vector?\r\n(with-exception-handler\r\n(write-bytevector\r\n(write-char\r\n(write-string\r\n(write-u8\r\n(zero?\r\n\r\n; with brackets\r\n[map\r\n[max\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"abs\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"and\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"append\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"apply\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"assoc\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"assq\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"assv\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"binary-port?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"boolean=?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"boolean?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"bytevector\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"bytevector-append\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"bytevector-copy\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"bytevector-copy!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"bytevector-length\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"bytevector-u8-ref\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"bytevector-u8-set!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"bytevector?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"caar\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"cadr\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"call-with-current-continuation\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"call-with-port\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"call-with-values\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"call/cc\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"car\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"cdar\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"cddr\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"cdr\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"ceiling\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"char->integer\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"char-ready?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"char<=?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"char<?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"char=?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"char>=?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"char>?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"char?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"close-input-port\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"close-output-port\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"close-port\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"complex?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"cons\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"current-error-port\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"current-input-port\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"current-output-port\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"denominator\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"dynamic-wind\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"eof-object\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"eof-object?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"eq?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"equal?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"eqv?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"error\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"error-object-irritants\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"error-object-message\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"error-object?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"eval\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"even?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"exact\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"exact-integer-sqrt\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"exact-integer?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"exact?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"expt\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"features\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"file-error?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"floor\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"floor-quotient\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"floor-remainder\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"floor/\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"flush-output-port\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"for-each\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"gcd\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"get-output-bytevector\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"get-output-string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"inexact\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"inexact?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"input-port-open?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"input-port?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"integer->char\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"integer?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"lcm\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"length\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"list\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"list->string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"list->vector\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"list-copy\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"list-ref\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"list-set!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"list-tail\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"list?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"make-bytevector\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"make-list\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"make-parameter\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"make-string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"make-vector\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"map\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"max\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"member\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"memq\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"memv\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"min\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"modulo\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"negative?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"newline\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"not\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"null?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"number->string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"number?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"numerator\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"odd?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"open-input-bytevector\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"open-input-string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"open-output-bytevector\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"open-output-string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"or\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"output-port-open?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"output-port?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"pair?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"peek-char\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"peek-u8\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"port?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"positive?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"procedure?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"quotient\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"raise\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"raise-continuable\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"rational?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"rationalize\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"read-bytevector\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"read-bytevector!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"read-char\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"read-error?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"read-line\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"read-string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"read-u8\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"real?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"remainder\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"reverse\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"round\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"set-car!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"set-cdr!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"square\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string->list\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string->number\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string->symbol\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string->utf8\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string->vector\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string-append\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string-copy\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string-copy!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string-fill!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string-for-each\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string-length\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string-map\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string-ref\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string-set!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string<=?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string<?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string=?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string>=?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string>?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"string?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"substring\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"symbol->string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"symbol=?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"symbol?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"syntax-error\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"textual-port?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"truncate\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"truncate-quotient\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"truncate-remainder\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"truncate/\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"u8-ready?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"utf8->string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"values\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector->list\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector->string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector-append\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector-copy\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector-copy!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector-fill!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector-for-each\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector-length\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector-map\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector-ref\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector-set!\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"vector?\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"with-exception-handler\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"write-bytevector\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"write-char\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"write-string\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"write-u8\"],\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"zero?\"],\r\n\r\n\t[\"comment\", \"; with brackets\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"map\"],\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"max\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for builtins.\r\n"
  },
  {
    "path": "tests/languages/scheme/char_feature.test",
    "content": "#\\a                     ; lowercase letter\n#\\A                     ; uppercase letter\n#\\(                     ; left parenthesis\n#\\space                 ; the space character\n#\\newline               ; the newline character\n\n#\\c-a                   ; Control-a\n#\\meta-b                ; Meta-b\n#\\c-s-m-h-a             ; Control-Meta-Super-Hyper-A\n\n#\\; #\\' #\\\"\n\n#\\u0041\n#\\x10FFFF\n#\\λ\n#\\)\n#\\💩\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"#\\\\a\"], [\"comment\", \"; lowercase letter\"],\n\t[\"char\", \"#\\\\A\"], [\"comment\", \"; uppercase letter\"],\n\t[\"char\", \"#\\\\(\"], [\"comment\", \"; left parenthesis\"],\n\t[\"char\", \"#\\\\space\"], [\"comment\", \"; the space character\"],\n\t[\"char\", \"#\\\\newline\"], [\"comment\", \"; the newline character\"],\n\n\t[\"char\", \"#\\\\c-a\"], [\"comment\", \"; Control-a\"],\n\t[\"char\", \"#\\\\meta-b\"], [\"comment\", \"; Meta-b\"],\n\t[\"char\", \"#\\\\c-s-m-h-a\"], [\"comment\", \"; Control-Meta-Super-Hyper-A\"],\n\n\t[\"char\", \"#\\\\;\"], [\"char\", \"#\\\\'\"], [\"char\", \"#\\\\\\\"\"],\n\n\t[\"char\", \"#\\\\u0041\"],\n\t[\"char\", \"#\\\\x10FFFF\"],\n\t[\"char\", \"#\\\\λ\"],\n\t[\"char\", \"#\\\\)\"],\n\t[\"char\", \"#\\\\💩\"]\n]\n\n----------------------------------------------------\n\nChecks for character literals.\n"
  },
  {
    "path": "tests/languages/scheme/comment_feature.test",
    "content": ";\r\n; foobar\r\n\r\n#;(foo bar)\r\n#; (foo)\r\n#;[foo bar]\r\n#; [foo]\r\n\r\n#|\r\n comment\r\n #| nested comment |#\r\n|#\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \";\"],\r\n\t[\"comment\", \"; foobar\"],\r\n\r\n\t[\"comment\", \"#;(foo bar)\"],\r\n\t[\"comment\", \"#; (foo)\"],\r\n\t[\"comment\", \"#;[foo bar]\"],\r\n\t[\"comment\", \"#; [foo]\"],\r\n\r\n\t[\"comment\", \"#|\\r\\n comment\\r\\n #| nested comment |#\\r\\n|#\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/scheme/function_feature.test",
    "content": "(fl= 1 2)\r\n(flmin 2 3)\r\n(inexact->exact 3)\r\n(!fact)\r\n(** 10)\r\n(**\r\n(defined foo)\r\n(|some name| foo)\r\n\r\n[fl= 1 2]\r\n[flmin 2 3]\r\n[inexact->exact 3]\r\n[!fact]\r\n[** 10]\r\n[**\r\n[defined foo]\r\n[|some name| foo]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"fl=\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"flmin\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"inexact->exact\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"!fact\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"**\"],\r\n\t[\"number\", \"10\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"**\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"defined\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"|some name|\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"fl=\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"flmin\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"inexact->exact\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"!fact\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"**\"],\r\n\t[\"number\", \"10\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"**\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"defined\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"|some name|\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/scheme/identifier_feature.test",
    "content": "|\\x9;\\x9;|\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"identifier\", \"|\\\\x9;\\\\x9;|\"]\r\n]"
  },
  {
    "path": "tests/languages/scheme/issue1331.test",
    "content": "(pair? '(1 2))\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"builtin\", \"pair?\"],\r\n\t[\"punctuation\", \"'\"], [\"punctuation\", \"(\"], [\"number\", \"1\"], [\"number\", \"2\"], [\"punctuation\", \")\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nTests that first number of a list is not highlighted as a function. See #1331\r\n"
  },
  {
    "path": "tests/languages/scheme/issue2609.test",
    "content": "'(foo bar baz)\r\n`(foo bar baz)\r\n#(foo bar baz)\r\n'#(foo bar baz)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"'\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo bar baz\",\r\n\t[\"punctuation\", \")\"],\r\n\t\"\\r\\n`\",\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo bar baz\",\r\n\t[\"punctuation\", \")\"],\r\n\t\"\\r\\n#\",\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo bar baz\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"'\"],\r\n\t\"#\",\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo bar baz\",\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nNone of the \"foo\"s are functions, so they shouldn't be highlighted as such. See #2609 for more details."
  },
  {
    "path": "tests/languages/scheme/issue2811.test",
    "content": "(let ([x 10]\r\n      [y 20])\r\n  (+ x y))\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"x\"],\r\n\t[\"number\", \"10\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"function\", \"y\"],\r\n\t[\"number\", \"20\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"operator\", \"+\"],\r\n\t\" x y\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"]\r\n]"
  },
  {
    "path": "tests/languages/scheme/keyword_feature.test",
    "content": "(begin)\r\n(case)\r\n(case-lambda)\r\n(cond)\r\n(cond-expand)\r\n(define-library)\r\n(define-macro)\r\n(define-record-type)\r\n(define-syntax)\r\n(define-values)\r\n(define)\r\n(defmacro)\r\n(delay-force)\r\n(delay)\r\n(do)\r\n(else)\r\n(export)\r\n(except)\r\n(guard)\r\n(if)\r\n(import)\r\n(include)\r\n(include-ci)\r\n(include-library-declarations)\r\n(lambda)\r\n(let-syntax)\r\n(let-values)\r\n(let)\r\n(let*-values)\r\n(let*)\r\n(letrec-syntax)\r\n(letrec-values)\r\n(letrec)\r\n(letrec*)\r\n(only)\r\n(parameterize)\r\n(prefix)\r\n(quasi-quote)\r\n(quasiquote)\r\n(quote)\r\n(rename)\r\n(set!)\r\n(syntax-case)\r\n(syntax-rules)\r\n(unless)\r\n(unquote)\r\n(unquote-splicing)\r\n(when)\r\n\r\n; with brackets\r\n\r\n[if]\r\n[when]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"begin\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"case-lambda\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"cond\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"cond-expand\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"define-library\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"define-macro\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"define-record-type\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"define-syntax\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"define-values\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"define\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"defmacro\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"delay-force\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"delay\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"except\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"guard\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"include-ci\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"include-library-declarations\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"lambda\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"let-syntax\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"let-values\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"let*-values\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"let*\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"letrec-syntax\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"letrec-values\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"letrec\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"letrec*\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"only\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"parameterize\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"prefix\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"quasi-quote\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"quasiquote\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"quote\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"rename\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"set!\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"syntax-case\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"syntax-rules\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"unless\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"unquote\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"unquote-splicing\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"comment\", \"; with brackets\"],\r\n\r\n\t[\"punctuation\", \"[\"], [\"keyword\", \"if\"], [\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"], [\"keyword\", \"when\"], [\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/scheme/lambda_parameter_feature.test",
    "content": "(lambda x x)\r\n\r\n(lambda |some name| |some name|)\r\n\r\n(lambda (x) x)\r\n\r\n(lambda (foo bar) (concat foo bar))\r\n(lambda [foo bar] (concat foo bar))\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"lambda\"],\r\n\t[\"lambda-parameter\", \"x\"],\r\n\t\" x\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"lambda\"],\r\n\t[\"lambda-parameter\", \"|some name|\"],\r\n\t[\"identifier\", \"|some name|\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"lambda\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"lambda-parameter\", \"x\"],\r\n\t[\"punctuation\", \")\"],\r\n\t\" x\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"lambda\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"lambda-parameter\", \"foo bar\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"concat\"],\r\n\t\" foo bar\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"lambda\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"lambda-parameter\", \"foo bar\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"concat\"],\r\n\t\" foo bar\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for lambda parameters.\r\n"
  },
  {
    "path": "tests/languages/scheme/number_feature.test",
    "content": "123\r\n\r\n(foo 42 +42 -42)\r\n(foo 1e3 +1e3 -1e3)\r\n(foo 1e+3 1e-3 3.14159 3.14159e-1)\r\n(foo 8/3)\r\n(foo 3+4i 2.5+0.0i 2.5+0.0i -2.5e4+0.0e4i 3+0i -2e-5i)\r\n(list +10i -10i 10+10i 10.10+10.10i 10-10i 10+10e+10i)\r\n\r\n(list #d123 #e#d123e-4 #d#i12 #i-1.234i)\r\n\r\n(list #xBAD #b1110011 #o777)\r\n(list #i#x10 #i#x10+10i #b10+10i)\r\n\r\n[list 123]\r\n\r\n10+i\r\n10+.1i\r\n10+1.i\r\n\r\n10.0E2\r\n10.0D2\r\n10.0L2\r\n10.0S2\r\n10.0F2\r\n\r\n10.0e2\r\n10.0d2\r\n10.0l2\r\n10.0s2\r\n10.0f2\r\n\r\n; not a number but a symbol\r\n(define 1+2 10)\r\n\r\n(list 10.0P2 10.0g2 10.0w2)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"+42\"],\r\n\t[\"number\", \"-42\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"number\", \"1e3\"],\r\n\t[\"number\", \"+1e3\"],\r\n\t[\"number\", \"-1e3\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"number\", \"1e+3\"],\r\n\t[\"number\", \"1e-3\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3.14159e-1\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"number\", \"8/3\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"number\", \"3+4i\"],\r\n\t[\"number\", \"2.5+0.0i\"],\r\n\t[\"number\", \"2.5+0.0i\"],\r\n\t[\"number\", \"-2.5e4+0.0e4i\"],\r\n\t[\"number\", \"3+0i\"],\r\n\t[\"number\", \"-2e-5i\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"list\"],\r\n\t[\"number\", \"+10i\"],\r\n\t[\"number\", \"-10i\"],\r\n\t[\"number\", \"10+10i\"],\r\n\t[\"number\", \"10.10+10.10i\"],\r\n\t[\"number\", \"10-10i\"],\r\n\t[\"number\", \"10+10e+10i\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"list\"],\r\n\t[\"number\", \"#d123\"],\r\n\t[\"number\", \"#e#d123e-4\"],\r\n\t[\"number\", \"#d#i12\"],\r\n\t[\"number\", \"#i-1.234i\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"list\"],\r\n\t[\"number\", \"#xBAD\"],\r\n\t[\"number\", \"#b1110011\"],\r\n\t[\"number\", \"#o777\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"list\"],\r\n\t[\"number\", \"#i#x10\"],\r\n\t[\"number\", \"#i#x10+10i\"],\r\n\t[\"number\", \"#b10+10i\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"[\"], [\"builtin\", \"list\"], [\"number\", \"123\"], [\"punctuation\", \"]\"],\r\n\r\n\t[\"number\", \"10+i\"],\r\n\t[\"number\", \"10+.1i\"],\r\n\t[\"number\", \"10+1.i\"],\r\n\r\n\t[\"number\", \"10.0E2\"],\r\n\t[\"number\", \"10.0D2\"],\r\n\t[\"number\", \"10.0L2\"],\r\n\t[\"number\", \"10.0S2\"],\r\n\t[\"number\", \"10.0F2\"],\r\n\r\n\t[\"number\", \"10.0e2\"],\r\n\t[\"number\", \"10.0d2\"],\r\n\t[\"number\", \"10.0l2\"],\r\n\t[\"number\", \"10.0s2\"],\r\n\t[\"number\", \"10.0f2\"],\r\n\r\n\t[\"comment\", \"; not a number but a symbol\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"define\"],\r\n\t\" 1+2 \",\r\n\t[\"number\", \"10\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"list\"],\r\n\t\" 10.0P2 10.0g2 10.0w2\",\r\n\t[\"punctuation\", \")\"]\r\n\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers, rational numbers, and complex numbers.\r\n"
  },
  {
    "path": "tests/languages/scheme/operator_feature.test",
    "content": "(+\r\n(-\r\n(*\r\n(/\r\n(%\r\n(<\r\n(<=\r\n(>\r\n(>=\r\n(=\r\n(=>\r\n\r\n; with brackets\r\n[=\r\n[=>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"+\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"-\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"*\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"/\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"%\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"<\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"<=\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \">\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \">=\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"=\"],\r\n\t[\"punctuation\", \"(\"], [\"operator\", \"=>\"],\r\n\r\n\t[\"comment\", \"; with brackets\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \"=\"],\r\n\t[\"punctuation\", \"[\"], [\"operator\", \"=>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/scheme/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\"\r\nmulti\r\nline\r\n\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"\\r\\nmulti\\r\\nline\\r\\n\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/scheme/symbol_feature.test",
    "content": "'turkey\r\n(define a 'foo)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"symbol\", \"'turkey\"],\r\n\t[\"punctuation\", \"(\"], [\"keyword\", \"define\"], \" a \", [\"symbol\",\"'foo\"], [\"punctuation\",\")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for symbols.\r\n"
  },
  {
    "path": "tests/languages/scss/atrule_feature.test",
    "content": "@media (min-width: 600px) {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"atrule\", [\r\n\t\t[\"rule\", \"@media\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"property\", [\"min-width\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" 600px\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for at-rules.\r\n"
  },
  {
    "path": "tests/languages/scss/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/scss/comment_feature.test",
    "content": "//\r\n// foobar\r\n/**/\r\n/* foo\r\nbar */\r\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foobar\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/scss/keyword_feature.test",
    "content": "@if @else if @else\r\n@for @each @while\r\n@import @extend @use @forward\r\n@debug @warn @mixin\r\n@include @function\r\n@return @content\r\n\r\n@for $i from 1 through 3\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"@if\"], [\"keyword\", \"@else if\"], [\"keyword\", \"@else\"],\r\n\t[\"keyword\", \"@for\"], [\"keyword\", \"@each\"], [\"keyword\", \"@while\"],\r\n\t[\"keyword\", \"@import\"], [\"keyword\", \"@extend\"], [\"keyword\", \"@use\"], [\"keyword\", \"@forward\"],\r\n\t[\"keyword\", \"@debug\"], [\"keyword\", \"@warn\"], [\"keyword\", \"@mixin\"],\r\n\t[\"keyword\", \"@include\"], [\"keyword\", \"@function\"],\r\n\t[\"keyword\", \"@return\"], [\"keyword\", \"@content\"],\r\n\r\n\t[\"keyword\", \"@for\"],\r\n\t[\"variable\", \"$i\"],\r\n\t[\"keyword\", \"from\"],\r\n\t\" 1 \",\r\n\t[\"keyword\", \"through\"],\r\n\t\" 3\"\r\n]\r\n\r\n----------------------------------------------------\r\n"
  },
  {
    "path": "tests/languages/scss/module-modifier_feature.test",
    "content": "@use \"foo\" as bar;\r\n@use \"foo\" with ($color: blue);\r\n@forward \"foo\" show bar;\r\n@forward \"foo\" hide baz;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"@use\"], [\"string\", \"\\\"foo\\\"\"], [\"module-modifier\", \"as\"], \" bar\", [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"@use\"], [\"string\", \"\\\"foo\\\"\"], [\"module-modifier\", \"with\"], [\"punctuation\", \"(\"], [\"property\", [[\"variable\", \"$color\"]]], [\"punctuation\", \":\"], \" blue\", [\"punctuation\", \")\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"@forward\"], [\"string\", \"\\\"foo\\\"\"], [\"module-modifier\", \"show\"], \" bar\", [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"@forward\"], [\"string\", \"\\\"foo\\\"\"], [\"module-modifier\", \"hide\"], \" baz\", [\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Sass module modifiers\r\n"
  },
  {
    "path": "tests/languages/scss/null_feature.test",
    "content": "null\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"null\", \"null\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for null."
  },
  {
    "path": "tests/languages/scss/operator_feature.test",
    "content": "4 - 2;\r\n4 + 2;\r\n4 * 2;\r\n4 / 2;\r\n4 % 2;\r\n4 == 2;\r\n4 != 2;\r\n4 < 2;\r\n4 <= 2;\r\n4 > 2;\r\n4 >= 2;\r\ntrue and false\r\nfalse or true\r\nnot true\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"4 \", [\"operator\", \"-\"], \" 2\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n4 \", [\"operator\", \"+\"], \" 2\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n4 \", [\"operator\", \"*\"], \" 2\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n4 \", [\"operator\", \"/\"], \" 2\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n4 \", [\"operator\", \"%\"], \" 2\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n4 \", [\"operator\", \"==\"], \" 2\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n4 \", [\"operator\", \"!=\"], \" 2\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n4 \", [\"operator\", \"<\"], \" 2\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n4 \", [\"operator\", \"<=\"], \" 2\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n4 \", [\"operator\", \">\"], \" 2\", [\"punctuation\", \";\"],\r\n\t\"\\r\\n4 \", [\"operator\", \">=\"], \" 2\", [\"punctuation\", \";\"],\r\n\r\n\t[\"boolean\", \"true\"], [\"operator\", \"and\"], [\"boolean\", \"false\"],\r\n\t[\"boolean\", \"false\"], [\"operator\", \"or\"], [\"boolean\", \"true\"],\r\n\t[\"operator\", \"not\"], [\"boolean\", \"true\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/scss/placeholder_feature.test",
    "content": "%foobar\r\n%foo-bar\r\n%foo_bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"placeholder\", \"%foobar\"],\r\n\t[\"placeholder\", \"%foo-bar\"],\r\n\t[\"placeholder\", \"%foo_bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for placeholders."
  },
  {
    "path": "tests/languages/scss/property_feature.test",
    "content": "$bg: background;\r\n$color: color;\r\ndiv {\r\n\t$bg: none;\r\n\tbackground-#{$color}: blue;\r\n\t#{$bg}-repeat: no-repeat;\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", [[\"variable\", \"$bg\"]]], [\"punctuation\", \":\"], \" background\", [\"punctuation\", \";\"],\r\n\t[\"property\", [[\"variable\", \"$color\"]]], [\"punctuation\", \":\"], \" color\", [\"punctuation\", \";\"],\r\n\t[\"selector\", [\"div \"]], [\"punctuation\", \"{\"],\r\n\t[\"property\", [[\"variable\", \"$bg\"]]], [\"punctuation\", \":\"], \" none\", [\"punctuation\", \";\"],\r\n\t[\"property\", [\"background-\", [\"variable\", \"#{$color}\"]]], [\"punctuation\", \":\"], \" blue\", [\"punctuation\", \";\"],\r\n\t[\"property\", [[\"variable\", \"#{$bg}\"], \"-repeat\"]], [\"punctuation\", \":\"], \" no-repeat\", [\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties."
  },
  {
    "path": "tests/languages/scss/selector_feature.test",
    "content": "a {}\r\np, div {}\r\n#foobar .foo {}\r\n&:hover {}\r\n&-sidebar {}\r\n#context a%extreme {}\r\n#{$selector}:before {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"selector\", [\"a \"]], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"selector\", [\"p, div \"]], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"selector\", [\"#foobar .foo \"]], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"selector\", [[\"parent\", \"&\"], \":hover \"]], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"selector\", [[\"parent\", \"&\"], \"-sidebar \"]], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"selector\", [\"#context a\", [\"placeholder\", \"%extreme\"]]], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"],\r\n\t[\"selector\", [[\"variable\", \"#{$selector}\"], \":before \"]], [\"punctuation\", \"{\"], [\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for selectors."
  },
  {
    "path": "tests/languages/scss/statement_feature.test",
    "content": "$foo: \"bar\" !default;\r\n@extend .baz !optional;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", [[\"variable\", \"$foo\"]]],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"string\", \"\\\"bar\\\"\"],\r\n\t[\"statement\", \"!default\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"@extend\"],\r\n\t\" .baz \",\r\n\t[\"statement\", \"!optional\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for statements."
  },
  {
    "path": "tests/languages/scss/url_feature.test",
    "content": "url('foo.png')\r\nfont-url('foo.ttf')\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"url\", \"url\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"'foo.png'\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"url\", \"font-url\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"'foo.ttf'\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for URLs."
  },
  {
    "path": "tests/languages/scss/variable_feature.test",
    "content": "$foo\r\n$foo-bar\r\n$foo_bar\r\n#{$foo}\r\n#{$foo-bar}\r\n#{$foo_bar}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"variable\", \"$foo-bar\"],\r\n\t[\"variable\", \"$foo_bar\"],\r\n\t[\"variable\", \"#{$foo}\"],\r\n\t[\"variable\", \"#{$foo-bar}\"],\r\n\t[\"variable\", \"#{$foo_bar}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/scss+haml/scss_inclusion.test",
    "content": ":scss\r\n\t#main {\r\n\t\twidth: $width;\r\n\t}\r\n\r\n~\r\n\t:scss\r\n\t  #main {\r\n\t    width: $width;\r\n\t  }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-scss\", [\r\n\t\t[\"filter-name\", \":scss\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"selector\", [\"#main \"]],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t\t[\"property\", [\"width\"]],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"variable\", \"$width\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"punctuation\", \"~\"],\r\n\r\n\t[\"filter-scss\", [\r\n\t\t[\"filter-name\", \":scss\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"selector\", [\"#main \"]],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\r\n\t\t\t[\"property\", [\"width\"]],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"variable\", \"$width\"],\r\n\t\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for CSS filter in Haml. The tilde serves only as a separator.\r\n"
  },
  {
    "path": "tests/languages/scss+pug/scss_inclusion.test",
    "content": ":sass\r\n  @extend .foo;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-sass\", [\r\n\t\t[\"filter-name\", \":sass\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"keyword\", \"@extend\"],\r\n\t\t\t\" .foo\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for sass filter (Scss) in pug.\r\n"
  },
  {
    "path": "tests/languages/shell-session/command_feature.test",
    "content": "$ git checkout master\r\nSwitched to branch 'master'\r\nYour branch is up-to-date with 'origin/master'.\r\n$ git push\r\nEverything up-to-date\r\n# echo \"root\"\r\nroot\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"command\", [\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"function\", \"git\"],\r\n\t\t\t\" checkout master\"\r\n\t\t]]\r\n\t]],\r\n\t[\"output\", \"Switched to branch 'master'\\r\\nYour branch is up-to-date with 'origin/master'.\\r\\n\"],\r\n\r\n\t[\"command\", [\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"function\", \"git\"],\r\n\t\t\t\" push\"\r\n\t\t]]\r\n\t]],\r\n\t[\"output\", \"Everything up-to-date\\r\\n\"],\r\n\r\n\t[\"command\", [\r\n\t\t[\"shell-symbol\", \"#\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"builtin\", \"echo\"],\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"root\\\"\"\r\n\t\t\t]]\r\n\t\t]]\r\n\t]],\r\n\t[\"output\", \"root\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for commands.\r\n"
  },
  {
    "path": "tests/languages/shell-session/command_string_feature.test",
    "content": "$ echo 'Foo\r\n> Bar'\r\n\r\n$ echo \"Foo\r\n> Bar\"\r\n\r\n$ echo <<- STRING_END\r\nfoo\r\nbar\r\nSTRING_END\r\n\r\n$ echo <<- \"STRING_END\"\r\nfoo\r\nbar\r\nSTRING_END\r\n\r\n$ echo \\'a # '\r\n\r\n$ cat << \"EOF\" > /etc/ipsec.secrets\r\n: RSA vpn-server-a.key\r\n# : RSA vpn-server-b.key\r\nEOF\r\n\r\n$ LC_ALL=C tr -cd 'a-zA-Z0-9_-;:!?.@\\\\*/#%$' < /dev/random | head -c 8\r\ny_#!$U48\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"command\", [\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"builtin\", \"echo\"],\r\n\t\t\t[\"string\", \"'Foo\\r\\n> Bar'\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"builtin\", \"echo\"],\r\n\t\t\t[\"string\", [\"\\\"Foo\\r\\n> Bar\\\"\"]]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"builtin\", \"echo\"],\r\n\t\t\t[\"operator\", [\"<<-\"]],\r\n\t\t\t[\"string\", [\"STRING_END\\r\\nfoo\\r\\nbar\\r\\nSTRING_END\"]]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"builtin\", \"echo\"],\r\n\t\t\t[\"operator\", [\"<<-\"]],\r\n\t\t\t[\"string\", [\"\\\"STRING_END\\\"\\r\\nfoo\\r\\nbar\\r\\nSTRING_END\"]]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"builtin\", \"echo\"],\r\n\t\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t\t\"'a \",\r\n\t\t\t[\"comment\", \"# '\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"function\", \"cat\"],\r\n\t\t\t[\"operator\", [\"<<\"]],\r\n\t\t\t[\"string\", [\r\n\t\t\t\t\"\\\"EOF\\\"\",\r\n\t\t\t\t[\"bash\", [\r\n\t\t\t\t\t[\"operator\", [\">\"]],\r\n\t\t\t\t\t\" /etc/ipsec.secrets\"\r\n\t\t\t\t]],\r\n\r\n\t\t\t\t\"\\r\\n: RSA vpn-server-a.key\\r\\n# : RSA vpn-server-b.key\\r\\nEOF\"\r\n\t\t\t]]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"assign-left\", [\r\n\t\t\t\t[\"environment\", \"LC_ALL\"]\r\n\t\t\t]],\r\n\t\t\t[\"operator\", [\"=\"]],\r\n\t\t\t\"C \",\r\n\t\t\t[\"function\", \"tr\"],\r\n\t\t\t[\"parameter\", \"-cd\"],\r\n\t\t\t[\"string\", \"'a-zA-Z0-9_-;:!?.@\\\\\\\\*/#%$'\"],\r\n\t\t\t[\"operator\", [\"<\"]],\r\n\t\t\t\" /dev/random \",\r\n\t\t\t[\"operator\", [\"|\"]],\r\n\t\t\t[\"function\", \"head\"],\r\n\t\t\t[\"parameter\", \"-c\"],\r\n\t\t\t[\"number\", \"8\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"output\", \"y_#!$U48\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for multi-line strings inside commands.\r\n"
  },
  {
    "path": "tests/languages/shell-session/info_feature.test",
    "content": "foo@bar:/var/local$ cd ~\r\nfoo@bar:~$ sudo -i\r\n[sudo] password for foo:\r\nroot@bar:~# echo \"hello!\"\r\nhello!\r\n\r\nfoo@bar$ zsh\r\nfoo@bar% exit\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"command\", [\r\n\t\t[\"info\", [\r\n\t\t\t[\"user\", \"foo@bar\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"path\", \"/var/local\"]\r\n\t\t]],\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"builtin\", \"cd\"],\r\n\t\t\t\" ~\"\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"info\", [\r\n\t\t\t[\"user\", \"foo@bar\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"path\", \"~\"]\r\n\t\t]],\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"function\", \"sudo\"],\r\n\t\t\t[\"parameter\", \"-i\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"output\", \"[sudo] password for foo:\\r\\n\"],\r\n\t[\"command\", [\r\n\t\t[\"info\", [\r\n\t\t\t[\"user\", \"root@bar\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"path\", \"~\"]\r\n\t\t]],\r\n\t\t[\"shell-symbol\", \"#\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"builtin\", \"echo\"],\r\n\t\t\t[\"string\", [\"\\\"hello!\\\"\"]]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"output\", \"hello!\\r\\n\\r\\n\"],\r\n\t[\"command\", [\r\n\t\t[\"info\", [\r\n\t\t\t[\"user\", \"foo@bar\"]\r\n\t\t]],\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"function\", \"zsh\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"command\", [\r\n\t\t[\"info\", [\r\n\t\t\t[\"user\", \"foo@bar\"]\r\n\t\t]],\r\n\t\t[\"shell-symbol\", \"%\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"builtin\", \"exit\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for the info bash outputs."
  },
  {
    "path": "tests/languages/shell-session/issue2644.test",
    "content": "$ export BORG_PASSCOMMAND=\"security find-generic-password -a $USER -s borg-passphrase -w\"\n$ export BORG_RSH=\"ssh -i ~/.ssh/borg\"\n$ borg init --encryption=keyfile-blake2 \"borg@1.2.3.4:backup\"\n\nBy default repositories initialized with this version will produce security\nerrors if written to with an older version (up to and including Borg 1.0.8).\n\nIf you want to use these older versions, you can disable the check by running:\nborg upgrade --disable-tam ssh://borg@1.2.3.4/./backup\n\nSee https://borgbackup.readthedocs.io/en/stable/changes.html#pre-1-0-9-manifest-spoofing-vulnerability for details about the security implications.\n\nIMPORTANT: you will need both KEY AND PASSPHRASE to access this repo!\nUse \"borg key export\" to export the key, optionally in printable format.\nWrite down the passphrase. Store both at safe place(s).\n\n---\n\n----------------------------------------------------\n\n[\n\t[\"command\", [\n\t\t[\"shell-symbol\", \"$\"],\n\t\t[\"bash\", [\n\t\t\t[\"builtin\", \"export\"],\n\t\t\t[\"assign-left\", [\"BORG_PASSCOMMAND\"]],\n\t\t\t[\"operator\", [\"=\"]],\n\t\t\t[\"string\", [\n\t\t\t\t\"\\\"security find-generic-password -a \",\n\t\t\t\t[\"environment\", \"$USER\"],\n\t\t\t\t\" -s borg-passphrase -w\\\"\"\n\t\t\t]]\n\t\t]]\n\t]],\n\t[\"command\", [\n\t\t[\"shell-symbol\", \"$\"],\n\t\t[\"bash\", [\n\t\t\t[\"builtin\", \"export\"],\n\t\t\t[\"assign-left\", [\"BORG_RSH\"]],\n\t\t\t[\"operator\", [\"=\"]],\n\t\t\t[\"string\", [\"\\\"ssh -i ~/.ssh/borg\\\"\"]]\n\t\t]]\n\t]],\n\t[\"command\", [\n\t\t[\"shell-symbol\", \"$\"],\n\t\t[\"bash\", [\n\t\t\t\"borg init \",\n\t\t\t[\"parameter\", \"--encryption\"],\n\t\t\t[\"operator\", [\"=\"]],\n\t\t\t\"keyfile-blake2 \",\n\t\t\t[\"string\", [\"\\\"borg@1.2.3.4:backup\\\"\"]]\n\t\t]]\n\t]],\n\n\t[\"output\", \"By default repositories initialized with this version will produce security\\r\\nerrors if written to with an older version (up to and including Borg 1.0.8).\\r\\n\\r\\nIf you want to use these older versions, you can disable the check by running:\\r\\nborg upgrade --disable-tam ssh://borg@1.2.3.4/./backup\\r\\n\\r\\nSee https://borgbackup.readthedocs.io/en/stable/changes.html#pre-1-0-9-manifest-spoofing-vulnerability for details about the security implications.\\r\\n\\r\\nIMPORTANT: you will need both KEY AND PASSPHRASE to access this repo!\\r\\nUse \\\"borg key export\\\" to export the key, optionally in printable format.\\r\\nWrite down the passphrase. Store both at safe place(s).\\r\\n\\r\\n---\"]\n]\n"
  },
  {
    "path": "tests/languages/shell-session/issue2685.test",
    "content": "/home/user$ echo \"Hello World\"\r\nHello World\r\n/home/user$ exit\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"command\", [\r\n\t\t[\"info\", [\r\n\t\t\t[\"path\", \"/home/user\"]\r\n\t\t]],\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"builtin\", \"echo\"],\r\n\t\t\t[\"string\", [\"\\\"Hello World\\\"\"]]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"output\", \"Hello World\\r\\n\"],\r\n\t[\"command\", [\r\n\t\t[\"info\", [\r\n\t\t\t[\"path\", \"/home/user\"]\r\n\t\t]],\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"builtin\", \"exit\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/shell-session/issue2871.test",
    "content": "fyu@home $ sudo ls -l ~/.config 's' && \\\r\n  echo 'hello'\r\ndrwxr-xr-x     - franklinyu 26 Sep  2020  asciinema\r\ndrwxr-xr-x     - franklinyu 26 Jan  2020  'bash'\r\nhello\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"command\", [\r\n\t\t[\"info\", [\r\n\t\t\t[\"user\", \"fyu@home \"]\r\n\t\t]],\r\n\t\t[\"shell-symbol\", \"$\"],\r\n\t\t[\"bash\", [\r\n\t\t\t[\"function\", \"sudo\"],\r\n\t\t\t[\"function\", \"ls\"],\r\n\t\t\t[\"parameter\", \"-l\"],\r\n\t\t\t\" ~/.config \",\r\n\t\t\t[\"string\", \"'s'\"],\r\n\t\t\t[\"operator\", [\"&&\"]],\r\n\t\t\t[\"punctuation\", \"\\\\\"],\r\n\r\n\t\t\t[\"builtin\", \"echo\"],\r\n\t\t\t[\"string\", \"'hello'\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"output\", \"drwxr-xr-x     - franklinyu 26 Sep  2020  asciinema\\r\\ndrwxr-xr-x     - franklinyu 26 Jan  2020  'bash'\\r\\nhello\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/shell-session/issue3047_1.test",
    "content": "$ diskutil list\n/dev/disk0 (internal, physical):\n   #:                       TYPE NAME                    SIZE       IDENTIFIER\n   0:      GUID_partition_scheme                        *500.3 GB   disk0\n   1:                        EFI EFI                     209.7 MB   disk0s1\n   2:                 Apple_APFS Container disk1         500.1 GB   disk0s2\n\n/dev/disk1 (synthesized):\n   #:                       TYPE NAME                    SIZE       IDENTIFIER\n   0:      APFS Container Scheme -                      +500.1 GB   disk1\n                                 Physical Store disk0s2\n   1:                APFS Volume Macintosh HD - Data     340.9 GB   disk1s1\n   2:                APFS Volume Preboot                 85.9 MB    disk1s2\n   3:                APFS Volume Recovery                529.0 MB   disk1s3\n   4:                APFS Volume VM                      3.2 GB     disk1s4\n   5:                APFS Volume Macintosh HD            11.3 GB    disk1s5\n\n/dev/disk2 (internal, physical):\n   #:                       TYPE NAME                    SIZE       IDENTIFIER\n   0:     FDisk_partition_scheme                        *15.9 GB    disk2\n   1:             Windows_FAT_32 boot                    268.4 MB   disk2s1\n   2:                      Linux                         15.7 GB    disk2s2\n\n$ sudo diskutil unmount /dev/diskn\ndisk2 was already unmounted or it has a partitioning scheme so use \"diskutil unmountDisk\" instead\n\n$ sudo diskutil unmountDisk /dev/diskn (if previous step fails)\nUnmount of all volumes on disk2 was successful\n\n$ sudo dd bs=1m if=$HOME/Downloads/tails-amd64-4.18.img of=/dev/rdiskn\n1131+0 records in\n1131+0 records out\n1185939456 bytes transferred in 44.708618 secs (26525970 bytes/sec)\n\n$ sudo diskutil unmountDisk /dev/diskn\nUnmount of all volumes on disk2 was successful\n\n----------------------------------------------------\n\n[\n\t[\"command\", [\n\t\t[\"shell-symbol\", \"$\"],\n\t\t[\"bash\", [\"diskutil list\"]]\n\t]],\n\n\t[\"output\", \"/dev/disk0 (internal, physical):\\r\\n   #:                       TYPE NAME                    SIZE       IDENTIFIER\\r\\n   0:      GUID_partition_scheme                        *500.3 GB   disk0\\r\\n   1:                        EFI EFI                     209.7 MB   disk0s1\\r\\n   2:                 Apple_APFS Container disk1         500.1 GB   disk0s2\\r\\n\\r\\n/dev/disk1 (synthesized):\\r\\n   #:                       TYPE NAME                    SIZE       IDENTIFIER\\r\\n   0:      APFS Container Scheme -                      +500.1 GB   disk1\\r\\n                                 Physical Store disk0s2\\r\\n   1:                APFS Volume Macintosh HD - Data     340.9 GB   disk1s1\\r\\n   2:                APFS Volume Preboot                 85.9 MB    disk1s2\\r\\n   3:                APFS Volume Recovery                529.0 MB   disk1s3\\r\\n   4:                APFS Volume VM                      3.2 GB     disk1s4\\r\\n   5:                APFS Volume Macintosh HD            11.3 GB    disk1s5\\r\\n\\r\\n/dev/disk2 (internal, physical):\\r\\n   #:                       TYPE NAME                    SIZE       IDENTIFIER\\r\\n   0:     FDisk_partition_scheme                        *15.9 GB    disk2\\r\\n   1:             Windows_FAT_32 boot                    268.4 MB   disk2s1\\r\\n   2:                      Linux                         15.7 GB    disk2s2\\r\\n\\r\\n\"],\n\t[\"command\", [\n\t\t[\"shell-symbol\", \"$\"],\n\t\t[\"bash\", [\n\t\t\t[\"function\", \"sudo\"],\n\t\t\t\" diskutil unmount /dev/diskn\"\n\t\t]]\n\t]],\n\n\t[\"output\", \"disk2 was already unmounted or it has a partitioning scheme so use \\\"diskutil unmountDisk\\\" instead\\r\\n\\r\\n\"],\n\t[\"command\", [\n\t\t[\"shell-symbol\", \"$\"],\n\t\t[\"bash\", [\n\t\t\t[\"function\", \"sudo\"],\n\t\t\t\" diskutil unmountDisk /dev/diskn \",\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"if previous step fails\",\n\t\t\t[\"punctuation\", \")\"]\n\t\t]]\n\t]],\n\n\t[\"output\", \"Unmount of all volumes on disk2 was successful\\r\\n\\r\\n\"],\n\t[\"command\", [\n\t\t[\"shell-symbol\", \"$\"],\n\t\t[\"bash\", [\n\t\t\t[\"function\", \"sudo\"],\n\t\t\t[\"function\", \"dd\"],\n\t\t\t[\"assign-left\", [\"bs\"]],\n\t\t\t[\"operator\", [\"=\"]],\n\t\t\t\"1m \",\n\t\t\t[\"assign-left\", [\"if\"]],\n\t\t\t[\"operator\", [\"=\"]],\n\t\t\t[\"environment\", \"$HOME\"],\n\t\t\t\"/Downloads/tails-amd64-4.18.img \",\n\t\t\t[\"assign-left\", [\"of\"]],\n\t\t\t[\"operator\", [\"=\"]],\n\t\t\t\"/dev/rdiskn\"\n\t\t]]\n\t]],\n\n\t[\"output\", \"1131+0 records in\\r\\n1131+0 records out\\r\\n1185939456 bytes transferred in 44.708618 secs (26525970 bytes/sec)\\r\\n\\r\\n\"],\n\t[\"command\", [\n\t\t[\"shell-symbol\", \"$\"],\n\t\t[\"bash\", [\n\t\t\t[\"function\", \"sudo\"],\n\t\t\t\" diskutil unmountDisk /dev/diskn\"\n\t\t]]\n\t]],\n\n\t[\"output\", \"Unmount of all volumes on disk2 was successful\"]\n]\n"
  },
  {
    "path": "tests/languages/shell-session/issue3047_2.test",
    "content": "$ gpg --card-status\nReader ...........: Yubico YubiKey CCID\nApplication ID ...: D*******************************\nApplication type .: OpenPGP\nVersion ..........: 0.0\nManufacturer .....: Yubico\nSerial number ....: 1*******\nName of cardholder: John Doe\nLanguage prefs ...: en\nSalutation .......:\nURL of public key : [not set]\nLogin data .......: john@example.net\nSignature PIN ....: not forced\nKey attributes ...: ed25519 cv25519 ed25519\nMax. PIN lengths .: 127 127 127\nPIN retry counter : 3 0 3\nSignature counter : 0\nKDF setting ......: off\nUIF setting ......: Sign=on Decrypt=on Auth=on\nSignature key ....: ACE1 3F15 90C1 A8C9 D942  51E3 02ED C61B 6543 509B\n      created ....: 2021-07-21 18:44:34\nEncryption key....: 0524 00F4 8E1D 085A F3E1  61EC D463 4E0D 6E2D D8BF\n      created ....: 2021-07-21 18:44:52\nAuthentication key: A27B 582F 1F62 03BA 549B  3D44 1E7B 69B2 38FF A21B\n      created ....: 2021-07-21 18:45:13\nGeneral key info..: sub  ed25519/0x02EDC61B6543509B 2021-07-21 John Doe <john@example.net>\nsec#  ed25519/0xC2709D13BAB4763C  created: 2021-07-21  expires: never\nssb>  ed25519/0x02EDC61B6543509B  created: 2021-07-21  expires: 2022-07-21\n                                  card-no: 0006 1*******\nssb>  cv25519/0xD4634E0D6E2DD8BF  created: 2021-07-21  expires: 2022-07-21\n                                  card-no: 0006 1*******\nssb>  ed25519/0x1E7B69B238FFA21B  created: 2021-07-21  expires: 2022-07-21\n                                  card-no: 0006 1*******\n\n----------------------------------------------------\n\n[\n\t[\"command\", [\n\t\t[\"shell-symbol\", \"$\"],\n\t\t[\"bash\", [\"gpg --card-status\"]]\n\t]],\n\t[\"output\", \"Reader ...........: Yubico YubiKey CCID\\r\\nApplication ID ...: D*******************************\\r\\nApplication type .: OpenPGP\\r\\nVersion ..........: 0.0\\r\\nManufacturer .....: Yubico\\r\\nSerial number ....: 1*******\\r\\nName of cardholder: John Doe\\r\\nLanguage prefs ...: en\\r\\nSalutation .......:\\r\\nURL of public key : [not set]\\r\\nLogin data .......: john@example.net\\r\\nSignature PIN ....: not forced\\r\\nKey attributes ...: ed25519 cv25519 ed25519\\r\\nMax. PIN lengths .: 127 127 127\\r\\nPIN retry counter : 3 0 3\\r\\nSignature counter : 0\\r\\nKDF setting ......: off\\r\\nUIF setting ......: Sign=on Decrypt=on Auth=on\\r\\nSignature key ....: ACE1 3F15 90C1 A8C9 D942  51E3 02ED C61B 6543 509B\\r\\n      created ....: 2021-07-21 18:44:34\\r\\nEncryption key....: 0524 00F4 8E1D 085A F3E1  61EC D463 4E0D 6E2D D8BF\\r\\n      created ....: 2021-07-21 18:44:52\\r\\nAuthentication key: A27B 582F 1F62 03BA 549B  3D44 1E7B 69B2 38FF A21B\\r\\n      created ....: 2021-07-21 18:45:13\\r\\nGeneral key info..: sub  ed25519/0x02EDC61B6543509B 2021-07-21 John Doe <john@example.net>\\r\\nsec#  ed25519/0xC2709D13BAB4763C  created: 2021-07-21  expires: never\\r\\nssb>  ed25519/0x02EDC61B6543509B  created: 2021-07-21  expires: 2022-07-21\\r\\n                                  card-no: 0006 1*******\\r\\nssb>  cv25519/0xD4634E0D6E2DD8BF  created: 2021-07-21  expires: 2022-07-21\\r\\n                                  card-no: 0006 1*******\\r\\nssb>  ed25519/0x1E7B69B238FFA21B  created: 2021-07-21  expires: 2022-07-21\\r\\n                                  card-no: 0006 1*******\"]\n]\n"
  },
  {
    "path": "tests/languages/smali/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/smali/builtin_feature.test",
    "content": "new-array v0, v0, [I\n\n.method static constructor <clinit>()V\n\n.field mWifiOnUid:I\n\n.field public static mWifiRunning:Z = false\n.field public static final PI:D = 3.141592653589793\n\n.field static final LOG_TAG:Ljava/lang/String; = \"CDMA\"\n\n----------------------------------------------------\n\n[\n\t\"new-array \",\n\t[\"register\", \"v0\"],\n\t[\"punctuation\", \",\"],\n\t[\"register\", \"v0\"],\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \"[\"],\n\t[\"builtin\", \"I\"],\n\n\t[\"keyword\", \".method\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"constructor\"],\n\t[\"function\", \"<clinit>\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"builtin\", \"V\"],\n\n\t[\"keyword\", \".field\"],\n\t[\"field\", \"mWifiOnUid\"],\n\t[\"punctuation\", \":\"],\n\t[\"builtin\", \"I\"],\n\n\t[\"keyword\", \".field\"],\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"static\"],\n\t[\"field\", \"mWifiRunning\"],\n\t[\"punctuation\", \":\"],\n\t[\"builtin\", \"Z\"],\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"false\"],\n\n\t[\"keyword\", \".field\"],\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"final\"],\n\t[\"field\", \"PI\"],\n\t[\"punctuation\", \":\"],\n\t[\"builtin\", \"D\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"3.141592653589793\"],\n\n\t[\"keyword\", \".field\"],\n\t[\"keyword\", \"static\"],\n\t[\"keyword\", \"final\"],\n\t[\"field\", \"LOG_TAG\"],\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t[\"builtin\", \"L\"],\n\t\t[\"namespace\", [\n\t\t\t\"java\",\n\t\t\t[\"punctuation\", \"/\"],\n\t\t\t\"lang\",\n\t\t\t[\"punctuation\", \"/\"]\n\t\t]],\n\t\t[\"class-name\", \"String\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"CDMA\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/smali/class-name_feature.test",
    "content": "LMain;\r\nLjava/lang/String;\r\nLfoo/bar/Foo$Bar;\r\nLFoo$Bar;\r\n\r\nLjava/lang/String;\r\nLI;\r\nLV;\r\nLI/I/I;\r\nL`single`;\r\nL`java`/lang/String;\r\nL`java`/`lang`/`String`;\r\nLspace/test/`20 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 202f 205f 3000　`;\r\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"class-name\", \"Main\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"java\",\r\n\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\"lang\",\r\n\t\t\t[\"punctuation\", \"/\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"String\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \"/\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"Foo$Bar\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"class-name\", \"Foo$Bar\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"java\",\r\n\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\"lang\",\r\n\t\t\t[\"punctuation\", \"/\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"String\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"class-name\", \"I\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"class-name\", \"V\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"I\",\r\n\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\"I\",\r\n\t\t\t[\"punctuation\", \"/\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"I\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"class-name\", \"`single`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"`java`\",\r\n\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\"lang\",\r\n\t\t\t[\"punctuation\", \"/\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"String\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"`java`\",\r\n\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\"`lang`\",\r\n\t\t\t[\"punctuation\", \"/\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"`String`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"space\",\r\n\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\"test\",\r\n\t\t\t[\"punctuation\", \"/\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"`20 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 202f 205f 3000　`\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names.\r\n"
  },
  {
    "path": "tests/languages/smali/comment_feature.test",
    "content": "# comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"# comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/smali/field_feature.test",
    "content": "foo:\r\n$VALUES:\r\n12:\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"field\", \"foo\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"field\", \"$VALUES\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"field\", \"12\"],\r\n\t[\"punctuation\", \":\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for fields.\r\n"
  },
  {
    "path": "tests/languages/smali/function_feature.test",
    "content": "foo()V\r\n<init>(Ljava/lang/String;I)V\r\n<clinit>()V\r\n\r\n# a complex method\r\nmethod(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"V\"],\r\n\r\n\t[\"function\", \"<init>\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"java\",\r\n\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\"lang\",\r\n\t\t\t[\"punctuation\", \"/\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"String\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"builtin\", \"I\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"V\"],\r\n\r\n\t[\"function\", \"<clinit>\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"V\"],\r\n\r\n\t[\"comment\", \"# a complex method\"],\r\n\r\n\t[\"function\", \"method\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"I\"],\r\n\t[\"operator\", \"[\"],\r\n\t[\"operator\", \"[\"],\r\n\t[\"builtin\", \"II\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"java\",\r\n\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\"lang\",\r\n\t\t\t[\"punctuation\", \"/\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"String\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"operator\", \"[\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"java\",\r\n\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\"lang\",\r\n\t\t\t[\"punctuation\", \"/\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"Object\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin\", \"L\"],\r\n\t\t[\"namespace\", [\r\n\t\t\t\"java\",\r\n\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\"lang\",\r\n\t\t\t[\"punctuation\", \"/\"]\r\n\t\t]],\r\n\t\t[\"class-name\", \"String\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions/methods.\r\n"
  },
  {
    "path": "tests/languages/smali/keyword_feature.test",
    "content": "abstract\r\nannotation\r\nbridge\r\nconstructor\r\nenum\r\nfinal\r\ninterface\r\nprivate\r\nprotected\r\npublic\r\nruntime\r\nstatic\r\nsynthetic\r\nsystem\r\ntransient\r\n\r\n.something\r\n.end something\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"annotation\"],\r\n\t[\"keyword\", \"bridge\"],\r\n\t[\"keyword\", \"constructor\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"runtime\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"synthetic\"],\r\n\t[\"keyword\", \"system\"],\r\n\t[\"keyword\", \"transient\"],\r\n\t[\"keyword\", \".something\"],\r\n\t[\"keyword\", \".end\"],\r\n\t[\"keyword\", \"something\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/smali/label_feature.test",
    "content": ".line 989\n:cond_2b\n\ngoto :goto_1f\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \".line\"], [\"number\", \"989\"],\n\t[\"punctuation\", \":\"], [\"label\", \"cond_2b\"],\n\n\t\"\\r\\n\\r\\ngoto \", [\"punctuation\", \":\"], [\"label\", \"goto_1f\"]\n]\n"
  },
  {
    "path": "tests/languages/smali/number_feature.test",
    "content": "123\r\n-123\r\n123t\r\n123s\r\n123l\r\n123T\r\n123S\r\n123L\r\n\r\n123f\r\n123.0f\r\n123.0\r\n-1234e-9\r\n.2e-2\r\n-.2e-2\r\n-1234.D\r\n.2f\r\n\r\n0xFF\r\n0xFFt\r\n0x0FFs\r\n0x0FFl\r\n0x123ABCp-1D\r\n0x12AB.12ABp10d\r\n\r\ninfinity\r\ninfinityd\r\ninfinityf\r\ninfinityD\r\ninfinityF\r\n\r\nINFINITY\r\nINFINITYd\r\nINFINITYf\r\nINFINITYD\r\nINFINITYF\r\n\r\nNaN\r\nNaNd\r\nNaNf\r\nNaND\r\nNaNF\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"-123\"],\r\n\t[\"number\", \"123t\"],\r\n\t[\"number\", \"123s\"],\r\n\t[\"number\", \"123l\"],\r\n\t[\"number\", \"123T\"],\r\n\t[\"number\", \"123S\"],\r\n\t[\"number\", \"123L\"],\r\n\t[\"number\", \"123f\"],\r\n\t[\"number\", \"123.0f\"],\r\n\t[\"number\", \"123.0\"],\r\n\t[\"number\", \"-1234e-9\"],\r\n\t[\"number\", \".2e-2\"],\r\n\t[\"number\", \"-.2e-2\"],\r\n\t[\"number\", \"-1234.D\"],\r\n\t[\"number\", \".2f\"],\r\n\t[\"number\", \"0xFF\"],\r\n\t[\"number\", \"0xFFt\"],\r\n\t[\"number\", \"0x0FFs\"],\r\n\t[\"number\", \"0x0FFl\"],\r\n\t[\"number\", \"0x123ABCp-1D\"],\r\n\t[\"number\", \"0x12AB.12ABp10d\"],\r\n\t[\"number\", \"infinity\"],\r\n\t[\"number\", \"infinityd\"],\r\n\t[\"number\", \"infinityf\"],\r\n\t[\"number\", \"infinityD\"],\r\n\t[\"number\", \"infinityF\"],\r\n\t[\"number\", \"INFINITY\"],\r\n\t[\"number\", \"INFINITYd\"],\r\n\t[\"number\", \"INFINITYf\"],\r\n\t[\"number\", \"INFINITYD\"],\r\n\t[\"number\", \"INFINITYF\"],\r\n\t[\"number\", \"NaN\"],\r\n\t[\"number\", \"NaNd\"],\r\n\t[\"number\", \"NaNf\"],\r\n\t[\"number\", \"NaND\"],\r\n\t[\"number\", \"NaNF\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/smali/register_feature.test",
    "content": "move v1, p1\n\nmove v2, p2\n\nmove-object v4, p3\n\nmove v5, p4\n\n----------------------------------------------------\n\n[\n\t\"move \", [\"register\", \"v1\"], [\"punctuation\", \",\"], [\"register\", \"p1\"],\n\n\t\"\\r\\n\\r\\nmove \",\n\t[\"register\", \"v2\"],\n\t[\"punctuation\", \",\"],\n\t[\"register\", \"p2\"],\n\n\t\"\\r\\n\\r\\nmove-object \",\n\t[\"register\", \"v4\"],\n\t[\"punctuation\", \",\"],\n\t[\"register\", \"p3\"],\n\n\t\"\\r\\n\\r\\nmove \",\n\t[\"register\", \"v5\"],\n\t[\"punctuation\", \",\"],\n\t[\"register\", \"p4\"]\n]\n"
  },
  {
    "path": "tests/languages/smali/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n\r\n'c'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"'c'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and chars.\r\n"
  },
  {
    "path": "tests/languages/smalltalk/block-arguments_feature.test",
    "content": "[ :i |\r\n]\r\n[ :a :b |\r\n]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"block-arguments\", [\r\n\t\t[\"variable\", \":i\"],\r\n\t\t[\"punctuation\", \"|\"]\r\n\t]],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"block-arguments\", [\r\n\t\t[\"variable\", \":a\"],\r\n\t\t[\"variable\", \":b\"],\r\n\t\t[\"punctuation\", \"|\"]\r\n\t]],\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for block arguments."
  },
  {
    "path": "tests/languages/smalltalk/boolean_feature.test",
    "content": "true false\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n"
  },
  {
    "path": "tests/languages/smalltalk/char_feature.test",
    "content": "$a\n$4\n$.\n$^\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"$a\"],\n\t[\"char\", \"$4\"],\n\t[\"char\", \"$.\"],\n\t[\"char\", \"$^\"]\n]\n\n----------------------------------------------------\n\nChecks for characters.\n"
  },
  {
    "path": "tests/languages/smalltalk/comment_feature.test",
    "content": "\"foobar\"\r\n\"foo\"\"bar\r\nbaz\"\r\n\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"\\\"foobar\\\"\"],\r\n\t[\"comment\", \"\\\"foo\\\"\\\"bar\\r\\nbaz\\\"\"],\r\n\t[\"comment\", \"\\\"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/smalltalk/keyword_feature.test",
    "content": "nil\r\nself super new\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"nil\"],\r\n\t[\"keyword\", \"self\"], [\"keyword\", \"super\"], [\"keyword\", \"new\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/smalltalk/number_feature.test",
    "content": "42\r\n3.14159\r\n3e8\r\n0.2e-4\r\n2r10001111\r\n2r10.1111e4\r\n16rBADFACE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"3e8\"],\r\n\t[\"number\", \"0.2e-4\"],\r\n\t[\"number\", \"2r10001111\"],\r\n\t[\"number\", \"2r10.1111e4\"],\r\n\t[\"number\", \"16rBADFACE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/smalltalk/operator_feature.test",
    "content": ":=\r\n= ==\r\n~= ~~\r\n< <=\r\n> >> >=\r\n/ //\r\n\\\\\r\n! ^ +\r\n- * &\r\n| , @\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \":=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"],\r\n\t[\"operator\", \"~=\"], [\"operator\", \"~~\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">>\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"//\"],\r\n\t[\"operator\", \"\\\\\\\\\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"^\"], [\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \",\"], [\"operator\", \"@\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/smalltalk/string_char_feature.test",
    "content": "$'\n'foobar'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"$'\"],\n\t[\"string\", \"'foobar'\"]\n]\n\n----------------------------------------------------\n\nChecks a single-quote-character doesn't confuse string parsing.\n"
  },
  {
    "path": "tests/languages/smalltalk/string_feature.test",
    "content": "'foobar'\r\n'foo''bar\r\nbaz'\r\n''\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"'foobar'\"],\r\n\t[\"string\", \"'foo''bar\\r\\nbaz'\"],\r\n\t[\"string\", \"''\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/smalltalk/symbol_feature.test",
    "content": "#foo\r\n#Foo42\r\n#-\r\n#+\r\n#**\r\n#(\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"symbol\", \"#foo\"],\r\n\t[\"symbol\", \"#Foo42\"],\r\n\t[\"symbol\", \"#-\"],\r\n\t[\"symbol\", \"#+\"],\r\n\t[\"symbol\", \"#**\"],\r\n\t[\"symbol\", \"#\"], [\"punctuation\", \"(\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for symbols."
  },
  {
    "path": "tests/languages/smalltalk/temporary-variables_feature.test",
    "content": "| foo |\r\n| x y myVar z cnt |\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"temporary-variables\", [\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"punctuation\", \"|\"]\r\n\t]],\r\n\t[\"temporary-variables\", [\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"variable\", \"x\"],\r\n\t\t[\"variable\", \"y\"],\r\n\t\t[\"variable\", \"myVar\"],\r\n\t\t[\"variable\", \"z\"],\r\n\t\t[\"variable\", \"cnt\"],\r\n\t\t[\"punctuation\", \"|\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for temporary variables."
  },
  {
    "path": "tests/languages/smarty/attr-name_feature.test",
    "content": "{assign var=foo value=\"bar\"}\r\n{foo bar = 40}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"assign\"],\r\n\t\t[\"attr-name\", \"var\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"attr-name\", \"value\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\"\\\"bar\\\"\"]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"attr-name\", \"bar\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"40\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for attributes.\r\n"
  },
  {
    "path": "tests/languages/smarty/booelan_feature.test",
    "content": "{if false}\n{if off}\n{if on}\n{if no}\n{if true}\n{if yes}\n\n----------------------------------------------------\n\n[\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"keyword\", \"if\"],\n\t\t[\"boolean\", \"false\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"keyword\", \"if\"],\n\t\t[\"boolean\", \"off\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"keyword\", \"if\"],\n\t\t[\"boolean\", \"on\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"keyword\", \"if\"],\n\t\t[\"boolean\", \"no\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"keyword\", \"if\"],\n\t\t[\"boolean\", \"true\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"keyword\", \"if\"],\n\t\t[\"boolean\", \"yes\"],\n\t\t[\"delimiter\", \"}\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/smarty/comment_feature.test",
    "content": "{**}\r\n{* foo\r\nbar *}\r\n\r\n{* you cannot nest comments *}\r\n{* {* foo *} *}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"smarty-comment\", \"{**}\"],\r\n\t[\"smarty-comment\", \"{* foo\\r\\nbar *}\"],\r\n\r\n\t[\"smarty-comment\", \"{* you cannot nest comments *}\"],\r\n\t[\"smarty-comment\", \"{* {* foo *}\"], \" *}\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/smarty/function_feature.test",
    "content": "{if count($foo)}\r\n\t{$foo|@count}\r\n\t{$bar|lower}\r\n{/if}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"function\", \"count\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"@count\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$bar\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"lower\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{/\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags, filters and functions.\r\n"
  },
  {
    "path": "tests/languages/smarty/keyword_feature.test",
    "content": "{if count($foo)}\n{/if}\n\n{* PHP function *}\n{time()}\n\n----------------------------------------------------\n\n[\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"keyword\", \"if\"],\n\t\t[\"function\", \"count\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"variable\", \"$foo\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{/\"],\n\t\t[\"keyword\", \"if\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\n\t[\"smarty-comment\", \"{* PHP function *}\"],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"function\", \"time\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"delimiter\", \"}\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/smarty/number_feature.test",
    "content": "{0xBadFace}\r\n{42}\r\n{3.14159}\r\n{4e7}\r\n{5.4E-3}\r\n{2.0e+10}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"number\", \"0xBadFace\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"number\", \"3.14159\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"number\", \"4e7\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"number\", \"5.4E-3\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"number\", \"2.0e+10\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/smarty/operator_feature.test",
    "content": "{if $a + $b - $c == $d}\r\n{if $e * $f / $g % $h === $i}\r\n{if $j < $k and $l > $m eq $n <= $o and $p >= $q}\r\n{if !$r != $s && $t || $u}\r\n{if $v is not even by 3 or $v is even}\r\n{if $w is div by 2 or $w is not div by 3}\r\n{if $x is not odd or $x is odd by 4}\r\n{if $y ne $z or $a neq $b}\r\n{if $c gt $d or $e lt $f}\r\n{if $g gte $h or $i ge $j or $k lte $l or $m le $n}\r\n{if not $o and $p mod 4}\r\n{foo bar=baz}\r\n{$foo|upper}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"variable\", \"$a\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"variable\", \"$b\"],\r\n\t\t[\"operator\", \"-\"],\r\n\t\t[\"variable\", \"$c\"],\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"variable\", \"$d\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"variable\", \"$e\"],\r\n\t\t[\"operator\", \"*\"],\r\n\t\t[\"variable\", \"$f\"],\r\n\t\t[\"operator\", \"/\"],\r\n\t\t[\"variable\", \"$g\"],\r\n\t\t[\"operator\", \"%\"],\r\n\t\t[\"variable\", \"$h\"],\r\n\t\t[\"operator\", \"===\"],\r\n\t\t[\"variable\", \"$i\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"variable\", \"$j\"],\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"variable\", \"$k\"],\r\n\t\t[\"operator\", \"and\"],\r\n\t\t[\"variable\", \"$l\"],\r\n\t\t[\"operator\", \">\"],\r\n\t\t[\"variable\", \"$m\"],\r\n\t\t[\"operator\", \"eq\"],\r\n\t\t[\"variable\", \"$n\"],\r\n\t\t[\"operator\", \"<=\"],\r\n\t\t[\"variable\", \"$o\"],\r\n\t\t[\"operator\", \"and\"],\r\n\t\t[\"variable\", \"$p\"],\r\n\t\t[\"operator\", \">=\"],\r\n\t\t[\"variable\", \"$q\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"operator\", \"!\"],\r\n\t\t[\"variable\", \"$r\"],\r\n\t\t[\"operator\", \"!=\"],\r\n\t\t[\"variable\", \"$s\"],\r\n\t\t[\"operator\", \"&&\"],\r\n\t\t[\"variable\", \"$t\"],\r\n\t\t[\"operator\", \"||\"],\r\n\t\t[\"variable\", \"$u\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"variable\", \"$v\"],\r\n\t\t[\"operator\", \"is not even by\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"operator\", \"or\"],\r\n\t\t[\"variable\", \"$v\"],\r\n\t\t[\"operator\", \"is even\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"variable\", \"$w\"],\r\n\t\t[\"operator\", \"is div by\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"operator\", \"or\"],\r\n\t\t[\"variable\", \"$w\"],\r\n\t\t[\"operator\", \"is not div by\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"variable\", \"$x\"],\r\n\t\t[\"operator\", \"is not odd\"],\r\n\t\t[\"operator\", \"or\"],\r\n\t\t[\"variable\", \"$x\"],\r\n\t\t[\"operator\", \"is odd by\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"variable\", \"$y\"],\r\n\t\t[\"operator\", \"ne\"],\r\n\t\t[\"variable\", \"$z\"],\r\n\t\t[\"operator\", \"or\"],\r\n\t\t[\"variable\", \"$a\"],\r\n\t\t[\"operator\", \"neq\"],\r\n\t\t[\"variable\", \"$b\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"variable\", \"$c\"],\r\n\t\t[\"operator\", \"gt\"],\r\n\t\t[\"variable\", \"$d\"],\r\n\t\t[\"operator\", \"or\"],\r\n\t\t[\"variable\", \"$e\"],\r\n\t\t[\"operator\", \"lt\"],\r\n\t\t[\"variable\", \"$f\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"variable\", \"$g\"],\r\n\t\t[\"operator\", \"gte\"],\r\n\t\t[\"variable\", \"$h\"],\r\n\t\t[\"operator\", \"or\"],\r\n\t\t[\"variable\", \"$i\"],\r\n\t\t[\"operator\", \"ge\"],\r\n\t\t[\"variable\", \"$j\"],\r\n\t\t[\"operator\", \"or\"],\r\n\t\t[\"variable\", \"$k\"],\r\n\t\t[\"operator\", \"lte\"],\r\n\t\t[\"variable\", \"$l\"],\r\n\t\t[\"operator\", \"or\"],\r\n\t\t[\"variable\", \"$m\"],\r\n\t\t[\"operator\", \"le\"],\r\n\t\t[\"variable\", \"$n\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"operator\", \"not\"],\r\n\t\t[\"variable\", \"$o\"],\r\n\t\t[\"operator\", \"and\"],\r\n\t\t[\"variable\", \"$p\"],\r\n\t\t[\"operator\", \"mod\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"foo\"],\r\n\t\t[\"attr-name\", \"bar\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"variable\", \"baz\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"upper\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/smarty/php_feature.test",
    "content": "{php}\n   // including a php script directly from the template.\n   include('/path/to/display_weather.php');\n{/php}\n\n{* this template includes a {php} block that assign's the variable $varX *}\n{php}\n   global $foo, $bar;\n   if($foo == $bar){\n     echo 'This will be sent to browser';\n   }\n  // assign a variable to Smarty\n  $this->assign('varX','Toffee');\n{/php}\n{* output the variable *}\n<strong>{$varX}</strong> is my fav ice cream :-)\n\n----------------------------------------------------\n\n[\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"keyword\", \"php\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"embedded-php\", \"\\r\\n   // including a php script directly from the template.\\r\\n   include('/path/to/display_weather.php');\\r\\n\"],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{/\"],\n\t\t[\"keyword\", \"php\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\n\t[\"smarty-comment\", \"{* this template includes a {php} block that assign's the variable $varX *}\"],\n\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"keyword\", \"php\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"embedded-php\", \"\\r\\n   global $foo, $bar;\\r\\n   if($foo == $bar){\\r\\n     echo 'This will be sent to browser';\\r\\n   }\\r\\n  // assign a variable to Smarty\\r\\n  $this->assign('varX','Toffee');\\r\\n\"],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{/\"],\n\t\t[\"keyword\", \"php\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\n\t[\"smarty-comment\", \"{* output the variable *}\"],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"strong\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"variable\", \"$varX\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"strong\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\" is my fav ice cream :-)\"\n]\n"
  },
  {
    "path": "tests/languages/smarty/punctuation_feature.test",
    "content": "{foo\n\n( ) [ ] { }\n. : ,\n`\n->\n\n}\n\n----------------------------------------------------\n\n[\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"], [\"keyword\", \"foo\"],\n\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"punctuation\", \"]\"],\n\t\t[\"punctuation\", \"{\"],\n\t\t[\"punctuation\", \"}\"],\n\n\t\t[\"punctuation\", \".\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"punctuation\", \",\"],\n\n\t\t[\"punctuation\", \"`\"],\n\n\t\t[\"punctuation\", \"->\"],\n\n\t\t[\"delimiter\", \"}\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/smarty/smarty_in_markup_feature.test",
    "content": "<div>{$foo}</div>\r\n<div class=\"{$foo}\">\r\n___SMARTY1___{$foo}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"smarty\", [\r\n\t\t\t\t[\"delimiter\", \"{\"],\r\n\t\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\t[\"delimiter\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n___SMARTY1___\",\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Smarty inside Markup.\r\n"
  },
  {
    "path": "tests/languages/smarty/string_feature.test",
    "content": "{\"\"}\r\n{\"fo\\\"obar\"}\r\n{''}\r\n{'fo\\'obar'}\r\n{$foo=\"this is message {counter}\"}\r\n\r\n{func var=\"test $foo test\"}              // sees $foo\r\n{func var=\"test $foo_bar test\"}          // sees $foo_bar\r\n{func var=\"test `$foo[0]` test\"}         // sees $foo[0]\r\n{func var=\"test `$foo[bar]` test\"}       // sees $foo[bar]\r\n{func var=\"test $foo.bar test\"}          // sees $foo (not $foo.bar)\r\n{func var=\"test `$foo.bar` test\"}        // sees $foo.bar\r\n{func var=\"test `$foo.bar` test\"|escape} // modifiers outside quotes!\r\n{func var=\"test {$foo|escape} test\"}     // modifiers inside quotes!\r\n{func var=\"test {time()} test\"}          // PHP function result\r\n{func var=\"test {counter} test\"}         // plugin result\r\n\r\n{* will replace $tpl_name with value *}\r\n{include file=\"subdir/$tpl_name.tpl\"}\r\n\r\n{* does NOT replace $tpl_name *}\r\n{include file='subdir/$tpl_name.tpl'} // vars require double quotes!\r\n\r\n{* must have backticks as it contains a dot \".\" *}\r\n{cycle values=\"one,two,`$smarty.config.myval`\"}\r\n\r\n{* must have backticks as it contains a dot \".\" *}\r\n{include file=\"`$module.contact`.tpl\"}\r\n\r\n{* can use variable with dot syntax *}\r\n{include file=\"`$module.$view`.tpl\"}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"string\", [\"\\\"\\\"\"]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"string\", [\"\\\"fo\\\\\\\"obar\\\"\"]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"string\", \"''\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"string\", \"'fo\\\\'obar'\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"this is message \",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"{\"],\r\n\t\t\t\t[\"expression\", [\"counter\"]],\r\n\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t\"\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"func\"],\r\n\t\t[\"attr-name\", \"var\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"test \",\r\n\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\" test\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"              // sees $foo\\r\\n\",\r\n\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"func\"],\r\n\t\t[\"attr-name\", \"var\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"test \",\r\n\t\t\t[\"variable\", \"$foo_bar\"],\r\n\t\t\t\" test\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"          // sees $foo_bar\\r\\n\",\r\n\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"func\"],\r\n\t\t[\"attr-name\", \"var\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"test \",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"],\r\n\t\t\t\t[\"expression\", [\r\n\t\t\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t\t[\"number\", \"0\"],\r\n\t\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t\" test\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"         // sees $foo[0]\\r\\n\",\r\n\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"func\"],\r\n\t\t[\"attr-name\", \"var\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"test \",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"],\r\n\t\t\t\t[\"expression\", [\r\n\t\t\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t\t[\"variable\", \"bar\"],\r\n\t\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t\" test\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"       // sees $foo[bar]\\r\\n\",\r\n\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"func\"],\r\n\t\t[\"attr-name\", \"var\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"test \",\r\n\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\".bar test\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"          // sees $foo (not $foo.bar)\\r\\n\",\r\n\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"func\"],\r\n\t\t[\"attr-name\", \"var\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"test \",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"],\r\n\t\t\t\t[\"expression\", [\r\n\t\t\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\t[\"variable\", \"bar\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t\" test\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"        // sees $foo.bar\\r\\n\",\r\n\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"func\"],\r\n\t\t[\"attr-name\", \"var\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"test \",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"],\r\n\t\t\t\t[\"expression\", [\r\n\t\t\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\t[\"variable\", \"bar\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t\" test\\\"\"\r\n\t\t]],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"function\", \"escape\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\" // modifiers outside quotes!\\r\\n\",\r\n\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"func\"],\r\n\t\t[\"attr-name\", \"var\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"test \",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"{\"],\r\n\t\t\t\t[\"expression\", [\r\n\t\t\t\t\t[\"variable\", \"$foo\"],\r\n\t\t\t\t\t[\"operator\", \"|\"],\r\n\t\t\t\t\t[\"function\", \"escape\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t\" test\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"     // modifiers inside quotes!\\r\\n\",\r\n\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"func\"],\r\n\t\t[\"attr-name\", \"var\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"test \",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"{\"],\r\n\t\t\t\t[\"expression\", [\r\n\t\t\t\t\t[\"function\", \"time\"],\r\n\t\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t\" test\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"          // PHP function result\\r\\n\",\r\n\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"func\"],\r\n\t\t[\"attr-name\", \"var\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"test \",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"{\"],\r\n\t\t\t\t[\"expression\", [\"counter\"]],\r\n\t\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t\" test\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"         // plugin result\\r\\n\\r\\n\",\r\n\r\n\t[\"smarty-comment\", \"{* will replace $tpl_name with value *}\"],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"include\"],\r\n\t\t[\"attr-name\", \"file\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"subdir/\",\r\n\t\t\t[\"variable\", \"$tpl_name\"],\r\n\t\t\t\".tpl\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"smarty-comment\", \"{* does NOT replace $tpl_name *}\"],\r\n\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"include\"],\r\n\t\t[\"attr-name\", \"file\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"'subdir/$tpl_name.tpl'\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\" // vars require double quotes!\\r\\n\\r\\n\",\r\n\r\n\t[\"smarty-comment\", \"{* must have backticks as it contains a dot \\\".\\\" *}\"],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"cycle\"],\r\n\t\t[\"attr-name\", \"values\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"one,two,\",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"],\r\n\t\t\t\t[\"expression\", [\r\n\t\t\t\t\t[\"variable\", \"$smarty\"],\r\n\t\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\t[\"variable\", \"config\"],\r\n\t\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\t[\"variable\", \"myval\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t\"\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"smarty-comment\", \"{* must have backticks as it contains a dot \\\".\\\" *}\"],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"include\"],\r\n\t\t[\"attr-name\", \"file\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"\",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"],\r\n\t\t\t\t[\"expression\", [\r\n\t\t\t\t\t[\"variable\", \"$module\"],\r\n\t\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\t[\"variable\", \"contact\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t\".tpl\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"smarty-comment\", \"{* can use variable with dot syntax *}\"],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"include\"],\r\n\t\t[\"attr-name\", \"file\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", [\r\n\t\t\t\"\\\"\",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"],\r\n\t\t\t\t[\"expression\", [\r\n\t\t\t\t\t[\"variable\", \"$module\"],\r\n\t\t\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\t\t[\"variable\", \"$view\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"interpolation-punctuation\", \"`\"]\r\n\t\t\t]],\r\n\t\t\t\".tpl\\\"\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/smarty/variable_feature.test",
    "content": "{$foo}\r\n{$foo_bar42}\r\n{#pageTitle#}\r\n{$foo.bar.baz}\r\n{$foo->bar->baz}\r\n{$foo[row]}\r\n{$foo[$x+$x]}\r\n{$foo.a.$b.c}\r\n{$foo.a.{$b+4}.c}\r\n{$foo.a.{$b.c}}\r\n{$foo={counter}+3}\r\n{$foo->bar($baz,2,$bar)}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo_bar42\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"#pageTitle#\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"bar\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"baz\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \"->\"],\r\n\t\t[\"variable\", \"bar\"],\r\n\t\t[\"punctuation\", \"->\"],\r\n\t\t[\"variable\", \"baz\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"variable\", \"row\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"variable\", \"$x\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"variable\", \"$x\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"a\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"$b\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"c\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"a\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"variable\", \"$b\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"c\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"a\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"variable\", \"$b\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"variable\", \"c\"],\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t\"counter\",\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"smarty\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", \"$foo\"],\r\n\t\t[\"punctuation\", \"->\"],\r\n\t\t[\"function\", \"bar\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", \"$baz\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"variable\", \"$bar\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables.\r\n"
  },
  {
    "path": "tests/languages/smarty!+php/inclusion.test",
    "content": "{php}\n   // including a php script directly from the template.\n   include('/path/to/display_weather.php');\n{/php}\n\n{* this template includes a {php} block that assign's the variable $varX *}\n{php}\n   global $foo, $bar;\n   if($foo == $bar){\n     echo 'This will be sent to browser';\n   }\n  // assign a variable to Smarty\n  $this->assign('varX','Toffee');\n{/php}\n{* output the variable *}\n<strong>{$varX}</strong> is my fav ice cream :-)\n\n----------------------------------------------------\n\n[\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"keyword\", \"php\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"embedded-php\", [\n\t\t[\"comment\", \"// including a php script directly from the template.\"],\n\n\t\t[\"keyword\", \"include\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"string\", \"'/path/to/display_weather.php'\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \";\"]\n\t]],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{/\"],\n\t\t[\"keyword\", \"php\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\n\t[\"smarty-comment\", \"{* this template includes a {php} block that assign's the variable $varX *}\"],\n\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"keyword\", \"php\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"embedded-php\", [\n\t\t[\"keyword\", \"global\"],\n\t\t[\"variable\", \"$foo\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"variable\", \"$bar\"],\n\t\t[\"punctuation\", \";\"],\n\n\t\t[\"keyword\", \"if\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"variable\", \"$foo\"],\n\t\t[\"operator\", \"==\"],\n\t\t[\"variable\", \"$bar\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \"{\"],\n\n\t\t[\"keyword\", \"echo\"],\n\t\t[\"string\", \"'This will be sent to browser'\"],\n\t\t[\"punctuation\", \";\"],\n\n\t\t[\"punctuation\", \"}\"],\n\n\t\t[\"comment\", \"// assign a variable to Smarty\"],\n\n\t\t[\"variable\", \"$this\"],\n\t\t[\"operator\", \"->\"],\n\t\t[\"function\", [\"assign\"]],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"string\", \"'varX'\"],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"string\", \"'Toffee'\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \";\"]\n\t]],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{/\"],\n\t\t[\"keyword\", \"php\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\n\t[\"smarty-comment\", \"{* output the variable *}\"],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"strong\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"smarty\", [\n\t\t[\"delimiter\", \"{\"],\n\t\t[\"variable\", \"$varX\"],\n\t\t[\"delimiter\", \"}\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"strong\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\" is my fav ice cream :-)\"\n]\n"
  },
  {
    "path": "tests/languages/sml/boolean_feature.test",
    "content": "true\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]"
  },
  {
    "path": "tests/languages/sml/classname_feature.test",
    "content": "val FOO: (string list) * 'a * 'a -> (svalue,'a) token\nval FOO: (string) * 'a * 'a -> (svalue,'a) token\nval FOO: (int) * 'a * 'a -> (svalue,'a) token\nval FOO: (string list) * 'a * 'a -> (svalue,'a) token\nval FOO: 'a * 'a -> (svalue,'a) token\n\ndatatype spec_ast = SPEC of {head : string list,\n                             decls : decl_ast list,\n                             rules : rule_ast list,\n                             tail : string list}\n\ntype out_state = {\ntout : real,\ndtout : real,\ndtime : real,\nstrm : TextIO.outstream\n}\nval outState = ref (NONE : out_state option)\n\nval systemLines: string -> string list\nval systemCleanLines: string -> string list\nval systemStanzas: string -> string list list\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"val\"],\n\t\" FOO\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"(\"],\n\t\t\"string list\",\n\t\t[\"punctuation\", \")\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"operator\", \"->\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"svalue\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"punctuation\", \")\"],\n\t\t\" token\"\n\t]],\n\n\t[\"keyword\", \"val\"],\n\t\" FOO\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"(\"],\n\t\t\"string\",\n\t\t[\"punctuation\", \")\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"operator\", \"->\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"svalue\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"punctuation\", \")\"],\n\t\t\" token\"\n\t]],\n\n\t[\"keyword\", \"val\"],\n\t\" FOO\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"(\"],\n\t\t\"int\",\n\t\t[\"punctuation\", \")\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"operator\", \"->\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"svalue\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"punctuation\", \")\"],\n\t\t\" token\"\n\t]],\n\n\t[\"keyword\", \"val\"],\n\t\" FOO\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t[\"punctuation\", \"(\"],\n\t\t\"string list\",\n\t\t[\"punctuation\", \")\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"operator\", \"->\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"svalue\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"punctuation\", \")\"],\n\t\t\" token\"\n\t]],\n\n\t[\"keyword\", \"val\"],\n\t\" FOO\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t[\"variable\", \"'a\"],\n\t\t[\"operator\", \"*\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"operator\", \"->\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"svalue\",\n\t\t[\"punctuation\", \",\"],\n\t\t[\"variable\", \"'a\"],\n\t\t[\"punctuation\", \")\"],\n\t\t\" token\"\n\t]],\n\n\t[\"keyword\", \"datatype\"],\n\t[\"class-name\", \"spec_ast\"],\n\t[\"operator\", \"=\"],\n\t\" SPEC \",\n\t[\"keyword\", \"of\"],\n\t[\"punctuation\", \"{\"],\n\t\"head \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"string list\"]],\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n                             decls \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"decl_ast list\"]],\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n                             rules \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"rule_ast list\"]],\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n                             tail \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"string list\"]],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"type\"],\n\t[\"class-name\", \"out_state\"],\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\n\t\"\\r\\ntout \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"real\"]],\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\ndtout \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"real\"]],\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\ndtime \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"real\"]],\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\nstrm \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t\"TextIO\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"outstream\"\n\t]],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"val\"],\n\t\" outState \",\n\t[\"operator\", \"=\"],\n\t\" ref \",\n\t[\"punctuation\", \"(\"],\n\t\"NONE \",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\"out_state option\"]],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"val\"],\n\t\" systemLines\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t\"string \",\n\t\t[\"operator\", \"->\"],\n\t\t\" string list\"\n\t]],\n\n\t[\"keyword\", \"val\"],\n\t\" systemCleanLines\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t\"string \",\n\t\t[\"operator\", \"->\"],\n\t\t\" string list\"\n\t]],\n\n\t[\"keyword\", \"val\"],\n\t\" systemStanzas\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", [\n\t\t\"string \",\n\t\t[\"operator\", \"->\"],\n\t\t\" string list list\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/sml/comment_feature.test",
    "content": "(* comment *)\n(*\n (* nested comment *)\n*)\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"(* comment *)\"],\n\t[\"comment\", \"(*\\r\\n (* nested comment *)\\r\\n*)\"]\n]\n"
  },
  {
    "path": "tests/languages/sml/function_feature.test",
    "content": "fun foo x = x * 2\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"fun\"],\r\n\t[\"function\", \"foo\"],\r\n\t\" x \",\r\n\t[\"operator\", \"=\"],\r\n\t\" x \",\r\n\t[\"operator\", \"*\"],\r\n\t[\"number\", \"2\"]\r\n]"
  },
  {
    "path": "tests/languages/sml/keyword_feature.test",
    "content": "abstype\nand\nandalso\nas\ncase\ndatatype;\ndo\nelse\nend\neqtype\nexception;\nfn\nfun;\nfunctor;\nhandle\nif\nin\ninclude\ninfix\ninfixr\nlet\nlocal\nnonfix\nof\nop\nopen\norelse\nraise\nrec\nsharing\nsig\nsignature;\nstruct\nstructure;\nthen\ntype;\nval\nwhere\nwhile\nwith\nwithtype\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"abstype\"],\n\t[\"keyword\", \"and\"],\n\t[\"keyword\", \"andalso\"],\n\t[\"keyword\", \"as\"],\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"datatype\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"do\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"end\"],\n\t[\"keyword\", \"eqtype\"],\n\t[\"keyword\", \"exception\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"fn\"],\n\t[\"keyword\", \"fun\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"functor\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"handle\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"include\"],\n\t[\"keyword\", \"infix\"],\n\t[\"keyword\", \"infixr\"],\n\t[\"keyword\", \"let\"],\n\t[\"keyword\", \"local\"],\n\t[\"keyword\", \"nonfix\"],\n\t[\"keyword\", \"of\"],\n\t[\"keyword\", \"op\"],\n\t[\"keyword\", \"open\"],\n\t[\"keyword\", \"orelse\"],\n\t[\"keyword\", \"raise\"],\n\t[\"keyword\", \"rec\"],\n\t[\"keyword\", \"sharing\"],\n\t[\"keyword\", \"sig\"],\n\t[\"keyword\", \"signature\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"struct\"],\n\t[\"keyword\", \"structure\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"then\"],\n\t[\"keyword\", \"type\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"val\"],\n\t[\"keyword\", \"where\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"with\"],\n\t[\"keyword\", \"withtype\"]\n]"
  },
  {
    "path": "tests/languages/sml/number_feature.test",
    "content": "123\n~123\n123.456\n~123.456\n123e~3\n\n0xFF\n~0xFF\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"123\"],\n\t[\"number\", \"~123\"],\n\t[\"number\", \"123.456\"],\n\t[\"number\", \"~123.456\"],\n\t[\"number\", \"123e~3\"],\n\n\t[\"number\", \"0xFF\"],\n\t[\"number\", \"~0xFF\"]\n]"
  },
  {
    "path": "tests/languages/sml/operator_feature.test",
    "content": "...\n:: :> :=\n= <> < <= > >=\n=> ->\n! + - * / ^ # | @ ~\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"...\"],\n\t[\"operator\", \"::\"],\n\t[\"operator\", \":>\"],\n\t[\"operator\", \":=\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"=>\"],\n\t[\"operator\", \"->\"],\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"#\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"@\"],\n\t[\"operator\", \"~\"]\n]"
  },
  {
    "path": "tests/languages/sml/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n\"\\tfoo\r\nbar\"\r\n#\"f\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"\\\"\\\\tfoo\\r\\nbar\\\"\"],\r\n\t[\"string\", \"#\\\"f\\\"\"]\r\n]"
  },
  {
    "path": "tests/languages/sml/word_feature.test",
    "content": "0w123\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"word\", \"0w123\"]\r\n]"
  },
  {
    "path": "tests/languages/solidity/builtin_feature.test",
    "content": "address\nbool\nstring\nbyte\nbytes\nint\nuint\n\nbytes1 bytes2 bytes3 bytes4 bytes5 bytes6 bytes7 bytes8 bytes9 bytes10 bytes11 bytes12 bytes13 bytes14 bytes15 bytes16 bytes17 bytes18 bytes19 bytes20 bytes21 bytes22 bytes23 bytes24 bytes25 bytes26 bytes27 bytes28 bytes29 bytes30 bytes31 bytes32\nint8 int16 int24 int32 int40 int48 int56 int64 int72 int80 int88 int96 int104 int112 int120 int128 int136 int144 int152 int160 int168 int176 int184 int192 int200 int208 int216 int224 int232 int240 int248 int256\nuint8 uint16 uint24 uint32 uint40 uint48 uint56 uint64 uint72 uint80 uint88 uint96 uint104 uint112 uint120 uint128 uint136 uint144 uint152 uint160 uint168 uint176 uint184 uint192 uint200 uint208 uint216 uint224 uint232 uint240 uint248 uint256\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"address\"],\n\t[\"builtin\", \"bool\"],\n\t[\"builtin\", \"string\"],\n\t[\"builtin\", \"byte\"],\n\t[\"builtin\", \"bytes\"],\n\t[\"builtin\", \"int\"],\n\t[\"builtin\", \"uint\"],\n\n\t[\"builtin\", \"bytes1\"],\n\t[\"builtin\", \"bytes2\"],\n\t[\"builtin\", \"bytes3\"],\n\t[\"builtin\", \"bytes4\"],\n\t[\"builtin\", \"bytes5\"],\n\t[\"builtin\", \"bytes6\"],\n\t[\"builtin\", \"bytes7\"],\n\t[\"builtin\", \"bytes8\"],\n\t[\"builtin\", \"bytes9\"],\n\t[\"builtin\", \"bytes10\"],\n\t[\"builtin\", \"bytes11\"],\n\t[\"builtin\", \"bytes12\"],\n\t[\"builtin\", \"bytes13\"],\n\t[\"builtin\", \"bytes14\"],\n\t[\"builtin\", \"bytes15\"],\n\t[\"builtin\", \"bytes16\"],\n\t[\"builtin\", \"bytes17\"],\n\t[\"builtin\", \"bytes18\"],\n\t[\"builtin\", \"bytes19\"],\n\t[\"builtin\", \"bytes20\"],\n\t[\"builtin\", \"bytes21\"],\n\t[\"builtin\", \"bytes22\"],\n\t[\"builtin\", \"bytes23\"],\n\t[\"builtin\", \"bytes24\"],\n\t[\"builtin\", \"bytes25\"],\n\t[\"builtin\", \"bytes26\"],\n\t[\"builtin\", \"bytes27\"],\n\t[\"builtin\", \"bytes28\"],\n\t[\"builtin\", \"bytes29\"],\n\t[\"builtin\", \"bytes30\"],\n\t[\"builtin\", \"bytes31\"],\n\t[\"builtin\", \"bytes32\"],\n\n\t[\"builtin\", \"int8\"],\n\t[\"builtin\", \"int16\"],\n\t[\"builtin\", \"int24\"],\n\t[\"builtin\", \"int32\"],\n\t[\"builtin\", \"int40\"],\n\t[\"builtin\", \"int48\"],\n\t[\"builtin\", \"int56\"],\n\t[\"builtin\", \"int64\"],\n\t[\"builtin\", \"int72\"],\n\t[\"builtin\", \"int80\"],\n\t[\"builtin\", \"int88\"],\n\t[\"builtin\", \"int96\"],\n\t[\"builtin\", \"int104\"],\n\t[\"builtin\", \"int112\"],\n\t[\"builtin\", \"int120\"],\n\t[\"builtin\", \"int128\"],\n\t[\"builtin\", \"int136\"],\n\t[\"builtin\", \"int144\"],\n\t[\"builtin\", \"int152\"],\n\t[\"builtin\", \"int160\"],\n\t[\"builtin\", \"int168\"],\n\t[\"builtin\", \"int176\"],\n\t[\"builtin\", \"int184\"],\n\t[\"builtin\", \"int192\"],\n\t[\"builtin\", \"int200\"],\n\t[\"builtin\", \"int208\"],\n\t[\"builtin\", \"int216\"],\n\t[\"builtin\", \"int224\"],\n\t[\"builtin\", \"int232\"],\n\t[\"builtin\", \"int240\"],\n\t[\"builtin\", \"int248\"],\n\t[\"builtin\", \"int256\"],\n\n\t[\"builtin\", \"uint8\"],\n\t[\"builtin\", \"uint16\"],\n\t[\"builtin\", \"uint24\"],\n\t[\"builtin\", \"uint32\"],\n\t[\"builtin\", \"uint40\"],\n\t[\"builtin\", \"uint48\"],\n\t[\"builtin\", \"uint56\"],\n\t[\"builtin\", \"uint64\"],\n\t[\"builtin\", \"uint72\"],\n\t[\"builtin\", \"uint80\"],\n\t[\"builtin\", \"uint88\"],\n\t[\"builtin\", \"uint96\"],\n\t[\"builtin\", \"uint104\"],\n\t[\"builtin\", \"uint112\"],\n\t[\"builtin\", \"uint120\"],\n\t[\"builtin\", \"uint128\"],\n\t[\"builtin\", \"uint136\"],\n\t[\"builtin\", \"uint144\"],\n\t[\"builtin\", \"uint152\"],\n\t[\"builtin\", \"uint160\"],\n\t[\"builtin\", \"uint168\"],\n\t[\"builtin\", \"uint176\"],\n\t[\"builtin\", \"uint184\"],\n\t[\"builtin\", \"uint192\"],\n\t[\"builtin\", \"uint200\"],\n\t[\"builtin\", \"uint208\"],\n\t[\"builtin\", \"uint216\"],\n\t[\"builtin\", \"uint224\"],\n\t[\"builtin\", \"uint232\"],\n\t[\"builtin\", \"uint240\"],\n\t[\"builtin\", \"uint248\"],\n\t[\"builtin\", \"uint256\"]\n]\n\n----------------------------------------------------\n\nChecks for builtin types.\n"
  },
  {
    "path": "tests/languages/solidity/class-name_feature.test",
    "content": "contract Foo {}\ncontract Foo is Bar {}\nenum Foo { X, Y, Z }\ninterface Foo {}\nlibrary Foo {}\nnew Foo();\nstruct Foo {}\nusing Foo for bar;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"contract\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"contract\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"keyword\", \"is\"],\n\t\" Bar \",\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"enum\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t\" X\",\n\t[\"punctuation\", \",\"],\n\t\" Y\",\n\t[\"punctuation\", \",\"],\n\t\" Z \",\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"interface\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"library\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"new\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"struct\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"using\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"keyword\", \"for\"],\n\t\" bar\",\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for class names.\n"
  },
  {
    "path": "tests/languages/solidity/comment_feature.test",
    "content": "// foo\n/*\nbar\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// foo\"],\n\t[\"comment\", \"/*\\r\\nbar\\r\\n*/\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/solidity/keyword_feature.test",
    "content": "_\nanonymous\nas\nassembly\nassert\nbreak\ncalldata\ncase\nconstant\nconstructor\ncontinue\ncontract;\ndefault\ndelete\ndo\nelse\nemit\nenum;\nevent\nexternal\nfor\nfrom\nfunction\nif\nimport\nindexed\ninherited\ninterface;\ninternal\nis\nlet\nlibrary;\nmapping\nmemory\nmodifier\nnew;\npayable\npragma\nprivate\npublic\npure\nrequire\nreturn\nreturns\nrevert\nselfdestruct\nsolidity\nstorage\nstruct;\nsuicide\nswitch\nthis\nthrow\nusing;\nview\nwhile\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"_\"],\n\t[\"keyword\", \"anonymous\"],\n\t[\"keyword\", \"as\"],\n\t[\"keyword\", \"assembly\"],\n\t[\"keyword\", \"assert\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"calldata\"],\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"constant\"],\n\t[\"keyword\", \"constructor\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"contract\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"default\"],\n\t[\"keyword\", \"delete\"],\n\t[\"keyword\", \"do\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"emit\"],\n\t[\"keyword\", \"enum\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"event\"],\n\t[\"keyword\", \"external\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"from\"],\n\t[\"keyword\", \"function\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"import\"],\n\t[\"keyword\", \"indexed\"],\n\t[\"keyword\", \"inherited\"],\n\t[\"keyword\", \"interface\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"internal\"],\n\t[\"keyword\", \"is\"],\n\t[\"keyword\", \"let\"],\n\t[\"keyword\", \"library\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"mapping\"],\n\t[\"keyword\", \"memory\"],\n\t[\"keyword\", \"modifier\"],\n\t[\"keyword\", \"new\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"payable\"],\n\t[\"keyword\", \"pragma\"],\n\t[\"keyword\", \"private\"],\n\t[\"keyword\", \"public\"],\n\t[\"keyword\", \"pure\"],\n\t[\"keyword\", \"require\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"returns\"],\n\t[\"keyword\", \"revert\"],\n\t[\"keyword\", \"selfdestruct\"],\n\t[\"keyword\", \"solidity\"],\n\t[\"keyword\", \"storage\"],\n\t[\"keyword\", \"struct\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"suicide\"],\n\t[\"keyword\", \"switch\"],\n\t[\"keyword\", \"this\"],\n\t[\"keyword\", \"throw\"],\n\t[\"keyword\", \"using\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"view\"],\n\t[\"keyword\", \"while\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/solidity/operator_feature.test",
    "content": "+  -  *  /  %\n+= -= *= /= %=\n\n^  &  |  ~\n^= &= |=\n\n>> << >>= <<=\n\n&& || !\n\n=\n>= <= > < != ==\n\n=> -> := =:\n\n?\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"%=\"],\n\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"^=\"],\n\t[\"operator\", \"&=\"],\n\t[\"operator\", \"|=\"],\n\n\t[\"operator\", \">>\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \">>=\"],\n\t[\"operator\", \"<<=\"],\n\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\t[\"operator\", \"!\"],\n\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"==\"],\n\n\t[\"operator\", \"=>\"],\n\t[\"operator\", \"->\"],\n\t[\"operator\", \":=\"],\n\t[\"operator\", \"=:\"],\n\n\t[\"operator\", \"?\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/solidity/punctuation_feature.test",
    "content": "() [] {}\n. : , ;\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/solidity/string_feature.test",
    "content": "\"foo\\\"\\'\"\n'bar\\'\\\"'\n\n\"\\n\\\"\\'\\\\abc\\\ndef\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"foo\\\\\\\"\\\\'\\\"\"],\n\t[\"string\", \"'bar\\\\'\\\\\\\"'\"],\n\n\t[\"string\", \"\\\"\\\\n\\\\\\\"\\\\'\\\\\\\\abc\\\\\\r\\ndef\\\"\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/solidity/version_feature.test",
    "content": "pragma solidity >=0.4.0 <0.7.0;\npragma solidity ^0.5.0;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"pragma\"],\n\t[\"keyword\", \"solidity\"],\n\t[\"operator\", \">=\"],\n\t[\"version\", \"0.4.0\"],\n\t[\"operator\", \"<\"],\n\t[\"version\", \"0.7.0\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"pragma\"],\n\t[\"keyword\", \"solidity\"],\n\t[\"operator\", \"^\"],\n\t[\"version\", \"0.5.0\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for version literals.\n"
  },
  {
    "path": "tests/languages/solution-file/boolean_feature.test",
    "content": "TRUE\r\nFALSE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"TRUE\"],\r\n\t[\"boolean\", \"FALSE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/solution-file/comment_feature.test",
    "content": "# comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"# comment\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/solution-file/guid_feature.test",
    "content": "Project(\"{F184B08F-C81C-45F6-A57F-5ABD9991F28F}\") = \"Project1\", \"Project1.vbproj\", \"{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}\"\r\n\t{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Foo = Bar\r\nEndProject\r\nFoo = {F184B08F-C81C-45F6-A57F-5ABD9991F28F}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"object\", \"Project\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"guid\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"F184B08F-C81C-45F6-A57F-5ABD9991F28F\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"Project1\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"Project1.vbproj\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"guid\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"8CDD8387-B905-44A8-B5D5-07BB50E05BEA\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"property\", [\r\n\t\t[\"guid\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"8CDD8387-B905-44A8-B5D5-07BB50E05BEA\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\".Foo\"\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t\" Bar\\r\\n\",\r\n\t[\"object\", \"EndProject\"],\r\n\t[\"property\", [\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"guid\", [\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t\"F184B08F-C81C-45F6-A57F-5ABD9991F28F\",\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for global unique identifiers.\r\n"
  },
  {
    "path": "tests/languages/solution-file/object_feature.test",
    "content": "Project(\"{F184B08F-C81C-45F6-A57F-5ABD9991F28F}\") = \"Project1\", \"Project1.vbproj\", \"{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}\"\r\nEndProject\r\n\r\nGlobal\r\n\tGlobalSection(ProjectConfiguration) = postSolution\r\n\t\t{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.ActiveCfg = Debug|x86\r\n\t\t{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.Build.0 = Debug|x86\r\n\t\t{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.ActiveCfg = Release|x86\r\n\t\t{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.Build.0 = Release|x86\r\n\tEndGlobalSection\r\nEndGlobal\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"object\", \"Project\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"guid\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"F184B08F-C81C-45F6-A57F-5ABD9991F28F\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"Project1\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"Project1.vbproj\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", [\r\n\t\t\"\\\"\",\r\n\t\t[\"guid\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"8CDD8387-B905-44A8-B5D5-07BB50E05BEA\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"\\\"\"\r\n\t]],\r\n\t[\"object\", \"EndProject\"],\r\n\r\n\t[\"object\", \"Global\"],\r\n\t[\"object\", \"GlobalSection\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"ProjectConfiguration\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=\"],\r\n\t\" postSolution\\r\\n\\t\\t\",\r\n\t[\"property\", [\r\n\t\t[\"guid\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"8CDD8387-B905-44A8-B5D5-07BB50E05BEA\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\".Debug.ActiveCfg\"\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t\" Debug|x86\\r\\n\\t\\t\",\r\n\t[\"property\", [\r\n\t\t[\"guid\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"8CDD8387-B905-44A8-B5D5-07BB50E05BEA\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\".Debug.Build.0\"\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t\" Debug|x86\\r\\n\\t\\t\",\r\n\t[\"property\", [\r\n\t\t[\"guid\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"8CDD8387-B905-44A8-B5D5-07BB50E05BEA\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\".Release.ActiveCfg\"\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t\" Release|x86\\r\\n\\t\\t\",\r\n\t[\"property\", [\r\n\t\t[\"guid\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"8CDD8387-B905-44A8-B5D5-07BB50E05BEA\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\".Release.Build.0\"\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t\" Release|x86\\r\\n\\t\",\r\n\t[\"object\", \"EndGlobalSection\"],\r\n\t[\"object\", \"EndGlobal\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for objects.\r\n"
  },
  {
    "path": "tests/languages/solution-file/property_feature.test",
    "content": "README.md = README.md\r\nDebug|Any CPU = Debug|Any CPU\r\n{D86DD040-BA41-47FA-91D3-EF62F23AF867}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property\", [\r\n\t\t\"README.md\"\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t\" README.md\\r\\n\",\r\n\t[\"property\", [\r\n\t\t\"Debug|Any CPU\"\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t\" Debug|Any CPU\\r\\n\",\r\n\t[\"property\", [\r\n\t\t[\"guid\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"D86DD040-BA41-47FA-91D3-EF62F23AF867\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\".Debug|Any CPU.ActiveCfg\"\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t\" Debug|Any CPU\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for properties.\r\n"
  },
  {
    "path": "tests/languages/solution-file/string_feature.test",
    "content": "\"foo\"\r\n'bar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\r\n\t\t\"\\\"foo\\\"\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"'bar'\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/soy/boolean_feature.test",
    "content": "{param visible: true /}\r\n{param visible:false/}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"parameter\", \"visible\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"parameter\", \"visible\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"boolean\", \"false\"],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/soy/command-arg.test",
    "content": "{alias long.namespace.root.projectx.foomodule.utils as fooUtils}\r\n{call myfeature.myTemplate /}\r\n{delcall aaa.bbb.myButton /}\r\n{delpackage MyExperiment}\r\n{deltemplate aaa.bbb.myButton}\r\n{namespace ns}\r\n{template .example}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"alias\"],\r\n\t\t[\"command-arg\", [\r\n\t\t\t\"long\",\r\n\t\t\t[\"punctuation\", \".\"], \"namespace\",\r\n\t\t\t[\"punctuation\", \".\"], \"root\",\r\n\t\t\t[\"punctuation\", \".\"], \"projectx\",\r\n\t\t\t[\"punctuation\", \".\"], \"foomodule\",\r\n\t\t\t[\"punctuation\", \".\"], \"utils\"\r\n\t\t]],\r\n\t\t[\"keyword\", \"as\"],\r\n\t\t\" fooUtils\",\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"call\"],\r\n\t\t[\"command-arg\", [\r\n\t\t\t\"myfeature\",\r\n\t\t\t[\"punctuation\", \".\"], \"myTemplate\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"delcall\"],\r\n\t\t[\"command-arg\", [\r\n\t\t\t\"aaa\",\r\n\t\t\t[\"punctuation\", \".\"], \"bbb\",\r\n\t\t\t[\"punctuation\", \".\"], \"myButton\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"delpackage\"],\r\n\t\t[\"command-arg\", [\r\n\t\t\t\"MyExperiment\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"deltemplate\"],\r\n\t\t[\"command-arg\", [\r\n\t\t\t\"aaa\",\r\n\t\t\t[\"punctuation\", \".\"], \"bbb\",\r\n\t\t\t[\"punctuation\", \".\"], \"myButton\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"namespace\"],\r\n\t\t[\"command-arg\", [\r\n\t\t\t\"ns\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"template\"],\r\n\t\t[\"command-arg\", [\r\n\t\t\t[\"punctuation\", \".\"], \"example\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for command argument."
  },
  {
    "path": "tests/languages/soy/comment_feature.test",
    "content": "/**/\r\n/* Foo \"bar\" */\r\n/* Foo //bar\r\nbaz */\r\n//\r\n// Foo /* bar */\r\n// <div></div>\r\n/* <div>\r\n</div> */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [[\"comment\", \"/**/\"]]],\r\n\t[\"soy\", [[\"comment\", \"/* Foo \\\"bar\\\" */\"]]],\r\n\t[\"soy\", [[\"comment\", \"/* Foo //bar\\r\\nbaz */\"]]],\r\n\t[\"soy\", [[\"comment\", \"//\"]]],\r\n\t[\"soy\", [[\"comment\", \"// Foo /* bar */\"]]],\r\n\t[\"soy\", [[\"comment\", \"// <div></div>\"]]],\r\n\t[\"soy\", [[\"comment\", \"/* <div>\\r\\n</div> */\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/soy/function_feature.test",
    "content": "{if not isLast($additionalName)}\r\n{if length($items) > 5}\r\n{$x|noAutoescape}\r\n{elseif round($pi) == 3}\r\n{for $i in range($numLines)}\r\n{$foo|changeNewLineToBr|bidiSpanWrap}\r\n{$bar | truncate : 4 , false}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"operator\", \"not\"],\r\n\t\t[\"function\", \"isLast\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$additionalName\"]],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"function\", \"length\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$items\"]],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"operator\", \">\"],\r\n\t\t[\"number\", \"5\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\"$x\"]],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"function\", \"noAutoescape\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"elseif\"],\r\n\t\t[\"function\", \"round\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$pi\"]],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"for\"],\r\n\t\t[\"variable\", [\"$i\"]],\r\n\t\t[\"keyword\", \"in\"],\r\n\t\t[\"function\", \"range\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$numLines\"]],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"function\", \"changeNewLineToBr\"],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"function\", \"bidiSpanWrap\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\"$bar\"]],\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"function\", \"truncate\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"boolean\", \"false\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions and print directives."
  },
  {
    "path": "tests/languages/soy/keyword_feature.test",
    "content": "{\\n}\r\n{\\r}\r\n{\\t}\r\n{alias foo as bar}\r\n{call}\r\n{case}\r\n{css}\r\n{default}\r\n{delcall}\r\n{delpackage}\r\n{deltemplate}\r\n{else}\r\n{elseif}\r\n{fallbackmsg}\r\n{for}\r\n{foreach $i in $foo}\r\n{if}\r\n{ifempty}\r\n{lb}\r\n{let}\r\n{literal}{/literal}\r\n{msg}\r\n{namespace}\r\n{nil}\r\n{param}\r\n{@param}\r\n{@param?}\r\n{rb}\r\n{sp}\r\n{switch}\r\n{template}\r\n{xid}\r\n{@param foo: any}\r\n{@param foo: attributes}\r\n{@param foo: bool}\r\n{@param foo: css}\r\n{@param foo: float}\r\n{@param foo: int}\r\n{@param foo: js}\r\n{@param foo: html}\r\n{@param foo: list<int>}\r\n{@param foo: map<int,string>}\r\n{@param foo: null}\r\n{@param foo: number}\r\n{@param foo: string}\r\n{@param foo: uri}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"\\\\n\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"\\\\r\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"\\\\t\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"alias\"],\r\n\t\t[\"command-arg\", [\"foo\"]],\r\n\t\t[\"keyword\", \"as\"],\r\n\t\t\" bar\",\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"call\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"case\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"css\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"default\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"delcall\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"delpackage\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"deltemplate\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"else\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"elseif\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"fallbackmsg\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"for\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"foreach\"],\r\n\t\t[\"variable\", [\"$i\"]],\r\n\t\t[\"keyword\", \"in\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"ifempty\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"lb\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"literal\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{/\"],\r\n\t\t[\"keyword\", \"literal\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"msg\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"namespace\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"nil\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param?\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"rb\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"sp\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"switch\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"template\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"xid\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"any\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"attributes\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"bool\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"css\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"float\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"int\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"js\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"html\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"list\"], [\"operator\", \"<\"], [\"keyword\", \"int\"], [\"operator\", \">\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"map\"], [\"operator\", \"<\"], [\"keyword\", \"int\"], [\"punctuation\", \",\"], [\"keyword\", \"string\"], [\"operator\", \">\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"null\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"number\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"string\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"uri\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/soy/literal_feature.test",
    "content": "{literal}{$noHighlight}{/literal}\r\n{$highlight}{literal}<div class=\"{$foo}\">\r\n{if $bar}{$bar}{/if}</div>\r\n{/literal}\r\n{literal}/* even comments */{/literal}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"literal\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"{$noHighlight}\",\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{/\"],\r\n\t\t[\"keyword\", \"literal\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\"$highlight\"]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"literal\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"{$foo}\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n{if $bar}{$bar}{/if}\",\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{/\"],\r\n\t\t[\"keyword\", \"literal\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"literal\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t\"/* even comments */\",\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{/\"],\r\n\t\t[\"keyword\", \"literal\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for {literal} command.\r\n"
  },
  {
    "path": "tests/languages/soy/number_feature.test",
    "content": "{param foo: 42}\r\n{param foo: 3.14159}\r\n{param foo: 0.0}\r\n{param foo: 7e+8}\r\n{param foo: 2.5E-14}\r\n{param foo: 0x42BADFACE}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"3.14159\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"0.0\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"7e+8\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"2.5E-14\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"parameter\", \"foo\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"0x42BADFACE\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal and hexadecimal numbers."
  },
  {
    "path": "tests/languages/soy/operator_feature.test",
    "content": "{let $foo: $a ? 0 : 1 /}\r\n{let $foo: $a ?: 1 /}\r\n{let $foo: 1 < 2 and 2 <= 3 /}\r\n{let $foo: 1 > 2 or 2 >= 3 /}\r\n{let $foo: 1 == 1 and 1 != 2 /}\r\n{let $foo: ((1 + 2) / 3 * 4) % 5 - 6 /}\r\n{let $foo: not $bar /}\r\n{let $foo kind=\"text\"}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"variable\", [\"$a\"]],\r\n\t\t[\"operator\", \"?\"],\r\n\t\t[\"number\", \"0\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"variable\", [\"$a\"]],\r\n\t\t[\"operator\", \"?:\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"operator\", \"and\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"operator\", \"<=\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \">\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"operator\", \"or\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"operator\", \">=\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"and\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"!=\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"operator\", \"/\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"operator\", \"*\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"operator\", \"%\"],\r\n\t\t[\"number\", \"5\"],\r\n\t\t[\"operator\", \"-\"],\r\n\t\t[\"number\", \"6\"],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"operator\", \"not\"],\r\n\t\t[\"variable\", [\"$bar\"]],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"property\", \"kind\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"text\\\"\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/soy/parameter_feature.test",
    "content": "{param visible: true /}\r\n{param content kind=\"html\"}\r\n    <b>{$message}</b>\r\n{/param}\r\n{@param name: string}\r\n{@param? height: int}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"parameter\", \"visible\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"parameter\", \"content\"],\r\n\t\t[\"property\", \"kind\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"html\\\"\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"b\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\"$message\"]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"b\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{/\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param\"],\r\n\t\t[\"parameter\", \"name\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"string\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"@param?\"],\r\n\t\t[\"parameter\", \"height\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"keyword\", \"int\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for parameters name.\r\n"
  },
  {
    "path": "tests/languages/soy/property_feature.test",
    "content": "{msg meaning=\"noun\" desc=\"The word 'Archive' used as a noun, i.e. an information store.\"}\r\n{param content kind=\"html\"}\r\n{let $message kind=\"text\"}\r\n{template .googleUri autoescape=\"strict\" kind=\"uri\"}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"msg\"],\r\n\t\t[\"property\", \"meaning\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"noun\\\"\"],\r\n\t\t[\"property\", \"desc\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"The word 'Archive' used as a noun, i.e. an information store.\\\"\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"param\"],\r\n\t\t[\"parameter\", \"content\"],\r\n\t\t[\"property\", \"kind\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"html\\\"\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"variable\", [\"$message\"]],\r\n\t\t[\"property\", \"kind\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"text\\\"\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"template\"],\r\n\t\t[\"command-arg\", [[\"punctuation\", \".\"], \"googleUri\"]],\r\n\t\t[\"property\", \"autoescape\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"strict\\\"\"],\r\n\t\t[\"property\", \"kind\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"uri\\\"\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for command properties."
  },
  {
    "path": "tests/languages/soy/soy_in_markup_feature.test",
    "content": "<div>{$msg}</div>\r\n<div class=\"{$msg}\">\r\n<h{$headingLevel}>\r\n___SOY1___{$foo}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\"$msg\"]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"class\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"soy\", [\r\n\t\t\t\t[\"delimiter\", \"{\"],\r\n\t\t\t\t[\"variable\", [\"$msg\"]],\r\n\t\t\t\t[\"delimiter\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t\"h\",\r\n\t\t\t[\"soy\", [\r\n\t\t\t\t[\"delimiter\", \"{\"],\r\n\t\t\t\t[\"variable\", [\"$headingLevel\"]],\r\n\t\t\t\t[\"delimiter\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t\"\\r\\n___SOY1___\",\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for Soy inside Markup.\r\n"
  },
  {
    "path": "tests/languages/soy/string_feature.test",
    "content": "{msg desc=\"\"}\r\n{msg desc=\"Foo \\\"bar\\\" 'baz'\"}\r\n{$foo['bar\\'baz\\\"\\\"\\'']}\r\n{{msg desc=\"Example: The set of prime numbers is {2, 3, 5, 7, 11, 13, ...}.\"}}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"msg\"],\r\n\t\t[\"property\", \"desc\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"\\\"\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"msg\"],\r\n\t\t[\"property\", \"desc\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"Foo \\\\\\\"bar\\\\\\\" 'baz'\\\"\"],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$foo\",\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"string\", \"'bar\\\\'baz\\\\\\\"\\\\\\\"\\\\''\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"keyword\", \"msg\"],\r\n\t\t[\"property\", \"desc\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"Example: The set of prime numbers is {2, 3, 5, 7, 11, 13, ...}.\\\"\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/soy/variable_feature.test",
    "content": "{$name}\r\n{$folders.0.name}\r\n{$folders[0].name}\r\n{$folders[0]['name']}\r\n{$aaa?.bbb.ccc?[0]}\r\n{let $category: $categoryList[0] /}\r\n{let $isEnabled: $isAaa and not $isBbb and $ccc == $ddd + $eee /}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\"$name\"]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$folders\",\r\n\t\t\t[\"punctuation\", \".\"], [\"number\", \"0\"],\r\n\t\t\t[\"punctuation\", \".\"], \"name\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$folders\",\r\n\t\t\t[\"punctuation\", \"[\"], [\"number\", \"0\"], [\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \".\"], \"name\"\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$folders\",\r\n\t\t\t[\"punctuation\", \"[\"], [\"number\", \"0\"], [\"punctuation\", \"]\"],\r\n\t\t\t[\"punctuation\", \"[\"], [\"string\", \"'name'\"], [\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$aaa\", [\"punctuation\", \"?\"],\r\n\t\t\t[\"punctuation\", \".\"], \"bbb\",\r\n\t\t\t[\"punctuation\", \".\"], \"ccc\", [\"punctuation\", \"?\"],\r\n\t\t\t[\"punctuation\", \"[\"], [\"number\", \"0\"], [\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"variable\", [\"$category\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$categoryList\",\r\n\t\t\t[\"punctuation\", \"[\"], [\"number\", \"0\"], [\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]],\r\n\t[\"soy\", [\r\n\t\t[\"delimiter\", \"{\"],\r\n\t\t[\"keyword\", \"let\"],\r\n\t\t[\"variable\", [\"$isEnabled\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"variable\", [\"$isAaa\"]],\r\n\t\t[\"operator\", \"and\"],\r\n\t\t[\"operator\", \"not\"],\r\n\t\t[\"variable\", [\"$isBbb\"]],\r\n\t\t[\"operator\", \"and\"],\r\n\t\t[\"variable\", [\"$ccc\"]],\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"variable\", [\"$ddd\"]],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"variable\", [\"$eee\"]],\r\n\t\t[\"delimiter\", \"/}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/sparql/boolean_feature.test",
    "content": "true\r\nFALSE\r\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"FALSE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/sparql/comment_feature.test",
    "content": "#\r\n# foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foo\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/sparql/function_feature.test",
    "content": "foo:bar\r\nfoo:\r\n:bar\r\nfoo:ba1\r\nfoo:1ba\r\nfoo:bar:bar\r\nfoo:bar%20bar\r\nfoo:bar.bar\r\nfoo-2:\r\nfoo.-:\r\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"bar\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"bar\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"ba1\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"1ba\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"bar:bar\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"bar%20bar\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"bar.bar\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"foo-2\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"foo.-\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n\r\n----------------------------------------------------\r\n\r\nChecks for PrefixedName.\r\n"
  },
  {
    "path": "tests/languages/sparql/keyword_feature.test",
    "content": "A\r\nADD\r\nALL\r\nAS\r\nASC\r\nASK\r\nBNODE\r\nBY\r\nCLEAR\r\nCONSTRUCT\r\nCOPY\r\nCREATE\r\nDATA\r\nDEFAULT\r\nDELETE\r\nDESC\r\nDESCRIBE\r\nDISTINCT\r\nDROP\r\nEXISTS\r\nFILTER\r\nFROM\r\nGROUP\r\nHAVING\r\nINSERT\r\nINTO\r\nLIMIT\r\nLOAD\r\nMINUS\r\nMOVE\r\nNAMED\r\nNOT\r\nNOW\r\nOFFSET\r\nOPTIONAL\r\nORDER\r\nRAND\r\nREDUCED\r\nSELECT\r\nSEPARATOR\r\nSERVICE\r\nSILENT\r\nSTRUUID\r\nUNION\r\nUSING\r\nUUID\r\nVALUES\r\nWHERE\r\nABS(\r\nAVG(\r\nBIND(\r\nBOUND(\r\nCEIL(\r\nCOALESCE(\r\nCONCAT(\r\nCONTAINS(\r\nCOUNT(\r\nDATATYPE(\r\nDAY(\r\nENCODE_FOR_URI(\r\nFLOOR(\r\nGROUP_CONCAT(\r\nHOURS(\r\nIF(\r\nIRI(\r\nisBLANK(\r\nisIRI(\r\nisLITERAL(\r\nisNUMERIC(\r\nisURI(\r\nLANG(\r\nLANGMATCHES(\r\nLCASE(\r\nMAX(\r\nMD5(\r\nMIN(\r\nMINUTES(\r\nMONTH(\r\nROUND(\r\nREGEX(\r\nREPLACE(\r\nsameTerm(\r\nSAMPLE(\r\nSECONDS(\r\nSHA1(\r\nSHA256(\r\nSHA384(\r\nSHA512(\r\nSTR(\r\nSTRAFTER(\r\nSTRBEFORE(\r\nSTRDT(\r\nSTRENDS(\r\nSTRLANG(\r\nSTRLEN(\r\nSTRSTARTS(\r\nSUBSTR(\r\nSUM(\r\nTIMEZONE(\r\nTZ(\r\nUCASE(\r\nURI(\r\nYEAR(\r\n\r\nGRAPH\r\nBASE\r\nPREFIX\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"A\"],\r\n\t[\"keyword\", \"ADD\"],\r\n\t[\"keyword\", \"ALL\"],\r\n\t[\"keyword\", \"AS\"],\r\n\t[\"keyword\", \"ASC\"],\r\n\t[\"keyword\", \"ASK\"],\r\n\t[\"keyword\", \"BNODE\"],\r\n\t[\"keyword\", \"BY\"],\r\n\t[\"keyword\", \"CLEAR\"],\r\n\t[\"keyword\", \"CONSTRUCT\"],\r\n\t[\"keyword\", \"COPY\"],\r\n\t[\"keyword\", \"CREATE\"],\r\n\t[\"keyword\", \"DATA\"],\r\n\t[\"keyword\", \"DEFAULT\"],\r\n\t[\"keyword\", \"DELETE\"],\r\n\t[\"keyword\", \"DESC\"],\r\n\t[\"keyword\", \"DESCRIBE\"],\r\n\t[\"keyword\", \"DISTINCT\"],\r\n\t[\"keyword\", \"DROP\"],\r\n\t[\"keyword\", \"EXISTS\"],\r\n\t[\"keyword\", \"FILTER\"],\r\n\t[\"keyword\", \"FROM\"],\r\n\t[\"keyword\", \"GROUP\"],\r\n\t[\"keyword\", \"HAVING\"],\r\n\t[\"keyword\", \"INSERT\"],\r\n\t[\"keyword\", \"INTO\"],\r\n\t[\"keyword\", \"LIMIT\"],\r\n\t[\"keyword\", \"LOAD\"],\r\n\t[\"keyword\", \"MINUS\"],\r\n\t[\"keyword\", \"MOVE\"],\r\n\t[\"keyword\", \"NAMED\"],\r\n\t[\"keyword\", \"NOT\"],\r\n\t[\"keyword\", \"NOW\"],\r\n\t[\"keyword\", \"OFFSET\"],\r\n\t[\"keyword\", \"OPTIONAL\"],\r\n\t[\"keyword\", \"ORDER\"],\r\n\t[\"keyword\", \"RAND\"],\r\n\t[\"keyword\", \"REDUCED\"],\r\n\t[\"keyword\", \"SELECT\"],\r\n\t[\"keyword\", \"SEPARATOR\"],\r\n\t[\"keyword\", \"SERVICE\"],\r\n\t[\"keyword\", \"SILENT\"],\r\n\t[\"keyword\", \"STRUUID\"],\r\n\t[\"keyword\", \"UNION\"],\r\n\t[\"keyword\", \"USING\"],\r\n\t[\"keyword\", \"UUID\"],\r\n\t[\"keyword\", \"VALUES\"],\r\n\t[\"keyword\", \"WHERE\"],\r\n\t[\"keyword\", \"ABS\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"AVG\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"BIND\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"BOUND\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"CEIL\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"COALESCE\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"CONCAT\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"CONTAINS\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"COUNT\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"DATATYPE\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"DAY\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"ENCODE_FOR_URI\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"FLOOR\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"GROUP_CONCAT\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"HOURS\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"IF\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"IRI\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"isBLANK\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"isIRI\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"isLITERAL\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"isNUMERIC\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"isURI\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"LANG\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"LANGMATCHES\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"LCASE\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"MAX\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"MD5\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"MIN\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"MINUTES\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"MONTH\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"ROUND\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"REGEX\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"REPLACE\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"sameTerm\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"SAMPLE\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"SECONDS\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"SHA1\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"SHA256\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"SHA384\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"SHA512\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"STR\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"STRAFTER\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"STRBEFORE\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"STRDT\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"STRENDS\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"STRLANG\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"STRLEN\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"STRSTARTS\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"SUBSTR\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"SUM\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"TIMEZONE\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"TZ\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"UCASE\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"URI\"], [\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"YEAR\"], [\"punctuation\", \"(\"],\r\n\r\n\t[\"keyword\", \"GRAPH\"],\r\n\t[\"keyword\", \"BASE\"],\r\n\t[\"keyword\", \"PREFIX\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/sparql/number_feature.test",
    "content": "42\r\n+42\r\n-42\r\n42.42\r\n-42.42\r\n+42.42\r\n42.42e42\r\n-42.42e+42\r\n+42.42e-42\r\n0.42e42\r\n0.42e+42\r\n0.42e-42\r\n----------------------------------------------------\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"+42\"],\r\n\t[\"number\", \"-42\"],\r\n\t[\"number\", \"42.42\"],\r\n\t[\"number\", \"-42.42\"],\r\n\t[\"number\", \"+42.42\"],\r\n\t[\"number\", \"42.42e42\"],\r\n\t[\"number\", \"-42.42e+42\"],\r\n\t[\"number\", \"+42.42e-42\"],\r\n\t[\"number\", \"0.42e42\"],\r\n\t[\"number\", \"0.42e+42\"],\r\n\t[\"number\", \"0.42e-42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/sparql/string_feature.test",
    "content": "\"\"\r\n''\r\n''''''\r\n\"\"\"\"\"\"\r\n'foo bar'\r\n\"Foo bar\"\r\n\"\"\"foo\r\n\"bar\"\r\nfoobar\"\"\"\r\n'''\r\nfoobar\r\n\"bar\"\r\n'foo'\r\nfoobar\r\n'''\r\n\r\n----------------------------------------------------\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"multiline-string\", [\r\n\t\t\"''''''\"\r\n\t]],\r\n\t[\"multiline-string\", [\r\n\t\t\"\\\"\\\"\\\"\\\"\\\"\\\"\"\r\n\t]],\r\n\t[\"string\", \"'foo bar'\"],\r\n\t[\"string\", \"\\\"Foo bar\\\"\"],\r\n\t[\"multiline-string\", [\r\n\t\t\"\\\"\\\"\\\"foo\\r\\n\\\"bar\\\"\\r\\nfoobar\\\"\\\"\\\"\"\r\n\t]],\r\n\t[\"multiline-string\", [\r\n\t\t\"'''\\r\\nfoobar\\r\\n\\\"bar\\\"\\r\\n'foo'\\r\\nfoobar\\r\\n'''\"\r\n\t]]\r\n]\r\n\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/sparql/tag_feature.test",
    "content": "@ne\n@ned-nl\n@ne-nl\n@ne-01\n@ne-JA\n@ne-NE01\n\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"@\"],\n\t\t\"ne\"\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"@\"],\n\t\t\"ned-nl\"\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"@\"],\n\t\t\"ne-nl\"\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"@\"],\n\t\t\"ne\"\n\t]],\n\t[\"number\", \"-01\"],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"@\"],\n\t\t\"ne-JA\"\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"@\"],\n\t\t\"ne-NE01\"\n\t]]\n]\n\n\n----------------------------------------------------\n\nChecks for languagetags.\n"
  },
  {
    "path": "tests/languages/sparql/url_feature.test",
    "content": "<http://foo.com/blah_blah>\n<http://foo.com/blah_blah/>\n<http://foo.com/blah_blah_(wikipedia)>\n<http://foo.com/blah_blah_(wikipedia)_(again)>\n<http://www.example.com/wpstyle/?p=364>\n<https://www.example.com/foo/?bar=baz&inga=42&quux>\n<http://✪df.ws/123>\n<http://userid:password@example.com:8080>\n<http://userid:password@example.com:8080/>\n<http://userid@example.com>\n<http://userid@example.com/>\n<http://userid@example.com:8080>\n<http://userid@example.com:8080/>\n<http://userid:password@example.com>\n<http://userid:password@example.com/>\n<http://142.42.1.1/>\n<http://142.42.1.1:8080/>\n<http://➡.ws/䨹>\n<http://⌘.ws>\n<http://⌘.ws/>\n<http://foo.com/blah_(wikipedia)#cite-1>\n<http://foo.com/blah_(wikipedia)_blah#cite-1>\n<http://foo.com/unicode_(✪)_in_parens>\n<http://foo.com/(something)?after=parens>\n<http://☺.damowmow.com/>\n<http://code.google.com/events/#&product=browser>\n<http://j.mp>\n<ftp://foo.bar/baz>\n<http://foo.bar/?q=Test%20URL-encoded%20stuff>\n<http://مثال.إختبار>\n<http://例子.测试>\n<http://उदाहरण.परीक्षा>\n<http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com>\n<http://1337.net>\n<http://a.b-c.de>\n<http://223.255.255.254>\n<https://foo_bar.example.com/>\n\n\n\n----------------------------------------------------\n\n[\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://foo.com/blah_blah\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://foo.com/blah_blah/\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://foo.com/blah_blah_(wikipedia)\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://foo.com/blah_blah_(wikipedia)_(again)\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://www.example.com/wpstyle/?p=364\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"https://www.example.com/foo/?bar=baz&inga=42&quux\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://✪df.ws/123\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://userid:password@example.com:8080\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://userid:password@example.com:8080/\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://userid@example.com\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://userid@example.com/\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://userid@example.com:8080\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://userid@example.com:8080/\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://userid:password@example.com\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://userid:password@example.com/\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://142.42.1.1/\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://142.42.1.1:8080/\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://➡.ws/䨹\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://⌘.ws\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://⌘.ws/\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://foo.com/blah_(wikipedia)#cite-1\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://foo.com/blah_(wikipedia)_blah#cite-1\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://foo.com/unicode_(✪)_in_parens\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://foo.com/(something)?after=parens\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://☺.damowmow.com/\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://code.google.com/events/#&product=browser\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://j.mp\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"ftp://foo.bar/baz\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://foo.bar/?q=Test%20URL-encoded%20stuff\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://مثال.إختبار\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://例子.测试\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://उदाहरण.परीक्षा\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://1337.net\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://a.b-c.de\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"http://223.255.255.254\",\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"url\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t\"https://foo_bar.example.com/\",\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n\n\n----------------------------------------------------\n\nChecks for IRI's.\n"
  },
  {
    "path": "tests/languages/sparql/variable_feature.test",
    "content": "?name\r\n$name\r\n?name0\r\n$name0\r\n\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"?name\"],\r\n\t[\"variable\", \"$name\"],\r\n\t[\"variable\", \"?name0\"],\r\n\t[\"variable\", \"$name0\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables.\r\n"
  },
  {
    "path": "tests/languages/splunk-spl/boolean_feature.test",
    "content": "T F\ntrue false\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"T\"], [\"boolean\", \"F\"],\n\t[\"boolean\", \"true\"], [\"boolean\", \"false\"]\n]\n"
  },
  {
    "path": "tests/languages/splunk-spl/comment_feature.test",
    "content": "`comment(\"This is a comment\")`\r\n`comment(\"This is too\r\nbut on more than one line\")`\r\n`comment(\"| stats sum(b) BY index\")`\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"`comment(\\\"This is a comment\\\")`\"],\r\n\t[\"comment\", \"`comment(\\\"This is too\\r\\nbut on more than one line\\\")`\"],\r\n\t[\"comment\", \"`comment(\\\"| stats sum(b) BY index\\\")`\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/splunk-spl/date_feature.test",
    "content": "1/1/1970\r\n12/31/1999:23:59:59\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"date\", \"1/1/1970\"],\r\n\t[\"date\", \"12/31/1999:23:59:59\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for dates.\r\n"
  },
  {
    "path": "tests/languages/splunk-spl/keyword_feature.test",
    "content": "abstract\r\naccum\r\naddcoltotals\r\naddinfo\r\naddtotals\r\nanalyzefields\r\nanomalies\r\nanomalousvalue\r\nanomalydetection\r\nappend\r\nappendcols\r\nappendcsv\r\nappendlookup\r\nappendpipe\r\narules\r\nassociate\r\naudit\r\nautoregress\r\nbin\r\nbucket\r\nbucketdir\r\nchart\r\ncluster\r\ncofilter\r\ncollect\r\nconcurrency\r\ncontingency\r\nconvert\r\ncorrelate\r\ndatamodel\r\ndbinspect\r\ndedup\r\ndelete\r\ndelta\r\ndiff\r\nerex\r\neval\r\neventcount\r\neventstats\r\nextract\r\nfieldformat\r\nfields\r\nfieldsummary\r\nfilldown\r\nfillnull\r\nfindtypes\r\nfolderize\r\nforeach\r\nformat\r\nfrom\r\ngauge\r\ngentimes\r\ngeom\r\ngeomfilter\r\ngeostats\r\nhead\r\nhighlight\r\nhistory\r\niconify\r\ninput\r\ninputcsv\r\ninputlookup\r\niplocation\r\njoin\r\nkmeans\r\nkv\r\nkvform\r\nloadjob\r\nlocalize\r\nlocalop\r\nlookup\r\nmakecontinuous\r\nmakemv\r\nmakeresults\r\nmap\r\nmcollect\r\nmetadata\r\nmetasearch\r\nmeventcollect\r\nmstats\r\nmultikv\r\nmultisearch\r\nmvcombine\r\nmvexpand\r\nnomv\r\noutlier\r\noutputcsv\r\noutputlookup\r\noutputtext\r\noverlap\r\npivot\r\npredict\r\nrangemap\r\nrare\r\nregex\r\nrelevancy\r\nreltime\r\nrename\r\nreplace\r\nrest\r\nreturn\r\nreverse\r\nrex\r\nrtorder\r\nrun\r\nsavedsearch\r\nscript\r\nscrub\r\nsearch\r\nsearchtxn\r\nselfjoin\r\nsendemail\r\nset\r\nsetfields\r\nsichart\r\nsirare\r\nsistats\r\nsitimechart\r\nsitop\r\nsort\r\nspath\r\nstats\r\nstrcat\r\nstreamstats\r\ntable\r\ntags\r\ntail\r\ntimechart\r\ntimewrap\r\ntop\r\ntransaction\r\ntranspose\r\ntrendline\r\ntscollect\r\ntstats\r\ntypeahead\r\ntypelearner\r\ntyper\r\nunion\r\nuniq\r\nuntable\r\nwhere\r\nx11\r\nxmlkv\r\nxmlunescape\r\nxpath\r\nxyseries\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"accum\"],\r\n\t[\"keyword\", \"addcoltotals\"],\r\n\t[\"keyword\", \"addinfo\"],\r\n\t[\"keyword\", \"addtotals\"],\r\n\t[\"keyword\", \"analyzefields\"],\r\n\t[\"keyword\", \"anomalies\"],\r\n\t[\"keyword\", \"anomalousvalue\"],\r\n\t[\"keyword\", \"anomalydetection\"],\r\n\t[\"keyword\", \"append\"],\r\n\t[\"keyword\", \"appendcols\"],\r\n\t[\"keyword\", \"appendcsv\"],\r\n\t[\"keyword\", \"appendlookup\"],\r\n\t[\"keyword\", \"appendpipe\"],\r\n\t[\"keyword\", \"arules\"],\r\n\t[\"keyword\", \"associate\"],\r\n\t[\"keyword\", \"audit\"],\r\n\t[\"keyword\", \"autoregress\"],\r\n\t[\"keyword\", \"bin\"],\r\n\t[\"keyword\", \"bucket\"],\r\n\t[\"keyword\", \"bucketdir\"],\r\n\t[\"keyword\", \"chart\"],\r\n\t[\"keyword\", \"cluster\"],\r\n\t[\"keyword\", \"cofilter\"],\r\n\t[\"keyword\", \"collect\"],\r\n\t[\"keyword\", \"concurrency\"],\r\n\t[\"keyword\", \"contingency\"],\r\n\t[\"keyword\", \"convert\"],\r\n\t[\"keyword\", \"correlate\"],\r\n\t[\"keyword\", \"datamodel\"],\r\n\t[\"keyword\", \"dbinspect\"],\r\n\t[\"keyword\", \"dedup\"],\r\n\t[\"keyword\", \"delete\"],\r\n\t[\"keyword\", \"delta\"],\r\n\t[\"keyword\", \"diff\"],\r\n\t[\"keyword\", \"erex\"],\r\n\t[\"keyword\", \"eval\"],\r\n\t[\"keyword\", \"eventcount\"],\r\n\t[\"keyword\", \"eventstats\"],\r\n\t[\"keyword\", \"extract\"],\r\n\t[\"keyword\", \"fieldformat\"],\r\n\t[\"keyword\", \"fields\"],\r\n\t[\"keyword\", \"fieldsummary\"],\r\n\t[\"keyword\", \"filldown\"],\r\n\t[\"keyword\", \"fillnull\"],\r\n\t[\"keyword\", \"findtypes\"],\r\n\t[\"keyword\", \"folderize\"],\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"keyword\", \"format\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"keyword\", \"gauge\"],\r\n\t[\"keyword\", \"gentimes\"],\r\n\t[\"keyword\", \"geom\"],\r\n\t[\"keyword\", \"geomfilter\"],\r\n\t[\"keyword\", \"geostats\"],\r\n\t[\"keyword\", \"head\"],\r\n\t[\"keyword\", \"highlight\"],\r\n\t[\"keyword\", \"history\"],\r\n\t[\"keyword\", \"iconify\"],\r\n\t[\"keyword\", \"input\"],\r\n\t[\"keyword\", \"inputcsv\"],\r\n\t[\"keyword\", \"inputlookup\"],\r\n\t[\"keyword\", \"iplocation\"],\r\n\t[\"keyword\", \"join\"],\r\n\t[\"keyword\", \"kmeans\"],\r\n\t[\"keyword\", \"kv\"],\r\n\t[\"keyword\", \"kvform\"],\r\n\t[\"keyword\", \"loadjob\"],\r\n\t[\"keyword\", \"localize\"],\r\n\t[\"keyword\", \"localop\"],\r\n\t[\"keyword\", \"lookup\"],\r\n\t[\"keyword\", \"makecontinuous\"],\r\n\t[\"keyword\", \"makemv\"],\r\n\t[\"keyword\", \"makeresults\"],\r\n\t[\"keyword\", \"map\"],\r\n\t[\"keyword\", \"mcollect\"],\r\n\t[\"keyword\", \"metadata\"],\r\n\t[\"keyword\", \"metasearch\"],\r\n\t[\"keyword\", \"meventcollect\"],\r\n\t[\"keyword\", \"mstats\"],\r\n\t[\"keyword\", \"multikv\"],\r\n\t[\"keyword\", \"multisearch\"],\r\n\t[\"keyword\", \"mvcombine\"],\r\n\t[\"keyword\", \"mvexpand\"],\r\n\t[\"keyword\", \"nomv\"],\r\n\t[\"keyword\", \"outlier\"],\r\n\t[\"keyword\", \"outputcsv\"],\r\n\t[\"keyword\", \"outputlookup\"],\r\n\t[\"keyword\", \"outputtext\"],\r\n\t[\"keyword\", \"overlap\"],\r\n\t[\"keyword\", \"pivot\"],\r\n\t[\"keyword\", \"predict\"],\r\n\t[\"keyword\", \"rangemap\"],\r\n\t[\"keyword\", \"rare\"],\r\n\t[\"keyword\", \"regex\"],\r\n\t[\"keyword\", \"relevancy\"],\r\n\t[\"keyword\", \"reltime\"],\r\n\t[\"keyword\", \"rename\"],\r\n\t[\"keyword\", \"replace\"],\r\n\t[\"keyword\", \"rest\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"reverse\"],\r\n\t[\"keyword\", \"rex\"],\r\n\t[\"keyword\", \"rtorder\"],\r\n\t[\"keyword\", \"run\"],\r\n\t[\"keyword\", \"savedsearch\"],\r\n\t[\"keyword\", \"script\"],\r\n\t[\"keyword\", \"scrub\"],\r\n\t[\"keyword\", \"search\"],\r\n\t[\"keyword\", \"searchtxn\"],\r\n\t[\"keyword\", \"selfjoin\"],\r\n\t[\"keyword\", \"sendemail\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"keyword\", \"setfields\"],\r\n\t[\"keyword\", \"sichart\"],\r\n\t[\"keyword\", \"sirare\"],\r\n\t[\"keyword\", \"sistats\"],\r\n\t[\"keyword\", \"sitimechart\"],\r\n\t[\"keyword\", \"sitop\"],\r\n\t[\"keyword\", \"sort\"],\r\n\t[\"keyword\", \"spath\"],\r\n\t[\"keyword\", \"stats\"],\r\n\t[\"keyword\", \"strcat\"],\r\n\t[\"keyword\", \"streamstats\"],\r\n\t[\"keyword\", \"table\"],\r\n\t[\"keyword\", \"tags\"],\r\n\t[\"keyword\", \"tail\"],\r\n\t[\"keyword\", \"timechart\"],\r\n\t[\"keyword\", \"timewrap\"],\r\n\t[\"keyword\", \"top\"],\r\n\t[\"keyword\", \"transaction\"],\r\n\t[\"keyword\", \"transpose\"],\r\n\t[\"keyword\", \"trendline\"],\r\n\t[\"keyword\", \"tscollect\"],\r\n\t[\"keyword\", \"tstats\"],\r\n\t[\"keyword\", \"typeahead\"],\r\n\t[\"keyword\", \"typelearner\"],\r\n\t[\"keyword\", \"typer\"],\r\n\t[\"keyword\", \"union\"],\r\n\t[\"keyword\", \"uniq\"],\r\n\t[\"keyword\", \"untable\"],\r\n\t[\"keyword\", \"where\"],\r\n\t[\"keyword\", \"x11\"],\r\n\t[\"keyword\", \"xmlkv\"],\r\n\t[\"keyword\", \"xmlunescape\"],\r\n\t[\"keyword\", \"xpath\"],\r\n\t[\"keyword\", \"xyseries\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/splunk-spl/number_feature.test",
    "content": "123\r\n123.456\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"123.456\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/splunk-spl/operator_feature.test",
    "content": "=\r\n== >= <= > <\r\n+ - * / %\r\n|\r\n\r\nand not or xor AND NOT OR XOR\r\nas by AS BY\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"=\"],\r\n\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"<\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"|\"],\r\n\r\n\t[\"operator-word\", \"and\"],\r\n\t[\"operator-word\", \"not\"],\r\n\t[\"operator-word\", \"or\"],\r\n\t[\"operator-word\", \"xor\"],\r\n\t[\"operator-word\", \"AND\"],\r\n\t[\"operator-word\", \"NOT\"],\r\n\t[\"operator-word\", \"OR\"],\r\n\t[\"operator-word\", \"XOR\"],\r\n\r\n\t[\"operator-word\", \"as\"],\r\n\t[\"operator-word\", \"by\"],\r\n\t[\"operator-word\", \"AS\"],\r\n\t[\"operator-word\", \"BY\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/splunk-spl/property_feature.test",
    "content": "host=\"mailsecure_log\"\n\n----------------------------------------------------\n\n[\n\t[\"property\", \"host\"],\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"mailsecure_log\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/splunk-spl/punctuation_feature.test",
    "content": "( ) [ ] ,\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \",\"]\n]\n"
  },
  {
    "path": "tests/languages/splunk-spl/string_feature.test",
    "content": "\"foo\"\r\n\"\\\"foo\\\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"\\\"\\\\\\\"foo\\\\\\\"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/sqf/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/sqf/comment_feature.test",
    "content": "// comment\r\n/*\r\n comment\r\n */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// comment\"],\r\n\t[\"comment\", \"/*\\r\\n comment\\r\\n */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/sqf/constant_feature.test",
    "content": "// examples of direct input keycodes\nDIK_0\nDIK_1\nDIK_APPS\nDIK_BACKSLASH\nDIK_CAPITAL\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// examples of direct input keycodes\"],\n\t[\"constant\", \"DIK_0\"],\n\t[\"constant\", \"DIK_1\"],\n\t[\"constant\", \"DIK_APPS\"],\n\t[\"constant\", \"DIK_BACKSLASH\"],\n\t[\"constant\", \"DIK_CAPITAL\"]\n]\n\n----------------------------------------------------\n\nChecks for constants.\n"
  },
  {
    "path": "tests/languages/sqf/function_feature.test",
    "content": "abs\naccTime\nacos\naction\nactionIDs\nactionKeys\nactionKeysImages\nactionKeysNames\nactionKeysNamesArray\nactionName\nactionParams\nactivateAddons\nactivatedAddons\nactivateKey\nadd3DENConnection\nadd3DENEventHandler\nadd3DENLayer\naddAction\naddBackpack\naddBackpackCargo\naddBackpackCargoGlobal\naddBackpackGlobal\naddCamShake\naddCuratorAddons\naddCuratorCameraArea\naddCuratorEditableObjects\naddCuratorEditingArea\naddCuratorPoints\naddEditorObject\naddEventHandler\naddForce\naddForceGeneratorRTD\naddGoggles\naddGroupIcon\naddHandgunItem\naddHeadgear\naddItem\naddItemCargo\naddItemCargoGlobal\naddItemPool\naddItemToBackpack\naddItemToUniform\naddItemToVest\naddLiveStats\naddMagazine\naddMagazineAmmoCargo\naddMagazineCargo\naddMagazineCargoGlobal\naddMagazineGlobal\naddMagazinePool\naddMagazines\naddMagazineTurret\naddMenu\naddMenuItem\naddMissionEventHandler\naddMPEventHandler\naddMusicEventHandler\naddOwnedMine\naddPlayerScores\naddPrimaryWeaponItem\naddPublicVariableEventHandler\naddRating\naddResources\naddScore\naddScoreSide\naddSecondaryWeaponItem\naddSwitchableUnit\naddTeamMember\naddToRemainsCollector\naddTorque\naddUniform\naddVehicle\naddVest\naddWaypoint\naddWeapon\naddWeaponCargo\naddWeaponCargoGlobal\naddWeaponGlobal\naddWeaponItem\naddWeaponPool\naddWeaponTurret\nadmin\nagent\nagents\nAGLToASL\naimedAtTarget\naimPos\nairDensityCurveRTD\nairDensityRTD\nairplaneThrottle\nairportSide\nAISFinishHeal\nalive\nall3DENEntities\nallAirports\nallControls\nallCurators\nallCutLayers\nallDead\nallDeadMen\nallDisplays\nallGroups\nallMapMarkers\nallMines\nallMissionObjects\nallow3DMode\nallowCrewInImmobile\nallowCuratorLogicIgnoreAreas\nallowDamage\nallowDammage\nallowFileOperations\nallowFleeing\nallowGetIn\nallowSprint\nallPlayers\nallSimpleObjects\nallSites\nallTurrets\nallUnits\nallUnitsUAV\nallVariables\nammo\nammoOnPylon\nanimate\nanimateBay\nanimateDoor\nanimatePylon\nanimateSource\nanimationNames\nanimationPhase\nanimationSourcePhase\nanimationState\nappend\napply\narmoryPoints\narrayIntersect\nasin\nASLToAGL\nASLToATL\nassert\nassignAsCargo\nassignAsCargoIndex\nassignAsCommander\nassignAsDriver\nassignAsGunner\nassignAsTurret\nassignCurator\nassignedCargo\nassignedCommander\nassignedDriver\nassignedGunner\nassignedItems\nassignedTarget\nassignedTeam\nassignedVehicle\nassignedVehicleRole\nassignItem\nassignTeam\nassignToAirport\natan\natan2\natg\nATLToASL\nattachedObject\nattachedObjects\nattachedTo\nattachObject\nattachTo\nattackEnabled\nbackpack\nbackpackCargo\nbackpackContainer\nbackpackItems\nbackpackMagazines\nbackpackSpaceFor\nbehaviour\nbenchmark\nbinocular\nblufor\nboundingBox\nboundingBoxReal\nboundingCenter\nbriefingName\nbuildingExit\nbuildingPos\nbuldozer_EnableRoadDiag\nbuldozer_IsEnabledRoadDiag\nbuldozer_LoadNewRoads\nbuldozer_reloadOperMap\nbuttonAction\nbuttonSetAction\ncadetMode\ncallExtension\ncamCommand\ncamCommit\ncamCommitPrepared\ncamCommitted\ncamConstuctionSetParams\ncamCreate\ncamDestroy\ncameraEffect\ncameraEffectEnableHUD\ncameraInterest\ncameraOn\ncameraView\ncampaignConfigFile\ncamPreload\ncamPreloaded\ncamPrepareBank\ncamPrepareDir\ncamPrepareDive\ncamPrepareFocus\ncamPrepareFov\ncamPrepareFovRange\ncamPreparePos\ncamPrepareRelPos\ncamPrepareTarget\ncamSetBank\ncamSetDir\ncamSetDive\ncamSetFocus\ncamSetFov\ncamSetFovRange\ncamSetPos\ncamSetRelPos\ncamSetTarget\ncamTarget\ncamUseNVG\ncanAdd\ncanAddItemToBackpack\ncanAddItemToUniform\ncanAddItemToVest\ncancelSimpleTaskDestination\ncanFire\ncanMove\ncanSlingLoad\ncanStand\ncanSuspend\ncanTriggerDynamicSimulation\ncanUnloadInCombat\ncanVehicleCargo\ncaptive\ncaptiveNum\ncbChecked\ncbSetChecked\nceil\nchannelEnabled\ncheatsEnabled\ncheckAIFeature\ncheckVisibility\ncivilian\nclassName\nclear3DENAttribute\nclear3DENInventory\nclearAllItemsFromBackpack\nclearBackpackCargo\nclearBackpackCargoGlobal\nclearForcesRTD\nclearGroupIcons\nclearItemCargo\nclearItemCargoGlobal\nclearItemPool\nclearMagazineCargo\nclearMagazineCargoGlobal\nclearMagazinePool\nclearOverlay\nclearRadio\nclearVehicleInit\nclearWeaponCargo\nclearWeaponCargoGlobal\nclearWeaponPool\nclientOwner\ncloseDialog\ncloseDisplay\ncloseOverlay\ncollapseObjectTree\ncollect3DENHistory\ncollectiveRTD\ncombatMode\ncommandArtilleryFire\ncommandChat\ncommander\ncommandFire\ncommandFollow\ncommandFSM\ncommandGetOut\ncommandingMenu\ncommandMove\ncommandRadio\ncommandStop\ncommandSuppressiveFire\ncommandTarget\ncommandWatch\ncomment\ncommitOverlay\ncompile\ncompileFinal\ncompletedFSM\ncomposeText\nconfigClasses\nconfigFile\nconfigHierarchy\nconfigName\nconfigNull\nconfigProperties\nconfigSourceAddonList\nconfigSourceMod\nconfigSourceModList\nconfirmSensorTarget\nconnectTerminalToUAV\ncontrolNull\ncontrolsGroupCtrl\ncopyFromClipboard\ncopyToClipboard\ncopyWaypoints\ncos\ncount\ncountEnemy\ncountFriendly\ncountSide\ncountType\ncountUnknown\ncreate3DENComposition\ncreate3DENEntity\ncreateAgent\ncreateCenter\ncreateDialog\ncreateDiaryLink\ncreateDiaryRecord\ncreateDiarySubject\ncreateDisplay\ncreateGearDialog\ncreateGroup\ncreateGuardedPoint\ncreateLocation\ncreateMarker\ncreateMarkerLocal\ncreateMenu\ncreateMine\ncreateMissionDisplay\ncreateMPCampaignDisplay\ncreateSimpleObject\ncreateSimpleTask\ncreateSite\ncreateSoundSource\ncreateTask\ncreateTeam\ncreateTrigger\ncreateUnit\ncreateVehicle\ncreateVehicleCrew\ncreateVehicleLocal\ncrew\nctAddHeader\nctAddRow\nctClear\nctCurSel\nctData\nctFindHeaderRows\nctFindRowHeader\nctHeaderControls\nctHeaderCount\nctRemoveHeaders\nctRemoveRows\nctrlActivate\nctrlAddEventHandler\nctrlAngle\nctrlAutoScrollDelay\nctrlAutoScrollRewind\nctrlAutoScrollSpeed\nctrlChecked\nctrlClassName\nctrlCommit\nctrlCommitted\nctrlCreate\nctrlDelete\nctrlEnable\nctrlEnabled\nctrlFade\nctrlHTMLLoaded\nctrlIDC\nctrlIDD\nctrlMapAnimAdd\nctrlMapAnimClear\nctrlMapAnimCommit\nctrlMapAnimDone\nctrlMapCursor\nctrlMapMouseOver\nctrlMapScale\nctrlMapScreenToWorld\nctrlMapWorldToScreen\nctrlModel\nctrlModelDirAndUp\nctrlModelScale\nctrlParent\nctrlParentControlsGroup\nctrlPosition\nctrlRemoveAllEventHandlers\nctrlRemoveEventHandler\nctrlScale\nctrlSetActiveColor\nctrlSetAngle\nctrlSetAutoScrollDelay\nctrlSetAutoScrollRewind\nctrlSetAutoScrollSpeed\nctrlSetBackgroundColor\nctrlSetChecked\nctrlSetDisabledColor\nctrlSetEventHandler\nctrlSetFade\nctrlSetFocus\nctrlSetFont\nctrlSetFontH1\nctrlSetFontH1B\nctrlSetFontH2\nctrlSetFontH2B\nctrlSetFontH3\nctrlSetFontH3B\nctrlSetFontH4\nctrlSetFontH4B\nctrlSetFontH5\nctrlSetFontH5B\nctrlSetFontH6\nctrlSetFontH6B\nctrlSetFontHeight\nctrlSetFontHeightH1\nctrlSetFontHeightH2\nctrlSetFontHeightH3\nctrlSetFontHeightH4\nctrlSetFontHeightH5\nctrlSetFontHeightH6\nctrlSetFontHeightSecondary\nctrlSetFontP\nctrlSetFontPB\nctrlSetFontSecondary\nctrlSetForegroundColor\nctrlSetModel\nctrlSetModelDirAndUp\nctrlSetModelScale\nctrlSetPixelPrecision\nctrlSetPosition\nctrlSetScale\nctrlSetStructuredText\nctrlSetText\nctrlSetTextColor\nctrlSetTextColorSecondary\nctrlSetTextSecondary\nctrlSetTooltip\nctrlSetTooltipColorBox\nctrlSetTooltipColorShade\nctrlSetTooltipColorText\nctrlShow\nctrlShown\nctrlText\nctrlTextHeight\nctrlTextSecondary\nctrlTextWidth\nctrlType\nctrlVisible\nctRowControls\nctRowCount\nctSetCurSel\nctSetData\nctSetHeaderTemplate\nctSetRowTemplate\nctSetValue\nctValue\ncuratorAddons\ncuratorCamera\ncuratorCameraArea\ncuratorCameraAreaCeiling\ncuratorCoef\ncuratorEditableObjects\ncuratorEditingArea\ncuratorEditingAreaType\ncuratorMouseOver\ncuratorPoints\ncuratorRegisteredObjects\ncuratorSelected\ncuratorWaypointCost\ncurrent3DENOperation\ncurrentChannel\ncurrentCommand\ncurrentMagazine\ncurrentMagazineDetail\ncurrentMagazineDetailTurret\ncurrentMagazineTurret\ncurrentMuzzle\ncurrentNamespace\ncurrentTask\ncurrentTasks\ncurrentThrowable\ncurrentVisionMode\ncurrentWaypoint\ncurrentWeapon\ncurrentWeaponMode\ncurrentWeaponTurret\ncurrentZeroing\ncursorObject\ncursorTarget\ncustomChat\ncustomRadio\ncutFadeOut\ncutObj\ncutRsc\ncutText\ndamage\ndate\ndateToNumber\ndaytime\ndeActivateKey\ndebriefingText\ndebugFSM\ndebugLog\ndeg\ndelete3DENEntities\ndeleteAt\ndeleteCenter\ndeleteCollection\ndeleteEditorObject\ndeleteGroup\ndeleteGroupWhenEmpty\ndeleteIdentity\ndeleteLocation\ndeleteMarker\ndeleteMarkerLocal\ndeleteRange\ndeleteResources\ndeleteSite\ndeleteStatus\ndeleteTeam\ndeleteVehicle\ndeleteVehicleCrew\ndeleteWaypoint\ndetach\ndetectedMines\ndiag_activeMissionFSMs\ndiag_activeScripts\ndiag_activeSQFScripts\ndiag_activeSQSScripts\ndiag_captureFrame\ndiag_captureFrameToFile\ndiag_captureSlowFrame\ndiag_codePerformance\ndiag_drawMode\ndiag_dynamicSimulationEnd\ndiag_enable\ndiag_enabled\ndiag_fps\ndiag_fpsMin\ndiag_frameNo\ndiag_lightNewLoad\ndiag_list\ndiag_log\ndiag_logSlowFrame\ndiag_mergeConfigFile\ndiag_recordTurretLimits\ndiag_setLightNew\ndiag_tickTime\ndiag_toggle\ndialog\ndiarySubjectExists\ndidJIP\ndidJIPOwner\ndifficulty\ndifficultyEnabled\ndifficultyEnabledRTD\ndifficultyOption\ndirection\ndirectSay\ndisableAI\ndisableCollisionWith\ndisableConversation\ndisableDebriefingStats\ndisableMapIndicators\ndisableNVGEquipment\ndisableRemoteSensors\ndisableSerialization\ndisableTIEquipment\ndisableUAVConnectability\ndisableUserInput\ndisplayAddEventHandler\ndisplayCtrl\ndisplayNull\ndisplayParent\ndisplayRemoveAllEventHandlers\ndisplayRemoveEventHandler\ndisplaySetEventHandler\ndissolveTeam\ndistance\ndistance2D\ndistanceSqr\ndistributionRegion\ndo3DENAction\ndoArtilleryFire\ndoFire\ndoFollow\ndoFSM\ndoGetOut\ndoMove\ndoorPhase\ndoStop\ndoSuppressiveFire\ndoTarget\ndoWatch\ndrawArrow\ndrawEllipse\ndrawIcon\ndrawIcon3D\ndrawLine\ndrawLine3D\ndrawLink\ndrawLocation\ndrawPolygon\ndrawRectangle\ndrawTriangle\ndriver\ndrop\ndynamicSimulationDistance\ndynamicSimulationDistanceCoef\ndynamicSimulationEnabled\ndynamicSimulationSystemEnabled\neast\nedit3DENMissionAttributes\neditObject\neditorSetEventHandler\neffectiveCommander\nemptyPositions\nenableAI\nenableAIFeature\nenableAimPrecision\nenableAttack\nenableAudioFeature\nenableAutoStartUpRTD\nenableAutoTrimRTD\nenableCamShake\nenableCaustics\nenableChannel\nenableCollisionWith\nenableCopilot\nenableDebriefingStats\nenableDiagLegend\nenableDynamicSimulation\nenableDynamicSimulationSystem\nenableEndDialog\nenableEngineArtillery\nenableEnvironment\nenableFatigue\nenableGunLights\nenableInfoPanelComponent\nenableIRLasers\nenableMimics\nenablePersonTurret\nenableRadio\nenableReload\nenableRopeAttach\nenableSatNormalOnDetail\nenableSaving\nenableSentences\nenableSimulation\nenableSimulationGlobal\nenableStamina\nenableStressDamage\nenableTeamSwitch\nenableTraffic\nenableUAVConnectability\nenableUAVWaypoints\nenableVehicleCargo\nenableVehicleSensor\nenableWeaponDisassembly\nendl\nendLoadingScreen\nendMission\nengineOn\nenginesIsOnRTD\nenginesPowerRTD\nenginesRpmRTD\nenginesTorqueRTD\nentities\nenvironmentEnabled\nestimatedEndServerTime\nestimatedTimeLeft\nevalObjectArgument\neveryBackpack\neveryContainer\nexec\nexecEditorScript\nexp\nexpectedDestination\nexportJIPMessages\neyeDirection\neyePos\nface\nfaction\nfadeMusic\nfadeRadio\nfadeSound\nfadeSpeech\nfailMission\nfillWeaponsFromPool\nfind\nfindCover\nfindDisplay\nfindEditorObject\nfindEmptyPosition\nfindEmptyPositionReady\nfindIf\nfindNearestEnemy\nfinishMissionInit\nfinite\nfire\nfireAtTarget\nfirstBackpack\nflag\nflagAnimationPhase\nflagOwner\nflagSide\nflagTexture\nfleeing\nfloor\nflyInHeight\nflyInHeightASL\nfog\nfogForecast\nfogParams\nforceAddUniform\nforceAtPositionRTD\nforcedMap\nforceEnd\nforceFlagTexture\nforceFollowRoad\nforceGeneratorRTD\nforceMap\nforceRespawn\nforceSpeed\nforceWalk\nforceWeaponFire\nforceWeatherChange\nforgetTarget\nformat\nformation\nformationDirection\nformationLeader\nformationMembers\nformationPosition\nformationTask\nformatText\nformLeader\nfreeLook\nfromEditor\nfuel\nfullCrew\ngearIDCAmmoCount\ngearSlotAmmoCount\ngearSlotData\nget3DENActionState\nget3DENAttribute\nget3DENCamera\nget3DENConnections\nget3DENEntity\nget3DENEntityID\nget3DENGrid\nget3DENIconsVisible\nget3DENLayerEntities\nget3DENLinesVisible\nget3DENMissionAttribute\nget3DENMouseOver\nget3DENSelected\ngetAimingCoef\ngetAllEnvSoundControllers\ngetAllHitPointsDamage\ngetAllOwnedMines\ngetAllSoundControllers\ngetAmmoCargo\ngetAnimAimPrecision\ngetAnimSpeedCoef\ngetArray\ngetArtilleryAmmo\ngetArtilleryComputerSettings\ngetArtilleryETA\ngetAssignedCuratorLogic\ngetAssignedCuratorUnit\ngetBackpackCargo\ngetBleedingRemaining\ngetBurningValue\ngetCameraViewDirection\ngetCargoIndex\ngetCenterOfMass\ngetClientState\ngetClientStateNumber\ngetCompatiblePylonMagazines\ngetConnectedUAV\ngetContainerMaxLoad\ngetCursorObjectParams\ngetCustomAimCoef\ngetDammage\ngetDescription\ngetDir\ngetDirVisual\ngetDLCAssetsUsage\ngetDLCAssetsUsageByName\ngetDLCs\ngetDLCUsageTime\ngetEditorCamera\ngetEditorMode\ngetEditorObjectScope\ngetElevationOffset\ngetEngineTargetRpmRTD\ngetEnvSoundController\ngetFatigue\ngetFieldManualStartPage\ngetForcedFlagTexture\ngetFriend\ngetFSMVariable\ngetFuelCargo\ngetGroupIcon\ngetGroupIconParams\ngetGroupIcons\ngetHideFrom\ngetHit\ngetHitIndex\ngetHitPointDamage\ngetItemCargo\ngetMagazineCargo\ngetMarkerColor\ngetMarkerPos\ngetMarkerSize\ngetMarkerType\ngetMass\ngetMissionConfig\ngetMissionConfigValue\ngetMissionDLCs\ngetMissionLayerEntities\ngetMissionLayers\ngetModelInfo\ngetMousePosition\ngetMusicPlayedTime\ngetNumber\ngetObjectArgument\ngetObjectChildren\ngetObjectDLC\ngetObjectMaterials\ngetObjectProxy\ngetObjectTextures\ngetObjectType\ngetObjectViewDistance\ngetOxygenRemaining\ngetPersonUsedDLCs\ngetPilotCameraDirection\ngetPilotCameraPosition\ngetPilotCameraRotation\ngetPilotCameraTarget\ngetPlateNumber\ngetPlayerChannel\ngetPlayerScores\ngetPlayerUID\ngetPlayerUIDOld\ngetPos\ngetPosASL\ngetPosASLVisual\ngetPosASLW\ngetPosATL\ngetPosATLVisual\ngetPosVisual\ngetPosWorld\ngetPylonMagazines\ngetRelDir\ngetRelPos\ngetRemoteSensorsDisabled\ngetRepairCargo\ngetResolution\ngetRotorBrakeRTD\ngetShadowDistance\ngetShotParents\ngetSlingLoad\ngetSoundController\ngetSoundControllerResult\ngetSpeed\ngetStamina\ngetStatValue\ngetSuppression\ngetTerrainGrid\ngetTerrainHeightASL\ngetText\ngetTotalDLCUsageTime\ngetTrimOffsetRTD\ngetUnitLoadout\ngetUnitTrait\ngetUserMFDText\ngetUserMFDValue\ngetVariable\ngetVehicleCargo\ngetWeaponCargo\ngetWeaponSway\ngetWingsOrientationRTD\ngetWingsPositionRTD\ngetWPPos\nglanceAt\nglobalChat\nglobalRadio\ngoggles\ngroup\ngroupChat\ngroupFromNetId\ngroupIconSelectable\ngroupIconsVisible\ngroupId\ngroupOwner\ngroupRadio\ngroupSelectedUnits\ngroupSelectUnit\ngrpNull\ngunner\ngusts\nhalt\nhandgunItems\nhandgunMagazine\nhandgunWeapon\nhandsHit\nhasInterface\nhasPilotCamera\nhasWeapon\nhcAllGroups\nhcGroupParams\nhcLeader\nhcRemoveAllGroups\nhcRemoveGroup\nhcSelected\nhcSelectGroup\nhcSetGroup\nhcShowBar\nhcShownBar\nheadgear\nhideBody\nhideObject\nhideObjectGlobal\nhideSelection\nhint\nhintC\nhintCadet\nhintSilent\nhmd\nhostMission\nhtmlLoad\nHUDMovementLevels\nhumidity\nimage\nimportAllGroups\nimportance\nin\ninArea\ninAreaArray\nincapacitatedState\nindependent\ninflame\ninflamed\ninfoPanel\ninfoPanelComponentEnabled\ninfoPanelComponents\ninfoPanels\ninGameUISetEventHandler\ninheritsFrom\ninitAmbientLife\ninPolygon\ninputAction\ninRangeOfArtillery\ninsertEditorObject\nintersect\nis3DEN\nis3DENMultiplayer\nisAbleToBreathe\nisAgent\nisAimPrecisionEnabled\nisArray\nisAutoHoverOn\nisAutonomous\nisAutoStartUpEnabledRTD\nisAutotest\nisAutoTrimOnRTD\nisBleeding\nisBurning\nisClass\nisCollisionLightOn\nisCopilotEnabled\nisDamageAllowed\nisDedicated\nisDLCAvailable\nisEngineOn\nisEqualTo\nisEqualType\nisEqualTypeAll\nisEqualTypeAny\nisEqualTypeArray\nisEqualTypeParams\nisFilePatchingEnabled\nisFlashlightOn\nisFlatEmpty\nisForcedWalk\nisFormationLeader\nisGroupDeletedWhenEmpty\nisHidden\nisInRemainsCollector\nisInstructorFigureEnabled\nisIRLaserOn\nisKeyActive\nisKindOf\nisLaserOn\nisLightOn\nisLocalized\nisManualFire\nisMarkedForCollection\nisMultiplayer\nisMultiplayerSolo\nisNil\nisNull\nisNumber\nisObjectHidden\nisObjectRTD\nisOnRoad\nisPipEnabled\nisPlayer\nisRealTime\nisRemoteExecuted\nisRemoteExecutedJIP\nisServer\nisShowing3DIcons\nisSimpleObject\nisSprintAllowed\nisStaminaEnabled\nisSteamMission\nisStreamFriendlyUIEnabled\nisStressDamageEnabled\nisText\nisTouchingGround\nisTurnedOut\nisTutHintsEnabled\nisUAVConnectable\nisUAVConnected\nisUIContext\nisUniformAllowed\nisVehicleCargo\nisVehicleRadarOn\nisVehicleSensorEnabled\nisWalking\nisWeaponDeployed\nisWeaponRested\nitemCargo\nitems\nitemsWithMagazines\njoin\njoinAs\njoinAsSilent\njoinSilent\njoinString\nkbAddDatabase\nkbAddDatabaseTargets\nkbAddTopic\nkbHasTopic\nkbReact\nkbRemoveTopic\nkbTell\nkbWasSaid\nkeyImage\nkeyName\nknowsAbout\nland\nlandAt\nlandResult\nlanguage\nlaserTarget\nlbAdd\nlbClear\nlbColor\nlbColorRight\nlbCurSel\nlbData\nlbDelete\nlbIsSelected\nlbPicture\nlbPictureRight\nlbSelection\nlbSetColor\nlbSetColorRight\nlbSetCurSel\nlbSetData\nlbSetPicture\nlbSetPictureColor\nlbSetPictureColorDisabled\nlbSetPictureColorSelected\nlbSetPictureRight\nlbSetPictureRightColor\nlbSetPictureRightColorDisabled\nlbSetPictureRightColorSelected\nlbSetSelectColor\nlbSetSelectColorRight\nlbSetSelected\nlbSetText\nlbSetTextRight\nlbSetTooltip\nlbSetValue\nlbSize\nlbSort\nlbSortByValue\nlbText\nlbTextRight\nlbValue\nleader\nleaderboardDeInit\nleaderboardGetRows\nleaderboardInit\nleaderboardRequestRowsFriends\nleaderboardRequestRowsGlobal\nleaderboardRequestRowsGlobalAroundUser\nleaderboardsRequestUploadScore\nleaderboardsRequestUploadScoreKeepBest\nleaderboardState\nleaveVehicle\nlibraryCredits\nlibraryDisclaimers\nlifeState\nlightAttachObject\nlightDetachObject\nlightIsOn\nlightnings\nlimitSpeed\nlinearConversion\nlineBreak\nlineIntersects\nlineIntersectsObjs\nlineIntersectsSurfaces\nlineIntersectsWith\nlinkItem\nlist\nlistObjects\nlistRemoteTargets\nlistVehicleSensors\nln\nlnbAddArray\nlnbAddColumn\nlnbAddRow\nlnbClear\nlnbColor\nlnbColorRight\nlnbCurSelRow\nlnbData\nlnbDeleteColumn\nlnbDeleteRow\nlnbGetColumnsPosition\nlnbPicture\nlnbPictureRight\nlnbSetColor\nlnbSetColorRight\nlnbSetColumnsPos\nlnbSetCurSelRow\nlnbSetData\nlnbSetPicture\nlnbSetPictureColor\nlnbSetPictureColorRight\nlnbSetPictureColorSelected\nlnbSetPictureColorSelectedRight\nlnbSetPictureRight\nlnbSetText\nlnbSetTextRight\nlnbSetValue\nlnbSize\nlnbSort\nlnbSortByValue\nlnbText\nlnbTextRight\nlnbValue\nload\nloadAbs\nloadBackpack\nloadFile\nloadGame\nloadIdentity\nloadMagazine\nloadOverlay\nloadStatus\nloadUniform\nloadVest\nlocal\nlocalize\nlocationNull\nlocationPosition\nlock\nlockCameraTo\nlockCargo\nlockDriver\nlocked\nlockedCargo\nlockedDriver\nlockedTurret\nlockIdentity\nlockTurret\nlockWP\nlog\nlogEntities\nlogNetwork\nlogNetworkTerminate\nlookAt\nlookAtPos\nmagazineCargo\nmagazines\nmagazinesAllTurrets\nmagazinesAmmo\nmagazinesAmmoCargo\nmagazinesAmmoFull\nmagazinesDetail\nmagazinesDetailBackpack\nmagazinesDetailUniform\nmagazinesDetailVest\nmagazinesTurret\nmagazineTurretAmmo\nmapAnimAdd\nmapAnimClear\nmapAnimCommit\nmapAnimDone\nmapCenterOnCamera\nmapGridPosition\nmarkAsFinishedOnSteam\nmarkerAlpha\nmarkerBrush\nmarkerColor\nmarkerDir\nmarkerPos\nmarkerShape\nmarkerSize\nmarkerText\nmarkerType\nmax\nmembers\nmenuAction\nmenuAdd\nmenuChecked\nmenuClear\nmenuCollapse\nmenuData\nmenuDelete\nmenuEnable\nmenuEnabled\nmenuExpand\nmenuHover\nmenuPicture\nmenuSetAction\nmenuSetCheck\nmenuSetData\nmenuSetPicture\nmenuSetValue\nmenuShortcut\nmenuShortcutText\nmenuSize\nmenuSort\nmenuText\nmenuURL\nmenuValue\nmin\nmineActive\nmineDetectedBy\nmissionConfigFile\nmissionDifficulty\nmissionName\nmissionNamespace\nmissionStart\nmissionVersion\nmodelToWorld\nmodelToWorldVisual\nmodelToWorldVisualWorld\nmodelToWorldWorld\nmodParams\nmoonIntensity\nmoonPhase\nmorale\nmove\nmove3DENCamera\nmoveInAny\nmoveInCargo\nmoveInCommander\nmoveInDriver\nmoveInGunner\nmoveInTurret\nmoveObjectToEnd\nmoveOut\nmoveTime\nmoveTo\nmoveToCompleted\nmoveToFailed\nmusicVolume\nname\nnameSound\nnearEntities\nnearestBuilding\nnearestLocation\nnearestLocations\nnearestLocationWithDubbing\nnearestObject\nnearestObjects\nnearestTerrainObjects\nnearObjects\nnearObjectsReady\nnearRoads\nnearSupplies\nnearTargets\nneedReload\nnetId\nnetObjNull\nnewOverlay\nnextMenuItemIndex\nnextWeatherChange\nnMenuItems\nnumberOfEnginesRTD\nnumberToDate\nobjectCurators\nobjectFromNetId\nobjectParent\nobjNull\nobjStatus\nonBriefingGear\nonBriefingGroup\nonBriefingNotes\nonBriefingPlan\nonBriefingTeamSwitch\nonCommandModeChanged\nonDoubleClick\nonEachFrame\nonGroupIconClick\nonGroupIconOverEnter\nonGroupIconOverLeave\nonHCGroupSelectionChanged\nonMapSingleClick\nonPlayerConnected\nonPlayerDisconnected\nonPreloadFinished\nonPreloadStarted\nonShowNewObject\nonTeamSwitch\nopenCuratorInterface\nopenDLCPage\nopenDSInterface\nopenMap\nopenSteamApp\nopenYoutubeVideo\nopfor\norderGetIn\novercast\novercastForecast\nowner\nparam\nparams\nparseNumber\nparseSimpleArray\nparseText\nparsingNamespace\nparticlesQuality\npi\npickWeaponPool\npitch\npixelGrid\npixelGridBase\npixelGridNoUIScale\npixelH\npixelW\nplayableSlotsNumber\nplayableUnits\nplayAction\nplayActionNow\nplayer\nplayerRespawnTime\nplayerSide\nplayersNumber\nplayGesture\nplayMission\nplayMove\nplayMoveNow\nplayMusic\nplayScriptedMission\nplaySound\nplaySound3D\nposition\npositionCameraToWorld\nposScreenToWorld\nposWorldToScreen\nppEffectAdjust\nppEffectCommit\nppEffectCommitted\nppEffectCreate\nppEffectDestroy\nppEffectEnable\nppEffectEnabled\nppEffectForceInNVG\nprecision\npreloadCamera\npreloadObject\npreloadSound\npreloadTitleObj\npreloadTitleRsc\nprimaryWeapon\nprimaryWeaponItems\nprimaryWeaponMagazine\npriority\nprocessDiaryLink\nprocessInitCommands\nproductVersion\nprofileName\nprofileNamespace\nprofileNameSteam\nprogressLoadingScreen\nprogressPosition\nprogressSetPosition\npublicVariable\npublicVariableClient\npublicVariableServer\npushBack\npushBackUnique\nputWeaponPool\nqueryItemsPool\nqueryMagazinePool\nqueryWeaponPool\nrad\nradioChannelAdd\nradioChannelCreate\nradioChannelRemove\nradioChannelSetCallSign\nradioChannelSetLabel\nradioVolume\nrain\nrainbow\nrandom\nrank\nrankId\nrating\nrectangular\nregisteredTasks\nregisterTask\nreload\nreloadEnabled\nremoteControl\nremoteExec\nremoteExecCall\nremoteExecutedOwner\nremove3DENConnection\nremove3DENEventHandler\nremove3DENLayer\nremoveAction\nremoveAll3DENEventHandlers\nremoveAllActions\nremoveAllAssignedItems\nremoveAllContainers\nremoveAllCuratorAddons\nremoveAllCuratorCameraAreas\nremoveAllCuratorEditingAreas\nremoveAllEventHandlers\nremoveAllHandgunItems\nremoveAllItems\nremoveAllItemsWithMagazines\nremoveAllMissionEventHandlers\nremoveAllMPEventHandlers\nremoveAllMusicEventHandlers\nremoveAllOwnedMines\nremoveAllPrimaryWeaponItems\nremoveAllWeapons\nremoveBackpack\nremoveBackpackGlobal\nremoveCuratorAddons\nremoveCuratorCameraArea\nremoveCuratorEditableObjects\nremoveCuratorEditingArea\nremoveDrawIcon\nremoveDrawLinks\nremoveEventHandler\nremoveFromRemainsCollector\nremoveGoggles\nremoveGroupIcon\nremoveHandgunItem\nremoveHeadgear\nremoveItem\nremoveItemFromBackpack\nremoveItemFromUniform\nremoveItemFromVest\nremoveItems\nremoveMagazine\nremoveMagazineGlobal\nremoveMagazines\nremoveMagazinesTurret\nremoveMagazineTurret\nremoveMenuItem\nremoveMissionEventHandler\nremoveMPEventHandler\nremoveMusicEventHandler\nremoveOwnedMine\nremovePrimaryWeaponItem\nremoveSecondaryWeaponItem\nremoveSimpleTask\nremoveSwitchableUnit\nremoveTeamMember\nremoveUniform\nremoveVest\nremoveWeapon\nremoveWeaponAttachmentCargo\nremoveWeaponCargo\nremoveWeaponGlobal\nremoveWeaponTurret\nreportRemoteTarget\nrequiredVersion\nresetCamShake\nresetSubgroupDirection\nresistance\nresize\nresources\nrespawnVehicle\nrestartEditorCamera\nreveal\nrevealMine\nreverse\nreversedMouseY\nroadAt\nroadsConnectedTo\nroleDescription\nropeAttachedObjects\nropeAttachedTo\nropeAttachEnabled\nropeAttachTo\nropeCreate\nropeCut\nropeDestroy\nropeDetach\nropeEndPosition\nropeLength\nropes\nropeUnwind\nropeUnwound\nrotorsForcesRTD\nrotorsRpmRTD\nround\nrunInitScript\nsafeZoneH\nsafeZoneW\nsafeZoneWAbs\nsafeZoneX\nsafeZoneXAbs\nsafeZoneY\nsave3DENInventory\nsaveGame\nsaveIdentity\nsaveJoysticks\nsaveOverlay\nsaveProfileNamespace\nsaveStatus\nsaveVar\nsavingEnabled\nsay\nsay2D\nsay3D\nscore\nscoreSide\nscreenshot\nscreenToWorld\nscriptDone\nscriptName\nscriptNull\nscudState\nsecondaryWeapon\nsecondaryWeaponItems\nsecondaryWeaponMagazine\nselect\nselectBestPlaces\nselectDiarySubject\nselectedEditorObjects\nselectEditorObject\nselectionNames\nselectionPosition\nselectLeader\nselectMax\nselectMin\nselectNoPlayer\nselectPlayer\nselectRandom\nselectRandomWeighted\nselectWeapon\nselectWeaponTurret\nsendAUMessage\nsendSimpleCommand\nsendTask\nsendTaskResult\nsendUDPMessage\nserverCommand\nserverCommandAvailable\nserverCommandExecutable\nserverName\nserverTime\nset\nset3DENAttribute\nset3DENAttributes\nset3DENGrid\nset3DENIconsVisible\nset3DENLayer\nset3DENLinesVisible\nset3DENLogicType\nset3DENMissionAttribute\nset3DENMissionAttributes\nset3DENModelsVisible\nset3DENObjectType\nset3DENSelected\nsetAccTime\nsetActualCollectiveRTD\nsetAirplaneThrottle\nsetAirportSide\nsetAmmo\nsetAmmoCargo\nsetAmmoOnPylon\nsetAnimSpeedCoef\nsetAperture\nsetApertureNew\nsetArmoryPoints\nsetAttributes\nsetAutonomous\nsetBehaviour\nsetBleedingRemaining\nsetBrakesRTD\nsetCameraInterest\nsetCamShakeDefParams\nsetCamShakeParams\nsetCamUseTI\nsetCaptive\nsetCenterOfMass\nsetCollisionLight\nsetCombatMode\nsetCompassOscillation\nsetConvoySeparation\nsetCuratorCameraAreaCeiling\nsetCuratorCoef\nsetCuratorEditingAreaType\nsetCuratorWaypointCost\nsetCurrentChannel\nsetCurrentTask\nsetCurrentWaypoint\nsetCustomAimCoef\nsetCustomWeightRTD\nsetDamage\nsetDammage\nsetDate\nsetDebriefingText\nsetDefaultCamera\nsetDestination\nsetDetailMapBlendPars\nsetDir\nsetDirection\nsetDrawIcon\nsetDriveOnPath\nsetDropInterval\nsetDynamicSimulationDistance\nsetDynamicSimulationDistanceCoef\nsetEditorMode\nsetEditorObjectScope\nsetEffectCondition\nsetEngineRpmRTD\nsetFace\nsetFaceAnimation\nsetFatigue\nsetFeatureType\nsetFlagAnimationPhase\nsetFlagOwner\nsetFlagSide\nsetFlagTexture\nsetFog\nsetForceGeneratorRTD\nsetFormation\nsetFormationTask\nsetFormDir\nsetFriend\nsetFromEditor\nsetFSMVariable\nsetFuel\nsetFuelCargo\nsetGroupIcon\nsetGroupIconParams\nsetGroupIconsSelectable\nsetGroupIconsVisible\nsetGroupId\nsetGroupIdGlobal\nsetGroupOwner\nsetGusts\nsetHideBehind\nsetHit\nsetHitIndex\nsetHitPointDamage\nsetHorizonParallaxCoef\nsetHUDMovementLevels\nsetIdentity\nsetImportance\nsetInfoPanel\nsetLeader\nsetLightAmbient\nsetLightAttenuation\nsetLightBrightness\nsetLightColor\nsetLightDayLight\nsetLightFlareMaxDistance\nsetLightFlareSize\nsetLightIntensity\nsetLightnings\nsetLightUseFlare\nsetLocalWindParams\nsetMagazineTurretAmmo\nsetMarkerAlpha\nsetMarkerAlphaLocal\nsetMarkerBrush\nsetMarkerBrushLocal\nsetMarkerColor\nsetMarkerColorLocal\nsetMarkerDir\nsetMarkerDirLocal\nsetMarkerPos\nsetMarkerPosLocal\nsetMarkerShape\nsetMarkerShapeLocal\nsetMarkerSize\nsetMarkerSizeLocal\nsetMarkerText\nsetMarkerTextLocal\nsetMarkerType\nsetMarkerTypeLocal\nsetMass\nsetMimic\nsetMousePosition\nsetMusicEffect\nsetMusicEventHandler\nsetName\nsetNameSound\nsetObjectArguments\nsetObjectMaterial\nsetObjectMaterialGlobal\nsetObjectProxy\nsetObjectTexture\nsetObjectTextureGlobal\nsetObjectViewDistance\nsetOvercast\nsetOwner\nsetOxygenRemaining\nsetParticleCircle\nsetParticleClass\nsetParticleFire\nsetParticleParams\nsetParticleRandom\nsetPilotCameraDirection\nsetPilotCameraRotation\nsetPilotCameraTarget\nsetPilotLight\nsetPiPEffect\nsetPitch\nsetPlateNumber\nsetPlayable\nsetPlayerRespawnTime\nsetPos\nsetPosASL\nsetPosASL2\nsetPosASLW\nsetPosATL\nsetPosition\nsetPosWorld\nsetPylonLoadOut\nsetPylonsPriority\nsetRadioMsg\nsetRain\nsetRainbow\nsetRandomLip\nsetRank\nsetRectangular\nsetRepairCargo\nsetRotorBrakeRTD\nsetShadowDistance\nsetShotParents\nsetSide\nsetSimpleTaskAlwaysVisible\nsetSimpleTaskCustomData\nsetSimpleTaskDescription\nsetSimpleTaskDestination\nsetSimpleTaskTarget\nsetSimpleTaskType\nsetSimulWeatherLayers\nsetSize\nsetSkill\nsetSlingLoad\nsetSoundEffect\nsetSpeaker\nsetSpeech\nsetSpeedMode\nsetStamina\nsetStaminaScheme\nsetStatValue\nsetSuppression\nsetSystemOfUnits\nsetTargetAge\nsetTaskMarkerOffset\nsetTaskResult\nsetTaskState\nsetTerrainGrid\nsetText\nsetTimeMultiplier\nsetTitleEffect\nsetToneMapping\nsetToneMappingParams\nsetTrafficDensity\nsetTrafficDistance\nsetTrafficGap\nsetTrafficSpeed\nsetTriggerActivation\nsetTriggerArea\nsetTriggerStatements\nsetTriggerText\nsetTriggerTimeout\nsetTriggerType\nsetType\nsetUnconscious\nsetUnitAbility\nsetUnitLoadout\nsetUnitPos\nsetUnitPosWeak\nsetUnitRank\nsetUnitRecoilCoefficient\nsetUnitTrait\nsetUnloadInCombat\nsetUserActionText\nsetUserMFDText\nsetUserMFDValue\nsetVariable\nsetVectorDir\nsetVectorDirAndUp\nsetVectorUp\nsetVehicleAmmo\nsetVehicleAmmoDef\nsetVehicleArmor\nsetVehicleCargo\nsetVehicleId\nsetVehicleInit\nsetVehicleLock\nsetVehiclePosition\nsetVehicleRadar\nsetVehicleReceiveRemoteTargets\nsetVehicleReportOwnPosition\nsetVehicleReportRemoteTargets\nsetVehicleTIPars\nsetVehicleVarName\nsetVelocity\nsetVelocityModelSpace\nsetVelocityTransformation\nsetViewDistance\nsetVisibleIfTreeCollapsed\nsetWantedRpmRTD\nsetWaves\nsetWaypointBehaviour\nsetWaypointCombatMode\nsetWaypointCompletionRadius\nsetWaypointDescription\nsetWaypointForceBehaviour\nsetWaypointFormation\nsetWaypointHousePosition\nsetWaypointLoiterRadius\nsetWaypointLoiterType\nsetWaypointName\nsetWaypointPosition\nsetWaypointScript\nsetWaypointSpeed\nsetWaypointStatements\nsetWaypointTimeout\nsetWaypointType\nsetWaypointVisible\nsetWeaponReloadingTime\nsetWind\nsetWindDir\nsetWindForce\nsetWindStr\nsetWingForceScaleRTD\nsetWPPos\nshow3DIcons\nshowChat\nshowCinemaBorder\nshowCommandingMenu\nshowCompass\nshowCuratorCompass\nshowGPS\nshowHUD\nshowLegend\nshowMap\nshownArtilleryComputer\nshownChat\nshownCompass\nshownCuratorCompass\nshowNewEditorObject\nshownGPS\nshownHUD\nshownMap\nshownPad\nshownRadio\nshownScoretable\nshownUAVFeed\nshownWarrant\nshownWatch\nshowPad\nshowRadio\nshowScoretable\nshowSubtitles\nshowUAVFeed\nshowWarrant\nshowWatch\nshowWaypoint\nshowWaypoints\nside\nsideAmbientLife\nsideChat\nsideEmpty\nsideEnemy\nsideFriendly\nsideLogic\nsideRadio\nsideUnknown\nsimpleTasks\nsimulationEnabled\nsimulCloudDensity\nsimulCloudOcclusion\nsimulInClouds\nsimulWeatherSync\nsin\nsize\nsizeOf\nskill\nskillFinal\nskipTime\nsleep\nsliderPosition\nsliderRange\nsliderSetPosition\nsliderSetRange\nsliderSetSpeed\nsliderSpeed\nslingLoadAssistantShown\nsoldierMagazines\nsomeAmmo\nsort\nsoundVolume\nspeaker\nspeed\nspeedMode\nsplitString\nsqrt\nsquadParams\nstance\nstartLoadingScreen\nstop\nstopEngineRTD\nstopped\nstr\nsunOrMoon\nsupportInfo\nsuppressFor\nsurfaceIsWater\nsurfaceNormal\nsurfaceType\nswimInDepth\nswitchableUnits\nswitchAction\nswitchCamera\nswitchGesture\nswitchLight\nswitchMove\nsynchronizedObjects\nsynchronizedTriggers\nsynchronizedWaypoints\nsynchronizeObjectsAdd\nsynchronizeObjectsRemove\nsynchronizeTrigger\nsynchronizeWaypoint\nsystemChat\nsystemOfUnits\ntan\ntargetKnowledge\ntargets\ntargetsAggregate\ntargetsQuery\ntaskAlwaysVisible\ntaskChildren\ntaskCompleted\ntaskCustomData\ntaskDescription\ntaskDestination\ntaskHint\ntaskMarkerOffset\ntaskNull\ntaskParent\ntaskResult\ntaskState\ntaskType\nteamMember\nteamMemberNull\nteamName\nteams\nteamSwitch\nteamSwitchEnabled\nteamType\nterminate\nterrainIntersect\nterrainIntersectASL\nterrainIntersectAtASL\ntext\ntextLog\ntextLogFormat\ntg\ntime\ntimeMultiplier\ntitleCut\ntitleFadeOut\ntitleObj\ntitleRsc\ntitleText\ntoArray\ntoFixed\ntoLower\ntoString\ntoUpper\ntriggerActivated\ntriggerActivation\ntriggerArea\ntriggerAttachedVehicle\ntriggerAttachObject\ntriggerAttachVehicle\ntriggerDynamicSimulation\ntriggerStatements\ntriggerText\ntriggerTimeout\ntriggerTimeoutCurrent\ntriggerType\nturretLocal\nturretOwner\nturretUnit\ntvAdd\ntvClear\ntvCollapse\ntvCollapseAll\ntvCount\ntvCurSel\ntvData\ntvDelete\ntvExpand\ntvExpandAll\ntvPicture\ntvPictureRight\ntvSetColor\ntvSetCurSel\ntvSetData\ntvSetPicture\ntvSetPictureColor\ntvSetPictureColorDisabled\ntvSetPictureColorSelected\ntvSetPictureRight\ntvSetPictureRightColor\ntvSetPictureRightColorDisabled\ntvSetPictureRightColorSelected\ntvSetSelectColor\ntvSetText\ntvSetTooltip\ntvSetValue\ntvSort\ntvSortByValue\ntvText\ntvTooltip\ntvValue\ntype\ntypeName\ntypeOf\nUAVControl\nuiNamespace\nuiSleep\nunassignCurator\nunassignItem\nunassignTeam\nunassignVehicle\nunderwater\nuniform\nuniformContainer\nuniformItems\nuniformMagazines\nunitAddons\nunitAimPosition\nunitAimPositionVisual\nunitBackpack\nunitIsUAV\nunitPos\nunitReady\nunitRecoilCoefficient\nunits\nunitsBelowHeight\nunlinkItem\nunlockAchievement\nunregisterTask\nupdateDrawIcon\nupdateMenuItem\nupdateObjectTree\nuseAIOperMapObstructionTest\nuseAISteeringComponent\nuseAudioTimeForMoves\nuserInputDisabled\nvectorAdd\nvectorCos\nvectorCrossProduct\nvectorDiff\nvectorDir\nvectorDirVisual\nvectorDistance\nvectorDistanceSqr\nvectorDotProduct\nvectorFromTo\nvectorMagnitude\nvectorMagnitudeSqr\nvectorModelToWorld\nvectorModelToWorldVisual\nvectorMultiply\nvectorNormalized\nvectorUp\nvectorUpVisual\nvectorWorldToModel\nvectorWorldToModelVisual\nvehicle\nvehicleCargoEnabled\nvehicleChat\nvehicleRadio\nvehicleReceiveRemoteTargets\nvehicleReportOwnPosition\nvehicleReportRemoteTargets\nvehicles\nvehicleVarName\nvelocity\nvelocityModelSpace\nverifySignature\nvest\nvestContainer\nvestItems\nvestMagazines\nviewDistance\nvisibleCompass\nvisibleGPS\nvisibleMap\nvisiblePosition\nvisiblePositionASL\nvisibleScoretable\nvisibleWatch\nwaitUntil\nwaves\nwaypointAttachedObject\nwaypointAttachedVehicle\nwaypointAttachObject\nwaypointAttachVehicle\nwaypointBehaviour\nwaypointCombatMode\nwaypointCompletionRadius\nwaypointDescription\nwaypointForceBehaviour\nwaypointFormation\nwaypointHousePosition\nwaypointLoiterRadius\nwaypointLoiterType\nwaypointName\nwaypointPosition\nwaypoints\nwaypointScript\nwaypointsEnabledUAV\nwaypointShow\nwaypointSpeed\nwaypointStatements\nwaypointTimeout\nwaypointTimeoutCurrent\nwaypointType\nwaypointVisible\nweaponAccessories\nweaponAccessoriesCargo\nweaponCargo\nweaponDirection\nweaponInertia\nweaponLowered\nweapons\nweaponsItems\nweaponsItemsCargo\nweaponState\nweaponsTurret\nweightRTD\nwest\nWFSideText\nwind\nwindDir\nwindRTD\nwindStr\nwingsForcesRTD\nworldName\nworldSize\nworldToModel\nworldToModelVisual\nworldToScreen\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"abs\"],\n\t[\"function\", \"accTime\"],\n\t[\"function\", \"acos\"],\n\t[\"function\", \"action\"],\n\t[\"function\", \"actionIDs\"],\n\t[\"function\", \"actionKeys\"],\n\t[\"function\", \"actionKeysImages\"],\n\t[\"function\", \"actionKeysNames\"],\n\t[\"function\", \"actionKeysNamesArray\"],\n\t[\"function\", \"actionName\"],\n\t[\"function\", \"actionParams\"],\n\t[\"function\", \"activateAddons\"],\n\t[\"function\", \"activatedAddons\"],\n\t[\"function\", \"activateKey\"],\n\t[\"function\", \"add3DENConnection\"],\n\t[\"function\", \"add3DENEventHandler\"],\n\t[\"function\", \"add3DENLayer\"],\n\t[\"function\", \"addAction\"],\n\t[\"function\", \"addBackpack\"],\n\t[\"function\", \"addBackpackCargo\"],\n\t[\"function\", \"addBackpackCargoGlobal\"],\n\t[\"function\", \"addBackpackGlobal\"],\n\t[\"function\", \"addCamShake\"],\n\t[\"function\", \"addCuratorAddons\"],\n\t[\"function\", \"addCuratorCameraArea\"],\n\t[\"function\", \"addCuratorEditableObjects\"],\n\t[\"function\", \"addCuratorEditingArea\"],\n\t[\"function\", \"addCuratorPoints\"],\n\t[\"function\", \"addEditorObject\"],\n\t[\"function\", \"addEventHandler\"],\n\t[\"function\", \"addForce\"],\n\t[\"function\", \"addForceGeneratorRTD\"],\n\t[\"function\", \"addGoggles\"],\n\t[\"function\", \"addGroupIcon\"],\n\t[\"function\", \"addHandgunItem\"],\n\t[\"function\", \"addHeadgear\"],\n\t[\"function\", \"addItem\"],\n\t[\"function\", \"addItemCargo\"],\n\t[\"function\", \"addItemCargoGlobal\"],\n\t[\"function\", \"addItemPool\"],\n\t[\"function\", \"addItemToBackpack\"],\n\t[\"function\", \"addItemToUniform\"],\n\t[\"function\", \"addItemToVest\"],\n\t[\"function\", \"addLiveStats\"],\n\t[\"function\", \"addMagazine\"],\n\t[\"function\", \"addMagazineAmmoCargo\"],\n\t[\"function\", \"addMagazineCargo\"],\n\t[\"function\", \"addMagazineCargoGlobal\"],\n\t[\"function\", \"addMagazineGlobal\"],\n\t[\"function\", \"addMagazinePool\"],\n\t[\"function\", \"addMagazines\"],\n\t[\"function\", \"addMagazineTurret\"],\n\t[\"function\", \"addMenu\"],\n\t[\"function\", \"addMenuItem\"],\n\t[\"function\", \"addMissionEventHandler\"],\n\t[\"function\", \"addMPEventHandler\"],\n\t[\"function\", \"addMusicEventHandler\"],\n\t[\"function\", \"addOwnedMine\"],\n\t[\"function\", \"addPlayerScores\"],\n\t[\"function\", \"addPrimaryWeaponItem\"],\n\t[\"function\", \"addPublicVariableEventHandler\"],\n\t[\"function\", \"addRating\"],\n\t[\"function\", \"addResources\"],\n\t[\"function\", \"addScore\"],\n\t[\"function\", \"addScoreSide\"],\n\t[\"function\", \"addSecondaryWeaponItem\"],\n\t[\"function\", \"addSwitchableUnit\"],\n\t[\"function\", \"addTeamMember\"],\n\t[\"function\", \"addToRemainsCollector\"],\n\t[\"function\", \"addTorque\"],\n\t[\"function\", \"addUniform\"],\n\t[\"function\", \"addVehicle\"],\n\t[\"function\", \"addVest\"],\n\t[\"function\", \"addWaypoint\"],\n\t[\"function\", \"addWeapon\"],\n\t[\"function\", \"addWeaponCargo\"],\n\t[\"function\", \"addWeaponCargoGlobal\"],\n\t[\"function\", \"addWeaponGlobal\"],\n\t[\"function\", \"addWeaponItem\"],\n\t[\"function\", \"addWeaponPool\"],\n\t[\"function\", \"addWeaponTurret\"],\n\t[\"function\", \"admin\"],\n\t[\"function\", \"agent\"],\n\t[\"function\", \"agents\"],\n\t[\"function\", \"AGLToASL\"],\n\t[\"function\", \"aimedAtTarget\"],\n\t[\"function\", \"aimPos\"],\n\t[\"function\", \"airDensityCurveRTD\"],\n\t[\"function\", \"airDensityRTD\"],\n\t[\"function\", \"airplaneThrottle\"],\n\t[\"function\", \"airportSide\"],\n\t[\"function\", \"AISFinishHeal\"],\n\t[\"function\", \"alive\"],\n\t[\"function\", \"all3DENEntities\"],\n\t[\"function\", \"allAirports\"],\n\t[\"function\", \"allControls\"],\n\t[\"function\", \"allCurators\"],\n\t[\"function\", \"allCutLayers\"],\n\t[\"function\", \"allDead\"],\n\t[\"function\", \"allDeadMen\"],\n\t[\"function\", \"allDisplays\"],\n\t[\"function\", \"allGroups\"],\n\t[\"function\", \"allMapMarkers\"],\n\t[\"function\", \"allMines\"],\n\t[\"function\", \"allMissionObjects\"],\n\t[\"function\", \"allow3DMode\"],\n\t[\"function\", \"allowCrewInImmobile\"],\n\t[\"function\", \"allowCuratorLogicIgnoreAreas\"],\n\t[\"function\", \"allowDamage\"],\n\t[\"function\", \"allowDammage\"],\n\t[\"function\", \"allowFileOperations\"],\n\t[\"function\", \"allowFleeing\"],\n\t[\"function\", \"allowGetIn\"],\n\t[\"function\", \"allowSprint\"],\n\t[\"function\", \"allPlayers\"],\n\t[\"function\", \"allSimpleObjects\"],\n\t[\"function\", \"allSites\"],\n\t[\"function\", \"allTurrets\"],\n\t[\"function\", \"allUnits\"],\n\t[\"function\", \"allUnitsUAV\"],\n\t[\"function\", \"allVariables\"],\n\t[\"function\", \"ammo\"],\n\t[\"function\", \"ammoOnPylon\"],\n\t[\"function\", \"animate\"],\n\t[\"function\", \"animateBay\"],\n\t[\"function\", \"animateDoor\"],\n\t[\"function\", \"animatePylon\"],\n\t[\"function\", \"animateSource\"],\n\t[\"function\", \"animationNames\"],\n\t[\"function\", \"animationPhase\"],\n\t[\"function\", \"animationSourcePhase\"],\n\t[\"function\", \"animationState\"],\n\t[\"function\", \"append\"],\n\t[\"function\", \"apply\"],\n\t[\"function\", \"armoryPoints\"],\n\t[\"function\", \"arrayIntersect\"],\n\t[\"function\", \"asin\"],\n\t[\"function\", \"ASLToAGL\"],\n\t[\"function\", \"ASLToATL\"],\n\t[\"function\", \"assert\"],\n\t[\"function\", \"assignAsCargo\"],\n\t[\"function\", \"assignAsCargoIndex\"],\n\t[\"function\", \"assignAsCommander\"],\n\t[\"function\", \"assignAsDriver\"],\n\t[\"function\", \"assignAsGunner\"],\n\t[\"function\", \"assignAsTurret\"],\n\t[\"function\", \"assignCurator\"],\n\t[\"function\", \"assignedCargo\"],\n\t[\"function\", \"assignedCommander\"],\n\t[\"function\", \"assignedDriver\"],\n\t[\"function\", \"assignedGunner\"],\n\t[\"function\", \"assignedItems\"],\n\t[\"function\", \"assignedTarget\"],\n\t[\"function\", \"assignedTeam\"],\n\t[\"function\", \"assignedVehicle\"],\n\t[\"function\", \"assignedVehicleRole\"],\n\t[\"function\", \"assignItem\"],\n\t[\"function\", \"assignTeam\"],\n\t[\"function\", \"assignToAirport\"],\n\t[\"function\", \"atan\"],\n\t[\"function\", \"atan2\"],\n\t[\"function\", \"atg\"],\n\t[\"function\", \"ATLToASL\"],\n\t[\"function\", \"attachedObject\"],\n\t[\"function\", \"attachedObjects\"],\n\t[\"function\", \"attachedTo\"],\n\t[\"function\", \"attachObject\"],\n\t[\"function\", \"attachTo\"],\n\t[\"function\", \"attackEnabled\"],\n\t[\"function\", \"backpack\"],\n\t[\"function\", \"backpackCargo\"],\n\t[\"function\", \"backpackContainer\"],\n\t[\"function\", \"backpackItems\"],\n\t[\"function\", \"backpackMagazines\"],\n\t[\"function\", \"backpackSpaceFor\"],\n\t[\"function\", \"behaviour\"],\n\t[\"function\", \"benchmark\"],\n\t[\"function\", \"binocular\"],\n\t[\"function\", \"blufor\"],\n\t[\"function\", \"boundingBox\"],\n\t[\"function\", \"boundingBoxReal\"],\n\t[\"function\", \"boundingCenter\"],\n\t[\"function\", \"briefingName\"],\n\t[\"function\", \"buildingExit\"],\n\t[\"function\", \"buildingPos\"],\n\t[\"function\", \"buldozer_EnableRoadDiag\"],\n\t[\"function\", \"buldozer_IsEnabledRoadDiag\"],\n\t[\"function\", \"buldozer_LoadNewRoads\"],\n\t[\"function\", \"buldozer_reloadOperMap\"],\n\t[\"function\", \"buttonAction\"],\n\t[\"function\", \"buttonSetAction\"],\n\t[\"function\", \"cadetMode\"],\n\t[\"function\", \"callExtension\"],\n\t[\"function\", \"camCommand\"],\n\t[\"function\", \"camCommit\"],\n\t[\"function\", \"camCommitPrepared\"],\n\t[\"function\", \"camCommitted\"],\n\t[\"function\", \"camConstuctionSetParams\"],\n\t[\"function\", \"camCreate\"],\n\t[\"function\", \"camDestroy\"],\n\t[\"function\", \"cameraEffect\"],\n\t[\"function\", \"cameraEffectEnableHUD\"],\n\t[\"function\", \"cameraInterest\"],\n\t[\"function\", \"cameraOn\"],\n\t[\"function\", \"cameraView\"],\n\t[\"function\", \"campaignConfigFile\"],\n\t[\"function\", \"camPreload\"],\n\t[\"function\", \"camPreloaded\"],\n\t[\"function\", \"camPrepareBank\"],\n\t[\"function\", \"camPrepareDir\"],\n\t[\"function\", \"camPrepareDive\"],\n\t[\"function\", \"camPrepareFocus\"],\n\t[\"function\", \"camPrepareFov\"],\n\t[\"function\", \"camPrepareFovRange\"],\n\t[\"function\", \"camPreparePos\"],\n\t[\"function\", \"camPrepareRelPos\"],\n\t[\"function\", \"camPrepareTarget\"],\n\t[\"function\", \"camSetBank\"],\n\t[\"function\", \"camSetDir\"],\n\t[\"function\", \"camSetDive\"],\n\t[\"function\", \"camSetFocus\"],\n\t[\"function\", \"camSetFov\"],\n\t[\"function\", \"camSetFovRange\"],\n\t[\"function\", \"camSetPos\"],\n\t[\"function\", \"camSetRelPos\"],\n\t[\"function\", \"camSetTarget\"],\n\t[\"function\", \"camTarget\"],\n\t[\"function\", \"camUseNVG\"],\n\t[\"function\", \"canAdd\"],\n\t[\"function\", \"canAddItemToBackpack\"],\n\t[\"function\", \"canAddItemToUniform\"],\n\t[\"function\", \"canAddItemToVest\"],\n\t[\"function\", \"cancelSimpleTaskDestination\"],\n\t[\"function\", \"canFire\"],\n\t[\"function\", \"canMove\"],\n\t[\"function\", \"canSlingLoad\"],\n\t[\"function\", \"canStand\"],\n\t[\"function\", \"canSuspend\"],\n\t[\"function\", \"canTriggerDynamicSimulation\"],\n\t[\"function\", \"canUnloadInCombat\"],\n\t[\"function\", \"canVehicleCargo\"],\n\t[\"function\", \"captive\"],\n\t[\"function\", \"captiveNum\"],\n\t[\"function\", \"cbChecked\"],\n\t[\"function\", \"cbSetChecked\"],\n\t[\"function\", \"ceil\"],\n\t[\"function\", \"channelEnabled\"],\n\t[\"function\", \"cheatsEnabled\"],\n\t[\"function\", \"checkAIFeature\"],\n\t[\"function\", \"checkVisibility\"],\n\t[\"function\", \"civilian\"],\n\t[\"function\", \"className\"],\n\t[\"function\", \"clear3DENAttribute\"],\n\t[\"function\", \"clear3DENInventory\"],\n\t[\"function\", \"clearAllItemsFromBackpack\"],\n\t[\"function\", \"clearBackpackCargo\"],\n\t[\"function\", \"clearBackpackCargoGlobal\"],\n\t[\"function\", \"clearForcesRTD\"],\n\t[\"function\", \"clearGroupIcons\"],\n\t[\"function\", \"clearItemCargo\"],\n\t[\"function\", \"clearItemCargoGlobal\"],\n\t[\"function\", \"clearItemPool\"],\n\t[\"function\", \"clearMagazineCargo\"],\n\t[\"function\", \"clearMagazineCargoGlobal\"],\n\t[\"function\", \"clearMagazinePool\"],\n\t[\"function\", \"clearOverlay\"],\n\t[\"function\", \"clearRadio\"],\n\t[\"function\", \"clearVehicleInit\"],\n\t[\"function\", \"clearWeaponCargo\"],\n\t[\"function\", \"clearWeaponCargoGlobal\"],\n\t[\"function\", \"clearWeaponPool\"],\n\t[\"function\", \"clientOwner\"],\n\t[\"function\", \"closeDialog\"],\n\t[\"function\", \"closeDisplay\"],\n\t[\"function\", \"closeOverlay\"],\n\t[\"function\", \"collapseObjectTree\"],\n\t[\"function\", \"collect3DENHistory\"],\n\t[\"function\", \"collectiveRTD\"],\n\t[\"function\", \"combatMode\"],\n\t[\"function\", \"commandArtilleryFire\"],\n\t[\"function\", \"commandChat\"],\n\t[\"function\", \"commander\"],\n\t[\"function\", \"commandFire\"],\n\t[\"function\", \"commandFollow\"],\n\t[\"function\", \"commandFSM\"],\n\t[\"function\", \"commandGetOut\"],\n\t[\"function\", \"commandingMenu\"],\n\t[\"function\", \"commandMove\"],\n\t[\"function\", \"commandRadio\"],\n\t[\"function\", \"commandStop\"],\n\t[\"function\", \"commandSuppressiveFire\"],\n\t[\"function\", \"commandTarget\"],\n\t[\"function\", \"commandWatch\"],\n\t[\"function\", \"comment\"],\n\t[\"function\", \"commitOverlay\"],\n\t[\"function\", \"compile\"],\n\t[\"function\", \"compileFinal\"],\n\t[\"function\", \"completedFSM\"],\n\t[\"function\", \"composeText\"],\n\t[\"function\", \"configClasses\"],\n\t[\"function\", \"configFile\"],\n\t[\"function\", \"configHierarchy\"],\n\t[\"function\", \"configName\"],\n\t[\"function\", \"configNull\"],\n\t[\"function\", \"configProperties\"],\n\t[\"function\", \"configSourceAddonList\"],\n\t[\"function\", \"configSourceMod\"],\n\t[\"function\", \"configSourceModList\"],\n\t[\"function\", \"confirmSensorTarget\"],\n\t[\"function\", \"connectTerminalToUAV\"],\n\t[\"function\", \"controlNull\"],\n\t[\"function\", \"controlsGroupCtrl\"],\n\t[\"function\", \"copyFromClipboard\"],\n\t[\"function\", \"copyToClipboard\"],\n\t[\"function\", \"copyWaypoints\"],\n\t[\"function\", \"cos\"],\n\t[\"function\", \"count\"],\n\t[\"function\", \"countEnemy\"],\n\t[\"function\", \"countFriendly\"],\n\t[\"function\", \"countSide\"],\n\t[\"function\", \"countType\"],\n\t[\"function\", \"countUnknown\"],\n\t[\"function\", \"create3DENComposition\"],\n\t[\"function\", \"create3DENEntity\"],\n\t[\"function\", \"createAgent\"],\n\t[\"function\", \"createCenter\"],\n\t[\"function\", \"createDialog\"],\n\t[\"function\", \"createDiaryLink\"],\n\t[\"function\", \"createDiaryRecord\"],\n\t[\"function\", \"createDiarySubject\"],\n\t[\"function\", \"createDisplay\"],\n\t[\"function\", \"createGearDialog\"],\n\t[\"function\", \"createGroup\"],\n\t[\"function\", \"createGuardedPoint\"],\n\t[\"function\", \"createLocation\"],\n\t[\"function\", \"createMarker\"],\n\t[\"function\", \"createMarkerLocal\"],\n\t[\"function\", \"createMenu\"],\n\t[\"function\", \"createMine\"],\n\t[\"function\", \"createMissionDisplay\"],\n\t[\"function\", \"createMPCampaignDisplay\"],\n\t[\"function\", \"createSimpleObject\"],\n\t[\"function\", \"createSimpleTask\"],\n\t[\"function\", \"createSite\"],\n\t[\"function\", \"createSoundSource\"],\n\t[\"function\", \"createTask\"],\n\t[\"function\", \"createTeam\"],\n\t[\"function\", \"createTrigger\"],\n\t[\"function\", \"createUnit\"],\n\t[\"function\", \"createVehicle\"],\n\t[\"function\", \"createVehicleCrew\"],\n\t[\"function\", \"createVehicleLocal\"],\n\t[\"function\", \"crew\"],\n\t[\"function\", \"ctAddHeader\"],\n\t[\"function\", \"ctAddRow\"],\n\t[\"function\", \"ctClear\"],\n\t[\"function\", \"ctCurSel\"],\n\t[\"function\", \"ctData\"],\n\t[\"function\", \"ctFindHeaderRows\"],\n\t[\"function\", \"ctFindRowHeader\"],\n\t[\"function\", \"ctHeaderControls\"],\n\t[\"function\", \"ctHeaderCount\"],\n\t[\"function\", \"ctRemoveHeaders\"],\n\t[\"function\", \"ctRemoveRows\"],\n\t[\"function\", \"ctrlActivate\"],\n\t[\"function\", \"ctrlAddEventHandler\"],\n\t[\"function\", \"ctrlAngle\"],\n\t[\"function\", \"ctrlAutoScrollDelay\"],\n\t[\"function\", \"ctrlAutoScrollRewind\"],\n\t[\"function\", \"ctrlAutoScrollSpeed\"],\n\t[\"function\", \"ctrlChecked\"],\n\t[\"function\", \"ctrlClassName\"],\n\t[\"function\", \"ctrlCommit\"],\n\t[\"function\", \"ctrlCommitted\"],\n\t[\"function\", \"ctrlCreate\"],\n\t[\"function\", \"ctrlDelete\"],\n\t[\"function\", \"ctrlEnable\"],\n\t[\"function\", \"ctrlEnabled\"],\n\t[\"function\", \"ctrlFade\"],\n\t[\"function\", \"ctrlHTMLLoaded\"],\n\t[\"function\", \"ctrlIDC\"],\n\t[\"function\", \"ctrlIDD\"],\n\t[\"function\", \"ctrlMapAnimAdd\"],\n\t[\"function\", \"ctrlMapAnimClear\"],\n\t[\"function\", \"ctrlMapAnimCommit\"],\n\t[\"function\", \"ctrlMapAnimDone\"],\n\t[\"function\", \"ctrlMapCursor\"],\n\t[\"function\", \"ctrlMapMouseOver\"],\n\t[\"function\", \"ctrlMapScale\"],\n\t[\"function\", \"ctrlMapScreenToWorld\"],\n\t[\"function\", \"ctrlMapWorldToScreen\"],\n\t[\"function\", \"ctrlModel\"],\n\t[\"function\", \"ctrlModelDirAndUp\"],\n\t[\"function\", \"ctrlModelScale\"],\n\t[\"function\", \"ctrlParent\"],\n\t[\"function\", \"ctrlParentControlsGroup\"],\n\t[\"function\", \"ctrlPosition\"],\n\t[\"function\", \"ctrlRemoveAllEventHandlers\"],\n\t[\"function\", \"ctrlRemoveEventHandler\"],\n\t[\"function\", \"ctrlScale\"],\n\t[\"function\", \"ctrlSetActiveColor\"],\n\t[\"function\", \"ctrlSetAngle\"],\n\t[\"function\", \"ctrlSetAutoScrollDelay\"],\n\t[\"function\", \"ctrlSetAutoScrollRewind\"],\n\t[\"function\", \"ctrlSetAutoScrollSpeed\"],\n\t[\"function\", \"ctrlSetBackgroundColor\"],\n\t[\"function\", \"ctrlSetChecked\"],\n\t[\"function\", \"ctrlSetDisabledColor\"],\n\t[\"function\", \"ctrlSetEventHandler\"],\n\t[\"function\", \"ctrlSetFade\"],\n\t[\"function\", \"ctrlSetFocus\"],\n\t[\"function\", \"ctrlSetFont\"],\n\t[\"function\", \"ctrlSetFontH1\"],\n\t[\"function\", \"ctrlSetFontH1B\"],\n\t[\"function\", \"ctrlSetFontH2\"],\n\t[\"function\", \"ctrlSetFontH2B\"],\n\t[\"function\", \"ctrlSetFontH3\"],\n\t[\"function\", \"ctrlSetFontH3B\"],\n\t[\"function\", \"ctrlSetFontH4\"],\n\t[\"function\", \"ctrlSetFontH4B\"],\n\t[\"function\", \"ctrlSetFontH5\"],\n\t[\"function\", \"ctrlSetFontH5B\"],\n\t[\"function\", \"ctrlSetFontH6\"],\n\t[\"function\", \"ctrlSetFontH6B\"],\n\t[\"function\", \"ctrlSetFontHeight\"],\n\t[\"function\", \"ctrlSetFontHeightH1\"],\n\t[\"function\", \"ctrlSetFontHeightH2\"],\n\t[\"function\", \"ctrlSetFontHeightH3\"],\n\t[\"function\", \"ctrlSetFontHeightH4\"],\n\t[\"function\", \"ctrlSetFontHeightH5\"],\n\t[\"function\", \"ctrlSetFontHeightH6\"],\n\t[\"function\", \"ctrlSetFontHeightSecondary\"],\n\t[\"function\", \"ctrlSetFontP\"],\n\t[\"function\", \"ctrlSetFontPB\"],\n\t[\"function\", \"ctrlSetFontSecondary\"],\n\t[\"function\", \"ctrlSetForegroundColor\"],\n\t[\"function\", \"ctrlSetModel\"],\n\t[\"function\", \"ctrlSetModelDirAndUp\"],\n\t[\"function\", \"ctrlSetModelScale\"],\n\t[\"function\", \"ctrlSetPixelPrecision\"],\n\t[\"function\", \"ctrlSetPosition\"],\n\t[\"function\", \"ctrlSetScale\"],\n\t[\"function\", \"ctrlSetStructuredText\"],\n\t[\"function\", \"ctrlSetText\"],\n\t[\"function\", \"ctrlSetTextColor\"],\n\t[\"function\", \"ctrlSetTextColorSecondary\"],\n\t[\"function\", \"ctrlSetTextSecondary\"],\n\t[\"function\", \"ctrlSetTooltip\"],\n\t[\"function\", \"ctrlSetTooltipColorBox\"],\n\t[\"function\", \"ctrlSetTooltipColorShade\"],\n\t[\"function\", \"ctrlSetTooltipColorText\"],\n\t[\"function\", \"ctrlShow\"],\n\t[\"function\", \"ctrlShown\"],\n\t[\"function\", \"ctrlText\"],\n\t[\"function\", \"ctrlTextHeight\"],\n\t[\"function\", \"ctrlTextSecondary\"],\n\t[\"function\", \"ctrlTextWidth\"],\n\t[\"function\", \"ctrlType\"],\n\t[\"function\", \"ctrlVisible\"],\n\t[\"function\", \"ctRowControls\"],\n\t[\"function\", \"ctRowCount\"],\n\t[\"function\", \"ctSetCurSel\"],\n\t[\"function\", \"ctSetData\"],\n\t[\"function\", \"ctSetHeaderTemplate\"],\n\t[\"function\", \"ctSetRowTemplate\"],\n\t[\"function\", \"ctSetValue\"],\n\t[\"function\", \"ctValue\"],\n\t[\"function\", \"curatorAddons\"],\n\t[\"function\", \"curatorCamera\"],\n\t[\"function\", \"curatorCameraArea\"],\n\t[\"function\", \"curatorCameraAreaCeiling\"],\n\t[\"function\", \"curatorCoef\"],\n\t[\"function\", \"curatorEditableObjects\"],\n\t[\"function\", \"curatorEditingArea\"],\n\t[\"function\", \"curatorEditingAreaType\"],\n\t[\"function\", \"curatorMouseOver\"],\n\t[\"function\", \"curatorPoints\"],\n\t[\"function\", \"curatorRegisteredObjects\"],\n\t[\"function\", \"curatorSelected\"],\n\t[\"function\", \"curatorWaypointCost\"],\n\t[\"function\", \"current3DENOperation\"],\n\t[\"function\", \"currentChannel\"],\n\t[\"function\", \"currentCommand\"],\n\t[\"function\", \"currentMagazine\"],\n\t[\"function\", \"currentMagazineDetail\"],\n\t[\"function\", \"currentMagazineDetailTurret\"],\n\t[\"function\", \"currentMagazineTurret\"],\n\t[\"function\", \"currentMuzzle\"],\n\t[\"function\", \"currentNamespace\"],\n\t[\"function\", \"currentTask\"],\n\t[\"function\", \"currentTasks\"],\n\t[\"function\", \"currentThrowable\"],\n\t[\"function\", \"currentVisionMode\"],\n\t[\"function\", \"currentWaypoint\"],\n\t[\"function\", \"currentWeapon\"],\n\t[\"function\", \"currentWeaponMode\"],\n\t[\"function\", \"currentWeaponTurret\"],\n\t[\"function\", \"currentZeroing\"],\n\t[\"function\", \"cursorObject\"],\n\t[\"function\", \"cursorTarget\"],\n\t[\"function\", \"customChat\"],\n\t[\"function\", \"customRadio\"],\n\t[\"function\", \"cutFadeOut\"],\n\t[\"function\", \"cutObj\"],\n\t[\"function\", \"cutRsc\"],\n\t[\"function\", \"cutText\"],\n\t[\"function\", \"damage\"],\n\t[\"function\", \"date\"],\n\t[\"function\", \"dateToNumber\"],\n\t[\"function\", \"daytime\"],\n\t[\"function\", \"deActivateKey\"],\n\t[\"function\", \"debriefingText\"],\n\t[\"function\", \"debugFSM\"],\n\t[\"function\", \"debugLog\"],\n\t[\"function\", \"deg\"],\n\t[\"function\", \"delete3DENEntities\"],\n\t[\"function\", \"deleteAt\"],\n\t[\"function\", \"deleteCenter\"],\n\t[\"function\", \"deleteCollection\"],\n\t[\"function\", \"deleteEditorObject\"],\n\t[\"function\", \"deleteGroup\"],\n\t[\"function\", \"deleteGroupWhenEmpty\"],\n\t[\"function\", \"deleteIdentity\"],\n\t[\"function\", \"deleteLocation\"],\n\t[\"function\", \"deleteMarker\"],\n\t[\"function\", \"deleteMarkerLocal\"],\n\t[\"function\", \"deleteRange\"],\n\t[\"function\", \"deleteResources\"],\n\t[\"function\", \"deleteSite\"],\n\t[\"function\", \"deleteStatus\"],\n\t[\"function\", \"deleteTeam\"],\n\t[\"function\", \"deleteVehicle\"],\n\t[\"function\", \"deleteVehicleCrew\"],\n\t[\"function\", \"deleteWaypoint\"],\n\t[\"function\", \"detach\"],\n\t[\"function\", \"detectedMines\"],\n\t[\"function\", \"diag_activeMissionFSMs\"],\n\t[\"function\", \"diag_activeScripts\"],\n\t[\"function\", \"diag_activeSQFScripts\"],\n\t[\"function\", \"diag_activeSQSScripts\"],\n\t[\"function\", \"diag_captureFrame\"],\n\t[\"function\", \"diag_captureFrameToFile\"],\n\t[\"function\", \"diag_captureSlowFrame\"],\n\t[\"function\", \"diag_codePerformance\"],\n\t[\"function\", \"diag_drawMode\"],\n\t[\"function\", \"diag_dynamicSimulationEnd\"],\n\t[\"function\", \"diag_enable\"],\n\t[\"function\", \"diag_enabled\"],\n\t[\"function\", \"diag_fps\"],\n\t[\"function\", \"diag_fpsMin\"],\n\t[\"function\", \"diag_frameNo\"],\n\t[\"function\", \"diag_lightNewLoad\"],\n\t[\"function\", \"diag_list\"],\n\t[\"function\", \"diag_log\"],\n\t[\"function\", \"diag_logSlowFrame\"],\n\t[\"function\", \"diag_mergeConfigFile\"],\n\t[\"function\", \"diag_recordTurretLimits\"],\n\t[\"function\", \"diag_setLightNew\"],\n\t[\"function\", \"diag_tickTime\"],\n\t[\"function\", \"diag_toggle\"],\n\t[\"function\", \"dialog\"],\n\t[\"function\", \"diarySubjectExists\"],\n\t[\"function\", \"didJIP\"],\n\t[\"function\", \"didJIPOwner\"],\n\t[\"function\", \"difficulty\"],\n\t[\"function\", \"difficultyEnabled\"],\n\t[\"function\", \"difficultyEnabledRTD\"],\n\t[\"function\", \"difficultyOption\"],\n\t[\"function\", \"direction\"],\n\t[\"function\", \"directSay\"],\n\t[\"function\", \"disableAI\"],\n\t[\"function\", \"disableCollisionWith\"],\n\t[\"function\", \"disableConversation\"],\n\t[\"function\", \"disableDebriefingStats\"],\n\t[\"function\", \"disableMapIndicators\"],\n\t[\"function\", \"disableNVGEquipment\"],\n\t[\"function\", \"disableRemoteSensors\"],\n\t[\"function\", \"disableSerialization\"],\n\t[\"function\", \"disableTIEquipment\"],\n\t[\"function\", \"disableUAVConnectability\"],\n\t[\"function\", \"disableUserInput\"],\n\t[\"function\", \"displayAddEventHandler\"],\n\t[\"function\", \"displayCtrl\"],\n\t[\"function\", \"displayNull\"],\n\t[\"function\", \"displayParent\"],\n\t[\"function\", \"displayRemoveAllEventHandlers\"],\n\t[\"function\", \"displayRemoveEventHandler\"],\n\t[\"function\", \"displaySetEventHandler\"],\n\t[\"function\", \"dissolveTeam\"],\n\t[\"function\", \"distance\"],\n\t[\"function\", \"distance2D\"],\n\t[\"function\", \"distanceSqr\"],\n\t[\"function\", \"distributionRegion\"],\n\t[\"function\", \"do3DENAction\"],\n\t[\"function\", \"doArtilleryFire\"],\n\t[\"function\", \"doFire\"],\n\t[\"function\", \"doFollow\"],\n\t[\"function\", \"doFSM\"],\n\t[\"function\", \"doGetOut\"],\n\t[\"function\", \"doMove\"],\n\t[\"function\", \"doorPhase\"],\n\t[\"function\", \"doStop\"],\n\t[\"function\", \"doSuppressiveFire\"],\n\t[\"function\", \"doTarget\"],\n\t[\"function\", \"doWatch\"],\n\t[\"function\", \"drawArrow\"],\n\t[\"function\", \"drawEllipse\"],\n\t[\"function\", \"drawIcon\"],\n\t[\"function\", \"drawIcon3D\"],\n\t[\"function\", \"drawLine\"],\n\t[\"function\", \"drawLine3D\"],\n\t[\"function\", \"drawLink\"],\n\t[\"function\", \"drawLocation\"],\n\t[\"function\", \"drawPolygon\"],\n\t[\"function\", \"drawRectangle\"],\n\t[\"function\", \"drawTriangle\"],\n\t[\"function\", \"driver\"],\n\t[\"function\", \"drop\"],\n\t[\"function\", \"dynamicSimulationDistance\"],\n\t[\"function\", \"dynamicSimulationDistanceCoef\"],\n\t[\"function\", \"dynamicSimulationEnabled\"],\n\t[\"function\", \"dynamicSimulationSystemEnabled\"],\n\t[\"function\", \"east\"],\n\t[\"function\", \"edit3DENMissionAttributes\"],\n\t[\"function\", \"editObject\"],\n\t[\"function\", \"editorSetEventHandler\"],\n\t[\"function\", \"effectiveCommander\"],\n\t[\"function\", \"emptyPositions\"],\n\t[\"function\", \"enableAI\"],\n\t[\"function\", \"enableAIFeature\"],\n\t[\"function\", \"enableAimPrecision\"],\n\t[\"function\", \"enableAttack\"],\n\t[\"function\", \"enableAudioFeature\"],\n\t[\"function\", \"enableAutoStartUpRTD\"],\n\t[\"function\", \"enableAutoTrimRTD\"],\n\t[\"function\", \"enableCamShake\"],\n\t[\"function\", \"enableCaustics\"],\n\t[\"function\", \"enableChannel\"],\n\t[\"function\", \"enableCollisionWith\"],\n\t[\"function\", \"enableCopilot\"],\n\t[\"function\", \"enableDebriefingStats\"],\n\t[\"function\", \"enableDiagLegend\"],\n\t[\"function\", \"enableDynamicSimulation\"],\n\t[\"function\", \"enableDynamicSimulationSystem\"],\n\t[\"function\", \"enableEndDialog\"],\n\t[\"function\", \"enableEngineArtillery\"],\n\t[\"function\", \"enableEnvironment\"],\n\t[\"function\", \"enableFatigue\"],\n\t[\"function\", \"enableGunLights\"],\n\t[\"function\", \"enableInfoPanelComponent\"],\n\t[\"function\", \"enableIRLasers\"],\n\t[\"function\", \"enableMimics\"],\n\t[\"function\", \"enablePersonTurret\"],\n\t[\"function\", \"enableRadio\"],\n\t[\"function\", \"enableReload\"],\n\t[\"function\", \"enableRopeAttach\"],\n\t[\"function\", \"enableSatNormalOnDetail\"],\n\t[\"function\", \"enableSaving\"],\n\t[\"function\", \"enableSentences\"],\n\t[\"function\", \"enableSimulation\"],\n\t[\"function\", \"enableSimulationGlobal\"],\n\t[\"function\", \"enableStamina\"],\n\t[\"function\", \"enableStressDamage\"],\n\t[\"function\", \"enableTeamSwitch\"],\n\t[\"function\", \"enableTraffic\"],\n\t[\"function\", \"enableUAVConnectability\"],\n\t[\"function\", \"enableUAVWaypoints\"],\n\t[\"function\", \"enableVehicleCargo\"],\n\t[\"function\", \"enableVehicleSensor\"],\n\t[\"function\", \"enableWeaponDisassembly\"],\n\t[\"function\", \"endl\"],\n\t[\"function\", \"endLoadingScreen\"],\n\t[\"function\", \"endMission\"],\n\t[\"function\", \"engineOn\"],\n\t[\"function\", \"enginesIsOnRTD\"],\n\t[\"function\", \"enginesPowerRTD\"],\n\t[\"function\", \"enginesRpmRTD\"],\n\t[\"function\", \"enginesTorqueRTD\"],\n\t[\"function\", \"entities\"],\n\t[\"function\", \"environmentEnabled\"],\n\t[\"function\", \"estimatedEndServerTime\"],\n\t[\"function\", \"estimatedTimeLeft\"],\n\t[\"function\", \"evalObjectArgument\"],\n\t[\"function\", \"everyBackpack\"],\n\t[\"function\", \"everyContainer\"],\n\t[\"function\", \"exec\"],\n\t[\"function\", \"execEditorScript\"],\n\t[\"function\", \"exp\"],\n\t[\"function\", \"expectedDestination\"],\n\t[\"function\", \"exportJIPMessages\"],\n\t[\"function\", \"eyeDirection\"],\n\t[\"function\", \"eyePos\"],\n\t[\"function\", \"face\"],\n\t[\"function\", \"faction\"],\n\t[\"function\", \"fadeMusic\"],\n\t[\"function\", \"fadeRadio\"],\n\t[\"function\", \"fadeSound\"],\n\t[\"function\", \"fadeSpeech\"],\n\t[\"function\", \"failMission\"],\n\t[\"function\", \"fillWeaponsFromPool\"],\n\t[\"function\", \"find\"],\n\t[\"function\", \"findCover\"],\n\t[\"function\", \"findDisplay\"],\n\t[\"function\", \"findEditorObject\"],\n\t[\"function\", \"findEmptyPosition\"],\n\t[\"function\", \"findEmptyPositionReady\"],\n\t[\"function\", \"findIf\"],\n\t[\"function\", \"findNearestEnemy\"],\n\t[\"function\", \"finishMissionInit\"],\n\t[\"function\", \"finite\"],\n\t[\"function\", \"fire\"],\n\t[\"function\", \"fireAtTarget\"],\n\t[\"function\", \"firstBackpack\"],\n\t[\"function\", \"flag\"],\n\t[\"function\", \"flagAnimationPhase\"],\n\t[\"function\", \"flagOwner\"],\n\t[\"function\", \"flagSide\"],\n\t[\"function\", \"flagTexture\"],\n\t[\"function\", \"fleeing\"],\n\t[\"function\", \"floor\"],\n\t[\"function\", \"flyInHeight\"],\n\t[\"function\", \"flyInHeightASL\"],\n\t[\"function\", \"fog\"],\n\t[\"function\", \"fogForecast\"],\n\t[\"function\", \"fogParams\"],\n\t[\"function\", \"forceAddUniform\"],\n\t[\"function\", \"forceAtPositionRTD\"],\n\t[\"function\", \"forcedMap\"],\n\t[\"function\", \"forceEnd\"],\n\t[\"function\", \"forceFlagTexture\"],\n\t[\"function\", \"forceFollowRoad\"],\n\t[\"function\", \"forceGeneratorRTD\"],\n\t[\"function\", \"forceMap\"],\n\t[\"function\", \"forceRespawn\"],\n\t[\"function\", \"forceSpeed\"],\n\t[\"function\", \"forceWalk\"],\n\t[\"function\", \"forceWeaponFire\"],\n\t[\"function\", \"forceWeatherChange\"],\n\t[\"function\", \"forgetTarget\"],\n\t[\"function\", \"format\"],\n\t[\"function\", \"formation\"],\n\t[\"function\", \"formationDirection\"],\n\t[\"function\", \"formationLeader\"],\n\t[\"function\", \"formationMembers\"],\n\t[\"function\", \"formationPosition\"],\n\t[\"function\", \"formationTask\"],\n\t[\"function\", \"formatText\"],\n\t[\"function\", \"formLeader\"],\n\t[\"function\", \"freeLook\"],\n\t[\"function\", \"fromEditor\"],\n\t[\"function\", \"fuel\"],\n\t[\"function\", \"fullCrew\"],\n\t[\"function\", \"gearIDCAmmoCount\"],\n\t[\"function\", \"gearSlotAmmoCount\"],\n\t[\"function\", \"gearSlotData\"],\n\t[\"function\", \"get3DENActionState\"],\n\t[\"function\", \"get3DENAttribute\"],\n\t[\"function\", \"get3DENCamera\"],\n\t[\"function\", \"get3DENConnections\"],\n\t[\"function\", \"get3DENEntity\"],\n\t[\"function\", \"get3DENEntityID\"],\n\t[\"function\", \"get3DENGrid\"],\n\t[\"function\", \"get3DENIconsVisible\"],\n\t[\"function\", \"get3DENLayerEntities\"],\n\t[\"function\", \"get3DENLinesVisible\"],\n\t[\"function\", \"get3DENMissionAttribute\"],\n\t[\"function\", \"get3DENMouseOver\"],\n\t[\"function\", \"get3DENSelected\"],\n\t[\"function\", \"getAimingCoef\"],\n\t[\"function\", \"getAllEnvSoundControllers\"],\n\t[\"function\", \"getAllHitPointsDamage\"],\n\t[\"function\", \"getAllOwnedMines\"],\n\t[\"function\", \"getAllSoundControllers\"],\n\t[\"function\", \"getAmmoCargo\"],\n\t[\"function\", \"getAnimAimPrecision\"],\n\t[\"function\", \"getAnimSpeedCoef\"],\n\t[\"function\", \"getArray\"],\n\t[\"function\", \"getArtilleryAmmo\"],\n\t[\"function\", \"getArtilleryComputerSettings\"],\n\t[\"function\", \"getArtilleryETA\"],\n\t[\"function\", \"getAssignedCuratorLogic\"],\n\t[\"function\", \"getAssignedCuratorUnit\"],\n\t[\"function\", \"getBackpackCargo\"],\n\t[\"function\", \"getBleedingRemaining\"],\n\t[\"function\", \"getBurningValue\"],\n\t[\"function\", \"getCameraViewDirection\"],\n\t[\"function\", \"getCargoIndex\"],\n\t[\"function\", \"getCenterOfMass\"],\n\t[\"function\", \"getClientState\"],\n\t[\"function\", \"getClientStateNumber\"],\n\t[\"function\", \"getCompatiblePylonMagazines\"],\n\t[\"function\", \"getConnectedUAV\"],\n\t[\"function\", \"getContainerMaxLoad\"],\n\t[\"function\", \"getCursorObjectParams\"],\n\t[\"function\", \"getCustomAimCoef\"],\n\t[\"function\", \"getDammage\"],\n\t[\"function\", \"getDescription\"],\n\t[\"function\", \"getDir\"],\n\t[\"function\", \"getDirVisual\"],\n\t[\"function\", \"getDLCAssetsUsage\"],\n\t[\"function\", \"getDLCAssetsUsageByName\"],\n\t[\"function\", \"getDLCs\"],\n\t[\"function\", \"getDLCUsageTime\"],\n\t[\"function\", \"getEditorCamera\"],\n\t[\"function\", \"getEditorMode\"],\n\t[\"function\", \"getEditorObjectScope\"],\n\t[\"function\", \"getElevationOffset\"],\n\t[\"function\", \"getEngineTargetRpmRTD\"],\n\t[\"function\", \"getEnvSoundController\"],\n\t[\"function\", \"getFatigue\"],\n\t[\"function\", \"getFieldManualStartPage\"],\n\t[\"function\", \"getForcedFlagTexture\"],\n\t[\"function\", \"getFriend\"],\n\t[\"function\", \"getFSMVariable\"],\n\t[\"function\", \"getFuelCargo\"],\n\t[\"function\", \"getGroupIcon\"],\n\t[\"function\", \"getGroupIconParams\"],\n\t[\"function\", \"getGroupIcons\"],\n\t[\"function\", \"getHideFrom\"],\n\t[\"function\", \"getHit\"],\n\t[\"function\", \"getHitIndex\"],\n\t[\"function\", \"getHitPointDamage\"],\n\t[\"function\", \"getItemCargo\"],\n\t[\"function\", \"getMagazineCargo\"],\n\t[\"function\", \"getMarkerColor\"],\n\t[\"function\", \"getMarkerPos\"],\n\t[\"function\", \"getMarkerSize\"],\n\t[\"function\", \"getMarkerType\"],\n\t[\"function\", \"getMass\"],\n\t[\"function\", \"getMissionConfig\"],\n\t[\"function\", \"getMissionConfigValue\"],\n\t[\"function\", \"getMissionDLCs\"],\n\t[\"function\", \"getMissionLayerEntities\"],\n\t[\"function\", \"getMissionLayers\"],\n\t[\"function\", \"getModelInfo\"],\n\t[\"function\", \"getMousePosition\"],\n\t[\"function\", \"getMusicPlayedTime\"],\n\t[\"function\", \"getNumber\"],\n\t[\"function\", \"getObjectArgument\"],\n\t[\"function\", \"getObjectChildren\"],\n\t[\"function\", \"getObjectDLC\"],\n\t[\"function\", \"getObjectMaterials\"],\n\t[\"function\", \"getObjectProxy\"],\n\t[\"function\", \"getObjectTextures\"],\n\t[\"function\", \"getObjectType\"],\n\t[\"function\", \"getObjectViewDistance\"],\n\t[\"function\", \"getOxygenRemaining\"],\n\t[\"function\", \"getPersonUsedDLCs\"],\n\t[\"function\", \"getPilotCameraDirection\"],\n\t[\"function\", \"getPilotCameraPosition\"],\n\t[\"function\", \"getPilotCameraRotation\"],\n\t[\"function\", \"getPilotCameraTarget\"],\n\t[\"function\", \"getPlateNumber\"],\n\t[\"function\", \"getPlayerChannel\"],\n\t[\"function\", \"getPlayerScores\"],\n\t[\"function\", \"getPlayerUID\"],\n\t[\"function\", \"getPlayerUIDOld\"],\n\t[\"function\", \"getPos\"],\n\t[\"function\", \"getPosASL\"],\n\t[\"function\", \"getPosASLVisual\"],\n\t[\"function\", \"getPosASLW\"],\n\t[\"function\", \"getPosATL\"],\n\t[\"function\", \"getPosATLVisual\"],\n\t[\"function\", \"getPosVisual\"],\n\t[\"function\", \"getPosWorld\"],\n\t[\"function\", \"getPylonMagazines\"],\n\t[\"function\", \"getRelDir\"],\n\t[\"function\", \"getRelPos\"],\n\t[\"function\", \"getRemoteSensorsDisabled\"],\n\t[\"function\", \"getRepairCargo\"],\n\t[\"function\", \"getResolution\"],\n\t[\"function\", \"getRotorBrakeRTD\"],\n\t[\"function\", \"getShadowDistance\"],\n\t[\"function\", \"getShotParents\"],\n\t[\"function\", \"getSlingLoad\"],\n\t[\"function\", \"getSoundController\"],\n\t[\"function\", \"getSoundControllerResult\"],\n\t[\"function\", \"getSpeed\"],\n\t[\"function\", \"getStamina\"],\n\t[\"function\", \"getStatValue\"],\n\t[\"function\", \"getSuppression\"],\n\t[\"function\", \"getTerrainGrid\"],\n\t[\"function\", \"getTerrainHeightASL\"],\n\t[\"function\", \"getText\"],\n\t[\"function\", \"getTotalDLCUsageTime\"],\n\t[\"function\", \"getTrimOffsetRTD\"],\n\t[\"function\", \"getUnitLoadout\"],\n\t[\"function\", \"getUnitTrait\"],\n\t[\"function\", \"getUserMFDText\"],\n\t[\"function\", \"getUserMFDValue\"],\n\t[\"function\", \"getVariable\"],\n\t[\"function\", \"getVehicleCargo\"],\n\t[\"function\", \"getWeaponCargo\"],\n\t[\"function\", \"getWeaponSway\"],\n\t[\"function\", \"getWingsOrientationRTD\"],\n\t[\"function\", \"getWingsPositionRTD\"],\n\t[\"function\", \"getWPPos\"],\n\t[\"function\", \"glanceAt\"],\n\t[\"function\", \"globalChat\"],\n\t[\"function\", \"globalRadio\"],\n\t[\"function\", \"goggles\"],\n\t[\"function\", \"group\"],\n\t[\"function\", \"groupChat\"],\n\t[\"function\", \"groupFromNetId\"],\n\t[\"function\", \"groupIconSelectable\"],\n\t[\"function\", \"groupIconsVisible\"],\n\t[\"function\", \"groupId\"],\n\t[\"function\", \"groupOwner\"],\n\t[\"function\", \"groupRadio\"],\n\t[\"function\", \"groupSelectedUnits\"],\n\t[\"function\", \"groupSelectUnit\"],\n\t[\"function\", \"grpNull\"],\n\t[\"function\", \"gunner\"],\n\t[\"function\", \"gusts\"],\n\t[\"function\", \"halt\"],\n\t[\"function\", \"handgunItems\"],\n\t[\"function\", \"handgunMagazine\"],\n\t[\"function\", \"handgunWeapon\"],\n\t[\"function\", \"handsHit\"],\n\t[\"function\", \"hasInterface\"],\n\t[\"function\", \"hasPilotCamera\"],\n\t[\"function\", \"hasWeapon\"],\n\t[\"function\", \"hcAllGroups\"],\n\t[\"function\", \"hcGroupParams\"],\n\t[\"function\", \"hcLeader\"],\n\t[\"function\", \"hcRemoveAllGroups\"],\n\t[\"function\", \"hcRemoveGroup\"],\n\t[\"function\", \"hcSelected\"],\n\t[\"function\", \"hcSelectGroup\"],\n\t[\"function\", \"hcSetGroup\"],\n\t[\"function\", \"hcShowBar\"],\n\t[\"function\", \"hcShownBar\"],\n\t[\"function\", \"headgear\"],\n\t[\"function\", \"hideBody\"],\n\t[\"function\", \"hideObject\"],\n\t[\"function\", \"hideObjectGlobal\"],\n\t[\"function\", \"hideSelection\"],\n\t[\"function\", \"hint\"],\n\t[\"function\", \"hintC\"],\n\t[\"function\", \"hintCadet\"],\n\t[\"function\", \"hintSilent\"],\n\t[\"function\", \"hmd\"],\n\t[\"function\", \"hostMission\"],\n\t[\"function\", \"htmlLoad\"],\n\t[\"function\", \"HUDMovementLevels\"],\n\t[\"function\", \"humidity\"],\n\t[\"function\", \"image\"],\n\t[\"function\", \"importAllGroups\"],\n\t[\"function\", \"importance\"],\n\t[\"function\", \"in\"],\n\t[\"function\", \"inArea\"],\n\t[\"function\", \"inAreaArray\"],\n\t[\"function\", \"incapacitatedState\"],\n\t[\"function\", \"independent\"],\n\t[\"function\", \"inflame\"],\n\t[\"function\", \"inflamed\"],\n\t[\"function\", \"infoPanel\"],\n\t[\"function\", \"infoPanelComponentEnabled\"],\n\t[\"function\", \"infoPanelComponents\"],\n\t[\"function\", \"infoPanels\"],\n\t[\"function\", \"inGameUISetEventHandler\"],\n\t[\"function\", \"inheritsFrom\"],\n\t[\"function\", \"initAmbientLife\"],\n\t[\"function\", \"inPolygon\"],\n\t[\"function\", \"inputAction\"],\n\t[\"function\", \"inRangeOfArtillery\"],\n\t[\"function\", \"insertEditorObject\"],\n\t[\"function\", \"intersect\"],\n\t[\"function\", \"is3DEN\"],\n\t[\"function\", \"is3DENMultiplayer\"],\n\t[\"function\", \"isAbleToBreathe\"],\n\t[\"function\", \"isAgent\"],\n\t[\"function\", \"isAimPrecisionEnabled\"],\n\t[\"function\", \"isArray\"],\n\t[\"function\", \"isAutoHoverOn\"],\n\t[\"function\", \"isAutonomous\"],\n\t[\"function\", \"isAutoStartUpEnabledRTD\"],\n\t[\"function\", \"isAutotest\"],\n\t[\"function\", \"isAutoTrimOnRTD\"],\n\t[\"function\", \"isBleeding\"],\n\t[\"function\", \"isBurning\"],\n\t[\"function\", \"isClass\"],\n\t[\"function\", \"isCollisionLightOn\"],\n\t[\"function\", \"isCopilotEnabled\"],\n\t[\"function\", \"isDamageAllowed\"],\n\t[\"function\", \"isDedicated\"],\n\t[\"function\", \"isDLCAvailable\"],\n\t[\"function\", \"isEngineOn\"],\n\t[\"function\", \"isEqualTo\"],\n\t[\"function\", \"isEqualType\"],\n\t[\"function\", \"isEqualTypeAll\"],\n\t[\"function\", \"isEqualTypeAny\"],\n\t[\"function\", \"isEqualTypeArray\"],\n\t[\"function\", \"isEqualTypeParams\"],\n\t[\"function\", \"isFilePatchingEnabled\"],\n\t[\"function\", \"isFlashlightOn\"],\n\t[\"function\", \"isFlatEmpty\"],\n\t[\"function\", \"isForcedWalk\"],\n\t[\"function\", \"isFormationLeader\"],\n\t[\"function\", \"isGroupDeletedWhenEmpty\"],\n\t[\"function\", \"isHidden\"],\n\t[\"function\", \"isInRemainsCollector\"],\n\t[\"function\", \"isInstructorFigureEnabled\"],\n\t[\"function\", \"isIRLaserOn\"],\n\t[\"function\", \"isKeyActive\"],\n\t[\"function\", \"isKindOf\"],\n\t[\"function\", \"isLaserOn\"],\n\t[\"function\", \"isLightOn\"],\n\t[\"function\", \"isLocalized\"],\n\t[\"function\", \"isManualFire\"],\n\t[\"function\", \"isMarkedForCollection\"],\n\t[\"function\", \"isMultiplayer\"],\n\t[\"function\", \"isMultiplayerSolo\"],\n\t[\"function\", \"isNil\"],\n\t[\"function\", \"isNull\"],\n\t[\"function\", \"isNumber\"],\n\t[\"function\", \"isObjectHidden\"],\n\t[\"function\", \"isObjectRTD\"],\n\t[\"function\", \"isOnRoad\"],\n\t[\"function\", \"isPipEnabled\"],\n\t[\"function\", \"isPlayer\"],\n\t[\"function\", \"isRealTime\"],\n\t[\"function\", \"isRemoteExecuted\"],\n\t[\"function\", \"isRemoteExecutedJIP\"],\n\t[\"function\", \"isServer\"],\n\t[\"function\", \"isShowing3DIcons\"],\n\t[\"function\", \"isSimpleObject\"],\n\t[\"function\", \"isSprintAllowed\"],\n\t[\"function\", \"isStaminaEnabled\"],\n\t[\"function\", \"isSteamMission\"],\n\t[\"function\", \"isStreamFriendlyUIEnabled\"],\n\t[\"function\", \"isStressDamageEnabled\"],\n\t[\"function\", \"isText\"],\n\t[\"function\", \"isTouchingGround\"],\n\t[\"function\", \"isTurnedOut\"],\n\t[\"function\", \"isTutHintsEnabled\"],\n\t[\"function\", \"isUAVConnectable\"],\n\t[\"function\", \"isUAVConnected\"],\n\t[\"function\", \"isUIContext\"],\n\t[\"function\", \"isUniformAllowed\"],\n\t[\"function\", \"isVehicleCargo\"],\n\t[\"function\", \"isVehicleRadarOn\"],\n\t[\"function\", \"isVehicleSensorEnabled\"],\n\t[\"function\", \"isWalking\"],\n\t[\"function\", \"isWeaponDeployed\"],\n\t[\"function\", \"isWeaponRested\"],\n\t[\"function\", \"itemCargo\"],\n\t[\"function\", \"items\"],\n\t[\"function\", \"itemsWithMagazines\"],\n\t[\"function\", \"join\"],\n\t[\"function\", \"joinAs\"],\n\t[\"function\", \"joinAsSilent\"],\n\t[\"function\", \"joinSilent\"],\n\t[\"function\", \"joinString\"],\n\t[\"function\", \"kbAddDatabase\"],\n\t[\"function\", \"kbAddDatabaseTargets\"],\n\t[\"function\", \"kbAddTopic\"],\n\t[\"function\", \"kbHasTopic\"],\n\t[\"function\", \"kbReact\"],\n\t[\"function\", \"kbRemoveTopic\"],\n\t[\"function\", \"kbTell\"],\n\t[\"function\", \"kbWasSaid\"],\n\t[\"function\", \"keyImage\"],\n\t[\"function\", \"keyName\"],\n\t[\"function\", \"knowsAbout\"],\n\t[\"function\", \"land\"],\n\t[\"function\", \"landAt\"],\n\t[\"function\", \"landResult\"],\n\t[\"function\", \"language\"],\n\t[\"function\", \"laserTarget\"],\n\t[\"function\", \"lbAdd\"],\n\t[\"function\", \"lbClear\"],\n\t[\"function\", \"lbColor\"],\n\t[\"function\", \"lbColorRight\"],\n\t[\"function\", \"lbCurSel\"],\n\t[\"function\", \"lbData\"],\n\t[\"function\", \"lbDelete\"],\n\t[\"function\", \"lbIsSelected\"],\n\t[\"function\", \"lbPicture\"],\n\t[\"function\", \"lbPictureRight\"],\n\t[\"function\", \"lbSelection\"],\n\t[\"function\", \"lbSetColor\"],\n\t[\"function\", \"lbSetColorRight\"],\n\t[\"function\", \"lbSetCurSel\"],\n\t[\"function\", \"lbSetData\"],\n\t[\"function\", \"lbSetPicture\"],\n\t[\"function\", \"lbSetPictureColor\"],\n\t[\"function\", \"lbSetPictureColorDisabled\"],\n\t[\"function\", \"lbSetPictureColorSelected\"],\n\t[\"function\", \"lbSetPictureRight\"],\n\t[\"function\", \"lbSetPictureRightColor\"],\n\t[\"function\", \"lbSetPictureRightColorDisabled\"],\n\t[\"function\", \"lbSetPictureRightColorSelected\"],\n\t[\"function\", \"lbSetSelectColor\"],\n\t[\"function\", \"lbSetSelectColorRight\"],\n\t[\"function\", \"lbSetSelected\"],\n\t[\"function\", \"lbSetText\"],\n\t[\"function\", \"lbSetTextRight\"],\n\t[\"function\", \"lbSetTooltip\"],\n\t[\"function\", \"lbSetValue\"],\n\t[\"function\", \"lbSize\"],\n\t[\"function\", \"lbSort\"],\n\t[\"function\", \"lbSortByValue\"],\n\t[\"function\", \"lbText\"],\n\t[\"function\", \"lbTextRight\"],\n\t[\"function\", \"lbValue\"],\n\t[\"function\", \"leader\"],\n\t[\"function\", \"leaderboardDeInit\"],\n\t[\"function\", \"leaderboardGetRows\"],\n\t[\"function\", \"leaderboardInit\"],\n\t[\"function\", \"leaderboardRequestRowsFriends\"],\n\t[\"function\", \"leaderboardRequestRowsGlobal\"],\n\t[\"function\", \"leaderboardRequestRowsGlobalAroundUser\"],\n\t[\"function\", \"leaderboardsRequestUploadScore\"],\n\t[\"function\", \"leaderboardsRequestUploadScoreKeepBest\"],\n\t[\"function\", \"leaderboardState\"],\n\t[\"function\", \"leaveVehicle\"],\n\t[\"function\", \"libraryCredits\"],\n\t[\"function\", \"libraryDisclaimers\"],\n\t[\"function\", \"lifeState\"],\n\t[\"function\", \"lightAttachObject\"],\n\t[\"function\", \"lightDetachObject\"],\n\t[\"function\", \"lightIsOn\"],\n\t[\"function\", \"lightnings\"],\n\t[\"function\", \"limitSpeed\"],\n\t[\"function\", \"linearConversion\"],\n\t[\"function\", \"lineBreak\"],\n\t[\"function\", \"lineIntersects\"],\n\t[\"function\", \"lineIntersectsObjs\"],\n\t[\"function\", \"lineIntersectsSurfaces\"],\n\t[\"function\", \"lineIntersectsWith\"],\n\t[\"function\", \"linkItem\"],\n\t[\"function\", \"list\"],\n\t[\"function\", \"listObjects\"],\n\t[\"function\", \"listRemoteTargets\"],\n\t[\"function\", \"listVehicleSensors\"],\n\t[\"function\", \"ln\"],\n\t[\"function\", \"lnbAddArray\"],\n\t[\"function\", \"lnbAddColumn\"],\n\t[\"function\", \"lnbAddRow\"],\n\t[\"function\", \"lnbClear\"],\n\t[\"function\", \"lnbColor\"],\n\t[\"function\", \"lnbColorRight\"],\n\t[\"function\", \"lnbCurSelRow\"],\n\t[\"function\", \"lnbData\"],\n\t[\"function\", \"lnbDeleteColumn\"],\n\t[\"function\", \"lnbDeleteRow\"],\n\t[\"function\", \"lnbGetColumnsPosition\"],\n\t[\"function\", \"lnbPicture\"],\n\t[\"function\", \"lnbPictureRight\"],\n\t[\"function\", \"lnbSetColor\"],\n\t[\"function\", \"lnbSetColorRight\"],\n\t[\"function\", \"lnbSetColumnsPos\"],\n\t[\"function\", \"lnbSetCurSelRow\"],\n\t[\"function\", \"lnbSetData\"],\n\t[\"function\", \"lnbSetPicture\"],\n\t[\"function\", \"lnbSetPictureColor\"],\n\t[\"function\", \"lnbSetPictureColorRight\"],\n\t[\"function\", \"lnbSetPictureColorSelected\"],\n\t[\"function\", \"lnbSetPictureColorSelectedRight\"],\n\t[\"function\", \"lnbSetPictureRight\"],\n\t[\"function\", \"lnbSetText\"],\n\t[\"function\", \"lnbSetTextRight\"],\n\t[\"function\", \"lnbSetValue\"],\n\t[\"function\", \"lnbSize\"],\n\t[\"function\", \"lnbSort\"],\n\t[\"function\", \"lnbSortByValue\"],\n\t[\"function\", \"lnbText\"],\n\t[\"function\", \"lnbTextRight\"],\n\t[\"function\", \"lnbValue\"],\n\t[\"function\", \"load\"],\n\t[\"function\", \"loadAbs\"],\n\t[\"function\", \"loadBackpack\"],\n\t[\"function\", \"loadFile\"],\n\t[\"function\", \"loadGame\"],\n\t[\"function\", \"loadIdentity\"],\n\t[\"function\", \"loadMagazine\"],\n\t[\"function\", \"loadOverlay\"],\n\t[\"function\", \"loadStatus\"],\n\t[\"function\", \"loadUniform\"],\n\t[\"function\", \"loadVest\"],\n\t[\"function\", \"local\"],\n\t[\"function\", \"localize\"],\n\t[\"function\", \"locationNull\"],\n\t[\"function\", \"locationPosition\"],\n\t[\"function\", \"lock\"],\n\t[\"function\", \"lockCameraTo\"],\n\t[\"function\", \"lockCargo\"],\n\t[\"function\", \"lockDriver\"],\n\t[\"function\", \"locked\"],\n\t[\"function\", \"lockedCargo\"],\n\t[\"function\", \"lockedDriver\"],\n\t[\"function\", \"lockedTurret\"],\n\t[\"function\", \"lockIdentity\"],\n\t[\"function\", \"lockTurret\"],\n\t[\"function\", \"lockWP\"],\n\t[\"function\", \"log\"],\n\t[\"function\", \"logEntities\"],\n\t[\"function\", \"logNetwork\"],\n\t[\"function\", \"logNetworkTerminate\"],\n\t[\"function\", \"lookAt\"],\n\t[\"function\", \"lookAtPos\"],\n\t[\"function\", \"magazineCargo\"],\n\t[\"function\", \"magazines\"],\n\t[\"function\", \"magazinesAllTurrets\"],\n\t[\"function\", \"magazinesAmmo\"],\n\t[\"function\", \"magazinesAmmoCargo\"],\n\t[\"function\", \"magazinesAmmoFull\"],\n\t[\"function\", \"magazinesDetail\"],\n\t[\"function\", \"magazinesDetailBackpack\"],\n\t[\"function\", \"magazinesDetailUniform\"],\n\t[\"function\", \"magazinesDetailVest\"],\n\t[\"function\", \"magazinesTurret\"],\n\t[\"function\", \"magazineTurretAmmo\"],\n\t[\"function\", \"mapAnimAdd\"],\n\t[\"function\", \"mapAnimClear\"],\n\t[\"function\", \"mapAnimCommit\"],\n\t[\"function\", \"mapAnimDone\"],\n\t[\"function\", \"mapCenterOnCamera\"],\n\t[\"function\", \"mapGridPosition\"],\n\t[\"function\", \"markAsFinishedOnSteam\"],\n\t[\"function\", \"markerAlpha\"],\n\t[\"function\", \"markerBrush\"],\n\t[\"function\", \"markerColor\"],\n\t[\"function\", \"markerDir\"],\n\t[\"function\", \"markerPos\"],\n\t[\"function\", \"markerShape\"],\n\t[\"function\", \"markerSize\"],\n\t[\"function\", \"markerText\"],\n\t[\"function\", \"markerType\"],\n\t[\"function\", \"max\"],\n\t[\"function\", \"members\"],\n\t[\"function\", \"menuAction\"],\n\t[\"function\", \"menuAdd\"],\n\t[\"function\", \"menuChecked\"],\n\t[\"function\", \"menuClear\"],\n\t[\"function\", \"menuCollapse\"],\n\t[\"function\", \"menuData\"],\n\t[\"function\", \"menuDelete\"],\n\t[\"function\", \"menuEnable\"],\n\t[\"function\", \"menuEnabled\"],\n\t[\"function\", \"menuExpand\"],\n\t[\"function\", \"menuHover\"],\n\t[\"function\", \"menuPicture\"],\n\t[\"function\", \"menuSetAction\"],\n\t[\"function\", \"menuSetCheck\"],\n\t[\"function\", \"menuSetData\"],\n\t[\"function\", \"menuSetPicture\"],\n\t[\"function\", \"menuSetValue\"],\n\t[\"function\", \"menuShortcut\"],\n\t[\"function\", \"menuShortcutText\"],\n\t[\"function\", \"menuSize\"],\n\t[\"function\", \"menuSort\"],\n\t[\"function\", \"menuText\"],\n\t[\"function\", \"menuURL\"],\n\t[\"function\", \"menuValue\"],\n\t[\"function\", \"min\"],\n\t[\"function\", \"mineActive\"],\n\t[\"function\", \"mineDetectedBy\"],\n\t[\"function\", \"missionConfigFile\"],\n\t[\"function\", \"missionDifficulty\"],\n\t[\"function\", \"missionName\"],\n\t[\"function\", \"missionNamespace\"],\n\t[\"function\", \"missionStart\"],\n\t[\"function\", \"missionVersion\"],\n\t[\"function\", \"modelToWorld\"],\n\t[\"function\", \"modelToWorldVisual\"],\n\t[\"function\", \"modelToWorldVisualWorld\"],\n\t[\"function\", \"modelToWorldWorld\"],\n\t[\"function\", \"modParams\"],\n\t[\"function\", \"moonIntensity\"],\n\t[\"function\", \"moonPhase\"],\n\t[\"function\", \"morale\"],\n\t[\"function\", \"move\"],\n\t[\"function\", \"move3DENCamera\"],\n\t[\"function\", \"moveInAny\"],\n\t[\"function\", \"moveInCargo\"],\n\t[\"function\", \"moveInCommander\"],\n\t[\"function\", \"moveInDriver\"],\n\t[\"function\", \"moveInGunner\"],\n\t[\"function\", \"moveInTurret\"],\n\t[\"function\", \"moveObjectToEnd\"],\n\t[\"function\", \"moveOut\"],\n\t[\"function\", \"moveTime\"],\n\t[\"function\", \"moveTo\"],\n\t[\"function\", \"moveToCompleted\"],\n\t[\"function\", \"moveToFailed\"],\n\t[\"function\", \"musicVolume\"],\n\t[\"function\", \"name\"],\n\t[\"function\", \"nameSound\"],\n\t[\"function\", \"nearEntities\"],\n\t[\"function\", \"nearestBuilding\"],\n\t[\"function\", \"nearestLocation\"],\n\t[\"function\", \"nearestLocations\"],\n\t[\"function\", \"nearestLocationWithDubbing\"],\n\t[\"function\", \"nearestObject\"],\n\t[\"function\", \"nearestObjects\"],\n\t[\"function\", \"nearestTerrainObjects\"],\n\t[\"function\", \"nearObjects\"],\n\t[\"function\", \"nearObjectsReady\"],\n\t[\"function\", \"nearRoads\"],\n\t[\"function\", \"nearSupplies\"],\n\t[\"function\", \"nearTargets\"],\n\t[\"function\", \"needReload\"],\n\t[\"function\", \"netId\"],\n\t[\"function\", \"netObjNull\"],\n\t[\"function\", \"newOverlay\"],\n\t[\"function\", \"nextMenuItemIndex\"],\n\t[\"function\", \"nextWeatherChange\"],\n\t[\"function\", \"nMenuItems\"],\n\t[\"function\", \"numberOfEnginesRTD\"],\n\t[\"function\", \"numberToDate\"],\n\t[\"function\", \"objectCurators\"],\n\t[\"function\", \"objectFromNetId\"],\n\t[\"function\", \"objectParent\"],\n\t[\"function\", \"objNull\"],\n\t[\"function\", \"objStatus\"],\n\t[\"function\", \"onBriefingGear\"],\n\t[\"function\", \"onBriefingGroup\"],\n\t[\"function\", \"onBriefingNotes\"],\n\t[\"function\", \"onBriefingPlan\"],\n\t[\"function\", \"onBriefingTeamSwitch\"],\n\t[\"function\", \"onCommandModeChanged\"],\n\t[\"function\", \"onDoubleClick\"],\n\t[\"function\", \"onEachFrame\"],\n\t[\"function\", \"onGroupIconClick\"],\n\t[\"function\", \"onGroupIconOverEnter\"],\n\t[\"function\", \"onGroupIconOverLeave\"],\n\t[\"function\", \"onHCGroupSelectionChanged\"],\n\t[\"function\", \"onMapSingleClick\"],\n\t[\"function\", \"onPlayerConnected\"],\n\t[\"function\", \"onPlayerDisconnected\"],\n\t[\"function\", \"onPreloadFinished\"],\n\t[\"function\", \"onPreloadStarted\"],\n\t[\"function\", \"onShowNewObject\"],\n\t[\"function\", \"onTeamSwitch\"],\n\t[\"function\", \"openCuratorInterface\"],\n\t[\"function\", \"openDLCPage\"],\n\t[\"function\", \"openDSInterface\"],\n\t[\"function\", \"openMap\"],\n\t[\"function\", \"openSteamApp\"],\n\t[\"function\", \"openYoutubeVideo\"],\n\t[\"function\", \"opfor\"],\n\t[\"function\", \"orderGetIn\"],\n\t[\"function\", \"overcast\"],\n\t[\"function\", \"overcastForecast\"],\n\t[\"function\", \"owner\"],\n\t[\"function\", \"param\"],\n\t[\"function\", \"params\"],\n\t[\"function\", \"parseNumber\"],\n\t[\"function\", \"parseSimpleArray\"],\n\t[\"function\", \"parseText\"],\n\t[\"function\", \"parsingNamespace\"],\n\t[\"function\", \"particlesQuality\"],\n\t[\"function\", \"pi\"],\n\t[\"function\", \"pickWeaponPool\"],\n\t[\"function\", \"pitch\"],\n\t[\"function\", \"pixelGrid\"],\n\t[\"function\", \"pixelGridBase\"],\n\t[\"function\", \"pixelGridNoUIScale\"],\n\t[\"function\", \"pixelH\"],\n\t[\"function\", \"pixelW\"],\n\t[\"function\", \"playableSlotsNumber\"],\n\t[\"function\", \"playableUnits\"],\n\t[\"function\", \"playAction\"],\n\t[\"function\", \"playActionNow\"],\n\t[\"function\", \"player\"],\n\t[\"function\", \"playerRespawnTime\"],\n\t[\"function\", \"playerSide\"],\n\t[\"function\", \"playersNumber\"],\n\t[\"function\", \"playGesture\"],\n\t[\"function\", \"playMission\"],\n\t[\"function\", \"playMove\"],\n\t[\"function\", \"playMoveNow\"],\n\t[\"function\", \"playMusic\"],\n\t[\"function\", \"playScriptedMission\"],\n\t[\"function\", \"playSound\"],\n\t[\"function\", \"playSound3D\"],\n\t[\"function\", \"position\"],\n\t[\"function\", \"positionCameraToWorld\"],\n\t[\"function\", \"posScreenToWorld\"],\n\t[\"function\", \"posWorldToScreen\"],\n\t[\"function\", \"ppEffectAdjust\"],\n\t[\"function\", \"ppEffectCommit\"],\n\t[\"function\", \"ppEffectCommitted\"],\n\t[\"function\", \"ppEffectCreate\"],\n\t[\"function\", \"ppEffectDestroy\"],\n\t[\"function\", \"ppEffectEnable\"],\n\t[\"function\", \"ppEffectEnabled\"],\n\t[\"function\", \"ppEffectForceInNVG\"],\n\t[\"function\", \"precision\"],\n\t[\"function\", \"preloadCamera\"],\n\t[\"function\", \"preloadObject\"],\n\t[\"function\", \"preloadSound\"],\n\t[\"function\", \"preloadTitleObj\"],\n\t[\"function\", \"preloadTitleRsc\"],\n\t[\"function\", \"primaryWeapon\"],\n\t[\"function\", \"primaryWeaponItems\"],\n\t[\"function\", \"primaryWeaponMagazine\"],\n\t[\"function\", \"priority\"],\n\t[\"function\", \"processDiaryLink\"],\n\t[\"function\", \"processInitCommands\"],\n\t[\"function\", \"productVersion\"],\n\t[\"function\", \"profileName\"],\n\t[\"function\", \"profileNamespace\"],\n\t[\"function\", \"profileNameSteam\"],\n\t[\"function\", \"progressLoadingScreen\"],\n\t[\"function\", \"progressPosition\"],\n\t[\"function\", \"progressSetPosition\"],\n\t[\"function\", \"publicVariable\"],\n\t[\"function\", \"publicVariableClient\"],\n\t[\"function\", \"publicVariableServer\"],\n\t[\"function\", \"pushBack\"],\n\t[\"function\", \"pushBackUnique\"],\n\t[\"function\", \"putWeaponPool\"],\n\t[\"function\", \"queryItemsPool\"],\n\t[\"function\", \"queryMagazinePool\"],\n\t[\"function\", \"queryWeaponPool\"],\n\t[\"function\", \"rad\"],\n\t[\"function\", \"radioChannelAdd\"],\n\t[\"function\", \"radioChannelCreate\"],\n\t[\"function\", \"radioChannelRemove\"],\n\t[\"function\", \"radioChannelSetCallSign\"],\n\t[\"function\", \"radioChannelSetLabel\"],\n\t[\"function\", \"radioVolume\"],\n\t[\"function\", \"rain\"],\n\t[\"function\", \"rainbow\"],\n\t[\"function\", \"random\"],\n\t[\"function\", \"rank\"],\n\t[\"function\", \"rankId\"],\n\t[\"function\", \"rating\"],\n\t[\"function\", \"rectangular\"],\n\t[\"function\", \"registeredTasks\"],\n\t[\"function\", \"registerTask\"],\n\t[\"function\", \"reload\"],\n\t[\"function\", \"reloadEnabled\"],\n\t[\"function\", \"remoteControl\"],\n\t[\"function\", \"remoteExec\"],\n\t[\"function\", \"remoteExecCall\"],\n\t[\"function\", \"remoteExecutedOwner\"],\n\t[\"function\", \"remove3DENConnection\"],\n\t[\"function\", \"remove3DENEventHandler\"],\n\t[\"function\", \"remove3DENLayer\"],\n\t[\"function\", \"removeAction\"],\n\t[\"function\", \"removeAll3DENEventHandlers\"],\n\t[\"function\", \"removeAllActions\"],\n\t[\"function\", \"removeAllAssignedItems\"],\n\t[\"function\", \"removeAllContainers\"],\n\t[\"function\", \"removeAllCuratorAddons\"],\n\t[\"function\", \"removeAllCuratorCameraAreas\"],\n\t[\"function\", \"removeAllCuratorEditingAreas\"],\n\t[\"function\", \"removeAllEventHandlers\"],\n\t[\"function\", \"removeAllHandgunItems\"],\n\t[\"function\", \"removeAllItems\"],\n\t[\"function\", \"removeAllItemsWithMagazines\"],\n\t[\"function\", \"removeAllMissionEventHandlers\"],\n\t[\"function\", \"removeAllMPEventHandlers\"],\n\t[\"function\", \"removeAllMusicEventHandlers\"],\n\t[\"function\", \"removeAllOwnedMines\"],\n\t[\"function\", \"removeAllPrimaryWeaponItems\"],\n\t[\"function\", \"removeAllWeapons\"],\n\t[\"function\", \"removeBackpack\"],\n\t[\"function\", \"removeBackpackGlobal\"],\n\t[\"function\", \"removeCuratorAddons\"],\n\t[\"function\", \"removeCuratorCameraArea\"],\n\t[\"function\", \"removeCuratorEditableObjects\"],\n\t[\"function\", \"removeCuratorEditingArea\"],\n\t[\"function\", \"removeDrawIcon\"],\n\t[\"function\", \"removeDrawLinks\"],\n\t[\"function\", \"removeEventHandler\"],\n\t[\"function\", \"removeFromRemainsCollector\"],\n\t[\"function\", \"removeGoggles\"],\n\t[\"function\", \"removeGroupIcon\"],\n\t[\"function\", \"removeHandgunItem\"],\n\t[\"function\", \"removeHeadgear\"],\n\t[\"function\", \"removeItem\"],\n\t[\"function\", \"removeItemFromBackpack\"],\n\t[\"function\", \"removeItemFromUniform\"],\n\t[\"function\", \"removeItemFromVest\"],\n\t[\"function\", \"removeItems\"],\n\t[\"function\", \"removeMagazine\"],\n\t[\"function\", \"removeMagazineGlobal\"],\n\t[\"function\", \"removeMagazines\"],\n\t[\"function\", \"removeMagazinesTurret\"],\n\t[\"function\", \"removeMagazineTurret\"],\n\t[\"function\", \"removeMenuItem\"],\n\t[\"function\", \"removeMissionEventHandler\"],\n\t[\"function\", \"removeMPEventHandler\"],\n\t[\"function\", \"removeMusicEventHandler\"],\n\t[\"function\", \"removeOwnedMine\"],\n\t[\"function\", \"removePrimaryWeaponItem\"],\n\t[\"function\", \"removeSecondaryWeaponItem\"],\n\t[\"function\", \"removeSimpleTask\"],\n\t[\"function\", \"removeSwitchableUnit\"],\n\t[\"function\", \"removeTeamMember\"],\n\t[\"function\", \"removeUniform\"],\n\t[\"function\", \"removeVest\"],\n\t[\"function\", \"removeWeapon\"],\n\t[\"function\", \"removeWeaponAttachmentCargo\"],\n\t[\"function\", \"removeWeaponCargo\"],\n\t[\"function\", \"removeWeaponGlobal\"],\n\t[\"function\", \"removeWeaponTurret\"],\n\t[\"function\", \"reportRemoteTarget\"],\n\t[\"function\", \"requiredVersion\"],\n\t[\"function\", \"resetCamShake\"],\n\t[\"function\", \"resetSubgroupDirection\"],\n\t[\"function\", \"resistance\"],\n\t[\"function\", \"resize\"],\n\t[\"function\", \"resources\"],\n\t[\"function\", \"respawnVehicle\"],\n\t[\"function\", \"restartEditorCamera\"],\n\t[\"function\", \"reveal\"],\n\t[\"function\", \"revealMine\"],\n\t[\"function\", \"reverse\"],\n\t[\"function\", \"reversedMouseY\"],\n\t[\"function\", \"roadAt\"],\n\t[\"function\", \"roadsConnectedTo\"],\n\t[\"function\", \"roleDescription\"],\n\t[\"function\", \"ropeAttachedObjects\"],\n\t[\"function\", \"ropeAttachedTo\"],\n\t[\"function\", \"ropeAttachEnabled\"],\n\t[\"function\", \"ropeAttachTo\"],\n\t[\"function\", \"ropeCreate\"],\n\t[\"function\", \"ropeCut\"],\n\t[\"function\", \"ropeDestroy\"],\n\t[\"function\", \"ropeDetach\"],\n\t[\"function\", \"ropeEndPosition\"],\n\t[\"function\", \"ropeLength\"],\n\t[\"function\", \"ropes\"],\n\t[\"function\", \"ropeUnwind\"],\n\t[\"function\", \"ropeUnwound\"],\n\t[\"function\", \"rotorsForcesRTD\"],\n\t[\"function\", \"rotorsRpmRTD\"],\n\t[\"function\", \"round\"],\n\t[\"function\", \"runInitScript\"],\n\t[\"function\", \"safeZoneH\"],\n\t[\"function\", \"safeZoneW\"],\n\t[\"function\", \"safeZoneWAbs\"],\n\t[\"function\", \"safeZoneX\"],\n\t[\"function\", \"safeZoneXAbs\"],\n\t[\"function\", \"safeZoneY\"],\n\t[\"function\", \"save3DENInventory\"],\n\t[\"function\", \"saveGame\"],\n\t[\"function\", \"saveIdentity\"],\n\t[\"function\", \"saveJoysticks\"],\n\t[\"function\", \"saveOverlay\"],\n\t[\"function\", \"saveProfileNamespace\"],\n\t[\"function\", \"saveStatus\"],\n\t[\"function\", \"saveVar\"],\n\t[\"function\", \"savingEnabled\"],\n\t[\"function\", \"say\"],\n\t[\"function\", \"say2D\"],\n\t[\"function\", \"say3D\"],\n\t[\"function\", \"score\"],\n\t[\"function\", \"scoreSide\"],\n\t[\"function\", \"screenshot\"],\n\t[\"function\", \"screenToWorld\"],\n\t[\"function\", \"scriptDone\"],\n\t[\"function\", \"scriptName\"],\n\t[\"function\", \"scriptNull\"],\n\t[\"function\", \"scudState\"],\n\t[\"function\", \"secondaryWeapon\"],\n\t[\"function\", \"secondaryWeaponItems\"],\n\t[\"function\", \"secondaryWeaponMagazine\"],\n\t[\"function\", \"select\"],\n\t[\"function\", \"selectBestPlaces\"],\n\t[\"function\", \"selectDiarySubject\"],\n\t[\"function\", \"selectedEditorObjects\"],\n\t[\"function\", \"selectEditorObject\"],\n\t[\"function\", \"selectionNames\"],\n\t[\"function\", \"selectionPosition\"],\n\t[\"function\", \"selectLeader\"],\n\t[\"function\", \"selectMax\"],\n\t[\"function\", \"selectMin\"],\n\t[\"function\", \"selectNoPlayer\"],\n\t[\"function\", \"selectPlayer\"],\n\t[\"function\", \"selectRandom\"],\n\t[\"function\", \"selectRandomWeighted\"],\n\t[\"function\", \"selectWeapon\"],\n\t[\"function\", \"selectWeaponTurret\"],\n\t[\"function\", \"sendAUMessage\"],\n\t[\"function\", \"sendSimpleCommand\"],\n\t[\"function\", \"sendTask\"],\n\t[\"function\", \"sendTaskResult\"],\n\t[\"function\", \"sendUDPMessage\"],\n\t[\"function\", \"serverCommand\"],\n\t[\"function\", \"serverCommandAvailable\"],\n\t[\"function\", \"serverCommandExecutable\"],\n\t[\"function\", \"serverName\"],\n\t[\"function\", \"serverTime\"],\n\t[\"function\", \"set\"],\n\t[\"function\", \"set3DENAttribute\"],\n\t[\"function\", \"set3DENAttributes\"],\n\t[\"function\", \"set3DENGrid\"],\n\t[\"function\", \"set3DENIconsVisible\"],\n\t[\"function\", \"set3DENLayer\"],\n\t[\"function\", \"set3DENLinesVisible\"],\n\t[\"function\", \"set3DENLogicType\"],\n\t[\"function\", \"set3DENMissionAttribute\"],\n\t[\"function\", \"set3DENMissionAttributes\"],\n\t[\"function\", \"set3DENModelsVisible\"],\n\t[\"function\", \"set3DENObjectType\"],\n\t[\"function\", \"set3DENSelected\"],\n\t[\"function\", \"setAccTime\"],\n\t[\"function\", \"setActualCollectiveRTD\"],\n\t[\"function\", \"setAirplaneThrottle\"],\n\t[\"function\", \"setAirportSide\"],\n\t[\"function\", \"setAmmo\"],\n\t[\"function\", \"setAmmoCargo\"],\n\t[\"function\", \"setAmmoOnPylon\"],\n\t[\"function\", \"setAnimSpeedCoef\"],\n\t[\"function\", \"setAperture\"],\n\t[\"function\", \"setApertureNew\"],\n\t[\"function\", \"setArmoryPoints\"],\n\t[\"function\", \"setAttributes\"],\n\t[\"function\", \"setAutonomous\"],\n\t[\"function\", \"setBehaviour\"],\n\t[\"function\", \"setBleedingRemaining\"],\n\t[\"function\", \"setBrakesRTD\"],\n\t[\"function\", \"setCameraInterest\"],\n\t[\"function\", \"setCamShakeDefParams\"],\n\t[\"function\", \"setCamShakeParams\"],\n\t[\"function\", \"setCamUseTI\"],\n\t[\"function\", \"setCaptive\"],\n\t[\"function\", \"setCenterOfMass\"],\n\t[\"function\", \"setCollisionLight\"],\n\t[\"function\", \"setCombatMode\"],\n\t[\"function\", \"setCompassOscillation\"],\n\t[\"function\", \"setConvoySeparation\"],\n\t[\"function\", \"setCuratorCameraAreaCeiling\"],\n\t[\"function\", \"setCuratorCoef\"],\n\t[\"function\", \"setCuratorEditingAreaType\"],\n\t[\"function\", \"setCuratorWaypointCost\"],\n\t[\"function\", \"setCurrentChannel\"],\n\t[\"function\", \"setCurrentTask\"],\n\t[\"function\", \"setCurrentWaypoint\"],\n\t[\"function\", \"setCustomAimCoef\"],\n\t[\"function\", \"setCustomWeightRTD\"],\n\t[\"function\", \"setDamage\"],\n\t[\"function\", \"setDammage\"],\n\t[\"function\", \"setDate\"],\n\t[\"function\", \"setDebriefingText\"],\n\t[\"function\", \"setDefaultCamera\"],\n\t[\"function\", \"setDestination\"],\n\t[\"function\", \"setDetailMapBlendPars\"],\n\t[\"function\", \"setDir\"],\n\t[\"function\", \"setDirection\"],\n\t[\"function\", \"setDrawIcon\"],\n\t[\"function\", \"setDriveOnPath\"],\n\t[\"function\", \"setDropInterval\"],\n\t[\"function\", \"setDynamicSimulationDistance\"],\n\t[\"function\", \"setDynamicSimulationDistanceCoef\"],\n\t[\"function\", \"setEditorMode\"],\n\t[\"function\", \"setEditorObjectScope\"],\n\t[\"function\", \"setEffectCondition\"],\n\t[\"function\", \"setEngineRpmRTD\"],\n\t[\"function\", \"setFace\"],\n\t[\"function\", \"setFaceAnimation\"],\n\t[\"function\", \"setFatigue\"],\n\t[\"function\", \"setFeatureType\"],\n\t[\"function\", \"setFlagAnimationPhase\"],\n\t[\"function\", \"setFlagOwner\"],\n\t[\"function\", \"setFlagSide\"],\n\t[\"function\", \"setFlagTexture\"],\n\t[\"function\", \"setFog\"],\n\t[\"function\", \"setForceGeneratorRTD\"],\n\t[\"function\", \"setFormation\"],\n\t[\"function\", \"setFormationTask\"],\n\t[\"function\", \"setFormDir\"],\n\t[\"function\", \"setFriend\"],\n\t[\"function\", \"setFromEditor\"],\n\t[\"function\", \"setFSMVariable\"],\n\t[\"function\", \"setFuel\"],\n\t[\"function\", \"setFuelCargo\"],\n\t[\"function\", \"setGroupIcon\"],\n\t[\"function\", \"setGroupIconParams\"],\n\t[\"function\", \"setGroupIconsSelectable\"],\n\t[\"function\", \"setGroupIconsVisible\"],\n\t[\"function\", \"setGroupId\"],\n\t[\"function\", \"setGroupIdGlobal\"],\n\t[\"function\", \"setGroupOwner\"],\n\t[\"function\", \"setGusts\"],\n\t[\"function\", \"setHideBehind\"],\n\t[\"function\", \"setHit\"],\n\t[\"function\", \"setHitIndex\"],\n\t[\"function\", \"setHitPointDamage\"],\n\t[\"function\", \"setHorizonParallaxCoef\"],\n\t[\"function\", \"setHUDMovementLevels\"],\n\t[\"function\", \"setIdentity\"],\n\t[\"function\", \"setImportance\"],\n\t[\"function\", \"setInfoPanel\"],\n\t[\"function\", \"setLeader\"],\n\t[\"function\", \"setLightAmbient\"],\n\t[\"function\", \"setLightAttenuation\"],\n\t[\"function\", \"setLightBrightness\"],\n\t[\"function\", \"setLightColor\"],\n\t[\"function\", \"setLightDayLight\"],\n\t[\"function\", \"setLightFlareMaxDistance\"],\n\t[\"function\", \"setLightFlareSize\"],\n\t[\"function\", \"setLightIntensity\"],\n\t[\"function\", \"setLightnings\"],\n\t[\"function\", \"setLightUseFlare\"],\n\t[\"function\", \"setLocalWindParams\"],\n\t[\"function\", \"setMagazineTurretAmmo\"],\n\t[\"function\", \"setMarkerAlpha\"],\n\t[\"function\", \"setMarkerAlphaLocal\"],\n\t[\"function\", \"setMarkerBrush\"],\n\t[\"function\", \"setMarkerBrushLocal\"],\n\t[\"function\", \"setMarkerColor\"],\n\t[\"function\", \"setMarkerColorLocal\"],\n\t[\"function\", \"setMarkerDir\"],\n\t[\"function\", \"setMarkerDirLocal\"],\n\t[\"function\", \"setMarkerPos\"],\n\t[\"function\", \"setMarkerPosLocal\"],\n\t[\"function\", \"setMarkerShape\"],\n\t[\"function\", \"setMarkerShapeLocal\"],\n\t[\"function\", \"setMarkerSize\"],\n\t[\"function\", \"setMarkerSizeLocal\"],\n\t[\"function\", \"setMarkerText\"],\n\t[\"function\", \"setMarkerTextLocal\"],\n\t[\"function\", \"setMarkerType\"],\n\t[\"function\", \"setMarkerTypeLocal\"],\n\t[\"function\", \"setMass\"],\n\t[\"function\", \"setMimic\"],\n\t[\"function\", \"setMousePosition\"],\n\t[\"function\", \"setMusicEffect\"],\n\t[\"function\", \"setMusicEventHandler\"],\n\t[\"function\", \"setName\"],\n\t[\"function\", \"setNameSound\"],\n\t[\"function\", \"setObjectArguments\"],\n\t[\"function\", \"setObjectMaterial\"],\n\t[\"function\", \"setObjectMaterialGlobal\"],\n\t[\"function\", \"setObjectProxy\"],\n\t[\"function\", \"setObjectTexture\"],\n\t[\"function\", \"setObjectTextureGlobal\"],\n\t[\"function\", \"setObjectViewDistance\"],\n\t[\"function\", \"setOvercast\"],\n\t[\"function\", \"setOwner\"],\n\t[\"function\", \"setOxygenRemaining\"],\n\t[\"function\", \"setParticleCircle\"],\n\t[\"function\", \"setParticleClass\"],\n\t[\"function\", \"setParticleFire\"],\n\t[\"function\", \"setParticleParams\"],\n\t[\"function\", \"setParticleRandom\"],\n\t[\"function\", \"setPilotCameraDirection\"],\n\t[\"function\", \"setPilotCameraRotation\"],\n\t[\"function\", \"setPilotCameraTarget\"],\n\t[\"function\", \"setPilotLight\"],\n\t[\"function\", \"setPiPEffect\"],\n\t[\"function\", \"setPitch\"],\n\t[\"function\", \"setPlateNumber\"],\n\t[\"function\", \"setPlayable\"],\n\t[\"function\", \"setPlayerRespawnTime\"],\n\t[\"function\", \"setPos\"],\n\t[\"function\", \"setPosASL\"],\n\t[\"function\", \"setPosASL2\"],\n\t[\"function\", \"setPosASLW\"],\n\t[\"function\", \"setPosATL\"],\n\t[\"function\", \"setPosition\"],\n\t[\"function\", \"setPosWorld\"],\n\t[\"function\", \"setPylonLoadOut\"],\n\t[\"function\", \"setPylonsPriority\"],\n\t[\"function\", \"setRadioMsg\"],\n\t[\"function\", \"setRain\"],\n\t[\"function\", \"setRainbow\"],\n\t[\"function\", \"setRandomLip\"],\n\t[\"function\", \"setRank\"],\n\t[\"function\", \"setRectangular\"],\n\t[\"function\", \"setRepairCargo\"],\n\t[\"function\", \"setRotorBrakeRTD\"],\n\t[\"function\", \"setShadowDistance\"],\n\t[\"function\", \"setShotParents\"],\n\t[\"function\", \"setSide\"],\n\t[\"function\", \"setSimpleTaskAlwaysVisible\"],\n\t[\"function\", \"setSimpleTaskCustomData\"],\n\t[\"function\", \"setSimpleTaskDescription\"],\n\t[\"function\", \"setSimpleTaskDestination\"],\n\t[\"function\", \"setSimpleTaskTarget\"],\n\t[\"function\", \"setSimpleTaskType\"],\n\t[\"function\", \"setSimulWeatherLayers\"],\n\t[\"function\", \"setSize\"],\n\t[\"function\", \"setSkill\"],\n\t[\"function\", \"setSlingLoad\"],\n\t[\"function\", \"setSoundEffect\"],\n\t[\"function\", \"setSpeaker\"],\n\t[\"function\", \"setSpeech\"],\n\t[\"function\", \"setSpeedMode\"],\n\t[\"function\", \"setStamina\"],\n\t[\"function\", \"setStaminaScheme\"],\n\t[\"function\", \"setStatValue\"],\n\t[\"function\", \"setSuppression\"],\n\t[\"function\", \"setSystemOfUnits\"],\n\t[\"function\", \"setTargetAge\"],\n\t[\"function\", \"setTaskMarkerOffset\"],\n\t[\"function\", \"setTaskResult\"],\n\t[\"function\", \"setTaskState\"],\n\t[\"function\", \"setTerrainGrid\"],\n\t[\"function\", \"setText\"],\n\t[\"function\", \"setTimeMultiplier\"],\n\t[\"function\", \"setTitleEffect\"],\n\t[\"function\", \"setToneMapping\"],\n\t[\"function\", \"setToneMappingParams\"],\n\t[\"function\", \"setTrafficDensity\"],\n\t[\"function\", \"setTrafficDistance\"],\n\t[\"function\", \"setTrafficGap\"],\n\t[\"function\", \"setTrafficSpeed\"],\n\t[\"function\", \"setTriggerActivation\"],\n\t[\"function\", \"setTriggerArea\"],\n\t[\"function\", \"setTriggerStatements\"],\n\t[\"function\", \"setTriggerText\"],\n\t[\"function\", \"setTriggerTimeout\"],\n\t[\"function\", \"setTriggerType\"],\n\t[\"function\", \"setType\"],\n\t[\"function\", \"setUnconscious\"],\n\t[\"function\", \"setUnitAbility\"],\n\t[\"function\", \"setUnitLoadout\"],\n\t[\"function\", \"setUnitPos\"],\n\t[\"function\", \"setUnitPosWeak\"],\n\t[\"function\", \"setUnitRank\"],\n\t[\"function\", \"setUnitRecoilCoefficient\"],\n\t[\"function\", \"setUnitTrait\"],\n\t[\"function\", \"setUnloadInCombat\"],\n\t[\"function\", \"setUserActionText\"],\n\t[\"function\", \"setUserMFDText\"],\n\t[\"function\", \"setUserMFDValue\"],\n\t[\"function\", \"setVariable\"],\n\t[\"function\", \"setVectorDir\"],\n\t[\"function\", \"setVectorDirAndUp\"],\n\t[\"function\", \"setVectorUp\"],\n\t[\"function\", \"setVehicleAmmo\"],\n\t[\"function\", \"setVehicleAmmoDef\"],\n\t[\"function\", \"setVehicleArmor\"],\n\t[\"function\", \"setVehicleCargo\"],\n\t[\"function\", \"setVehicleId\"],\n\t[\"function\", \"setVehicleInit\"],\n\t[\"function\", \"setVehicleLock\"],\n\t[\"function\", \"setVehiclePosition\"],\n\t[\"function\", \"setVehicleRadar\"],\n\t[\"function\", \"setVehicleReceiveRemoteTargets\"],\n\t[\"function\", \"setVehicleReportOwnPosition\"],\n\t[\"function\", \"setVehicleReportRemoteTargets\"],\n\t[\"function\", \"setVehicleTIPars\"],\n\t[\"function\", \"setVehicleVarName\"],\n\t[\"function\", \"setVelocity\"],\n\t[\"function\", \"setVelocityModelSpace\"],\n\t[\"function\", \"setVelocityTransformation\"],\n\t[\"function\", \"setViewDistance\"],\n\t[\"function\", \"setVisibleIfTreeCollapsed\"],\n\t[\"function\", \"setWantedRpmRTD\"],\n\t[\"function\", \"setWaves\"],\n\t[\"function\", \"setWaypointBehaviour\"],\n\t[\"function\", \"setWaypointCombatMode\"],\n\t[\"function\", \"setWaypointCompletionRadius\"],\n\t[\"function\", \"setWaypointDescription\"],\n\t[\"function\", \"setWaypointForceBehaviour\"],\n\t[\"function\", \"setWaypointFormation\"],\n\t[\"function\", \"setWaypointHousePosition\"],\n\t[\"function\", \"setWaypointLoiterRadius\"],\n\t[\"function\", \"setWaypointLoiterType\"],\n\t[\"function\", \"setWaypointName\"],\n\t[\"function\", \"setWaypointPosition\"],\n\t[\"function\", \"setWaypointScript\"],\n\t[\"function\", \"setWaypointSpeed\"],\n\t[\"function\", \"setWaypointStatements\"],\n\t[\"function\", \"setWaypointTimeout\"],\n\t[\"function\", \"setWaypointType\"],\n\t[\"function\", \"setWaypointVisible\"],\n\t[\"function\", \"setWeaponReloadingTime\"],\n\t[\"function\", \"setWind\"],\n\t[\"function\", \"setWindDir\"],\n\t[\"function\", \"setWindForce\"],\n\t[\"function\", \"setWindStr\"],\n\t[\"function\", \"setWingForceScaleRTD\"],\n\t[\"function\", \"setWPPos\"],\n\t[\"function\", \"show3DIcons\"],\n\t[\"function\", \"showChat\"],\n\t[\"function\", \"showCinemaBorder\"],\n\t[\"function\", \"showCommandingMenu\"],\n\t[\"function\", \"showCompass\"],\n\t[\"function\", \"showCuratorCompass\"],\n\t[\"function\", \"showGPS\"],\n\t[\"function\", \"showHUD\"],\n\t[\"function\", \"showLegend\"],\n\t[\"function\", \"showMap\"],\n\t[\"function\", \"shownArtilleryComputer\"],\n\t[\"function\", \"shownChat\"],\n\t[\"function\", \"shownCompass\"],\n\t[\"function\", \"shownCuratorCompass\"],\n\t[\"function\", \"showNewEditorObject\"],\n\t[\"function\", \"shownGPS\"],\n\t[\"function\", \"shownHUD\"],\n\t[\"function\", \"shownMap\"],\n\t[\"function\", \"shownPad\"],\n\t[\"function\", \"shownRadio\"],\n\t[\"function\", \"shownScoretable\"],\n\t[\"function\", \"shownUAVFeed\"],\n\t[\"function\", \"shownWarrant\"],\n\t[\"function\", \"shownWatch\"],\n\t[\"function\", \"showPad\"],\n\t[\"function\", \"showRadio\"],\n\t[\"function\", \"showScoretable\"],\n\t[\"function\", \"showSubtitles\"],\n\t[\"function\", \"showUAVFeed\"],\n\t[\"function\", \"showWarrant\"],\n\t[\"function\", \"showWatch\"],\n\t[\"function\", \"showWaypoint\"],\n\t[\"function\", \"showWaypoints\"],\n\t[\"function\", \"side\"],\n\t[\"function\", \"sideAmbientLife\"],\n\t[\"function\", \"sideChat\"],\n\t[\"function\", \"sideEmpty\"],\n\t[\"function\", \"sideEnemy\"],\n\t[\"function\", \"sideFriendly\"],\n\t[\"function\", \"sideLogic\"],\n\t[\"function\", \"sideRadio\"],\n\t[\"function\", \"sideUnknown\"],\n\t[\"function\", \"simpleTasks\"],\n\t[\"function\", \"simulationEnabled\"],\n\t[\"function\", \"simulCloudDensity\"],\n\t[\"function\", \"simulCloudOcclusion\"],\n\t[\"function\", \"simulInClouds\"],\n\t[\"function\", \"simulWeatherSync\"],\n\t[\"function\", \"sin\"],\n\t[\"function\", \"size\"],\n\t[\"function\", \"sizeOf\"],\n\t[\"function\", \"skill\"],\n\t[\"function\", \"skillFinal\"],\n\t[\"function\", \"skipTime\"],\n\t[\"function\", \"sleep\"],\n\t[\"function\", \"sliderPosition\"],\n\t[\"function\", \"sliderRange\"],\n\t[\"function\", \"sliderSetPosition\"],\n\t[\"function\", \"sliderSetRange\"],\n\t[\"function\", \"sliderSetSpeed\"],\n\t[\"function\", \"sliderSpeed\"],\n\t[\"function\", \"slingLoadAssistantShown\"],\n\t[\"function\", \"soldierMagazines\"],\n\t[\"function\", \"someAmmo\"],\n\t[\"function\", \"sort\"],\n\t[\"function\", \"soundVolume\"],\n\t[\"function\", \"speaker\"],\n\t[\"function\", \"speed\"],\n\t[\"function\", \"speedMode\"],\n\t[\"function\", \"splitString\"],\n\t[\"function\", \"sqrt\"],\n\t[\"function\", \"squadParams\"],\n\t[\"function\", \"stance\"],\n\t[\"function\", \"startLoadingScreen\"],\n\t[\"function\", \"stop\"],\n\t[\"function\", \"stopEngineRTD\"],\n\t[\"function\", \"stopped\"],\n\t[\"function\", \"str\"],\n\t[\"function\", \"sunOrMoon\"],\n\t[\"function\", \"supportInfo\"],\n\t[\"function\", \"suppressFor\"],\n\t[\"function\", \"surfaceIsWater\"],\n\t[\"function\", \"surfaceNormal\"],\n\t[\"function\", \"surfaceType\"],\n\t[\"function\", \"swimInDepth\"],\n\t[\"function\", \"switchableUnits\"],\n\t[\"function\", \"switchAction\"],\n\t[\"function\", \"switchCamera\"],\n\t[\"function\", \"switchGesture\"],\n\t[\"function\", \"switchLight\"],\n\t[\"function\", \"switchMove\"],\n\t[\"function\", \"synchronizedObjects\"],\n\t[\"function\", \"synchronizedTriggers\"],\n\t[\"function\", \"synchronizedWaypoints\"],\n\t[\"function\", \"synchronizeObjectsAdd\"],\n\t[\"function\", \"synchronizeObjectsRemove\"],\n\t[\"function\", \"synchronizeTrigger\"],\n\t[\"function\", \"synchronizeWaypoint\"],\n\t[\"function\", \"systemChat\"],\n\t[\"function\", \"systemOfUnits\"],\n\t[\"function\", \"tan\"],\n\t[\"function\", \"targetKnowledge\"],\n\t[\"function\", \"targets\"],\n\t[\"function\", \"targetsAggregate\"],\n\t[\"function\", \"targetsQuery\"],\n\t[\"function\", \"taskAlwaysVisible\"],\n\t[\"function\", \"taskChildren\"],\n\t[\"function\", \"taskCompleted\"],\n\t[\"function\", \"taskCustomData\"],\n\t[\"function\", \"taskDescription\"],\n\t[\"function\", \"taskDestination\"],\n\t[\"function\", \"taskHint\"],\n\t[\"function\", \"taskMarkerOffset\"],\n\t[\"function\", \"taskNull\"],\n\t[\"function\", \"taskParent\"],\n\t[\"function\", \"taskResult\"],\n\t[\"function\", \"taskState\"],\n\t[\"function\", \"taskType\"],\n\t[\"function\", \"teamMember\"],\n\t[\"function\", \"teamMemberNull\"],\n\t[\"function\", \"teamName\"],\n\t[\"function\", \"teams\"],\n\t[\"function\", \"teamSwitch\"],\n\t[\"function\", \"teamSwitchEnabled\"],\n\t[\"function\", \"teamType\"],\n\t[\"function\", \"terminate\"],\n\t[\"function\", \"terrainIntersect\"],\n\t[\"function\", \"terrainIntersectASL\"],\n\t[\"function\", \"terrainIntersectAtASL\"],\n\t[\"function\", \"text\"],\n\t[\"function\", \"textLog\"],\n\t[\"function\", \"textLogFormat\"],\n\t[\"function\", \"tg\"],\n\t[\"function\", \"time\"],\n\t[\"function\", \"timeMultiplier\"],\n\t[\"function\", \"titleCut\"],\n\t[\"function\", \"titleFadeOut\"],\n\t[\"function\", \"titleObj\"],\n\t[\"function\", \"titleRsc\"],\n\t[\"function\", \"titleText\"],\n\t[\"function\", \"toArray\"],\n\t[\"function\", \"toFixed\"],\n\t[\"function\", \"toLower\"],\n\t[\"function\", \"toString\"],\n\t[\"function\", \"toUpper\"],\n\t[\"function\", \"triggerActivated\"],\n\t[\"function\", \"triggerActivation\"],\n\t[\"function\", \"triggerArea\"],\n\t[\"function\", \"triggerAttachedVehicle\"],\n\t[\"function\", \"triggerAttachObject\"],\n\t[\"function\", \"triggerAttachVehicle\"],\n\t[\"function\", \"triggerDynamicSimulation\"],\n\t[\"function\", \"triggerStatements\"],\n\t[\"function\", \"triggerText\"],\n\t[\"function\", \"triggerTimeout\"],\n\t[\"function\", \"triggerTimeoutCurrent\"],\n\t[\"function\", \"triggerType\"],\n\t[\"function\", \"turretLocal\"],\n\t[\"function\", \"turretOwner\"],\n\t[\"function\", \"turretUnit\"],\n\t[\"function\", \"tvAdd\"],\n\t[\"function\", \"tvClear\"],\n\t[\"function\", \"tvCollapse\"],\n\t[\"function\", \"tvCollapseAll\"],\n\t[\"function\", \"tvCount\"],\n\t[\"function\", \"tvCurSel\"],\n\t[\"function\", \"tvData\"],\n\t[\"function\", \"tvDelete\"],\n\t[\"function\", \"tvExpand\"],\n\t[\"function\", \"tvExpandAll\"],\n\t[\"function\", \"tvPicture\"],\n\t[\"function\", \"tvPictureRight\"],\n\t[\"function\", \"tvSetColor\"],\n\t[\"function\", \"tvSetCurSel\"],\n\t[\"function\", \"tvSetData\"],\n\t[\"function\", \"tvSetPicture\"],\n\t[\"function\", \"tvSetPictureColor\"],\n\t[\"function\", \"tvSetPictureColorDisabled\"],\n\t[\"function\", \"tvSetPictureColorSelected\"],\n\t[\"function\", \"tvSetPictureRight\"],\n\t[\"function\", \"tvSetPictureRightColor\"],\n\t[\"function\", \"tvSetPictureRightColorDisabled\"],\n\t[\"function\", \"tvSetPictureRightColorSelected\"],\n\t[\"function\", \"tvSetSelectColor\"],\n\t[\"function\", \"tvSetText\"],\n\t[\"function\", \"tvSetTooltip\"],\n\t[\"function\", \"tvSetValue\"],\n\t[\"function\", \"tvSort\"],\n\t[\"function\", \"tvSortByValue\"],\n\t[\"function\", \"tvText\"],\n\t[\"function\", \"tvTooltip\"],\n\t[\"function\", \"tvValue\"],\n\t[\"function\", \"type\"],\n\t[\"function\", \"typeName\"],\n\t[\"function\", \"typeOf\"],\n\t[\"function\", \"UAVControl\"],\n\t[\"function\", \"uiNamespace\"],\n\t[\"function\", \"uiSleep\"],\n\t[\"function\", \"unassignCurator\"],\n\t[\"function\", \"unassignItem\"],\n\t[\"function\", \"unassignTeam\"],\n\t[\"function\", \"unassignVehicle\"],\n\t[\"function\", \"underwater\"],\n\t[\"function\", \"uniform\"],\n\t[\"function\", \"uniformContainer\"],\n\t[\"function\", \"uniformItems\"],\n\t[\"function\", \"uniformMagazines\"],\n\t[\"function\", \"unitAddons\"],\n\t[\"function\", \"unitAimPosition\"],\n\t[\"function\", \"unitAimPositionVisual\"],\n\t[\"function\", \"unitBackpack\"],\n\t[\"function\", \"unitIsUAV\"],\n\t[\"function\", \"unitPos\"],\n\t[\"function\", \"unitReady\"],\n\t[\"function\", \"unitRecoilCoefficient\"],\n\t[\"function\", \"units\"],\n\t[\"function\", \"unitsBelowHeight\"],\n\t[\"function\", \"unlinkItem\"],\n\t[\"function\", \"unlockAchievement\"],\n\t[\"function\", \"unregisterTask\"],\n\t[\"function\", \"updateDrawIcon\"],\n\t[\"function\", \"updateMenuItem\"],\n\t[\"function\", \"updateObjectTree\"],\n\t[\"function\", \"useAIOperMapObstructionTest\"],\n\t[\"function\", \"useAISteeringComponent\"],\n\t[\"function\", \"useAudioTimeForMoves\"],\n\t[\"function\", \"userInputDisabled\"],\n\t[\"function\", \"vectorAdd\"],\n\t[\"function\", \"vectorCos\"],\n\t[\"function\", \"vectorCrossProduct\"],\n\t[\"function\", \"vectorDiff\"],\n\t[\"function\", \"vectorDir\"],\n\t[\"function\", \"vectorDirVisual\"],\n\t[\"function\", \"vectorDistance\"],\n\t[\"function\", \"vectorDistanceSqr\"],\n\t[\"function\", \"vectorDotProduct\"],\n\t[\"function\", \"vectorFromTo\"],\n\t[\"function\", \"vectorMagnitude\"],\n\t[\"function\", \"vectorMagnitudeSqr\"],\n\t[\"function\", \"vectorModelToWorld\"],\n\t[\"function\", \"vectorModelToWorldVisual\"],\n\t[\"function\", \"vectorMultiply\"],\n\t[\"function\", \"vectorNormalized\"],\n\t[\"function\", \"vectorUp\"],\n\t[\"function\", \"vectorUpVisual\"],\n\t[\"function\", \"vectorWorldToModel\"],\n\t[\"function\", \"vectorWorldToModelVisual\"],\n\t[\"function\", \"vehicle\"],\n\t[\"function\", \"vehicleCargoEnabled\"],\n\t[\"function\", \"vehicleChat\"],\n\t[\"function\", \"vehicleRadio\"],\n\t[\"function\", \"vehicleReceiveRemoteTargets\"],\n\t[\"function\", \"vehicleReportOwnPosition\"],\n\t[\"function\", \"vehicleReportRemoteTargets\"],\n\t[\"function\", \"vehicles\"],\n\t[\"function\", \"vehicleVarName\"],\n\t[\"function\", \"velocity\"],\n\t[\"function\", \"velocityModelSpace\"],\n\t[\"function\", \"verifySignature\"],\n\t[\"function\", \"vest\"],\n\t[\"function\", \"vestContainer\"],\n\t[\"function\", \"vestItems\"],\n\t[\"function\", \"vestMagazines\"],\n\t[\"function\", \"viewDistance\"],\n\t[\"function\", \"visibleCompass\"],\n\t[\"function\", \"visibleGPS\"],\n\t[\"function\", \"visibleMap\"],\n\t[\"function\", \"visiblePosition\"],\n\t[\"function\", \"visiblePositionASL\"],\n\t[\"function\", \"visibleScoretable\"],\n\t[\"function\", \"visibleWatch\"],\n\t[\"function\", \"waitUntil\"],\n\t[\"function\", \"waves\"],\n\t[\"function\", \"waypointAttachedObject\"],\n\t[\"function\", \"waypointAttachedVehicle\"],\n\t[\"function\", \"waypointAttachObject\"],\n\t[\"function\", \"waypointAttachVehicle\"],\n\t[\"function\", \"waypointBehaviour\"],\n\t[\"function\", \"waypointCombatMode\"],\n\t[\"function\", \"waypointCompletionRadius\"],\n\t[\"function\", \"waypointDescription\"],\n\t[\"function\", \"waypointForceBehaviour\"],\n\t[\"function\", \"waypointFormation\"],\n\t[\"function\", \"waypointHousePosition\"],\n\t[\"function\", \"waypointLoiterRadius\"],\n\t[\"function\", \"waypointLoiterType\"],\n\t[\"function\", \"waypointName\"],\n\t[\"function\", \"waypointPosition\"],\n\t[\"function\", \"waypoints\"],\n\t[\"function\", \"waypointScript\"],\n\t[\"function\", \"waypointsEnabledUAV\"],\n\t[\"function\", \"waypointShow\"],\n\t[\"function\", \"waypointSpeed\"],\n\t[\"function\", \"waypointStatements\"],\n\t[\"function\", \"waypointTimeout\"],\n\t[\"function\", \"waypointTimeoutCurrent\"],\n\t[\"function\", \"waypointType\"],\n\t[\"function\", \"waypointVisible\"],\n\t[\"function\", \"weaponAccessories\"],\n\t[\"function\", \"weaponAccessoriesCargo\"],\n\t[\"function\", \"weaponCargo\"],\n\t[\"function\", \"weaponDirection\"],\n\t[\"function\", \"weaponInertia\"],\n\t[\"function\", \"weaponLowered\"],\n\t[\"function\", \"weapons\"],\n\t[\"function\", \"weaponsItems\"],\n\t[\"function\", \"weaponsItemsCargo\"],\n\t[\"function\", \"weaponState\"],\n\t[\"function\", \"weaponsTurret\"],\n\t[\"function\", \"weightRTD\"],\n\t[\"function\", \"west\"],\n\t[\"function\", \"WFSideText\"],\n\t[\"function\", \"wind\"],\n\t[\"function\", \"windDir\"],\n\t[\"function\", \"windRTD\"],\n\t[\"function\", \"windStr\"],\n\t[\"function\", \"wingsForcesRTD\"],\n\t[\"function\", \"worldName\"],\n\t[\"function\", \"worldSize\"],\n\t[\"function\", \"worldToModel\"],\n\t[\"function\", \"worldToModelVisual\"],\n\t[\"function\", \"worldToScreen\"]\n]\n"
  },
  {
    "path": "tests/languages/sqf/keyword_feature.test",
    "content": "breakOut\r\nbreakTo\r\ncall\r\ncase\r\ncatch\r\ndefault\r\ndo\r\necho\r\nelse\r\nexecVM\r\nexecFSM\r\nexitWith\r\nfor\r\nforEach\r\nforEachMember\r\nforEachMemberAgent\r\nforEachMemberTeam\r\nfrom\r\ngoto\r\nif\r\nnil\r\npreprocessFile\r\npreprocessFileLineNumbers\r\nprivate\r\nscopeName\r\nspawn\r\nstep\r\nswitch\r\nthen\r\nthrow\r\nto\r\ntry\r\nwhile\r\nwith\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"breakOut\"],\r\n\t[\"keyword\", \"breakTo\"],\r\n\t[\"keyword\", \"call\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"echo\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"execVM\"],\r\n\t[\"keyword\", \"execFSM\"],\r\n\t[\"keyword\", \"exitWith\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"forEach\"],\r\n\t[\"keyword\", \"forEachMember\"],\r\n\t[\"keyword\", \"forEachMemberAgent\"],\r\n\t[\"keyword\", \"forEachMemberTeam\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"nil\"],\r\n\t[\"keyword\", \"preprocessFile\"],\r\n\t[\"keyword\", \"preprocessFileLineNumbers\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"scopeName\"],\r\n\t[\"keyword\", \"spawn\"],\r\n\t[\"keyword\", \"step\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"to\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/sqf/macro_feature.test",
    "content": "#define FOO 3\r\n#define HINTARG(ARG) hint (\"Passed argument: \" + str ARG)\r\n#define DRAWBUTTON(NAME)\\\r\n\t__EXEC(idcNav = idcNav + 4)\r\n\r\n#undef NAME\r\n\r\n#ifdef NAME\r\n#ifndef NAME\r\n#else\r\n#endif\r\n\r\n#include \"file.hpp\"\r\n#include <file.txt> // Brackets are equivalent to quotation marks and may be used in their place.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"macro\", [\r\n\t\t[\"directive\", \"#define\"],\r\n\t\t\" FOO 3\"\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive\", \"#define\"],\r\n\t\t\" HINTARG(ARG) hint (\\\"Passed argument: \\\" + str ARG)\"\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive\", \"#define\"],\r\n\t\t\" DRAWBUTTON(NAME)\\\\\\r\\n\\t__EXEC(idcNav = idcNav + 4)\"\r\n\t]],\r\n\r\n\t[\"macro\", [\r\n\t\t[\"directive\", \"#undef\"],\r\n\t\t\" NAME\"\r\n\t]],\r\n\r\n\t[\"macro\", [\r\n\t\t[\"directive\", \"#ifdef\"],\r\n\t\t\" NAME\"\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive\", \"#ifndef\"],\r\n\t\t\" NAME\"\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive\", \"#else\"]\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive\", \"#endif\"]\r\n\t]],\r\n\r\n\t[\"macro\", [\r\n\t\t[\"directive\", \"#include\"],\r\n\t\t\" \\\"file.hpp\\\"\"\r\n\t]],\r\n\t[\"macro\", [\r\n\t\t[\"directive\", \"#include\"],\r\n\t\t\" <file.txt> \",\r\n\t\t[\"comment\", \"// Brackets are equivalent to quotation marks and may be used in their place.\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for macros.\r\n"
  },
  {
    "path": "tests/languages/sqf/magic-variable_feature.test",
    "content": "_exception\r\n_fnc_scriptName\r\n_fnc_scriptNameParent\r\n_forEachIndex\r\n_this\r\n_thisEventHandler\r\n_thisFSM\r\n_thisScript\r\n_x\r\nthis\r\nthisList\r\nthisTrigger\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"magic-variable\", \"_exception\"],\r\n\t[\"magic-variable\", \"_fnc_scriptName\"],\r\n\t[\"magic-variable\", \"_fnc_scriptNameParent\"],\r\n\t[\"magic-variable\", \"_forEachIndex\"],\r\n\t[\"magic-variable\", \"_this\"],\r\n\t[\"magic-variable\", \"_thisEventHandler\"],\r\n\t[\"magic-variable\", \"_thisFSM\"],\r\n\t[\"magic-variable\", \"_thisScript\"],\r\n\t[\"magic-variable\", \"_x\"],\r\n\t[\"magic-variable\", \"this\"],\r\n\t[\"magic-variable\", \"thisList\"],\r\n\t[\"magic-variable\", \"thisTrigger\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for magic variables.\r\n"
  },
  {
    "path": "tests/languages/sqf/number_feature.test",
    "content": "5.197\r\n0.47\r\n16.0\r\n.8314\r\n12345\r\n\r\n1.23E4\r\n5e-2\r\n\r\n0xa5\r\n$5C\r\n$FFFFFF\r\n0x123ABC\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"5.197\"],\r\n\t[\"number\", \"0.47\"],\r\n\t[\"number\", \"16.0\"],\r\n\t[\"number\", \".8314\"],\r\n\t[\"number\", \"12345\"],\r\n\r\n\t[\"number\", \"1.23E4\"],\r\n\t[\"number\", \"5e-2\"],\r\n\r\n\t[\"number\", \"0xa5\"],\r\n\t[\"number\", \"$5C\"],\r\n\t[\"number\", \"$FFFFFF\"],\r\n\t[\"number\", \"0x123ABC\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/sqf/operator_feature.test",
    "content": "+ - * / % ^ #\r\n\r\n!= == >= <= > <\r\n\r\n! && ||\r\n=\r\n\r\n>> ##\r\n\r\nmod\r\nand or not\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"#\"],\r\n\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"<\"],\r\n\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"=\"],\r\n\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \"##\"],\r\n\r\n\t[\"operator\", \"mod\"],\r\n\t[\"operator\", \"and\"],\r\n\t[\"operator\", \"or\"],\r\n\t[\"operator\", \"not\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/sqf/string_feature.test",
    "content": "\"foo\"\r\n\"foo\"\"bar\"\r\n\"foo\r\nbar\"\r\n\r\n'foo'\r\n'foo\r\nbar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\\\"bar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"],\r\n\r\n\t[\"string\", \"'foo'\"],\r\n\t[\"string\", \"'foo\\r\\nbar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/sql/boolean_feature.test",
    "content": "TRUE\r\nFALSE\r\nNULL\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"TRUE\"],\r\n\t[\"boolean\", \"FALSE\"],\r\n\t[\"boolean\", \"NULL\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/sql/comment_feature.test",
    "content": "/**/\r\n/* foo\r\nbar */\r\n--\r\n-- foo\r\n//\r\n// foo\r\n#\r\n# foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"--\"],\r\n\t[\"comment\", \"-- foo\"],\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foo\"],\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foo\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/sql/function_feature.test",
    "content": "AVG (\r\nCOUNT(\r\nFIRST(\r\nFORMAT(\r\nLAST(\r\nLCASE(\r\nLEN(\r\nMAX(\r\nMID(\r\nMIN(\r\nMOD(\r\nNOW(\r\nROUND(\r\nSUM(\r\nUCASE(\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"AVG\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"COUNT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"FIRST\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"FORMAT\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"LAST\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"LCASE\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"LEN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MAX\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MID\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MIN\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"MOD\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"NOW\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"ROUND\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"SUM\"], [\"punctuation\", \"(\"],\r\n\t[\"function\", \"UCASE\"], [\"punctuation\", \"(\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/sql/identifier_feature.test",
    "content": "`5Customers`\n`tableName~`\n` SELECT `\nfoo.`GROUP`\n`a``b`\n\n----------------------------------------------------\n\n[\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"5Customers\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"tableName~\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\" SELECT \",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\n\t\"\\r\\nfoo\",\n\t[\"punctuation\", \".\"],\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"GROUP\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"a``b\",\n\t\t[\"punctuation\", \"`\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/sql/issue3140.test",
    "content": "select\n   `t`.`col1`, `t`.`col2`, `t`.`col3`, `t`.`col4`\nfrom\n   `test_table` as `t`\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"select\"],\n\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"t\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t[\"punctuation\", \".\"],\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"col1\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"t\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t[\"punctuation\", \".\"],\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"col2\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"t\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t[\"punctuation\", \".\"],\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"col3\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t[\"punctuation\", \",\"],\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"t\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t[\"punctuation\", \".\"],\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"col4\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\n\t[\"keyword\", \"from\"],\n\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"test_table\",\n\t\t[\"punctuation\", \"`\"]\n\t]],\n\t[\"keyword\", \"as\"],\n\t[\"identifier\", [\n\t\t[\"punctuation\", \"`\"],\n\t\t\"t\",\n\t\t[\"punctuation\", \"`\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/sql/keyword_feature.test",
    "content": "ACTION\r\nADD\r\nAFTER\r\nALGORITHM\r\nALL\r\nALTER\r\nANALYZE\r\nANY\r\nAPPLY\r\nAS\r\nASC\r\nAUTHORIZATION\r\nAUTO_INCREMENT\r\nBACKUP\r\nBDB\r\nBEGIN\r\nBERKELEYDB\r\nBIGINT\r\nBINARY\r\nBIT\r\nBLOB\r\nBOOL\r\nBOOLEAN\r\nBREAK\r\nBROWSE\r\nBTREE\r\nBULK\r\nBY\r\nCALL\r\nCASCADE\r\nCASCADED\r\nCASE\r\nCHAIN\r\nCHAR\r\nCHARACTER\r\nCHARSET\r\nCHECK\r\nCHECKPOINT\r\nCLOSE\r\nCLUSTERED\r\nCOALESCE\r\nCOLLATE\r\nCOLUMN\r\nCOLUMNS\r\nCOMMENT\r\nCOMMIT\r\nCOMMITTED\r\nCOMPUTE\r\nCONNECT\r\nCONSISTENT\r\nCONSTRAINT\r\nCONTAINS\r\nCONTAINSTABLE\r\nCONTINUE\r\nCONVERT\r\nCREATE\r\nCROSS\r\nCURRENT\r\nCURRENT_DATE\r\nCURRENT_TIME\r\nCURRENT_TIMESTAMP\r\nCURRENT_USER\r\nCURSOR\r\nCYCLE\r\nDATA\r\nDATABASE\r\nDATABASES\r\nDATE\r\nDATETIME\r\nDAY\r\nDBCC\r\nDEALLOCATE\r\nDEC\r\nDECIMAL\r\nDECLARE\r\nDEFAULT\r\nDEFINER\r\nDELAYED\r\nDELETE\r\nDELIMITER\r\nDELIMITERS\r\nDENY\r\nDESC\r\nDESCRIBE\r\nDETERMINISTIC\r\nDISABLE\r\nDISCARD\r\nDISK\r\nDISTINCT\r\nDISTINCTROW\r\nDISTRIBUTED\r\nDO\r\nDOUBLE\r\nDROP\r\nDUMMY\r\nDUMP\r\nDUMPFILE\r\nDUPLICATE\r\nELSE\r\nELSEIF\r\nENABLE\r\nENCLOSED\r\nEND\r\nENGINE\r\nENUM\r\nERRLVL\r\nERRORS\r\nESCAPE\r\nESCAPED\r\nEXCEPT\r\nEXEC\r\nEXECUTE\r\nEXISTS\r\nEXIT\r\nEXPLAIN\r\nEXTENDED\r\nFETCH\r\nFIELDS\r\nFILE\r\nFILLFACTOR\r\nFIRST\r\nFIXED\r\nFLOAT\r\nFOLLOWING\r\nFOR\r\nFOR EACH ROW\r\nFORCE\r\nFOREIGN\r\nFREETEXT\r\nFREETEXTTABLE\r\nFROM\r\nFULL\r\nFUNCTION\r\nGEOMETRY\r\nGEOMETRYCOLLECTION\r\nGLOBAL\r\nGOTO\r\nGRANT\r\nGROUP\r\nHANDLER\r\nHASH\r\nHAVING\r\nHOLDLOCK\r\nHOUR\r\nIDENTITY\r\nIDENTITY_INSERT\r\nIDENTITYCOL\r\nIF\r\nIGNORE\r\nIMPORT\r\nINDEX\r\nINFILE\r\nINNER\r\nINNODB\r\nINOUT\r\nINSERT\r\nINT\r\nINTEGER\r\nINTERSECT\r\nINTERVAL\r\nINTO\r\nINVOKER\r\nISOLATION\r\nITERATE\r\nJOIN\r\nKEY\r\nKEYS\r\nKILL\r\nLANGUAGE\r\nLAST\r\nLEAVE\r\nLEFT\r\nLEVEL\r\nLIMIT\r\nLINENO\r\nLINES\r\nLINESTRING\r\nLOAD\r\nLOCAL\r\nLOCK\r\nLONGBLOB\r\nLONGTEXT\r\nLOOP\r\nMATCH\r\nMATCHED\r\nMEDIUMBLOB\r\nMEDIUMINT\r\nMEDIUMTEXT\r\nMERGE\r\nMIDDLEINT\r\nMINUTE\r\nMODE\r\nMODIFIES\r\nMODIFY\r\nMONTH\r\nMULTILINESTRING\r\nMULTIPOINT\r\nMULTIPOLYGON\r\nNATIONAL\r\nNATURAL\r\nNCHAR\r\nNEXT\r\nNO\r\nNONCLUSTERED\r\nNULLIF\r\nNUMERIC\r\nOF\r\nOFF\r\nOFFSET\r\nOFFSETS\r\nON\r\nOPEN\r\nOPENDATASOURCE\r\nOPENQUERY\r\nOPENROWSET\r\nOPTIMIZE\r\nOPTION\r\nOPTIONALLY\r\nORDER\r\nOUT\r\nOUTER\r\nOUTFILE\r\nOVER\r\nPARTIAL\r\nPARTITION\r\nPERCENT\r\nPIVOT\r\nPLAN\r\nPOINT\r\nPOLYGON\r\nPRECEDING\r\nPRECISION\r\nPREPARE\r\nPREV\r\nPRIMARY\r\nPRINT\r\nPRIVILEGES\r\nPROC\r\nPROCEDURE\r\nPUBLIC\r\nPURGE\r\nQUICK\r\nRAISERROR\r\nREAD\r\nREADS\r\nREAL\r\nRECONFIGURE\r\nREFERENCES\r\nRELEASE\r\nRENAME\r\nREPEAT\r\nREPEATABLE\r\nREPLACE\r\nREPLICATION\r\nREQUIRE\r\nRESIGNAL\r\nRESTORE\r\nRESTRICT\r\nRETURN\r\nRETURNS\r\nRETURNING\r\nREVOKE\r\nRIGHT\r\nROLLBACK\r\nROUTINE\r\nROW\r\nROWCOUNT\r\nROWGUIDCOL\r\nROWS\r\nRTREE\r\nRULE\r\nSAVE\r\nSAVEPOINT\r\nSCHEMA\r\nSECOND\r\nSELECT\r\nSERIAL\r\nSERIALIZABLE\r\nSESSION\r\nSESSION_USER\r\nSET\r\nSETUSER\r\nSHARE\r\nSHOW\r\nSHUTDOWN\r\nSIMPLE\r\nSMALLINT\r\nSNAPSHOT\r\nSOME\r\nSONAME\r\nSQL\r\nSTART\r\nSTARTING\r\nSTATISTICS\r\nSTATUS\r\nSTRIPED\r\nSYSTEM_USER\r\nTABLE\r\nTABLES\r\nTABLESPACE\r\nTEMP\r\nTEMPORARY\r\nTEMPTABLE\r\nTERMINATED\r\nTEXT\r\nTEXTSIZE\r\nTHEN\r\nTIME\r\nTIMESTAMP\r\nTINYBLOB\r\nTINYINT\r\nTINYTEXT\r\nTO\r\nTOP\r\nTRAN\r\nTRANSACTION\r\nTRANSACTIONS\r\nTRIGGER\r\nTRUNCATE\r\nTSEQUAL\r\nTYPE\r\nTYPES\r\nUNBOUNDED\r\nUNCOMMITTED\r\nUNDEFINED\r\nUNION\r\nUNIQUE\r\nUNLOCK\r\nUNPIVOT\r\nUNSIGNED\r\nUPDATE\r\nUPDATETEXT\r\nUSAGE\r\nUSE\r\nUSER\r\nUSING\r\nVALUE\r\nVALUES\r\nVARBINARY\r\nVARCHAR\r\nVARCHARACTER\r\nVARYING\r\nVIEW\r\nWAITFOR\r\nWARNINGS\r\nWHEN\r\nWHERE\r\nWHILE\r\nWITH\r\nWITH ROLLUP\r\nWITHIN\r\nWORK\r\nWRITE\r\nWRITETEXT\r\nYEAR\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"ACTION\"],\r\n\t[\"keyword\", \"ADD\"],\r\n\t[\"keyword\", \"AFTER\"],\r\n\t[\"keyword\", \"ALGORITHM\"],\r\n\t[\"keyword\", \"ALL\"],\r\n\t[\"keyword\", \"ALTER\"],\r\n\t[\"keyword\", \"ANALYZE\"],\r\n\t[\"keyword\", \"ANY\"],\r\n\t[\"keyword\", \"APPLY\"],\r\n\t[\"keyword\", \"AS\"],\r\n\t[\"keyword\", \"ASC\"],\r\n\t[\"keyword\", \"AUTHORIZATION\"],\r\n\t[\"keyword\", \"AUTO_INCREMENT\"],\r\n\t[\"keyword\", \"BACKUP\"],\r\n\t[\"keyword\", \"BDB\"],\r\n\t[\"keyword\", \"BEGIN\"],\r\n\t[\"keyword\", \"BERKELEYDB\"],\r\n\t[\"keyword\", \"BIGINT\"],\r\n\t[\"keyword\", \"BINARY\"],\r\n\t[\"keyword\", \"BIT\"],\r\n\t[\"keyword\", \"BLOB\"],\r\n\t[\"keyword\", \"BOOL\"],\r\n\t[\"keyword\", \"BOOLEAN\"],\r\n\t[\"keyword\", \"BREAK\"],\r\n\t[\"keyword\", \"BROWSE\"],\r\n\t[\"keyword\", \"BTREE\"],\r\n\t[\"keyword\", \"BULK\"],\r\n\t[\"keyword\", \"BY\"],\r\n\t[\"keyword\", \"CALL\"],\r\n\t[\"keyword\", \"CASCADE\"],\r\n\t[\"keyword\", \"CASCADED\"],\r\n\t[\"keyword\", \"CASE\"],\r\n\t[\"keyword\", \"CHAIN\"],\r\n\t[\"keyword\", \"CHAR\"],\r\n\t[\"keyword\", \"CHARACTER\"],\r\n\t[\"keyword\", \"CHARSET\"],\r\n\t[\"keyword\", \"CHECK\"],\r\n\t[\"keyword\", \"CHECKPOINT\"],\r\n\t[\"keyword\", \"CLOSE\"],\r\n\t[\"keyword\", \"CLUSTERED\"],\r\n\t[\"keyword\", \"COALESCE\"],\r\n\t[\"keyword\", \"COLLATE\"],\r\n\t[\"keyword\", \"COLUMN\"],\r\n\t[\"keyword\", \"COLUMNS\"],\r\n\t[\"keyword\", \"COMMENT\"],\r\n\t[\"keyword\", \"COMMIT\"],\r\n\t[\"keyword\", \"COMMITTED\"],\r\n\t[\"keyword\", \"COMPUTE\"],\r\n\t[\"keyword\", \"CONNECT\"],\r\n\t[\"keyword\", \"CONSISTENT\"],\r\n\t[\"keyword\", \"CONSTRAINT\"],\r\n\t[\"keyword\", \"CONTAINS\"],\r\n\t[\"keyword\", \"CONTAINSTABLE\"],\r\n\t[\"keyword\", \"CONTINUE\"],\r\n\t[\"keyword\", \"CONVERT\"],\r\n\t[\"keyword\", \"CREATE\"],\r\n\t[\"keyword\", \"CROSS\"],\r\n\t[\"keyword\", \"CURRENT\"],\r\n\t[\"keyword\", \"CURRENT_DATE\"],\r\n\t[\"keyword\", \"CURRENT_TIME\"],\r\n\t[\"keyword\", \"CURRENT_TIMESTAMP\"],\r\n\t[\"keyword\", \"CURRENT_USER\"],\r\n\t[\"keyword\", \"CURSOR\"],\r\n\t[\"keyword\", \"CYCLE\"],\r\n\t[\"keyword\", \"DATA\"],\r\n\t[\"keyword\", \"DATABASE\"],\r\n\t[\"keyword\", \"DATABASES\"],\r\n\t[\"keyword\", \"DATE\"],\r\n\t[\"keyword\", \"DATETIME\"],\r\n\t[\"keyword\", \"DAY\"],\r\n\t[\"keyword\", \"DBCC\"],\r\n\t[\"keyword\", \"DEALLOCATE\"],\r\n\t[\"keyword\", \"DEC\"],\r\n\t[\"keyword\", \"DECIMAL\"],\r\n\t[\"keyword\", \"DECLARE\"],\r\n\t[\"keyword\", \"DEFAULT\"],\r\n\t[\"keyword\", \"DEFINER\"],\r\n\t[\"keyword\", \"DELAYED\"],\r\n\t[\"keyword\", \"DELETE\"],\r\n\t[\"keyword\", \"DELIMITER\"],\r\n\t[\"keyword\", \"DELIMITERS\"],\r\n\t[\"keyword\", \"DENY\"],\r\n\t[\"keyword\", \"DESC\"],\r\n\t[\"keyword\", \"DESCRIBE\"],\r\n\t[\"keyword\", \"DETERMINISTIC\"],\r\n\t[\"keyword\", \"DISABLE\"],\r\n\t[\"keyword\", \"DISCARD\"],\r\n\t[\"keyword\", \"DISK\"],\r\n\t[\"keyword\", \"DISTINCT\"],\r\n\t[\"keyword\", \"DISTINCTROW\"],\r\n\t[\"keyword\", \"DISTRIBUTED\"],\r\n\t[\"keyword\", \"DO\"],\r\n\t[\"keyword\", \"DOUBLE\"],\r\n\t[\"keyword\", \"DROP\"],\r\n\t[\"keyword\", \"DUMMY\"],\r\n\t[\"keyword\", \"DUMP\"],\r\n\t[\"keyword\", \"DUMPFILE\"],\r\n\t[\"keyword\", \"DUPLICATE\"],\r\n\t[\"keyword\", \"ELSE\"],\r\n\t[\"keyword\", \"ELSEIF\"],\r\n\t[\"keyword\", \"ENABLE\"],\r\n\t[\"keyword\", \"ENCLOSED\"],\r\n\t[\"keyword\", \"END\"],\r\n\t[\"keyword\", \"ENGINE\"],\r\n\t[\"keyword\", \"ENUM\"],\r\n\t[\"keyword\", \"ERRLVL\"],\r\n\t[\"keyword\", \"ERRORS\"],\r\n\t[\"keyword\", \"ESCAPE\"],\r\n\t[\"keyword\", \"ESCAPED\"],\r\n\t[\"keyword\", \"EXCEPT\"],\r\n\t[\"keyword\", \"EXEC\"],\r\n\t[\"keyword\", \"EXECUTE\"],\r\n\t[\"keyword\", \"EXISTS\"],\r\n\t[\"keyword\", \"EXIT\"],\r\n\t[\"keyword\", \"EXPLAIN\"],\r\n\t[\"keyword\", \"EXTENDED\"],\r\n\t[\"keyword\", \"FETCH\"],\r\n\t[\"keyword\", \"FIELDS\"],\r\n\t[\"keyword\", \"FILE\"],\r\n\t[\"keyword\", \"FILLFACTOR\"],\r\n\t[\"keyword\", \"FIRST\"],\r\n\t[\"keyword\", \"FIXED\"],\r\n\t[\"keyword\", \"FLOAT\"],\r\n\t[\"keyword\", \"FOLLOWING\"],\r\n\t[\"keyword\", \"FOR\"],\r\n\t[\"keyword\", \"FOR EACH ROW\"],\r\n\t[\"keyword\", \"FORCE\"],\r\n\t[\"keyword\", \"FOREIGN\"],\r\n\t[\"keyword\", \"FREETEXT\"],\r\n\t[\"keyword\", \"FREETEXTTABLE\"],\r\n\t[\"keyword\", \"FROM\"],\r\n\t[\"keyword\", \"FULL\"],\r\n\t[\"keyword\", \"FUNCTION\"],\r\n\t[\"keyword\", \"GEOMETRY\"],\r\n\t[\"keyword\", \"GEOMETRYCOLLECTION\"],\r\n\t[\"keyword\", \"GLOBAL\"],\r\n\t[\"keyword\", \"GOTO\"],\r\n\t[\"keyword\", \"GRANT\"],\r\n\t[\"keyword\", \"GROUP\"],\r\n\t[\"keyword\", \"HANDLER\"],\r\n\t[\"keyword\", \"HASH\"],\r\n\t[\"keyword\", \"HAVING\"],\r\n\t[\"keyword\", \"HOLDLOCK\"],\r\n\t[\"keyword\", \"HOUR\"],\r\n\t[\"keyword\", \"IDENTITY\"],\r\n\t[\"keyword\", \"IDENTITY_INSERT\"],\r\n\t[\"keyword\", \"IDENTITYCOL\"],\r\n\t[\"keyword\", \"IF\"],\r\n\t[\"keyword\", \"IGNORE\"],\r\n\t[\"keyword\", \"IMPORT\"],\r\n\t[\"keyword\", \"INDEX\"],\r\n\t[\"keyword\", \"INFILE\"],\r\n\t[\"keyword\", \"INNER\"],\r\n\t[\"keyword\", \"INNODB\"],\r\n\t[\"keyword\", \"INOUT\"],\r\n\t[\"keyword\", \"INSERT\"],\r\n\t[\"keyword\", \"INT\"],\r\n\t[\"keyword\", \"INTEGER\"],\r\n\t[\"keyword\", \"INTERSECT\"],\r\n\t[\"keyword\", \"INTERVAL\"],\r\n\t[\"keyword\", \"INTO\"],\r\n\t[\"keyword\", \"INVOKER\"],\r\n\t[\"keyword\", \"ISOLATION\"],\r\n\t[\"keyword\", \"ITERATE\"],\r\n\t[\"keyword\", \"JOIN\"],\r\n\t[\"keyword\", \"KEY\"],\r\n\t[\"keyword\", \"KEYS\"],\r\n\t[\"keyword\", \"KILL\"],\r\n\t[\"keyword\", \"LANGUAGE\"],\r\n\t[\"keyword\", \"LAST\"],\r\n\t[\"keyword\", \"LEAVE\"],\r\n\t[\"keyword\", \"LEFT\"],\r\n\t[\"keyword\", \"LEVEL\"],\r\n\t[\"keyword\", \"LIMIT\"],\r\n\t[\"keyword\", \"LINENO\"],\r\n\t[\"keyword\", \"LINES\"],\r\n\t[\"keyword\", \"LINESTRING\"],\r\n\t[\"keyword\", \"LOAD\"],\r\n\t[\"keyword\", \"LOCAL\"],\r\n\t[\"keyword\", \"LOCK\"],\r\n\t[\"keyword\", \"LONGBLOB\"],\r\n\t[\"keyword\", \"LONGTEXT\"],\r\n\t[\"keyword\", \"LOOP\"],\r\n\t[\"keyword\", \"MATCH\"],\r\n\t[\"keyword\", \"MATCHED\"],\r\n\t[\"keyword\", \"MEDIUMBLOB\"],\r\n\t[\"keyword\", \"MEDIUMINT\"],\r\n\t[\"keyword\", \"MEDIUMTEXT\"],\r\n\t[\"keyword\", \"MERGE\"],\r\n\t[\"keyword\", \"MIDDLEINT\"],\r\n\t[\"keyword\", \"MINUTE\"],\r\n\t[\"keyword\", \"MODE\"],\r\n\t[\"keyword\", \"MODIFIES\"],\r\n\t[\"keyword\", \"MODIFY\"],\r\n\t[\"keyword\", \"MONTH\"],\r\n\t[\"keyword\", \"MULTILINESTRING\"],\r\n\t[\"keyword\", \"MULTIPOINT\"],\r\n\t[\"keyword\", \"MULTIPOLYGON\"],\r\n\t[\"keyword\", \"NATIONAL\"],\r\n\t[\"keyword\", \"NATURAL\"],\r\n\t[\"keyword\", \"NCHAR\"],\r\n\t[\"keyword\", \"NEXT\"],\r\n\t[\"keyword\", \"NO\"],\r\n\t[\"keyword\", \"NONCLUSTERED\"],\r\n\t[\"keyword\", \"NULLIF\"],\r\n\t[\"keyword\", \"NUMERIC\"],\r\n\t[\"keyword\", \"OF\"],\r\n\t[\"keyword\", \"OFF\"],\r\n\t[\"keyword\", \"OFFSET\"],\r\n\t[\"keyword\", \"OFFSETS\"],\r\n\t[\"keyword\", \"ON\"],\r\n\t[\"keyword\", \"OPEN\"],\r\n\t[\"keyword\", \"OPENDATASOURCE\"],\r\n\t[\"keyword\", \"OPENQUERY\"],\r\n\t[\"keyword\", \"OPENROWSET\"],\r\n\t[\"keyword\", \"OPTIMIZE\"],\r\n\t[\"keyword\", \"OPTION\"],\r\n\t[\"keyword\", \"OPTIONALLY\"],\r\n\t[\"keyword\", \"ORDER\"],\r\n\t[\"keyword\", \"OUT\"],\r\n\t[\"keyword\", \"OUTER\"],\r\n\t[\"keyword\", \"OUTFILE\"],\r\n\t[\"keyword\", \"OVER\"],\r\n\t[\"keyword\", \"PARTIAL\"],\r\n\t[\"keyword\", \"PARTITION\"],\r\n\t[\"keyword\", \"PERCENT\"],\r\n\t[\"keyword\", \"PIVOT\"],\r\n\t[\"keyword\", \"PLAN\"],\r\n\t[\"keyword\", \"POINT\"],\r\n\t[\"keyword\", \"POLYGON\"],\r\n\t[\"keyword\", \"PRECEDING\"],\r\n\t[\"keyword\", \"PRECISION\"],\r\n\t[\"keyword\", \"PREPARE\"],\r\n\t[\"keyword\", \"PREV\"],\r\n\t[\"keyword\", \"PRIMARY\"],\r\n\t[\"keyword\", \"PRINT\"],\r\n\t[\"keyword\", \"PRIVILEGES\"],\r\n\t[\"keyword\", \"PROC\"],\r\n\t[\"keyword\", \"PROCEDURE\"],\r\n\t[\"keyword\", \"PUBLIC\"],\r\n\t[\"keyword\", \"PURGE\"],\r\n\t[\"keyword\", \"QUICK\"],\r\n\t[\"keyword\", \"RAISERROR\"],\r\n\t[\"keyword\", \"READ\"],\r\n\t[\"keyword\", \"READS\"],\r\n\t[\"keyword\", \"REAL\"],\r\n\t[\"keyword\", \"RECONFIGURE\"],\r\n\t[\"keyword\", \"REFERENCES\"],\r\n\t[\"keyword\", \"RELEASE\"],\r\n\t[\"keyword\", \"RENAME\"],\r\n\t[\"keyword\", \"REPEAT\"],\r\n\t[\"keyword\", \"REPEATABLE\"],\r\n\t[\"keyword\", \"REPLACE\"],\r\n\t[\"keyword\", \"REPLICATION\"],\r\n\t[\"keyword\", \"REQUIRE\"],\r\n\t[\"keyword\", \"RESIGNAL\"],\r\n\t[\"keyword\", \"RESTORE\"],\r\n\t[\"keyword\", \"RESTRICT\"],\r\n\t[\"keyword\", \"RETURN\"],\r\n\t[\"keyword\", \"RETURNS\"],\r\n\t[\"keyword\", \"RETURNING\"],\r\n\t[\"keyword\", \"REVOKE\"],\r\n\t[\"keyword\", \"RIGHT\"],\r\n\t[\"keyword\", \"ROLLBACK\"],\r\n\t[\"keyword\", \"ROUTINE\"],\r\n\t[\"keyword\", \"ROW\"],\r\n\t[\"keyword\", \"ROWCOUNT\"],\r\n\t[\"keyword\", \"ROWGUIDCOL\"],\r\n\t[\"keyword\", \"ROWS\"],\r\n\t[\"keyword\", \"RTREE\"],\r\n\t[\"keyword\", \"RULE\"],\r\n\t[\"keyword\", \"SAVE\"],\r\n\t[\"keyword\", \"SAVEPOINT\"],\r\n\t[\"keyword\", \"SCHEMA\"],\r\n\t[\"keyword\", \"SECOND\"],\r\n\t[\"keyword\", \"SELECT\"],\r\n\t[\"keyword\", \"SERIAL\"],\r\n\t[\"keyword\", \"SERIALIZABLE\"],\r\n\t[\"keyword\", \"SESSION\"],\r\n\t[\"keyword\", \"SESSION_USER\"],\r\n\t[\"keyword\", \"SET\"],\r\n\t[\"keyword\", \"SETUSER\"],\r\n\t[\"keyword\", \"SHARE\"],\r\n\t[\"keyword\", \"SHOW\"],\r\n\t[\"keyword\", \"SHUTDOWN\"],\r\n\t[\"keyword\", \"SIMPLE\"],\r\n\t[\"keyword\", \"SMALLINT\"],\r\n\t[\"keyword\", \"SNAPSHOT\"],\r\n\t[\"keyword\", \"SOME\"],\r\n\t[\"keyword\", \"SONAME\"],\r\n\t[\"keyword\", \"SQL\"],\r\n\t[\"keyword\", \"START\"],\r\n\t[\"keyword\", \"STARTING\"],\r\n\t[\"keyword\", \"STATISTICS\"],\r\n\t[\"keyword\", \"STATUS\"],\r\n\t[\"keyword\", \"STRIPED\"],\r\n\t[\"keyword\", \"SYSTEM_USER\"],\r\n\t[\"keyword\", \"TABLE\"],\r\n\t[\"keyword\", \"TABLES\"],\r\n\t[\"keyword\", \"TABLESPACE\"],\r\n\t[\"keyword\", \"TEMP\"],\r\n\t[\"keyword\", \"TEMPORARY\"],\r\n\t[\"keyword\", \"TEMPTABLE\"],\r\n\t[\"keyword\", \"TERMINATED\"],\r\n\t[\"keyword\", \"TEXT\"],\r\n\t[\"keyword\", \"TEXTSIZE\"],\r\n\t[\"keyword\", \"THEN\"],\r\n\t[\"keyword\", \"TIME\"],\r\n\t[\"keyword\", \"TIMESTAMP\"],\r\n\t[\"keyword\", \"TINYBLOB\"],\r\n\t[\"keyword\", \"TINYINT\"],\r\n\t[\"keyword\", \"TINYTEXT\"],\r\n\t[\"keyword\", \"TO\"],\r\n\t[\"keyword\", \"TOP\"],\r\n\t[\"keyword\", \"TRAN\"],\r\n\t[\"keyword\", \"TRANSACTION\"],\r\n\t[\"keyword\", \"TRANSACTIONS\"],\r\n\t[\"keyword\", \"TRIGGER\"],\r\n\t[\"keyword\", \"TRUNCATE\"],\r\n\t[\"keyword\", \"TSEQUAL\"],\r\n\t[\"keyword\", \"TYPE\"],\r\n\t[\"keyword\", \"TYPES\"],\r\n\t[\"keyword\", \"UNBOUNDED\"],\r\n\t[\"keyword\", \"UNCOMMITTED\"],\r\n\t[\"keyword\", \"UNDEFINED\"],\r\n\t[\"keyword\", \"UNION\"],\r\n\t[\"keyword\", \"UNIQUE\"],\r\n\t[\"keyword\", \"UNLOCK\"],\r\n\t[\"keyword\", \"UNPIVOT\"],\r\n\t[\"keyword\", \"UNSIGNED\"],\r\n\t[\"keyword\", \"UPDATE\"],\r\n\t[\"keyword\", \"UPDATETEXT\"],\r\n\t[\"keyword\", \"USAGE\"],\r\n\t[\"keyword\", \"USE\"],\r\n\t[\"keyword\", \"USER\"],\r\n\t[\"keyword\", \"USING\"],\r\n\t[\"keyword\", \"VALUE\"],\r\n\t[\"keyword\", \"VALUES\"],\r\n\t[\"keyword\", \"VARBINARY\"],\r\n\t[\"keyword\", \"VARCHAR\"],\r\n\t[\"keyword\", \"VARCHARACTER\"],\r\n\t[\"keyword\", \"VARYING\"],\r\n\t[\"keyword\", \"VIEW\"],\r\n\t[\"keyword\", \"WAITFOR\"],\r\n\t[\"keyword\", \"WARNINGS\"],\r\n\t[\"keyword\", \"WHEN\"],\r\n\t[\"keyword\", \"WHERE\"],\r\n\t[\"keyword\", \"WHILE\"],\r\n\t[\"keyword\", \"WITH\"],\r\n\t[\"keyword\", \"WITH ROLLUP\"],\r\n\t[\"keyword\", \"WITHIN\"],\r\n\t[\"keyword\", \"WORK\"],\r\n\t[\"keyword\", \"WRITE\"],\r\n\t[\"keyword\", \"WRITETEXT\"],\r\n\t[\"keyword\", \"YEAR\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/sql/number_feature.test",
    "content": "42\r\n0.154\r\n0xBadFace\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"0.154\"],\r\n\t[\"number\", \"0xBadFace\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal and hexadecimal numbers."
  },
  {
    "path": "tests/languages/sql/operator_feature.test",
    "content": "+ - * /\r\n= % ^ ~\r\n| ||\r\n& &&\r\n! !=\r\n< <= << <> <=>\r\n> >= >>\r\n\r\nAND\r\nBETWEEN\r\nIN\r\nILIKE\r\nLIKE\r\nNOT\r\nOR\r\nIS\r\nDIV\r\nREGEXP\r\nRLIKE\r\nSOUNDS LIKE\r\nXOR\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"%\"], [\"operator\", \"^\"], [\"operator\", \"~\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<<\"], [\"operator\", \"<>\"], [\"operator\", \"<=>\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \">>\"],\r\n\t\r\n\t[\"operator\", \"AND\"],\r\n\t[\"operator\", \"BETWEEN\"],\r\n\t[\"operator\", \"IN\"],\r\n\t[\"operator\", \"ILIKE\"],\r\n\t[\"operator\", \"LIKE\"],\r\n\t[\"operator\", \"NOT\"],\r\n\t[\"operator\", \"OR\"],\r\n\t[\"operator\", \"IS\"],\r\n\t[\"operator\", \"DIV\"],\r\n\t[\"operator\", \"REGEXP\"],\r\n\t[\"operator\", \"RLIKE\"],\r\n\t[\"operator\", \"SOUNDS LIKE\"],\r\n\t[\"operator\", \"XOR\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/sql/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\"foo\r\nbar\"\r\n''\r\n'fo\\'obar'\r\n'foo\r\nbar'\r\n'foo''s bar'\r\n\"foo's \"\"bar\"\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'fo\\\\'obar'\"],\r\n\t[\"string\", \"'foo\\r\\nbar'\"],\r\n\t[\"string\", \"'foo''s bar'\"],\r\n\t[\"string\", \"\\\"foo's \\\"\\\"bar\\\"\\\"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/sql/variable_feature.test",
    "content": "@foo\r\n@foo_bar_42\r\n@\"fo\\\"o-b\r\nar\"\r\n@'fo\\'o-b\r\nar'\r\n@`fo\\`o-b\r\nar`\r\n@'foo'\r\n@'bar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"@foo\"],\r\n\t[\"variable\", \"@foo_bar_42\"],\r\n\t[\"variable\", \"@\\\"fo\\\\\\\"o-b\\r\\nar\\\"\"],\r\n\t[\"variable\", \"@'fo\\\\'o-b\\r\\nar'\"],\r\n\t[\"variable\", \"@`fo\\\\`o-b\\r\\nar`\"],\r\n\t[\"variable\", \"@'foo'\"],\r\n\t[\"variable\", \"@'bar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables.\r\n"
  },
  {
    "path": "tests/languages/sql+sas/sql_inclusion.test",
    "content": "proc sql;\r\nselect *\r\n\tfrom proclib.paylist;\r\nproc print;\r\n\r\nproc sql outobs=10;\r\n\ttitle 'Proclib.Payroll';\r\n\tselect * from proclib.payroll;\r\n\ttitle;\r\nquit;\r\n\r\nproc sql;\r\n\tselect BookingDate,\r\n\tReleaseDate,\r\n\tReleaseCode\r\n\tfrom SASclass.Bookings;\r\nquit;\r\n\r\nproc sql;\r\n\tselect BookingDate,\r\n\tReleaseDate,\r\n\tReleaseCode\r\n\tfrom SASclass.Bookings;\r\nquit;\r\n\r\nlibname proclib 'SAS-library';\r\nproc sql;\r\n\tcreate view proclib.jobs(pw-red) as\r\n\tselect Jobcode,\r\n\t\tcount(jobcode) as number label='Number',\r\n\t\tavg(int(today()-birth/365.25)) as avgage\r\n\t\t\tformat=2. label='Average Salary'\r\n\tfrom Payroll\r\n\tgroup by Jobcode\r\n\thaving avage ge 30;\r\n\ttitle1 'Current Summary Information for Each Job category';\r\n\ttitle2 'Average Age Greater Than or Equal to 30';\r\n\tselect * form proclib.jobs(pw=red);\r\ntitle\r\n\r\nproc sql;\r\n\tconnect to oracle as ora2 (user=user-id password=password);\r\n\tselect * from connection to ora2 (select lname, fname, state from staff);\r\n\tdisconnect from ora2;\r\nquit;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"step\", \"proc sql\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"proc-sql\", [\r\n\t\t[\"sql\", [\r\n\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\r\n\t\t\t[\"keyword\", \"from\"],\r\n\t\t\t\" proclib\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"paylist\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"step\", \"proc print\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"step\", \"proc sql\"],\r\n\t[\"proc-args\", [\r\n\t\t[\"arg\", \"outobs\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"10\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"proc-sql\", [\r\n\t\t[\"global-statements\", \"title\"],\r\n\t\t[\"string\", \"'Proclib.Payroll'\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t[\"sql\", [\r\n\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t[\"keyword\", \"from\"],\r\n\t\t\t\" proclib\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"payroll\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\r\n\t\t[\"global-statements\", \"title\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"step\", \"quit\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"step\", \"proc sql\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"proc-sql\", [\r\n\t\t[\"sql\", [\r\n\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t\" BookingDate\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t\"\\r\\n\\tReleaseDate\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t\"\\r\\n\\tReleaseCode\\r\\n\\t\",\r\n\r\n\t\t\t[\"keyword\", \"from\"],\r\n\t\t\t\" SASclass\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Bookings\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"step\", \"quit\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"step\", \"proc sql\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"proc-sql\", [\r\n\t\t[\"sql\", [\r\n\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t\" BookingDate\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t\"\\r\\n\\tReleaseDate\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t\"\\r\\n\\tReleaseCode\\r\\n\\t\",\r\n\r\n\t\t\t[\"keyword\", \"from\"],\r\n\t\t\t\" SASclass\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Bookings\",\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"step\", \"quit\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"libname\"],\r\n\t\" proclib \",\r\n\t[\"string\", \"'SAS-library'\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"step\", \"proc sql\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"proc-sql\", [\r\n\t\t[\"sql\", [\r\n\t\t\t[\"keyword\", \"create\"],\r\n\t\t\t[\"keyword\", \"view\"],\r\n\t\t\t\" proclib\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"jobs\",\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"pw\",\r\n\t\t\t[\"operator\", \"-\"],\r\n\t\t\t\"red\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"keyword\", \"as\"],\r\n\r\n\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t\" Jobcode\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"function\", \"count\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"jobcode\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"keyword\", \"as\"],\r\n\t\t\t\" number label\",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"'Number'\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\r\n\t\t\t[\"function\", \"avg\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"keyword\", \"int\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"today\",\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"-\"],\r\n\t\t\t\"birth\",\r\n\t\t\t[\"operator\", \"/\"],\r\n\t\t\t[\"number\", \"365.25\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"keyword\", \"as\"],\r\n\t\t\t\" avgage\\r\\n\\t\\t\\tformat\",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"number\", \"2.\"],\r\n\t\t\t\" label\",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"string\", \"'Average Salary'\"],\r\n\r\n\t\t\t[\"keyword\", \"from\"],\r\n\t\t\t\" Payroll\\r\\n\\t\",\r\n\r\n\t\t\t[\"keyword\", \"group\"],\r\n\t\t\t[\"keyword\", \"by\"],\r\n\t\t\t\" Jobcode\\r\\n\\t\",\r\n\r\n\t\t\t[\"keyword\", \"having\"],\r\n\t\t\t\" avage ge \",\r\n\t\t\t[\"number\", \"30\"],\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\r\n\t\t[\"global-statements\", \"title1\"],\r\n\t\t[\"string\", \"'Current Summary Information for Each Job category'\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t[\"global-statements\", \"title2\"],\r\n\t\t[\"string\", \"'Average Age Greater Than or Equal to 30'\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t[\"sql\", [\r\n\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t\" form proclib\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"jobs\",\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"pw\",\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\"red\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\r\n\t\t[\"global-statements\", \"title\"]\r\n\t]],\r\n\t[\"step\", \"proc sql\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"proc-sql\", [\r\n\t\t\"\\r\\n\\tconnect to oracle as ora2 \",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"user=user-id password=password\",\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \";\"],\r\n\r\n\t\t[\"sql\", [\r\n\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t[\"keyword\", \"from\"],\r\n\t\t\t\" connection \",\r\n\t\t\t[\"keyword\", \"to\"],\r\n\t\t\t\" ora2 \",\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"keyword\", \"select\"],\r\n\t\t\t\" lname\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\" fname\",\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\" state \",\r\n\t\t\t[\"keyword\", \"from\"],\r\n\t\t\t\" staff\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"punctuation\", \";\"]\r\n\t\t]],\r\n\r\n\t\t[\"sql-statements\", \"disconnect from\"],\r\n\t\t\" ora2\",\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"step\", \"quit\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that SQL captures SAS language elements and leverages\r\nSQL language support for nested SQL.\r\n"
  },
  {
    "path": "tests/languages/squirrel/attribute_feature.test",
    "content": "class Foo </ test = \"I'm a class level attribute\" />{\r\n    </ test = \"freakin attribute\" /> //attributes of PrintTesty\r\n    function PrintTesty()\r\n    {\r\n        foreach(i,val in testy)\r\n        {\r\n            ::print(\"idx = \"+i+\" = \"+val+\" \\n\");\r\n        }\r\n    }\r\n    </ flippy = 10 , second = [1,2,3] /> //attributes of testy\r\n    testy = null;\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"Foo\"]],\r\n\t[\"attribute-punctuation\", \"</\"],\r\n\t\" test \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"I'm a class level attribute\\\"\"],\r\n\t[\"attribute-punctuation\", \"/>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"attribute-punctuation\", \"</\"],\r\n\t\" test \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string\", \"\\\"freakin attribute\\\"\"],\r\n\t[\"attribute-punctuation\", \"/>\"],\r\n\t[\"comment\", \"//attributes of PrintTesty\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"PrintTesty\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"i\",\r\n\t[\"punctuation\", \",\"],\r\n\t\"val \",\r\n\t[\"keyword\", \"in\"],\r\n\t\" testy\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"operator\", \"::\"],\r\n\t[\"function\", \"print\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\"idx = \\\"\"],\r\n\t[\"operator\", \"+\"],\r\n\t\"i\",\r\n\t[\"operator\", \"+\"],\r\n\t[\"string\", \"\\\" = \\\"\"],\r\n\t[\"operator\", \"+\"],\r\n\t\"val\",\r\n\t[\"operator\", \"+\"],\r\n\t[\"string\", \"\\\" \\\\n\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"attribute-punctuation\", \"</\"],\r\n\t\" flippy \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"10\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" second \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"3\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"attribute-punctuation\", \"/>\"],\r\n\t[\"comment\", \"//attributes of testy\"],\r\n\r\n\t\"\\r\\n    testy \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]"
  },
  {
    "path": "tests/languages/squirrel/boolean_feature.test",
    "content": "false\r\ntrue\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"false\"],\r\n\t[\"boolean\", \"true\"]\r\n]"
  },
  {
    "path": "tests/languages/squirrel/char_feature.test",
    "content": "'w'\n'\\''\n'\\x41' '\\u0041' '\\U00000041'\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"'w'\"],\n\t[\"char\", \"'\\\\''\"],\n\t[\"char\", \"'\\\\x41'\"], [\"char\", \"'\\\\u0041'\"], [\"char\", \"'\\\\U00000041'\"]\n]\n"
  },
  {
    "path": "tests/languages/squirrel/class-name_feature.test",
    "content": "class Foo {}\r\nclass FakeNamespace.Utils.SuperClass {}\r\nclass SuperFoo extends Foo {}\r\nlog(b instanceof Kid);\r\nenum Stuff {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"Foo\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"FakeNamespace\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Utils\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"SuperClass\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"SuperFoo\"]],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\"Foo\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"function\", \"log\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"b \",\r\n\t[\"keyword\", \"instanceof\"],\r\n\t[\"class-name\", [\"Kid\"]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"class-name\", [\"Stuff\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]"
  },
  {
    "path": "tests/languages/squirrel/comment_feature.test",
    "content": "/*\r\nthis is\r\na multiline comment.\r\nthis lines will be ignored by the compiler\r\n*/\r\n//this is a single line comment. this line will be ignored by the compiler\r\n# this is also a single line comment.\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/*\\r\\nthis is\\r\\na multiline comment.\\r\\nthis lines will be ignored by the compiler\\r\\n*/\"],\r\n\t[\"comment\", \"//this is a single line comment. this line will be ignored by the compiler\"],\r\n\t[\"comment\", \"# this is also a single line comment.\"]\r\n]"
  },
  {
    "path": "tests/languages/squirrel/function_feature.test",
    "content": "function abc(a,b,c) {}\r\nfunction(a,b,c) {}\r\nlocal myexp = @(a,b) a + b;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"abc\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"a\",\r\n\t[\"punctuation\", \",\"],\r\n\t\"b\",\r\n\t[\"punctuation\", \",\"],\r\n\t\"c\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"a\",\r\n\t[\"punctuation\", \",\"],\r\n\t\"b\",\r\n\t[\"punctuation\", \",\"],\r\n\t\"c\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"local\"],\r\n\t\" myexp \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"lambda\", \"@\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"a\",\r\n\t[\"punctuation\", \",\"],\r\n\t\"b\",\r\n\t[\"punctuation\", \")\"],\r\n\t\" a \",\r\n\t[\"operator\", \"+\"],\r\n\t\" b\",\r\n\t[\"punctuation\", \";\"]\r\n]"
  },
  {
    "path": "tests/languages/squirrel/keyword_feature.test",
    "content": "base;\r\nbreak;\r\ncase;\r\ncatch;\r\nclass;\r\nclone;\r\nconst;\r\nconstructor;\r\ncontinue;\r\ndefault;\r\ndelete;\r\nelse;\r\nenum;\r\nextends;\r\nfor;\r\nforeach;\r\nfunction;\r\nif;\r\nin;\r\ninstanceof;\r\nlocal;\r\nnull;\r\nresume;\r\nreturn;\r\nstatic;\r\nswitch;\r\nthis;\r\nthrow;\r\ntry;\r\ntypeof;\r\nwhile;\r\nyield;\r\n\r\n__LINE__\r\n__FILE__\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"base\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"case\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"catch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"clone\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"constructor\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"default\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"delete\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"foreach\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"function\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"instanceof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"local\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"null\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"resume\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"this\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"throw\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"try\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"typeof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"yield\"], [\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"__LINE__\"],\r\n\t[\"keyword\", \"__FILE__\"]\r\n]"
  },
  {
    "path": "tests/languages/squirrel/number_feature.test",
    "content": "0\r\n34\r\n0xFF00A120\r\n0753\r\n1.52\r\n0.234\r\n1.e2\r\n1.e-2\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"34\"],\r\n\t[\"number\", \"0xFF00A120\"],\r\n\t[\"number\", \"0753\"],\r\n\t[\"number\", \"1.52\"],\r\n\t[\"number\", \"0.234\"],\r\n\t[\"number\", \"1.e2\"],\r\n\t[\"number\", \"1.e-2\"]\r\n]"
  },
  {
    "path": "tests/languages/squirrel/operator_feature.test",
    "content": "! != || == && >= <= > <=>\r\n\r\n+ - / * %\r\n+= -= /= *= %=\r\n++ --\r\n\r\n<- =\r\n& ^ | ~\r\n>> << >>>\r\n\r\n: ::\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"<=>\"],\r\n\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"%\"],\r\n\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"%=\"],\r\n\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"--\"],\r\n\r\n\t[\"operator\", \"<-\"], [\"operator\", \"=\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"^\"], [\"operator\", \"|\"], [\"operator\", \"~\"],\r\n\t[\"operator\", \">>\"], [\"operator\", \"<<\"], [\"operator\", \">>>\"],\r\n\r\n\t[\"operator\", \":\"], [\"operator\", \"::\"]\r\n]"
  },
  {
    "path": "tests/languages/squirrel/punctuation_feature.test",
    "content": "{ } [ ] ( )\r\n, ; .\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \".\"]\r\n]"
  },
  {
    "path": "tests/languages/squirrel/string_feature.test",
    "content": "\"\"\r\n\"I'm a string\"\r\n\"I'm a wonderful string\\n\"\r\n\r\n@\"\"\r\n@\"I'm a verbatim string\"\r\n@\" I'm a\r\nmultiline verbatim string\r\n\"\r\n\r\n@\"\r\n    this is a multiline string\r\n    it will \"\"embed\"\" all the new line\r\n    characters\r\n\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"I'm a string\\\"\"],\r\n\t[\"string\", \"\\\"I'm a wonderful string\\\\n\\\"\"],\r\n\r\n\t[\"string\", \"@\\\"\\\"\"],\r\n\t[\"string\", \"@\\\"I'm a verbatim string\\\"\"],\r\n\t[\"string\", \"@\\\" I'm a\\r\\nmultiline verbatim string\\r\\n\\\"\"],\r\n\r\n\t[\"string\", \"@\\\"\\r\\n    this is a multiline string\\r\\n    it will \\\"\\\"embed\\\"\\\" all the new line\\r\\n    characters\\r\\n\\\"\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/stan/comment_feature.test",
    "content": "# comment\n// comment\n/*\ncomment\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"# comment\"],\n\t[\"comment\", \"// comment\"],\n\t[\"comment\", \"/*\\r\\ncomment\\r\\n*/\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/stan/constraint_feature.test",
    "content": "real<lower=a> b;\n\nreal<lower=a, upper=b> theta;\n\nint<lower=1> T;\n\nmatrix<multiplier=5>[3, 4] B;\n\nrow_vector<lower=-1,upper=1>[10] u;\n\nrow_vector<offset=-42,multiplier=3>[3] u;\n\nreal<lower=min(y), upper=max(y)> phi;\n\nreal<offset=mu,multiplier=sigma> x;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"real\"],\n\t[\"constraint\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"property\", \"lower\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t\"a\"\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\" b\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"real\"],\n\t[\"constraint\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"property\", \"lower\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t\"a\"\n\t\t]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"upper\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t\"b\"\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\" theta\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"int\"],\n\t[\"constraint\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"property\", \"lower\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t[\"number\", \"1\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\" T\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"matrix\"],\n\t[\"constraint\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"property\", \"multiplier\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t[\"number\", \"5\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"3\"],\n\t[\"punctuation\", \",\"],\n\t[\"number\", \"4\"],\n\t[\"punctuation\", \"]\"],\n\t\" B\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"row_vector\"],\n\t[\"constraint\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"property\", \"lower\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t[\"operator\", \"-\"],\n\t\t\t[\"number\", \"1\"]\n\t\t]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"upper\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t[\"number\", \"1\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"10\"],\n\t[\"punctuation\", \"]\"],\n\t\" u\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"row_vector\"],\n\t[\"constraint\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"property\", \"offset\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t[\"operator\", \"-\"],\n\t\t\t[\"number\", \"42\"]\n\t\t]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"multiplier\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t[\"number\", \"3\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"3\"],\n\t[\"punctuation\", \"]\"],\n\t\" u\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"real\"],\n\t[\"constraint\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"property\", \"lower\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t[\"function\", \"min\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"y\",\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"upper\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t[\"function\", \"max\"],\n\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\"y\",\n\t\t\t[\"punctuation\", \")\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\" phi\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"real\"],\n\t[\"constraint\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"property\", \"offset\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t\"mu\"\n\t\t]],\n\t\t[\"punctuation\", \",\"],\n\t\t[\"property\", \"multiplier\"],\n\t\t[\"operator\", \"=\"],\n\t\t[\"expression\", [\n\t\t\t\"sigma\"\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\" x\",\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for type constraints.\n"
  },
  {
    "path": "tests/languages/stan/directive_feature.test",
    "content": "#include my-std-normal.stan  // definition of standard normal\n\t#include my-std-normal.stan\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"#include my-std-normal.stan  \"],\n\t[\"comment\", \"// definition of standard normal\"],\n\t[\"directive\", \"#include my-std-normal.stan\"]\n]\n\n----------------------------------------------------\n\nChecks for include directives.\n"
  },
  {
    "path": "tests/languages/stan/function-arg_feature.test",
    "content": "y = algebra_solver(system, y_guess, theta, x_r, x_i);\n\n----------------------------------------------------\n\n[\n\t\"y \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"algebra_solver\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function-arg\", \"system\"],\n\t[\"punctuation\", \",\"],\n\t\" y_guess\",\n\t[\"punctuation\", \",\"],\n\t\" theta\",\n\t[\"punctuation\", \",\"],\n\t\" x_r\",\n\t[\"punctuation\", \",\"],\n\t\" x_i\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/stan/keyword_feature.test",
    "content": "array\nbreak\ncholesky_factor_corr\ncholesky_factor_cov\ncomplex\ncontinue\ncorr_matrix\ncov_matrix\ndata\nelse\nfor\nfunctions\ngenerated\nif\nin\nincrement_log_prob\nint\nmatrix\nmodel\nordered\nparameters\npositive_ordered\nprint\nquantities\nreal\nreject\nreturn\nrow_vector\nsimplex\ntarget\ntransformed\nunit_vector\nvector\nvoid\nwhile\n\nalgebra_solver\nalgebra_solver_newton\nintegrate_1d\nintegrate_ode\nintegrate_ode_bdf\nintegrate_ode_rk45\nmap_rect\node_adams\node_adams_tol\node_adjoint_tol_ctl\node_bdf\node_bdf_tol\node_ckrk\node_ckrk_tol\node_rk45\node_rk45_tol\nreduce_sum\nreduce_sum_static\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"array\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"cholesky_factor_corr\"],\n\t[\"keyword\", \"cholesky_factor_cov\"],\n\t[\"keyword\", \"complex\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"corr_matrix\"],\n\t[\"keyword\", \"cov_matrix\"],\n\t[\"keyword\", \"data\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"functions\"],\n\t[\"keyword\", \"generated\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"in\"],\n\t[\"keyword\", \"increment_log_prob\"],\n\t[\"keyword\", \"int\"],\n\t[\"keyword\", \"matrix\"],\n\t[\"keyword\", \"model\"],\n\t[\"keyword\", \"ordered\"],\n\t[\"keyword\", \"parameters\"],\n\t[\"keyword\", \"positive_ordered\"],\n\t[\"keyword\", \"print\"],\n\t[\"keyword\", \"quantities\"],\n\t[\"keyword\", \"real\"],\n\t[\"keyword\", \"reject\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"row_vector\"],\n\t[\"keyword\", \"simplex\"],\n\t[\"keyword\", \"target\"],\n\t[\"keyword\", \"transformed\"],\n\t[\"keyword\", \"unit_vector\"],\n\t[\"keyword\", \"vector\"],\n\t[\"keyword\", \"void\"],\n\t[\"keyword\", \"while\"],\n\n\t[\"keyword\", \"algebra_solver\"],\n\t[\"keyword\", \"algebra_solver_newton\"],\n\t[\"keyword\", \"integrate_1d\"],\n\t[\"keyword\", \"integrate_ode\"],\n\t[\"keyword\", \"integrate_ode_bdf\"],\n\t[\"keyword\", \"integrate_ode_rk45\"],\n\t[\"keyword\", \"map_rect\"],\n\t[\"keyword\", \"ode_adams\"],\n\t[\"keyword\", \"ode_adams_tol\"],\n\t[\"keyword\", \"ode_adjoint_tol_ctl\"],\n\t[\"keyword\", \"ode_bdf\"],\n\t[\"keyword\", \"ode_bdf_tol\"],\n\t[\"keyword\", \"ode_ckrk\"],\n\t[\"keyword\", \"ode_ckrk_tol\"],\n\t[\"keyword\", \"ode_rk45\"],\n\t[\"keyword\", \"ode_rk45_tol\"],\n\t[\"keyword\", \"reduce_sum\"],\n\t[\"keyword\", \"reduce_sum_static\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/stan/number_feature.test",
    "content": "0\n1\n24567898765\n24_56_78_98_765\n\n0.0\n1.0\n3.14\n2.7e3\n2E-5\n1.23e+3\n3.14i\n40e-3i\n1e10i\n0i\n1_2.3_4e5_6i\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"1\"],\n\t[\"number\", \"24567898765\"],\n\t[\"number\", \"24_56_78_98_765\"],\n\n\t[\"number\", \"0.0\"],\n\t[\"number\", \"1.0\"],\n\t[\"number\", \"3.14\"],\n\t[\"number\", \"2.7e3\"],\n\t[\"number\", \"2E-5\"],\n\t[\"number\", \"1.23e+3\"],\n\t[\"number\", \"3.14i\"],\n\t[\"number\", \"40e-3i\"],\n\t[\"number\", \"1e10i\"],\n\t[\"number\", \"0i\"],\n\t[\"number\", \"1_2.3_4e5_6i\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers.\n"
  },
  {
    "path": "tests/languages/stan/operator_feature.test",
    "content": "+  -  *  /\n+= -= *= /=\n\n== != < <= > >=\n! || &&\n\n<- =\n.* .*= ./ ./=\n\n| ' ^ % ~ ? :\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"||\"],\n\t[\"operator\", \"&&\"],\n\n\t[\"operator\", \"<-\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \".*\"],\n\t[\"operator\", \".*=\"],\n\t[\"operator\", \"./\"],\n\t[\"operator\", \"./=\"],\n\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"'\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"?\"],\n\t[\"operator\", \":\"]\n]\n\n----------------------------------------------------\n\nChecks for operators.\n"
  },
  {
    "path": "tests/languages/stan/program-block_feature.html.test",
    "content": "functions {\n  // ... function declarations and definitions ...\n}\ndata {\n  // ... declarations ...\n}\ntransformed data {\n   // ... declarations ... statements ...\n}\nparameters {\n   // ... declarations ...\n}\ntransformed parameters {\n   // ... declarations ... statements ...\n}\nmodel {\n   // ... declarations ... statements ...\n}\ngenerated quantities {\n   // ... declarations ... statements ...\n}\n\n// data-only quantifiers\nreal foo(data real x) {\n  return x^2;\n}\n\n----------------------------------------------------\n\n<span class=\"token keyword program-block\">functions</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token comment\">// ... function declarations and definitions ...</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword program-block\">data</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token comment\">// ... declarations ...</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword program-block\">transformed</span>\n<span class=\"token keyword program-block\">data</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token comment\">// ... declarations ... statements ...</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword program-block\">parameters</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token comment\">// ... declarations ...</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword program-block\">transformed</span>\n<span class=\"token keyword program-block\">parameters</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token comment\">// ... declarations ... statements ...</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword program-block\">model</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token comment\">// ... declarations ... statements ...</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword program-block\">generated</span>\n<span class=\"token keyword program-block\">quantities</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token comment\">// ... declarations ... statements ...</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// data-only quantifiers</span>\n<span class=\"token keyword\">real</span>\n<span class=\"token function\">foo</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token keyword\">data</span>\n<span class=\"token keyword\">real</span>\nx\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token keyword\">return</span>\nx\n<span class=\"token operator\">^</span>\n<span class=\"token number\">2</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n"
  },
  {
    "path": "tests/languages/stan/punctuation_feature.test",
    "content": "( ) [ ] { }\n, ;\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/stan/string_feature.test",
    "content": "\"\"\n\"foo bar\"\n\nprint(\"log density before =\", target());\nprint(\"u[\", n, \"] = \", u[n]);\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo bar\\\"\"],\n\n\t[\"keyword\", \"print\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"log density before =\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"target\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"print\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"u[\\\"\"],\n\t[\"punctuation\", \",\"],\n\t\" n\",\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"] = \\\"\"],\n\t[\"punctuation\", \",\"],\n\t\" u\",\n\t[\"punctuation\", \"[\"],\n\t\"n\",\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/stata/boolean_feature.test",
    "content": "set foo on\nset foo off\n\n----------------------------------------------------\n\n[\n\t[\"command\", \"set\"], \" foo \", [\"boolean\", \"on\"],\n\t[\"command\", \"set\"], \" foo \", [\"boolean\", \"off\"]\n]\n"
  },
  {
    "path": "tests/languages/stata/command_feature.test",
    "content": "quietly regress foo\nquietly: regress foo\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"quietly\"], [\"command\", \"regress\"], \" foo\\r\\n\",\n\t[\"keyword\", \"quietly\"], [\"punctuation\", \":\"], [\"command\", \"regress\"], \" foo\"\n]\n"
  },
  {
    "path": "tests/languages/stata/comment_feature.test",
    "content": "* comment\n// comment\n/*\ncomment\n*/\n\n* a sample analysis job\nversion 17.0\nuse census\n/* obtain the summary statistics */\ntabulate region // there are 4 regions in this dataset\nsummarize marriage\n* a sample analysis job\nversion 17.0\nuse /* obtain the summary statistics */ census\ntabulate region\n// there are 4 regions in this dataset\nsummarize marriage\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"* comment\"],\n\t[\"comment\", \"// comment\"],\n\t[\"comment\", \"/*\\r\\ncomment\\r\\n*/\"],\n\n\t[\"comment\", \"* a sample analysis job\"],\n\t[\"command\", \"version\"],\n\t[\"number\", \"17.0\"],\n\t[\"command\", \"use\"],\n\t\" census\\r\\n\",\n\t[\"comment\", \"/* obtain the summary statistics */\"],\n\t[\"command\", \"tabulate\"],\n\t\" region \",\n\t[\"comment\", \"// there are 4 regions in this dataset\"],\n\t[\"command\", \"summarize\"],\n\t\" marriage\\r\\n\",\n\t[\"comment\", \"* a sample analysis job\"],\n\t[\"command\", \"version\"],\n\t[\"number\", \"17.0\"],\n\t[\"command\", \"use\"],\n\t[\"comment\", \"/* obtain the summary statistics */\"],\n\t\" census\\r\\n\",\n\t[\"command\", \"tabulate\"],\n\t\" region\\r\\n\",\n\t[\"comment\", \"// there are 4 regions in this dataset\"],\n\t[\"command\", \"summarize\"],\n\t\" marriage\"\n]\n"
  },
  {
    "path": "tests/languages/stata/java_inclusion.test",
    "content": "program java_program\n\tversion 17\n\tjava: printX();\nend\njava:\n\tint x = 123;\n\tvoid printX() {\n\t\tSystem.out.println(\"x: \" + x);\n\t}\nend\n\n----------------------------------------------------\n\n[\n\t[\"command\", \"program\"],\n\t\" java_program\\r\\n\\t\",\n\n\t[\"command\", \"version\"],\n\t[\"number\", \"17\"],\n\n\t[\"command\", \"java\"],\n\t[\"punctuation\", \":\"],\n\t[\"java\", [\n\t\t[\"function\", \"printX\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \";\"]\n\t]],\n\t[\"command\", \"end\"],\n\n\t[\"command\", \"java\"],\n\t[\"punctuation\", \":\"],\n\t[\"java\", [\n\t\t[\"keyword\", \"int\"],\n\t\t\" x \",\n\t\t[\"operator\", \"=\"],\n\t\t[\"number\", \"123\"],\n\t\t[\"punctuation\", \";\"],\n\n\t\t[\"keyword\", \"void\"],\n\t\t[\"function\", \"printX\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \"{\"],\n\n\t\t[\"class-name\", [\"System\"]],\n\t\t[\"punctuation\", \".\"],\n\t\t\"out\",\n\t\t[\"punctuation\", \".\"],\n\t\t[\"function\", \"println\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"string\", \"\\\"x: \\\"\"],\n\t\t[\"operator\", \"+\"],\n\t\t\" x\",\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \";\"],\n\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\t[\"command\", \"end\"]\n]\n"
  },
  {
    "path": "tests/languages/stata/keyword_feature.test",
    "content": "foo bayes\nfoo bootstrap\nfoo by\nfoo bysort\nfoo capture\nfoo clear\nfoo collect\nfoo fmm\nfoo fp\nfoo frame\nfoo if\nfoo in\nfoo jackknife\nfoo mfp\nfoo mi estimate\nfoo nestreg\nfoo noisily\nfoo of\nfoo permute\nfoo quietly\nfoo rolling\nfoo simulate\nfoo sort\nfoo statsby\nfoo stepwise\nfoo svy\nfoo varlist\nfoo version\nfoo xi\n\n----------------------------------------------------\n\n[\n\t[\"command\", \"foo\"], [\"keyword\", \"bayes\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"bootstrap\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"by\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"bysort\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"capture\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"clear\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"collect\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"fmm\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"fp\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"frame\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"if\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"in\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"jackknife\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"mfp\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"mi estimate\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"nestreg\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"noisily\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"of\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"permute\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"quietly\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"rolling\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"simulate\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"sort\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"statsby\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"stepwise\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"svy\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"varlist\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"version\"],\n\t[\"command\", \"foo\"], [\"keyword\", \"xi\"]\n]\n"
  },
  {
    "path": "tests/languages/stata/mata_inclusion.test",
    "content": "version 17.0\ninclude limits.matah\nmata:\nreal matrix inpivot(real matrix X)\n{\n\treal matrix y1, yz\n\treal scalar n\n\tif (rows(X)>‘MAXDIM’ | cols(X)>‘MAXDIM’) {\n\t\terrprintf(\"inpivot: matrix too large\\n\")\n\t\texit(1000)\n\t}\n\t...\n}\nend\n\n----------------------------------------------------\n\n[\n\t[\"command\", \"version\"],\n\t[\"number\", \"17.0\"],\n\n\t[\"command\", \"include\"],\n\t\" limits.matah\\r\\n\",\n\n\t[\"command\", \"mata\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"mata\", [\n\t\t[\"type\", [\"real matrix\"]],\n\t\t[\"function\", \"inpivot\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"type\", [\"real matrix\"]],\n\t\t\" X\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"punctuation\", \"{\"],\n\n\t\t[\"type\", [\"real matrix\"]],\n\t\t\" y1\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" yz\\r\\n\\t\",\n\n\t\t[\"type\", [\"real scalar\"]],\n\t\t\" n\\r\\n\\t\",\n\n\t\t[\"keyword\", \"if\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"function\", \"rows\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"X\",\n\t\t[\"punctuation\", \")\"],\n\t\t[\"operator\", \">\"],\n\t\t\"‘MAXDIM\",\n\t\t[\"operator\", \"’\"],\n\t\t[\"operator\", \"|\"],\n\t\t[\"function\", \"cols\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"X\",\n\t\t[\"punctuation\", \")\"],\n\t\t[\"operator\", \">\"],\n\t\t\"‘MAXDIM\",\n\t\t[\"operator\", \"’\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \"{\"],\n\n\t\t[\"function\", \"errprintf\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"string\", \"\\\"inpivot: matrix too large\\\\n\\\"\"],\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"function\", \"exit\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"number\", \"1000\"],\n\t\t[\"punctuation\", \")\"],\n\n\t\t[\"punctuation\", \"}\"],\n\n\t\t[\"operator\", \"..\"],\n\t\t[\"punctuation\", \".\"],\n\n\t\t[\"punctuation\", \"}\"]\n\t]],\n\t[\"command\", \"end\"]\n]\n"
  },
  {
    "path": "tests/languages/stata/number_feature.test",
    "content": "123\n123.456\n.123\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"123\"],\n\t[\"number\", \"123.456\"],\n\t[\"number\", \".123\"]\n]\n"
  },
  {
    "path": "tests/languages/stata/operator_feature.test",
    "content": "+ - * / ^\n++ --\n\n< <= > >= == != ~=\n=\n\n& | ! ~\n\n# ##\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"^\"],\n\n\t[\"operator\", \"++\"],\n\t[\"operator\", \"--\"],\n\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"~=\"],\n\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \"&\"], [\"operator\", \"|\"], [\"operator\", \"!\"], [\"operator\", \"~\"],\n\n\t[\"operator\", \"#\"], [\"operator\", \"##\"]\n]\n"
  },
  {
    "path": "tests/languages/stata/python_inclusion.test",
    "content": "version 17.0\nlocal a = 2\nlocal b = 3\npython:\nfrom sfi import Scalar\ndef calcsum(num1, num2):\n\tres = num1 + num2\n\tScalar.setValue(\"result\", res)\ncalcsum(‘a’, ‘b’)\nend\ndisplay result\n\n----------------------------------------------------\n\n[\n\t[\"command\", \"version\"],\n\t[\"number\", \"17.0\"],\n\n\t[\"command\", \"local\"],\n\t\" a \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"2\"],\n\n\t[\"command\", \"local\"],\n\t\" b \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"3\"],\n\n\t[\"command\", \"python\"],\n\t[\"punctuation\", \":\"],\n\t[\"python\", [\n\t\t[\"keyword\", \"from\"],\n\t\t\" sfi \",\n\t\t[\"keyword\", \"import\"],\n\t\t\" Scalar\\r\\n\",\n\n\t\t[\"keyword\", \"def\"],\n\t\t[\"function\", \"calcsum\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"num1\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" num2\",\n\t\t[\"punctuation\", \")\"],\n\t\t[\"punctuation\", \":\"],\n\n\t\t\"\\r\\n\\tres \",\n\t\t[\"operator\", \"=\"],\n\t\t\" num1 \",\n\t\t[\"operator\", \"+\"],\n\t\t\" num2\\r\\n\\tScalar\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"setValue\",\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"string\", \"\\\"result\\\"\"],\n\t\t[\"punctuation\", \",\"],\n\t\t\" res\",\n\t\t[\"punctuation\", \")\"],\n\n\t\t\"\\r\\ncalcsum\",\n\t\t[\"punctuation\", \"(\"],\n\t\t\"‘a’\",\n\t\t[\"punctuation\", \",\"],\n\t\t\" ‘b’\",\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"command\", \"end\"],\n\n\t[\"command\", \"display\"],\n\t\" result\"\n]\n"
  },
  {
    "path": "tests/languages/stata/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"${datadir}householdmembers\"\n\"‘ins’\"\n\"‘mpg[one]’\"\n\n`\"ysc(r(0 80)) xtitle(\"Health Status\", size(medlarge))\"'\n\n----------------------------------------------------\n\n[\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"foo\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"${\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"command\", \"datadir\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"householdmembers\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"expression\", [\n\t\t\t\t[\"variable\", \"‘ins’\"]\n\t\t\t]]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"expression\", [\n\t\t\t\t[\"variable\", \"‘mpg[one]’\"]\n\t\t\t]]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"`\\\"ysc(r(0 80)) xtitle(\\\"Health Status\\\", size(medlarge))\\\"'\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/stata/variable_feature.test",
    "content": "$histoption\n\n----------------------------------------------------\n\n[\n\t[\"variable\", \"$histoption\"]\n]\n"
  },
  {
    "path": "tests/languages/stylus/atrule-declaration_feature.test",
    "content": "@media print\r\n@import \"reset.css\"\r\n@font-face {\r\n@keyframes {\r\n@media (max-{foo}: bar)\r\n@namespace url(http://www.w3.org/1999/xhtml)\t// comment\r\n@namespace svg url(http://www.w3.org/2000/svg)\t// comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"atrule-declaration\", [[\"atrule\", \"@media\"], \" print\"]],\r\n\t[\"atrule-declaration\", [[\"atrule\", \"@import\"], [\"string\", \"\\\"reset.css\\\"\"]]],\r\n\t[\"atrule-declaration\", [[\"atrule\", \"@font-face\"], [\"punctuation\", \"{\"]]],\r\n\t[\"atrule-declaration\", [[\"atrule\", \"@keyframes\"], [\"punctuation\", \"{\"]]],\r\n\t[\"atrule-declaration\", [\r\n\t\t[\"atrule\", \"@media\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"max-\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"{\"],\r\n\t\t\t\"foo\",\r\n\t\t\t[\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" bar\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"atrule-declaration\", [\r\n\t\t[\"atrule\", \"@namespace\"],\r\n\t\t[\"url\", \"url(http://www.w3.org/1999/xhtml)\"],\r\n\t\t[\"comment\", \"// comment\"]\r\n\t]],\r\n\t[\"atrule-declaration\", [\r\n\t\t[\"atrule\", \"@namespace\"],\r\n\t\t\" svg \",\r\n\t\t[\"url\", \"url(http://www.w3.org/2000/svg)\"],\r\n\t\t[\"comment\", \"// comment\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for at-rules."
  },
  {
    "path": "tests/languages/stylus/boolean_feature.test",
    "content": "a = true\r\nb = false\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"a\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"boolean\", \"true\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"b\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"boolean\", \"false\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/stylus/comment_feature.test",
    "content": "/**/\r\n/* foo\r\nbar */\r\n//\r\n// foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"],\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/stylus/func_feature.test",
    "content": "border-radius(n)\r\n  -webkit-border-radius n\r\n  -moz-border-radius n\r\n  border-radius n\r\n\r\nform input[type=button]\r\n  border-radius(5px)\r\n  color foo()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"func\", [\r\n\t\t[\"function\", \"border-radius\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\"n\",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"-webkit-border-radius\"]],\r\n\t\t\" n\"\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"-moz-border-radius\"]],\r\n\t\t\" n\"\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"border-radius\"]],\r\n\t\t\" n\"\r\n\t]],\r\n\t[\"selector\", [\"form input[type=button]\"]],\r\n\t[\"func\", [\r\n\t\t[\"function\", \"border-radius\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"number\", \"5\"],\r\n\t\t[\"unit\", \"px\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"color\"]],\r\n\t\t[\"func\", [\r\n\t\t\t[\"function\", \"foo\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/stylus/hexcode_feature.test",
    "content": "color: #fff\r\ncolor: #FA3\r\ncolor: #f7c111\r\ncolor: #9F4ABB\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"color\"]], [\"punctuation\", \":\"],\r\n\t\t[\"hexcode\", \"#fff\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"color\"]], [\"punctuation\", \":\"],\r\n\t\t[\"hexcode\", \"#FA3\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"color\"]], [\"punctuation\", \":\"],\r\n\t\t[\"hexcode\", \"#f7c111\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"color\"]], [\"punctuation\", \":\"],\r\n\t\t[\"hexcode\", \"#9F4ABB\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hexadecimal values."
  },
  {
    "path": "tests/languages/stylus/important_feature.test",
    "content": "color: red !important\r\n@extend foo !optional\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"color\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"color\",  \"red\"],\r\n\t\t[\"important\", \"!important\"]\r\n\t]],\r\n\t[\"atrule-declaration\", [\r\n\t\t[\"atrule\", \"@extend\"],\r\n\t\t\" foo \",\r\n\t\t[\"important\", \"!optional\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for !important and !optional."
  },
  {
    "path": "tests/languages/stylus/keyword_feature.test",
    "content": "for i in 1..5\r\nif a == 3\r\nz-index: 1 unless @z-index;\r\nreturn pair[1] if pair[0] == key for pair in hash\r\nif url == \"http://example.com\"\t// comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"statement\", [\r\n\t\t[\"keyword\", \"for\"],\r\n\t\t\" i \",\r\n\t\t[\"operator\", \"in\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"..\"],\r\n\t\t[\"number\", \"5\"]\r\n\t]],\r\n\t[\"statement\", [\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t\" a \",\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"number\", \"3\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"z-index\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"keyword\", \"unless\"],\r\n\t\t[\"keyword\", \"@z-index\"],\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"statement\", [\r\n\t\t[\"keyword\", \"return\"], \" pair\",\r\n\t\t[\"punctuation\", \"[\"], [\"number\", \"1\"], [\"punctuation\", \"]\"],\r\n\t\t[\"keyword\", \"if\"], \" pair\",\r\n\t\t[\"punctuation\", \"[\"], [\"number\", \"0\"], [\"punctuation\", \"]\"],\r\n\t\t[\"operator\", \"==\"], \" key \",\r\n\t\t[\"keyword\", \"for\"], \" pair \",\r\n\t\t[\"operator\", \"in\"], \" hash\"\r\n\t]],\r\n\t[\"statement\", [\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t\" url \",\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"string\", \"\\\"http://example.com\\\"\"],\r\n\t\t[\"comment\", \"// comment\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for statements and keywords."
  },
  {
    "path": "tests/languages/stylus/number_feature.test",
    "content": "z-index 42\r\nfoo = 3.14159\r\nwidth: 23%\r\nbar = 1.5%\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"z-index\"]],\r\n\t\t[\"number\", \"42\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"3.14159\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"width\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"number\", \"23\"],\r\n\t\t[\"unit\", \"%\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"bar\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"1.5\"],\r\n\t\t[\"unit\", \"%\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers and percentages."
  },
  {
    "path": "tests/languages/stylus/operator_feature.test",
    "content": "a = !b\r\nb = b != a\r\nc = ~b\r\nd = c + b\r\nd += a\r\ne = d - c\r\ne -= b\r\nf = a * b\r\ng = c ** d\r\ng *= f\r\nh = g / f\r\nh /= e\r\ni = h % g\r\ni %= f\r\nj = 1..5\r\nk = 1...5\r\nl = k < j\r\nm = l <= k\r\nn = m > l\r\no = n >= m\r\np = o ? n : m\r\nq ?= p\r\nr = q == p\r\ns := r\r\nt = s && r\r\nu = t || s\r\nv = u and t\r\nw = v or u\r\nx = 1 in w\r\ny = true is true\r\nz = true is not false\r\naa = z isnt y\r\nab = #fff is a 'rgba'\r\nac = ab is defined\r\nad = not ac\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"a\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"operator\", \"!\"],\r\n\t\t\"b\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"b\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" b \",\r\n\t\t[\"operator\", \"!=\"],\r\n\t\t\" a\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"c\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"operator\", \"~\"],\r\n\t\t\"b\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"d\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" c \",\r\n\t\t[\"operator\", \"+\"],\r\n\t\t\" b\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"d\"],\r\n\t\t[\"operator\", \"+=\"],\r\n\t\t\" a\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"e\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" d \",\r\n\t\t[\"operator\", \"-\"],\r\n\t\t\" c\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"e\"],\r\n\t\t[\"operator\", \"-=\"],\r\n\t\t\" b\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"f\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" a \",\r\n\t\t[\"operator\", \"*\"],\r\n\t\t\" b\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"g\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" c \",\r\n\t\t[\"operator\", \"**\"],\r\n\t\t\" d\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"g\"],\r\n\t\t[\"operator\", \"*=\"],\r\n\t\t\" f\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"h\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" g \",\r\n\t\t[\"operator\", \"/\"],\r\n\t\t\" f\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"h\"],\r\n\t\t[\"operator\", \"/=\"],\r\n\t\t\" e\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"i\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" h \",\r\n\t\t[\"operator\", \"%\"],\r\n\t\t\" g\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"i\"],\r\n\t\t[\"operator\", \"%=\"],\r\n\t\t\" f\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"j\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"..\"],\r\n\t\t[\"number\", \"5\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"k\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"...\"],\r\n\t\t[\"number\", \"5\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"l\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" k \",\r\n\t\t[\"operator\", \"<\"],\r\n\t\t\" j\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"m\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" l \",\r\n\t\t[\"operator\", \"<=\"],\r\n\t\t\" k\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"n\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" m \",\r\n\t\t[\"operator\", \">\"],\r\n\t\t\" l\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"o\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" n \",\r\n\t\t[\"operator\", \">=\"],\r\n\t\t\" m\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"p\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" o \",\r\n\t\t[\"operator\", \"?\"],\r\n\t\t\" n \",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" m\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"q\"],\r\n\t\t[\"operator\", \"?=\"],\r\n\t\t\" p\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"r\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" q \",\r\n\t\t[\"operator\", \"==\"],\r\n\t\t\" p\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"s\"],\r\n\t\t[\"operator\", \":=\"],\r\n\t\t\" r\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"t\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" s \",\r\n\t\t[\"operator\", \"&&\"],\r\n\t\t\" r\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"u\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" t \",\r\n\t\t[\"operator\", \"||\"],\r\n\t\t\" s\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"v\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" u \",\r\n\t\t[\"operator\", \"and\"],\r\n\t\t\" t\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"w\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" v \",\r\n\t\t[\"operator\", \"or\"],\r\n\t\t\" u\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"x\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"in\"],\r\n\t\t\" w\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"y\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"operator\", \"is\"],\r\n\t\t[\"boolean\", \"true\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"z\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"operator\", \"is not\"],\r\n\t\t[\"boolean\", \"false\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"aa\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" z \",\r\n\t\t[\"operator\", \"isnt\"],\r\n\t\t\" y\"\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"ab\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"hexcode\", \"#fff\"],\r\n\t\t[\"operator\", \"is a\"],\r\n\t\t[\"string\", \"'rgba'\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"ac\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\" ab \",\r\n\t\t[\"operator\", \"is defined\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"ad\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"operator\", \"not\"],\r\n\t\t\" ac\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/stylus/property-declaration_feature.test",
    "content": "div\r\n\twidth 40px\r\n\tcolor: red\r\n\tbackground: blue;\r\n\tanimation-name test1, animation4\r\n\r\ndiv {\r\nbackground-{foo}: bar;\r\n}\r\n\r\ndiv\r\n\t{foo} bar\r\n\r\ncomment\r\n\tcontent 'http://www.example.com' // comment\r\n\tbackground url(http://example.com) /* comment */\r\n\tbackground /* comment */ url(\"http://example.com\")\r\n\tcontent '/* this is string not comment */'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"selector\", [\"div\"]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"width\"]], [\"number\", \"40\"], [\"unit\", \"px\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"color\"]], [\"punctuation\", \":\"], [\"color\", \"red\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"background\"]], [\"punctuation\", \":\"], [\"color\", \"blue\"], [\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"animation-name\"]], \" test1\", [\"punctuation\", \",\"], \" animation4\"]],\r\n\t[\"selector\", [\"div \", [\"punctuation\", \"{\"]]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\r\n\t\t\t\"background-\",\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"delimiter\", \"{\"], \"foo\", [\"delimiter\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" bar\",\r\n\t\t[\"punctuation\", \";\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"selector\", [\"div\"]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\r\n\t\t\t[\"interpolation\", [\r\n\t\t\t\t[\"delimiter\", \"{\"], \"foo\", [\"delimiter\", \"}\"]\r\n\t\t\t]]\r\n\t\t]],\r\n\t\t\" bar\"\r\n\t]],\r\n\r\n\t[\"selector\", [\"comment\"]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"content\"]],\r\n\t\t[\"string\", \"'http://www.example.com'\"],\r\n\t\t[\"comment\", \"// comment\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"background\"]],\r\n\t\t[\"url\", \"url(http://example.com)\"],\r\n\t\t[\"comment\", \"/* comment */\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"background\"]],\r\n\t\t[\"comment\", \"/* comment */\"],\r\n\t\t[\"url\", \"url(\\\"http://example.com\\\")\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"content\"]],\r\n\t\t[\"string\", \"'/* this is string not comment */'\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for property declarations."
  },
  {
    "path": "tests/languages/stylus/selector_feature.test",
    "content": "div\r\nspan[foo=bar]\r\n  color red\r\n\r\ndiv input,\r\ninput:nth-child(2n)\r\n  color red\r\n\r\n#foo\r\n  .bar::before\r\n    color red\r\n\r\n#foo\r\n  .bar {\r\ncolor red\r\n}\r\n\r\n{foo} {bar}:hover\r\n  color red\r\n\r\ndiv    // comment\r\n\tdisplay inline-block // comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"selector\", [\"div\\r\\nspan[foo=bar]\"]],\r\n\t[\"property-declaration\", [[\"property\", [\"color\"]], [\"color\", \"red\"]]],\r\n\t[\"selector\", [\"div input\", [\"punctuation\", \",\"], \"\\r\\ninput:nth-child(2n)\"]],\r\n\t[\"property-declaration\", [[\"property\", [\"color\"]], [\"color\", \"red\"]]],\r\n\t[\"selector\", [\"#foo\"]],\r\n\t[\"selector\", [\".bar::before\"]],\r\n\t[\"property-declaration\", [[\"property\", [\"color\"]], [\"color\", \"red\"]]],\r\n\t[\"selector\", [\"#foo\"]],\r\n\t[\"selector\", [\".bar \", [\"punctuation\", \"{\"]]],\r\n\t[\"property-declaration\", [[\"property\", [\"color\"]], [\"color\", \"red\"]]],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"selector\", [\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"{\"], \"foo\", [\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"delimiter\", \"{\"], \"bar\", [\"delimiter\", \"}\"]\r\n\t\t]],\r\n\t\t\":hover\"\r\n\t]],\r\n\t[\"property-declaration\", [[\"property\", [\"color\"]], [\"color\", \"red\"]]],\r\n\t[\"selector\", [\"div    \", [\"comment\", \"// comment\"]]],\r\n\t[\"property-declaration\", [[\"property\", [\"display\"]], \" inline-block \", [\"comment\", \"// comment\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for selectors."
  },
  {
    "path": "tests/languages/stylus/string_feature.test",
    "content": "content: \"\"\r\ncontent: \"foo\"\r\ncontent: ''\r\ncontent: 'foo'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"content\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"string\", \"\\\"\\\"\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"content\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"string\", \"\\\"foo\\\"\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"content\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"string\", \"''\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"content\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"string\", \"'foo'\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/stylus/url_feature.test",
    "content": "background: url('foo.png')\r\nbackground: url(\"foo/bar.jpg\")\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"background\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"url\", \"url('foo.png')\"]\r\n\t]],\r\n\t[\"property-declaration\", [\r\n\t\t[\"property\", [\"background\"]],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"url\", \"url(\\\"foo/bar.jpg\\\")\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for urls."
  },
  {
    "path": "tests/languages/stylus/variable-declaration_feature.test",
    "content": "foo = 'bar'\r\na = 4\r\nbar-baz = 5\r\na += 8\r\nurl = \"http://example.com\"\t// comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"foo\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"'bar'\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"a\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"4\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"bar-baz\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"5\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"a\"],\r\n\t\t[\"operator\", \"+=\"],\r\n\t\t[\"number\", \"8\"]\r\n\t]],\r\n\t[\"variable-declaration\", [\r\n\t\t[\"variable\", \"url\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"http://example.com\\\"\"],\r\n\t\t[\"comment\", \"// comment\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variable declarations."
  },
  {
    "path": "tests/languages/stylus+pug/stylus_inclusion.test",
    "content": ":stylus\r\n  font-size = 14px\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-stylus\", [\r\n\t\t[\"filter-name\", \":stylus\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"variable-declaration\", [\r\n\t\t\t\t[\"variable\", \"font-size\"],\r\n\t\t\t\t[\"operator\", \"=\"],\r\n\t\t\t\t[\"number\", \"14\"],\r\n\t\t\t\t[\"unit\", \"px\"]\r\n\t\t\t]]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for stylus filter in pug.\r\n"
  },
  {
    "path": "tests/languages/supercollider/boolean_feature.test",
    "content": "true\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n"
  },
  {
    "path": "tests/languages/supercollider/char_feature.test",
    "content": "$A\n$B\n$C\n$.\n$$\n\n$\\t  // tab (horizontal tab)\n$\\f  // form feed\n$\\v  // vertical tab\n$\\n  // newline (linefeed)\n$\\r  // return\n$\\\\  // backslash`\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"$A\"],\n\t[\"char\", \"$B\"],\n\t[\"char\", \"$C\"],\n\t[\"char\", \"$.\"],\n\t[\"char\", \"$$\"],\n\n\t[\"char\", \"$\\\\t\"], [\"comment\", \"// tab (horizontal tab)\"],\n\t[\"char\", \"$\\\\f\"], [\"comment\", \"// form feed\"],\n\t[\"char\", \"$\\\\v\"], [\"comment\", \"// vertical tab\"],\n\t[\"char\", \"$\\\\n\"], [\"comment\", \"// newline (linefeed)\"],\n\t[\"char\", \"$\\\\r\"], [\"comment\", \"// return\"],\n\t[\"char\", \"$\\\\\\\\\"], [\"comment\", \"// backslash`\"]\n]\n"
  },
  {
    "path": "tests/languages/supercollider/class-name_feature.test",
    "content": "Foo\nSynthDef\nSet[]\nList[]\n\n----------------------------------------------------\n\n[\n\t[\"class-name\", \"Foo\"],\n\t[\"class-name\", \"SynthDef\"],\n\t[\"class-name\", \"Set\"], [\"punctuation\", \"[\"], [\"punctuation\", \"]\"],\n\t[\"class-name\", \"List\"], [\"punctuation\", \"[\"], [\"punctuation\", \"]\"]\n]\n"
  },
  {
    "path": "tests/languages/supercollider/comment_feature.test",
    "content": "// single line comment\n\n/*\n    multi\n    line\n    comment\n*/\n\n/* Unlike C, you can have /* nested */ comments */\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// single line comment\"],\n\n\t[\"comment\", \"/*\\r\\n    multi\\r\\n    line\\r\\n    comment\\r\\n*/\"],\n\n\t[\"comment\", \"/* Unlike C, you can have /* nested */ comments */\"]\n]\n"
  },
  {
    "path": "tests/languages/supercollider/keyword_feature.test",
    "content": "_\narg\nclassvar\nconst\nnil\nvar\nwhile\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"_\"],\n\t[\"keyword\", \"arg\"],\n\t[\"keyword\", \"classvar\"],\n\t[\"keyword\", \"const\"],\n\t[\"keyword\", \"nil\"],\n\t[\"keyword\", \"var\"],\n\t[\"keyword\", \"while\"]\n]\n"
  },
  {
    "path": "tests/languages/supercollider/label_feature.test",
    "content": "foo(a: 5, bar: 7)\n\n----------------------------------------------------\n\n[\n\t\"foo\",\n\t[\"punctuation\", \"(\"],\n\t[\"label\", \"a\"],\n\t[\"punctuation\", \":\"],\n\t[\"number\", \"5\"],\n\t[\"punctuation\", \",\"],\n\t[\"label\", \"bar\"],\n\t[\"punctuation\", \":\"],\n\t[\"number\", \"7\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/supercollider/number_feature.test",
    "content": "-13\n666\n2112\n96\n0xa    // 10\n-0xd   // -13\n0x29A  // 666\n0x840  // 2112\n0x60   // 96\n\n0.39\n98.6\n1.0\n-0.5\n1.2e4\n1E-4\n\npi\n2pi\n0.5pi\n-0.25pi\n\ninf   // and beyond!\n-inf\n\n16rF // 15\n16ra9 // 169\n36rZIGZAG // 2147341480\n2r01101011\n12r4a.abc // wrong\n12r4a.ABC // works\n12r4A.ABC // better\n\n2s == 2.1  // scale degree two, sharp\n2b == 1.9  // scale degree two, flat\n2ss == 2.2 // scale degree two, double sharp\n2bb == 1.8 // scale degree two, double flat\n2ssss == 2.4\n2bbbb == 1.6\n-2s == -1.9\n-2b == -2.1\n-2ss == -1.8\n-2bb == -2.2\n\n2b50 == 1.95 // scale degree two, fifty cents flat\n2s204 == 2.204 // scale degree two, 204 cents sharp\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"-\"], [\"number\", \"13\"],\n\t[\"number\", \"666\"],\n\t[\"number\", \"2112\"],\n\t[\"number\", \"96\"],\n\t[\"number\", \"0xa\"], [\"comment\", \"// 10\"],\n\t[\"operator\", \"-\"], [\"number\", \"0xd\"], [\"comment\", \"// -13\"],\n\t[\"number\", \"0x29A\"], [\"comment\", \"// 666\"],\n\t[\"number\", \"0x840\"], [\"comment\", \"// 2112\"],\n\t[\"number\", \"0x60\"], [\"comment\", \"// 96\"],\n\n\t[\"number\", \"0.39\"],\n\t[\"number\", \"98.6\"],\n\t[\"number\", \"1.0\"],\n\t[\"operator\", \"-\"], [\"number\", \"0.5\"],\n\t[\"number\", \"1.2e4\"],\n\t[\"number\", \"1E-4\"],\n\n\t[\"number\", \"pi\"],\n\t[\"number\", \"2pi\"],\n\t[\"number\", \"0.5pi\"],\n\t[\"operator\", \"-\"], [\"number\", \"0.25pi\"],\n\n\t[\"number\", \"inf\"], [\"comment\", \"// and beyond!\"],\n\t[\"operator\", \"-\"], [\"number\", \"inf\"],\n\n\t[\"number\", \"16rF\"], [\"comment\", \"// 15\"],\n\t[\"number\", \"16ra9\"], [\"comment\", \"// 169\"],\n\t[\"number\", \"36rZIGZAG\"], [\"comment\", \"// 2147341480\"],\n\t[\"number\", \"2r01101011\"],\n\t[\"number\", \"12r4a.abc\"], [\"comment\", \"// wrong\"],\n\t[\"number\", \"12r4a.ABC\"], [\"comment\", \"// works\"],\n\t[\"number\", \"12r4A.ABC\"], [\"comment\", \"// better\"],\n\n\t[\"number\", \"2s\"],\n\t[\"operator\", \"==\"],\n\t[\"number\", \"2.1\"],\n\t[\"comment\", \"// scale degree two, sharp\"],\n\n\t[\"number\", \"2b\"],\n\t[\"operator\", \"==\"],\n\t[\"number\", \"1.9\"],\n\t[\"comment\", \"// scale degree two, flat\"],\n\n\t[\"number\", \"2ss\"],\n\t[\"operator\", \"==\"],\n\t[\"number\", \"2.2\"],\n\t[\"comment\", \"// scale degree two, double sharp\"],\n\n\t[\"number\", \"2bb\"],\n\t[\"operator\", \"==\"],\n\t[\"number\", \"1.8\"],\n\t[\"comment\", \"// scale degree two, double flat\"],\n\n\t[\"number\", \"2ssss\"],\n\t[\"operator\", \"==\"],\n\t[\"number\", \"2.4\"],\n\n\t[\"number\", \"2bbbb\"],\n\t[\"operator\", \"==\"],\n\t[\"number\", \"1.6\"],\n\n\t[\"operator\", \"-\"],\n\t[\"number\", \"2s\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"1.9\"],\n\n\t[\"operator\", \"-\"],\n\t[\"number\", \"2b\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"2.1\"],\n\n\t[\"operator\", \"-\"],\n\t[\"number\", \"2ss\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"1.8\"],\n\n\t[\"operator\", \"-\"],\n\t[\"number\", \"2bb\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"-\"],\n\t[\"number\", \"2.2\"],\n\n\t[\"number\", \"2b50\"],\n\t[\"operator\", \"==\"],\n\t[\"number\", \"1.95\"],\n\t[\"comment\", \"// scale degree two, fifty cents flat\"],\n\n\t[\"number\", \"2s204\"],\n\t[\"operator\", \"==\"],\n\t[\"number\", \"2.204\"],\n\t[\"comment\", \"// scale degree two, 204 cents sharp\"]\n]\n"
  },
  {
    "path": "tests/languages/supercollider/operator_feature.test",
    "content": "+ - * / % **\n& | << >> +>>\n\n< <= > => == != === !==\n|==| |!=|\n&& ||\n\n++ +++ @ @@ @|@ |@|\n& | - --\n\n<< <<* <<< <<<*\n? ?? !?\n\n! -> <! <>\n\n.. ...\n#\n=\n`\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"**\"],\n\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \">>\"],\n\t[\"operator\", \"+>>\"],\n\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"=>\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"===\"],\n\t[\"operator\", \"!==\"],\n\n\t[\"operator\", \"|==|\"],\n\t[\"operator\", \"|!=|\"],\n\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\n\t[\"operator\", \"++\"],\n\t[\"operator\", \"+++\"],\n\t[\"operator\", \"@\"],\n\t[\"operator\", \"@@\"],\n\t[\"operator\", \"@|@\"],\n\t[\"operator\", \"|@|\"],\n\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"--\"],\n\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \"<<*\"],\n\t[\"operator\", \"<<<\"],\n\t[\"operator\", \"<<<*\"],\n\n\t[\"operator\", \"?\"],\n\t[\"operator\", \"??\"],\n\t[\"operator\", \"!?\"],\n\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"->\"],\n\t[\"operator\", \"<!\"],\n\t[\"operator\", \"<>\"],\n\n\t[\"operator\", \"..\"], [\"operator\", \"...\"],\n\t[\"operator\", \"#\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"`\"]\n]\n"
  },
  {
    "path": "tests/languages/supercollider/punctuation_feature.test",
    "content": "( ) [ ] { }\n, ; . :\n\n#[ ] #{ }\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"punctuation\", \"#[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"#{\"],\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/supercollider/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"\\\"\"\n\"\nf\no\no\n\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"\\\\\\\"\\\"\"],\n\t[\"string\", \"\\\"\\r\\nf\\r\\no\\r\\no\\r\\n\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/supercollider/symbol_feature.test",
    "content": "\\x\n\\aiff\n\\Big_Swifty_And_Assoc\n\n'x'\n'aiff'\n'BigSwiftyAndAssoc'\n'nowhere here'\n'somewhere there'\n'.+o*o+.'\n'\\'symbol_within_a_symbol\\''\n\n----------------------------------------------------\n\n[\n\t[\"symbol\", \"\\\\x\"],\n\t[\"symbol\", \"\\\\aiff\"],\n\t[\"symbol\", \"\\\\Big_Swifty_And_Assoc\"],\n\n\t[\"symbol\", \"'x'\"],\n\t[\"symbol\", \"'aiff'\"],\n\t[\"symbol\", \"'BigSwiftyAndAssoc'\"],\n\t[\"symbol\", \"'nowhere here'\"],\n\t[\"symbol\", \"'somewhere there'\"],\n\t[\"symbol\", \"'.+o*o+.'\"],\n\t[\"symbol\", \"'\\\\'symbol_within_a_symbol\\\\''\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/attribute_feature.test",
    "content": "@IBOutlet\n@IBDesignable\n@IBAction\n@IBInspectable\n@class_protocol\n@exported\n@globalActor\n@MainActor\n@noreturn\n@NSCopying\n@NSManaged\n@objc\n@propertyWrapper\n@UIApplicationMain\n@auto_closure\n\n@SomeCustomName\n\n----------------------------------------------------\n\n[\n\t[\"attribute\", \"@IBOutlet\"],\n\t[\"attribute\", \"@IBDesignable\"],\n\t[\"attribute\", \"@IBAction\"],\n\t[\"attribute\", \"@IBInspectable\"],\n\t[\"attribute\", \"@class_protocol\"],\n\t[\"attribute\", \"@exported\"],\n\t[\"attribute\", \"@globalActor\"],\n\t[\"attribute\", \"@MainActor\"],\n\t[\"attribute\", \"@noreturn\"],\n\t[\"attribute\", \"@NSCopying\"],\n\t[\"attribute\", \"@NSManaged\"],\n\t[\"attribute\", \"@objc\"],\n\t[\"attribute\", \"@propertyWrapper\"],\n\t[\"attribute\", \"@UIApplicationMain\"],\n\t[\"attribute\", \"@auto_closure\"],\n\n\t[\"attribute\", \"@SomeCustomName\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/class-name_feature.test",
    "content": "struct SomeStructure {}\nenum SomeEnumeration {}\nclass SomeClass: SomeSuperclass {\n    class var overrideableComputedTypeProperty: Int {\n        return 107\n    }\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"struct\"],\n\t[\"class-name\", \"SomeStructure\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"enum\"],\n\t[\"class-name\", \"SomeEnumeration\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"SomeClass\"],\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"SomeSuperclass\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"keyword\", \"var\"],\n\t\" overrideableComputedTypeProperty\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"Int\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"return\"],\n\t[\"number\", \"107\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/comment_feature.test",
    "content": "// foo\n/**/\n/* foo */\n/*\n foo\n*/\n\n/*\n/*\n foo\n*/\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// foo\"],\n\t[\"comment\", \"/**/\"],\n\t[\"comment\", \"/* foo */\"],\n\t[\"comment\", \"/*\\r\\n foo\\r\\n*/\"],\n\n\t[\"comment\", \"/*\\r\\n/*\\r\\n foo\\r\\n*/\\r\\n*/\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/constant_feature.test",
    "content": "nil\r\nAB\r\nFOO_BAR\r\nkAb\r\nkFoo_bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"nil\", \"nil\"],\r\n\t[\"constant\", \"AB\"],\r\n\t[\"constant\", \"FOO_BAR\"],\r\n\t[\"constant\", \"kAb\"],\r\n\t[\"constant\", \"kFoo_bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants.\r\n"
  },
  {
    "path": "tests/languages/swift/directive_feature.test",
    "content": "#if os(tvOS)\n#if !DEBUG && ENABLE_INTERNAL_TOOLS\n#if SWIFTUI_PROFILE\n#if compiler(>=5)\n#if compiler(>=5) && swift(<5)\n\n#elseif compiler(>=5)\n#else\n#endif\n\n#sourceLocation(file: \"foo\", line: 42)\n#sourceLocation()\n\n#error(\"error message\")\n#warning(\"warning message\")\n\n#available(iOS 13, *)\n\n#selector(SomeClass.doSomething(_:))\n\n#keyPath(SomeClass.someProperty)\n\n----------------------------------------------------\n\n[\n\t[\"directive\", [\n\t\t[\"directive-name\", \"#if\"],\n\t\t\" os\",\n\t\t[\"punctuation\", \"(\"],\n\t\t\"tvOS\",\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"directive\", [\n\t\t[\"directive-name\", \"#if\"],\n\t\t[\"operator\", \"!\"],\n\t\t\"DEBUG \",\n\t\t[\"operator\", \"&&\"],\n\t\t\" ENABLE_INTERNAL_TOOLS\"\n\t]],\n\t[\"directive\", [\n\t\t[\"directive-name\", \"#if\"],\n\t\t\" SWIFTUI_PROFILE\"\n\t]],\n\t[\"directive\", [\n\t\t[\"directive-name\", \"#if\"],\n\t\t\" compiler\",\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"operator\", \">=\"],\n\t\t[\"number\", \"5\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"directive\", [\n\t\t[\"directive-name\", \"#if\"],\n\t\t\" compiler\",\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"operator\", \">=\"],\n\t\t[\"number\", \"5\"],\n\t\t[\"punctuation\", \")\"],\n\t\t[\"operator\", \"&&\"],\n\t\t\" swift\",\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"operator\", \"<\"],\n\t\t[\"number\", \"5\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"directive\", [\n\t\t[\"directive-name\", \"#elseif\"],\n\t\t\" compiler\",\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"operator\", \">=\"],\n\t\t[\"number\", \"5\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\t[\"directive\", [\n\t\t[\"directive-name\", \"#else\"]\n\t]],\n\t[\"directive\", [\n\t\t[\"directive-name\", \"#endif\"]\n\t]],\n\n\t[\"other-directive\", \"#sourceLocation\"],\n\t[\"punctuation\", \"(\"],\n\t\"file\",\n\t[\"punctuation\", \":\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"foo\\\"\"]\n\t]],\n\t[\"punctuation\", \",\"],\n\t\" line\",\n\t[\"punctuation\", \":\"],\n\t[\"number\", \"42\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"other-directive\", \"#sourceLocation\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"other-directive\", \"#error\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"error message\\\"\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\n\t[\"other-directive\", \"#warning\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"warning message\\\"\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\n\t[\"other-directive\", \"#available\"],\n\t[\"punctuation\", \"(\"],\n\t\"iOS \",\n\t[\"number\", \"13\"],\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \"*\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"other-directive\", \"#selector\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", \"SomeClass\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"doSomething\"],\n\t[\"punctuation\", \"(\"],\n\t[\"omit\", \"_\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"other-directive\", \"#keyPath\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", \"SomeClass\"],\n\t[\"punctuation\", \".\"],\n\t\"someProperty\",\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/function_feature.test",
    "content": "func greetAgain(person: String) -> String {\n    return \"Hello again, \" + person + \"!\"\n}\nprint(greetAgain(person: \"Anna\"))\nfunc someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {\n    // function body goes here\n}\n\n\n// none of the below are functions\nsubscript(index: Int) -> Int {\n    get {}\n    set(newValue) {}\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"func\"],\n\t[\"function-definition\", \"greetAgain\"],\n\t[\"punctuation\", \"(\"],\n\t\"person\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"String\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"->\"],\n\t[\"class-name\", \"String\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"return\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"Hello again, \\\"\"]\n\t]],\n\t[\"operator\", \"+\"],\n\t\" person \",\n\t[\"operator\", \"+\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"!\\\"\"]\n\t]],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"function\", \"print\"],\n\t[\"punctuation\", \"(\"],\n\t[\"function\", \"greetAgain\"],\n\t[\"punctuation\", \"(\"],\n\t\"person\",\n\t[\"punctuation\", \":\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"Anna\\\"\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"func\"],\n\t[\"function-definition\", \"someFunction\"],\n\t[\"operator\", \"<\"],\n\t[\"class-name\", \"T\"],\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"SomeClass\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"U\"],\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"SomeProtocol\"],\n\t[\"operator\", \">\"],\n\t[\"punctuation\", \"(\"],\n\t\"someT\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"T\"],\n\t[\"punctuation\", \",\"],\n\t\" someU\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"U\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"comment\", \"// function body goes here\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"comment\", \"// none of the below are functions\"],\n\n\t[\"keyword\", \"subscript\"],\n\t[\"punctuation\", \"(\"],\n\t\"index\",\n\t[\"punctuation\", \":\"],\n\t[\"class-name\", \"Int\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"->\"],\n\t[\"class-name\", \"Int\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"get\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"set\"],\n\t[\"punctuation\", \"(\"],\n\t\"newValue\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/keyword_feature.test",
    "content": "Any\r\nProtocol\r\nSelf\r\nType\r\nactor\r\nas\r\nassignment\r\nassociatedtype\r\nassociativity\r\nasync\r\nawait\r\nbreak;\r\ncase\r\ncatch\r\nclass;\r\ncontinue;\r\nconvenience\r\ndefault\r\ndefer\r\ndeinit\r\ndidSet\r\ndo\r\ndynamic\r\nelse\r\nenum\r\nextension\r\nfallthrough\r\nfileprivate\r\nfinal\r\nfor\r\nfunc;\r\nget\r\nguard\r\nhigherThan\r\nif\r\nimport\r\nin\r\nindirect\r\ninfix\r\ninit\r\ninout\r\ninternal\r\nis\r\nisolated\r\nlazy\r\nleft\r\nlet\r\nlowerThan\r\nmutating\r\nnone\r\nnonisolated\r\nnonmutating\r\nopen\r\noperator\r\noptional\r\noverride\r\npostfix\r\nprecedencegroup\r\nprefix\r\nprivate\r\nprotocol\r\npublic\r\nrepeat\r\nrequired\r\nrethrows\r\nreturn\r\nright\r\nsafe\r\nself\r\nset\r\nsome\r\nstatic\r\nstruct\r\nsubscript\r\nsuper\r\nswitch\r\nthrow\r\nthrows\r\ntry\r\ntypealias\r\nunowned\r\nunsafe\r\nvar\r\nweak\r\nwhere\r\nwhile\r\nwillSet\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"Any\"],\r\n\t[\"keyword\", \"Protocol\"],\r\n\t[\"keyword\", \"Self\"],\r\n\t[\"keyword\", \"Type\"],\r\n\t[\"keyword\", \"actor\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"assignment\"],\r\n\t[\"keyword\", \"associatedtype\"],\r\n\t[\"keyword\", \"associativity\"],\r\n\t[\"keyword\", \"async\"],\r\n\t[\"keyword\", \"await\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"convenience\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"defer\"],\r\n\t[\"keyword\", \"deinit\"],\r\n\t[\"keyword\", \"didSet\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"dynamic\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"extension\"],\r\n\t[\"keyword\", \"fallthrough\"],\r\n\t[\"keyword\", \"fileprivate\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"func\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"keyword\", \"guard\"],\r\n\t[\"keyword\", \"higherThan\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"indirect\"],\r\n\t[\"keyword\", \"infix\"],\r\n\t[\"keyword\", \"init\"],\r\n\t[\"keyword\", \"inout\"],\r\n\t[\"keyword\", \"internal\"],\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"isolated\"],\r\n\t[\"keyword\", \"lazy\"],\r\n\t[\"keyword\", \"left\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"lowerThan\"],\r\n\t[\"keyword\", \"mutating\"],\r\n\t[\"keyword\", \"none\"],\r\n\t[\"keyword\", \"nonisolated\"],\r\n\t[\"keyword\", \"nonmutating\"],\r\n\t[\"keyword\", \"open\"],\r\n\t[\"keyword\", \"operator\"],\r\n\t[\"keyword\", \"optional\"],\r\n\t[\"keyword\", \"override\"],\r\n\t[\"keyword\", \"postfix\"],\r\n\t[\"keyword\", \"precedencegroup\"],\r\n\t[\"keyword\", \"prefix\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protocol\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"repeat\"],\r\n\t[\"keyword\", \"required\"],\r\n\t[\"keyword\", \"rethrows\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"right\"],\r\n\t[\"keyword\", \"safe\"],\r\n\t[\"keyword\", \"self\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"keyword\", \"some\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"subscript\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"throws\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"typealias\"],\r\n\t[\"keyword\", \"unowned\"],\r\n\t[\"keyword\", \"unsafe\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"weak\"],\r\n\t[\"keyword\", \"where\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"willSet\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/swift/label_feature.test",
    "content": "gameLoop: while square != finalSquare {\n    break gameLoop\n    continue gameLoop\n}\n\n----------------------------------------------------\n\n[\n\t[\"label\", \"gameLoop\"],\n\t[\"punctuation\", \":\"],\n\t[\"keyword\", \"while\"],\n\t\" square \",\n\t[\"operator\", \"!=\"],\n\t\" finalSquare \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"break\"],\n\t[\"label\", \" gameLoop\"],\n\n\t[\"keyword\", \"continue\"],\n\t[\"label\", \" gameLoop\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/literal_feature.test",
    "content": "#file\n#fileID\n#filePath\n#line\n#column\n#function\n#dsohandle\n\n#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)\n#fileLiteral(resourceName: \"foo\")\n#imageLiteral(resourceName: \"foo\")\n\n----------------------------------------------------\n\n[\n\t[\"literal\", \"#file\"],\n\t[\"literal\", \"#fileID\"],\n\t[\"literal\", \"#filePath\"],\n\t[\"literal\", \"#line\"],\n\t[\"literal\", \"#column\"],\n\t[\"literal\", \"#function\"],\n\t[\"literal\", \"#dsohandle\"],\n\n\t[\"literal\", \"#colorLiteral\"],\n\t[\"punctuation\", \"(\"],\n\t\"red\",\n\t[\"punctuation\", \":\"],\n\t[\"number\", \"1.0\"],\n\t[\"punctuation\", \",\"],\n\t\" green\",\n\t[\"punctuation\", \":\"],\n\t[\"number\", \"1.0\"],\n\t[\"punctuation\", \",\"],\n\t\" blue\",\n\t[\"punctuation\", \":\"],\n\t[\"number\", \"1.0\"],\n\t[\"punctuation\", \",\"],\n\t\" alpha\",\n\t[\"punctuation\", \":\"],\n\t[\"number\", \"1.0\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"literal\", \"#fileLiteral\"],\n\t[\"punctuation\", \"(\"],\n\t\"resourceName\",\n\t[\"punctuation\", \":\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"foo\\\"\"]\n\t]],\n\t[\"punctuation\", \")\"],\n\n\t[\"literal\", \"#imageLiteral\"],\n\t[\"punctuation\", \"(\"],\n\t\"resourceName\",\n\t[\"punctuation\", \":\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"foo\\\"\"]\n\t]],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/number_feature.test",
    "content": "42\r\n42_000\r\n3.1415_9\r\n4.2e14\r\n0xBaf_Face\r\n0xFF47.AB_61p2\r\n0b0000_1111\r\n0o147_654\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"42_000\"],\r\n\t[\"number\", \"3.1415_9\"],\r\n\t[\"number\", \"4.2e14\"],\r\n\t[\"number\", \"0xBaf_Face\"],\r\n\t[\"number\", \"0xFF47.AB_61p2\"],\r\n\t[\"number\", \"0b0000_1111\"],\r\n\t[\"number\", \"0o147_654\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal, hexadecimal, octal and binary numbers."
  },
  {
    "path": "tests/languages/swift/omit_feature.test",
    "content": "_\n\n----------------------------------------------------\n\n[\n\t[\"omit\", \"_\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/operator_feature.test",
    "content": "+ - * / %\n+= -= *= /= %=\n\n~ & | ^ << >>\n~= &= |= ^= <<= >>=\n\n&+ &- &* &<< &>>\n&+= &-= &*= &<<= &>>=\n\n=\n== != === !== <= >= < >\n! && ||\n\n..< ...\n\n->\n\n??\n\n// custom operators\n+++\nprefix func +++ (vector: inout Vector2D) -> Vector2D {}\n\n// dot operators (SIMD)\n.!= .== .< .> .<= .>=\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"%=\"],\n\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \">>\"],\n\n\t[\"operator\", \"~=\"],\n\t[\"operator\", \"&=\"],\n\t[\"operator\", \"|=\"],\n\t[\"operator\", \"^=\"],\n\t[\"operator\", \"<<=\"],\n\t[\"operator\", \">>=\"],\n\n\t[\"operator\", \"&+\"],\n\t[\"operator\", \"&-\"],\n\t[\"operator\", \"&*\"],\n\t[\"operator\", \"&<<\"],\n\t[\"operator\", \"&>>\"],\n\n\t[\"operator\", \"&+=\"],\n\t[\"operator\", \"&-=\"],\n\t[\"operator\", \"&*=\"],\n\t[\"operator\", \"&<<=\"],\n\t[\"operator\", \"&>>=\"],\n\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"===\"],\n\t[\"operator\", \"!==\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"],\n\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"||\"],\n\n\t[\"operator\", \"..<\"], [\"operator\", \"...\"],\n\n\t[\"operator\", \"->\"],\n\n\t[\"operator\", \"??\"],\n\n\t[\"comment\", \"// custom operators\"],\n\n\t[\"operator\", \"+++\"],\n\n\t[\"keyword\", \"prefix\"],\n\t[\"keyword\", \"func\"],\n\t[\"operator\", \"+++\"],\n\t[\"punctuation\", \"(\"],\n\t\"vector\",\n\t[\"punctuation\", \":\"],\n\t[\"keyword\", \"inout\"],\n\t[\"class-name\", \"Vector2D\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"->\"],\n\t[\"class-name\", \"Vector2D\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"comment\", \"// dot operators (SIMD)\"],\n\n\t[\"operator\", \".!=\"],\n\t[\"operator\", \".==\"],\n\t[\"operator\", \".<\"],\n\t[\"operator\", \".>\"],\n\t[\"operator\", \".<=\"],\n\t[\"operator\", \".>=\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/punctuation_feature.test",
    "content": "{ } [ ] ( )\n; , . :\n\\\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"punctuation\", \"\\\\\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/short-argument_feature.test",
    "content": "reversedNames = names.sorted(by: { $0 > $1 } )\n\n----------------------------------------------------\n\n[\n\t\"reversedNames \",\n\t[\"operator\", \"=\"],\n\t\" names\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"sorted\"],\n\t[\"punctuation\", \"(\"],\n\t\"by\",\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"{\"],\n\t[\"short-argument\", \"$0\"],\n\t[\"operator\", \">\"],\n\t[\"short-argument\", \"$1\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/swift/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n\"foo\\\r\nbar\"\r\n\r\n\"foo /* not a comment */ bar\"\r\n\"foo\\\r\n/* not a comment */\\\r\nbar\"\r\n\r\nlet softWrappedQuotation = \"\"\"\r\nThe White Rabbit put on his spectacles.  \"Where shall I begin, \\\r\nplease your Majesty?\" he asked.\r\n\r\n\"Begin at the beginning,\" the King said gravely, \"and go on \\\r\ntill you come to the end; then stop.\"\r\n\"\"\"\r\n\r\nlet threeMoreDoubleQuotationMarks = #\"\"\"\r\nHere are three more double quotes: \"\"\"\r\n\"\"\"#\r\n#\"Write an interpolated string in Swift using \\(multiplier).\"#\r\n\r\n\r\n\"foo \\(42)\"\r\n\"foo \\(f(\"bar\"))\"\r\n\"\\(multiplier) times 2.5 is \\(Double(multiplier) * 2.5)\"\r\n#\"6 times 7 is \\#(6 * 7).\"#\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"foo\"],\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t[\"string\", \"\\r\\nbar\\\"\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"foo /* not a comment */ bar\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"foo\"],\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t[\"string\", \"\\r\\n/* not a comment */\"],\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t[\"string\", \"\\r\\nbar\\\"\"]\r\n\t]],\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" softWrappedQuotation \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"\\\"\\\"\\r\\nThe White Rabbit put on his spectacles.  \\\"Where shall I begin, \"],\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t[\"string\", \"\\r\\nplease your Majesty?\\\" he asked.\\r\\n\\r\\n\\\"Begin at the beginning,\\\" the King said gravely, \\\"and go on \"],\r\n\t\t[\"punctuation\", \"\\\\\"],\r\n\t\t[\"string\", \"\\r\\ntill you come to the end; then stop.\\\"\\r\\n\\\"\\\"\\\"\"]\r\n\t]],\r\n\r\n\t[\"keyword\", \"let\"],\r\n\t\" threeMoreDoubleQuotationMarks \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"#\\\"\\\"\\\"\\r\\nHere are three more double quotes: \\\"\\\"\\\"\\r\\n\\\"\\\"\\\"#\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"#\\\"Write an interpolated string in Swift using \\\\(multiplier).\\\"#\"]\r\n\t]],\r\n\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"foo \"],\r\n\t\t[\"interpolation-punctuation\", \"\\\\(\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"number\", \"42\"]\r\n\t\t]],\r\n\t\t[\"interpolation-punctuation\", \")\"],\r\n\t\t[\"string\", \"\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"foo \"],\r\n\t\t[\"interpolation-punctuation\", \"\\\\(\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"function\", \"f\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string-literal\", [\r\n\t\t\t\t[\"string\", \"\\\"bar\\\"\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"interpolation-punctuation\", \")\"],\r\n\t\t[\"string\", \"\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"\\\"\"],\r\n\t\t[\"interpolation-punctuation\", \"\\\\(\"],\r\n\t\t[\"interpolation\", [\"multiplier\"]],\r\n\t\t[\"interpolation-punctuation\", \")\"],\r\n\t\t[\"string\", \" times 2.5 is \"],\r\n\t\t[\"interpolation-punctuation\", \"\\\\(\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"class-name\", \"Double\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"multiplier\",\r\n\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t[\"number\", \"2.5\"]\r\n\t\t]],\r\n\t\t[\"interpolation-punctuation\", \")\"],\r\n\t\t[\"string\", \"\\\"\"]\r\n\t]],\r\n\t[\"string-literal\", [\r\n\t\t[\"string\", \"#\\\"6 times 7 is \"],\r\n\t\t[\"interpolation-punctuation\", \"\\\\#(\"],\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"number\", \"6\"],\r\n\t\t\t[\"operator\", \"*\"],\r\n\t\t\t[\"number\", \"7\"]\r\n\t\t]],\r\n\t\t[\"interpolation-punctuation\", \")\"],\r\n\t\t[\"string\", \".\\\"#\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings and string interpolation.\r\n"
  },
  {
    "path": "tests/languages/systemd/boolean_feature.test",
    "content": "foo=on\nfoo=true\nfoo=yes\nfoo=off\nfoo=false\nfoo=no\n\n----------------------------------------------------\n\n[\n\t[\"key\", \"foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t[\"boolean\", \"on\"]\n\t]],\n\n\t[\"key\", \"foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t[\"boolean\", \"true\"]\n\t]],\n\n\t[\"key\", \"foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t[\"boolean\", \"yes\"]\n\t]],\n\n\t[\"key\", \"foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t[\"boolean\", \"off\"]\n\t]],\n\n\t[\"key\", \"foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t[\"boolean\", \"false\"]\n\t]],\n\n\t[\"key\", \"foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t[\"boolean\", \"no\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/systemd/comment_feature.test",
    "content": "# comment\n; comment\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"# comment\"],\n\t[\"comment\", \"; comment\"]\n]\n"
  },
  {
    "path": "tests/languages/systemd/key_feature.test",
    "content": "foo=\nfoo  =\n\n----------------------------------------------------\n\n[\n\t[\"key\", \"foo\"], [\"punctuation\", \"=\"],\n\t[\"key\", \"foo\"], [\"punctuation\", \"=\"]\n]\n"
  },
  {
    "path": "tests/languages/systemd/section_feature.test",
    "content": "[Section Foo]\n\n----------------------------------------------------\n\n[\n\t[\"section\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"section-name\", \"Section Foo\"],\n\t\t[\"punctuation\", \"]\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/systemd/value_feature.test",
    "content": "foo=  value 2\n\nfoo=\"something\" \"some thing\" \"…\"\nfoo=  \"something\" \"some thing\" \"…\"\nfoo=value 2 \\\n    value 2 continued\n\nfoo=value 3\\\n# this line is ignored\n; this line is ignored too\n       value 3 continued\n\n----------------------------------------------------\n\n[\n\t[\"key\", \"foo\"], [\"punctuation\", \"=\"], [\"value\", [\"value 2\"]],\n\n\t[\"key\", \"foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t[\"quoted\", \"\\\"something\\\"\"],\n\t\t[\"quoted\", \"\\\"some thing\\\"\"],\n\t\t[\"quoted\", \"\\\"…\\\"\"]\n\t]],\n\n\t[\"key\", \"foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t[\"quoted\", \"\\\"something\\\"\"],\n\t\t[\"quoted\", \"\\\"some thing\\\"\"],\n\t\t[\"quoted\", \"\\\"…\\\"\"]\n\t]],\n\n\t[\"key\", \"foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t\"value 2 \", [\"punctuation\", \"\\\\\"],\n\t\t\"\\r\\n    value 2 continued\"\n\t]],\n\n\t[\"key\", \"foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"value\", [\n\t\t\"value 3\", [\"punctuation\", \"\\\\\"],\n\t\t[\"comment\", \"# this line is ignored\"],\n\t\t[\"comment\", \"; this line is ignored too\"],\n\t\t\"\\r\\n       value 3 continued\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/t4-cs/block_class-feature_feature.test",
    "content": "Foo\n<#+\npublic class Bar {}\n#>\n\n----------------------------------------------------\n\n[\n\t\"Foo\\r\\n\",\n\t[\"block\", [\n\t\t[\"class-feature\", [\n\t\t\t[\"delimiter\", \"<#+\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"public\"],\n\t\t\t\t[\"keyword\", \"class\"],\n\t\t\t\t[\"class-name\", [\"Bar\"]],\n\t\t\t\t[\"punctuation\", \"{\"],\n\t\t\t\t[\"punctuation\", \"}\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for class feature control blocks.\n"
  },
  {
    "path": "tests/languages/t4-cs/block_directive_feature.test",
    "content": "<#@ template debug=\"false\" hostspecific=\"false\" language=\"C#\" #>\n<#@ assembly name=\"System\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ output extension=\".cs\" #>\n<#@ include file=\"Foo.t4\" #>\n<#@ CleanupBehavior processor=\"T4VSHost\" CleanupAfterProcessingtemplate=\"true\" #>\n\n----------------------------------------------------\n\n[\n\t[\"block\", [\n\t\t[\"directive\", [\n\t\t\t[\"delimiter\", \"<#@\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"template\"],\n\t\t\t\t[\"attr-name\", \"debug\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"false\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]],\n\t\t\t\t[\"attr-name\", \"hostspecific\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"false\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]],\n\t\t\t\t[\"attr-name\", \"language\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"C#\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\t[\"block\", [\n\t\t[\"directive\", [\n\t\t\t[\"delimiter\", \"<#@\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"assembly\"],\n\t\t\t\t[\"attr-name\", \"name\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"System\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\t[\"block\", [\n\t\t[\"directive\", [\n\t\t\t[\"delimiter\", \"<#@\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"assembly\"],\n\t\t\t\t[\"attr-name\", \"name\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"System.Core\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\t[\"block\", [\n\t\t[\"directive\", [\n\t\t\t[\"delimiter\", \"<#@\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"import\"],\n\t\t\t\t[\"attr-name\", \"namespace\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"System.Linq\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\t[\"block\", [\n\t\t[\"directive\", [\n\t\t\t[\"delimiter\", \"<#@\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"output\"],\n\t\t\t\t[\"attr-name\", \"extension\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\".cs\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\t[\"block\", [\n\t\t[\"directive\", [\n\t\t\t[\"delimiter\", \"<#@\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"include\"],\n\t\t\t\t[\"attr-name\", \"file\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"Foo.t4\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\t[\"block\", [\n\t\t[\"directive\", [\n\t\t\t[\"delimiter\", \"<#@\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"CleanupBehavior\"],\n\t\t\t\t[\"attr-name\", \"processor\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"T4VSHost\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]],\n\t\t\t\t[\"attr-name\", \"CleanupAfterProcessingtemplate\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"true\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for text template directives.\n"
  },
  {
    "path": "tests/languages/t4-cs/block_expression_feature.test",
    "content": "var a = <#= name + \"abc\" #>;\nvar b = new int[] { <#=\n\tString.Join(\", \", number.Select(Transformation))\n\t#> };\n\n----------------------------------------------------\n\n[\n\t\"var a = \",\n\t[\"block\", [\n\t\t[\"expression\", [\n\t\t\t[\"delimiter\", \"<#=\"],\n\t\t\t[\"content\", [\n\t\t\t\t\" name \",\n\t\t\t\t[\"operator\", \"+\"],\n\t\t\t\t[\"string\", \"\\\"abc\\\"\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\t\";\\r\\nvar b = new int[] { \",\n\t[\"block\", [\n\t\t[\"expression\", [\n\t\t\t[\"delimiter\", \"<#=\"],\n\t\t\t[\"content\", [\n\t\t\t\t\"\\r\\n\\tString\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"function\", \"Join\"],\n\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t[\"string\", \"\\\", \\\"\"],\n\t\t\t\t[\"punctuation\", \",\"],\n\t\t\t\t\" number\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t[\"function\", \"Select\"],\n\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t\"Transformation\",\n\t\t\t\t[\"punctuation\", \")\"],\n\t\t\t\t[\"punctuation\", \")\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\t\" };\"\n]\n\n----------------------------------------------------\n\nChecks for expression control blocks.\n"
  },
  {
    "path": "tests/languages/t4-cs/block_standard_feature.test",
    "content": "<#\n\tfor (var i = 0; i < 10; i++)\n\t{\n\t\tif (i % 2 == 0)\n\t\t{\n#>\nThe number <#= i #> is even.\n<#\n\t\t}\n\t}\n#>\n\n----------------------------------------------------\n\n[\n\t[\"block\", [\n\t\t[\"standard\", [\n\t\t\t[\"delimiter\", \"<#\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"for\"],\n\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t[\"class-name\", [\n\t\t\t\t\t[\"keyword\", \"var\"]\n\t\t\t\t]],\n\t\t\t\t\" i \",\n\t\t\t\t[\"operator\", \"=\"],\n\t\t\t\t[\"number\", \"0\"],\n\t\t\t\t[\"punctuation\", \";\"],\n\t\t\t\t\" i \",\n\t\t\t\t[\"operator\", \"<\"],\n\t\t\t\t[\"number\", \"10\"],\n\t\t\t\t[\"punctuation\", \";\"],\n\t\t\t\t\" i\",\n\t\t\t\t[\"operator\", \"++\"],\n\t\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t\t[\"punctuation\", \"{\"],\n\n\t\t\t\t[\"keyword\", \"if\"],\n\t\t\t\t[\"punctuation\", \"(\"],\n\t\t\t\t\"i \",\n\t\t\t\t[\"operator\", \"%\"],\n\t\t\t\t[\"number\", \"2\"],\n\t\t\t\t[\"operator\", \"==\"],\n\t\t\t\t[\"number\", \"0\"],\n\t\t\t\t[\"punctuation\", \")\"],\n\n\t\t\t\t[\"punctuation\", \"{\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\n\t\"\\r\\nThe number \",\n\t[\"block\", [\n\t\t[\"expression\", [\n\t\t\t[\"delimiter\", \"<#=\"],\n\t\t\t[\"content\", [\" i \"]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\t\" is even.\\r\\n\",\n\n\t[\"block\", [\n\t\t[\"standard\", [\n\t\t\t[\"delimiter\", \"<#\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"punctuation\", \"}\"],\n\t\t\t\t[\"punctuation\", \"}\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for standard control blocks.\n"
  },
  {
    "path": "tests/languages/t4-vb/block_feature.test",
    "content": "<#@ template debug=\"false\" hostspecific=\"false\" language=\"VB\" #>\n\n<#+\nPublic Class Bar\nEnd Class\n#>\n\n<#\n\tFor i As Integer = 0 To 9\n\t\tIf i Mod 2 = 0 Then\n#>\nThe number <#= i #> is even.\n<#\n\t\tEnd If\n\tNext i\n#>\n\n----------------------------------------------------\n\n[\n\t[\"block\", [\n\t\t[\"directive\", [\n\t\t\t[\"delimiter\", \"<#@\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"template\"],\n\t\t\t\t[\"attr-name\", \"debug\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"false\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]],\n\t\t\t\t[\"attr-name\", \"hostspecific\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"false\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]],\n\t\t\t\t[\"attr-name\", \"language\"],\n\t\t\t\t[\"attr-value\", [\n\t\t\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\t\t\"VB\",\n\t\t\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"class-feature\", [\n\t\t\t[\"delimiter\", \"<#+\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"Public\"], [\"keyword\", \"Class\"], \" Bar\\r\\n\",\n\t\t\t\t[\"keyword\", \"End\"], [\"keyword\", \"Class\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\n\t[\"block\", [\n\t\t[\"standard\", [\n\t\t\t[\"delimiter\", \"<#\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"For\"],\n\t\t\t\t\" i \",\n\t\t\t\t[\"keyword\", \"As\"],\n\t\t\t\t[\"keyword\", \"Integer\"],\n\t\t\t\t[\"operator\", \"=\"],\n\t\t\t\t[\"number\", \"0\"],\n\t\t\t\t[\"keyword\", \"To\"],\n\t\t\t\t[\"number\", \"9\"],\n\n\t\t\t\t[\"keyword\", \"If\"],\n\t\t\t\t\" i \",\n\t\t\t\t[\"keyword\", \"Mod\"],\n\t\t\t\t[\"number\", \"2\"],\n\t\t\t\t[\"operator\", \"=\"],\n\t\t\t\t[\"number\", \"0\"],\n\t\t\t\t[\"keyword\", \"Then\"]\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\n\t\"\\r\\nThe number \",\n\t[\"block\", [\n\t\t[\"expression\", [\n\t\t\t[\"delimiter\", \"<#=\"],\n\t\t\t[\"content\", [\" i \"]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]],\n\t\" is even.\\r\\n\",\n\n\t[\"block\", [\n\t\t[\"standard\", [\n\t\t\t[\"delimiter\", \"<#\"],\n\t\t\t[\"content\", [\n\t\t\t\t[\"keyword\", \"End\"], [\"keyword\", \"If\"],\n\t\t\t\t[\"keyword\", \"Next\"], \" i\\r\\n\"\n\t\t\t]],\n\t\t\t[\"delimiter\", \"#>\"]\n\t\t]]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for standard control blocks.\n"
  },
  {
    "path": "tests/languages/tap/bail_out_feature.test",
    "content": "Bail out! Couldn't connect to database.\nbail out! Failed to call API.\n\n----------------------------------------------------\n\n[\n\t[\"bailout\", \"Bail out! Couldn't connect to database.\"],\n\t[\"bailout\", \"bail out! Failed to call API.\"]\n]\n\n----------------------------------------------------\n\nChecks bail out\n"
  },
  {
    "path": "tests/languages/tap/directive_feature.test",
    "content": "ok # SKIP test not written\nok 42 this is the description # TODO write test\n\n----------------------------------------------------\n\n[\n\t[\"pass\", \"ok \" ],\n\t[\"directive\", \"# SKIP test not written\"],\n\t[\"pass\", \"ok 42 this is the description \"],\n\t[\"directive\", \"# TODO write test\"]\n]\n\n----------------------------------------------------\n\nChecks directives\n"
  },
  {
    "path": "tests/languages/tap/pass_fail_feature.test",
    "content": "not ok\nnot ok 42 this is the description of the test\nok\nok 42 this is the description of the test\n\n----------------------------------------------------\n\n[\n\t[\"fail\", \"not ok\" ],\n\t[\"fail\", \"not ok 42 this is the description of the test\"],\n\t[\"pass\", \"ok\" ],\n\t[\"pass\", \"ok 42 this is the description of the test\"]\n]\n\n----------------------------------------------------\n\nChecks test pass & fail together correctly\n"
  },
  {
    "path": "tests/languages/tap/plan_feature.test",
    "content": "1..10\n1..10 # directive\n\n----------------------------------------------------\n\n[\n\t[\"plan\", \"1..10\" ],\n\t[\"plan\", \"1..10 # directive\" ]\n]\n\n----------------------------------------------------\n\nChecks TAP plan\n"
  },
  {
    "path": "tests/languages/tap/pragma_feature.test",
    "content": "pragma +strict\npragma -strict\n\n----------------------------------------------------\n\n[\n\t[\"pragma\", \"pragma +strict\"],\n\t[\"pragma\", \"pragma -strict\"]\n]\n\n----------------------------------------------------\n\nChecks pragma\n"
  },
  {
    "path": "tests/languages/tap/subtest_feature.test",
    "content": "# Subtest\n\n----------------------------------------------------\n\n[\n\t[\"subtest\", \"# Subtest\"]\n]\n"
  },
  {
    "path": "tests/languages/tap/version_feature.test",
    "content": "TAP version 13\n\n----------------------------------------------------\n\n[\n\t[\"version\", \"TAP version 13\" ]\n]\n\n----------------------------------------------------\n\nChecks TAP version\r\n"
  },
  {
    "path": "tests/languages/tap/yamlish_feature.test",
    "content": "ok\n    ---\n    message: \"Failed with error 'hostname peebles.example.com not found'\"\n    severity: fail\n    data:\n      got:\n        hostname: 'peebles.example.com'\n        address: ~\n      expected:\n        hostname: 'peebles.example.com'\n        address: '85.193.201.85'\n    ...\n\n----------------------------------------------------\n\n[\n\t[\"pass\", \"ok\"],\n\n\t[\"yamlish\", [\n\t\t[\"punctuation\", \"---\"],\n\n\t\t[\"key\", \"message\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"string\", \"\\\"Failed with error 'hostname peebles.example.com not found'\\\"\"],\n\n\t\t[\"key\", \"severity\"],\n\t\t[\"punctuation\", \":\"],\n\t\t\" fail\\r\\n    \",\n\n\t\t[\"key\", \"data\"],\n\t\t[\"punctuation\", \":\"],\n\n\t\t[\"key\", \"got\"],\n\t\t[\"punctuation\", \":\"],\n\n\t\t[\"key\", \"hostname\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"string\", \"'peebles.example.com'\"],\n\n\t\t[\"key\", \"address\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"null\", \"~\"],\n\n\t\t[\"key\", \"expected\"],\n\t\t[\"punctuation\", \":\"],\n\n\t\t[\"key\", \"hostname\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"string\", \"'peebles.example.com'\"],\n\n\t\t[\"key\", \"address\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"string\", \"'85.193.201.85'\"],\n\n\t\t[\"punctuation\", \"...\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks yaml embedding\n"
  },
  {
    "path": "tests/languages/tcl/builtin_feature.test",
    "content": "proc\r\nreturn\r\nclass\r\nerror\r\neval\r\nexit\r\nfor\r\nforeach\r\nif elseif else\r\nswitch\r\nwhile\r\nbreak\r\ncontinue\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"proc\"],\r\n\t[\"builtin\", \"return\"],\r\n\t[\"builtin\", \"class\"],\r\n\t[\"builtin\", \"error\"],\r\n\t[\"builtin\", \"eval\"],\r\n\t[\"builtin\", \"exit\"],\r\n\t[\"builtin\", \"for\"],\r\n\t[\"builtin\", \"foreach\"],\r\n\t[\"builtin\", \"if\"], [\"builtin\", \"elseif\"], [\"builtin\", \"else\"],\r\n\t[\"builtin\", \"switch\"],\r\n\t[\"builtin\", \"while\"],\r\n\t[\"builtin\", \"break\"],\r\n\t[\"builtin\", \"continue\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for builtins."
  },
  {
    "path": "tests/languages/tcl/comment_feature.test",
    "content": "#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/tcl/function_feature.test",
    "content": "proc foo\r\nproc Foobar\r\nproc foo_bar_42\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"proc\"], [\"function\", \"foo\"],\r\n\t[\"builtin\", \"proc\"], [\"function\", \"Foobar\"],\r\n\t[\"builtin\", \"proc\"], [\"function\", \"foo_bar_42\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/tcl/keyword_feature.test",
    "content": "after\r\nappend\r\napply\r\narray\r\nauto_execok\r\nauto_import\r\nauto_load\r\nauto_mkindex\r\nauto_qualify\r\nauto_reset\r\nautomkindex_old\r\nbgerror\r\nbinary\r\ncatch\r\ncd\r\nchan\r\nclock\r\nclose\r\nconcat\r\ndde\r\ndict\r\nencoding\r\neof\r\nexec\r\nexpr\r\nfblocked\r\nfconfigure\r\nfcopy\r\nfile\r\nfileevent\r\nfilename\r\nflush\r\ngets\r\nglob\r\nhistory\r\nhttp\r\nincr\r\ninfo\r\ninterp\r\njoin\r\nlappend\r\nlassign\r\nlindex\r\nlinsert\r\nlist\r\nllength\r\nload\r\nlrange\r\nlrepeat\r\nlreplace\r\nlreverse\r\nlsearch\r\nlset\r\nlsort\r\nmathfunc\r\nmathop\r\nmemory\r\nmsgcat\r\nnamespace\r\nopen\r\npackage\r\nparray\r\npid\r\npkg_mkIndex\r\nplatform\r\nputs\r\npwd\r\nre_syntax\r\nread\r\nrefchan\r\nregexp\r\nregistry\r\nregsub\r\nrename\r\nSafe_Base\r\nscan\r\nseek\r\nset\r\nsocket\r\nsource\r\nsplit\r\nstring\r\nsubst\r\nTcl\r\ntcl_endOfWord\r\ntcl_findLibrary\r\ntclstartOfNextWord\r\ntclstartOfPreviousWord\r\ntclwordBreakAfter\r\ntclwordBreakBefore\r\ntcltest\r\ntclvars\r\ntell\r\ntime\r\ntm\r\ntrace\r\nunknown\r\nunload\r\nunset\r\nupdate\r\nuplevel\r\nvwait\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"after\"],\r\n\t[\"keyword\", \"append\"],\r\n\t[\"keyword\", \"apply\"],\r\n\t[\"keyword\", \"array\"],\r\n\t[\"keyword\", \"auto_execok\"],\r\n\t[\"keyword\", \"auto_import\"],\r\n\t[\"keyword\", \"auto_load\"],\r\n\t[\"keyword\", \"auto_mkindex\"],\r\n\t[\"keyword\", \"auto_qualify\"],\r\n\t[\"keyword\", \"auto_reset\"],\r\n\t[\"keyword\", \"automkindex_old\"],\r\n\t[\"keyword\", \"bgerror\"],\r\n\t[\"keyword\", \"binary\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"cd\"],\r\n\t[\"keyword\", \"chan\"],\r\n\t[\"keyword\", \"clock\"],\r\n\t[\"keyword\", \"close\"],\r\n\t[\"keyword\", \"concat\"],\r\n\t[\"keyword\", \"dde\"],\r\n\t[\"keyword\", \"dict\"],\r\n\t[\"keyword\", \"encoding\"],\r\n\t[\"keyword\", \"eof\"],\r\n\t[\"keyword\", \"exec\"],\r\n\t[\"keyword\", \"expr\"],\r\n\t[\"keyword\", \"fblocked\"],\r\n\t[\"keyword\", \"fconfigure\"],\r\n\t[\"keyword\", \"fcopy\"],\r\n\t[\"keyword\", \"file\"],\r\n\t[\"keyword\", \"fileevent\"],\r\n\t[\"keyword\", \"filename\"],\r\n\t[\"keyword\", \"flush\"],\r\n\t[\"keyword\", \"gets\"],\r\n\t[\"keyword\", \"glob\"],\r\n\t[\"keyword\", \"history\"],\r\n\t[\"keyword\", \"http\"],\r\n\t[\"keyword\", \"incr\"],\r\n\t[\"keyword\", \"info\"],\r\n\t[\"keyword\", \"interp\"],\r\n\t[\"keyword\", \"join\"],\r\n\t[\"keyword\", \"lappend\"],\r\n\t[\"keyword\", \"lassign\"],\r\n\t[\"keyword\", \"lindex\"],\r\n\t[\"keyword\", \"linsert\"],\r\n\t[\"keyword\", \"list\"],\r\n\t[\"keyword\", \"llength\"],\r\n\t[\"keyword\", \"load\"],\r\n\t[\"keyword\", \"lrange\"],\r\n\t[\"keyword\", \"lrepeat\"],\r\n\t[\"keyword\", \"lreplace\"],\r\n\t[\"keyword\", \"lreverse\"],\r\n\t[\"keyword\", \"lsearch\"],\r\n\t[\"keyword\", \"lset\"],\r\n\t[\"keyword\", \"lsort\"],\r\n\t[\"keyword\", \"mathfunc\"],\r\n\t[\"keyword\", \"mathop\"],\r\n\t[\"keyword\", \"memory\"],\r\n\t[\"keyword\", \"msgcat\"],\r\n\t[\"keyword\", \"namespace\"],\r\n\t[\"keyword\", \"open\"],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"parray\"],\r\n\t[\"keyword\", \"pid\"],\r\n\t[\"keyword\", \"pkg_mkIndex\"],\r\n\t[\"keyword\", \"platform\"],\r\n\t[\"keyword\", \"puts\"],\r\n\t[\"keyword\", \"pwd\"],\r\n\t[\"keyword\", \"re_syntax\"],\r\n\t[\"keyword\", \"read\"],\r\n\t[\"keyword\", \"refchan\"],\r\n\t[\"keyword\", \"regexp\"],\r\n\t[\"keyword\", \"registry\"],\r\n\t[\"keyword\", \"regsub\"],\r\n\t[\"keyword\", \"rename\"],\r\n\t[\"keyword\", \"Safe_Base\"],\r\n\t[\"keyword\", \"scan\"],\r\n\t[\"keyword\", \"seek\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"keyword\", \"socket\"],\r\n\t[\"keyword\", \"source\"],\r\n\t[\"keyword\", \"split\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"keyword\", \"subst\"],\r\n\t[\"keyword\", \"Tcl\"],\r\n\t[\"keyword\", \"tcl_endOfWord\"],\r\n\t[\"keyword\", \"tcl_findLibrary\"],\r\n\t[\"keyword\", \"tclstartOfNextWord\"],\r\n\t[\"keyword\", \"tclstartOfPreviousWord\"],\r\n\t[\"keyword\", \"tclwordBreakAfter\"],\r\n\t[\"keyword\", \"tclwordBreakBefore\"],\r\n\t[\"keyword\", \"tcltest\"],\r\n\t[\"keyword\", \"tclvars\"],\r\n\t[\"keyword\", \"tell\"],\r\n\t[\"keyword\", \"time\"],\r\n\t[\"keyword\", \"tm\"],\r\n\t[\"keyword\", \"trace\"],\r\n\t[\"keyword\", \"unknown\"],\r\n\t[\"keyword\", \"unload\"],\r\n\t[\"keyword\", \"unset\"],\r\n\t[\"keyword\", \"update\"],\r\n\t[\"keyword\", \"uplevel\"],\r\n\t[\"keyword\", \"vwait\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/tcl/operator_feature.test",
    "content": "+\r\n-\r\n~\r\n! !=\r\n* **\r\n/\r\n%\r\n< <= <<\r\n> >= >>\r\n==\r\n& &&\r\n| ||\r\n?\r\n^\r\neq\r\nne\r\nin\r\nni\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"**\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<<\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \">>\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"&&\"],\r\n\t[\"operator\", \"|\"], [\"operator\", \"||\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"eq\"],\r\n\t[\"operator\", \"ne\"],\r\n\t[\"operator\", \"in\"],\r\n\t[\"operator\", \"ni\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/tcl/punctuation_feature.test",
    "content": "{ } ( ) [ ]\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"]\n]\n"
  },
  {
    "path": "tests/languages/tcl/scope_feature.test",
    "content": "global\r\nupvar\r\nvariable\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"scope\", \"global\"],\r\n\t[\"scope\", \"upvar\"],\r\n\t[\"scope\", \"variable\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for scopes."
  },
  {
    "path": "tests/languages/tcl/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\"fo\\\"o\\\r\nbar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\\\\r\\nbar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/tcl/variable_feature.test",
    "content": "$foo\r\n$Foobar_42\r\n$::foo\r\n$foo::bar42\r\n\r\n${foobar}\r\n\r\nset foo bar\r\nset Foobar_42 baz\r\nset ::foo bar\r\nset foo::bar42 baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t\"$\", [\"variable\", \"foo\"],\r\n\t\"\\r\\n$\", [\"variable\", \"Foobar_42\"],\r\n\t\"\\r\\n$\", [\"variable\", \"::foo\"],\r\n\t\"\\r\\n$\", [\"variable\", \"foo::bar42\"],\r\n\r\n\t\"\\r\\n\\r\\n$\", [\"variable\", \"{foobar}\"],\r\n\r\n\t[\"keyword\", \"set\"], [\"variable\", \"foo\"], \" bar\\r\\n\",\r\n\t[\"keyword\", \"set\"], [\"variable\", \"Foobar_42\"], \" baz\\r\\n\",\r\n\t[\"keyword\", \"set\"], [\"variable\", \"::foo\"], \" bar\\r\\n\",\r\n\t[\"keyword\", \"set\"], [\"variable\", \"foo::bar42\"], \" baz\"\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/textile/acronym_feature.test",
    "content": "CSS(Cascading Style Sheet)\r\nHTML(HyperText Markup Language)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"phrase\", [\r\n\t\t[\"acronym\", [\"CSS\", [\"punctuation\", \"(\"], [\"comment\", \"Cascading Style Sheet\"], [\"punctuation\", \")\"]]],\r\n\t\t[\"acronym\", [\"HTML\", [\"punctuation\", \"(\"], [\"comment\", \"HyperText Markup Language\"], [\"punctuation\", \")\"]]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for acronyms."
  },
  {
    "path": "tests/languages/textile/block-tag_feature.test",
    "content": "h1. Header 1\r\n\r\nh2>. Header 2\r\n\r\nbq. A block quotation\r\n\r\np<. Foo\r\n\r\np=. Bar\r\n\r\np<>. Baz\r\n\r\np(. Foobar\r\nbaz\r\n\r\np))). Foo\r\n\r\nh1(foo). Foo\r\n\r\nh2[en]. Bar\r\n\r\nh3{color: red}. Baz\r\n\r\nh4[fr]{text-decoration:underline;}(#bar). Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"h1\"],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Header 1\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"h2\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Header 2\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"bq\"],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" A block quotation\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"p\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"<\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Foo\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"p\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"=\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Bar\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"p\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Baz\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"p\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Foobar\\r\\nbaz\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"p\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Foo\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"h1\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"foo\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Foo\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"h2\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"lang\", \"en\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Bar\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"h3\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"css\", \"{color: red}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Baz\"\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"block-tag\", [\r\n\t\t\t[\"tag\", \"h4\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"lang\", \"fr\"],\r\n\t\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t\t[\"css\", \"{text-decoration:underline;}\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"#bar\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"]\r\n\t\t]],\r\n\t\t\" Foobar\"\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags at the beginning of a block and alignment modifiers.\r\n"
  },
  {
    "path": "tests/languages/textile/footnote_feature.test",
    "content": "Foo[1]\r\nBar[42]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"phrase\", [\r\n\t\t\"Foo\", [\"footnote\", [[\"punctuation\", \"[\"], \"1\", [\"punctuation\", \"]\"]]],\r\n\t\t\"\\r\\nBar\", [\"footnote\", [[\"punctuation\", \"[\"], \"42\", [\"punctuation\", \"]\"]]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for footnotes."
  },
  {
    "path": "tests/languages/textile/image_feature.test",
    "content": "!foo.png!\r\n!bar.jpg(Foo bar)!\r\n!foo.png!:http://prismjs.com\r\n!bar.jpg(Foo bar)!:http://www.example.com\r\n\r\n!<foo.png! !>bar.jpg!\r\n!(foo)[en]{border:1px solid #ccc}foo.png!\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"phrase\", [\r\n\t\t[\"image\", [\r\n\t\t\t[\"punctuation\", \"!\"],\r\n\t\t\t[\"source\", \"foo.png\"],\r\n\t\t\t[\"punctuation\", \"!\"]\r\n\t\t]],\r\n\t\t[\"image\", [\r\n\t\t\t[\"punctuation\", \"!\"],\r\n\t\t\t[\"source\", \"bar.jpg(Foo bar)\"],\r\n\t\t\t[\"punctuation\", \"!\"]\r\n\t\t]],\r\n\t\t[\"image\", [\r\n\t\t\t[\"punctuation\", \"!\"],\r\n\t\t\t[\"source\", \"foo.png\"],\r\n\t\t\t[\"punctuation\", \"!\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"url\", \"http://prismjs.com\"]\r\n\t\t]],\r\n\t\t[\"image\", [\r\n\t\t\t[\"punctuation\", \"!\"],\r\n\t\t\t[\"source\", \"bar.jpg(Foo bar)\"],\r\n\t\t\t[\"punctuation\", \"!\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"url\", \"http://www.example.com\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"image\", [\r\n\t\t\t[\"punctuation\", \"!\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"<\"]\r\n\t\t\t]],\r\n\t\t\t[\"source\", \"foo.png\"],\r\n\t\t\t[\"punctuation\", \"!\"]\r\n\t\t]],\r\n\t\t[\"image\", [\r\n\t\t\t[\"punctuation\", \"!\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"source\", \"bar.jpg\"],\r\n\t\t\t[\"punctuation\", \"!\"]\r\n\t\t]],\r\n\r\n\t\t[\"image\", [\r\n\t\t\t[\"punctuation\", \"!\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"foo\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"lang\", \"en\"],\r\n\t\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t\t[\"css\", \"{border:1px solid #ccc}\"]\r\n\t\t\t]],\r\n\t\t\t[\"source\", \"foo.png\"],\r\n\t\t\t[\"punctuation\", \"!\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for images.\r\n"
  },
  {
    "path": "tests/languages/textile/inline_feature.test",
    "content": "*bold*\r\n**bold**\r\n_italic_\r\n__italic__\r\n??cite??\r\n@code@\r\n+inserted+\r\n-deleted-\r\n%span%\r\n^superscript^\r\n~subscript~\r\n\r\n*{color:red}bold*\r\n__(foo#bar)[fr]italique__\r\n%{text-decoration:underline}span *[en]bold*%\r\n\r\n*_a_ __b__ ??c?? @d@ +e+ -f- %g% ^h^ ~i~*\r\n**_a_ __b__ ??c?? @d@ +e+ -f- %g% ^h^ ~i~**\r\n_*a* **b** ??c?? @d@ +e+ -f- %g% ^h^ ~i~_\r\n__*a* **b** ??c?? @d@ +e+ -f- %g% ^h^ ~i~__\r\n+*a* **b** _c_ __d__ ??e?? @f@ -g- %h% ^i^ ~j~+\r\n-*a* **b** _c_ __d__ ??e?? @f@ +g+ %h% ^i^ ~j~-\r\n%*a* **b** _c_ __d__ ??e?? @f@ +g+ -h- ^i^ ~j~%\r\n\r\nnot_italic_ _this_either\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"phrase\", [\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t[\"bold\", [\"bold\"]],\r\n\t\t\t[\"punctuation\", \"*\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t[\"bold\", [\"bold\"]],\r\n\t\t\t[\"punctuation\", \"**\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t[\"italic\", [\"italic\"]],\r\n\t\t\t[\"punctuation\", \"_\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t[\"italic\", [\"italic\"]],\r\n\t\t\t[\"punctuation\", \"__\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"??\"],\r\n\t\t\t[\"cite\", \"cite\"],\r\n\t\t\t[\"punctuation\", \"??\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"@\"],\r\n\t\t\t[\"code\", \"code\"],\r\n\t\t\t[\"punctuation\", \"@\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"+\"],\r\n\t\t\t[\"inserted\", [\"inserted\"]],\r\n\t\t\t[\"punctuation\", \"+\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"-\"],\r\n\t\t\t[\"deleted\", [\"deleted\"]],\r\n\t\t\t[\"punctuation\", \"-\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"%\"],\r\n\t\t\t[\"span\", [\"span\"]],\r\n\t\t\t[\"punctuation\", \"%\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"^\"],\r\n\t\t\t\"superscript\",\r\n\t\t\t[\"punctuation\", \"^\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\"subscript\",\r\n\t\t\t[\"punctuation\", \"~\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"css\", \"{color:red}\"]\r\n\t\t\t]],\r\n\t\t\t[\"bold\", [\"bold\"]],\r\n\t\t\t[\"punctuation\", \"*\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"foo#bar\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"lang\", \"fr\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]],\r\n\t\t\t[\"italic\", [\"italique\"]],\r\n\t\t\t[\"punctuation\", \"__\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"%\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"css\", \"{text-decoration:underline}\"]\r\n\t\t\t]],\r\n\t\t\t[\"span\", [\r\n\t\t\t\t\"span \",\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t\t[\"modifier\", [\r\n\t\t\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t\t\t[\"lang\", \"en\"],\r\n\t\t\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t\t\t]],\r\n\t\t\t\t\t[\"bold\", [\"bold\"]],\r\n\t\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"%\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t\t[\"italic\", [\"a\"]],\r\n\t\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t\t\t[\"italic\", [\"b\"]],\r\n\t\t\t\t\t[\"punctuation\", \"__\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"??\"],\r\n\t\t\t\t\t[\"cite\", \"c\"],\r\n\t\t\t\t\t[\"punctuation\", \"??\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"@\"],\r\n\t\t\t\t\t[\"code\", \"d\"],\r\n\t\t\t\t\t[\"punctuation\", \"@\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"+\"],\r\n\t\t\t\t\t[\"inserted\", [\"e\"]],\r\n\t\t\t\t\t[\"punctuation\", \"+\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"-\"],\r\n\t\t\t\t\t[\"deleted\", [\"f\"]],\r\n\t\t\t\t\t[\"punctuation\", \"-\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"%\"],\r\n\t\t\t\t\t[\"span\", [\"g\"]],\r\n\t\t\t\t\t[\"punctuation\", \"%\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"^\"],\r\n\t\t\t\t\t\"h\",\r\n\t\t\t\t\t[\"punctuation\", \"^\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t\t\"i\",\r\n\t\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"*\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t[\"bold\", [\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t\t[\"italic\", [\"a\"]],\r\n\t\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t\t\t[\"italic\", [\"b\"]],\r\n\t\t\t\t\t[\"punctuation\", \"__\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"??\"],\r\n\t\t\t\t\t[\"cite\", \"c\"],\r\n\t\t\t\t\t[\"punctuation\", \"??\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"@\"],\r\n\t\t\t\t\t[\"code\", \"d\"],\r\n\t\t\t\t\t[\"punctuation\", \"@\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"+\"],\r\n\t\t\t\t\t[\"inserted\", [\"e\"]],\r\n\t\t\t\t\t[\"punctuation\", \"+\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"-\"],\r\n\t\t\t\t\t[\"deleted\", [\"f\"]],\r\n\t\t\t\t\t[\"punctuation\", \"-\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"%\"],\r\n\t\t\t\t\t[\"span\", [\"g\"]],\r\n\t\t\t\t\t[\"punctuation\", \"%\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"^\"],\r\n\t\t\t\t\t\"h\",\r\n\t\t\t\t\t[\"punctuation\", \"^\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t\t\"i\",\r\n\t\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"**\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t\t[\"bold\", [\"a\"]],\r\n\t\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t\t[\"bold\", [\"b\"]],\r\n\t\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"??\"],\r\n\t\t\t\t\t[\"cite\", \"c\"],\r\n\t\t\t\t\t[\"punctuation\", \"??\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"@\"],\r\n\t\t\t\t\t[\"code\", \"d\"],\r\n\t\t\t\t\t[\"punctuation\", \"@\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"+\"],\r\n\t\t\t\t\t[\"inserted\", [\"e\"]],\r\n\t\t\t\t\t[\"punctuation\", \"+\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"-\"],\r\n\t\t\t\t\t[\"deleted\", [\"f\"]],\r\n\t\t\t\t\t[\"punctuation\", \"-\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"%\"],\r\n\t\t\t\t\t[\"span\", [\"g\"]],\r\n\t\t\t\t\t[\"punctuation\", \"%\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"^\"],\r\n\t\t\t\t\t\"h\",\r\n\t\t\t\t\t[\"punctuation\", \"^\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t\t\"i\",\r\n\t\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"_\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t[\"italic\", [\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t\t[\"bold\", [\"a\"]],\r\n\t\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t\t[\"bold\", [\"b\"]],\r\n\t\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"??\"],\r\n\t\t\t\t\t[\"cite\", \"c\"],\r\n\t\t\t\t\t[\"punctuation\", \"??\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"@\"],\r\n\t\t\t\t\t[\"code\", \"d\"],\r\n\t\t\t\t\t[\"punctuation\", \"@\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"+\"],\r\n\t\t\t\t\t[\"inserted\", [\"e\"]],\r\n\t\t\t\t\t[\"punctuation\", \"+\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"-\"],\r\n\t\t\t\t\t[\"deleted\", [\"f\"]],\r\n\t\t\t\t\t[\"punctuation\", \"-\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"%\"],\r\n\t\t\t\t\t[\"span\", [\"g\"]],\r\n\t\t\t\t\t[\"punctuation\", \"%\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"^\"],\r\n\t\t\t\t\t\"h\",\r\n\t\t\t\t\t[\"punctuation\", \"^\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t\t\"i\",\r\n\t\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"__\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"+\"],\r\n\t\t\t[\"inserted\", [\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t\t[\"bold\", [\"a\"]],\r\n\t\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t\t[\"bold\", [\"b\"]],\r\n\t\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t\t[\"italic\", [\"c\"]],\r\n\t\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t\t\t[\"italic\", [\"d\"]],\r\n\t\t\t\t\t[\"punctuation\", \"__\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"??\"],\r\n\t\t\t\t\t[\"cite\", \"e\"],\r\n\t\t\t\t\t[\"punctuation\", \"??\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"@\"],\r\n\t\t\t\t\t[\"code\", \"f\"],\r\n\t\t\t\t\t[\"punctuation\", \"@\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"-\"],\r\n\t\t\t\t\t[\"deleted\", [\"g\"]],\r\n\t\t\t\t\t[\"punctuation\", \"-\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"%\"],\r\n\t\t\t\t\t[\"span\", [\"h\"]],\r\n\t\t\t\t\t[\"punctuation\", \"%\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"^\"],\r\n\t\t\t\t\t\"i\",\r\n\t\t\t\t\t[\"punctuation\", \"^\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t\t\"j\",\r\n\t\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"+\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"-\"],\r\n\t\t\t[\"deleted\", [\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t\t[\"bold\", [\"a\"]],\r\n\t\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t\t[\"bold\", [\"b\"]],\r\n\t\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t\t[\"italic\", [\"c\"]],\r\n\t\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t\t\t[\"italic\", [\"d\"]],\r\n\t\t\t\t\t[\"punctuation\", \"__\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"??\"],\r\n\t\t\t\t\t[\"cite\", \"e\"],\r\n\t\t\t\t\t[\"punctuation\", \"??\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"@\"],\r\n\t\t\t\t\t[\"code\", \"f\"],\r\n\t\t\t\t\t[\"punctuation\", \"@\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"+\"],\r\n\t\t\t\t\t[\"inserted\", [\"g\"]],\r\n\t\t\t\t\t[\"punctuation\", \"+\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"%\"],\r\n\t\t\t\t\t[\"span\", [\"h\"]],\r\n\t\t\t\t\t[\"punctuation\", \"%\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"^\"],\r\n\t\t\t\t\t\"i\",\r\n\t\t\t\t\t[\"punctuation\", \"^\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t\t\"j\",\r\n\t\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"-\"]\r\n\t\t]],\r\n\t\t[\"inline\", [\r\n\t\t\t[\"punctuation\", \"%\"],\r\n\t\t\t[\"span\", [\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t\t[\"bold\", [\"a\"]],\r\n\t\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t\t[\"bold\", [\"b\"]],\r\n\t\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t\t[\"italic\", [\"c\"]],\r\n\t\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t\t\t[\"italic\", [\"d\"]],\r\n\t\t\t\t\t[\"punctuation\", \"__\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"??\"],\r\n\t\t\t\t\t[\"cite\", \"e\"],\r\n\t\t\t\t\t[\"punctuation\", \"??\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"@\"],\r\n\t\t\t\t\t[\"code\", \"f\"],\r\n\t\t\t\t\t[\"punctuation\", \"@\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"+\"],\r\n\t\t\t\t\t[\"inserted\", [\"g\"]],\r\n\t\t\t\t\t[\"punctuation\", \"+\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"-\"],\r\n\t\t\t\t\t[\"deleted\", [\"h\"]],\r\n\t\t\t\t\t[\"punctuation\", \"-\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"^\"],\r\n\t\t\t\t\t\"i\",\r\n\t\t\t\t\t[\"punctuation\", \"^\"]\r\n\t\t\t\t]],\r\n\t\t\t\t[\"inline\", [\r\n\t\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t\t\"j\",\r\n\t\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t\t]]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"%\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"phrase\", [\"not_italic_ _this_either\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for inline styles and nesting.\r\n"
  },
  {
    "path": "tests/languages/textile/link-ref_feature.test",
    "content": "[foo]http://prismjs.com\r\n[bar]http://www.example.com\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"phrase\", [\r\n\t\t[\"link-ref\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"string\", \"foo\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"url\", \"http://prismjs.com\"]\r\n\t\t]],\r\n\t\t[\"link-ref\", [\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"string\", \"bar\"],\r\n\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t[\"url\", \"http://www.example.com\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for links references."
  },
  {
    "path": "tests/languages/textile/link_feature.test",
    "content": "\"Foo bar\":http://prismjs.com\r\n\"Baz\":foo\r\n\"Foobar\":link-ref\r\n\"(foo)[en]{color:blue;}Foo\":bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"phrase\", [\r\n\t\t[\"link\", [\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"text\", \"Foo bar\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"url\", \"http://prismjs.com\"]\r\n\t\t]],\r\n\t\t[\"link\", [\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"text\", \"Baz\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"url\", \"foo\"]\r\n\t\t]],\r\n\t\t[\"link\", [\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"text\", \"Foobar\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"url\", \"link-ref\"]\r\n\t\t]],\r\n\t\t[\"link\", [\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"foo\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"lang\", \"en\"],\r\n\t\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t\t[\"css\", \"{color:blue;}\"]\r\n\t\t\t]],\r\n\t\t\t[\"text\", \"Foo\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t[\"url\", \"bar\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for links.\r\n"
  },
  {
    "path": "tests/languages/textile/list_feature.test",
    "content": "# foo\r\n# bar\r\n## baz\r\n#[fr](#foo){background:pink} Foobar\r\n\r\n* foo\r\n** bar\r\n*** baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"phrase\", [\r\n\t\t[\"list\", [\r\n\t\t\t[\"punctuation\", \"#\"],\r\n\t\t\t\" foo\"\r\n\t\t]],\r\n\t\t[\"list\", [\r\n\t\t\t[\"punctuation\", \"#\"],\r\n\t\t\t\" bar\"\r\n\t\t]],\r\n\t\t[\"list\", [\r\n\t\t\t[\"punctuation\", \"##\"],\r\n\t\t\t\" baz\"\r\n\t\t]],\r\n\t\t[\"list\", [\r\n\t\t\t[\"punctuation\", \"#\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"lang\", \"fr\"],\r\n\t\t\t\t[\"punctuation\", \"]\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"#foo\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"css\", \"{background:pink}\"]\r\n\t\t\t]],\r\n\t\t\t\" Foobar\"\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"list\", [\r\n\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\" foo\"\r\n\t\t]],\r\n\t\t[\"list\", [\r\n\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\" bar\"\r\n\t\t]],\r\n\t\t[\"list\", [\r\n\t\t\t[\"punctuation\", \"***\"],\r\n\t\t\t\" baz\"\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for list items.\r\n"
  },
  {
    "path": "tests/languages/textile/mark_feature.test",
    "content": "Prism(C)\r\nFoo(TM)\r\nFoobar(R)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"phrase\", [\r\n\t\t\"Prism\", [\"mark\", [[\"punctuation\", \"(\"], \"C\", [\"punctuation\", \")\"]]],\r\n\t\t\"\\r\\nFoo\", [\"mark\", [[\"punctuation\", \"(\"], \"TM\", [\"punctuation\", \")\"]]],\r\n\t\t\"\\r\\nFoobar\", [\"mark\", [[\"punctuation\", \"(\"], \"R\", [\"punctuation\", \")\"]]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for marks symbols."
  },
  {
    "path": "tests/languages/textile/table_feature.test",
    "content": "|_. foo |<_. bar |>_. baz |\r\n|<>. foo |(((. bar |)). baz |\r\n|~. foo |^. bar |=. baz |\r\n|/2. bar |\\2. foo\r\nbar\r\nbaz |\r\n|\\2~>. foobarbaz |\r\n\r\n(foo).|(bar).Baz|\r\n(#foo).|(#bar).Baz|\r\n[fr].|[en].Baz|\r\n{color: blue}.|{font-weight:bold}.Baz|\r\n(foo#bar){font-style:italic}[fr].|{background:red;}(bar#baz)[en].Baz|\r\n\r\n|*bold*|**bold**|_italic_|__italic__|\r\n|??cite??|@code@|+inserted+|-deleted-|\r\n|%span%|\"foo\":http://example.com|!foo.jpg!|bar[2]|\r\n|\\2.CSS(Cascading Style Sheet)|\\2.Foo(TM)|\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"phrase\", [\r\n\t\t[\"table\", [\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" foo \",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" bar \",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \">\"],\r\n\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" baz \",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" foo \",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"punctuation\", \"(\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" bar \",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" baz \",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"~\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" foo \",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"^\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" bar \",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"=\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" baz \",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"/2\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" bar \",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"\\\\2\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" foo\\r\\nbar\\r\\nbaz \",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"\\\\2\"],\r\n\t\t\t\t[\"punctuation\", \"~\"],\r\n\t\t\t\t[\"punctuation\", \">\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\" foobarbaz \",\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"table\", [\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"foo\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"bar\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Baz\",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"#foo\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"#bar\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Baz\",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"lang\", \"fr\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"lang\", \"en\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Baz\",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"css\", \"{color: blue}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"css\", \"{font-weight:bold}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Baz\",\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"foo#bar\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"css\", \"{font-style:italic}\"],\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"lang\", \"fr\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"css\", \"{background:red;}\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"class-id\", \"bar#baz\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t[\"lang\", \"en\"],\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Baz\",\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"phrase\", [\r\n\t\t[\"table\", [\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"inline\", [\r\n\t\t\t\t[\"punctuation\", \"*\"],\r\n\t\t\t\t[\"bold\", [\"bold\"]],\r\n\t\t\t\t[\"punctuation\", \"*\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"inline\", [\r\n\t\t\t\t[\"punctuation\", \"**\"],\r\n\t\t\t\t[\"bold\", [\"bold\"]],\r\n\t\t\t\t[\"punctuation\", \"**\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"inline\", [\r\n\t\t\t\t[\"punctuation\", \"_\"],\r\n\t\t\t\t[\"italic\", [\"italic\"]],\r\n\t\t\t\t[\"punctuation\", \"_\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"inline\", [\r\n\t\t\t\t[\"punctuation\", \"__\"],\r\n\t\t\t\t[\"italic\", [\"italic\"]],\r\n\t\t\t\t[\"punctuation\", \"__\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"inline\", [\r\n\t\t\t\t[\"punctuation\", \"??\"],\r\n\t\t\t\t[\"cite\", \"cite\"],\r\n\t\t\t\t[\"punctuation\", \"??\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"inline\", [\r\n\t\t\t\t[\"punctuation\", \"@\"],\r\n\t\t\t\t[\"code\", \"code\"],\r\n\t\t\t\t[\"punctuation\", \"@\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"inline\", [\r\n\t\t\t\t[\"punctuation\", \"+\"],\r\n\t\t\t\t[\"inserted\", [\"inserted\"]],\r\n\t\t\t\t[\"punctuation\", \"+\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"inline\", [\r\n\t\t\t\t[\"punctuation\", \"-\"],\r\n\t\t\t\t[\"deleted\", [\"deleted\"]],\r\n\t\t\t\t[\"punctuation\", \"-\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"inline\", [\r\n\t\t\t\t[\"punctuation\", \"%\"],\r\n\t\t\t\t[\"span\", [\"span\"]],\r\n\t\t\t\t[\"punctuation\", \"%\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"link\", [\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"text\", \"foo\"],\r\n\t\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\t[\"url\", \"http://example.com\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"image\", [\r\n\t\t\t\t[\"punctuation\", \"!\"],\r\n\t\t\t\t[\"source\", \"foo.jpg\"],\r\n\t\t\t\t[\"punctuation\", \"!\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"footnote\", [\r\n\t\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t\t\"2\",\r\n\t\t\t\t[\"punctuation\", \"]\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"\\\\2\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"acronym\", [\r\n\t\t\t\t\"CSS\",\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"comment\", \"Cascading Style Sheet\"],\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"],\r\n\t\t\t[\"modifier\", [\r\n\t\t\t\t[\"punctuation\", \"\\\\2\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Foo\",\r\n\t\t\t[\"mark\", [\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t\"TM\",\r\n\t\t\t\t[\"punctuation\", \")\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"|\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tables with alignment modifiers and spanning.\r\nAlso checks for nesting inline styles.\r\n"
  },
  {
    "path": "tests/languages/textile/tag_feature.test",
    "content": "<details></details>\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"details\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"details\"]],\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/textile+haml/textile_inclusion.test",
    "content": ":textile\n\t<div></div>\n\n~\n\t:textile\n\t\t<div></div>\n\n----------------------------------------------------\n\n[\n\t[\"filter-textile\", [\n\t\t[\"filter-name\", \":textile\"],\n\t\t[\"text\", [\n\t\t\t[\"tag\", [\n\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t[\"tag\", [\"div\"]],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]],\n\t\t\t[\"tag\", [\n\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t[\"tag\", [\"div\"]],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]]\n\t\t]]\n\t]],\n\t[\"punctuation\", \"~\"],\n\t[\"filter-textile\", [\n\t\t[\"filter-name\", \":textile\"],\n\t\t[\"text\", [\n\t\t\t[\"tag\", [\n\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t[\"tag\", [\"div\"]],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]],\n\t\t\t[\"tag\", [\n\t\t\t\t[\"punctuation\", \"</\"],\n\t\t\t\t[\"tag\", [\"div\"]],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/toml/boolean_feature.test",
    "content": "true\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans.\n"
  },
  {
    "path": "tests/languages/toml/comment_feature.test",
    "content": "# I'm a comment, you're not.\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"# I'm a comment, you're not.\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/toml/date_feature.test",
    "content": "1979-05-27T07:32:00Z\n1979-05-27T00:32:00-07:00\n1979-05-27T00:32:00.999999-07:00\n1979-05-27 07:32:00Z\n\n1979-05-27T07:32:00\n1979-05-27T00:32:00.999999\n\n1979-05-27\n\n07:32:00\n00:32:00.999999\n\n----------------------------------------------------\n\n[\n\t[\"date\", \"1979-05-27T07:32:00Z\"],\n\t[\"date\", \"1979-05-27T00:32:00-07:00\"],\n\t[\"date\", \"1979-05-27T00:32:00.999999-07:00\"],\n\t[\"date\", \"1979-05-27 07:32:00Z\"],\n\n\t[\"date\", \"1979-05-27T07:32:00\"],\n\t[\"date\", \"1979-05-27T00:32:00.999999\"],\n\n\t[\"date\", \"1979-05-27\"],\n\n\t[\"date\", \"07:32:00\"],\n\t[\"date\", \"00:32:00.999999\"]\n]\n\n----------------------------------------------------\n\nChecks for dates.\n"
  },
  {
    "path": "tests/languages/toml/key_feature.test",
    "content": "abc = \"abc\"\n\"abc\" = \"abc\"\n\"abc\".'a\"b\"c'.abc = \"abc\"\n\ta . b . c = \"abc\"\n\na = { b = \"b\", c = \"c\" }\n\n----------------------------------------------------\n\n[\n\t[\"key\", \"abc\"],\n\t[\"punctuation\", \"=\"],\n\t[\"string\", \"\\\"abc\\\"\"],\n\n\t[\"key\", \"\\\"abc\\\"\"],\n\t[\"punctuation\", \"=\"],\n\t[\"string\", \"\\\"abc\\\"\"],\n\n\t[\"key\", \"\\\"abc\\\".'a\\\"b\\\"c'.abc\"],\n\t[\"punctuation\", \"=\"],\n\t[\"string\", \"\\\"abc\\\"\"],\n\n\t[\"key\", \"a . b . c\"],\n\t[\"punctuation\", \"=\"],\n\t[\"string\", \"\\\"abc\\\"\"],\n\n\t[\"key\", \"a\"],\n\t[\"punctuation\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\t[\"key\", \"b\"],\n\t[\"punctuation\", \"=\"],\n\t[\"string\", \"\\\"b\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"key\", \"c\"],\n\t[\"punctuation\", \"=\"],\n\t[\"string\", \"\\\"c\\\"\"],\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for keys.\n"
  },
  {
    "path": "tests/languages/toml/number_feature.test",
    "content": "42\n0\n+0\n-0\n+99\n-17\n\n1_000\n5_349_221\n\n0xDEADBEEF\n0xdeadbeef\n0xdead_beef\n\n0o0123_4567\n0o755\n\n0b1101_0110\n\n+1.0\n3.1415\n-0.01\n5e+22\n1e6\n1e1_000\n-2E-2\n6.626e-34\n9_224_617.445_991_228_313\n\ninf\n+inf\n-inf\nnan\n+nan\n-nan\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"42\"],\n\t[\"number\", \"0\"],\n\t[\"number\", \"+0\"],\n\t[\"number\", \"-0\"],\n\t[\"number\", \"+99\"],\n\t[\"number\", \"-17\"],\n\n\t[\"number\", \"1_000\"],\n\t[\"number\", \"5_349_221\"],\n\n\t[\"number\", \"0xDEADBEEF\"],\n\t[\"number\", \"0xdeadbeef\"],\n\t[\"number\", \"0xdead_beef\"],\n\n\t[\"number\", \"0o0123_4567\"],\n\t[\"number\", \"0o755\"],\n\n\t[\"number\", \"0b1101_0110\"],\n\n\t[\"number\", \"+1.0\"],\n\t[\"number\", \"3.1415\"],\n\t[\"number\", \"-0.01\"],\n\t[\"number\", \"5e+22\"],\n\t[\"number\", \"1e6\"],\n\t[\"number\", \"1e1_000\"],\n\t[\"number\", \"-2E-2\"],\n\t[\"number\", \"6.626e-34\"],\n\t[\"number\", \"9_224_617.445_991_228_313\"],\n\n\t[\"number\", \"inf\"],\n\t[\"number\", \"+inf\"],\n\t[\"number\", \"-inf\"],\n\t[\"number\", \"nan\"],\n\t[\"number\", \"+nan\"],\n\t[\"number\", \"-nan\"]\n]\n\n----------------------------------------------------\n\nChecks for numbers.\n"
  },
  {
    "path": "tests/languages/toml/string_feature.test",
    "content": "\"\"\n\"abc\"\n\"\\\"\"\n''\n'#'\n'\"abc\"'\n\"\"\"\n\tabc\n\t\"\"\"\n'''\n\tabc\n\t'''\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"abc\\\"\"],\n\t[\"string\", \"\\\"\\\\\\\"\\\"\"],\n\t[\"string\", \"''\"],\n\t[\"string\", \"'#'\"],\n\t[\"string\", \"'\\\"abc\\\"'\"],\n\t[\"string\", \"\\\"\\\"\\\"\\r\\n\\tabc\\r\\n\\t\\\"\\\"\\\"\"],\n\t[\"string\", \"'''\\r\\n\\tabc\\r\\n\\t'''\"]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/toml/table_feature.test",
    "content": "[table]\n[[array]]\n\n# not a table\nfoo = [ \"bar\" ]\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"[\"],\n\t[\"table\", \"table\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"[\"],\n\t[\"table\", \"array\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"]\"],\n\n\t[\"comment\", \"# not a table\"],\n\n\t[\"key\", \"foo\"],\n\t[\"punctuation\", \"=\"],\n\t[\"punctuation\", \"[\"],\n\t[\"string\", \"\\\"bar\\\"\"],\n\t[\"punctuation\", \"]\"]\n]\n\n----------------------------------------------------\n\nChecks for tables.\n"
  },
  {
    "path": "tests/languages/treeview/ascii.html.test",
    "content": "root_folder/\n|-- a first folder/\n|   |-- holidays.mov\n|   |-- javascript-file.js\n|   `-- some_picture.jpg\n|-- documents/\n|   |-- spreadsheet.xls\n|   |-- manual.pdf\n|   |-- document.docx\n|   `-- presentation.ppt\n|       `-- test\n|-- empty_folder/\n|-- going deeper/\n|   |-- going deeper/\n|   |   `-- going deeper/\n|   |        `-- going deeper/\n|   |            `-- .secret_file\n|   |-- style.css\n|   `-- index.html\n|-- music and movies/\n|   |-- great-song.mp3\n|   |-- S01E02.new.episode.avi\n|   |-- S01E02.new.episode.nfo\n|   `-- track 1.cda\n|-- .gitignore\n|-- .htaccess\n|-- .npmignore\n|-- archive 1.zip\n|-- archive 2.tar.gz\n|-- logo.svg\n`-- README.md\n\n----------------------------------------------------\n\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-name dir\">\n\t\troot_folder\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name dir\">\n\t\ta first folder\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-mov\">holidays.mov</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-js\">javascript-file.js</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v-last\">`--</span>\n\t<span class=\"token entry-name ext-jpg\">some_picture.jpg</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name dir\">\n\t\tdocuments\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-xls\">spreadsheet.xls</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-pdf\">manual.pdf</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-docx\">document.docx</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v-last\">`--</span>\n\t<span class=\"token entry-name ext-ppt\">presentation.ppt</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v-gap\"></span>\n\t<span class=\"token entry-line line-v-last\">`--</span>\n\t<span class=\"token entry-name\">test</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name dir\">\n\t\tempty_folder\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name dir\">\n\t\tgoing deeper\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name dir\">\n\t\tgoing deeper\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v-last\">`--</span>\n\t<span class=\"token entry-name dir\">\n\t\tgoing deeper\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v-gap\"></span>\n\t<span class=\"token entry-line line-v-last\">`--</span>\n\t<span class=\"token entry-name dir\">\n\t\tgoing deeper\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v-gap\"></span>\n\t<span class=\"token entry-line line-v-gap\"></span>\n\t<span class=\"token entry-line line-v-last\">`--</span>\n\t<span class=\"token entry-name ext-secret_file dotfile\">.secret_file</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-css\">style.css</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v-last\">`--</span>\n\t<span class=\"token entry-name ext-html\">index.html</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name dir\">\n\t\tmusic and movies\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-mp3\">great-song.mp3</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-new-episode-avi ext-episode-avi ext-avi\">\n\t\tS01E02.new.episode.avi\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-new-episode-nfo ext-episode-nfo ext-nfo\">\n\t\tS01E02.new.episode.nfo\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v-last\">`--</span>\n\t<span class=\"token entry-name ext-cda\">track 1.cda</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-gitignore dotfile\">.gitignore</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-htaccess dotfile\">.htaccess</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-npmignore dotfile\">.npmignore</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-zip\">archive 1.zip</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-tar-gz ext-gz\">archive 2.tar.gz</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">|--</span>\n\t<span class=\"token entry-name ext-svg\">logo.svg</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v-last\">`--</span>\n\t<span class=\"token entry-name ext-md\">README.md</span>\n</span>\n"
  },
  {
    "path": "tests/languages/treeview/box.html.test",
    "content": "root_folder/\n├── a first folder/\n|   ├── holidays.mov\n|   ├── javascript-file.js\n|   └── some_picture.jpg\n├── documents/\n|   ├── spreadsheet.xls\n|   ├── manual.pdf\n|   ├── document.docx\n|   └── presentation.ppt\n└── etc.\n\n----------------------------------------------------\n\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-name dir\">\n\t\troot_folder\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">├──</span>\n\t<span class=\"token entry-name dir\">\n\t\ta first folder\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">├──</span>\n\t<span class=\"token entry-name ext-mov\">holidays.mov</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">├──</span>\n\t<span class=\"token entry-name ext-js\">javascript-file.js</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v-last\">└──</span>\n\t<span class=\"token entry-name ext-jpg\">some_picture.jpg</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-h\">├──</span>\n\t<span class=\"token entry-name dir\">\n\t\tdocuments\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">├──</span>\n\t<span class=\"token entry-name ext-xls\">spreadsheet.xls</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">├──</span>\n\t<span class=\"token entry-name ext-pdf\">manual.pdf</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-h\">├──</span>\n\t<span class=\"token entry-name ext-docx\">document.docx</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v\">|</span>\n\t<span class=\"token entry-line line-v-last\">└──</span>\n\t<span class=\"token entry-name ext-ppt\">presentation.ppt</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-line line-v-last\">└──</span>\n\t<span class=\"token entry-name ext-\">etc.</span>\n</span>\n"
  },
  {
    "path": "tests/languages/treeview/markers_feature.html.test",
    "content": "directory/\nsocket file=\nexecutable file*\nFIFO|\n\n----------------------------------------------------\n\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-name dir\">\n\t\tdirectory\n\t\t<span class=\"token directory-marker\">/</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-name\">\n\t\tsocket file\n\t\t<span class=\"token file-marker\">=</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-name\">\n\t\texecutable file\n\t\t<span class=\"token file-marker\">*</span>\n\t</span>\n</span>\n<span class=\"token treeview-part\">\n\t<span class=\"token entry-name\">\n\t\tFIFO\n\t\t<span class=\"token file-marker\">|</span>\n\t</span>\n</span>\n"
  },
  {
    "path": "tests/languages/treeview/symlink_feature.test",
    "content": "foo -> /bar/baz\n\n----------------------------------------------------\n\n[\n\t[\"treeview-part\", [\n\t\t[\"entry-name\", [\n\t\t\t\"foo\",\n\t\t\t[\"symlink\", \" -> \"],\n\t\t\t\"/bar/baz\"\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/tremor/boolean_feature.test",
    "content": "true\nfalse\nnull\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"],\n\t[\"boolean\", \"null\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans.\n"
  },
  {
    "path": "tests/languages/tremor/comment_feature.test",
    "content": "#\n## foobar\n### snot badger\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"#\"],\n\t[\"comment\", \"## foobar\"],\n\t[\"comment\", \"### snot badger\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/tremor/extractor_feature.test",
    "content": "re|^(?P<kind>bat.*)$|\ndatetime|%Y-%m-%d %H:%M|\n\n----------------------------------------------------\n\n[\n\t[\"extractor\", [\n\t\t[\"function\", \"re\"],\n\t\t[\"regex\", \"|^(?P<kind>bat.*)$|\"]\n\t]],\n\t[\"extractor\", [\n\t\t[\"function\", \"datetime\"],\n\t\t[\"value\", \"|%Y-%m-%d %H:%M|\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/tremor/function_feature.test",
    "content": "foo()\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/tremor/identifier_feature.test",
    "content": "foo\nfoo_bar_42\n`foo`\n`bar`\n\n----------------------------------------------------\n\n[\n\t\"foo\\r\\nfoo_bar_42\\r\\n\",\n\t[\"identifier\", \"`foo`\"],\n\t[\"identifier\", \"`bar`\"]\n]\n"
  },
  {
    "path": "tests/languages/tremor/keyword_escape_feature.test",
    "content": "`args`\n`as`\n`by`\n`case`\n`config`\n`connect`\n`connector`\n`const`\n`copy`\n`create`\n`default`\n`define`\n`deploy`\n`drop`\n`each`\n`emit`\n`end`\n`erase`\n`event`\n`flow`\n`fn`\n`for`\n`from`\n`group`\n`having`\n`insert`\n`into`\n`intrinsic`\n`let`\n`links`\n`match`\n`merge`\n`mod`\n`move`\n`of`\n`operator`\n`patch`\n`pipeline`\n`recur`\n`script`\n`select`\n`set`\n`sliding`\n`state`\n`stream`\n`to`\n`tumbling`\n`update`\n`use`\n`when`\n`where`\n`window`\n`with`\n\n----------------------------------------------------\n\n[\n\t[\"identifier\", \"`args`\"],\n\t[\"identifier\", \"`as`\"],\n\t[\"identifier\", \"`by`\"],\n\t[\"identifier\", \"`case`\"],\n\t[\"identifier\", \"`config`\"],\n\t[\"identifier\", \"`connect`\"],\n\t[\"identifier\", \"`connector`\"],\n\t[\"identifier\", \"`const`\"],\n\t[\"identifier\", \"`copy`\"],\n\t[\"identifier\", \"`create`\"],\n\t[\"identifier\", \"`default`\"],\n\t[\"identifier\", \"`define`\"],\n\t[\"identifier\", \"`deploy`\"],\n\t[\"identifier\", \"`drop`\"],\n\t[\"identifier\", \"`each`\"],\n\t[\"identifier\", \"`emit`\"],\n\t[\"identifier\", \"`end`\"],\n\t[\"identifier\", \"`erase`\"],\n\t[\"identifier\", \"`event`\"],\n\t[\"identifier\", \"`flow`\"],\n\t[\"identifier\", \"`fn`\"],\n\t[\"identifier\", \"`for`\"],\n\t[\"identifier\", \"`from`\"],\n\t[\"identifier\", \"`group`\"],\n\t[\"identifier\", \"`having`\"],\n\t[\"identifier\", \"`insert`\"],\n\t[\"identifier\", \"`into`\"],\n\t[\"identifier\", \"`intrinsic`\"],\n\t[\"identifier\", \"`let`\"],\n\t[\"identifier\", \"`links`\"],\n\t[\"identifier\", \"`match`\"],\n\t[\"identifier\", \"`merge`\"],\n\t[\"identifier\", \"`mod`\"],\n\t[\"identifier\", \"`move`\"],\n\t[\"identifier\", \"`of`\"],\n\t[\"identifier\", \"`operator`\"],\n\t[\"identifier\", \"`patch`\"],\n\t[\"identifier\", \"`pipeline`\"],\n\t[\"identifier\", \"`recur`\"],\n\t[\"identifier\", \"`script`\"],\n\t[\"identifier\", \"`select`\"],\n\t[\"identifier\", \"`set`\"],\n\t[\"identifier\", \"`sliding`\"],\n\t[\"identifier\", \"`state`\"],\n\t[\"identifier\", \"`stream`\"],\n\t[\"identifier\", \"`to`\"],\n\t[\"identifier\", \"`tumbling`\"],\n\t[\"identifier\", \"`update`\"],\n\t[\"identifier\", \"`use`\"],\n\t[\"identifier\", \"`when`\"],\n\t[\"identifier\", \"`where`\"],\n\t[\"identifier\", \"`window`\"],\n\t[\"identifier\", \"`with`\"]\n]\n\n----------------------------------------------------\n\nChecks for variables.\n"
  },
  {
    "path": "tests/languages/tremor/keyword_feature.test",
    "content": "args\nas\nby\ncase\nconfig\nconnect\nconnector\nconst\ncopy\ncreate\ndefault\ndefine\ndeploy\ndrop\neach\nemit\nend\nerase\nevent\nflow\nfn\nfor\nfrom\ngroup\nhaving\ninsert\ninto\nintrinsic\nlet\nlinks\nmatch\nmerge\nmod\nmove\nof\noperator\npatch\npipeline\nrecur\nscript\nselect\nset\nsliding\nstate\nstream\nto\ntumbling\nupdate\nuse\nwhen\nwhere\nwindow\nwith\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"args\"],\n\t[\"keyword\", \"as\"],\n\t[\"keyword\", \"by\"],\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"config\"],\n\t[\"keyword\", \"connect\"],\n\t[\"keyword\", \"connector\"],\n\t[\"keyword\", \"const\"],\n\t[\"keyword\", \"copy\"],\n\t[\"keyword\", \"create\"],\n\t[\"keyword\", \"default\"],\n\t[\"keyword\", \"define\"],\n\t[\"keyword\", \"deploy\"],\n\t[\"keyword\", \"drop\"],\n\t[\"keyword\", \"each\"],\n\t[\"keyword\", \"emit\"],\n\t[\"keyword\", \"end\"],\n\t[\"keyword\", \"erase\"],\n\t[\"keyword\", \"event\"],\n\t[\"keyword\", \"flow\"],\n\t[\"keyword\", \"fn\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"from\"],\n\t[\"keyword\", \"group\"],\n\t[\"keyword\", \"having\"],\n\t[\"keyword\", \"insert\"],\n\t[\"keyword\", \"into\"],\n\t[\"keyword\", \"intrinsic\"],\n\t[\"keyword\", \"let\"],\n\t[\"keyword\", \"links\"],\n\t[\"keyword\", \"match\"],\n\t[\"keyword\", \"merge\"],\n\t[\"keyword\", \"mod\"],\n\t[\"keyword\", \"move\"],\n\t[\"keyword\", \"of\"],\n\t[\"keyword\", \"operator\"],\n\t[\"keyword\", \"patch\"],\n\t[\"keyword\", \"pipeline\"],\n\t[\"keyword\", \"recur\"],\n\t[\"keyword\", \"script\"],\n\t[\"keyword\", \"select\"],\n\t[\"keyword\", \"set\"],\n\t[\"keyword\", \"sliding\"],\n\t[\"keyword\", \"state\"],\n\t[\"keyword\", \"stream\"],\n\t[\"keyword\", \"to\"],\n\t[\"keyword\", \"tumbling\"],\n\t[\"keyword\", \"update\"],\n\t[\"keyword\", \"use\"],\n\t[\"keyword\", \"when\"],\n\t[\"keyword\", \"where\"],\n\t[\"keyword\", \"window\"],\n\t[\"keyword\", \"with\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/tremor/modularity_feature.test",
    "content": "foo\nfoo::bar\nfoo::bar::baz\n`foo`::bar::`baz`\n`foo`\n`foo`::`bar`::`baz`\n\n----------------------------------------------------\n\n[\n\t\"foo\\r\\nfoo\",\n\t[\"punctuation\", \"::\"],\n\t\"bar\\r\\nfoo\",\n\t[\"punctuation\", \"::\"],\n\t\"bar\",\n\t[\"punctuation\", \"::\"],\n\t\"baz\\r\\n\",\n\n\t[\"identifier\", \"`foo`\"],\n\t[\"punctuation\", \"::\"],\n\t\"bar\",\n\t[\"punctuation\", \"::\"],\n\t[\"identifier\", \"`baz`\"],\n\n\t[\"identifier\", \"`foo`\"],\n\n\t[\"identifier\", \"`foo`\"],\n\t[\"punctuation\", \"::\"],\n\t[\"identifier\", \"`bar`\"],\n\t[\"punctuation\", \"::\"],\n\t[\"identifier\", \"`baz`\"]\n]\n\n----------------------------------------------------\n\nChecks modularity and references for bare/namespaced variables\n"
  },
  {
    "path": "tests/languages/tremor/number_feature.test",
    "content": "42\n0.154\n0xBadFace\n0b10101010\n1_000_000_000\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"42\"],\n\t[\"number\", \"0.154\"],\n\t[\"number\", \"0xBadFace\"],\n\t[\"number\", \"0b10101010\"],\n\t[\"number\", \"1_000_000_000\"]\n]\n\n----------------------------------------------------\n\nChecks for decimal and hexadecimal numbers.\n"
  },
  {
    "path": "tests/languages/tremor/operator_feature.test",
    "content": "+ - / * % ~ ^ & |\n+= -= /= *= %= ~= ^= &= |=\n== != < > <= >=\n= =>\n\n! && ||\n\n<< >> >>>\n<<= >>= >>>=\n\nnot and or xor present absent\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"|\"],\n\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"%=\"],\n\t[\"operator\", \"~=\"],\n\t[\"operator\", \"^=\"],\n\t[\"operator\", \"&=\"],\n\t[\"operator\", \"|=\"],\n\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">=\"],\n\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"=>\"],\n\n\t[\"operator\", \"!\"], [\"operator\", \"&&\"], [\"operator\", \"||\"],\n\n\t[\"operator\", \"<<\"], [\"operator\", \">>\"], [\"operator\", \">>>\"],\n\t[\"operator\", \"<<=\"], [\"operator\", \">>=\"], [\"operator\", \">>>=\"],\n\n\t[\"operator\", \"not\"],\n\t[\"operator\", \"and\"],\n\t[\"operator\", \"or\"],\n\t[\"operator\", \"xor\"],\n\t[\"operator\", \"present\"],\n\t[\"operator\", \"absent\"]\n]\n\n----------------------------------------------------\n\nChecks for operators\n"
  },
  {
    "path": "tests/languages/tremor/punctuation_feature.test",
    "content": "( ) [ ] { }\n, ; . :\n%( ) %[ ] %{ }\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"pattern-punctuation\", \"%\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"pattern-punctuation\", \"%\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"pattern-punctuation\", \"%\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/tremor/string_feature.test",
    "content": "\"\"\n\"\" \"\"\n\"\"\"\n\"\"\"\n\"fo\\\"obar\"\n\"foo\\\nbar\"\n\"\"\"\nmultiline\n\"\"\"\n\"snot#{badger}badger\"\n\"\"\"\n    I am\n   a\n    long\n    multi-line\n    string with #{ \"#{a+1} interpolation\" }\n\"\"\"\n\n----------------------------------------------------\n\n[\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"\\\"\\\"\"]\n\t]],\n\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"\\\"\\\"\"]\n\t]],\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"\\\"\\\"\"]\n\t]],\n\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"\\\"\\\"\\\"\\r\\n\\\"\\\"\\\"\"]\n\t]],\n\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"]\n\t]],\n\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"\\\"foo\\\\\\r\\nbar\\\"\"]\n\t]],\n\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"\\\"\\\"\\\"\\r\\nmultiline\\r\\n\\\"\\\"\\\"\"]\n\t]],\n\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"\\\"snot\"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"#{\"],\n\t\t\t[\"expression\", [\"badger\"]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"badger\\\"\"]\n\t]],\n\n\t[\"interpolated-string\", [\n\t\t[\"string\", \"\\\"\\\"\\\"\\r\\n    I am\\r\\n   a\\r\\n    long\\r\\n    multi-line\\r\\n    string with \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"punctuation\", \"#{\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"interpolated-string\", [\n\t\t\t\t\t[\"string\", \"\\\"\"],\n\t\t\t\t\t[\"interpolation\", [\n\t\t\t\t\t\t[\"punctuation\", \"#{\"],\n\t\t\t\t\t\t[\"expression\", [\n\t\t\t\t\t\t\t\"a\",\n\t\t\t\t\t\t\t[\"operator\", \"+\"],\n\t\t\t\t\t\t\t[\"number\", \"1\"]\n\t\t\t\t\t\t]],\n\t\t\t\t\t\t[\"punctuation\", \"}\"]\n\t\t\t\t\t]],\n\t\t\t\t\t[\"string\", \" interpolation\\\"\"]\n\t\t\t\t]]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"}\"]\n\t\t]],\n\t\t[\"string\", \"\\r\\n\\\"\\\"\\\"\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for strings.\n"
  },
  {
    "path": "tests/languages/tsx/issue2594.test",
    "content": "function Add1(a, b) { return <div>a + b</div> }\r\n\r\ntype Bar = Foo<string>;\r\n\r\nfunction Add2(a, b) { return <div>a + b</div> }\r\n\r\nfunction handleSubmit(event: FormEvent<HTMLFormElement>) {\r\n  event.preventDefault();\r\n}\r\n\r\nfunction handleChange(event: ChangeEvent<HTMLInputElement>) {\r\n  console.log(event.target.value);\r\n}\r\n\r\nfunction handleClick(event: MouseEvent) {\r\n  console.log(event.button);\r\n}\r\n\r\nexport default function Form() {\r\n  return (\r\n    <form onSubmit={handleSubmit}>\r\n      <input onChange={handleChange} placeholder=\"Name\" />\r\n      <button onClick={handleClick}></button>\r\n    </form>\r\n  );\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"Add1\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"a\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" b\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"a + b\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"type\"],\r\n\t[\"class-name\", [\"Bar\"]],\r\n\t[\"operator\", \"=\"],\r\n\t\" Foo\",\r\n\t[\"operator\", \"<\"],\r\n\t[\"builtin\", \"string\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"Add2\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"a\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" b\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"a + b\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"handleSubmit\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"event\",\r\n\t[\"operator\", \":\"],\r\n\t\" FormEvent\",\r\n\t[\"operator\", \"<\"],\r\n\t\"HTMLFormElement\",\r\n\t[\"operator\", \">\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t\"\\r\\n  event\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"preventDefault\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"handleChange\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"event\",\r\n\t[\"operator\", \":\"],\r\n\t\" ChangeEvent\",\r\n\t[\"operator\", \"<\"],\r\n\t\"HTMLInputElement\",\r\n\t[\"operator\", \">\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"builtin\", \"console\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"log\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"event\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"target\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"value\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"handleClick\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"event\",\r\n\t[\"operator\", \":\"],\r\n\t\" MouseEvent\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"builtin\", \"console\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"log\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"event\",\r\n\t[\"punctuation\", \".\"],\r\n\t\"button\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"Form\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"punctuation\", \"(\"],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"form\"]],\r\n\t\t[\"attr-name\", [\"onSubmit\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"handleSubmit\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n      \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"input\"]],\r\n\t\t[\"attr-name\", [\"onChange\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"handleChange\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"placeholder\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"Name\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n      \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"button\"]],\r\n\t\t[\"attr-name\", [\"onClick\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"handleClick\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"button\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"\\r\\n    \"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"form\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/tsx/issue3089.test",
    "content": "// react tsx\nfunction log(msg: string): void {\n  console.log(msg);\n}\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// react tsx\"],\n\n\t[\"keyword\", \"function\"],\n\t[\"function\", \"log\"],\n\t[\"punctuation\", \"(\"],\n\t\"msg\",\n\t[\"operator\", \":\"],\n\t[\"builtin\", \"string\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \":\"],\n\t[\"keyword\", \"void\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"builtin\", \"console\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"log\"],\n\t[\"punctuation\", \"(\"],\n\t\"msg\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/tsx/tag_feature.test",
    "content": "var myDivElement = <div className=\"foo\" />;\r\nvar myElement = <MyComponent someProperty={true} />;\r\n<div {...foo} />\r\n<Tree.TreeNode.Item leaf={true}></Tree.TreeNode.Item>\r\nclass Test extends Component {\r\n\trender() {\r\n\t\treturn <p onClick={this.clickHandler}>Hello world.</p>;\r\n\t}\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"var\"],\r\n\t\" myDivElement \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"attr-name\", [\"className\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t\" myElement \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"MyComponent\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"someProperty\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"div\"]],\r\n\t\t[\"spread\", [\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"operator\", \"...\"],\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Tree.TreeNode.Item\"]\r\n\t\t]],\r\n\t\t[\"attr-name\", [\"leaf\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"boolean\", \"true\"],\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\r\n\t\t\t[\"class-name\", \"Tree.TreeNode.Item\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"Test\"]],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\"Component\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"function\", \"render\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"p\"]],\r\n\t\t[\"attr-name\", [\"onClick\"]],\r\n\t\t[\"script\", [\r\n\t\t\t[\"script-punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t[\"keyword\", \"this\"],\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"clickHandler\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"Hello world.\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"p\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for TSX tags.\r\n"
  },
  {
    "path": "tests/languages/tt2/comment_feature.test",
    "content": "[%# this entire directive is ignored no\r\n    matter how many lines it wraps onto\r\n%]\r\n[% # this is a comment\r\n   theta = 20      # so is this\r\n   rho   = 30      # <aol>me too!</aol>\r\n%]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tt2\",\r\n\t\t[\r\n\t\t\t[\"comment\", \"[%# this entire directive is ignored no\\r\\n    matter how many lines it wraps onto\\r\\n%]\" ]\r\n\t\t]\r\n\t],      \r\n\t[\"tt2\", \r\n\t\t[\r\n\t\t\t[\"delimiter\", \"[%\"],\r\n\t\t\t[\"comment\", \"# this is a comment\" ],\r\n\t\t\t[\"variable\", \"theta\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"number\", \"20\"],\r\n\t\t\t[\"comment\", \"# so is this\" ],\r\n\t\t\t[\"variable\", \"rho\"],\r\n\t\t\t[\"operator\", \"=\"],\r\n\t\t\t[\"number\", \"30\"],\r\n\t\t\t[\"comment\", \"# <aol>me too!</aol>\"],\r\n\t\t\t[\"delimiter\", \"%]\"]\r\n\t\t]\r\n\t]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for single-line and multi-line comments.\r\n"
  },
  {
    "path": "tests/languages/tt2/delimiter_feature.test",
    "content": "[%- %]\r\n[% -%]\r\n[%- -%]\r\n        [%\r\n  %]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tt2\", [[\"delimiter\", \"[%-\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],  [\"delimiter\", \"-%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%-\"], [\"delimiter\", \"-%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],  [\"delimiter\", \"%]\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for delimiters.\r\n"
  },
  {
    "path": "tests/languages/tt2/keyword_feature.test",
    "content": "[% BLOCK header %]\r\n[% CALL dbi.disconnect %]\r\n[% CASE 23 %]\r\n[% CATCH the.ball %]\r\n[% CLEAR %]\r\n[% DEBUG on %]\r\n[% DEBUG off %]\r\n[% DEFAULT answer = 42 %]\r\n[% ELSE %]\r\n[% ELSIF bar %]\r\n[% END %]\r\n[% FILTER html %]\r\n[% FINAL breathe %]\r\n[% FOREACH project IN time %]\r\n[% GET foo %]\r\n[% IF foo %]\r\n[% IN %]\r\n[% INCLUDE \"$inc\" %]\r\n[% INSERT filename.html %]\r\n[% LAST IF exhausted %]\r\n[% MACRO header INCLUDE header %]\r\n[% META title = 'Hello!' %]\r\n[% NEXT IF client %]\r\n[% PERL %]\r\n[% PROCESS \"functions.tt\" %]\r\n[% RAWPERL %]\r\n[% RETURN %]\r\n[% SET answer = 42 %]\r\n[% STOP %]\r\n[% SWITCH mday %]\r\n[% TAGS [@ @] %]\r\n[% THROW up %]\r\n[% TRY %]\r\n[% UNLESS fear %]\r\n[% USE Plugin %]\r\n[% WHILE my.guitar.gently.weeps %]\r\n[% WRAPPER 'html5.html' %]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"BLOCK\"], \r\n\t\t [\"variable\", \"header\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"CALL\"], \r\n\t\t [\"variable\", \"dbi.disconnect\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"CASE\"], \r\n\t\t [\"number\", \"23\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"CATCH\"], \r\n\t\t [\"variable\", \"the.ball\"], \r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"CLEAR\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"DEBUG\"],\r\n\t\t [\"variable\", \"on\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"DEBUG\"],\r\n\t\t [\"variable\", \"off\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"DEFAULT\"], \r\n\t\t [\"variable\", \"answer\"], [\"operator\", \"=\"], [\"number\", \"42\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"ELSE\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"ELSIF\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"END\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"FILTER\"], [\"variable\", \"html\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"FINAL\"], \r\n\t\t [\"variable\", \"breathe\"], \r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"FOREACH\"],\r\n\t\t [\"variable\", \"project\"], [\"keyword\", \"IN\"], [\"variable\", \"time\"] , \r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"GET\"], \r\n\t\t [\"variable\", \"foo\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"IF\"], [\"variable\", \"foo\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"IN\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"INCLUDE\"],\r\n\t\t [\"double-quoted-string\", [\"\\\"\", [\"variable\", \"$inc\"], \"\\\"\"]],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"INSERT\"],\r\n\t\t [\"variable\", \"filename.html\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"LAST\"],\r\n\t\t [\"keyword\", \"IF\"], [\"variable\", \"exhausted\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"MACRO\"], [\"variable\", \"header\"],\r\n\t\t [\"keyword\", \"INCLUDE\"], [\"variable\", \"header\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"META\"],\r\n\t\t [\"variable\", \"title\"], [\"operator\", \"=\"], [\"single-quoted-string\", \"'Hello!'\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"NEXT\"],\r\n\t\t [\"keyword\", \"IF\"], [\"variable\", \"client\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"PERL\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"PROCESS\"],\r\n\t\t [\"double-quoted-string\", [\"\\\"functions.tt\\\"\"]],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"RAWPERL\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"RETURN\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"SET\"], \r\n\t\t [\"variable\", \"answer\"], [\"operator\", \"=\"], [\"number\", \"42\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"STOP\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"SWITCH\"], [\"variable\", \"mday\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"TAGS\"],\r\n\t\t [\"punctuation\", \"[\"], \"@ @\", [\"punctuation\", \"]\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"THROW\"], \r\n\t\t [\"variable\", \"up\"], \r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"TRY\"], [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"UNLESS\"], [\"variable\", \"fear\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"USE\"], [\"variable\", \"Plugin\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"WHILE\"],\r\n\t\t [\"variable\", \"my.guitar.gently.weeps\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"], [\"keyword\", \"WRAPPER\"],\r\n\t\t [\"single-quoted-string\", \"'html5.html'\"],\r\n\t\t [\"delimiter\", \"%]\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/tt2/operator_feature.test",
    "content": "[% fat => comma %]\r\n[% foo == bar %]\r\n[% foo != bar %]\r\n[% foo <  bar %]\r\n[% foo <= bar %]\r\n[% foo >  bar %]\r\n[% foo >= bar %]\r\n[% foo =  bar %]\r\n[% foo && bar %]\r\n[% foo || bar %]\r\n[% foo | bar %]\r\n[% foo ! bar %]\r\n[% penthouse and pavement %]\r\n[% sooner or later %]\r\n[% love not war %]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"fat\"], [\"operator\", \"=>\"], [\"variable\", \"comma\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"foo\"], [\"operator\", \"==\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"foo\"], [\"operator\", \"!=\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"foo\"], [\"operator\", \"<\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"foo\"], [\"operator\", \"<=\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"foo\"], [\"operator\", \">\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"foo\"], [\"operator\", \">=\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"foo\"], [\"operator\", \"=\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"foo\"], [\"operator\", \"&&\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"foo\"], [\"operator\", \"||\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"foo\"], [\"operator\", \"|\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"foo\"], [\"operator\", \"!\"], [\"variable\", \"bar\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"penthouse\"], [\"operator\", \"and\"], [\"variable\", \"pavement\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"sooner\"], [\"operator\", \"or\"], [\"variable\", \"later\"],\r\n\t\t [\"delimiter\", \"%]\"]]],\r\n\t[\"tt2\", [[\"delimiter\", \"[%\"],\r\n\t\t [\"variable\", \"love\"], [\"operator\", \"not\"], [\"variable\", \"war\"],\r\n\t\t [\"delimiter\", \"%]\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/tt2/string-interpolation_feature.test",
    "content": "[% \"Hello, $name!\" %]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tt2\",\r\n\t\t[\r\n\t\t\t[\"delimiter\", \"[%\"],\r\n\t\t \t[\"double-quoted-string\", [\r\n\t\t\t\t \"\\\"Hello, \",\r\n\t\t\t\t [\"variable\", \"$name\"],\r\n\t\t\t\t \"!\\\"\"]\r\n\t\t\t],\r\n\t\t \t[\"delimiter\", \"%]\"]\r\n\t\t]\r\n\t]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for interpolation inside strings."
  },
  {
    "path": "tests/languages/tt2/string_feature.test",
    "content": "[%\r\n\"https://example.com/\"\r\n\" # not a comment\"\r\n\"multi-line\r\nstring\"\r\n\"escaped \\\"quotes\\\"\\nwork\\twell\"\r\n'https://example.com/'\r\n' # not a comment'\r\n'multi-line\r\nstring'\r\n'escaped \\'quotes\\' work'\r\n%]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tt2\", \r\n\t\t[\r\n\t\t\t[\"delimiter\", \"[%\"],\r\n\t\t\t[\"double-quoted-string\", [\"\\\"https://example.com/\\\"\"]],\r\n\t\t\t[\"double-quoted-string\", [\"\\\" # not a comment\\\"\"]],\r\n\t\t\t[\"double-quoted-string\", [\"\\\"multi-line\\r\\nstring\\\"\"]],\r\n\t\t\t[\"double-quoted-string\", [\"\\\"escaped \\\\\\\"quotes\\\\\\\"\\\\nwork\\\\twell\\\"\"]],\r\n\t\t\t[\"single-quoted-string\", \"'https://example.com/'\"],\r\n\t\t\t[\"single-quoted-string\", \"' # not a comment'\"],\r\n\t\t\t[\"single-quoted-string\", \"'multi-line\\r\\nstring'\"],\r\n\t\t\t[\"single-quoted-string\", \"'escaped \\\\'quotes\\\\' work'\"],\r\n\t\t\t[\"delimiter\", \"%]\"]\r\n\t\t]\r\n\t]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/tt2/variable_feature.test",
    "content": "[% \r\n\tfoo\r\n\tfoo.bar\r\n\tfoo.2\r\n\tfoo.1.bar.2.baz.3\r\n\tfoo.$index\r\n\tfoo\r\n\t\t.\r\n\t\t\tbar\r\n\tworld\r\n\thands\r\n\tknots\r\n%]\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tt2\", \r\n\t\t[\r\n\t\t\t[\"delimiter\", \"[%\"],\r\n\t\t\t[\"variable\", \"foo\"],\r\n\t\t\t[\"variable\", \"foo.bar\"],\r\n\t\t\t[\"variable\", \"foo.2\"],\r\n\t\t\t[\"variable\", \"foo.1.bar.2.baz.3\"],\r\n\t\t\t[\"variable\", \"foo.$index\"],\r\n\t\t\t[\"variable\", \"foo\\r\\n\\t\\t.\\r\\n\\t\\t\\tbar\"],\r\n\t\t\t[\"variable\", \"world\"],\r\n\t\t\t[\"variable\", \"hands\"],\r\n\t\t\t[\"variable\", \"knots\"],\r\n\t\t\t[\"delimiter\", \"%]\"]\r\n\t\t]\r\n\t]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for simple variables.\r\n"
  },
  {
    "path": "tests/languages/turtle/blank-node_feature.test",
    "content": "<http://www.w3.org/TR/rdf-syntax-grammar> <http://purl.org/dc/elements/1.1/title> \"RDF/XML Syntax Specification (Revised)\" .\r\n <http://www.w3.org/TR/rdf-syntax-grammar> <http://example.org/stuff/1.0/editor> _:bnode .\r\n _:bnode <http://example.org/stuff/1.0/fullname> \"Dave Beckett\" .\r\n _:bnode <http://example.org/stuff/1.0/homePage> <http://purl.org/net/dajobe/> .\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://www.w3.org/TR/rdf-syntax-grammar\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://purl.org/dc/elements/1.1/title\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"string\", \"\\\"RDF/XML Syntax Specification (Revised)\\\"\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://www.w3.org/TR/rdf-syntax-grammar\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://example.org/stuff/1.0/editor\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"_\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"bnode\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"_\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"bnode\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://example.org/stuff/1.0/fullname\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"string\", \"\\\"Dave Beckett\\\"\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"_\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"bnode\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://example.org/stuff/1.0/homePage\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://purl.org/net/dajobe/\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks blank node underscore prefixes."
  },
  {
    "path": "tests/languages/turtle/keyword_feature.test",
    "content": "@base <http://example.org/> .\r\nBASE <http://example.org/> .\r\n@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\r\nPREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\r\n\r\nGRAPH <urn:newGraph> {\r\n\t<urn:myClass> a rdfs:Class ;\r\n\t= <urn:equivalentClass> .\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"@base\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://example.org/\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"keyword\", \"BASE\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://example.org/\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"keyword\", \"@prefix\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"keyword\", \"PREFIX\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdfs\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://www.w3.org/2000/01/rdf-schema#\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"keyword\", \"GRAPH\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"urn:newGraph\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"urn:myClass\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"keyword\", \"a\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdfs\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"Class\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"=\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"urn:equivalentClass\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/turtle/language-tag_feature.test",
    "content": "show:218 show:localName \"That Seventies Show\"@en, \"test\"@en-t-es-t0-abcd .\r\nshow:218 show:localName 'Cette Série des Années Soixante-dix'@fr, \"Cette Série des Années Septante\"@fr-be .\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"218\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"localName\"]\r\n\t]],\r\n\t[\"string\", \"\\\"That Seventies Show\\\"\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"@\"],\r\n\t\t\"en\"\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"\\\"test\\\"\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"@\"],\r\n\t\t\"en-t-es-t0-abcd\"\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"218\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"localName\"]\r\n\t]],\r\n\t[\"string\", \"'Cette Série des Années Soixante-dix'\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"@\"],\r\n\t\t\"fr\"\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"\\\"Cette Série des Années Septante\\\"\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"@\"],\r\n\t\t\"fr-be\"\r\n\t]],\r\n\t[\"punctuation\", \".\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks language tags."
  },
  {
    "path": "tests/languages/turtle/local-name-with-colons_feature.test",
    "content": ":foo:bar:baz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"foo:bar:baz\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that local name containing colons is parsed correctly."
  },
  {
    "path": "tests/languages/turtle/number_feature.test",
    "content": "<1.1> rdf:value 1 .\r\n<1.2> rdf:value +1 .\r\n<1.3> rdf:value -1 .\r\n<2.1> rdf:value 1.13 .\r\n<2.2> rdf:value +1.13 .\r\n<2.3> rdf:value -1.13 .\r\n<3.1> rdf:value 1e3 .\r\n<3.2> rdf:value +1e3 .\r\n<3.3> rdf:value -1e3 .\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"1.1\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"value\"]\r\n\t]],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"1.2\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"value\"]\r\n\t]],\r\n\t[\"number\", \"+1\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"1.3\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"value\"]\r\n\t]],\r\n\t[\"number\", \"-1\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"2.1\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"value\"]\r\n\t]],\r\n\t[\"number\", \"1.13\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"2.2\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"value\"]\r\n\t]],\r\n\t[\"number\", \"+1.13\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"2.3\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"value\"]\r\n\t]],\r\n\t[\"number\", \"-1.13\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"3.1\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"value\"]\r\n\t]],\r\n\t[\"number\", \"1e3\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"3.2\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"value\"]\r\n\t]],\r\n\t[\"number\", \"+1e3\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"3.3\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"value\"]\r\n\t]],\r\n\t[\"number\", \"-1e3\"],\r\n\t[\"punctuation\", \".\"]\r\n]\r\n----------------------------------------------------\r\n\r\nChecks for supported numbers."
  },
  {
    "path": "tests/languages/turtle/punctuation_feature.test",
    "content": "@base <http://example.org/> .\r\n\r\nGRAPH <urn:newGraph> {\r\n\t<urn:myClass> a rdfs:Class, <other-class> ;\r\n\t= <urn:equivalentClass> .\r\n\t<urn:myList> a rdf:List ;\r\n\t\trdf:value [ a <blankNode> ;\r\n\t\t\trdf:value ( <list> <of> <things> () [] )\r\n\t\t\t] ;\r\n\t\t.\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"@base\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://example.org/\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"keyword\", \"GRAPH\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"urn:newGraph\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"urn:myClass\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"keyword\", \"a\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdfs\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"Class\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"other-class\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"=\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"urn:equivalentClass\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"urn:myList\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"keyword\", \"a\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"List\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"value\"]\r\n\t]],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"keyword\", \"a\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"blankNode\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdf\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"value\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"list\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"of\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"things\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all types of punctuation."
  },
  {
    "path": "tests/languages/turtle/string_feature.test",
    "content": "show:218 rdfs:label \"That Seventies Show\"^^xsd:string .            # literal with XML Schema string datatype\r\nshow:218 rdfs:label \"That Seventies Show\"^^<http://www.w3.org/2001/XMLSchema#string> . # same as above\r\nshow:218 rdfs:label \"That Seventies Show\" .                                            # same again\r\nshow:218 show:localName \"That Seventies Show\"@en .                 # literal with a language tag\r\nshow:218 show:localName 'Cette Série des Années Soixante-dix'@fr . # literal delimited by single quote\r\nshow:218 show:localName \"Cette Série des Années Septante\"@fr-be .  # literal with a region subtag\r\nshow:218 show:blurb '''This is a multi-line                        # literal with embedded new lines and quotes\r\nliteral with many quotes (\"\"\"\"\")\r\nand up to two sequential apostrophes ('').''' .\r\nshow:218 show:blurb \"\"\"This is a multi-line                        # literal with embedded new lines and apostrophes\r\nliteral with many apostrophes (''''')\r\nand up to two sequential quotes (\"\").\"\"\" .\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"218\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdfs\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"label\"]\r\n\t]],\r\n\t[\"string\", \"\\\"That Seventies Show\\\"\"],\r\n\t[\"punctuation\", \"^^\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"xsd\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"string\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"comment\", \"# literal with XML Schema string datatype\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"218\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdfs\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"label\"]\r\n\t]],\r\n\t[\"string\", \"\\\"That Seventies Show\\\"\"],\r\n\t[\"punctuation\", \"^^\"],\r\n\t[\"url\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t\"http://www.w3.org/2001/XMLSchema#string\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"comment\", \"# same as above\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"218\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"rdfs\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"label\"]\r\n\t]],\r\n\t[\"string\", \"\\\"That Seventies Show\\\"\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"comment\", \"# same again\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"218\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"localName\"]\r\n\t]],\r\n\t[\"string\", \"\\\"That Seventies Show\\\"\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"@\"],\r\n\t\t\"en\"\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"comment\", \"# literal with a language tag\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"218\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"localName\"]\r\n\t]],\r\n\t[\"string\", \"'Cette Série des Années Soixante-dix'\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"@\"],\r\n\t\t\"fr\"\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"comment\", \"# literal delimited by single quote\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"218\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"localName\"]\r\n\t]],\r\n\t[\"string\", \"\\\"Cette Série des Années Septante\\\"\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"@\"],\r\n\t\t\"fr-be\"\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"comment\", \"# literal with a region subtag\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"218\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"blurb\"]\r\n\t]],\r\n\t[\"multiline-string\", [\r\n\t\t\"'''This is a multi-line                        \",\r\n\t\t[\"comment\", \"# literal with embedded new lines and quotes\"],\r\n\t\t\"\\r\\nliteral with many quotes (\\\"\\\"\\\"\\\"\\\")\\r\\nand up to two sequential apostrophes ('').'''\"\r\n\t]],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"218\"]\r\n\t]],\r\n\t[\"function\", [\r\n\t\t[\"prefix\", [\r\n\t\t\t\"show\",\r\n\t\t\t[\"punctuation\", \":\"]\r\n\t\t]],\r\n\t\t[\"local-name\", \"blurb\"]\r\n\t]],\r\n\t[\"multiline-string\", [\r\n\t\t\"\\\"\\\"\\\"This is a multi-line                        \",\r\n\t\t[\"comment\", \"# literal with embedded new lines and apostrophes\"],\r\n\t\t\"\\r\\nliteral with many apostrophes (''''')\\r\\nand up to two sequential quotes (\\\"\\\").\\\"\\\"\\\"\"\r\n\t]],\r\n\t[\"punctuation\", \".\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/twig/boolean_feature.test",
    "content": "{{ null }}\r\n{{- true -}}\r\n{{ false }}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"boolean\", \"null\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{-\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"delimiter\", \"-}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"boolean\", \"false\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans and null.\r\n"
  },
  {
    "path": "tests/languages/twig/comment_feature.test",
    "content": "{##}\r\n{# foo #}\r\n{# foo\r\nbar #}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"twig-comment\", \"{##}\"],\r\n\t[\"twig-comment\", \"{# foo #}\"],\r\n\t[\"twig-comment\", \"{# foo\\r\\nbar #}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/twig/keyword_feature.test",
    "content": "{% for foo in bar if baz %}{% endfor %}\r\n{%- if foo() -%}{%- endif -%}\r\n{% macro foobar() %}{% endmacro %}\r\n{{ foo is even or bar is odd }}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"for\"],\r\n\t\t\" foo \",\r\n\t\t[\"operator\", \"in\"],\r\n\t\t\" bar \",\r\n\t\t[\"keyword\", \"if\"],\r\n\t\t\" baz \",\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"endfor\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%-\"],\r\n\t\t[\"tag-name\", \"if\"],\r\n\t\t\" foo\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"-%}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%-\"],\r\n\t\t[\"tag-name\", \"endif\"],\r\n\t\t[\"delimiter\", \"-%}\"]\r\n\t]],\r\n\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"macro\"],\r\n\t\t\" foobar\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"endmacro\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" foo \",\r\n\t\t[\"operator\", \"is\"],\r\n\t\t[\"keyword\", \"even\"],\r\n\t\t[\"operator\", \"or\"],\r\n\t\t\" bar \",\r\n\t\t[\"operator\", \"is\"],\r\n\t\t[\"keyword\", \"odd\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/twig/markup_feature.test",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>My Webpage</title>\n    </head>\n    <body>\n        <ul id=\"navigation\">\n        {% for item in navigation %}\n            <li><a href=\"{{ item.href }}\">{{ item.caption }}</a></li>\n        {% endfor %}\n        </ul>\n\n        <h1>My Webpage</h1>\n        {{ a_variable }}\n    </body>\n</html>\n\n----------------------------------------------------\n\n[\n\t[\"doctype\", [\n\t\t[\"punctuation\", \"<!\"],\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\n\t\t[\"name\", \"html\"],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"html\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"head\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"title\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\"My Webpage\",\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"title\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"head\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"body\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"ul\"]],\n\t\t[\"attr-name\", [\"id\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\"navigation\",\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"twig\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"tag-name\", \"for\"],\n\t\t\" item \",\n\t\t[\"operator\", \"in\"],\n\t\t\" navigation \",\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"li\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"a\"]],\n\t\t[\"attr-name\", [\"href\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t[\"twig\", [\n\t\t\t\t[\"delimiter\", \"{{\"],\n\t\t\t\t\" item\",\n\t\t\t\t[\"punctuation\", \".\"],\n\t\t\t\t\"href \",\n\t\t\t\t[\"delimiter\", \"}}\"]\n\t\t\t]],\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"twig\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t\" item\",\n\t\t[\"punctuation\", \".\"],\n\t\t\"caption \",\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"a\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"li\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"twig\", [\n\t\t[\"delimiter\", \"{%\"],\n\t\t[\"tag-name\", \"endfor\"],\n\t\t[\"delimiter\", \"%}\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"ul\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"h1\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\"My Webpage\",\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"h1\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"twig\", [\n\t\t[\"delimiter\", \"{{\"],\n\t\t\" a_variable \",\n\t\t[\"delimiter\", \"}}\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"body\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"html\"]],\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/twig/number_feature.test",
    "content": "{{ 0xBadFace }}\r\n{{ 42 }}\r\n{{ 3.14159 }}\r\n{{ 3e15 }}\r\n{{ 4.5E-4 }}\r\n{{ 0.2e+8 }}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"number\", \"0xBadFace\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"number\", \"42\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"number\", \"3.14159\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"number\", \"3e15\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"number\", \"4.5E-4\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"number\", \"0.2e+8\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for hexadecimal and decimal numbers.\r\n"
  },
  {
    "path": "tests/languages/twig/operator_feature.test",
    "content": "{% set a = 4 %}\r\n{{ a == 4 }}\r\n{{ b != c }}\r\n{{ c < d }}\r\n{{ d <= e }}\r\n{{ e > f }}\r\n{{ f >= g }}\r\n{{ g + h }}\r\n{{ h - i }}\r\n{{ i ~ j }}\r\n{{ j * k }}\r\n{{ k ** l }}\r\n{{ l / m }}\r\n{{ m // n }}\r\n{{ n % o }}\r\n{{ o|default('foo') }}\r\n{{ p ? q : r }}\r\n{{ s ?: t }}\r\n\r\n{% if a and b or not c %}\r\n{% for p in foo %}\r\n{% if d b-and e and f b-xor g or h b-or i %}\r\n{% if j starts with 'h' %}\r\n{% if i ends with 'j' %}\r\n{% if k is same as false %}\r\n{% if l matches '/f[o]{2,}(?:bar)?' %}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"set\"],\r\n\t\t\" a \",\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" a \",\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" b \",\r\n\t\t[\"operator\", \"!=\"],\r\n\t\t\" c \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" c \",\r\n\t\t[\"operator\", \"<\"],\r\n\t\t\" d \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" d \",\r\n\t\t[\"operator\", \"<=\"],\r\n\t\t\" e \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" e \",\r\n\t\t[\"operator\", \">\"],\r\n\t\t\" f \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" f \",\r\n\t\t[\"operator\", \">=\"],\r\n\t\t\" g \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" g \",\r\n\t\t[\"operator\", \"+\"],\r\n\t\t\" h \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" h \",\r\n\t\t[\"operator\", \"-\"],\r\n\t\t\" i \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" i \",\r\n\t\t[\"operator\", \"~\"],\r\n\t\t\" j \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" j \",\r\n\t\t[\"operator\", \"*\"],\r\n\t\t\" k \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" k \",\r\n\t\t[\"operator\", \"**\"],\r\n\t\t\" l \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" l \",\r\n\t\t[\"operator\", \"/\"],\r\n\t\t\" m \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" m \",\r\n\t\t[\"operator\", \"//\"],\r\n\t\t\" n \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" n \",\r\n\t\t[\"operator\", \"%\"],\r\n\t\t\" o \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" o\",\r\n\t\t[\"operator\", \"|\"],\r\n\t\t\"default\",\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", [\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"foo\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" p \",\r\n\t\t[\"operator\", \"?\"],\r\n\t\t\" q \",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\" r \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t\" s \",\r\n\t\t[\"operator\", \"?:\"],\r\n\t\t\" t \",\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"if\"],\r\n\t\t\" a \",\r\n\t\t[\"operator\", \"and\"],\r\n\t\t\" b \",\r\n\t\t[\"operator\", \"or\"],\r\n\t\t[\"operator\", \"not\"],\r\n\t\t\" c \",\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"for\"],\r\n\t\t\" p \",\r\n\t\t[\"operator\", \"in\"],\r\n\t\t\" foo \",\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"if\"],\r\n\t\t\" d \",\r\n\t\t[\"operator\", \"b-and\"],\r\n\t\t\" e \",\r\n\t\t[\"operator\", \"and\"],\r\n\t\t\" f \",\r\n\t\t[\"operator\", \"b-xor\"],\r\n\t\t\" g \",\r\n\t\t[\"operator\", \"or\"],\r\n\t\t\" h \",\r\n\t\t[\"operator\", \"b-or\"],\r\n\t\t\" i \",\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"if\"],\r\n\t\t\" j \",\r\n\t\t[\"operator\", \"starts with\"],\r\n\t\t[\"string\", [\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"h\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"if\"],\r\n\t\t\" i \",\r\n\t\t[\"operator\", \"ends with\"],\r\n\t\t[\"string\", [\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"j\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"if\"],\r\n\t\t\" k \",\r\n\t\t[\"operator\", \"is\"],\r\n\t\t[\"operator\", \"same as\"],\r\n\t\t[\"boolean\", \"false\"],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{%\"],\r\n\t\t[\"tag-name\", \"if\"],\r\n\t\t\" l \",\r\n\t\t[\"operator\", \"matches\"],\r\n\t\t[\"string\", [\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"/f[o]{2,}(?:bar)?\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"%}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/twig/string_feature.test",
    "content": "{{ '' }}\r\n{{ \"\" }}\r\n{{ \"ba\\\"r\" }}\r\n{{ 'ba\\'z' }}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", [\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", [\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", [\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t\"ba\\\\\\\"r\",\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]],\r\n\t[\"twig\", [\r\n\t\t[\"delimiter\", \"{{\"],\r\n\t\t[\"string\", [\r\n\t\t\t[\"punctuation\", \"'\"],\r\n\t\t\t\"ba\\\\'z\",\r\n\t\t\t[\"punctuation\", \"'\"]\r\n\t\t]],\r\n\t\t[\"delimiter\", \"}}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/twig+pug/twig_inclusion.test",
    "content": ":atpl\r\n\t{{42}}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"filter-atpl\", [\r\n\t\t[\"filter-name\", \":atpl\"],\r\n\t\t[\"text\", [\r\n\t\t\t[\"twig\", [\r\n\t\t\t\t[\"delimiter\", \"{{\"],\r\n\t\t\t\t[\"number\", \"42\"],\r\n\t\t\t\t[\"delimiter\", \"}}\"]\r\n\t\t\t]]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for atpl filter (Twig) in pug.\r\n"
  },
  {
    "path": "tests/languages/typescript/builtin_feature.test",
    "content": "string\r\nFunction\r\nany\r\nnumber\r\nboolean\r\nArray\r\nsymbol\r\nconsole\r\nPromise\r\nunknown\r\nnever\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"string\"],\r\n\t[\"builtin\", \"Function\"],\r\n\t[\"builtin\", \"any\"],\r\n\t[\"builtin\", \"number\"],\r\n\t[\"builtin\", \"boolean\"],\r\n\t[\"builtin\", \"Array\"],\r\n\t[\"builtin\", \"symbol\"],\r\n\t[\"builtin\", \"console\"],\r\n\t[\"builtin\", \"Promise\"],\r\n\t[\"builtin\", \"unknown\"],\r\n\t[\"builtin\", \"never\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for builtins."
  },
  {
    "path": "tests/languages/typescript/class-name_feature.test",
    "content": "interface Dictionary<T> {\r\n\t[key: string]: T;\r\n}\r\n\r\ninterface Foo extends Dictionary<number> {}\r\n\r\nclass Bar<T> extends Baz<T> implements FooBar<number, T | null> {}\r\n\r\ntype Record<K extends keyof any, T> = {\r\n\t[P in K]: T;\r\n}\r\ntype Diff<T, U> = T extends U ? never : T;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"class-name\", [\r\n\t\t\"Dictionary\",\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"constant\", \"T\"],\r\n\t\t[\"operator\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"key\",\r\n\t[\"operator\", \":\"],\r\n\t[\"builtin\", \"string\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"constant\", \"T\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"class-name\", [\r\n\t\t\"Foo\"\r\n\t]],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\r\n\t\t\"Dictionary\",\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"builtin\", \"number\"],\r\n\t\t[\"operator\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\r\n\t\t\"Bar\",\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"constant\", \"T\"],\r\n\t\t[\"operator\", \">\"]\r\n\t]],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\r\n\t\t\"Baz\",\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"constant\", \"T\"],\r\n\t\t[\"operator\", \">\"]\r\n\t]],\r\n\t[\"keyword\", \"implements\"],\r\n\t[\"class-name\", [\r\n\t\t\"FooBar\",\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"builtin\", \"number\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"constant\", \"T\"],\r\n\t\t[\"operator\", \"|\"],\r\n\t\t[\"keyword\", \"null\"],\r\n\t\t[\"operator\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"type\"],\r\n\t[\"class-name\", [\r\n\t\t\"Record\",\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"constant\", \"K\"],\r\n\t\t[\"keyword\", \"extends\"],\r\n\t\t[\"keyword\", \"keyof\"],\r\n\t\t[\"builtin\", \"any\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"constant\", \"T\"],\r\n\t\t[\"operator\", \">\"]\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"constant\", \"P\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"constant\", \"K\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"constant\", \"T\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"type\"],\r\n\t[\"class-name\", [\r\n\t\t\"Diff\",\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"constant\", \"T\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"constant\", \"U\"],\r\n\t\t[\"operator\", \">\"]\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"constant\", \"T\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\r\n\t\t[\"constant\", \"U\"]\r\n\t]],\r\n\t[\"operator\", \"?\"],\r\n\t[\"builtin\", \"never\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"constant\", \"T\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class, interface, and other type names.\r\n"
  },
  {
    "path": "tests/languages/typescript/decorator_feature.test",
    "content": "@f @g x\r\n\r\n@f\r\n@g\r\nx\r\n\r\n@sealed\r\nclass ExampleClass {\r\n\r\n  @first()\r\n  @second()\r\n  method() {}\r\n\r\n  @enumerable(false)\r\n  greet() {\r\n    return \"Hello, \" + this.greeting;\r\n  }\r\n\r\n  @configurable(false)\r\n  get y() {\r\n    return this._y;\r\n  }\r\n\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"decorator\", [\r\n\t\t[\"at\", \"@\"],\r\n\t\t[\"function\", \"f\"]\r\n\t]],\r\n\t[\"decorator\", [\r\n\t\t[\"at\", \"@\"],\r\n\t\t[\"function\", \"g\"]\r\n\t]],\r\n\t\" x\\r\\n\\r\\n\",\r\n\r\n\t[\"decorator\", [\r\n\t\t[\"at\", \"@\"],\r\n\t\t[\"function\", \"f\"]\r\n\t]],\r\n\t[\"decorator\", [\r\n\t\t[\"at\", \"@\"],\r\n\t\t[\"function\", \"g\"]\r\n\t]],\r\n\t\"\\r\\nx\\r\\n\\r\\n\",\r\n\r\n\t[\"decorator\", [\r\n\t\t[\"at\", \"@\"],\r\n\t\t[\"function\", \"sealed\"]\r\n\t]],\r\n\t[\"keyword\", \"class\"], [\"class-name\", [\"ExampleClass\"]], [\"punctuation\", \"{\"],\r\n\r\n\t[\"decorator\", [\r\n\t\t[\"at\", \"@\"],\r\n\t\t[\"function\", \"first\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"decorator\", [\r\n\t\t[\"at\", \"@\"],\r\n\t\t[\"function\", \"second\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"method\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"decorator\", [\r\n\t\t[\"at\", \"@\"],\r\n\t\t[\"function\", \"enumerable\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"boolean\", \"false\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"greet\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"string\", \"\\\"Hello, \\\"\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"greeting\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"decorator\", [\r\n\t\t[\"at\", \"@\"],\r\n\t\t[\"function\", \"configurable\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"boolean\", \"false\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"get\"],\r\n\t[\"function\", \"y\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"_y\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]"
  },
  {
    "path": "tests/languages/typescript/function_feature.test",
    "content": "function getProperty<T, K extends keyof T>(o: T, propertyName: K): T[K] { }\r\n\r\ndeclare function f<T extends boolean>(x: T): T extends true ? string : number;\r\n\r\nfunction assert(condition: any, msg?: string): asserts condition { }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"function\"],\r\n\t[\"generic-function\", [\r\n\t\t[\"function\", \"getProperty\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"operator\", \"<\"],\r\n\t\t\t[\"constant\", \"T\"],\r\n\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t[\"constant\", \"K\"],\r\n\t\t\t[\"keyword\", \"extends\"],\r\n\t\t\t[\"keyword\", \"keyof\"],\r\n\t\t\t[\"constant\", \"T\"],\r\n\t\t\t[\"operator\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"o\",\r\n\t[\"operator\", \":\"],\r\n\t[\"constant\", \"T\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" propertyName\",\r\n\t[\"operator\", \":\"],\r\n\t[\"constant\", \"K\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"constant\", \"T\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"constant\", \"K\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"declare\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"generic-function\", [\r\n\t\t[\"function\", \"f\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"operator\", \"<\"],\r\n\t\t\t[\"constant\", \"T\"],\r\n\t\t\t[\"keyword\", \"extends\"],\r\n\t\t\t[\"builtin\", \"boolean\"],\r\n\t\t\t[\"operator\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"x\",\r\n\t[\"operator\", \":\"],\r\n\t[\"constant\", \"T\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"constant\", \"T\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", [\r\n\t\t[\"boolean\", \"true\"]\r\n\t]],\r\n\t[\"operator\", \"?\"],\r\n\t[\"builtin\", \"string\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"builtin\", \"number\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"assert\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"condition\",\r\n\t[\"operator\", \":\"],\r\n\t[\"builtin\", \"any\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" msg\",\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"builtin\", \"string\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"keyword\", \"asserts\"],\r\n\t\" condition \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions.\r\n"
  },
  {
    "path": "tests/languages/typescript/issue2819.test",
    "content": "@Component({\r\n  selector: 'my-app',\r\n  template: `<div>Hello World!</div>`\r\n})\r\nexport class AppComponent {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"decorator\", [\r\n\t\t[\"at\", \"@\"],\r\n\t\t[\"function\", \"Component\"]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t\"\\r\\n  selector\",\r\n\t[\"operator\", \":\"],\r\n\t[\"string\", \"'my-app'\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t\"\\r\\n  template\",\r\n\t[\"operator\", \":\"],\r\n\t[\"template-string\", [\r\n\t\t[\"template-punctuation\", \"`\"],\r\n\t\t[\"string\", \"<div>Hello World!</div>\"],\r\n\t\t[\"template-punctuation\", \"`\"]\r\n\t]],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"AppComponent\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]"
  },
  {
    "path": "tests/languages/typescript/issue2860.test",
    "content": "export interface R<T> {\r\n  data: T;\r\n  total: number;\r\n  type?: string;\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"class-name\", [\r\n\t\t[\"constant\", \"R\"],\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"constant\", \"T\"],\r\n\t\t[\"operator\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t\"\\r\\n  data\",\r\n\t[\"operator\", \":\"],\r\n\t[\"constant\", \"T\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\n  total\",\r\n\t[\"operator\", \":\"],\r\n\t[\"builtin\", \"number\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\n  type\",\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \":\"],\r\n\t[\"builtin\", \"string\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n"
  },
  {
    "path": "tests/languages/typescript/issue3000.test",
    "content": "import { infer, inference, infer } from 'module'\n//              ~~~~~ ✅\n\nimport { type, typeDefs, type } from 'module'\n//             ~~~~ ✅\n\nimport { const, constants, const } from 'module'\n//              ~~~~~ ✅\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"import\"],\n\t[\"punctuation\", \"{\"],\n\t\" infer\",\n\t[\"punctuation\", \",\"],\n\t\" inference\",\n\t[\"punctuation\", \",\"],\n\t\" infer \",\n\t[\"punctuation\", \"}\"],\n\t[\"keyword\", \"from\"],\n\t[\"string\", \"'module'\"],\n\n\t[\"comment\", \"//              ~~~~~ ✅\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"punctuation\", \"{\"],\n\t\" type\",\n\t[\"punctuation\", \",\"],\n\t\" typeDefs\",\n\t[\"punctuation\", \",\"],\n\t\" type \",\n\t[\"punctuation\", \"}\"],\n\t[\"keyword\", \"from\"],\n\t[\"string\", \"'module'\"],\n\n\t[\"comment\", \"//             ~~~~ ✅\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"punctuation\", \"{\"],\n\t[\"keyword\", \"const\"],\n\t[\"punctuation\", \",\"],\n\t\" constants\",\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"const\"],\n\t[\"punctuation\", \"}\"],\n\t[\"keyword\", \"from\"],\n\t[\"string\", \"'module'\"],\n\n\t[\"comment\", \"//              ~~~~~ ✅\"]\n]\n"
  },
  {
    "path": "tests/languages/typescript/keyword_feature.html.test",
    "content": "as;\nawait;\nbreak;\ncase;\nclass;\nconst;\ncontinue;\ndebugger;\ndefault;\ndelete;\ndo;\nelse;\nenum;\nexport;\nextends;\nfor;\nif;\nimplements;\nimport;\nin;\ninstanceof;\ninterface;\nlet;\nnew;\nnull;\nof;\npackage;\nprivate;\nprotected;\npublic;\nreturn;\nstatic;\nsuper;\nswitch;\nthis;\nthrow;\ntry;\ntypeof;\nundefined;\nvar;\nvoid;\nwhile;\nwith;\nyield;\n\n// contextual keywords\n\ntry {} catch {} finally {}\ntry {} catch (e) {} finally {}\nasync function (){}\nasync a => {}\nasync (a,b,c) => {}\nimport {} from \"foo\"\nimport {} from 'foo'\nclass { get foo(){} set baz(){} get [value](){} }\n\n// import assertion\nimport json from \"./foo.json\" assert { type: \"json\" };\n\n// variables, not keywords\n\nconst { async, from, to } = bar;\npromise.catch(foo).finally(bar);\nassert.equal(foo, bar);\n\n// TypeScript keywords\n\nabstract;\nas;\ndeclare;\nimplements;\nis;\nkeyof;\nreadonly;\nrequire;\n\n// contextual keywords\n\nasserts foo;\ninfer foo;\ninterface foo;\nmodule foo;\nnamespace foo;\ntype foo;\n\nimport type { Component } from \"react\";\nimport type *, {}\n\n----------------------------------------------------\n\n<span class=\"token keyword module\">as</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">await</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">break</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">case</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">class</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">continue</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">debugger</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">default</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">delete</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">do</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">else</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">enum</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword module\">export</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">extends</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">for</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">if</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">implements</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword module\">import</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">in</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">instanceof</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">interface</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">new</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">null</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">of</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">package</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">private</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">protected</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">public</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">return</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">static</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">super</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">switch</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">this</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">throw</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">try</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">typeof</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">undefined</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">void</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">while</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">with</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword control-flow\">yield</span>\n<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// contextual keywords</span>\n\n<span class=\"token keyword control-flow\">try</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword control-flow\">catch</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword control-flow\">finally</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword control-flow\">try</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword control-flow\">catch</span>\n<span class=\"token punctuation\">(</span>\ne\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword control-flow\">finally</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">async</span>\n<span class=\"token keyword\">function</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">async</span>\na\n<span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">async</span>\n<span class=\"token punctuation\">(</span>\na\n<span class=\"token punctuation\">,</span>\nb\n<span class=\"token punctuation\">,</span>\nc\n<span class=\"token punctuation\">)</span>\n<span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword module\">import</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword module\">from</span>\n<span class=\"token string\">\"foo\"</span>\n<span class=\"token keyword module\">import</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword module\">from</span>\n<span class=\"token string\">'foo'</span>\n<span class=\"token keyword\">class</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token keyword\">get</span>\n<span class=\"token function\">foo</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">set</span>\n<span class=\"token function\">baz</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">get</span>\n<span class=\"token punctuation\">[</span>\nvalue\n<span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">(</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// import assertion</span>\n<span class=\"token keyword module\">import</span>\njson\n<span class=\"token keyword module\">from</span>\n<span class=\"token string\">\"./foo.json\"</span>\n<span class=\"token keyword module\">assert</span>\n<span class=\"token punctuation\">{</span>\ntype\n<span class=\"token operator\">:</span>\n<span class=\"token string\">\"json\"</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// variables, not keywords</span>\n\n<span class=\"token keyword\">const</span>\n<span class=\"token punctuation\">{</span>\nasync\n<span class=\"token punctuation\">,</span>\nfrom\n<span class=\"token punctuation\">,</span>\nto\n<span class=\"token punctuation\">}</span>\n<span class=\"token operator\">=</span>\nbar\n<span class=\"token punctuation\">;</span>\npromise\n<span class=\"token punctuation\">.</span>\n<span class=\"token function\">catch</span>\n<span class=\"token punctuation\">(</span>\nfoo\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span>\n<span class=\"token function\">finally</span>\n<span class=\"token punctuation\">(</span>\nbar\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">;</span>\nassert\n<span class=\"token punctuation\">.</span>\n<span class=\"token function\">equal</span>\n<span class=\"token punctuation\">(</span>\nfoo\n<span class=\"token punctuation\">,</span>\nbar\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// TypeScript keywords</span>\n\n<span class=\"token keyword\">abstract</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword module\">as</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">declare</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">implements</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">is</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">keyof</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">readonly</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">require</span>\n<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// contextual keywords</span>\n\n<span class=\"token keyword\">asserts</span>\nfoo\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">infer</span>\nfoo\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">interface</span>\n<span class=\"token class-name\">foo</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">module</span>\nfoo\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">namespace</span>\nfoo\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span>\n<span class=\"token class-name\">foo</span>\n<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword module\">import</span>\n<span class=\"token keyword\">type</span>\n<span class=\"token punctuation\">{</span>\nComponent\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword module\">from</span>\n<span class=\"token string\">\"react\"</span>\n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword module\">import</span>\n<span class=\"token keyword\">type</span>\n<span class=\"token operator\">*</span>\n<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/typescript/keyword_feature.test",
    "content": "as;\r\nawait;\r\nbreak;\r\ncase;\r\nclass;\r\nconst;\r\ncontinue;\r\ndebugger;\r\ndefault;\r\ndelete;\r\ndo;\r\nelse;\r\nenum;\r\nexport;\r\nextends;\r\nfor;\r\nif;\r\nimplements;\r\nimport;\r\nin;\r\ninstanceof;\r\ninterface;\r\nlet;\r\nnew;\r\nnull;\r\nof;\r\nout;\r\npackage;\r\nprivate;\r\nprotected;\r\npublic;\r\nreturn;\r\nsatisfies;\r\nstatic;\r\nsuper;\r\nswitch;\r\nthis;\r\nthrow;\r\ntry;\r\ntypeof;\r\nundefined;\r\nvar;\r\nvoid;\r\nwhile;\r\nwith;\r\nyield;\r\n\r\n// contextual keywords\r\n\r\ntry {} catch {} finally {}\r\ntry {} catch (e) {} finally {}\r\nasync function (){}\r\nasync a => {}\r\nasync (a,b,c) => {}\r\nimport {} from \"foo\"\r\nimport {} from 'foo'\r\nclass { get foo(){} set baz(){} get [value](){} }\r\n\r\n// variables, not keywords\r\n\r\nconst { async, from, to } = bar;\r\npromise.catch(foo).finally(bar);\r\n\r\n// TypeScript keywords\r\n\r\nabstract;\r\nas;\r\ndeclare;\r\nimplements;\r\nis;\r\nkeyof;\r\nreadonly;\r\nrequire;\r\n\r\n// contextual keywords\r\n\r\nasserts foo;\r\ninfer foo;\r\ninterface foo;\r\nmodule foo;\r\nnamespace foo;\r\ntype foo;\r\n\r\nimport type { Component } from \"react\";\r\nimport type *, {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"await\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"case\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"debugger\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"default\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"delete\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"do\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"export\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"extends\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"import\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"instanceof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"let\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"new\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"null\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"of\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"out\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"package\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"private\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"protected\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"public\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"satisfies\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"super\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"switch\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"this\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"throw\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"try\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"typeof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"undefined\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"var\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"void\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"with\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"yield\"], [\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"// contextual keywords\"],\r\n\r\n\t[\"keyword\", \"try\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"try\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"e\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"async\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"async\"],\r\n\t\" a \",\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"async\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"a\",\r\n\t[\"punctuation\", \",\"],\r\n\t\"b\",\r\n\t[\"punctuation\", \",\"],\r\n\t\"c\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"string\", \"'foo'\"],\r\n\r\n\t[\"keyword\", \"class\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"function\", \"baz\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t\"value\",\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"comment\", \"// variables, not keywords\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" async\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" from\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" to \",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"operator\", \"=\"],\r\n\t\" bar\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t\"\\r\\npromise\",\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"catch\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"foo\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \".\"],\r\n\t[\"function\", \"finally\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"bar\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"// TypeScript keywords\"],\r\n\r\n\t[\"keyword\", \"abstract\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"as\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"declare\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"implements\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"is\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"keyof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"readonly\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"require\"], [\"punctuation\", \";\"],\r\n\r\n\t[\"comment\", \"// contextual keywords\"],\r\n\r\n\t[\"keyword\", \"asserts\"], \" foo\", [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"infer\"], \" foo\", [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"interface\"], [\"class-name\", [\"foo\"]], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"module\"], \" foo\", [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"namespace\"], \" foo\", [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"type\"], [\"class-name\", [\"foo\"]], [\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" Component \",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"keyword\", \"from\"],\r\n\t[\"string\", \"\\\"react\\\"\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/typoscript/comment_feature.test",
    "content": "// comment\r\n# comment\r\ntext // comment\r\n/*\r\ncomment\r\n*/\r\nfoo = bar // comment\r\nbaz = //url\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// comment\"],\r\n\t[\"comment\", \"# comment\"],\r\n\t[\"tag\", [\"text\"]], [\"comment\", \"// comment\"],\r\n\t[\"comment\", \"/*\\r\\ncomment\\r\\n*/\"],\r\n\t[\"tag\", [\"foo\"]], [\"operator\", \"=\"], [\"string\", [\"bar \"]], [\"comment\", \"// comment\"],\r\n\t[\"tag\", [\"baz\"]], [\"operator\", \"=\"], [\"string\", [\"//url\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/typoscript/function_feature.test",
    "content": "@import 'foo'\r\n@import \"bar\"\r\n<INCLUDE_TYPOSCRIPT: source=\"FILE:EXT:baz.typoscript\">\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", [\"@import \", [\"string\", \"'foo'\"]]],\r\n\t[\"function\", [\"@import \", [\"string\", \"\\\"bar\\\"\"]]],\r\n\t[\"function\", [\"<\", [\"keyword\", \"INCLUDE_TYPOSCRIPT\"], \": source=\", [\"string\", [\"\\\"\", [\"keyword\", \"FILE\"], \":\", [\"keyword\", \"EXT\"], \":baz.typoscript\\\"\"]], \">\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for import functions.\r\n"
  },
  {
    "path": "tests/languages/typoscript/keyword_feature.test",
    "content": "TEXT LLL EXT _GIFBUILDER CARRAY CASE CLEARGIF COA COA_INT CONSTANTS CONTENT\r\nEDITPANEL EFFECT FILE FORM FRAME FRAMESET FLUIDTEMPLATE GIFBUILDER\r\nglobal globalString globalVar GMENU GMENU_FOLDOUT GMENU_LAYERS GP\r\nHMENU HRULER HTML IENV IMAGE IMG_RESOURCE IMGMENU IMGMENUITEM IMGTEXT\r\nJSMENU JSMENUITEM LOAD_REGISTER PAGE RECORDS RESTORE_REGISTER TEMPLATE\r\nTMENU TMENU_LAYERS TMENUITEM USER USER_INT INCLUDE_TYPOSCRIPT NO ACT\r\nIFSUB ACTIFSUB CUR\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"TEXT\"],\r\n\t[\"keyword\", \"LLL\"],\r\n\t[\"keyword\", \"EXT\"],\r\n\t[\"keyword\", \"_GIFBUILDER\"],\r\n\t[\"keyword\", \"CARRAY\"],\r\n\t[\"keyword\", \"CASE\"],\r\n\t[\"keyword\", \"CLEARGIF\"],\r\n\t[\"keyword\", \"COA\"],\r\n\t[\"keyword\", \"COA_INT\"],\r\n\t[\"keyword\", \"CONSTANTS\"],\r\n\t[\"keyword\", \"CONTENT\"],\r\n\t[\"keyword\", \"EDITPANEL\"],\r\n\t[\"keyword\", \"EFFECT\"],\r\n\t[\"keyword\", \"FILE\"],\r\n\t[\"keyword\", \"FORM\"],\r\n\t[\"keyword\", \"FRAME\"],\r\n\t[\"keyword\", \"FRAMESET\"],\r\n\t[\"keyword\", \"FLUIDTEMPLATE\"],\r\n\t[\"keyword\", \"GIFBUILDER\"],\r\n\t[\"keyword\", \"global\"],\r\n\t[\"keyword\", \"globalString\"],\r\n\t[\"keyword\", \"globalVar\"],\r\n\t[\"keyword\", \"GMENU\"],\r\n\t[\"keyword\", \"GMENU_FOLDOUT\"],\r\n\t[\"keyword\", \"GMENU_LAYERS\"],\r\n\t[\"keyword\", \"GP\"],\r\n\t[\"keyword\", \"HMENU\"],\r\n\t[\"keyword\", \"HRULER\"],\r\n\t[\"keyword\", \"HTML\"],\r\n\t[\"keyword\", \"IENV\"],\r\n\t[\"keyword\", \"IMAGE\"],\r\n\t[\"keyword\", \"IMG_RESOURCE\"],\r\n\t[\"keyword\", \"IMGMENU\"],\r\n\t[\"keyword\", \"IMGMENUITEM\"],\r\n\t[\"keyword\", \"IMGTEXT\"],\r\n\t[\"keyword\", \"JSMENU\"],\r\n\t[\"keyword\", \"JSMENUITEM\"],\r\n\t[\"keyword\", \"LOAD_REGISTER\"],\r\n\t[\"keyword\", \"PAGE\"],\r\n\t[\"keyword\", \"RECORDS\"],\r\n\t[\"keyword\", \"RESTORE_REGISTER\"],\r\n\t[\"keyword\", \"TEMPLATE\"],\r\n\t[\"keyword\", \"TMENU\"],\r\n\t[\"keyword\", \"TMENU_LAYERS\"],\r\n\t[\"keyword\", \"TMENUITEM\"],\r\n\t[\"keyword\", \"USER\"],\r\n\t[\"keyword\", \"USER_INT\"],\r\n\t[\"keyword\", \"INCLUDE_TYPOSCRIPT\"],\r\n\t[\"keyword\", \"NO\"],\r\n\t[\"keyword\", \"ACT\"],\r\n\t[\"keyword\", \"IFSUB\"],\r\n\t[\"keyword\", \"ACTIFSUB\"],\r\n\t[\"keyword\", \"CUR\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/typoscript/number_feature.test",
    "content": "foo = 423\r\nbar=1\r\nbaz.10 =\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\"foo\"]], [\"operator\", \"=\"], [\"string\", [[\"number\", \"423\"]]],\r\n\t[\"tag\", [\"bar\"]], [\"operator\", \"=\"], [\"string\", [[\"number\", \"1\"]]],\r\n\t[\"tag\", [\"baz\", [\"punctuation\", \".\"]]],[\"number\", [\"10 \", [\"operator\", \"=\"]]], [\"string\", []]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for import functions.\r\n"
  },
  {
    "path": "tests/languages/typoscript/tag_string_feature.test",
    "content": "foo.bar.baz = HMENU\r\nfoo.bar.baz {\r\n\tbaz.foo = bar\r\n\tbar = {$const.foo}\r\n\tfoo = LLL:EXT:str\r\n\tIFSUB < .NO\r\n\tIFSUB = 1\r\n\tIFSUB {\r\n\t\tfoo = bar\r\n\t}\r\n}\r\nNamespace\\Classes\\Test {\r\n\tbaz.foo = bar\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\"foo\",[\"punctuation\", \".\"]]], [\"tag\", [\"bar\", [\"punctuation\", \".\"]]],[\"tag\", [\"baz\"]], [\"operator\", \"=\"], [\"string\", [[\"keyword\", \"HMENU\"]]],\r\n\t[\"tag\", [\"foo\", [\"punctuation\", \".\"]]], [\"tag\", [\"bar\", [\"punctuation\", \".\"]]], [\"tag\", [\"baz\"]], [\"punctuation\", \"{\"],\r\n\t[\"tag\", [\"baz\", [\"punctuation\", \".\"]]], [\"tag\", [\"foo\"]], [\"operator\", \"=\"], [\"string\", [\"bar\"]],\r\n\t[\"tag\", [\"bar\"]], [\"operator\", \"=\"], [\"string\", [[\"function\", \"{$const.foo}\"]]],\r\n\t[\"tag\", [\"foo\"]],[\"operator\", \"=\"], [\"string\", [[\"keyword\", \"LLL\"], [\"punctuation\", \":\"], [\"keyword\", \"EXT\"], [\"punctuation\", \":\"], \"str\"]],\r\n\t[\"keyword\", \"IFSUB\"], [\"operator\", \"<\"], [\"punctuation\", \".\"],[\"keyword\", \"NO\"],\r\n\t[\"keyword\", \"IFSUB\"], [\"operator\", \"=\"], [\"string\", [[\"number\", \"1\"]]],\r\n\t[\"keyword\", \"IFSUB\"], [\"punctuation\", \"{\"],\r\n\t[\"tag\", [\"foo\"]], [\"operator\", \"=\"], [\"string\", [\"bar\"]],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"tag\", [\"Namespace\\\\Classes\\\\Test\"]], [\"punctuation\", \"{\"],\r\n\t[\"tag\", [\"baz\", [\"punctuation\", \".\"]]], [\"tag\", [\"foo\"]], [\"operator\", \"=\"], [\"string\", [\"bar\"]],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags and string.\r\n"
  },
  {
    "path": "tests/languages/unrealscript/boolean_feature.test",
    "content": "false\r\ntrue\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"false\"],\r\n\t[\"boolean\", \"true\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/unrealscript/category_feature.test",
    "content": "// MyBool is visible but not editable in UnrealEd\nvar(MyCategory) editconst bool MyBool;\n\n// MyBool is visible but not editable in UnrealEd and\n// not changeable in script\nvar(MyCategory) const editconst bool MyBool;\n\n// MyBool is visible and can be set in UnrealEd but\n// not changeable in script\nvar(MyCategory) const bool MyBool;\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// MyBool is visible but not editable in UnrealEd\"],\n\n\t[\"keyword\", \"var\"],\n\t[\"punctuation\", \"(\"],\n\t[\"category\", \"MyCategory\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"editconst\"],\n\t[\"keyword\", \"bool\"],\n\t\" MyBool\",\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// MyBool is visible but not editable in UnrealEd and\"],\n\n\t[\"comment\", \"// not changeable in script\"],\n\n\t[\"keyword\", \"var\"],\n\t[\"punctuation\", \"(\"],\n\t[\"category\", \"MyCategory\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"const\"],\n\t[\"keyword\", \"editconst\"],\n\t[\"keyword\", \"bool\"],\n\t\" MyBool\",\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// MyBool is visible and can be set in UnrealEd but\"],\n\n\t[\"comment\", \"// not changeable in script\"],\n\n\t[\"keyword\", \"var\"],\n\t[\"punctuation\", \"(\"],\n\t[\"category\", \"MyCategory\"],\n\t[\"punctuation\", \")\"],\n\t[\"keyword\", \"const\"],\n\t[\"keyword\", \"bool\"],\n\t\" MyBool\",\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/unrealscript/class-name_feature.test",
    "content": "class Foo extends Bar;\r\nstruct Baz {};\r\nenum FooBar {};\r\ninterface IFoo extends IBar;\r\n\r\nstate Action {}\r\nstate() Defense {}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", \"Bar\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"class-name\", \"Baz\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"class-name\", \"FooBar\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"class-name\", \"IFoo\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"class-name\", \"IBar\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"state\"],\r\n\t[\"class-name\", \"Action\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"state\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"class-name\", \"Defense\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names.\r\n"
  },
  {
    "path": "tests/languages/unrealscript/comment_feature.test",
    "content": "// comment\r\n\r\n/*\r\n comment\r\n*/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"// comment\"],\r\n\t[\"comment\", \"/*\\r\\n comment\\r\\n*/\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/unrealscript/keyword_feature.test",
    "content": "abstract\r\nactor\r\narray\r\nauto\r\nautoexpandcategories\r\nbool\r\nbreak\r\nbyte\r\ncase\r\nclass;\r\nclassgroup\r\nclient\r\ncoerce\r\ncollapsecategories\r\nconfig\r\nconst\r\ncontinue\r\ndefault\r\ndefaultproperties\r\ndelegate\r\ndependson\r\ndeprecated\r\ndo\r\ndontcollapsecategories\r\neditconst\r\neditinlinenew\r\nelse\r\nenum;\r\nevent\r\nexec\r\nexport\r\nextends;\r\nfinal\r\nfloat\r\nfor\r\nforcescriptorder\r\nforeach\r\nfunction\r\ngoto\r\nguid\r\nhidecategories\r\nhidedropdown\r\nif\r\nignores\r\nimplements\r\ninherits\r\ninput\r\nint\r\ninterface;\r\niterator\r\nlatent\r\nlocal\r\nmaterial\r\nname\r\nnative\r\nnativereplication\r\nnoexport\r\nnontransient\r\nnoteditinlinenew\r\nnotplaceable\r\noperator\r\noptional\r\nout\r\npawn\r\nperobjectconfig\r\nperobjectlocalized\r\nplaceable\r\npostoperator\r\npreoperator\r\nprivate\r\nprotected\r\nreliable\r\nreplication\r\nreturn\r\nserver\r\nshowcategories\r\nsimulated\r\nsingular\r\nstate;\r\nstatic\r\nstring\r\nstruct;\r\nstructdefault\r\nstructdefaultproperties\r\nswitch\r\ntexture\r\ntransient\r\ntravel\r\nunreliable\r\nuntil\r\nvar\r\nvector\r\nwhile\r\nwithin;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"actor\"],\r\n\t[\"keyword\", \"array\"],\r\n\t[\"keyword\", \"auto\"],\r\n\t[\"keyword\", \"autoexpandcategories\"],\r\n\t[\"keyword\", \"bool\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"byte\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"classgroup\"],\r\n\t[\"keyword\", \"client\"],\r\n\t[\"keyword\", \"coerce\"],\r\n\t[\"keyword\", \"collapsecategories\"],\r\n\t[\"keyword\", \"config\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"defaultproperties\"],\r\n\t[\"keyword\", \"delegate\"],\r\n\t[\"keyword\", \"dependson\"],\r\n\t[\"keyword\", \"deprecated\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"dontcollapsecategories\"],\r\n\t[\"keyword\", \"editconst\"],\r\n\t[\"keyword\", \"editinlinenew\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"event\"],\r\n\t[\"keyword\", \"exec\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"float\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"forcescriptorder\"],\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"guid\"],\r\n\t[\"keyword\", \"hidecategories\"],\r\n\t[\"keyword\", \"hidedropdown\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"ignores\"],\r\n\t[\"keyword\", \"implements\"],\r\n\t[\"keyword\", \"inherits\"],\r\n\t[\"keyword\", \"input\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"iterator\"],\r\n\t[\"keyword\", \"latent\"],\r\n\t[\"keyword\", \"local\"],\r\n\t[\"keyword\", \"material\"],\r\n\t[\"keyword\", \"name\"],\r\n\t[\"keyword\", \"native\"],\r\n\t[\"keyword\", \"nativereplication\"],\r\n\t[\"keyword\", \"noexport\"],\r\n\t[\"keyword\", \"nontransient\"],\r\n\t[\"keyword\", \"noteditinlinenew\"],\r\n\t[\"keyword\", \"notplaceable\"],\r\n\t[\"keyword\", \"operator\"],\r\n\t[\"keyword\", \"optional\"],\r\n\t[\"keyword\", \"out\"],\r\n\t[\"keyword\", \"pawn\"],\r\n\t[\"keyword\", \"perobjectconfig\"],\r\n\t[\"keyword\", \"perobjectlocalized\"],\r\n\t[\"keyword\", \"placeable\"],\r\n\t[\"keyword\", \"postoperator\"],\r\n\t[\"keyword\", \"preoperator\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"reliable\"],\r\n\t[\"keyword\", \"replication\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"server\"],\r\n\t[\"keyword\", \"showcategories\"],\r\n\t[\"keyword\", \"simulated\"],\r\n\t[\"keyword\", \"singular\"],\r\n\t[\"keyword\", \"state\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"keyword\", \"structdefault\"],\r\n\t[\"keyword\", \"structdefaultproperties\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"texture\"],\r\n\t[\"keyword\", \"transient\"],\r\n\t[\"keyword\", \"travel\"],\r\n\t[\"keyword\", \"unreliable\"],\r\n\t[\"keyword\", \"until\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"vector\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"within\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/unrealscript/macro_feature.test",
    "content": "`log(\"foo\");\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"macro\", \"`log\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for macros.\r\n"
  },
  {
    "path": "tests/languages/unrealscript/metadata_feature.test",
    "content": "var float MyVar<TAG=VALUE>;\r\n\r\nenum EMyEnum\r\n{\r\n\tEME_ValA<TAG=VALUE>,\r\n\tEME_ValB<TAG=VALUE>,\r\n};\r\n\r\nvar() LinearColor DrawColor<DisplayName=Draw Color|EditCondition=bOverrideDrawColor>;\r\n\r\n\r\n// not metadata\r\nvar array<class<Foo>> Bar;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"float\"],\r\n\t\" MyVar\",\r\n\t[\"metadata\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"property\", \"TAG\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\"VALUE\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"class-name\", \"EMyEnum\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\"\\r\\n\\tEME_ValA\",\r\n\t[\"metadata\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"property\", \"TAG\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\"VALUE\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t\"\\r\\n\\tEME_ValB\",\r\n\t[\"metadata\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"property\", \"TAG\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\"VALUE\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t\" LinearColor DrawColor\",\r\n\t[\"metadata\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"property\", \"DisplayName\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\"Draw Color\",\r\n\t\t[\"punctuation\", \"|\"],\r\n\t\t[\"property\", \"EditCondition\"],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t\"bOverrideDrawColor\",\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\r\n\t[\"comment\", \"// not metadata\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"array\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"operator\", \"<\"],\r\n\t\"Foo\",\r\n\t[\"operator\", \">>\"],\r\n\t\" Bar\",\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for metadata.\r\n"
  },
  {
    "path": "tests/languages/unrealscript/number_feature.test",
    "content": "123\r\n123e+5\r\n\r\n0xFFFF\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"123e+5\"],\r\n\t[\"number\", \"0xFFFF\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/unrealscript/operator_feature.test",
    "content": "+ - * / % **\r\n+= -= *= /=\r\n++ --\r\n~ && || ^^\r\n! & | ^ << >>\r\n\r\n> >= < <= == != ~=\r\n$ $= @ @=\r\n=\r\n\r\n? :\r\n\r\nCross Dot ClockwiseFrom\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"**\"],\r\n\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"--\"],\r\n\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"^^\"],\r\n\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \">>\"],\r\n\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"~=\"],\r\n\r\n\t[\"operator\", \"$\"],\r\n\t[\"operator\", \"$=\"],\r\n\t[\"operator\", \"@\"],\r\n\t[\"operator\", \"@=\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \":\"],\r\n\r\n\t[\"operator\", \"Cross\"],\r\n\t[\"operator\", \"Dot\"],\r\n\t[\"operator\", \"ClockwiseFrom\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/unrealscript/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n\r\n''\r\n'foo'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'foo'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/uorazor/boolean_feature.test",
    "content": "false\ntrue\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"false\"],\n\t[\"boolean\", \"true\"]\n]\n\n----------------------------------------------------\n\nChecks for boolean values\n"
  },
  {
    "path": "tests/languages/uorazor/breakdown_script_example_feature.test",
    "content": "setvar \"my_training_target\"\nwhile skill \"anatomy\" < 100\n    useskill \"anatomy\"\n    wft 500\n    target \"my_training_target\"\n    wait 2000\nendwhile\n\n----------------------------------------------------\n\n[\n\t[\"source-commands\", \"setvar\"],\n\t[\"string\", [\n\t\t[\"punctuation\", \"\\\"\"],\n\t\t\"my_training_target\",\n\t\t[\"punctuation\", \"\\\"\"]\n\t]],\n\n\t[\"keyword\", \"while\"],\n\t[\"function\", \"skill\"],\n\t[\"string\", [\n\t\t[\"punctuation\", \"\\\"\"],\n\t\t\"anatomy\",\n\t\t[\"punctuation\", \"\\\"\"]\n\t]],\n\t[\"operator\", \"<\"],\n\t[\"number\", \"100\"],\n\n\t[\"source-commands\", \"useskill\"],\n\t[\"string\", [\n\t\t[\"punctuation\", \"\\\"\"],\n\t\t\"anatomy\",\n\t\t[\"punctuation\", \"\\\"\"]\n\t]],\n\n\t[\"source-commands\", \"wft\"],\n\t[\"number\", \"500\"],\n\n\t[\"source-commands\", \"target\"],\n\t[\"string\", [\n\t\t[\"punctuation\", \"\\\"\"],\n\t\t\"my_training_target\",\n\t\t[\"punctuation\", \"\\\"\"]\n\t]],\n\n\t[\"source-commands\", \"wait\"],\n\t[\"number\", \"2000\"],\n\n\t[\"keyword\", \"endwhile\"]\n]\n\n----------------------------------------------------\n\nChecks for each type of syntax breakdown\n"
  },
  {
    "path": "tests/languages/uorazor/commands_feature.test",
    "content": "alliance\nattack\ncast\nclearall\nclearignore\nclearjournal\nclearlist\nclearsysmsg\ncreatelist\ncreatetimer\ndclick\ndclicktype\ndclickvar\ndress\ndressconfig\ndrop\ndroprelloc\nemote\ngetlabel\nguild\ngumpclose\ngumpresponse\nhotkey\nignore\nlasttarget\nlift\nlifttype\nmenu\nmenuresponse\nmsg\norg\norganize\norganizer\noverhead\npause\npoplist\npotion\npromptresponse\npushlist\nremovelist\nremovetimer\nrename\nrestock\nsay\nscav\nscavenger\nscript\nsetability\nsetlasttarget\nsetskill\nsettimer\nsysmsg\ntargetloc\ntargetrelloc\ntargettype\nundress\nunignore\nunsetvar\nuseobject\nuseonce\nusetype\nvirtue\nwaitforgump\nwaitformenu\nwaitforprompt\nwaitforstat\nwaitforsysmsg\nwaitfortarget\nwalk\nwfsysmsg\nwhisper\nyell\n\n----------------------------------------------------\n\n[\n\t[\"source-commands\", \"alliance\"],\n\t[\"source-commands\", \"attack\"],\n\t[\"source-commands\", \"cast\"],\n\t[\"source-commands\", \"clearall\"],\n\t[\"source-commands\", \"clearignore\"],\n\t[\"source-commands\", \"clearjournal\"],\n\t[\"source-commands\", \"clearlist\"],\n\t[\"source-commands\", \"clearsysmsg\"],\n\t[\"source-commands\", \"createlist\"],\n\t[\"source-commands\", \"createtimer\"],\n\t[\"source-commands\", \"dclick\"],\n\t[\"source-commands\", \"dclicktype\"],\n\t[\"source-commands\", \"dclickvar\"],\n\t[\"source-commands\", \"dress\"],\n\t[\"source-commands\", \"dressconfig\"],\n\t[\"source-commands\", \"drop\"],\n\t[\"source-commands\", \"droprelloc\"],\n\t[\"source-commands\", \"emote\"],\n\t[\"source-commands\", \"getlabel\"],\n\t[\"source-commands\", \"guild\"],\n\t[\"source-commands\", \"gumpclose\"],\n\t[\"source-commands\", \"gumpresponse\"],\n\t[\"source-commands\", \"hotkey\"],\n\t[\"source-commands\", \"ignore\"],\n\t[\"source-commands\", \"lasttarget\"],\n\t[\"source-commands\", \"lift\"],\n\t[\"source-commands\", \"lifttype\"],\n\t[\"source-commands\", \"menu\"],\n\t[\"source-commands\", \"menuresponse\"],\n\t[\"source-commands\", \"msg\"],\n\t[\"source-commands\", \"org\"],\n\t[\"source-commands\", \"organize\"],\n\t[\"source-commands\", \"organizer\"],\n\t[\"source-commands\", \"overhead\"],\n\t[\"source-commands\", \"pause\"],\n\t[\"source-commands\", \"poplist\"],\n\t[\"source-commands\", \"potion\"],\n\t[\"source-commands\", \"promptresponse\"],\n\t[\"source-commands\", \"pushlist\"],\n\t[\"source-commands\", \"removelist\"],\n\t[\"source-commands\", \"removetimer\"],\n\t[\"source-commands\", \"rename\"],\n\t[\"source-commands\", \"restock\"],\n\t[\"source-commands\", \"say\"],\n\t[\"source-commands\", \"scav\"],\n\t[\"source-commands\", \"scavenger\"],\n\t[\"source-commands\", \"script\"],\n\t[\"source-commands\", \"setability\"],\n\t[\"source-commands\", \"setlasttarget\"],\n\t[\"source-commands\", \"setskill\"],\n\t[\"source-commands\", \"settimer\"],\n\t[\"source-commands\", \"sysmsg\"],\n\t[\"source-commands\", \"targetloc\"],\n\t[\"source-commands\", \"targetrelloc\"],\n\t[\"source-commands\", \"targettype\"],\n\t[\"source-commands\", \"undress\"],\n\t[\"source-commands\", \"unignore\"],\n\t[\"source-commands\", \"unsetvar\"],\n\t[\"source-commands\", \"useobject\"],\n\t[\"source-commands\", \"useonce\"],\n\t[\"source-commands\", \"usetype\"],\n\t[\"source-commands\", \"virtue\"],\n\t[\"source-commands\", \"waitforgump\"],\n\t[\"source-commands\", \"waitformenu\"],\n\t[\"source-commands\", \"waitforprompt\"],\n\t[\"source-commands\", \"waitforstat\"],\n\t[\"source-commands\", \"waitforsysmsg\"],\n\t[\"source-commands\", \"waitfortarget\"],\n\t[\"source-commands\", \"walk\"],\n\t[\"source-commands\", \"wfsysmsg\"],\n\t[\"source-commands\", \"whisper\"],\n\t[\"source-commands\", \"yell\"]\n]\n\n----------------------------------------------------\n\nChecks for commands.\n"
  },
  {
    "path": "tests/languages/uorazor/comment_feature.test",
    "content": "# This is a comment\n// so is this\n\n----------------------------------------------------\n\n[\n\t[\"comment-hash\", \"# This is a comment\"],\n\t[\"comment-slash\", \"// so is this\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/uorazor/functions_feature.test",
    "content": "atlist close closest count counter counttype dead dex diffhits diffmana diffstam diffweight find findbuff finddebuff findlayer findtype findtypelist followers gumpexists hidden hits hp hue human humanoid ingump inlist insysmessage insysmsg int invul lhandempty list listexists mana maxhits maxhp maxmana maxstam maxweight monster mounted name next noto paralyzed poisoned position prev previous queued rand random rhandempty skill stam str targetexists timer timerexists varexist warmode weight\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"atlist\"],\n\t[\"function\", \"close\"],\n\t[\"function\", \"closest\"],\n\t[\"function\", \"count\"],\n\t[\"function\", \"counter\"],\n\t[\"function\", \"counttype\"],\n\t[\"function\", \"dead\"],\n\t[\"function\", \"dex\"],\n\t[\"function\", \"diffhits\"],\n\t[\"function\", \"diffmana\"],\n\t[\"function\", \"diffstam\"],\n\t[\"function\", \"diffweight\"],\n\t[\"function\", \"find\"],\n\t[\"function\", \"findbuff\"],\n\t[\"function\", \"finddebuff\"],\n\t[\"function\", \"findlayer\"],\n\t[\"function\", \"findtype\"],\n\t[\"function\", \"findtypelist\"],\n\t[\"function\", \"followers\"],\n\t[\"function\", \"gumpexists\"],\n\t[\"function\", \"hidden\"],\n\t[\"function\", \"hits\"],\n\t[\"function\", \"hp\"],\n\t[\"function\", \"hue\"],\n\t[\"function\", \"human\"],\n\t[\"function\", \"humanoid\"],\n\t[\"function\", \"ingump\"],\n\t[\"function\", \"inlist\"],\n\t[\"function\", \"insysmessage\"],\n\t[\"function\", \"insysmsg\"],\n\t[\"function\", \"int\"],\n\t[\"function\", \"invul\"],\n\t[\"function\", \"lhandempty\"],\n\t[\"function\", \"list\"],\n\t[\"function\", \"listexists\"],\n\t[\"function\", \"mana\"],\n\t[\"function\", \"maxhits\"],\n\t[\"function\", \"maxhp\"],\n\t[\"function\", \"maxmana\"],\n\t[\"function\", \"maxstam\"],\n\t[\"function\", \"maxweight\"],\n\t[\"function\", \"monster\"],\n\t[\"function\", \"mounted\"],\n\t[\"function\", \"name\"],\n\t[\"function\", \"next\"],\n\t[\"function\", \"noto\"],\n\t[\"function\", \"paralyzed\"],\n\t[\"function\", \"poisoned\"],\n\t[\"function\", \"position\"],\n\t[\"function\", \"prev\"],\n\t[\"function\", \"previous\"],\n\t[\"function\", \"queued\"],\n\t[\"function\", \"rand\"],\n\t[\"function\", \"random\"],\n\t[\"function\", \"rhandempty\"],\n\t[\"function\", \"skill\"],\n\t[\"function\", \"stam\"],\n\t[\"function\", \"str\"],\n\t[\"function\", \"targetexists\"],\n\t[\"function\", \"timer\"],\n\t[\"function\", \"timerexists\"],\n\t[\"function\", \"varexist\"],\n\t[\"function\", \"warmode\"],\n\t[\"function\", \"weight\"]\n]\n\n----------------------------------------------------\n\nChecks for functions.\n"
  },
  {
    "path": "tests/languages/uorazor/keyword_feature.test",
    "content": "and\nas\nbreak\ncontinue\nelse\nelseif\nendfor\nendif\nfor\nif\nloop\nnot\nor\nreplay\nstop\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"and\"],\n\t[\"keyword\", \"as\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"elseif\"],\n\t[\"keyword\", \"endfor\"],\n\t[\"keyword\", \"endif\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"loop\"],\n\t[\"keyword\", \"not\"],\n\t[\"keyword\", \"or\"],\n\t[\"keyword\", \"replay\"],\n\t[\"keyword\", \"stop\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/uorazor/source_layers_feature.test",
    "content": "backpack\ngloves\nself\nARMS\nBLUE\nBRACELET\nCANCEL\nCLEAR\nCLOAK\nCRIMINAL\nEARRINGS\nENEMY\nFACIALHAIR\nFRIEND\nFRIENDLY\nGRAY\nGREY\nGROUND\nHAIR\nHEAD\nINNERLEGS\nINNERTORSO\nINNOCENT\nLEFTHAND\nMIDDLETORSO\nMURDERER\nNECK\nNONFRIENDLY\nONEHANDEDSECONDARY\nOUTERLEGS\nOUTERTORSO\nPANTS\nRED\nRIGHTHAND\nRING\nSHIRT\nSHOES\nTALISMAN\nWAIST\n\n----------------------------------------------------\n\n[\n\t[\"source-layers\", \"backpack\"],\n\t[\"source-layers\", \"gloves\"],\n\t[\"source-layers\", \"self\"],\n\t[\"source-layers\", \"ARMS\"],\n\t[\"source-layers\", \"BLUE\"],\n\t[\"source-layers\", \"BRACELET\"],\n\t[\"source-layers\", \"CANCEL\"],\n\t[\"source-layers\", \"CLEAR\"],\n\t[\"source-layers\", \"CLOAK\"],\n\t[\"source-layers\", \"CRIMINAL\"],\n\t[\"source-layers\", \"EARRINGS\"],\n\t[\"source-layers\", \"ENEMY\"],\n\t[\"source-layers\", \"FACIALHAIR\"],\n\t[\"source-layers\", \"FRIEND\"],\n\t[\"source-layers\", \"FRIENDLY\"],\n\t[\"source-layers\", \"GRAY\"],\n\t[\"source-layers\", \"GREY\"],\n\t[\"source-layers\", \"GROUND\"],\n\t[\"source-layers\", \"HAIR\"],\n\t[\"source-layers\", \"HEAD\"],\n\t[\"source-layers\", \"INNERLEGS\"],\n\t[\"source-layers\", \"INNERTORSO\"],\n\t[\"source-layers\", \"INNOCENT\"],\n\t[\"source-layers\", \"LEFTHAND\"],\n\t[\"source-layers\", \"MIDDLETORSO\"],\n\t[\"source-layers\", \"MURDERER\"],\n\t[\"source-layers\", \"NECK\"],\n\t[\"source-layers\", \"NONFRIENDLY\"],\n\t[\"source-layers\", \"ONEHANDEDSECONDARY\"],\n\t[\"source-layers\", \"OUTERLEGS\"],\n\t[\"source-layers\", \"OUTERTORSO\"],\n\t[\"source-layers\", \"PANTS\"],\n\t[\"source-layers\", \"RED\"],\n\t[\"source-layers\", \"RIGHTHAND\"],\n\t[\"source-layers\", \"RING\"],\n\t[\"source-layers\", \"SHIRT\"],\n\t[\"source-layers\", \"SHOES\"],\n\t[\"source-layers\", \"TALISMAN\"],\n\t[\"source-layers\", \"WAIST\"]\n]\n\n----------------------------------------------------\n\nChecks for source layers.\n"
  },
  {
    "path": "tests/languages/uri/authority_feature.test",
    "content": "https://john.doe@www.example.com:123/forum/questions\r\nftp://ftp.is.co.za/rfc/rfc1808.txt\r\nldap://[2001:db8::7]/\r\nhttps://[v1.foo]/\r\n//192.0.2.16:80/\r\n//example.com/path/resource.txt\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"scheme\", [\r\n\t\t\"https\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"user-info-segment\", [\r\n\t\t\t[\"user-info\", \"john.doe\"],\r\n\t\t\t[\"user-info-delimiter\", \"@\"]\r\n\t\t]],\r\n\t\t[\"host\", [\"www.example.com\"]],\r\n\t\t[\"port-segment\", [\r\n\t\t\t[\"port-delimiter\", \":\"],\r\n\t\t\t[\"port\", \"123\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"forum\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"questions\"\r\n\t]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"ftp\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"host\", [\"ftp.is.co.za\"]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"rfc\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"rfc1808.txt\"\r\n\t]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"ldap\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"host\", [\r\n\t\t\t[\"ip-literal\", [\r\n\t\t\t\t[\"ip-literal-delimiter\", \"[\"],\r\n\t\t\t\t[\"ipv6-address\", \"2001:db8::7\"],\r\n\t\t\t\t[\"ip-literal-delimiter\", \"]\"]\r\n\t\t\t]]\r\n\t\t]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"]\r\n\t]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"https\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"host\", [\r\n\t\t\t[\"ip-literal\", [\r\n\t\t\t\t[\"ip-literal-delimiter\", \"[\"],\r\n\t\t\t\t[\"ipv-future\", \"v1.foo\"],\r\n\t\t\t\t[\"ip-literal-delimiter\", \"]\"]\r\n\t\t\t]]\r\n\t\t]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"]\r\n\t]],\r\n\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"host\", [\r\n\t\t\t[\"ipv4-address\", \"192.0.2.16\"]\r\n\t\t]],\r\n\t\t[\"port-segment\", [\r\n\t\t\t[\"port-delimiter\", \":\"],\r\n\t\t\t[\"port\", \"80\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"]\r\n\t]],\r\n\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"host\", [\"example.com\"]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"path\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"resource.txt\"\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/uri/full.test",
    "content": "https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top\r\nldap://[2001:db8::7]/c=GB?objectClass?one\r\nmailto:John.Doe@example.com\r\nnews:comp.infosystems.www.servers.unix\r\ntelnet://192.0.2.16:80/\r\nhttps://example.com/path/resource.txt#fragment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"scheme\", [\r\n\t\t\"https\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"user-info-segment\", [\r\n\t\t\t[\"user-info\", \"john.doe\"],\r\n\t\t\t[\"user-info-delimiter\", \"@\"]\r\n\t\t]],\r\n\t\t[\"host\", [\"www.example.com\"]],\r\n\t\t[\"port-segment\", [\r\n\t\t\t[\"port-delimiter\", \":\"],\r\n\t\t\t[\"port\", \"123\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"forum\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"questions\",\r\n\t\t[\"path-separator\", \"/\"]\r\n\t]],\r\n\t[\"query\", [\r\n\t\t[\"query-delimiter\", \"?\"],\r\n\t\t[\"pair\", [\r\n\t\t\t[\"key\", \"tag\"],\r\n\t\t\t\"=\",\r\n\t\t\t[\"value\", \"networking\"]\r\n\t\t]],\r\n\t\t[\"pair-delimiter\", \"&\"],\r\n\t\t[\"pair\", [\r\n\t\t\t[\"key\", \"order\"],\r\n\t\t\t\"=\",\r\n\t\t\t[\"value\", \"newest\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"fragment\", [\r\n\t\t[\"fragment-delimiter\", \"#\"],\r\n\t\t\"top\"\r\n\t]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"ldap\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"host\", [\r\n\t\t\t[\"ip-literal\", [\r\n\t\t\t\t[\"ip-literal-delimiter\", \"[\"],\r\n\t\t\t\t[\"ipv6-address\", \"2001:db8::7\"],\r\n\t\t\t\t[\"ip-literal-delimiter\", \"]\"]\r\n\t\t\t]]\r\n\t\t]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"c=GB\"\r\n\t]],\r\n\t[\"query\", [\r\n\t\t[\"query-delimiter\", \"?\"],\r\n\t\t[\"pair\", [\r\n\t\t\t[\"key\", \"objectClass?one\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"mailto\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"path\", [\"John.Doe@example.com\"]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"news\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"path\", [\"comp.infosystems.www.servers.unix\"]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"telnet\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"host\", [\r\n\t\t\t[\"ipv4-address\", \"192.0.2.16\"]\r\n\t\t]],\r\n\t\t[\"port-segment\", [\r\n\t\t\t[\"port-delimiter\", \":\"],\r\n\t\t\t[\"port\", \"80\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"]\r\n\t]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"https\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"host\", [\"example.com\"]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"path\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"resource.txt\"\r\n\t]],\r\n\t[\"fragment\", [\r\n\t\t[\"fragment-delimiter\", \"#\"],\r\n\t\t\"fragment\"\r\n\t]]\r\n]\r\n"
  },
  {
    "path": "tests/languages/uri/query_feature.test",
    "content": "?tag=networking&order=newest#top\r\n?objectClass?one\r\n?title=Query_string&action=edit\r\nhttp://example.com/kb/index.php?cat=1;id=23\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"query\", [\r\n\t\t[\"query-delimiter\", \"?\"],\r\n\t\t[\"pair\", [\r\n\t\t\t[\"key\", \"tag\"],\r\n\t\t\t\"=\",\r\n\t\t\t[\"value\", \"networking\"]\r\n\t\t]],\r\n\t\t[\"pair-delimiter\", \"&\"],\r\n\t\t[\"pair\", [\r\n\t\t\t[\"key\", \"order\"],\r\n\t\t\t\"=\",\r\n\t\t\t[\"value\", \"newest\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"fragment\", [\r\n\t\t[\"fragment-delimiter\", \"#\"],\r\n\t\t\"top\"\r\n\t]],\r\n\r\n\t[\"query\", [\r\n\t\t[\"query-delimiter\", \"?\"],\r\n\t\t[\"pair\", [\r\n\t\t\t[\"key\", \"objectClass?one\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"query\", [\r\n\t\t[\"query-delimiter\", \"?\"],\r\n\t\t[\"pair\", [\r\n\t\t\t[\"key\", \"title\"],\r\n\t\t\t\"=\",\r\n\t\t\t[\"value\", \"Query_string\"]\r\n\t\t]],\r\n\t\t[\"pair-delimiter\", \"&\"],\r\n\t\t[\"pair\", [\r\n\t\t\t[\"key\", \"action\"],\r\n\t\t\t\"=\",\r\n\t\t\t[\"value\", \"edit\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"http\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"host\", [\"example.com\"]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"kb\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"index.php\"\r\n\t]],\r\n\t[\"query\", [\r\n\t\t[\"query-delimiter\", \"?\"],\r\n\t\t[\"pair\", [\r\n\t\t\t[\"key\", \"cat\"],\r\n\t\t\t\"=\",\r\n\t\t\t[\"value\", \"1\"]\r\n\t\t]],\r\n\t\t[\"pair-delimiter\", \";\"],\r\n\t\t[\"pair\", [\r\n\t\t\t[\"key\", \"id\"],\r\n\t\t\t\"=\",\r\n\t\t\t[\"value\", \"23\"]\r\n\t\t]]\r\n\t]]\r\n]"
  },
  {
    "path": "tests/languages/uri/relative.test",
    "content": "//example.com/path/resource.txt\r\n/path/resource.txt\r\npath/resource.txt\r\n../resource.txt\r\n./resource.txt\r\nresource.txt\r\n#fragment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"host\", [\"example.com\"]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"path\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"resource.txt\"\r\n\t]],\r\n\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"path\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"resource.txt\"\r\n\t]],\r\n\r\n\t[\"path\", [\r\n\t\t\"path\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"resource.txt\"\r\n\t]],\r\n\r\n\t[\"path\", [\r\n\t\t\"..\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"resource.txt\"\r\n\t]],\r\n\r\n\t[\"path\", [\r\n\t\t\".\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"resource.txt\"\r\n\t]],\r\n\r\n\t[\"path\", [\"resource.txt\"]],\r\n\r\n\t[\"fragment\", [\r\n\t\t[\"fragment-delimiter\", \"#\"],\r\n\t\t\"fragment\"\r\n\t]]\r\n]"
  },
  {
    "path": "tests/languages/uri/scheme_feature.test",
    "content": "ftp://ftp.is.co.za/rfc/rfc1808.txt\r\ntel:+1-816-555-1212\r\nurn:oasis:names:specification:docbook:dtd:xml:4.1.2\r\ndata:text/vnd-example+xyz;foo=bar;base64,R0lGODdh\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"scheme\", [\r\n\t\t\"ftp\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"authority\", [\r\n\t\t[\"authority-delimiter\", \"//\"],\r\n\t\t[\"host\", [\"ftp.is.co.za\"]]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"rfc\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"rfc1808.txt\"\r\n\t]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"tel\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"path\", [\"+1-816-555-1212\"]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"urn\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"path\", [\"oasis:names:specification:docbook:dtd:xml:4.1.2\"]],\r\n\r\n\t[\"scheme\", [\r\n\t\t\"data\",\r\n\t\t[\"scheme-delimiter\", \":\"]\r\n\t]],\r\n\t[\"path\", [\r\n\t\t\"text\",\r\n\t\t[\"path-separator\", \"/\"],\r\n\t\t\"vnd-example+xyz;foo=bar;base64,R0lGODdh\"\r\n\t]]\r\n]"
  },
  {
    "path": "tests/languages/v/attribute_feature.test",
    "content": "[deprecated]\n[unsafe_fn]\n[typedef]\n[live]\n[inline]\n[flag]\n[ref_only]\n[windows_stdcall]\n[direct_array_access]\n\n----------------------------------------------------\n\n[\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"keyword\", \"deprecated\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"keyword\", \"unsafe_fn\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"keyword\", \"typedef\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"keyword\", \"live\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"keyword\", \"inline\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"keyword\", \"flag\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"keyword\", \"ref_only\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"keyword\", \"windows_stdcall\"],\n\t\t[\"punctuation\", \"]\"]\n\t]],\n\t[\"attribute\", [\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"keyword\", \"direct_array_access\"],\n\t\t[\"punctuation\", \"]\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/v/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nCheck for boolean "
  },
  {
    "path": "tests/languages/v/char_feature.test",
    "content": "`🚀`\n`\\``\n`Not a Rune`\n\n----------------------------------------------------\n\n[\n\t[\"char\", \"`🚀`\"],\n\t[\"char\", \"`\\\\``\"],\n\t\"\\r\\n`Not a Rune`\"\n]\n"
  },
  {
    "path": "tests/languages/v/class-name_feature.test",
    "content": "struct Abc { }\r\ntype Alphabet = Abc | Xyz\r\nenum Token { }\r\ninterface Speaker { }\r\nstruct Repo<T> { }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"class-name\", \"Abc\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"type\"],\r\n\t[\"class-name\", \"Alphabet\"],\r\n\t[\"operator\", \"=\"],\r\n\t\" Abc \",\r\n\t[\"operator\", \"|\"],\r\n\t\" Xyz\\r\\n\",\r\n\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"class-name\", \"Token\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"class-name\", \"Speaker\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"class-name\", \"Repo\"],\r\n\t[\"generic\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", \"T\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]"
  },
  {
    "path": "tests/languages/v/function_feature.test",
    "content": "fn init() { }\r\nfn add(x int, y int) int { }\r\nfn sum(a ...int) int { }\r\nfn (mut t MyTime) century() int { }\r\nfn (d Dog) speak() string { }\r\nfn (r Repo) find_user_by_id(id int) ?User { }\r\nfn new_repo<T>(db DB) Repo<T> { }\r\nfn (r Repo<T>) find_by_id(id int) ?T { }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function\", \"init\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function\", \"add\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"x \",\r\n\t[\"builtin\", \"int\"],\r\n\t[\"punctuation\", \",\"],\r\n\t\" y \",\r\n\t[\"builtin\", \"int\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"int\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function\", \"sum\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"a \",\r\n\t[\"operator\", \"...\"],\r\n\t[\"builtin\", \"int\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"int\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"keyword\", \"mut\"],\r\n\t\" t MyTime\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"function\", \"century\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"int\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"d Dog\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"function\", \"speak\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"string\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"r Repo\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"function\", \"find_user_by_id\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"id \",\r\n\t[\"builtin\", \"int\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"?\"],\r\n\t\"User \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"generic-function\", [\r\n\t\t[\"function\", \"new_repo\"],\r\n\t\t[\"generic\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"class-name\", \"T\"],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"db DB\",\r\n\t[\"punctuation\", \")\"],\r\n\t\" Repo\",\r\n\t[\"generic\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", \"T\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"r Repo\",\r\n\t[\"generic\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"class-name\", \"T\"],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"function\", \"find_by_id\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"id \",\r\n\t[\"builtin\", \"int\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"?\"],\r\n\t\"T \",\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]"
  },
  {
    "path": "tests/languages/v/keyword_feature.test",
    "content": "as;\r\nasm;\r\nassert;\r\natomic;\r\nbreak;\r\nconst;\r\ncontinue;\r\ndefer;\r\nelse;\r\nembed;\r\nenum;;\r\nfn;\r\nfor;\r\n__global;\r\ngo;\r\ngoto;\r\nif;\r\nimport;\r\nin;\r\ninterface;\r\nis;\r\nlock;\r\nmatch;\r\nmodule;\r\nmut;\r\nnone;\r\nor;\r\npub;\r\nreturn;\r\nrlock;\r\nselect;\r\nshared;\r\nsizeof;\r\nstatic;\r\nstruct;\r\ntype;;\r\ntypeof;\r\nunion;\r\nunsafe;\r\n$if;\r\n$else;\r\n$for;\r\n#include;\r\n#flag;\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"asm\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"assert\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"atomic\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"const\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"defer\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"embed\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"fn\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"__global\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"go\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"goto\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"import\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"is\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"lock\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"match\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"module\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"mut\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"none\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"or\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"pub\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"rlock\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"select\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"shared\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"sizeof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"struct\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"type\"], [\"punctuation\", \";\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"typeof\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"union\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"unsafe\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"$if\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"$else\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"$for\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"#include\"], [\"punctuation\", \";\"],\r\n\t[\"keyword\", \"#flag\"], [\"punctuation\", \";\"]\r\n]"
  },
  {
    "path": "tests/languages/v/number_feature.test",
    "content": "123\r\n0x7B\r\n0b01111011\r\n0o173\r\n1_000_000\r\n0xF_F\r\n072.40\r\n2.71828\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"0x7B\"],\r\n\t[\"number\", \"0b01111011\"],\r\n\t[\"number\", \"0o173\"],\r\n\t[\"number\", \"1_000_000\"],\r\n\t[\"number\", \"0xF_F\"],\r\n\t[\"number\", \"072.40\"],\r\n\t[\"number\", \"2.71828\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nCheck for numbers"
  },
  {
    "path": "tests/languages/v/operator_feature.test",
    "content": "+\r\n-\r\n*\r\n/\r\n%\r\n~\r\n&\r\n|\r\n^\r\n!\r\n&&\r\n||\r\n!=\r\n<<\r\n>>\r\n==\r\n<\r\n<=\r\n>\r\n>=\r\n+=\r\n-=\r\n*=\r\n/=\r\n%=\r\n&=\r\n|=\r\n^=\r\n>>=\r\n<<=\r\n:=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"|=\"],\r\n\t[\"operator\", \"^=\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"operator\", \":=\"]\r\n]"
  },
  {
    "path": "tests/languages/v/string_feature.test",
    "content": "\"https://example.com\"\r\n'single quote'\r\n'age = $user.age'\r\n'[${int(x):-10}]'\r\nr'hello\\nworld'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", [\"\\\"https://example.com\\\"\"]],\r\n\t[\"string\", [\"'single quote'\"]],\r\n\t[\"string\", [\r\n\t\t\"'age = \",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-variable\", \"$user.age\"]\r\n\t\t]],\r\n\t\t\"'\"\r\n\t]],\r\n\t[\"string\", [\r\n\t\t\"'[\",\r\n\t\t[\"interpolation\", [\r\n\t\t\t[\"interpolation-punctuation\", \"${\"],\r\n\t\t\t[\"interpolation-expression\", [\r\n\t\t\t\t[\"function\", \"int\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t\"x\",\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \":\"],\r\n\t\t\t\t[\"operator\", \"-\"],\r\n\t\t\t\t[\"number\", \"10\"]\r\n\t\t\t]],\r\n\t\t\t[\"interpolation-punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t\"]'\"\r\n\t]],\r\n\t[\"string\", [\"r'hello\\\\nworld'\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nCheck for strings and string interpolation\r\n"
  },
  {
    "path": "tests/languages/vala/class-name_feature.test",
    "content": "class Foo\r\nenum Bar\r\ninterface BarBaz\r\nclass Foo : Bar\r\n[Foobar]\r\nvoid Foo(Bar bar, Baz baz)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"Foo\"]],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"class-name\", [\"Bar\"]],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"class-name\", [\"BarBaz\"]],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"class-name\", [\"Foo\"]],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\"Bar\"]],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"class-name\", [\"Foobar\"]],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"function\", \"Foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"class-name\", [\"Bar\"]],\r\n\t\" bar\",\r\n\t[\"punctuation\", \",\"],\r\n\t[\"class-name\", [\"Baz\"]],\r\n\t\" baz\",\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names."
  },
  {
    "path": "tests/languages/vala/constant_feature.test",
    "content": "FOO\n\n----------------------------------------------------\n\n[\n\t[\"constant\", \"FOO\"]\n]\n"
  },
  {
    "path": "tests/languages/vala/keyword_feature.test",
    "content": "bool\r\nchar\r\ndouble\r\nfloat\r\nnull\r\nsize_t\r\nssize_t\r\nstring\r\nunichar\r\nvoid\r\nint\r\nint8\r\nint16\r\nint32\r\nint64\r\nlong\r\nshort\r\nuchar\r\nuint\r\nuint8\r\nuint16\r\nuint32\r\nuint64\r\nulong\r\nushort\r\nclass\r\ndelegate\r\nenum\r\nerrordomain\r\ninterface\r\nnamespace\r\nstruct\r\nbreak\r\ncontinue\r\ndo\r\nfor\r\nforeach\r\nreturn\r\nwhile\r\nelse\r\nif\r\nswitch\r\nassert\r\ncase\r\ndefault\r\nabstract\r\nconst\r\ndynamic\r\nensures\r\nextern\r\ninline\r\ninternal\r\noverride\r\nprivate\r\nprotected\r\npublic\r\nrequires\r\nsignal\r\nstatic\r\nvirtual\r\nvolatile\r\nweak\r\nasync\r\nowned\r\nunowned\r\ntry\r\ncatch\r\nfinally\r\nthrow\r\nas\r\nbase\r\nconstruct\r\ndelete\r\nget\r\nin\r\nis\r\nlock\r\nnew\r\nout\r\nparams\r\nref\r\nsizeof\r\nset\r\nthis\r\nthrows\r\ntypeof\r\nusing\r\nvalue\r\nvar\r\nyield\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"bool\"],\r\n\t[\"keyword\", \"char\"],\r\n\t[\"keyword\", \"double\"],\r\n\t[\"keyword\", \"float\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"size_t\"],\r\n\t[\"keyword\", \"ssize_t\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"keyword\", \"unichar\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"keyword\", \"int8\"],\r\n\t[\"keyword\", \"int16\"],\r\n\t[\"keyword\", \"int32\"],\r\n\t[\"keyword\", \"int64\"],\r\n\t[\"keyword\", \"long\"],\r\n\t[\"keyword\", \"short\"],\r\n\t[\"keyword\", \"uchar\"],\r\n\t[\"keyword\", \"uint\"],\r\n\t[\"keyword\", \"uint8\"],\r\n\t[\"keyword\", \"uint16\"],\r\n\t[\"keyword\", \"uint32\"],\r\n\t[\"keyword\", \"uint64\"],\r\n\t[\"keyword\", \"ulong\"],\r\n\t[\"keyword\", \"ushort\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"delegate\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"errordomain\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"keyword\", \"namespace\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"assert\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"abstract\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"dynamic\"],\r\n\t[\"keyword\", \"ensures\"],\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"inline\"],\r\n\t[\"keyword\", \"internal\"],\r\n\t[\"keyword\", \"override\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"public\"],\r\n\t[\"keyword\", \"requires\"],\r\n\t[\"keyword\", \"signal\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"virtual\"],\r\n\t[\"keyword\", \"volatile\"],\r\n\t[\"keyword\", \"weak\"],\r\n\t[\"keyword\", \"async\"],\r\n\t[\"keyword\", \"owned\"],\r\n\t[\"keyword\", \"unowned\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"base\"],\r\n\t[\"keyword\", \"construct\"],\r\n\t[\"keyword\", \"delete\"],\r\n\t[\"keyword\", \"get\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"lock\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"out\"],\r\n\t[\"keyword\", \"params\"],\r\n\t[\"keyword\", \"ref\"],\r\n\t[\"keyword\", \"sizeof\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"throws\"],\r\n\t[\"keyword\", \"typeof\"],\r\n\t[\"keyword\", \"using\"],\r\n\t[\"keyword\", \"value\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"yield\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/vala/number_feature.test",
    "content": "42\r\n3.14159\r\n5ul\r\n0.75f\r\n4e10\r\n2.1e-10\r\n0.4e+2\r\n0xbabe\r\n0xBABE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"5ul\"],\r\n\t[\"number\", \"0.75f\"],\r\n\t[\"number\", \"4e10\"],\r\n\t[\"number\", \"2.1e-10\"],\r\n\t[\"number\", \"0.4e+2\"],\r\n\t[\"number\", \"0xbabe\"],\r\n\t[\"number\", \"0xBABE\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal numbers and hexadecimal numbers."
  },
  {
    "path": "tests/languages/vala/operator_feature.test",
    "content": "+ - * / % -- ++\r\n>> <<\r\n~ & | ^\r\n+= -= *= /= %= >>= <<= &= |= ^=\r\n! && ||\r\n= == != < > <= >= =>\r\n? ??\r\n...\r\n->\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"--\"],\r\n\t[\"operator\", \"++\"],\r\n\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \"<<\"],\r\n\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"^\"],\r\n\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"|=\"],\r\n\t[\"operator\", \"^=\"],\r\n\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"||\"],\r\n\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"=>\"],\r\n\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"??\"],\r\n\r\n\t[\"operator\", \"...\"],\r\n\t[\"operator\", \"->\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/vala/punctuation_feature.test",
    "content": ". , ; :\n[ ] { } ( )\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for punctuation.\n"
  },
  {
    "path": "tests/languages/vala/regex_feature.test",
    "content": "/(\\d+\\.\\d+\\.\\d+)/\n\n----------------------------------------------------\n\n[\n\t[\"regex\", [\n\t\t[\"regex-delimiter\", \"/\"],\n\t\t[\"regex-source\", \"(\\\\d+\\\\.\\\\d+\\\\.\\\\d+)\"],\n\t\t[\"regex-delimiter\", \"/\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/vala/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n\r\n\"\"\"Multi line\r\nstring\"\"\"\r\n\r\n@\"foo $bar\"\r\n@\"foo $(bar)\"\r\n\r\n'a'\r\n'\\''\r\n'\\\\'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\r\n\t[\"raw-string\", \"\\\"\\\"\\\"Multi line\\r\\nstring\\\"\\\"\\\"\"],\r\n\t[\"template-string\", \r\n\t\t[\r\n\t\t\t[\"string\", \"@\\\"foo \"],\r\n\t\t\t[\r\n\t\t\t\t\"interpolation\",\r\n\t\t\t\t[\r\n\t\t\t\t\t[\r\n\t\t\t\t\t\t\"delimiter\", \"$\"\r\n\t\t\t\t\t],\r\n\t\t\t\t\t\"bar\"\r\n\t\t\t\t]\r\n\t\t\t],\r\n\t\t\t[\"string\", \"\\\"\"]\r\n\t\t]\r\n\t],\r\n\t[\"template-string\",\r\n\t\t[\r\n\t\t\t[\"string\", \"@\\\"foo \"],\r\n\t\t\t[\r\n\t\t\t\t\"interpolation\",\r\n\t\t\t\t[\r\n\t\t\t\t\t[\r\n\t\t\t\t\t\t\"delimiter\",\r\n\t\t\t\t\t\t\"$(\"\r\n\t\t\t\t\t],\r\n\t\t\t\t\t\"bar\",\r\n\t\t\t\t\t[\r\n\t\t\t\t\t\t\"delimiter\",\r\n\t\t\t\t\t\t\")\"\r\n\t\t\t\t\t]\r\n\t\t\t\t]\r\n\t\t\t],\r\n\t\t\t[\"string\", \"\\\"\"]\r\n\t\t]\r\n\t],\r\n\t[\"string\", \"'a'\"],\r\n\t[\"string\", \"'\\\\''\"],\r\n\t[\"string\", \"'\\\\\\\\'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for normal and verbatim strings.\r\nAlso checks for single quoted characters."
  },
  {
    "path": "tests/languages/vbnet/comment_feature.test",
    "content": "!foobar\r\nREM foobar\r\n\r\n'\r\n'foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", [\"!foobar\"]],\r\n\t[\"comment\", [[\"keyword\", \"REM\"], \" foobar\"]],\r\n\t[\"comment\", \"'\"],\r\n\t[\"comment\", \"'foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments"
  },
  {
    "path": "tests/languages/vbnet/issue2781.test",
    "content": "bob = new SqlCommand(\"Select * from test Where Code=@Code\");\nbob = new SqlCommand(\"Select * from test Where Code=Code\");\n\n----------------------------------------------------\n\n[\n\t\"bob \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"new\"],\n\t\" SqlCommand\",\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Select * from test Where Code=@Code\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t\"\\r\\nbob \",\n\t[\"operator\", \"=\"],\n\t[\"keyword\", \"new\"],\n\t\" SqlCommand\",\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Select * from test Where Code=Code\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/vbnet/keyword_feature.test",
    "content": "ADDHANDLER\r\nADDRESSOF\r\nALIAS\r\nAND\r\nANDALSO\r\nAS\r\nBEEP\r\nBLOAD\r\nBOOLEAN\r\nBSAVE\r\nBYREF\r\nBYTE\r\nBYVAL\r\nCALL\r\nCALL ABSOLUTE\r\nCASE\r\nCATCH\r\nCBOOL\r\nCBYTE\r\nCCHAR\r\nCDATE\r\nCDEC\r\nCDBL\r\nCHAIN\r\nCHAR\r\nCHDIR\r\nCINT\r\nCLASS\r\nCLEAR\r\nCLNG\r\nCLOSE\r\nCLS\r\nCOBJ\r\nCOM\r\nCOMMON\r\nCONST\r\nCONTINUE\r\nCSBYTE\r\nCSHORT\r\nCSNG\r\nCSTR\r\nCTYPE\r\nCUINT\r\nCULNG\r\nCUSHORT\r\nDATA\r\nDATE\r\nDECIMAL\r\nDECLARE\r\nDEFAULT\r\nDEF FN\r\nDEF SEG\r\nDEFDBL\r\nDEFINT\r\nDEFLNG\r\nDEFSNG\r\nDEFSTR\r\nDELEGATE\r\nDIM\r\nDIRECTCAST\r\nDO\r\nDOUBLE\r\nELSE\r\nELSEIF\r\nEND\r\nENUM\r\nENVIRON\r\nERASE\r\nERROR\r\nEVENT\r\nEXIT\r\nFALSE\r\nFIELD\r\nFILES\r\nFINALLY\r\nFOR\r\nFOR EACH\r\nFRIEND\r\nFUNCTION\r\nGET\r\nGETTYPE\r\nGETXMLNAMESPACE\r\nGLOBAL\r\nGOSUB\r\nGOTO\r\nHANDLES\r\nIF\r\nIMPLEMENTS\r\nIMPORTS\r\nIN\r\nINHERITS\r\nINPUT\r\nINTEGER\r\nINTERFACE\r\nIOCTL\r\nIS\r\nISNOT\r\nKEY\r\nKILL\r\nLINE INPUT\r\nLET\r\nLIB\r\nLIKE\r\nLOCATE\r\nLOCK\r\nLONG\r\nLOOP\r\nLSET\r\nME\r\nMKDIR\r\nMOD\r\nMODULE\r\nMUSTINHERIT\r\nMUSTOVERRIDE\r\nMYBASE\r\nMYCLASS\r\nNAME\r\nNAMESPACE\r\nNARROWING\r\nNEW\r\nNEXT\r\nNOT\r\nNOTHING\r\nNOTINHERITABLE\r\nNOTOVERRIDABLE\r\nOBJECT\r\nOF\r\nOFF\r\nON\r\nON COM\r\nON ERROR\r\nON KEY\r\nON TIMER\r\nOPERATOR\r\nOPEN\r\nOPTION\r\nOPTION BASE\r\nOPTIONAL\r\nOR\r\nORELSE\r\nOUT\r\nOVERLOADS\r\nOVERRIDABLE\r\nOVERRIDES\r\nPARAMARRAY\r\nPARTIAL\r\nPOKE\r\nPRIVATE\r\nPROPERTY\r\nPROTECTED\r\nPUBLIC\r\nPUT\r\nRAISEEVENT\r\nREAD\r\nREADONLY\r\nREDIM\r\nREM\r\nREMOVEHANDLER\r\nRESTORE\r\nRESUME\r\nRETURN\r\nRMDIR\r\nRSET\r\nRUN\r\nSBYTE\r\nSELECT\r\nSELECT CASE\r\nSET\r\nSHADOWS\r\nSHARED\r\nSHORT\r\nSINGLE\r\nSHELL\r\nSLEEP\r\nSTATIC\r\nSTEP\r\nSTOP\r\nSTRING\r\nSTRUCTURE\r\nSUB\r\nSYNCLOCK\r\nSWAP\r\nSYSTEM\r\nTHEN\r\nTHROW\r\nTIMER\r\nTO\r\nTROFF\r\nTRON\r\nTRUE\r\nTRY\r\nTRYCAST\r\nTYPE\r\nTYPEOF\r\nUINTEGER\r\nULONG\r\nUNLOCK\r\nUNTIL\r\nUSHORT\r\nUSING\r\nVIEW PRINT\r\nWAIT\r\nWEND\r\nWHEN\r\nWHILE\r\nWIDENING\r\nWITH\r\nWITHEVENTS\r\nWRITE\r\nWRITEONLY\r\nXOR\r\n#CONST\r\n#ELSE\r\n#ELSE\r\n#ELSEIF\r\n#END\r\n#IF\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"ADDHANDLER\"],\r\n\t[\"keyword\", \"ADDRESSOF\"],\r\n\t[\"keyword\", \"ALIAS\"],\r\n\t[\"keyword\", \"AND\"],\r\n\t[\"keyword\", \"ANDALSO\"],\r\n\t[\"keyword\", \"AS\"],\r\n\t[\"keyword\", \"BEEP\"],\r\n\t[\"keyword\", \"BLOAD\"],\r\n\t[\"keyword\", \"BOOLEAN\"],\r\n\t[\"keyword\", \"BSAVE\"],\r\n\t[\"keyword\", \"BYREF\"],\r\n\t[\"keyword\", \"BYTE\"],\r\n\t[\"keyword\", \"BYVAL\"],\r\n\t[\"keyword\", \"CALL\"],\r\n\t[\"keyword\", \"CALL ABSOLUTE\"],\r\n\t[\"keyword\", \"CASE\"],\r\n\t[\"keyword\", \"CATCH\"],\r\n\t[\"keyword\", \"CBOOL\"],\r\n\t[\"keyword\", \"CBYTE\"],\r\n\t[\"keyword\", \"CCHAR\"],\r\n\t[\"keyword\", \"CDATE\"],\r\n\t[\"keyword\", \"CDEC\"],\r\n\t[\"keyword\", \"CDBL\"],\r\n\t[\"keyword\", \"CHAIN\"],\r\n\t[\"keyword\", \"CHAR\"],\r\n\t[\"keyword\", \"CHDIR\"],\r\n\t[\"keyword\", \"CINT\"],\r\n\t[\"keyword\", \"CLASS\"],\r\n\t[\"keyword\", \"CLEAR\"],\r\n\t[\"keyword\", \"CLNG\"],\r\n\t[\"keyword\", \"CLOSE\"],\r\n\t[\"keyword\", \"CLS\"],\r\n\t[\"keyword\", \"COBJ\"],\r\n\t[\"keyword\", \"COM\"],\r\n\t[\"keyword\", \"COMMON\"],\r\n\t[\"keyword\", \"CONST\"],\r\n\t[\"keyword\", \"CONTINUE\"],\r\n\t[\"keyword\", \"CSBYTE\"],\r\n\t[\"keyword\", \"CSHORT\"],\r\n\t[\"keyword\", \"CSNG\"],\r\n\t[\"keyword\", \"CSTR\"],\r\n\t[\"keyword\", \"CTYPE\"],\r\n\t[\"keyword\", \"CUINT\"],\r\n\t[\"keyword\", \"CULNG\"],\r\n\t[\"keyword\", \"CUSHORT\"],\r\n\t[\"keyword\", \"DATA\"],\r\n\t[\"keyword\", \"DATE\"],\r\n\t[\"keyword\", \"DECIMAL\"],\r\n\t[\"keyword\", \"DECLARE\"],\r\n\t[\"keyword\", \"DEFAULT\"],\r\n\t[\"keyword\", \"DEF FN\"],\r\n\t[\"keyword\", \"DEF SEG\"],\r\n\t[\"keyword\", \"DEFDBL\"],\r\n\t[\"keyword\", \"DEFINT\"],\r\n\t[\"keyword\", \"DEFLNG\"],\r\n\t[\"keyword\", \"DEFSNG\"],\r\n\t[\"keyword\", \"DEFSTR\"],\r\n\t[\"keyword\", \"DELEGATE\"],\r\n\t[\"keyword\", \"DIM\"],\r\n\t[\"keyword\", \"DIRECTCAST\"],\r\n\t[\"keyword\", \"DO\"],\r\n\t[\"keyword\", \"DOUBLE\"],\r\n\t[\"keyword\", \"ELSE\"],\r\n\t[\"keyword\", \"ELSEIF\"],\r\n\t[\"keyword\", \"END\"],\r\n\t[\"keyword\", \"ENUM\"],\r\n\t[\"keyword\", \"ENVIRON\"],\r\n\t[\"keyword\", \"ERASE\"],\r\n\t[\"keyword\", \"ERROR\"],\r\n\t[\"keyword\", \"EVENT\"],\r\n\t[\"keyword\", \"EXIT\"],\r\n\t[\"keyword\", \"FALSE\"],\r\n\t[\"keyword\", \"FIELD\"],\r\n\t[\"keyword\", \"FILES\"],\r\n\t[\"keyword\", \"FINALLY\"],\r\n\t[\"keyword\", \"FOR\"],\r\n\t[\"keyword\", \"FOR EACH\"],\r\n\t[\"keyword\", \"FRIEND\"],\r\n\t[\"keyword\", \"FUNCTION\"],\r\n\t[\"keyword\", \"GET\"],\r\n\t[\"keyword\", \"GETTYPE\"],\r\n\t[\"keyword\", \"GETXMLNAMESPACE\"],\r\n\t[\"keyword\", \"GLOBAL\"],\r\n\t[\"keyword\", \"GOSUB\"],\r\n\t[\"keyword\", \"GOTO\"],\r\n\t[\"keyword\", \"HANDLES\"],\r\n\t[\"keyword\", \"IF\"],\r\n\t[\"keyword\", \"IMPLEMENTS\"],\r\n\t[\"keyword\", \"IMPORTS\"],\r\n\t[\"keyword\", \"IN\"],\r\n\t[\"keyword\", \"INHERITS\"],\r\n\t[\"keyword\", \"INPUT\"],\r\n\t[\"keyword\", \"INTEGER\"],\r\n\t[\"keyword\", \"INTERFACE\"],\r\n\t[\"keyword\", \"IOCTL\"],\r\n\t[\"keyword\", \"IS\"],\r\n\t[\"keyword\", \"ISNOT\"],\r\n\t[\"keyword\", \"KEY\"],\r\n\t[\"keyword\", \"KILL\"],\r\n\t[\"keyword\", \"LINE INPUT\"],\r\n\t[\"keyword\", \"LET\"],\r\n\t[\"keyword\", \"LIB\"],\r\n\t[\"keyword\", \"LIKE\"],\r\n\t[\"keyword\", \"LOCATE\"],\r\n\t[\"keyword\", \"LOCK\"],\r\n\t[\"keyword\", \"LONG\"],\r\n\t[\"keyword\", \"LOOP\"],\r\n\t[\"keyword\", \"LSET\"],\r\n\t[\"keyword\", \"ME\"],\r\n\t[\"keyword\", \"MKDIR\"],\r\n\t[\"keyword\", \"MOD\"],\r\n\t[\"keyword\", \"MODULE\"],\r\n\t[\"keyword\", \"MUSTINHERIT\"],\r\n\t[\"keyword\", \"MUSTOVERRIDE\"],\r\n\t[\"keyword\", \"MYBASE\"],\r\n\t[\"keyword\", \"MYCLASS\"],\r\n\t[\"keyword\", \"NAME\"],\r\n\t[\"keyword\", \"NAMESPACE\"],\r\n\t[\"keyword\", \"NARROWING\"],\r\n\t[\"keyword\", \"NEW\"],\r\n\t[\"keyword\", \"NEXT\"],\r\n\t[\"keyword\", \"NOT\"],\r\n\t[\"keyword\", \"NOTHING\"],\r\n\t[\"keyword\", \"NOTINHERITABLE\"],\r\n\t[\"keyword\", \"NOTOVERRIDABLE\"],\r\n\t[\"keyword\", \"OBJECT\"],\r\n\t[\"keyword\", \"OF\"],\r\n\t[\"keyword\", \"OFF\"],\r\n\t[\"keyword\", \"ON\"],\r\n\t[\"keyword\", \"ON COM\"],\r\n\t[\"keyword\", \"ON ERROR\"],\r\n\t[\"keyword\", \"ON KEY\"],\r\n\t[\"keyword\", \"ON TIMER\"],\r\n\t[\"keyword\", \"OPERATOR\"],\r\n\t[\"keyword\", \"OPEN\"],\r\n\t[\"keyword\", \"OPTION\"],\r\n\t[\"keyword\", \"OPTION BASE\"],\r\n\t[\"keyword\", \"OPTIONAL\"],\r\n\t[\"keyword\", \"OR\"],\r\n\t[\"keyword\", \"ORELSE\"],\r\n\t[\"keyword\", \"OUT\"],\r\n\t[\"keyword\", \"OVERLOADS\"],\r\n\t[\"keyword\", \"OVERRIDABLE\"],\r\n\t[\"keyword\", \"OVERRIDES\"],\r\n\t[\"keyword\", \"PARAMARRAY\"],\r\n\t[\"keyword\", \"PARTIAL\"],\r\n\t[\"keyword\", \"POKE\"],\r\n\t[\"keyword\", \"PRIVATE\"],\r\n\t[\"keyword\", \"PROPERTY\"],\r\n\t[\"keyword\", \"PROTECTED\"],\r\n\t[\"keyword\", \"PUBLIC\"],\r\n\t[\"keyword\", \"PUT\"],\r\n\t[\"keyword\", \"RAISEEVENT\"],\r\n\t[\"keyword\", \"READ\"],\r\n\t[\"keyword\", \"READONLY\"],\r\n\t[\"keyword\", \"REDIM\"],\r\n\t[\"keyword\", \"REM\"],\r\n\t[\"keyword\", \"REMOVEHANDLER\"],\r\n\t[\"keyword\", \"RESTORE\"],\r\n\t[\"keyword\", \"RESUME\"],\r\n\t[\"keyword\", \"RETURN\"],\r\n\t[\"keyword\", \"RMDIR\"],\r\n\t[\"keyword\", \"RSET\"],\r\n\t[\"keyword\", \"RUN\"],\r\n\t[\"keyword\", \"SBYTE\"],\r\n\t[\"keyword\", \"SELECT\"],\r\n\t[\"keyword\", \"SELECT CASE\"],\r\n\t[\"keyword\", \"SET\"],\r\n\t[\"keyword\", \"SHADOWS\"],\r\n\t[\"keyword\", \"SHARED\"],\r\n\t[\"keyword\", \"SHORT\"],\r\n\t[\"keyword\", \"SINGLE\"],\r\n\t[\"keyword\", \"SHELL\"],\r\n\t[\"keyword\", \"SLEEP\"],\r\n\t[\"keyword\", \"STATIC\"],\r\n\t[\"keyword\", \"STEP\"],\r\n\t[\"keyword\", \"STOP\"],\r\n\t[\"keyword\", \"STRING\"],\r\n\t[\"keyword\", \"STRUCTURE\"],\r\n\t[\"keyword\", \"SUB\"],\r\n\t[\"keyword\", \"SYNCLOCK\"],\r\n\t[\"keyword\", \"SWAP\"],\r\n\t[\"keyword\", \"SYSTEM\"],\r\n\t[\"keyword\", \"THEN\"],\r\n\t[\"keyword\", \"THROW\"],\r\n\t[\"keyword\", \"TIMER\"],\r\n\t[\"keyword\", \"TO\"],\r\n\t[\"keyword\", \"TROFF\"],\r\n\t[\"keyword\", \"TRON\"],\r\n\t[\"keyword\", \"TRUE\"],\r\n\t[\"keyword\", \"TRY\"],\r\n\t[\"keyword\", \"TRYCAST\"],\r\n\t[\"keyword\", \"TYPE\"],\r\n\t[\"keyword\", \"TYPEOF\"],\r\n\t[\"keyword\", \"UINTEGER\"],\r\n\t[\"keyword\", \"ULONG\"],\r\n\t[\"keyword\", \"UNLOCK\"],\r\n\t[\"keyword\", \"UNTIL\"],\r\n\t[\"keyword\", \"USHORT\"],\r\n\t[\"keyword\", \"USING\"],\r\n\t[\"keyword\", \"VIEW PRINT\"],\r\n\t[\"keyword\", \"WAIT\"],\r\n\t[\"keyword\", \"WEND\"],\r\n\t[\"keyword\", \"WHEN\"],\r\n\t[\"keyword\", \"WHILE\"],\r\n\t[\"keyword\", \"WIDENING\"],\r\n\t[\"keyword\", \"WITH\"],\r\n\t[\"keyword\", \"WITHEVENTS\"],\r\n\t[\"keyword\", \"WRITE\"],\r\n\t[\"keyword\", \"WRITEONLY\"],\r\n\t[\"keyword\", \"XOR\"],\r\n\t[\"keyword\", \"#CONST\"],\r\n\t[\"keyword\", \"#ELSE\"],\r\n\t[\"keyword\", \"#ELSE\"],\r\n\t[\"keyword\", \"#ELSEIF\"],\r\n\t[\"keyword\", \"#END\"],\r\n\t[\"keyword\", \"#IF\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/vbnet/punctuation_feature.test",
    "content": ", ; :\n( ) { }\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]"
  },
  {
    "path": "tests/languages/vbnet/string_feature.test",
    "content": "Dim x = \"hello\nworld\"\n\nConsole.WriteLine(\"Message: {0}\", message)\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"Dim\"],\n\t\" x \",\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"hello\\r\\nworld\\\"\"],\n\n\t\"\\r\\n\\r\\nConsole.WriteLine\",\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"Message: {0}\\\"\"],\n\t[\"punctuation\", \",\"],\n\t\" message\",\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/vbnet!+xml-doc/inclusion.test",
    "content": "''' <summary>\r\n''' Class level summary documentation goes here.\r\n''' </summary>\r\n''' <remarks>\r\n''' Longer comments can be associated with a type or member through\r\n''' the remarks tag.\r\n''' </remarks>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"doc-comment\", [\r\n\t\t\"''' \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"summary\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"doc-comment\", [\"''' Class level summary documentation goes here.\"]],\r\n\t[\"doc-comment\", [\r\n\t\t\"''' \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"summary\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"doc-comment\", [\r\n\t\t\"''' \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"remarks\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"doc-comment\", [\"''' Longer comments can be associated with a type or member through\"]],\r\n\t[\"doc-comment\", [\"''' the remarks tag.\"]],\r\n\t[\"doc-comment\", [\r\n\t\t\"''' \",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"remarks\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for XML documentation comments.\r\n"
  },
  {
    "path": "tests/languages/velocity/directive_feature.test",
    "content": "#foreach($mud in $mudsOnSpecial)\r\n#if($customer.hasPurchased($mud))\r\n#set($a = \"Velocity\")\r\n#set($foo.bar[1] = 3)\r\n#{set}($map[\"apple\"] = \"orange\")\r\n#if($foo == $bar)#end\r\n#if (!$foo)#end\r\n#if ($foo && $foo.bar)#end\r\n#{if}($foo1 || $foo2)#end\r\n#set( $monkey.Say = [\"Not\", $my, \"fault\"] )\r\n#set( $monkey.Map = {\"banana\" : \"good\", \"roast beef\" : \"bad\"})\r\n#set( $result = $query.criteria(\"address\") )\r\n#set( $result = true )\r\n#set( $result = false )\r\n#if( $foo < 10 )\r\n#elseif( $foo == 10 )\r\n#else\r\n#end\r\n#if( $foo == $bar)it's true!#{else}it's not!#end\r\n#include( \"greetings.txt\", $seasonalstock )\r\n#parse( \"me.vm\" )\r\n#{parse}( \"me.vm\" )\r\n#break\r\n#{break}\r\n#break($macro.topmost)\r\n#stop('$foo was not in context')\r\n#{stop}\r\n#evaluate($dynamicsource)\r\n#macro( d )\r\n<tr><td></td></tr>\r\n#end\r\n#d()\r\n#@d()Hello!#end\r\n\\#include( \"a.txt\" )\r\n\\\\#include ( \"a.txt\" )\r\n#set($foo=[\"$10 and \",\"a pie\"])#foreach($a in $foo)$a#end\r\n#set( $foo = $bar + 3 )\r\n#set( $foo = $bar - 4 )\r\n#set( $foo = $bar * 6 )\r\n#set( $foo = $bar / 2 )\r\n#set( $foo = $bar % 5 )\r\n#foreach( $foo in [1..5] )\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#foreach\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$mud\"]],\r\n\t\t[\"keyword\", [\"in\"]],\r\n\t\t[\"variable\", [\"$mudsOnSpecial\"]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#if\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$customer\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"hasPurchased\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\"$mud\",\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$a\"]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"Velocity\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$foo\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"bar\",\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"number\", \"1\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\r\n\t\t\t\"#\",\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"set\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$map\",\r\n\t\t\t[\"punctuation\", \"[\"],\r\n\t\t\t[\"string\", \"\\\"apple\\\"\"],\r\n\t\t\t[\"punctuation\", \"]\"]\r\n\t\t]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"string\", \"\\\"orange\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#if\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"variable\", [\"$bar\"]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#end\"]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#if\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"operator\", \"!\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#end\"]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#if\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"&&\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$foo\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"bar\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#end\"]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\r\n\t\t\t\"#\",\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"if\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo1\"]],\r\n\t\t[\"operator\", \"||\"],\r\n\t\t[\"variable\", [\"$foo2\"]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#end\"]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$monkey\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Say\"\r\n\t\t]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"string\", \"\\\"Not\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"variable\", [\"$my\"]],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"string\", \"\\\"fault\\\"\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$monkey\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"Map\"\r\n\t\t]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t[\"string\", \"\\\"banana\\\"\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"string\", \"\\\"good\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"string\", \"\\\"roast beef\\\"\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"string\", \"\\\"bad\\\"\"],\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$result\"]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$query\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t[\"function\", \"criteria\"],\r\n\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t[\"string\", \"\\\"address\\\"\"],\r\n\t\t\t[\"punctuation\", \")\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$result\"]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"boolean\", \"true\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$result\"]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"boolean\", \"false\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#if\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"<\"],\r\n\t\t[\"number\", \"10\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#elseif\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"number\", \"10\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#else\"]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#end\"]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#if\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"==\"],\r\n\t\t[\"variable\", [\"$bar\"]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"it's true!\",\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\r\n\t\t\t\"#\",\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"else\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\t\"it's not!\",\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#end\"]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#include\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"\\\"greetings.txt\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"variable\", [\"$seasonalstock\"]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#parse\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"\\\"me.vm\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\r\n\t\t\t\"#\",\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"parse\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"\\\"me.vm\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#break\"]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\r\n\t\t\t\"#\",\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"break\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#break\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\r\n\t\t\t\"$macro\",\r\n\t\t\t[\"punctuation\", \".\"],\r\n\t\t\t\"topmost\"\r\n\t\t]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#stop\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"'$foo was not in context'\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\r\n\t\t\t\"#\",\r\n\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\"stop\",\r\n\t\t\t[\"punctuation\", \"}\"]\r\n\t\t]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#evaluate\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$dynamicsource\"]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#macro\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\" d \",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"tr\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"td\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"td\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"tr\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#end\"]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#d\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#@d\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t\"Hello!\",\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#end\"]]\r\n\t]],\r\n\r\n\t\"\\r\\n\\\\#include( \\\"a.txt\\\" )\\r\\n\\\\\\\\\",\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#include\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"string\", \"\\\"a.txt\\\"\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"string\", \"\\\"$10 and \\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"string\", \"\\\"a pie\\\"\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#foreach\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$a\"]],\r\n\t\t[\"keyword\", [\"in\"]],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\t[\"variable\", [\"$a\"]],\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#end\"]]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"variable\", [\"$bar\"]],\r\n\t\t[\"operator\", \"+\"],\r\n\t\t[\"number\", \"3\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"variable\", [\"$bar\"]],\r\n\t\t[\"operator\", \"-\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"variable\", [\"$bar\"]],\r\n\t\t[\"operator\", \"*\"],\r\n\t\t[\"number\", \"6\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"variable\", [\"$bar\"]],\r\n\t\t[\"operator\", \"/\"],\r\n\t\t[\"number\", \"2\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#set\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"operator\", \"=\"],\r\n\t\t[\"variable\", [\"$bar\"]],\r\n\t\t[\"operator\", \"%\"],\r\n\t\t[\"number\", \"5\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"directive\", [\r\n\t\t[\"keyword\", [\"#foreach\"]],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"variable\", [\"$foo\"]],\r\n\t\t[\"keyword\", [\"in\"]],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"operator\", \"..\"],\r\n\t\t[\"number\", \"5\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directives.\r\n"
  },
  {
    "path": "tests/languages/velocity/unparsed_feature.test",
    "content": "#[[]]#\r\n#[[This is not parsed]]#\r\n#[[#if(\"some quotes\" 'some quotes')\r\n## #* *#\r\n$dollar\r\n]]#\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"unparsed\", [\r\n\t\t[\"punctuation\", \"#[[\"],\r\n\t\t[\"punctuation\", \"]]#\"]\r\n\t]],\r\n\t[\"unparsed\", [\r\n\t\t[\"punctuation\", \"#[[\"],\r\n\t\t\"This is not parsed\",\r\n\t\t[\"punctuation\", \"]]#\"]\r\n\t]],\r\n\t[\"unparsed\", [\r\n\t\t[\"punctuation\", \"#[[\"],\r\n\t\t\"#if(\\\"some quotes\\\" 'some quotes')\\r\\n## #* *#\\r\\n$dollar\\r\\n\",\r\n\t\t[\"punctuation\", \"]]#\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for unparsed sections."
  },
  {
    "path": "tests/languages/velocity/variable_feature.test",
    "content": "$mud\r\n$customer.Name\r\n$flogger.getPromo( $mud )\r\n$mud-slinger\r\n$mud_slinger\r\n$mudSlinger1\r\n$!mudSlinger_9\r\n$person.setAttributes( [\"Strange\", false, \"Excited\"] )\r\n$foo[0]\r\n$foo[$i]\r\n$foo[\"bar\"]\r\n$foo.bar[1].junk\r\n$foo.callMethod()[1]\r\n$foo[\"apple\"][4]\r\n${mudSlinger}\r\n$!{mudSlinger_9}\r\n${customer.Address}\r\n${purchase.getTotal()}\r\n<input value=\"$email\"/>\r\n<input value=\"$!{email}\"/>\r\n$\\!foo\r\n$\\!{foo}\r\n$\\\\!foo\r\n$\\\\\\!foo\r\n\\$foo\r\n\\$!foo\r\n\\$!{foo}\r\n\\\\$!{foo}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", [\"$mud\"]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$customer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Name\"\r\n\t]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$flogger\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"getPromo\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t\" $mud \",\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"variable\", [\"$mud-slinger\"]],\r\n\r\n\t[\"variable\", [\"$mud_slinger\"]],\r\n\r\n\t[\"variable\", [\"$mudSlinger1\"]],\r\n\r\n\t[\"variable\", [\"$!mudSlinger_9\"]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$person\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"setAttributes\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"string\", \"\\\"Strange\\\"\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"boolean\", \"false\"],\r\n\t\t[\"punctuation\", \",\"],\r\n\t\t[\"string\", \"\\\"Excited\\\"\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \")\"]\r\n\t]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$foo\",\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"number\", \"0\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$foo\",\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"$i\",\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$foo\",\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"string\", \"\\\"bar\\\"\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"bar\",\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"junk\"\r\n\t]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$foo\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"callMethod\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"number\", \"1\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$foo\",\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"string\", \"\\\"apple\\\"\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"punctuation\", \"]\"]\r\n\t]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$\",\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t\"mudSlinger\",\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$!\",\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t\"mudSlinger_9\",\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$\",\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t\"customer\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Address\",\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\r\n\t[\"variable\", [\r\n\t\t\"$\",\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t\"purchase\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t[\"function\", \"getTotal\"],\r\n\t\t[\"punctuation\", \"(\"],\r\n\t\t[\"punctuation\", \")\"],\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"input\"]],\r\n\t\t[\"attr-name\", [\"value\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"variable\", [\"$email\"]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"input\"]],\r\n\t\t[\"attr-name\", [\"value\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\"],\r\n\t\t\t[\"punctuation\", \"\\\"\"],\r\n\t\t\t[\"variable\", [\r\n\t\t\t\t\"$!\",\r\n\t\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\t\"email\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\r\n\t\"\\r\\n$\\\\!foo\\r\\n$\\\\!{foo}\\r\\n$\\\\\\\\!foo\\r\\n$\\\\\\\\\\\\!foo\\r\\n\\\\$foo\\r\\n\\\\$!foo\\r\\n\\\\$!{foo}\\r\\n\\\\\\\\\",\r\n\t[\"variable\", [\r\n\t\t\"$!\",\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t\"foo\",\r\n\t\t[\"punctuation\", \"}\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables.\r\n"
  },
  {
    "path": "tests/languages/velocity/velocity-comment_feature.test",
    "content": "#**#\r\n#*Multiline <div>\r\ncomment*#\r\n##\r\n## Single line comment <div>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"velocity-comment\", \"#**#\"],\r\n\t[\"velocity-comment\", \"#*Multiline <div>\\r\\ncomment*#\"],\r\n\t[\"velocity-comment\", \"##\"],\r\n\t[\"velocity-comment\", \"## Single line comment <div>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/verilog/comment_feature.test",
    "content": "//\r\n// Foobar\r\n/**/\r\n/* foo\r\nbar */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"//\"],\r\n\t[\"comment\", \"// Foobar\"],\r\n\t[\"comment\", \"/**/\"],\r\n\t[\"comment\", \"/* foo\\r\\nbar */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/verilog/constant_feature.test",
    "content": "`define\r\n`UNKNOWN\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", \"`define\"],\r\n\t[\"constant\", \"`UNKNOWN\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for user defined constants."
  },
  {
    "path": "tests/languages/verilog/function_feature.test",
    "content": "foo()\r\nfoo_bar()\r\nfoo_BAR_42()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"foo\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"foo_bar\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"foo_BAR_42\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/verilog/important_feature.test",
    "content": "always_latch\r\nalways_comb\r\nalways_ff\r\nalways\r\n\r\nalways_latch @\r\nalways_comb @\r\nalways_ff @\r\nalways @\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"important\", \"always_latch\"],\r\n\t[\"important\", \"always_comb\"],\r\n\t[\"important\", \"always_ff\"],\r\n\t[\"important\", \"always\"],\r\n\r\n\t[\"important\", \"always_latch @\"],\r\n\t[\"important\", \"always_comb @\"],\r\n\t[\"important\", \"always_ff @\"],\r\n\t[\"important\", \"always @\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for logic blocks."
  },
  {
    "path": "tests/languages/verilog/kernel-function_feature.test",
    "content": "$display()\n\n----------------------------------------------------\n\n[\n\t[\"kernel-function\", \"$display\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n\n----------------------------------------------------\n\nChecks for kernel functions.\n"
  },
  {
    "path": "tests/languages/verilog/keyword_feature.test",
    "content": "alias\r\nand\r\nassert\r\nassign\r\nassume\r\nautomatic\r\nbefore\r\nbegin\r\nbind\r\nbins\r\nbinsof\r\nbit\r\nbreak\r\nbuf\r\nbufif0\r\nbufif1\r\nbyte\r\nclass\r\ncase\r\ncasex\r\ncasez\r\ncell\r\nchandle\r\nclocking\r\ncmos\r\nconfig\r\nconst\r\nconstraint\r\ncontext\r\ncontinue\r\ncover\r\ncovergroup\r\ncoverpoint\r\ncross\r\ndeassign\r\ndefault\r\ndefparam\r\ndesign\r\ndisable\r\ndist\r\ndo\r\nedge\r\nelse\r\nend\r\nendcase\r\nendclass\r\nendclocking\r\nendconfig\r\nendfunction\r\nendgenerate\r\nendgroup\r\nendinterface\r\nendmodule\r\nendpackage\r\nendprimitive\r\nendprogram\r\nendproperty\r\nendspecify\r\nendsequence\r\nendtable\r\nendtask\r\nenum\r\nevent\r\nexpect\r\nexport\r\nextends\r\nextern\r\nfinal\r\nfirst_match\r\nfor\r\nforce\r\nforeach\r\nforever\r\nfork\r\nforkjoin\r\nfunction\r\ngenerate\r\ngenvar\r\nhighz0\r\nhighz1\r\nif\r\niff\r\nifnone\r\nignore_bins\r\nillegal_bins\r\nimport\r\nincdir\r\ninclude\r\ninitial\r\ninout\r\ninput\r\ninside\r\ninstance\r\nint\r\ninteger\r\ninterface\r\nintersect\r\njoin\r\njoin_any\r\njoin_none\r\nlarge\r\nliblist\r\nlibrary\r\nlocal\r\nlocalparam\r\nlogic\r\nlongint\r\nmacromodule\r\nmatches\r\nmedium\r\nmodport\r\nmodule\r\nnand\r\nnegedge\r\nnew\r\nnmos\r\nnor\r\nnoshowcancelled\r\nnot\r\nnotif0\r\nnotif1\r\nnull\r\nor\r\noutput\r\npackage\r\npacked\r\nparameter\r\npmos\r\nposedge\r\nprimitive\r\npriority\r\nprogram\r\nproperty\r\nprotected\r\npull0\r\npull1\r\npulldown\r\npullup\r\npulsestyle_onevent\r\npulsestyle_ondetect\r\npure\r\nrand\r\nrandc\r\nrandcase\r\nrandsequence\r\nrcmos\r\nreal\r\nrealtime\r\nref\r\nreg\r\nrelease\r\nrepeat\r\nreturn\r\nrnmos\r\nrpmos\r\nrtran\r\nrtranif0\r\nrtranif1\r\nscalared\r\nsequence\r\nshortint\r\nshortreal\r\nshowcancelled\r\nsigned\r\nsmall\r\nsolve\r\nspecify\r\nspecparam\r\nstatic\r\nstring\r\nstrong0\r\nstrong1\r\nstruct\r\nsuper\r\nsupply0\r\nsupply1\r\ntable\r\ntagged\r\ntask\r\nthis\r\nthroughout\r\ntime\r\ntimeprecision\r\ntimeunit\r\ntran\r\ntranif0\r\ntranif1\r\ntri\r\ntri0\r\ntri1\r\ntriand\r\ntrior\r\ntrireg\r\ntype\r\ntypedef\r\nunion\r\nunique\r\nunsigned\r\nuse\r\nuwire\r\nvar\r\nvectored\r\nvirtual\r\nvoid\r\nwait\r\nwait_order\r\nwand\r\nweak0\r\nweak1\r\nwhile\r\nwildcard\r\nwire\r\nwith\r\nwithin\r\nwor\r\nxnor\r\nxor\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"alias\"],\r\n\t[\"keyword\", \"and\"],\r\n\t[\"keyword\", \"assert\"],\r\n\t[\"keyword\", \"assign\"],\r\n\t[\"keyword\", \"assume\"],\r\n\t[\"keyword\", \"automatic\"],\r\n\t[\"keyword\", \"before\"],\r\n\t[\"keyword\", \"begin\"],\r\n\t[\"keyword\", \"bind\"],\r\n\t[\"keyword\", \"bins\"],\r\n\t[\"keyword\", \"binsof\"],\r\n\t[\"keyword\", \"bit\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"buf\"],\r\n\t[\"keyword\", \"bufif0\"],\r\n\t[\"keyword\", \"bufif1\"],\r\n\t[\"keyword\", \"byte\"],\r\n\t[\"keyword\", \"class\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"casex\"],\r\n\t[\"keyword\", \"casez\"],\r\n\t[\"keyword\", \"cell\"],\r\n\t[\"keyword\", \"chandle\"],\r\n\t[\"keyword\", \"clocking\"],\r\n\t[\"keyword\", \"cmos\"],\r\n\t[\"keyword\", \"config\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"constraint\"],\r\n\t[\"keyword\", \"context\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"cover\"],\r\n\t[\"keyword\", \"covergroup\"],\r\n\t[\"keyword\", \"coverpoint\"],\r\n\t[\"keyword\", \"cross\"],\r\n\t[\"keyword\", \"deassign\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"defparam\"],\r\n\t[\"keyword\", \"design\"],\r\n\t[\"keyword\", \"disable\"],\r\n\t[\"keyword\", \"dist\"],\r\n\t[\"keyword\", \"do\"],\r\n\t[\"keyword\", \"edge\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"endcase\"],\r\n\t[\"keyword\", \"endclass\"],\r\n\t[\"keyword\", \"endclocking\"],\r\n\t[\"keyword\", \"endconfig\"],\r\n\t[\"keyword\", \"endfunction\"],\r\n\t[\"keyword\", \"endgenerate\"],\r\n\t[\"keyword\", \"endgroup\"],\r\n\t[\"keyword\", \"endinterface\"],\r\n\t[\"keyword\", \"endmodule\"],\r\n\t[\"keyword\", \"endpackage\"],\r\n\t[\"keyword\", \"endprimitive\"],\r\n\t[\"keyword\", \"endprogram\"],\r\n\t[\"keyword\", \"endproperty\"],\r\n\t[\"keyword\", \"endspecify\"],\r\n\t[\"keyword\", \"endsequence\"],\r\n\t[\"keyword\", \"endtable\"],\r\n\t[\"keyword\", \"endtask\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"event\"],\r\n\t[\"keyword\", \"expect\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"extends\"],\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"final\"],\r\n\t[\"keyword\", \"first_match\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"force\"],\r\n\t[\"keyword\", \"foreach\"],\r\n\t[\"keyword\", \"forever\"],\r\n\t[\"keyword\", \"fork\"],\r\n\t[\"keyword\", \"forkjoin\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"generate\"],\r\n\t[\"keyword\", \"genvar\"],\r\n\t[\"keyword\", \"highz0\"],\r\n\t[\"keyword\", \"highz1\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"iff\"],\r\n\t[\"keyword\", \"ifnone\"],\r\n\t[\"keyword\", \"ignore_bins\"],\r\n\t[\"keyword\", \"illegal_bins\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"incdir\"],\r\n\t[\"keyword\", \"include\"],\r\n\t[\"keyword\", \"initial\"],\r\n\t[\"keyword\", \"inout\"],\r\n\t[\"keyword\", \"input\"],\r\n\t[\"keyword\", \"inside\"],\r\n\t[\"keyword\", \"instance\"],\r\n\t[\"keyword\", \"int\"],\r\n\t[\"keyword\", \"integer\"],\r\n\t[\"keyword\", \"interface\"],\r\n\t[\"keyword\", \"intersect\"],\r\n\t[\"keyword\", \"join\"],\r\n\t[\"keyword\", \"join_any\"],\r\n\t[\"keyword\", \"join_none\"],\r\n\t[\"keyword\", \"large\"],\r\n\t[\"keyword\", \"liblist\"],\r\n\t[\"keyword\", \"library\"],\r\n\t[\"keyword\", \"local\"],\r\n\t[\"keyword\", \"localparam\"],\r\n\t[\"keyword\", \"logic\"],\r\n\t[\"keyword\", \"longint\"],\r\n\t[\"keyword\", \"macromodule\"],\r\n\t[\"keyword\", \"matches\"],\r\n\t[\"keyword\", \"medium\"],\r\n\t[\"keyword\", \"modport\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"keyword\", \"nand\"],\r\n\t[\"keyword\", \"negedge\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"nmos\"],\r\n\t[\"keyword\", \"nor\"],\r\n\t[\"keyword\", \"noshowcancelled\"],\r\n\t[\"keyword\", \"not\"],\r\n\t[\"keyword\", \"notif0\"],\r\n\t[\"keyword\", \"notif1\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"output\"],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"packed\"],\r\n\t[\"keyword\", \"parameter\"],\r\n\t[\"keyword\", \"pmos\"],\r\n\t[\"keyword\", \"posedge\"],\r\n\t[\"keyword\", \"primitive\"],\r\n\t[\"keyword\", \"priority\"],\r\n\t[\"keyword\", \"program\"],\r\n\t[\"keyword\", \"property\"],\r\n\t[\"keyword\", \"protected\"],\r\n\t[\"keyword\", \"pull0\"],\r\n\t[\"keyword\", \"pull1\"],\r\n\t[\"keyword\", \"pulldown\"],\r\n\t[\"keyword\", \"pullup\"],\r\n\t[\"keyword\", \"pulsestyle_onevent\"],\r\n\t[\"keyword\", \"pulsestyle_ondetect\"],\r\n\t[\"keyword\", \"pure\"],\r\n\t[\"keyword\", \"rand\"],\r\n\t[\"keyword\", \"randc\"],\r\n\t[\"keyword\", \"randcase\"],\r\n\t[\"keyword\", \"randsequence\"],\r\n\t[\"keyword\", \"rcmos\"],\r\n\t[\"keyword\", \"real\"],\r\n\t[\"keyword\", \"realtime\"],\r\n\t[\"keyword\", \"ref\"],\r\n\t[\"keyword\", \"reg\"],\r\n\t[\"keyword\", \"release\"],\r\n\t[\"keyword\", \"repeat\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"rnmos\"],\r\n\t[\"keyword\", \"rpmos\"],\r\n\t[\"keyword\", \"rtran\"],\r\n\t[\"keyword\", \"rtranif0\"],\r\n\t[\"keyword\", \"rtranif1\"],\r\n\t[\"keyword\", \"scalared\"],\r\n\t[\"keyword\", \"sequence\"],\r\n\t[\"keyword\", \"shortint\"],\r\n\t[\"keyword\", \"shortreal\"],\r\n\t[\"keyword\", \"showcancelled\"],\r\n\t[\"keyword\", \"signed\"],\r\n\t[\"keyword\", \"small\"],\r\n\t[\"keyword\", \"solve\"],\r\n\t[\"keyword\", \"specify\"],\r\n\t[\"keyword\", \"specparam\"],\r\n\t[\"keyword\", \"static\"],\r\n\t[\"keyword\", \"string\"],\r\n\t[\"keyword\", \"strong0\"],\r\n\t[\"keyword\", \"strong1\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"super\"],\r\n\t[\"keyword\", \"supply0\"],\r\n\t[\"keyword\", \"supply1\"],\r\n\t[\"keyword\", \"table\"],\r\n\t[\"keyword\", \"tagged\"],\r\n\t[\"keyword\", \"task\"],\r\n\t[\"keyword\", \"this\"],\r\n\t[\"keyword\", \"throughout\"],\r\n\t[\"keyword\", \"time\"],\r\n\t[\"keyword\", \"timeprecision\"],\r\n\t[\"keyword\", \"timeunit\"],\r\n\t[\"keyword\", \"tran\"],\r\n\t[\"keyword\", \"tranif0\"],\r\n\t[\"keyword\", \"tranif1\"],\r\n\t[\"keyword\", \"tri\"],\r\n\t[\"keyword\", \"tri0\"],\r\n\t[\"keyword\", \"tri1\"],\r\n\t[\"keyword\", \"triand\"],\r\n\t[\"keyword\", \"trior\"],\r\n\t[\"keyword\", \"trireg\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"typedef\"],\r\n\t[\"keyword\", \"union\"],\r\n\t[\"keyword\", \"unique\"],\r\n\t[\"keyword\", \"unsigned\"],\r\n\t[\"keyword\", \"use\"],\r\n\t[\"keyword\", \"uwire\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"vectored\"],\r\n\t[\"keyword\", \"virtual\"],\r\n\t[\"keyword\", \"void\"],\r\n\t[\"keyword\", \"wait\"],\r\n\t[\"keyword\", \"wait_order\"],\r\n\t[\"keyword\", \"wand\"],\r\n\t[\"keyword\", \"weak0\"],\r\n\t[\"keyword\", \"weak1\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"wildcard\"],\r\n\t[\"keyword\", \"wire\"],\r\n\t[\"keyword\", \"with\"],\r\n\t[\"keyword\", \"within\"],\r\n\t[\"keyword\", \"wor\"],\r\n\t[\"keyword\", \"xnor\"],\r\n\t[\"keyword\", \"xor\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/verilog/number_feature.test",
    "content": "#1\r\n##42\r\n\r\n'h 12\r\n6'h 12\r\n8'B0010_1010\r\n123\r\n8'o 77\r\n'h x\r\n16'h ????\r\n\r\n3.14159\r\n4e8\r\n3.2E-14\r\n0.7e+8\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"#1\"],\r\n\t[\"number\", \"##42\"],\r\n\r\n\t[\"number\", \"'h 12\"],\r\n\t[\"number\", \"6'h 12\"],\r\n\t[\"number\", \"8'B0010_1010\"],\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"8'o 77\"],\r\n\t[\"number\", \"'h x\"],\r\n\t[\"number\", \"16'h ????\"],\r\n\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"4e8\"],\r\n\t[\"number\", \"3.2E-14\"],\r\n\t[\"number\", \"0.7e+8\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/verilog/operator_feature.test",
    "content": "! ~ & |\r\n~& ~| ^\r\n~^ ^~\r\n+ - { }\r\n* ** / %\r\n<< >> <<< >>>\r\n< <= > >=\r\n== != === !==\r\n==? !=?\r\n&& || ?\r\n-> <->\r\n++ --\r\n+= -= /= *=\r\n%= &= |= ^=\r\n<<= >>= <<<= >>>=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"!\"], [\"operator\", \"~\"], [\"operator\", \"&\"], [\"operator\", \"|\"],\r\n\t[\"operator\", \"~&\"], [\"operator\", \"~|\"], [\"operator\", \"^\"],\r\n\t[\"operator\", \"~^\"], [\"operator\", \"^~\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"{\"], [\"operator\", \"}\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"**\"], [\"operator\", \"/\"], [\"operator\", \"%\"],\r\n\t[\"operator\", \"<<\"], [\"operator\", \">>\"], [\"operator\", \"<<<\"], [\"operator\", \">>>\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"==\"], [\"operator\", \"!=\"], [\"operator\", \"===\"], [\"operator\", \"!==\"],\r\n\t[\"operator\", \"==?\"], [\"operator\", \"!=?\"],\r\n\t[\"operator\", \"&&\"], [\"operator\", \"||\"], [\"operator\", \"?\"],\r\n\t[\"operator\", \"->\"], [\"operator\", \"<->\"],\r\n\t[\"operator\", \"++\"], [\"operator\", \"--\"],\r\n\t[\"operator\", \"+=\"], [\"operator\", \"-=\"], [\"operator\", \"/=\"], [\"operator\", \"*=\"],\r\n\t[\"operator\", \"%=\"], [\"operator\", \"&=\"], [\"operator\", \"|=\"], [\"operator\", \"^=\"],\r\n\t[\"operator\", \"<<=\"], [\"operator\", \">>=\"], [\"operator\", \"<<<=\"], [\"operator\", \">>>=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/verilog/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"obar\"\r\n\"foo\\\r\nbar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\\\\r\\nbar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/vhdl/attribute_feature.test",
    "content": "T'BASE\nT'IMAGE(X)\nA'RANGE\nA'RANGE(N)\nA'REVERSE_RANGE\nA'REVERSE_RANGE(N)\nS'DELAYED(t)\nE'INSTANCE_NAME\n\n----------------------------------------------------\n\n[\n\t\"T\", [\"attribute\", \"'BASE\"],\n\t\"\\r\\nT\", [\"attribute\", \"'IMAGE\"], [\"punctuation\", \"(\"], \"X\", [\"punctuation\", \")\"],\n\t\"\\r\\nA\", [\"attribute\", \"'RANGE\"],\n\t\"\\r\\nA\", [\"attribute\", \"'RANGE\"], [\"punctuation\", \"(\"], \"N\", [\"punctuation\", \")\"],\n\t\"\\r\\nA\", [\"attribute\", \"'REVERSE_RANGE\"],\n\t\"\\r\\nA\", [\"attribute\", \"'REVERSE_RANGE\"], [\"punctuation\", \"(\"], \"N\", [\"punctuation\", \")\"],\n\t\"\\r\\nS\", [\"attribute\", \"'DELAYED\"],  [\"punctuation\", \"(\"], \"t\", [\"punctuation\", \")\"],\n\t\"\\r\\nE\", [\"attribute\", \"'INSTANCE_NAME\"]\n]\n\n----------------------------------------------------\n\nChecks for attributes.\n"
  },
  {
    "path": "tests/languages/vhdl/boolean_feature.test",
    "content": "true\r\nfalse\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/vhdl/comment_feature.test",
    "content": "-- Foo\r\n--foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"-- Foo\"],\r\n\t[\"comment\", \"--foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/vhdl/function_feature.test",
    "content": "Bit_vector(7 downto 0)\r\nDataBus(7)\r\nfunction BOOL_TO_SL(X : boolean)\r\nfunction \"*\"(a : resistance; b : capacitance)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"Bit_vector\"],\r\n\t[\"punctuation\", \"(\"], [\"number\", \"7\"],\r\n\t[\"keyword\", \"downto\"], [\"number\", \"0\"], [\"punctuation\", \")\"],\r\n\r\n\t[\"function\", \"DataBus\"],\r\n\t[\"punctuation\", \"(\"], [\"number\", \"7\"], [\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"function\"], [\"function\", \"BOOL_TO_SL\"],\r\n\t[\"punctuation\", \"(\"], \"X \",\r\n\t[\"punctuation\", \":\"], \" boolean\", [\"punctuation\", \")\"],\r\n\r\n\t[\"keyword\", \"function\"], [\"quoted-function\", \"\\\"*\\\"\"],\r\n\t[\"punctuation\", \"(\"], \"a \",\r\n\t[\"punctuation\", \":\"], \" resistance\",\r\n\t[\"punctuation\", \";\"], \" b \",\r\n\t[\"punctuation\", \":\"], \" capacitance\", [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions and operator overloading."
  },
  {
    "path": "tests/languages/vhdl/keyword_feature.test",
    "content": "access\r\nafter\r\nalias\r\nall\r\narchitecture\r\narray\r\nassert\r\nattribute\r\nbegin\r\nblock\r\nbody\r\nbuffer\r\nbus\r\ncase\r\ncomponent\r\nconfiguration\r\nconstant\r\ndisconnect\r\ndownto\r\nelse\r\nelsif\r\nend\r\nentity\r\nexit\r\nfile\r\nfor\r\nfunction\r\ngenerate\r\ngeneric\r\ngroup\r\nguarded\r\nif\r\nimpure\r\nin\r\ninertial\r\ninout\r\nis\r\nlabel\r\nlibrary\r\nlinkage\r\nliteral\r\nloop\r\nmap\r\nnew\r\nnext\r\nnull\r\nof\r\non\r\nopen\r\nothers\r\nout\r\npackage\r\nport\r\npostponed\r\nprivate\r\nprocedure\r\nprocess\r\npure\r\nrange\r\nrecord\r\nregister\r\nreject\r\nreport\r\nreturn\r\nselect\r\nseverity\r\nshared\r\nsignal\r\nsubtype\r\nthen\r\nto\r\ntransport\r\ntype\r\nunaffected\r\nunits\r\nuntil\r\nuse\r\nvariable\r\nview\r\nwait\r\nwhen\r\nwhile\r\nwith\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"access\"],\r\n\t[\"keyword\", \"after\"],\r\n\t[\"keyword\", \"alias\"],\r\n\t[\"keyword\", \"all\"],\r\n\t[\"keyword\", \"architecture\"],\r\n\t[\"keyword\", \"array\"],\r\n\t[\"keyword\", \"assert\"],\r\n\t[\"keyword\", \"attribute\"],\r\n\t[\"keyword\", \"begin\"],\r\n\t[\"keyword\", \"block\"],\r\n\t[\"keyword\", \"body\"],\r\n\t[\"keyword\", \"buffer\"],\r\n\t[\"keyword\", \"bus\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"component\"],\r\n\t[\"keyword\", \"configuration\"],\r\n\t[\"keyword\", \"constant\"],\r\n\t[\"keyword\", \"disconnect\"],\r\n\t[\"keyword\", \"downto\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"elsif\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"entity\"],\r\n\t[\"keyword\", \"exit\"],\r\n\t[\"keyword\", \"file\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"generate\"],\r\n\t[\"keyword\", \"generic\"],\r\n\t[\"keyword\", \"group\"],\r\n\t[\"keyword\", \"guarded\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"impure\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"inertial\"],\r\n\t[\"keyword\", \"inout\"],\r\n\t[\"keyword\", \"is\"],\r\n\t[\"keyword\", \"label\"],\r\n\t[\"keyword\", \"library\"],\r\n\t[\"keyword\", \"linkage\"],\r\n\t[\"keyword\", \"literal\"],\r\n\t[\"keyword\", \"loop\"],\r\n\t[\"keyword\", \"map\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"next\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"of\"],\r\n\t[\"keyword\", \"on\"],\r\n\t[\"keyword\", \"open\"],\r\n\t[\"keyword\", \"others\"],\r\n\t[\"keyword\", \"out\"],\r\n\t[\"keyword\", \"package\"],\r\n\t[\"keyword\", \"port\"],\r\n\t[\"keyword\", \"postponed\"],\r\n\t[\"keyword\", \"private\"],\r\n\t[\"keyword\", \"procedure\"],\r\n\t[\"keyword\", \"process\"],\r\n\t[\"keyword\", \"pure\"],\r\n\t[\"keyword\", \"range\"],\r\n\t[\"keyword\", \"record\"],\r\n\t[\"keyword\", \"register\"],\r\n\t[\"keyword\", \"reject\"],\r\n\t[\"keyword\", \"report\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"select\"],\r\n\t[\"keyword\", \"severity\"],\r\n\t[\"keyword\", \"shared\"],\r\n\t[\"keyword\", \"signal\"],\r\n\t[\"keyword\", \"subtype\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"to\"],\r\n\t[\"keyword\", \"transport\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"unaffected\"],\r\n\t[\"keyword\", \"units\"],\r\n\t[\"keyword\", \"until\"],\r\n\t[\"keyword\", \"use\"],\r\n\t[\"keyword\", \"variable\"],\r\n\t[\"keyword\", \"view\"],\r\n\t[\"keyword\", \"wait\"],\r\n\t[\"keyword\", \"when\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"with\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/vhdl/number_feature.test",
    "content": "'0'\r\n'1'\r\n'x'\r\n'z'\r\n\r\n42\r\n42_000\r\n3.14159\r\n2.4E8\r\n3.0e-2\r\n7.54e+24\r\n\r\n2#1010_1010#\r\n16#BadFace#\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"'0'\"],\r\n\t[\"number\", \"'1'\"],\r\n\t[\"number\", \"'x'\"],\r\n\t[\"number\", \"'z'\"],\r\n\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"42_000\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"2.4E8\"],\r\n\t[\"number\", \"3.0e-2\"],\r\n\t[\"number\", \"7.54e+24\"],\r\n\r\n\t[\"number\", \"2#1010_1010#\"],\r\n\t[\"number\", \"16#BadFace#\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/vhdl/operator_feature.test",
    "content": "> >=\r\n< <=\r\n:=\r\n+ -\r\n* /\r\n& =\r\nabs not mod rem\r\nsll srl sla sra\r\nrol ror and or\r\nnand xnor xor nor\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \":=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"=\"],\r\n\t[\"operator\", \"abs\"], [\"operator\", \"not\"], [\"operator\", \"mod\"], [\"operator\", \"rem\"],\r\n\t[\"operator\", \"sll\"], [\"operator\", \"srl\"], [\"operator\", \"sla\"], [\"operator\", \"sra\"],\r\n\t[\"operator\", \"rol\"], [\"operator\", \"ror\"], [\"operator\", \"and\"], [\"operator\", \"or\"],\r\n\t[\"operator\", \"nand\"], [\"operator\", \"xnor\"], [\"operator\", \"xor\"], [\"operator\", \"nor\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/vhdl/string_feature.test",
    "content": "\"\"\r\n\"fo\\\"o\"\r\n\"fo\\\"o\\\r\nbar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"o\\\\\\r\\nbar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/vhdl/vhdl-vectors_feature.test",
    "content": "B\"1111_1111\"\r\nO\"353\"\r\nX\"AA55\"\r\n\"010101\"\r\n\"Z\"\r\n\"X\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"vhdl-vectors\", \"B\\\"1111_1111\\\"\"],\r\n\t[\"vhdl-vectors\", \"O\\\"353\\\"\"],\r\n\t[\"vhdl-vectors\", \"X\\\"AA55\\\"\"],\r\n\t[\"vhdl-vectors\", \"\\\"010101\\\"\"],\r\n\t[\"vhdl-vectors\", \"\\\"Z\\\"\"],\r\n\t[\"vhdl-vectors\", \"\\\"X\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for vectors"
  },
  {
    "path": "tests/languages/vim/builtin_feature.test",
    "content": "autocmd\r\nacd\r\nai\r\nakm\r\naleph\r\nallowrevins\r\naltkeymap\r\nambiwidth\r\nambw\r\nanti\r\nantialias\r\narab\r\narabic\r\narabicshape\r\nari\r\narshape\r\nautochdir\r\nautoindent\r\nautoread\r\nautowrite\r\nautowriteall\r\naw\r\nawa\r\nbackground\r\nbackspace\r\nbackup\r\nbackupcopy\r\nbackupdir\r\nbackupext\r\nbackupskip\r\nballoondelay\r\nballooneval\r\nballoonexpr\r\nbdir\r\nbdlay\r\nbeval\r\nbex\r\nbexpr\r\nbg\r\nbh\r\nbin\r\nbinary\r\nbiosk\r\nbioskey\r\nbk\r\nbkc\r\nbomb\r\nbreakat\r\nbrk\r\nbrowsedir\r\nbs\r\nbsdir\r\nbsk\r\nbt\r\nbufhidden\r\nbuflisted\r\nbuftype\r\ncasemap\r\nccv\r\ncdpath\r\ncedit\r\ncfu\r\nch\r\ncharconvert\r\nci\r\ncin\r\ncindent\r\ncink\r\ncinkeys\r\ncino\r\ncinoptions\r\ncinw\r\ncinwords\r\nclipboard\r\ncmdheight\r\ncmdwinheight\r\ncmp\r\ncms\r\ncolumns\r\ncom\r\ncomments\r\ncommentstring\r\ncompatible\r\ncomplete\r\ncompletefunc\r\ncompleteopt\r\nconsk\r\nconskey\r\ncopyindent\r\ncot\r\ncpo\r\ncpoptions\r\ncpt\r\ncscopepathcomp\r\ncscopeprg\r\ncscopequickfix\r\ncscopetag\r\ncscopetagorder\r\ncscopeverbose\r\ncspc\r\ncsprg\r\ncsqf\r\ncst\r\ncsto\r\ncsverb\r\ncuc\r\ncul\r\ncursorcolumn\r\ncursorline\r\ncwh\r\ndebug\r\ndeco\r\ndef\r\ndefine\r\ndelcombine\r\ndex\r\ndg\r\ndict\r\ndictionary\r\ndiff\r\ndiffexpr\r\ndiffopt\r\ndigraph\r\ndip\r\ndir\r\ndirectory\r\ndy\r\nea\r\nead\r\neadirection\r\neb\r\ned\r\nedcompatible\r\nef\r\nefm\r\nei\r\nek\r\nenc\r\nencoding\r\nendofline\r\neol\r\nep\r\nequalalways\r\nequalprg\r\nerrorbells\r\nerrorfile\r\nerrorformat\r\nesckeys\r\net\r\neventignore\r\nexpandtab\r\nexrc\r\nfcl\r\nfcs\r\nfdc\r\nfde\r\nfdi\r\nfdl\r\nfdls\r\nfdm\r\nfdn\r\nfdo\r\nfdt\r\nfen\r\nfenc\r\nfencs\r\nfex\r\nff\r\nffs\r\nfileencoding\r\nfileencodings\r\nfileformat\r\nfileformats\r\nfillchars\r\nfk\r\nfkmap\r\nflp\r\nfml\r\nfmr\r\nfoldcolumn\r\nfoldenable\r\nfoldexpr\r\nfoldignore\r\nfoldlevel\r\nfoldlevelstart\r\nfoldmarker\r\nfoldmethod\r\nfoldminlines\r\nfoldnestmax\r\nfoldtext\r\nformatexpr\r\nformatlistpat\r\nformatoptions\r\nformatprg\r\nfp\r\nfs\r\nfsync\r\nft\r\ngcr\r\ngd\r\ngdefault\r\ngfm\r\ngfn\r\ngfs\r\ngfw\r\nghr\r\ngp\r\ngrepformat\r\ngrepprg\r\ngtl\r\ngtt\r\nguicursor\r\nguifont\r\nguifontset\r\nguifontwide\r\nguiheadroom\r\nguioptions\r\nguipty\r\nguitablabel\r\nguitabtooltip\r\nhelpfile\r\nhelpheight\r\nhelplang\r\nhf\r\nhh\r\nhi\r\nhidden\r\nhighlight\r\nhk\r\nhkmap\r\nhkmapp\r\nhkp\r\nhl\r\nhlg\r\nhls\r\nhlsearch\r\nic\r\nicon\r\niconstring\r\nignorecase\r\nim\r\nimactivatekey\r\nimak\r\nimc\r\nimcmdline\r\nimd\r\nimdisable\r\nimi\r\niminsert\r\nims\r\nimsearch\r\ninc\r\ninclude\r\nincludeexpr\r\nincsearch\r\ninde\r\nindentexpr\r\nindentkeys\r\nindk\r\ninex\r\ninf\r\ninfercase\r\ninsertmode\r\nisf\r\nisfname\r\nisi\r\nisident\r\nisk\r\niskeyword\r\nisprint\r\njoinspaces\r\njs\r\nkey\r\nkeymap\r\nkeymodel\r\nkeywordprg\r\nkm\r\nkmp\r\nkp\r\nlangmap\r\nlangmenu\r\nlaststatus\r\nlazyredraw\r\nlbr\r\nlcs\r\nlinebreak\r\nlines\r\nlinespace\r\nlisp\r\nlispwords\r\nlistchars\r\nloadplugins\r\nlpl\r\nlsp\r\nlz\r\nmacatsui\r\nmagic\r\nmakeef\r\nmakeprg\r\nmatchpairs\r\nmatchtime\r\nmaxcombine\r\nmaxfuncdepth\r\nmaxmapdepth\r\nmaxmem\r\nmaxmempattern\r\nmaxmemtot\r\nmco\r\nmef\r\nmenuitems\r\nmfd\r\nmh\r\nmis\r\nmkspellmem\r\nml\r\nmls\r\nmm\r\nmmd\r\nmmp\r\nmmt\r\nmodeline\r\nmodelines\r\nmodifiable\r\nmodified\r\nmore\r\nmouse\r\nmousef\r\nmousefocus\r\nmousehide\r\nmousem\r\nmousemodel\r\nmouses\r\nmouseshape\r\nmouset\r\nmousetime\r\nmp\r\nmps\r\nmsm\r\nmzq\r\nmzquantum\r\nnf\r\nnrformats\r\nnumberwidth\r\nnuw\r\nodev\r\noft\r\nofu\r\nomnifunc\r\nopendevice\r\noperatorfunc\r\nopfunc\r\nosfiletype\r\npa\r\npara\r\nparagraphs\r\npaste\r\npastetoggle\r\npatchexpr\r\npatchmode\r\npath\r\npdev\r\npenc\r\npex\r\npexpr\r\npfn\r\nph\r\npheader\r\npi\r\npm\r\npmbcs\r\npmbfn\r\npopt\r\npreserveindent\r\npreviewheight\r\npreviewwindow\r\nprintdevice\r\nprintencoding\r\nprintexpr\r\nprintfont\r\nprintheader\r\nprintmbcharset\r\nprintmbfont\r\nprintoptions\r\nprompt\r\npt\r\npumheight\r\npvh\r\npvw\r\nqe\r\nquoteescape\r\nreadonly\r\nremap\r\nreport\r\nrestorescreen\r\nrevins\r\nrightleft\r\nrightleftcmd\r\nrl\r\nrlc\r\nro\r\nrs\r\nrtp\r\nruf\r\nruler\r\nrulerformat\r\nruntimepath\r\nsbo\r\nsc\r\nscb\r\nscr\r\nscroll\r\nscrollbind\r\nscrolljump\r\nscrolloff\r\nscrollopt\r\nscs\r\nsect\r\nsections\r\nsecure\r\nsel\r\nselection\r\nselectmode\r\nsessionoptions\r\nsft\r\nshcf\r\nshellcmdflag\r\nshellpipe\r\nshellquote\r\nshellredir\r\nshellslash\r\nshelltemp\r\nshelltype\r\nshellxquote\r\nshiftround\r\nshiftwidth\r\nshm\r\nshortmess\r\nshortname\r\nshowbreak\r\nshowcmd\r\nshowfulltag\r\nshowmatch\r\nshowmode\r\nshowtabline\r\nshq\r\nsi\r\nsidescroll\r\nsidescrolloff\r\nsiso\r\nsj\r\nslm\r\nsmartcase\r\nsmartindent\r\nsmarttab\r\nsmc\r\nsmd\r\nsofttabstop\r\nsol\r\nspc\r\nspell\r\nspellcapcheck\r\nspellfile\r\nspelllang\r\nspellsuggest\r\nspf\r\nspl\r\nsplitbelow\r\nsplitright\r\nsps\r\nsr\r\nsrr\r\nss\r\nssl\r\nssop\r\nstal\r\nstartofline\r\nstatusline\r\nstl\r\nstmp\r\nsu\r\nsua\r\nsuffixes\r\nsuffixesadd\r\nsw\r\nswapfile\r\nswapsync\r\nswb\r\nswf\r\nswitchbuf\r\nsws\r\nsxq\r\nsyn\r\nsynmaxcol\r\nsyntax\r\ntabline\r\ntabpagemax\r\ntabstop\r\ntagbsearch\r\ntaglength\r\ntagrelative\r\ntagstack\r\ntal\r\ntb\r\ntbi\r\ntbidi\r\ntbis\r\ntbs\r\ntenc\r\nterm\r\ntermbidi\r\ntermencoding\r\nterse\r\ntextauto\r\ntextmode\r\ntextwidth\r\ntgst\r\nthesaurus\r\ntildeop\r\ntimeout\r\ntimeoutlen\r\ntitle\r\ntitlelen\r\ntitleold\r\ntitlestring\r\ntoolbar\r\ntoolbariconsize\r\ntop\r\ntpm\r\ntsl\r\ntsr\r\nttimeout\r\nttimeoutlen\r\nttm\r\ntty\r\nttybuiltin\r\nttyfast\r\nttym\r\nttymouse\r\nttyscroll\r\nttytype\r\ntw\r\ntx\r\nuc\r\nul\r\nundolevels\r\nupdatecount\r\nupdatetime\r\nut\r\nvb\r\nvbs\r\nvdir\r\nverbosefile\r\nvfile\r\nviewdir\r\nviewoptions\r\nviminfo\r\nvirtualedit\r\nvisualbell\r\nvop\r\nwak\r\nwarn\r\nwb\r\nwc\r\nwcm\r\nwd\r\nweirdinvert\r\nwfh\r\nwfw\r\nwhichwrap\r\nwi\r\nwig\r\nwildchar\r\nwildcharm\r\nwildignore\r\nwildmenu\r\nwildmode\r\nwildoptions\r\nwim\r\nwinaltkeys\r\nwindow\r\nwinfixheight\r\nwinfixwidth\r\nwinheight\r\nwinminheight\r\nwinminwidth\r\nwinwidth\r\nwiv\r\nwiw\r\nwm\r\nwmh\r\nwmnu\r\nwmw\r\nwop\r\nwrap\r\nwrapmargin\r\nwrapscan\r\nwriteany\r\nwritebackup\r\nwritedelay\r\nww\r\nnoacd\r\nnoai\r\nnoakm\r\nnoallowrevins\r\nnoaltkeymap\r\nnoanti\r\nnoantialias\r\nnoar\r\nnoarab\r\nnoarabic\r\nnoarabicshape\r\nnoari\r\nnoarshape\r\nnoautochdir\r\nnoautoindent\r\nnoautoread\r\nnoautowrite\r\nnoautowriteall\r\nnoaw\r\nnoawa\r\nnobackup\r\nnoballooneval\r\nnobeval\r\nnobin\r\nnobinary\r\nnobiosk\r\nnobioskey\r\nnobk\r\nnobl\r\nnobomb\r\nnobuflisted\r\nnocf\r\nnoci\r\nnocin\r\nnocindent\r\nnocompatible\r\nnoconfirm\r\nnoconsk\r\nnoconskey\r\nnocopyindent\r\nnocp\r\nnocscopetag\r\nnocscopeverbose\r\nnocst\r\nnocsverb\r\nnocuc\r\nnocul\r\nnocursorcolumn\r\nnocursorline\r\nnodeco\r\nnodelcombine\r\nnodg\r\nnodiff\r\nnodigraph\r\nnodisable\r\nnoea\r\nnoeb\r\nnoed\r\nnoedcompatible\r\nnoek\r\nnoendofline\r\nnoeol\r\nnoequalalways\r\nnoerrorbells\r\nnoesckeys\r\nnoet\r\nnoex\r\nnoexpandtab\r\nnoexrc\r\nnofen\r\nnofk\r\nnofkmap\r\nnofoldenable\r\nnogd\r\nnogdefault\r\nnoguipty\r\nnohid\r\nnohidden\r\nnohk\r\nnohkmap\r\nnohkmapp\r\nnohkp\r\nnohls\r\nnoic\r\nnoicon\r\nnoignorecase\r\nnoim\r\nnoimc\r\nnoimcmdline\r\nnoimd\r\nnoincsearch\r\nnoinf\r\nnoinfercase\r\nnoinsertmode\r\nnois\r\nnojoinspaces\r\nnojs\r\nnolazyredraw\r\nnolbr\r\nnolinebreak\r\nnolisp\r\nnolist\r\nnoloadplugins\r\nnolpl\r\nnolz\r\nnoma\r\nnomacatsui\r\nnomagic\r\nnomh\r\nnoml\r\nnomod\r\nnomodeline\r\nnomodifiable\r\nnomodified\r\nnomore\r\nnomousef\r\nnomousefocus\r\nnomousehide\r\nnonu\r\nnonumber\r\nnoodev\r\nnoopendevice\r\nnopaste\r\nnopi\r\nnopreserveindent\r\nnopreviewwindow\r\nnoprompt\r\nnopvw\r\nnoreadonly\r\nnoremap\r\nnorestorescreen\r\nnorevins\r\nnori\r\nnorightleft\r\nnorightleftcmd\r\nnorl\r\nnorlc\r\nnoro\r\nnors\r\nnoru\r\nnoruler\r\nnosb\r\nnosc\r\nnoscb\r\nnoscrollbind\r\nnoscs\r\nnosecure\r\nnosft\r\nnoshellslash\r\nnoshelltemp\r\nnoshiftround\r\nnoshortname\r\nnoshowcmd\r\nnoshowfulltag\r\nnoshowmatch\r\nnoshowmode\r\nnosi\r\nnosm\r\nnosmartcase\r\nnosmartindent\r\nnosmarttab\r\nnosmd\r\nnosn\r\nnosol\r\nnospell\r\nnosplitbelow\r\nnosplitright\r\nnospr\r\nnosr\r\nnossl\r\nnosta\r\nnostartofline\r\nnostmp\r\nnoswapfile\r\nnoswf\r\nnota\r\nnotagbsearch\r\nnotagrelative\r\nnotagstack\r\nnotbi\r\nnotbidi\r\nnotbs\r\nnotermbidi\r\nnoterse\r\nnotextauto\r\nnotextmode\r\nnotf\r\nnotgst\r\nnotildeop\r\nnotimeout\r\nnotitle\r\nnoto\r\nnotop\r\nnotr\r\nnottimeout\r\nnottybuiltin\r\nnottyfast\r\nnotx\r\nnovb\r\nnovisualbell\r\nnowa\r\nnowarn\r\nnowb\r\nnoweirdinvert\r\nnowfh\r\nnowfw\r\nnowildmenu\r\nnowinfixheight\r\nnowinfixwidth\r\nnowiv\r\nnowmnu\r\nnowrap\r\nnowrapscan\r\nnowrite\r\nnowriteany\r\nnowritebackup\r\nnows\r\ninvacd\r\ninvai\r\ninvakm\r\ninvallowrevins\r\ninvaltkeymap\r\ninvanti\r\ninvantialias\r\ninvar\r\ninvarab\r\ninvarabic\r\ninvarabicshape\r\ninvari\r\ninvarshape\r\ninvautochdir\r\ninvautoindent\r\ninvautoread\r\ninvautowrite\r\ninvautowriteall\r\ninvaw\r\ninvawa\r\ninvbackup\r\ninvballooneval\r\ninvbeval\r\ninvbin\r\ninvbinary\r\ninvbiosk\r\ninvbioskey\r\ninvbk\r\ninvbl\r\ninvbomb\r\ninvbuflisted\r\ninvcf\r\ninvci\r\ninvcin\r\ninvcindent\r\ninvcompatible\r\ninvconfirm\r\ninvconsk\r\ninvconskey\r\ninvcopyindent\r\ninvcp\r\ninvcscopetag\r\ninvcscopeverbose\r\ninvcst\r\ninvcsverb\r\ninvcuc\r\ninvcul\r\ninvcursorcolumn\r\ninvcursorline\r\ninvdeco\r\ninvdelcombine\r\ninvdg\r\ninvdiff\r\ninvdigraph\r\ninvdisable\r\ninvea\r\ninveb\r\ninved\r\ninvedcompatible\r\ninvek\r\ninvendofline\r\ninveol\r\ninvequalalways\r\ninverrorbells\r\ninvesckeys\r\ninvet\r\ninvex\r\ninvexpandtab\r\ninvexrc\r\ninvfen\r\ninvfk\r\ninvfkmap\r\ninvfoldenable\r\ninvgd\r\ninvgdefault\r\ninvguipty\r\ninvhid\r\ninvhidden\r\ninvhk\r\ninvhkmap\r\ninvhkmapp\r\ninvhkp\r\ninvhls\r\ninvhlsearch\r\ninvic\r\ninvicon\r\ninvignorecase\r\ninvim\r\ninvimc\r\ninvimcmdline\r\ninvimd\r\ninvincsearch\r\ninvinf\r\ninvinfercase\r\ninvinsertmode\r\ninvis\r\ninvjoinspaces\r\ninvjs\r\ninvlazyredraw\r\ninvlbr\r\ninvlinebreak\r\ninvlisp\r\ninvlist\r\ninvloadplugins\r\ninvlpl\r\ninvlz\r\ninvma\r\ninvmacatsui\r\ninvmagic\r\ninvmh\r\ninvml\r\ninvmod\r\ninvmodeline\r\ninvmodifiable\r\ninvmodified\r\ninvmore\r\ninvmousef\r\ninvmousefocus\r\ninvmousehide\r\ninvnu\r\ninvnumber\r\ninvodev\r\ninvopendevice\r\ninvpaste\r\ninvpi\r\ninvpreserveindent\r\ninvpreviewwindow\r\ninvprompt\r\ninvpvw\r\ninvreadonly\r\ninvremap\r\ninvrestorescreen\r\ninvrevins\r\ninvri\r\ninvrightleft\r\ninvrightleftcmd\r\ninvrl\r\ninvrlc\r\ninvro\r\ninvrs\r\ninvru\r\ninvruler\r\ninvsb\r\ninvsc\r\ninvscb\r\ninvscrollbind\r\ninvscs\r\ninvsecure\r\ninvsft\r\ninvshellslash\r\ninvshelltemp\r\ninvshiftround\r\ninvshortname\r\ninvshowcmd\r\ninvshowfulltag\r\ninvshowmatch\r\ninvshowmode\r\ninvsi\r\ninvsm\r\ninvsmartcase\r\ninvsmartindent\r\ninvsmarttab\r\ninvsmd\r\ninvsn\r\ninvsol\r\ninvspell\r\ninvsplitbelow\r\ninvsplitright\r\ninvspr\r\ninvsr\r\ninvssl\r\ninvsta\r\ninvstartofline\r\ninvstmp\r\ninvswapfile\r\ninvswf\r\ninvta\r\ninvtagbsearch\r\ninvtagrelative\r\ninvtagstack\r\ninvtbi\r\ninvtbidi\r\ninvtbs\r\ninvtermbidi\r\ninvterse\r\ninvtextauto\r\ninvtextmode\r\ninvtf\r\ninvtgst\r\ninvtildeop\r\ninvtimeout\r\ninvtitle\r\ninvto\r\ninvtop\r\ninvtr\r\ninvttimeout\r\ninvttybuiltin\r\ninvttyfast\r\ninvtx\r\ninvvb\r\ninvvisualbell\r\ninvwa\r\ninvwarn\r\ninvwb\r\ninvweirdinvert\r\ninvwfh\r\ninvwfw\r\ninvwildmenu\r\ninvwinfixheight\r\ninvwinfixwidth\r\ninvwiv\r\ninvwmnu\r\ninvwrap\r\ninvwrapscan\r\ninvwrite\r\ninvwriteany\r\ninvwritebackup\r\ninvws\r\nt_AB\r\nt_AF\r\nt_al\r\nt_AL\r\nt_bc\r\nt_cd\r\nt_ce\r\nt_Ce\r\nt_cl\r\nt_cm\r\nt_Co\r\nt_cs\r\nt_Cs\r\nt_CS\r\nt_CV\r\nt_da\r\nt_db\r\nt_dl\r\nt_DL\r\nt_EI\r\nt_F1\r\nt_F2\r\nt_F3\r\nt_F4\r\nt_F5\r\nt_F6\r\nt_F7\r\nt_F8\r\nt_F9\r\nt_fs\r\nt_IE\r\nt_IS\r\nt_k1\r\nt_K1\r\nt_k2\r\nt_k3\r\nt_K3\r\nt_k4\r\nt_K4\r\nt_k5\r\nt_K5\r\nt_k6\r\nt_K6\r\nt_k7\r\nt_K7\r\nt_k8\r\nt_K8\r\nt_k9\r\nt_K9\r\nt_KA\r\nt_kb\r\nt_kB\r\nt_KB\r\nt_KC\r\nt_kd\r\nt_kD\r\nt_KD\r\nt_ke\r\nt_KE\r\nt_KF\r\nt_KG\r\nt_kh\r\nt_KH\r\nt_kI\r\nt_KI\r\nt_KJ\r\nt_KK\r\nt_kl\r\nt_KL\r\nt_kN\r\nt_kP\r\nt_kr\r\nt_ks\r\nt_ku\r\nt_le\r\nt_mb\r\nt_md\r\nt_me\r\nt_mr\r\nt_ms\r\nt_nd\r\nt_op\r\nt_RI\r\nt_RV\r\nt_Sb\r\nt_se\r\nt_Sf\r\nt_SI\r\nt_so\r\nt_sr\r\nt_te\r\nt_ti\r\nt_ts\r\nt_ue\r\nt_us\r\nt_ut\r\nt_vb\r\nt_ve\r\nt_vi\r\nt_vs\r\nt_WP\r\nt_WS\r\nt_xs\r\nt_ZH\r\nt_ZR\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"autocmd\"],\r\n\t[\"builtin\", \"acd\"],\r\n\t[\"builtin\", \"ai\"],\r\n\t[\"builtin\", \"akm\"],\r\n\t[\"builtin\", \"aleph\"],\r\n\t[\"builtin\", \"allowrevins\"],\r\n\t[\"builtin\", \"altkeymap\"],\r\n\t[\"builtin\", \"ambiwidth\"],\r\n\t[\"builtin\", \"ambw\"],\r\n\t[\"builtin\", \"anti\"],\r\n\t[\"builtin\", \"antialias\"],\r\n\t[\"builtin\", \"arab\"],\r\n\t[\"builtin\", \"arabic\"],\r\n\t[\"builtin\", \"arabicshape\"],\r\n\t[\"builtin\", \"ari\"],\r\n\t[\"builtin\", \"arshape\"],\r\n\t[\"builtin\", \"autochdir\"],\r\n\t[\"builtin\", \"autoindent\"],\r\n\t[\"builtin\", \"autoread\"],\r\n\t[\"builtin\", \"autowrite\"],\r\n\t[\"builtin\", \"autowriteall\"],\r\n\t[\"builtin\", \"aw\"],\r\n\t[\"builtin\", \"awa\"],\r\n\t[\"builtin\", \"background\"],\r\n\t[\"builtin\", \"backspace\"],\r\n\t[\"builtin\", \"backup\"],\r\n\t[\"builtin\", \"backupcopy\"],\r\n\t[\"builtin\", \"backupdir\"],\r\n\t[\"builtin\", \"backupext\"],\r\n\t[\"builtin\", \"backupskip\"],\r\n\t[\"builtin\", \"balloondelay\"],\r\n\t[\"builtin\", \"ballooneval\"],\r\n\t[\"builtin\", \"balloonexpr\"],\r\n\t[\"builtin\", \"bdir\"],\r\n\t[\"builtin\", \"bdlay\"],\r\n\t[\"builtin\", \"beval\"],\r\n\t[\"builtin\", \"bex\"],\r\n\t[\"builtin\", \"bexpr\"],\r\n\t[\"builtin\", \"bg\"],\r\n\t[\"builtin\", \"bh\"],\r\n\t[\"builtin\", \"bin\"],\r\n\t[\"builtin\", \"binary\"],\r\n\t[\"builtin\", \"biosk\"],\r\n\t[\"builtin\", \"bioskey\"],\r\n\t[\"builtin\", \"bk\"],\r\n\t[\"builtin\", \"bkc\"],\r\n\t[\"builtin\", \"bomb\"],\r\n\t[\"builtin\", \"breakat\"],\r\n\t[\"builtin\", \"brk\"],\r\n\t[\"builtin\", \"browsedir\"],\r\n\t[\"builtin\", \"bs\"],\r\n\t[\"builtin\", \"bsdir\"],\r\n\t[\"builtin\", \"bsk\"],\r\n\t[\"builtin\", \"bt\"],\r\n\t[\"builtin\", \"bufhidden\"],\r\n\t[\"builtin\", \"buflisted\"],\r\n\t[\"builtin\", \"buftype\"],\r\n\t[\"builtin\", \"casemap\"],\r\n\t[\"builtin\", \"ccv\"],\r\n\t[\"builtin\", \"cdpath\"],\r\n\t[\"builtin\", \"cedit\"],\r\n\t[\"builtin\", \"cfu\"],\r\n\t[\"builtin\", \"ch\"],\r\n\t[\"builtin\", \"charconvert\"],\r\n\t[\"builtin\", \"ci\"],\r\n\t[\"builtin\", \"cin\"],\r\n\t[\"builtin\", \"cindent\"],\r\n\t[\"builtin\", \"cink\"],\r\n\t[\"builtin\", \"cinkeys\"],\r\n\t[\"builtin\", \"cino\"],\r\n\t[\"builtin\", \"cinoptions\"],\r\n\t[\"builtin\", \"cinw\"],\r\n\t[\"builtin\", \"cinwords\"],\r\n\t[\"builtin\", \"clipboard\"],\r\n\t[\"builtin\", \"cmdheight\"],\r\n\t[\"builtin\", \"cmdwinheight\"],\r\n\t[\"builtin\", \"cmp\"],\r\n\t[\"builtin\", \"cms\"],\r\n\t[\"builtin\", \"columns\"],\r\n\t[\"builtin\", \"com\"],\r\n\t[\"builtin\", \"comments\"],\r\n\t[\"builtin\", \"commentstring\"],\r\n\t[\"builtin\", \"compatible\"],\r\n\t[\"builtin\", \"complete\"],\r\n\t[\"builtin\", \"completefunc\"],\r\n\t[\"builtin\", \"completeopt\"],\r\n\t[\"builtin\", \"consk\"],\r\n\t[\"builtin\", \"conskey\"],\r\n\t[\"builtin\", \"copyindent\"],\r\n\t[\"builtin\", \"cot\"],\r\n\t[\"builtin\", \"cpo\"],\r\n\t[\"builtin\", \"cpoptions\"],\r\n\t[\"builtin\", \"cpt\"],\r\n\t[\"builtin\", \"cscopepathcomp\"],\r\n\t[\"builtin\", \"cscopeprg\"],\r\n\t[\"builtin\", \"cscopequickfix\"],\r\n\t[\"builtin\", \"cscopetag\"],\r\n\t[\"builtin\", \"cscopetagorder\"],\r\n\t[\"builtin\", \"cscopeverbose\"],\r\n\t[\"builtin\", \"cspc\"],\r\n\t[\"builtin\", \"csprg\"],\r\n\t[\"builtin\", \"csqf\"],\r\n\t[\"builtin\", \"cst\"],\r\n\t[\"builtin\", \"csto\"],\r\n\t[\"builtin\", \"csverb\"],\r\n\t[\"builtin\", \"cuc\"],\r\n\t[\"builtin\", \"cul\"],\r\n\t[\"builtin\", \"cursorcolumn\"],\r\n\t[\"builtin\", \"cursorline\"],\r\n\t[\"builtin\", \"cwh\"],\r\n\t[\"builtin\", \"debug\"],\r\n\t[\"builtin\", \"deco\"],\r\n\t[\"builtin\", \"def\"],\r\n\t[\"builtin\", \"define\"],\r\n\t[\"builtin\", \"delcombine\"],\r\n\t[\"builtin\", \"dex\"],\r\n\t[\"builtin\", \"dg\"],\r\n\t[\"builtin\", \"dict\"],\r\n\t[\"builtin\", \"dictionary\"],\r\n\t[\"builtin\", \"diff\"],\r\n\t[\"builtin\", \"diffexpr\"],\r\n\t[\"builtin\", \"diffopt\"],\r\n\t[\"builtin\", \"digraph\"],\r\n\t[\"builtin\", \"dip\"],\r\n\t[\"builtin\", \"dir\"],\r\n\t[\"builtin\", \"directory\"],\r\n\t[\"builtin\", \"dy\"],\r\n\t[\"builtin\", \"ea\"],\r\n\t[\"builtin\", \"ead\"],\r\n\t[\"builtin\", \"eadirection\"],\r\n\t[\"builtin\", \"eb\"],\r\n\t[\"builtin\", \"ed\"],\r\n\t[\"builtin\", \"edcompatible\"],\r\n\t[\"builtin\", \"ef\"],\r\n\t[\"builtin\", \"efm\"],\r\n\t[\"builtin\", \"ei\"],\r\n\t[\"builtin\", \"ek\"],\r\n\t[\"builtin\", \"enc\"],\r\n\t[\"builtin\", \"encoding\"],\r\n\t[\"builtin\", \"endofline\"],\r\n\t[\"builtin\", \"eol\"],\r\n\t[\"builtin\", \"ep\"],\r\n\t[\"builtin\", \"equalalways\"],\r\n\t[\"builtin\", \"equalprg\"],\r\n\t[\"builtin\", \"errorbells\"],\r\n\t[\"builtin\", \"errorfile\"],\r\n\t[\"builtin\", \"errorformat\"],\r\n\t[\"builtin\", \"esckeys\"],\r\n\t[\"builtin\", \"et\"],\r\n\t[\"builtin\", \"eventignore\"],\r\n\t[\"builtin\", \"expandtab\"],\r\n\t[\"builtin\", \"exrc\"],\r\n\t[\"builtin\", \"fcl\"],\r\n\t[\"builtin\", \"fcs\"],\r\n\t[\"builtin\", \"fdc\"],\r\n\t[\"builtin\", \"fde\"],\r\n\t[\"builtin\", \"fdi\"],\r\n\t[\"builtin\", \"fdl\"],\r\n\t[\"builtin\", \"fdls\"],\r\n\t[\"builtin\", \"fdm\"],\r\n\t[\"builtin\", \"fdn\"],\r\n\t[\"builtin\", \"fdo\"],\r\n\t[\"builtin\", \"fdt\"],\r\n\t[\"builtin\", \"fen\"],\r\n\t[\"builtin\", \"fenc\"],\r\n\t[\"builtin\", \"fencs\"],\r\n\t[\"builtin\", \"fex\"],\r\n\t[\"builtin\", \"ff\"],\r\n\t[\"builtin\", \"ffs\"],\r\n\t[\"builtin\", \"fileencoding\"],\r\n\t[\"builtin\", \"fileencodings\"],\r\n\t[\"builtin\", \"fileformat\"],\r\n\t[\"builtin\", \"fileformats\"],\r\n\t[\"builtin\", \"fillchars\"],\r\n\t[\"builtin\", \"fk\"],\r\n\t[\"builtin\", \"fkmap\"],\r\n\t[\"builtin\", \"flp\"],\r\n\t[\"builtin\", \"fml\"],\r\n\t[\"builtin\", \"fmr\"],\r\n\t[\"builtin\", \"foldcolumn\"],\r\n\t[\"builtin\", \"foldenable\"],\r\n\t[\"builtin\", \"foldexpr\"],\r\n\t[\"builtin\", \"foldignore\"],\r\n\t[\"builtin\", \"foldlevel\"],\r\n\t[\"builtin\", \"foldlevelstart\"],\r\n\t[\"builtin\", \"foldmarker\"],\r\n\t[\"builtin\", \"foldmethod\"],\r\n\t[\"builtin\", \"foldminlines\"],\r\n\t[\"builtin\", \"foldnestmax\"],\r\n\t[\"builtin\", \"foldtext\"],\r\n\t[\"builtin\", \"formatexpr\"],\r\n\t[\"builtin\", \"formatlistpat\"],\r\n\t[\"builtin\", \"formatoptions\"],\r\n\t[\"builtin\", \"formatprg\"],\r\n\t[\"builtin\", \"fp\"],\r\n\t[\"builtin\", \"fs\"],\r\n\t[\"builtin\", \"fsync\"],\r\n\t[\"builtin\", \"ft\"],\r\n\t[\"builtin\", \"gcr\"],\r\n\t[\"builtin\", \"gd\"],\r\n\t[\"builtin\", \"gdefault\"],\r\n\t[\"builtin\", \"gfm\"],\r\n\t[\"builtin\", \"gfn\"],\r\n\t[\"builtin\", \"gfs\"],\r\n\t[\"builtin\", \"gfw\"],\r\n\t[\"builtin\", \"ghr\"],\r\n\t[\"builtin\", \"gp\"],\r\n\t[\"builtin\", \"grepformat\"],\r\n\t[\"builtin\", \"grepprg\"],\r\n\t[\"builtin\", \"gtl\"],\r\n\t[\"builtin\", \"gtt\"],\r\n\t[\"builtin\", \"guicursor\"],\r\n\t[\"builtin\", \"guifont\"],\r\n\t[\"builtin\", \"guifontset\"],\r\n\t[\"builtin\", \"guifontwide\"],\r\n\t[\"builtin\", \"guiheadroom\"],\r\n\t[\"builtin\", \"guioptions\"],\r\n\t[\"builtin\", \"guipty\"],\r\n\t[\"builtin\", \"guitablabel\"],\r\n\t[\"builtin\", \"guitabtooltip\"],\r\n\t[\"builtin\", \"helpfile\"],\r\n\t[\"builtin\", \"helpheight\"],\r\n\t[\"builtin\", \"helplang\"],\r\n\t[\"builtin\", \"hf\"],\r\n\t[\"builtin\", \"hh\"],\r\n\t[\"builtin\", \"hi\"],\r\n\t[\"builtin\", \"hidden\"],\r\n\t[\"builtin\", \"highlight\"],\r\n\t[\"builtin\", \"hk\"],\r\n\t[\"builtin\", \"hkmap\"],\r\n\t[\"builtin\", \"hkmapp\"],\r\n\t[\"builtin\", \"hkp\"],\r\n\t[\"builtin\", \"hl\"],\r\n\t[\"builtin\", \"hlg\"],\r\n\t[\"builtin\", \"hls\"],\r\n\t[\"builtin\", \"hlsearch\"],\r\n\t[\"builtin\", \"ic\"],\r\n\t[\"builtin\", \"icon\"],\r\n\t[\"builtin\", \"iconstring\"],\r\n\t[\"builtin\", \"ignorecase\"],\r\n\t[\"builtin\", \"im\"],\r\n\t[\"builtin\", \"imactivatekey\"],\r\n\t[\"builtin\", \"imak\"],\r\n\t[\"builtin\", \"imc\"],\r\n\t[\"builtin\", \"imcmdline\"],\r\n\t[\"builtin\", \"imd\"],\r\n\t[\"builtin\", \"imdisable\"],\r\n\t[\"builtin\", \"imi\"],\r\n\t[\"builtin\", \"iminsert\"],\r\n\t[\"builtin\", \"ims\"],\r\n\t[\"builtin\", \"imsearch\"],\r\n\t[\"builtin\", \"inc\"],\r\n\t[\"builtin\", \"include\"],\r\n\t[\"builtin\", \"includeexpr\"],\r\n\t[\"builtin\", \"incsearch\"],\r\n\t[\"builtin\", \"inde\"],\r\n\t[\"builtin\", \"indentexpr\"],\r\n\t[\"builtin\", \"indentkeys\"],\r\n\t[\"builtin\", \"indk\"],\r\n\t[\"builtin\", \"inex\"],\r\n\t[\"builtin\", \"inf\"],\r\n\t[\"builtin\", \"infercase\"],\r\n\t[\"builtin\", \"insertmode\"],\r\n\t[\"builtin\", \"isf\"],\r\n\t[\"builtin\", \"isfname\"],\r\n\t[\"builtin\", \"isi\"],\r\n\t[\"builtin\", \"isident\"],\r\n\t[\"builtin\", \"isk\"],\r\n\t[\"builtin\", \"iskeyword\"],\r\n\t[\"builtin\", \"isprint\"],\r\n\t[\"builtin\", \"joinspaces\"],\r\n\t[\"builtin\", \"js\"],\r\n\t[\"builtin\", \"key\"],\r\n\t[\"builtin\", \"keymap\"],\r\n\t[\"builtin\", \"keymodel\"],\r\n\t[\"builtin\", \"keywordprg\"],\r\n\t[\"builtin\", \"km\"],\r\n\t[\"builtin\", \"kmp\"],\r\n\t[\"builtin\", \"kp\"],\r\n\t[\"builtin\", \"langmap\"],\r\n\t[\"builtin\", \"langmenu\"],\r\n\t[\"builtin\", \"laststatus\"],\r\n\t[\"builtin\", \"lazyredraw\"],\r\n\t[\"builtin\", \"lbr\"],\r\n\t[\"builtin\", \"lcs\"],\r\n\t[\"builtin\", \"linebreak\"],\r\n\t[\"builtin\", \"lines\"],\r\n\t[\"builtin\", \"linespace\"],\r\n\t[\"builtin\", \"lisp\"],\r\n\t[\"builtin\", \"lispwords\"],\r\n\t[\"builtin\", \"listchars\"],\r\n\t[\"builtin\", \"loadplugins\"],\r\n\t[\"builtin\", \"lpl\"],\r\n\t[\"builtin\", \"lsp\"],\r\n\t[\"builtin\", \"lz\"],\r\n\t[\"builtin\", \"macatsui\"],\r\n\t[\"builtin\", \"magic\"],\r\n\t[\"builtin\", \"makeef\"],\r\n\t[\"builtin\", \"makeprg\"],\r\n\t[\"builtin\", \"matchpairs\"],\r\n\t[\"builtin\", \"matchtime\"],\r\n\t[\"builtin\", \"maxcombine\"],\r\n\t[\"builtin\", \"maxfuncdepth\"],\r\n\t[\"builtin\", \"maxmapdepth\"],\r\n\t[\"builtin\", \"maxmem\"],\r\n\t[\"builtin\", \"maxmempattern\"],\r\n\t[\"builtin\", \"maxmemtot\"],\r\n\t[\"builtin\", \"mco\"],\r\n\t[\"builtin\", \"mef\"],\r\n\t[\"builtin\", \"menuitems\"],\r\n\t[\"builtin\", \"mfd\"],\r\n\t[\"builtin\", \"mh\"],\r\n\t[\"builtin\", \"mis\"],\r\n\t[\"builtin\", \"mkspellmem\"],\r\n\t[\"builtin\", \"ml\"],\r\n\t[\"builtin\", \"mls\"],\r\n\t[\"builtin\", \"mm\"],\r\n\t[\"builtin\", \"mmd\"],\r\n\t[\"builtin\", \"mmp\"],\r\n\t[\"builtin\", \"mmt\"],\r\n\t[\"builtin\", \"modeline\"],\r\n\t[\"builtin\", \"modelines\"],\r\n\t[\"builtin\", \"modifiable\"],\r\n\t[\"builtin\", \"modified\"],\r\n\t[\"builtin\", \"more\"],\r\n\t[\"builtin\", \"mouse\"],\r\n\t[\"builtin\", \"mousef\"],\r\n\t[\"builtin\", \"mousefocus\"],\r\n\t[\"builtin\", \"mousehide\"],\r\n\t[\"builtin\", \"mousem\"],\r\n\t[\"builtin\", \"mousemodel\"],\r\n\t[\"builtin\", \"mouses\"],\r\n\t[\"builtin\", \"mouseshape\"],\r\n\t[\"builtin\", \"mouset\"],\r\n\t[\"builtin\", \"mousetime\"],\r\n\t[\"builtin\", \"mp\"],\r\n\t[\"builtin\", \"mps\"],\r\n\t[\"builtin\", \"msm\"],\r\n\t[\"builtin\", \"mzq\"],\r\n\t[\"builtin\", \"mzquantum\"],\r\n\t[\"builtin\", \"nf\"],\r\n\t[\"builtin\", \"nrformats\"],\r\n\t[\"builtin\", \"numberwidth\"],\r\n\t[\"builtin\", \"nuw\"],\r\n\t[\"builtin\", \"odev\"],\r\n\t[\"builtin\", \"oft\"],\r\n\t[\"builtin\", \"ofu\"],\r\n\t[\"builtin\", \"omnifunc\"],\r\n\t[\"builtin\", \"opendevice\"],\r\n\t[\"builtin\", \"operatorfunc\"],\r\n\t[\"builtin\", \"opfunc\"],\r\n\t[\"builtin\", \"osfiletype\"],\r\n\t[\"builtin\", \"pa\"],\r\n\t[\"builtin\", \"para\"],\r\n\t[\"builtin\", \"paragraphs\"],\r\n\t[\"builtin\", \"paste\"],\r\n\t[\"builtin\", \"pastetoggle\"],\r\n\t[\"builtin\", \"patchexpr\"],\r\n\t[\"builtin\", \"patchmode\"],\r\n\t[\"builtin\", \"path\"],\r\n\t[\"builtin\", \"pdev\"],\r\n\t[\"builtin\", \"penc\"],\r\n\t[\"builtin\", \"pex\"],\r\n\t[\"builtin\", \"pexpr\"],\r\n\t[\"builtin\", \"pfn\"],\r\n\t[\"builtin\", \"ph\"],\r\n\t[\"builtin\", \"pheader\"],\r\n\t[\"builtin\", \"pi\"],\r\n\t[\"builtin\", \"pm\"],\r\n\t[\"builtin\", \"pmbcs\"],\r\n\t[\"builtin\", \"pmbfn\"],\r\n\t[\"builtin\", \"popt\"],\r\n\t[\"builtin\", \"preserveindent\"],\r\n\t[\"builtin\", \"previewheight\"],\r\n\t[\"builtin\", \"previewwindow\"],\r\n\t[\"builtin\", \"printdevice\"],\r\n\t[\"builtin\", \"printencoding\"],\r\n\t[\"builtin\", \"printexpr\"],\r\n\t[\"builtin\", \"printfont\"],\r\n\t[\"builtin\", \"printheader\"],\r\n\t[\"builtin\", \"printmbcharset\"],\r\n\t[\"builtin\", \"printmbfont\"],\r\n\t[\"builtin\", \"printoptions\"],\r\n\t[\"builtin\", \"prompt\"],\r\n\t[\"builtin\", \"pt\"],\r\n\t[\"builtin\", \"pumheight\"],\r\n\t[\"builtin\", \"pvh\"],\r\n\t[\"builtin\", \"pvw\"],\r\n\t[\"builtin\", \"qe\"],\r\n\t[\"builtin\", \"quoteescape\"],\r\n\t[\"builtin\", \"readonly\"],\r\n\t[\"builtin\", \"remap\"],\r\n\t[\"builtin\", \"report\"],\r\n\t[\"builtin\", \"restorescreen\"],\r\n\t[\"builtin\", \"revins\"],\r\n\t[\"builtin\", \"rightleft\"],\r\n\t[\"builtin\", \"rightleftcmd\"],\r\n\t[\"builtin\", \"rl\"],\r\n\t[\"builtin\", \"rlc\"],\r\n\t[\"builtin\", \"ro\"],\r\n\t[\"builtin\", \"rs\"],\r\n\t[\"builtin\", \"rtp\"],\r\n\t[\"builtin\", \"ruf\"],\r\n\t[\"builtin\", \"ruler\"],\r\n\t[\"builtin\", \"rulerformat\"],\r\n\t[\"builtin\", \"runtimepath\"],\r\n\t[\"builtin\", \"sbo\"],\r\n\t[\"builtin\", \"sc\"],\r\n\t[\"builtin\", \"scb\"],\r\n\t[\"builtin\", \"scr\"],\r\n\t[\"builtin\", \"scroll\"],\r\n\t[\"builtin\", \"scrollbind\"],\r\n\t[\"builtin\", \"scrolljump\"],\r\n\t[\"builtin\", \"scrolloff\"],\r\n\t[\"builtin\", \"scrollopt\"],\r\n\t[\"builtin\", \"scs\"],\r\n\t[\"builtin\", \"sect\"],\r\n\t[\"builtin\", \"sections\"],\r\n\t[\"builtin\", \"secure\"],\r\n\t[\"builtin\", \"sel\"],\r\n\t[\"builtin\", \"selection\"],\r\n\t[\"builtin\", \"selectmode\"],\r\n\t[\"builtin\", \"sessionoptions\"],\r\n\t[\"builtin\", \"sft\"],\r\n\t[\"builtin\", \"shcf\"],\r\n\t[\"builtin\", \"shellcmdflag\"],\r\n\t[\"builtin\", \"shellpipe\"],\r\n\t[\"builtin\", \"shellquote\"],\r\n\t[\"builtin\", \"shellredir\"],\r\n\t[\"builtin\", \"shellslash\"],\r\n\t[\"builtin\", \"shelltemp\"],\r\n\t[\"builtin\", \"shelltype\"],\r\n\t[\"builtin\", \"shellxquote\"],\r\n\t[\"builtin\", \"shiftround\"],\r\n\t[\"builtin\", \"shiftwidth\"],\r\n\t[\"builtin\", \"shm\"],\r\n\t[\"builtin\", \"shortmess\"],\r\n\t[\"builtin\", \"shortname\"],\r\n\t[\"builtin\", \"showbreak\"],\r\n\t[\"builtin\", \"showcmd\"],\r\n\t[\"builtin\", \"showfulltag\"],\r\n\t[\"builtin\", \"showmatch\"],\r\n\t[\"builtin\", \"showmode\"],\r\n\t[\"builtin\", \"showtabline\"],\r\n\t[\"builtin\", \"shq\"],\r\n\t[\"builtin\", \"si\"],\r\n\t[\"builtin\", \"sidescroll\"],\r\n\t[\"builtin\", \"sidescrolloff\"],\r\n\t[\"builtin\", \"siso\"],\r\n\t[\"builtin\", \"sj\"],\r\n\t[\"builtin\", \"slm\"],\r\n\t[\"builtin\", \"smartcase\"],\r\n\t[\"builtin\", \"smartindent\"],\r\n\t[\"builtin\", \"smarttab\"],\r\n\t[\"builtin\", \"smc\"],\r\n\t[\"builtin\", \"smd\"],\r\n\t[\"builtin\", \"softtabstop\"],\r\n\t[\"builtin\", \"sol\"],\r\n\t[\"builtin\", \"spc\"],\r\n\t[\"builtin\", \"spell\"],\r\n\t[\"builtin\", \"spellcapcheck\"],\r\n\t[\"builtin\", \"spellfile\"],\r\n\t[\"builtin\", \"spelllang\"],\r\n\t[\"builtin\", \"spellsuggest\"],\r\n\t[\"builtin\", \"spf\"],\r\n\t[\"builtin\", \"spl\"],\r\n\t[\"builtin\", \"splitbelow\"],\r\n\t[\"builtin\", \"splitright\"],\r\n\t[\"builtin\", \"sps\"],\r\n\t[\"builtin\", \"sr\"],\r\n\t[\"builtin\", \"srr\"],\r\n\t[\"builtin\", \"ss\"],\r\n\t[\"builtin\", \"ssl\"],\r\n\t[\"builtin\", \"ssop\"],\r\n\t[\"builtin\", \"stal\"],\r\n\t[\"builtin\", \"startofline\"],\r\n\t[\"builtin\", \"statusline\"],\r\n\t[\"builtin\", \"stl\"],\r\n\t[\"builtin\", \"stmp\"],\r\n\t[\"builtin\", \"su\"],\r\n\t[\"builtin\", \"sua\"],\r\n\t[\"builtin\", \"suffixes\"],\r\n\t[\"builtin\", \"suffixesadd\"],\r\n\t[\"builtin\", \"sw\"],\r\n\t[\"builtin\", \"swapfile\"],\r\n\t[\"builtin\", \"swapsync\"],\r\n\t[\"builtin\", \"swb\"],\r\n\t[\"builtin\", \"swf\"],\r\n\t[\"builtin\", \"switchbuf\"],\r\n\t[\"builtin\", \"sws\"],\r\n\t[\"builtin\", \"sxq\"],\r\n\t[\"builtin\", \"syn\"],\r\n\t[\"builtin\", \"synmaxcol\"],\r\n\t[\"builtin\", \"syntax\"],\r\n\t[\"builtin\", \"tabline\"],\r\n\t[\"builtin\", \"tabpagemax\"],\r\n\t[\"builtin\", \"tabstop\"],\r\n\t[\"builtin\", \"tagbsearch\"],\r\n\t[\"builtin\", \"taglength\"],\r\n\t[\"builtin\", \"tagrelative\"],\r\n\t[\"builtin\", \"tagstack\"],\r\n\t[\"builtin\", \"tal\"],\r\n\t[\"builtin\", \"tb\"],\r\n\t[\"builtin\", \"tbi\"],\r\n\t[\"builtin\", \"tbidi\"],\r\n\t[\"builtin\", \"tbis\"],\r\n\t[\"builtin\", \"tbs\"],\r\n\t[\"builtin\", \"tenc\"],\r\n\t[\"builtin\", \"term\"],\r\n\t[\"builtin\", \"termbidi\"],\r\n\t[\"builtin\", \"termencoding\"],\r\n\t[\"builtin\", \"terse\"],\r\n\t[\"builtin\", \"textauto\"],\r\n\t[\"builtin\", \"textmode\"],\r\n\t[\"builtin\", \"textwidth\"],\r\n\t[\"builtin\", \"tgst\"],\r\n\t[\"builtin\", \"thesaurus\"],\r\n\t[\"builtin\", \"tildeop\"],\r\n\t[\"builtin\", \"timeout\"],\r\n\t[\"builtin\", \"timeoutlen\"],\r\n\t[\"builtin\", \"title\"],\r\n\t[\"builtin\", \"titlelen\"],\r\n\t[\"builtin\", \"titleold\"],\r\n\t[\"builtin\", \"titlestring\"],\r\n\t[\"builtin\", \"toolbar\"],\r\n\t[\"builtin\", \"toolbariconsize\"],\r\n\t[\"builtin\", \"top\"],\r\n\t[\"builtin\", \"tpm\"],\r\n\t[\"builtin\", \"tsl\"],\r\n\t[\"builtin\", \"tsr\"],\r\n\t[\"builtin\", \"ttimeout\"],\r\n\t[\"builtin\", \"ttimeoutlen\"],\r\n\t[\"builtin\", \"ttm\"],\r\n\t[\"builtin\", \"tty\"],\r\n\t[\"builtin\", \"ttybuiltin\"],\r\n\t[\"builtin\", \"ttyfast\"],\r\n\t[\"builtin\", \"ttym\"],\r\n\t[\"builtin\", \"ttymouse\"],\r\n\t[\"builtin\", \"ttyscroll\"],\r\n\t[\"builtin\", \"ttytype\"],\r\n\t[\"builtin\", \"tw\"],\r\n\t[\"builtin\", \"tx\"],\r\n\t[\"builtin\", \"uc\"],\r\n\t[\"builtin\", \"ul\"],\r\n\t[\"builtin\", \"undolevels\"],\r\n\t[\"builtin\", \"updatecount\"],\r\n\t[\"builtin\", \"updatetime\"],\r\n\t[\"builtin\", \"ut\"],\r\n\t[\"builtin\", \"vb\"],\r\n\t[\"builtin\", \"vbs\"],\r\n\t[\"builtin\", \"vdir\"],\r\n\t[\"builtin\", \"verbosefile\"],\r\n\t[\"builtin\", \"vfile\"],\r\n\t[\"builtin\", \"viewdir\"],\r\n\t[\"builtin\", \"viewoptions\"],\r\n\t[\"builtin\", \"viminfo\"],\r\n\t[\"builtin\", \"virtualedit\"],\r\n\t[\"builtin\", \"visualbell\"],\r\n\t[\"builtin\", \"vop\"],\r\n\t[\"builtin\", \"wak\"],\r\n\t[\"builtin\", \"warn\"],\r\n\t[\"builtin\", \"wb\"],\r\n\t[\"builtin\", \"wc\"],\r\n\t[\"builtin\", \"wcm\"],\r\n\t[\"builtin\", \"wd\"],\r\n\t[\"builtin\", \"weirdinvert\"],\r\n\t[\"builtin\", \"wfh\"],\r\n\t[\"builtin\", \"wfw\"],\r\n\t[\"builtin\", \"whichwrap\"],\r\n\t[\"builtin\", \"wi\"],\r\n\t[\"builtin\", \"wig\"],\r\n\t[\"builtin\", \"wildchar\"],\r\n\t[\"builtin\", \"wildcharm\"],\r\n\t[\"builtin\", \"wildignore\"],\r\n\t[\"builtin\", \"wildmenu\"],\r\n\t[\"builtin\", \"wildmode\"],\r\n\t[\"builtin\", \"wildoptions\"],\r\n\t[\"builtin\", \"wim\"],\r\n\t[\"builtin\", \"winaltkeys\"],\r\n\t[\"builtin\", \"window\"],\r\n\t[\"builtin\", \"winfixheight\"],\r\n\t[\"builtin\", \"winfixwidth\"],\r\n\t[\"builtin\", \"winheight\"],\r\n\t[\"builtin\", \"winminheight\"],\r\n\t[\"builtin\", \"winminwidth\"],\r\n\t[\"builtin\", \"winwidth\"],\r\n\t[\"builtin\", \"wiv\"],\r\n\t[\"builtin\", \"wiw\"],\r\n\t[\"builtin\", \"wm\"],\r\n\t[\"builtin\", \"wmh\"],\r\n\t[\"builtin\", \"wmnu\"],\r\n\t[\"builtin\", \"wmw\"],\r\n\t[\"builtin\", \"wop\"],\r\n\t[\"builtin\", \"wrap\"],\r\n\t[\"builtin\", \"wrapmargin\"],\r\n\t[\"builtin\", \"wrapscan\"],\r\n\t[\"builtin\", \"writeany\"],\r\n\t[\"builtin\", \"writebackup\"],\r\n\t[\"builtin\", \"writedelay\"],\r\n\t[\"builtin\", \"ww\"],\r\n\t[\"builtin\", \"noacd\"],\r\n\t[\"builtin\", \"noai\"],\r\n\t[\"builtin\", \"noakm\"],\r\n\t[\"builtin\", \"noallowrevins\"],\r\n\t[\"builtin\", \"noaltkeymap\"],\r\n\t[\"builtin\", \"noanti\"],\r\n\t[\"builtin\", \"noantialias\"],\r\n\t[\"builtin\", \"noar\"],\r\n\t[\"builtin\", \"noarab\"],\r\n\t[\"builtin\", \"noarabic\"],\r\n\t[\"builtin\", \"noarabicshape\"],\r\n\t[\"builtin\", \"noari\"],\r\n\t[\"builtin\", \"noarshape\"],\r\n\t[\"builtin\", \"noautochdir\"],\r\n\t[\"builtin\", \"noautoindent\"],\r\n\t[\"builtin\", \"noautoread\"],\r\n\t[\"builtin\", \"noautowrite\"],\r\n\t[\"builtin\", \"noautowriteall\"],\r\n\t[\"builtin\", \"noaw\"],\r\n\t[\"builtin\", \"noawa\"],\r\n\t[\"builtin\", \"nobackup\"],\r\n\t[\"builtin\", \"noballooneval\"],\r\n\t[\"builtin\", \"nobeval\"],\r\n\t[\"builtin\", \"nobin\"],\r\n\t[\"builtin\", \"nobinary\"],\r\n\t[\"builtin\", \"nobiosk\"],\r\n\t[\"builtin\", \"nobioskey\"],\r\n\t[\"builtin\", \"nobk\"],\r\n\t[\"builtin\", \"nobl\"],\r\n\t[\"builtin\", \"nobomb\"],\r\n\t[\"builtin\", \"nobuflisted\"],\r\n\t[\"builtin\", \"nocf\"],\r\n\t[\"builtin\", \"noci\"],\r\n\t[\"builtin\", \"nocin\"],\r\n\t[\"builtin\", \"nocindent\"],\r\n\t[\"builtin\", \"nocompatible\"],\r\n\t[\"builtin\", \"noconfirm\"],\r\n\t[\"builtin\", \"noconsk\"],\r\n\t[\"builtin\", \"noconskey\"],\r\n\t[\"builtin\", \"nocopyindent\"],\r\n\t[\"builtin\", \"nocp\"],\r\n\t[\"builtin\", \"nocscopetag\"],\r\n\t[\"builtin\", \"nocscopeverbose\"],\r\n\t[\"builtin\", \"nocst\"],\r\n\t[\"builtin\", \"nocsverb\"],\r\n\t[\"builtin\", \"nocuc\"],\r\n\t[\"builtin\", \"nocul\"],\r\n\t[\"builtin\", \"nocursorcolumn\"],\r\n\t[\"builtin\", \"nocursorline\"],\r\n\t[\"builtin\", \"nodeco\"],\r\n\t[\"builtin\", \"nodelcombine\"],\r\n\t[\"builtin\", \"nodg\"],\r\n\t[\"builtin\", \"nodiff\"],\r\n\t[\"builtin\", \"nodigraph\"],\r\n\t[\"builtin\", \"nodisable\"],\r\n\t[\"builtin\", \"noea\"],\r\n\t[\"builtin\", \"noeb\"],\r\n\t[\"builtin\", \"noed\"],\r\n\t[\"builtin\", \"noedcompatible\"],\r\n\t[\"builtin\", \"noek\"],\r\n\t[\"builtin\", \"noendofline\"],\r\n\t[\"builtin\", \"noeol\"],\r\n\t[\"builtin\", \"noequalalways\"],\r\n\t[\"builtin\", \"noerrorbells\"],\r\n\t[\"builtin\", \"noesckeys\"],\r\n\t[\"builtin\", \"noet\"],\r\n\t[\"builtin\", \"noex\"],\r\n\t[\"builtin\", \"noexpandtab\"],\r\n\t[\"builtin\", \"noexrc\"],\r\n\t[\"builtin\", \"nofen\"],\r\n\t[\"builtin\", \"nofk\"],\r\n\t[\"builtin\", \"nofkmap\"],\r\n\t[\"builtin\", \"nofoldenable\"],\r\n\t[\"builtin\", \"nogd\"],\r\n\t[\"builtin\", \"nogdefault\"],\r\n\t[\"builtin\", \"noguipty\"],\r\n\t[\"builtin\", \"nohid\"],\r\n\t[\"builtin\", \"nohidden\"],\r\n\t[\"builtin\", \"nohk\"],\r\n\t[\"builtin\", \"nohkmap\"],\r\n\t[\"builtin\", \"nohkmapp\"],\r\n\t[\"builtin\", \"nohkp\"],\r\n\t[\"builtin\", \"nohls\"],\r\n\t[\"builtin\", \"noic\"],\r\n\t[\"builtin\", \"noicon\"],\r\n\t[\"builtin\", \"noignorecase\"],\r\n\t[\"builtin\", \"noim\"],\r\n\t[\"builtin\", \"noimc\"],\r\n\t[\"builtin\", \"noimcmdline\"],\r\n\t[\"builtin\", \"noimd\"],\r\n\t[\"builtin\", \"noincsearch\"],\r\n\t[\"builtin\", \"noinf\"],\r\n\t[\"builtin\", \"noinfercase\"],\r\n\t[\"builtin\", \"noinsertmode\"],\r\n\t[\"builtin\", \"nois\"],\r\n\t[\"builtin\", \"nojoinspaces\"],\r\n\t[\"builtin\", \"nojs\"],\r\n\t[\"builtin\", \"nolazyredraw\"],\r\n\t[\"builtin\", \"nolbr\"],\r\n\t[\"builtin\", \"nolinebreak\"],\r\n\t[\"builtin\", \"nolisp\"],\r\n\t[\"builtin\", \"nolist\"],\r\n\t[\"builtin\", \"noloadplugins\"],\r\n\t[\"builtin\", \"nolpl\"],\r\n\t[\"builtin\", \"nolz\"],\r\n\t[\"builtin\", \"noma\"],\r\n\t[\"builtin\", \"nomacatsui\"],\r\n\t[\"builtin\", \"nomagic\"],\r\n\t[\"builtin\", \"nomh\"],\r\n\t[\"builtin\", \"noml\"],\r\n\t[\"builtin\", \"nomod\"],\r\n\t[\"builtin\", \"nomodeline\"],\r\n\t[\"builtin\", \"nomodifiable\"],\r\n\t[\"builtin\", \"nomodified\"],\r\n\t[\"builtin\", \"nomore\"],\r\n\t[\"builtin\", \"nomousef\"],\r\n\t[\"builtin\", \"nomousefocus\"],\r\n\t[\"builtin\", \"nomousehide\"],\r\n\t[\"builtin\", \"nonu\"],\r\n\t[\"builtin\", \"nonumber\"],\r\n\t[\"builtin\", \"noodev\"],\r\n\t[\"builtin\", \"noopendevice\"],\r\n\t[\"builtin\", \"nopaste\"],\r\n\t[\"builtin\", \"nopi\"],\r\n\t[\"builtin\", \"nopreserveindent\"],\r\n\t[\"builtin\", \"nopreviewwindow\"],\r\n\t[\"builtin\", \"noprompt\"],\r\n\t[\"builtin\", \"nopvw\"],\r\n\t[\"builtin\", \"noreadonly\"],\r\n\t[\"builtin\", \"noremap\"],\r\n\t[\"builtin\", \"norestorescreen\"],\r\n\t[\"builtin\", \"norevins\"],\r\n\t[\"builtin\", \"nori\"],\r\n\t[\"builtin\", \"norightleft\"],\r\n\t[\"builtin\", \"norightleftcmd\"],\r\n\t[\"builtin\", \"norl\"],\r\n\t[\"builtin\", \"norlc\"],\r\n\t[\"builtin\", \"noro\"],\r\n\t[\"builtin\", \"nors\"],\r\n\t[\"builtin\", \"noru\"],\r\n\t[\"builtin\", \"noruler\"],\r\n\t[\"builtin\", \"nosb\"],\r\n\t[\"builtin\", \"nosc\"],\r\n\t[\"builtin\", \"noscb\"],\r\n\t[\"builtin\", \"noscrollbind\"],\r\n\t[\"builtin\", \"noscs\"],\r\n\t[\"builtin\", \"nosecure\"],\r\n\t[\"builtin\", \"nosft\"],\r\n\t[\"builtin\", \"noshellslash\"],\r\n\t[\"builtin\", \"noshelltemp\"],\r\n\t[\"builtin\", \"noshiftround\"],\r\n\t[\"builtin\", \"noshortname\"],\r\n\t[\"builtin\", \"noshowcmd\"],\r\n\t[\"builtin\", \"noshowfulltag\"],\r\n\t[\"builtin\", \"noshowmatch\"],\r\n\t[\"builtin\", \"noshowmode\"],\r\n\t[\"builtin\", \"nosi\"],\r\n\t[\"builtin\", \"nosm\"],\r\n\t[\"builtin\", \"nosmartcase\"],\r\n\t[\"builtin\", \"nosmartindent\"],\r\n\t[\"builtin\", \"nosmarttab\"],\r\n\t[\"builtin\", \"nosmd\"],\r\n\t[\"builtin\", \"nosn\"],\r\n\t[\"builtin\", \"nosol\"],\r\n\t[\"builtin\", \"nospell\"],\r\n\t[\"builtin\", \"nosplitbelow\"],\r\n\t[\"builtin\", \"nosplitright\"],\r\n\t[\"builtin\", \"nospr\"],\r\n\t[\"builtin\", \"nosr\"],\r\n\t[\"builtin\", \"nossl\"],\r\n\t[\"builtin\", \"nosta\"],\r\n\t[\"builtin\", \"nostartofline\"],\r\n\t[\"builtin\", \"nostmp\"],\r\n\t[\"builtin\", \"noswapfile\"],\r\n\t[\"builtin\", \"noswf\"],\r\n\t[\"builtin\", \"nota\"],\r\n\t[\"builtin\", \"notagbsearch\"],\r\n\t[\"builtin\", \"notagrelative\"],\r\n\t[\"builtin\", \"notagstack\"],\r\n\t[\"builtin\", \"notbi\"],\r\n\t[\"builtin\", \"notbidi\"],\r\n\t[\"builtin\", \"notbs\"],\r\n\t[\"builtin\", \"notermbidi\"],\r\n\t[\"builtin\", \"noterse\"],\r\n\t[\"builtin\", \"notextauto\"],\r\n\t[\"builtin\", \"notextmode\"],\r\n\t[\"builtin\", \"notf\"],\r\n\t[\"builtin\", \"notgst\"],\r\n\t[\"builtin\", \"notildeop\"],\r\n\t[\"builtin\", \"notimeout\"],\r\n\t[\"builtin\", \"notitle\"],\r\n\t[\"builtin\", \"noto\"],\r\n\t[\"builtin\", \"notop\"],\r\n\t[\"builtin\", \"notr\"],\r\n\t[\"builtin\", \"nottimeout\"],\r\n\t[\"builtin\", \"nottybuiltin\"],\r\n\t[\"builtin\", \"nottyfast\"],\r\n\t[\"builtin\", \"notx\"],\r\n\t[\"builtin\", \"novb\"],\r\n\t[\"builtin\", \"novisualbell\"],\r\n\t[\"builtin\", \"nowa\"],\r\n\t[\"builtin\", \"nowarn\"],\r\n\t[\"builtin\", \"nowb\"],\r\n\t[\"builtin\", \"noweirdinvert\"],\r\n\t[\"builtin\", \"nowfh\"],\r\n\t[\"builtin\", \"nowfw\"],\r\n\t[\"builtin\", \"nowildmenu\"],\r\n\t[\"builtin\", \"nowinfixheight\"],\r\n\t[\"builtin\", \"nowinfixwidth\"],\r\n\t[\"builtin\", \"nowiv\"],\r\n\t[\"builtin\", \"nowmnu\"],\r\n\t[\"builtin\", \"nowrap\"],\r\n\t[\"builtin\", \"nowrapscan\"],\r\n\t[\"builtin\", \"nowrite\"],\r\n\t[\"builtin\", \"nowriteany\"],\r\n\t[\"builtin\", \"nowritebackup\"],\r\n\t[\"builtin\", \"nows\"],\r\n\t[\"builtin\", \"invacd\"],\r\n\t[\"builtin\", \"invai\"],\r\n\t[\"builtin\", \"invakm\"],\r\n\t[\"builtin\", \"invallowrevins\"],\r\n\t[\"builtin\", \"invaltkeymap\"],\r\n\t[\"builtin\", \"invanti\"],\r\n\t[\"builtin\", \"invantialias\"],\r\n\t[\"builtin\", \"invar\"],\r\n\t[\"builtin\", \"invarab\"],\r\n\t[\"builtin\", \"invarabic\"],\r\n\t[\"builtin\", \"invarabicshape\"],\r\n\t[\"builtin\", \"invari\"],\r\n\t[\"builtin\", \"invarshape\"],\r\n\t[\"builtin\", \"invautochdir\"],\r\n\t[\"builtin\", \"invautoindent\"],\r\n\t[\"builtin\", \"invautoread\"],\r\n\t[\"builtin\", \"invautowrite\"],\r\n\t[\"builtin\", \"invautowriteall\"],\r\n\t[\"builtin\", \"invaw\"],\r\n\t[\"builtin\", \"invawa\"],\r\n\t[\"builtin\", \"invbackup\"],\r\n\t[\"builtin\", \"invballooneval\"],\r\n\t[\"builtin\", \"invbeval\"],\r\n\t[\"builtin\", \"invbin\"],\r\n\t[\"builtin\", \"invbinary\"],\r\n\t[\"builtin\", \"invbiosk\"],\r\n\t[\"builtin\", \"invbioskey\"],\r\n\t[\"builtin\", \"invbk\"],\r\n\t[\"builtin\", \"invbl\"],\r\n\t[\"builtin\", \"invbomb\"],\r\n\t[\"builtin\", \"invbuflisted\"],\r\n\t[\"builtin\", \"invcf\"],\r\n\t[\"builtin\", \"invci\"],\r\n\t[\"builtin\", \"invcin\"],\r\n\t[\"builtin\", \"invcindent\"],\r\n\t[\"builtin\", \"invcompatible\"],\r\n\t[\"builtin\", \"invconfirm\"],\r\n\t[\"builtin\", \"invconsk\"],\r\n\t[\"builtin\", \"invconskey\"],\r\n\t[\"builtin\", \"invcopyindent\"],\r\n\t[\"builtin\", \"invcp\"],\r\n\t[\"builtin\", \"invcscopetag\"],\r\n\t[\"builtin\", \"invcscopeverbose\"],\r\n\t[\"builtin\", \"invcst\"],\r\n\t[\"builtin\", \"invcsverb\"],\r\n\t[\"builtin\", \"invcuc\"],\r\n\t[\"builtin\", \"invcul\"],\r\n\t[\"builtin\", \"invcursorcolumn\"],\r\n\t[\"builtin\", \"invcursorline\"],\r\n\t[\"builtin\", \"invdeco\"],\r\n\t[\"builtin\", \"invdelcombine\"],\r\n\t[\"builtin\", \"invdg\"],\r\n\t[\"builtin\", \"invdiff\"],\r\n\t[\"builtin\", \"invdigraph\"],\r\n\t[\"builtin\", \"invdisable\"],\r\n\t[\"builtin\", \"invea\"],\r\n\t[\"builtin\", \"inveb\"],\r\n\t[\"builtin\", \"inved\"],\r\n\t[\"builtin\", \"invedcompatible\"],\r\n\t[\"builtin\", \"invek\"],\r\n\t[\"builtin\", \"invendofline\"],\r\n\t[\"builtin\", \"inveol\"],\r\n\t[\"builtin\", \"invequalalways\"],\r\n\t[\"builtin\", \"inverrorbells\"],\r\n\t[\"builtin\", \"invesckeys\"],\r\n\t[\"builtin\", \"invet\"],\r\n\t[\"builtin\", \"invex\"],\r\n\t[\"builtin\", \"invexpandtab\"],\r\n\t[\"builtin\", \"invexrc\"],\r\n\t[\"builtin\", \"invfen\"],\r\n\t[\"builtin\", \"invfk\"],\r\n\t[\"builtin\", \"invfkmap\"],\r\n\t[\"builtin\", \"invfoldenable\"],\r\n\t[\"builtin\", \"invgd\"],\r\n\t[\"builtin\", \"invgdefault\"],\r\n\t[\"builtin\", \"invguipty\"],\r\n\t[\"builtin\", \"invhid\"],\r\n\t[\"builtin\", \"invhidden\"],\r\n\t[\"builtin\", \"invhk\"],\r\n\t[\"builtin\", \"invhkmap\"],\r\n\t[\"builtin\", \"invhkmapp\"],\r\n\t[\"builtin\", \"invhkp\"],\r\n\t[\"builtin\", \"invhls\"],\r\n\t[\"builtin\", \"invhlsearch\"],\r\n\t[\"builtin\", \"invic\"],\r\n\t[\"builtin\", \"invicon\"],\r\n\t[\"builtin\", \"invignorecase\"],\r\n\t[\"builtin\", \"invim\"],\r\n\t[\"builtin\", \"invimc\"],\r\n\t[\"builtin\", \"invimcmdline\"],\r\n\t[\"builtin\", \"invimd\"],\r\n\t[\"builtin\", \"invincsearch\"],\r\n\t[\"builtin\", \"invinf\"],\r\n\t[\"builtin\", \"invinfercase\"],\r\n\t[\"builtin\", \"invinsertmode\"],\r\n\t[\"builtin\", \"invis\"],\r\n\t[\"builtin\", \"invjoinspaces\"],\r\n\t[\"builtin\", \"invjs\"],\r\n\t[\"builtin\", \"invlazyredraw\"],\r\n\t[\"builtin\", \"invlbr\"],\r\n\t[\"builtin\", \"invlinebreak\"],\r\n\t[\"builtin\", \"invlisp\"],\r\n\t[\"builtin\", \"invlist\"],\r\n\t[\"builtin\", \"invloadplugins\"],\r\n\t[\"builtin\", \"invlpl\"],\r\n\t[\"builtin\", \"invlz\"],\r\n\t[\"builtin\", \"invma\"],\r\n\t[\"builtin\", \"invmacatsui\"],\r\n\t[\"builtin\", \"invmagic\"],\r\n\t[\"builtin\", \"invmh\"],\r\n\t[\"builtin\", \"invml\"],\r\n\t[\"builtin\", \"invmod\"],\r\n\t[\"builtin\", \"invmodeline\"],\r\n\t[\"builtin\", \"invmodifiable\"],\r\n\t[\"builtin\", \"invmodified\"],\r\n\t[\"builtin\", \"invmore\"],\r\n\t[\"builtin\", \"invmousef\"],\r\n\t[\"builtin\", \"invmousefocus\"],\r\n\t[\"builtin\", \"invmousehide\"],\r\n\t[\"builtin\", \"invnu\"],\r\n\t[\"builtin\", \"invnumber\"],\r\n\t[\"builtin\", \"invodev\"],\r\n\t[\"builtin\", \"invopendevice\"],\r\n\t[\"builtin\", \"invpaste\"],\r\n\t[\"builtin\", \"invpi\"],\r\n\t[\"builtin\", \"invpreserveindent\"],\r\n\t[\"builtin\", \"invpreviewwindow\"],\r\n\t[\"builtin\", \"invprompt\"],\r\n\t[\"builtin\", \"invpvw\"],\r\n\t[\"builtin\", \"invreadonly\"],\r\n\t[\"builtin\", \"invremap\"],\r\n\t[\"builtin\", \"invrestorescreen\"],\r\n\t[\"builtin\", \"invrevins\"],\r\n\t[\"builtin\", \"invri\"],\r\n\t[\"builtin\", \"invrightleft\"],\r\n\t[\"builtin\", \"invrightleftcmd\"],\r\n\t[\"builtin\", \"invrl\"],\r\n\t[\"builtin\", \"invrlc\"],\r\n\t[\"builtin\", \"invro\"],\r\n\t[\"builtin\", \"invrs\"],\r\n\t[\"builtin\", \"invru\"],\r\n\t[\"builtin\", \"invruler\"],\r\n\t[\"builtin\", \"invsb\"],\r\n\t[\"builtin\", \"invsc\"],\r\n\t[\"builtin\", \"invscb\"],\r\n\t[\"builtin\", \"invscrollbind\"],\r\n\t[\"builtin\", \"invscs\"],\r\n\t[\"builtin\", \"invsecure\"],\r\n\t[\"builtin\", \"invsft\"],\r\n\t[\"builtin\", \"invshellslash\"],\r\n\t[\"builtin\", \"invshelltemp\"],\r\n\t[\"builtin\", \"invshiftround\"],\r\n\t[\"builtin\", \"invshortname\"],\r\n\t[\"builtin\", \"invshowcmd\"],\r\n\t[\"builtin\", \"invshowfulltag\"],\r\n\t[\"builtin\", \"invshowmatch\"],\r\n\t[\"builtin\", \"invshowmode\"],\r\n\t[\"builtin\", \"invsi\"],\r\n\t[\"builtin\", \"invsm\"],\r\n\t[\"builtin\", \"invsmartcase\"],\r\n\t[\"builtin\", \"invsmartindent\"],\r\n\t[\"builtin\", \"invsmarttab\"],\r\n\t[\"builtin\", \"invsmd\"],\r\n\t[\"builtin\", \"invsn\"],\r\n\t[\"builtin\", \"invsol\"],\r\n\t[\"builtin\", \"invspell\"],\r\n\t[\"builtin\", \"invsplitbelow\"],\r\n\t[\"builtin\", \"invsplitright\"],\r\n\t[\"builtin\", \"invspr\"],\r\n\t[\"builtin\", \"invsr\"],\r\n\t[\"builtin\", \"invssl\"],\r\n\t[\"builtin\", \"invsta\"],\r\n\t[\"builtin\", \"invstartofline\"],\r\n\t[\"builtin\", \"invstmp\"],\r\n\t[\"builtin\", \"invswapfile\"],\r\n\t[\"builtin\", \"invswf\"],\r\n\t[\"builtin\", \"invta\"],\r\n\t[\"builtin\", \"invtagbsearch\"],\r\n\t[\"builtin\", \"invtagrelative\"],\r\n\t[\"builtin\", \"invtagstack\"],\r\n\t[\"builtin\", \"invtbi\"],\r\n\t[\"builtin\", \"invtbidi\"],\r\n\t[\"builtin\", \"invtbs\"],\r\n\t[\"builtin\", \"invtermbidi\"],\r\n\t[\"builtin\", \"invterse\"],\r\n\t[\"builtin\", \"invtextauto\"],\r\n\t[\"builtin\", \"invtextmode\"],\r\n\t[\"builtin\", \"invtf\"],\r\n\t[\"builtin\", \"invtgst\"],\r\n\t[\"builtin\", \"invtildeop\"],\r\n\t[\"builtin\", \"invtimeout\"],\r\n\t[\"builtin\", \"invtitle\"],\r\n\t[\"builtin\", \"invto\"],\r\n\t[\"builtin\", \"invtop\"],\r\n\t[\"builtin\", \"invtr\"],\r\n\t[\"builtin\", \"invttimeout\"],\r\n\t[\"builtin\", \"invttybuiltin\"],\r\n\t[\"builtin\", \"invttyfast\"],\r\n\t[\"builtin\", \"invtx\"],\r\n\t[\"builtin\", \"invvb\"],\r\n\t[\"builtin\", \"invvisualbell\"],\r\n\t[\"builtin\", \"invwa\"],\r\n\t[\"builtin\", \"invwarn\"],\r\n\t[\"builtin\", \"invwb\"],\r\n\t[\"builtin\", \"invweirdinvert\"],\r\n\t[\"builtin\", \"invwfh\"],\r\n\t[\"builtin\", \"invwfw\"],\r\n\t[\"builtin\", \"invwildmenu\"],\r\n\t[\"builtin\", \"invwinfixheight\"],\r\n\t[\"builtin\", \"invwinfixwidth\"],\r\n\t[\"builtin\", \"invwiv\"],\r\n\t[\"builtin\", \"invwmnu\"],\r\n\t[\"builtin\", \"invwrap\"],\r\n\t[\"builtin\", \"invwrapscan\"],\r\n\t[\"builtin\", \"invwrite\"],\r\n\t[\"builtin\", \"invwriteany\"],\r\n\t[\"builtin\", \"invwritebackup\"],\r\n\t[\"builtin\", \"invws\"],\r\n\t[\"builtin\", \"t_AB\"],\r\n\t[\"builtin\", \"t_AF\"],\r\n\t[\"builtin\", \"t_al\"],\r\n\t[\"builtin\", \"t_AL\"],\r\n\t[\"builtin\", \"t_bc\"],\r\n\t[\"builtin\", \"t_cd\"],\r\n\t[\"builtin\", \"t_ce\"],\r\n\t[\"builtin\", \"t_Ce\"],\r\n\t[\"builtin\", \"t_cl\"],\r\n\t[\"builtin\", \"t_cm\"],\r\n\t[\"builtin\", \"t_Co\"],\r\n\t[\"builtin\", \"t_cs\"],\r\n\t[\"builtin\", \"t_Cs\"],\r\n\t[\"builtin\", \"t_CS\"],\r\n\t[\"builtin\", \"t_CV\"],\r\n\t[\"builtin\", \"t_da\"],\r\n\t[\"builtin\", \"t_db\"],\r\n\t[\"builtin\", \"t_dl\"],\r\n\t[\"builtin\", \"t_DL\"],\r\n\t[\"builtin\", \"t_EI\"],\r\n\t[\"builtin\", \"t_F1\"],\r\n\t[\"builtin\", \"t_F2\"],\r\n\t[\"builtin\", \"t_F3\"],\r\n\t[\"builtin\", \"t_F4\"],\r\n\t[\"builtin\", \"t_F5\"],\r\n\t[\"builtin\", \"t_F6\"],\r\n\t[\"builtin\", \"t_F7\"],\r\n\t[\"builtin\", \"t_F8\"],\r\n\t[\"builtin\", \"t_F9\"],\r\n\t[\"builtin\", \"t_fs\"],\r\n\t[\"builtin\", \"t_IE\"],\r\n\t[\"builtin\", \"t_IS\"],\r\n\t[\"builtin\", \"t_k1\"],\r\n\t[\"builtin\", \"t_K1\"],\r\n\t[\"builtin\", \"t_k2\"],\r\n\t[\"builtin\", \"t_k3\"],\r\n\t[\"builtin\", \"t_K3\"],\r\n\t[\"builtin\", \"t_k4\"],\r\n\t[\"builtin\", \"t_K4\"],\r\n\t[\"builtin\", \"t_k5\"],\r\n\t[\"builtin\", \"t_K5\"],\r\n\t[\"builtin\", \"t_k6\"],\r\n\t[\"builtin\", \"t_K6\"],\r\n\t[\"builtin\", \"t_k7\"],\r\n\t[\"builtin\", \"t_K7\"],\r\n\t[\"builtin\", \"t_k8\"],\r\n\t[\"builtin\", \"t_K8\"],\r\n\t[\"builtin\", \"t_k9\"],\r\n\t[\"builtin\", \"t_K9\"],\r\n\t[\"builtin\", \"t_KA\"],\r\n\t[\"builtin\", \"t_kb\"],\r\n\t[\"builtin\", \"t_kB\"],\r\n\t[\"builtin\", \"t_KB\"],\r\n\t[\"builtin\", \"t_KC\"],\r\n\t[\"builtin\", \"t_kd\"],\r\n\t[\"builtin\", \"t_kD\"],\r\n\t[\"builtin\", \"t_KD\"],\r\n\t[\"builtin\", \"t_ke\"],\r\n\t[\"builtin\", \"t_KE\"],\r\n\t[\"builtin\", \"t_KF\"],\r\n\t[\"builtin\", \"t_KG\"],\r\n\t[\"builtin\", \"t_kh\"],\r\n\t[\"builtin\", \"t_KH\"],\r\n\t[\"builtin\", \"t_kI\"],\r\n\t[\"builtin\", \"t_KI\"],\r\n\t[\"builtin\", \"t_KJ\"],\r\n\t[\"builtin\", \"t_KK\"],\r\n\t[\"builtin\", \"t_kl\"],\r\n\t[\"builtin\", \"t_KL\"],\r\n\t[\"builtin\", \"t_kN\"],\r\n\t[\"builtin\", \"t_kP\"],\r\n\t[\"builtin\", \"t_kr\"],\r\n\t[\"builtin\", \"t_ks\"],\r\n\t[\"builtin\", \"t_ku\"],\r\n\t[\"builtin\", \"t_le\"],\r\n\t[\"builtin\", \"t_mb\"],\r\n\t[\"builtin\", \"t_md\"],\r\n\t[\"builtin\", \"t_me\"],\r\n\t[\"builtin\", \"t_mr\"],\r\n\t[\"builtin\", \"t_ms\"],\r\n\t[\"builtin\", \"t_nd\"],\r\n\t[\"builtin\", \"t_op\"],\r\n\t[\"builtin\", \"t_RI\"],\r\n\t[\"builtin\", \"t_RV\"],\r\n\t[\"builtin\", \"t_Sb\"],\r\n\t[\"builtin\", \"t_se\"],\r\n\t[\"builtin\", \"t_Sf\"],\r\n\t[\"builtin\", \"t_SI\"],\r\n\t[\"builtin\", \"t_so\"],\r\n\t[\"builtin\", \"t_sr\"],\r\n\t[\"builtin\", \"t_te\"],\r\n\t[\"builtin\", \"t_ti\"],\r\n\t[\"builtin\", \"t_ts\"],\r\n\t[\"builtin\", \"t_ue\"],\r\n\t[\"builtin\", \"t_us\"],\r\n\t[\"builtin\", \"t_ut\"],\r\n\t[\"builtin\", \"t_vb\"],\r\n\t[\"builtin\", \"t_ve\"],\r\n\t[\"builtin\", \"t_vi\"],\r\n\t[\"builtin\", \"t_vs\"],\r\n\t[\"builtin\", \"t_WP\"],\r\n\t[\"builtin\", \"t_WS\"],\r\n\t[\"builtin\", \"t_xs\"],\r\n\t[\"builtin\", \"t_ZH\"],\r\n\t[\"builtin\", \"t_ZR\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for builtins."
  },
  {
    "path": "tests/languages/vim/comment_feature.test",
    "content": "\"\r\n\" Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"\\\"\"],\r\n\t[\"comment\", \"\\\" Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/vim/function_feature.test",
    "content": "has(\"mac\")\r\nexists(\"s:call_count\")\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"has\"], [\"punctuation\", \"(\"], [\"string\", \"\\\"mac\\\"\"], [\"punctuation\", \")\"],\r\n\t[\"function\", \"exists\"], [\"punctuation\", \"(\"], [\"string\", \"\\\"s:call_count\\\"\"], [\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/vim/keyword_feature.test",
    "content": "ab\r\nabbreviate\r\nabc\r\nabclear\r\nabo\r\naboveleft\r\nal\r\nall\r\narga\r\nargadd\r\nargd\r\nargdelete\r\nargdo\r\narge\r\nargedit\r\nargg\r\nargglobal\r\nargl\r\narglocal\r\nar\r\nargs\r\nargu\r\nargument\r\nas\r\nascii\r\nbad\r\nbadd\r\nba\r\nball\r\nbd\r\nbdelete\r\nbe\r\nbel\r\nbelowright\r\nbf\r\nbfirst\r\nbl\r\nblast\r\nbm\r\nbmodified\r\nbn\r\nbnext\r\nbN\r\nbNext\r\nbo\r\nbotright\r\nbp\r\nbprevious\r\nbrea\r\nbreak\r\nbreaka\r\nbreakadd\r\nbreakd\r\nbreakdel\r\nbreakl\r\nbreaklist\r\nbr\r\nbrewind\r\nbro\r\nbrowse\r\nbufdo\r\nb\r\nbuffer\r\nbuffers\r\nbun\r\nbunload\r\nbw\r\nbwipeout\r\nca\r\ncabbrev\r\ncabc\r\ncabclear\r\ncaddb\r\ncaddbuffer\r\ncad\r\ncaddexpr\r\ncaddf\r\ncaddfile\r\ncal\r\ncall\r\ncat\r\ncatch\r\ncb\r\ncbuffer\r\ncc\r\nccl\r\ncclose\r\ncd\r\nce\r\ncenter\r\ncex\r\ncexpr\r\ncf\r\ncfile\r\ncfir\r\ncfirst\r\ncgetb\r\ncgetbuffer\r\ncgete\r\ncgetexpr\r\ncg\r\ncgetfile\r\nc\r\nchange\r\nchanges\r\nchd\r\nchdir\r\nche\r\ncheckpath\r\ncheckt\r\nchecktime\r\ncla\r\nclast\r\ncl\r\nclist\r\nclo\r\nclose\r\ncmapc\r\ncmapclear\r\ncnew\r\ncnewer\r\ncn\r\ncnext\r\ncN\r\ncNext\r\ncnf\r\ncnfile\r\ncNfcNfile\r\ncnorea\r\ncnoreabbrev\r\ncol\r\ncolder\r\ncolo\r\ncolorscheme\r\ncomc\r\ncomclear\r\ncomp\r\ncompiler\r\nconf\r\nconfirm\r\ncon\r\ncontinue\r\ncope\r\ncopen\r\nco\r\ncopy\r\ncpf\r\ncpfile\r\ncp\r\ncprevious\r\ncq\r\ncquit\r\ncr\r\ncrewind\r\ncuna\r\ncunabbrev\r\ncu\r\ncunmap\r\ncw\r\ncwindow\r\ndebugg\r\ndebuggreedy\r\ndelc\r\ndelcommand\r\nd\r\ndelete\r\ndelf\r\ndelfunction\r\ndelm\r\ndelmarks\r\ndiffg\r\ndiffget\r\ndiffoff\r\ndiffpatch\r\ndiffpu\r\ndiffput\r\ndiffsplit\r\ndiffthis\r\ndiffu\r\ndiffupdate\r\ndig\r\ndigraphs\r\ndi\r\ndisplay\r\ndj\r\ndjump\r\ndl\r\ndlist\r\ndr\r\ndrop\r\nds\r\ndsearch\r\ndsp\r\ndsplit\r\nearlier\r\nechoe\r\nechoerr\r\nechom\r\nechomsg\r\nechon\r\ne\r\nedit\r\nel\r\nelse\r\nelsei\r\nelseif\r\nem\r\nemenu\r\nendfo\r\nendfor\r\nendf\r\nendfunction\r\nendfun\r\nen\r\nendif\r\nendt\r\nendtry\r\nendw\r\nendwhile\r\nene\r\nenew\r\nex\r\nexi\r\nexit\r\nexu\r\nexusage\r\nf\r\nfile\r\nfiles\r\nfiletype\r\nfina\r\nfinally\r\nfin\r\nfind\r\nfini\r\nfinish\r\nfir\r\nfirst\r\nfix\r\nfixdel\r\nfo\r\nfold\r\nfoldc\r\nfoldclose\r\nfolddoc\r\nfolddoclosed\r\nfoldd\r\nfolddoopen\r\nfoldo\r\nfoldopen\r\nfor\r\nfu\r\nfun\r\nfunction\r\ngo\r\ngoto\r\ngr\r\ngrep\r\ngrepa\r\ngrepadd\r\nha\r\nhardcopy\r\nh\r\nhelp\r\nhelpf\r\nhelpfind\r\nhelpg\r\nhelpgrep\r\nhelpt\r\nhelptags\r\nhid\r\nhide\r\nhis\r\nhistory\r\nia\r\niabbrev\r\niabc\r\niabclear\r\nif\r\nij\r\nijump\r\nil\r\nilist\r\nimapc\r\nimapclear\r\nin\r\ninorea\r\ninoreabbrev\r\nisearch\r\nisp\r\nisplit\r\niuna\r\niunabbrev\r\niu\r\niunmap\r\nj\r\njoin\r\nju\r\njumps\r\nk\r\nkeepalt\r\nkeepj\r\nkeepjumps\r\nkee\r\nkeepmarks\r\nladdb\r\nladdbuffer\r\nlad\r\nladdexpr\r\nladdf\r\nladdfile\r\nlan\r\nlanguage\r\nla\r\nlast\r\nlater\r\nlb\r\nlbuffer\r\nlc\r\nlcd\r\nlch\r\nlchdir\r\nlcl\r\nlclose\r\nlet\r\nleft\r\nlefta\r\nleftabove\r\nlex\r\nlexpr\r\nlf\r\nlfile\r\nlfir\r\nlfirst\r\nlgetb\r\nlgetbuffer\r\nlgete\r\nlgetexpr\r\nlg\r\nlgetfile\r\nlgr\r\nlgrep\r\nlgrepa\r\nlgrepadd\r\nlh\r\nlhelpgrep\r\nl\r\nlist\r\nll\r\nlla\r\nllast\r\nlli\r\nllist\r\nlmak\r\nlmake\r\nlm\r\nlmap\r\nlmapc\r\nlmapclear\r\nlnew\r\nlnewer\r\nlne\r\nlnext\r\nlN\r\nlNext\r\nlnf\r\nlnfile\r\nlNf\r\nlNfile\r\nln\r\nlnoremap\r\nlo\r\nloadview\r\nloc\r\nlockmarks\r\nlockv\r\nlockvar\r\nlol\r\nlolder\r\nlop\r\nlopen\r\nlpf\r\nlpfile\r\nlp\r\nlprevious\r\nlr\r\nlrewind\r\nls\r\nlt\r\nltag\r\nlu\r\nlunmap\r\nlv\r\nlvimgrep\r\nlvimgrepa\r\nlvimgrepadd\r\nlw\r\nlwindow\r\nmak\r\nmake\r\nma\r\nmark\r\nmarks\r\nmat\r\nmatch\r\nmenut\r\nmenutranslate\r\nmk\r\nmkexrc\r\nmks\r\nmksession\r\nmksp\r\nmkspell\r\nmkvie\r\nmkview\r\nmkv\r\nmkvimrc\r\nmod\r\nmode\r\nm\r\nmove\r\nmzf\r\nmzfile\r\nmz\r\nmzscheme\r\nnbkey\r\nnew\r\nn\r\nnext\r\nN\r\nNext\r\nnmapc\r\nnmapclear\r\nnoh\r\nnohlsearch\r\nnorea\r\nnoreabbrev\r\nnu\r\nnumber\r\nnun\r\nnunmap\r\nomapc\r\nomapclear\r\non\r\nonly\r\no\r\nopen\r\nopt\r\noptions\r\nou\r\nounmap\r\npc\r\npclose\r\nped\r\npedit\r\npe\r\nperl\r\nperld\r\nperldo\r\npo\r\npop\r\npopu\r\npopu\r\npopup\r\npp\r\nppop\r\npre\r\npreserve\r\nprev\r\nprevious\r\np\r\nprint\r\nP\r\nPrint\r\nprofd\r\nprofdel\r\nprof\r\nprofile\r\npromptf\r\npromptfind\r\npromptr\r\npromptrepl\r\nps\r\npsearch\r\npta\r\nptag\r\nptf\r\nptfirst\r\nptj\r\nptjump\r\nptl\r\nptlast\r\nptn\r\nptnext\r\nptN\r\nptNext\r\nptp\r\nptprevious\r\nptr\r\nptrewind\r\npts\r\nptselect\r\npu\r\nput\r\npw\r\npwd\r\npyf\r\npyfile\r\npy\r\npython\r\nqa\r\nqall\r\nq\r\nquit\r\nquita\r\nquitall\r\nr\r\nread\r\nrec\r\nrecover\r\nredi\r\nredir\r\nred\r\nredo\r\nredr\r\nredraw\r\nredraws\r\nredrawstatus\r\nreg\r\nregisters\r\nres\r\nresize\r\nret\r\nretab\r\nretu\r\nreturn\r\nrew\r\nrewind\r\nri\r\nright\r\nrightb\r\nrightbelow\r\nrub\r\nruby\r\nrubyd\r\nrubydo\r\nrubyf\r\nrubyfile\r\nru\r\nruntime\r\nrv\r\nrviminfo\r\nsal\r\nsall\r\nsan\r\nsandbox\r\nsa\r\nsargument\r\nsav\r\nsaveas\r\nsba\r\nsball\r\nsbf\r\nsbfirst\r\nsbl\r\nsblast\r\nsbm\r\nsbmodified\r\nsbn\r\nsbnext\r\nsbN\r\nsbNext\r\nsbp\r\nsbprevious\r\nsbr\r\nsbrewind\r\nsb\r\nsbuffer\r\nscripte\r\nscriptencoding\r\nscrip\r\nscriptnames\r\nse\r\nset\r\nsetf\r\nsetfiletype\r\nsetg\r\nsetglobal\r\nsetl\r\nsetlocal\r\nsf\r\nsfind\r\nsfir\r\nsfirst\r\nsh\r\nshell\r\nsign\r\nsil\r\nsilent\r\nsim\r\nsimalt\r\nsla\r\nslast\r\nsl\r\nsleep\r\nsm\r\nsmagic\r\nsm\r\nsmap\r\nsmapc\r\nsmapclear\r\nsme\r\nsmenu\r\nsn\r\nsnext\r\nsN\r\nsNext\r\nsni\r\nsniff\r\nsno\r\nsnomagic\r\nsnor\r\nsnoremap\r\nsnoreme\r\nsnoremenu\r\nsor\r\nsort\r\nso\r\nsource\r\nspelld\r\nspelldump\r\nspe\r\nspellgood\r\nspelli\r\nspellinfo\r\nspellr\r\nspellrepall\r\nspellu\r\nspellundo\r\nspellw\r\nspellwrong\r\nsp\r\nsplit\r\nspr\r\nsprevious\r\nsre\r\nsrewind\r\nsta\r\nstag\r\nstartg\r\nstartgreplace\r\nstar\r\nstartinsert\r\nstartr\r\nstartreplace\r\nstj\r\nstjump\r\nst\r\nstop\r\nstopi\r\nstopinsert\r\nsts\r\nstselect\r\nsun\r\nsunhide\r\nsunm\r\nsunmap\r\nsus\r\nsuspend\r\nsv\r\nsview\r\nsyncbind\r\nt\r\ntab\r\ntabc\r\ntabclose\r\ntabd\r\ntabdo\r\ntabe\r\ntabedit\r\ntabf\r\ntabfind\r\ntabfir\r\ntabfirst\r\ntabl\r\ntablast\r\ntabm\r\ntabmove\r\ntabnew\r\ntabn\r\ntabnext\r\ntabN\r\ntabNext\r\ntabo\r\ntabonly\r\ntabp\r\ntabprevious\r\ntabr\r\ntabrewind\r\ntabs\r\nta\r\ntag\r\ntags\r\ntc\r\ntcl\r\ntcld\r\ntcldo\r\ntclf\r\ntclfile\r\nte\r\ntearoff\r\ntf\r\ntfirst\r\nth\r\nthrow\r\ntj\r\ntjump\r\ntl\r\ntlast\r\ntm\r\ntm\r\ntmenu\r\ntn\r\ntnext\r\ntN\r\ntNext\r\nto\r\ntopleft\r\ntp\r\ntprevious\r\ntr\r\ntrewind\r\ntry\r\nts\r\ntselect\r\ntu\r\ntu\r\ntunmenu\r\nuna\r\nunabbreviate\r\nu\r\nundo\r\nundoj\r\nundojoin\r\nundol\r\nundolist\r\nunh\r\nunhide\r\nunlet\r\nunlo\r\nunlockvar\r\nunm\r\nunmap\r\nup\r\nupdate\r\nverb\r\nverbose\r\nve\r\nversion\r\nvert\r\nvertical\r\nvie\r\nview\r\nvim\r\nvimgrep\r\nvimgrepa\r\nvimgrepadd\r\nvi\r\nvisual\r\nviu\r\nviusage\r\nvmapc\r\nvmapclear\r\nvne\r\nvnew\r\nvs\r\nvsplit\r\nvu\r\nvunmap\r\nwa\r\nwall\r\nwh\r\nwhile\r\nwinc\r\nwincmd\r\nwindo\r\nwinp\r\nwinpos\r\nwin\r\nwinsize\r\nwn\r\nwnext\r\nwN\r\nwNext\r\nwp\r\nwprevious\r\nwq\r\nwqa\r\nwqall\r\nw\r\nwrite\r\nws\r\nwsverb\r\nwv\r\nwviminfo\r\nX\r\nxa\r\nxall\r\nx\r\nxit\r\nxm\r\nxmap\r\nxmapc\r\nxmapclear\r\nxme\r\nxmenu\r\nXMLent\r\nXMLns\r\nxn\r\nxnoremap\r\nxnoreme\r\nxnoremenu\r\nxu\r\nxunmap\r\ny\r\nyank\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"ab\"],\r\n\t[\"keyword\", \"abbreviate\"],\r\n\t[\"keyword\", \"abc\"],\r\n\t[\"keyword\", \"abclear\"],\r\n\t[\"keyword\", \"abo\"],\r\n\t[\"keyword\", \"aboveleft\"],\r\n\t[\"keyword\", \"al\"],\r\n\t[\"keyword\", \"all\"],\r\n\t[\"keyword\", \"arga\"],\r\n\t[\"keyword\", \"argadd\"],\r\n\t[\"keyword\", \"argd\"],\r\n\t[\"keyword\", \"argdelete\"],\r\n\t[\"keyword\", \"argdo\"],\r\n\t[\"keyword\", \"arge\"],\r\n\t[\"keyword\", \"argedit\"],\r\n\t[\"keyword\", \"argg\"],\r\n\t[\"keyword\", \"argglobal\"],\r\n\t[\"keyword\", \"argl\"],\r\n\t[\"keyword\", \"arglocal\"],\r\n\t[\"keyword\", \"ar\"],\r\n\t[\"keyword\", \"args\"],\r\n\t[\"keyword\", \"argu\"],\r\n\t[\"keyword\", \"argument\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"ascii\"],\r\n\t[\"keyword\", \"bad\"],\r\n\t[\"keyword\", \"badd\"],\r\n\t[\"keyword\", \"ba\"],\r\n\t[\"keyword\", \"ball\"],\r\n\t[\"keyword\", \"bd\"],\r\n\t[\"keyword\", \"bdelete\"],\r\n\t[\"keyword\", \"be\"],\r\n\t[\"keyword\", \"bel\"],\r\n\t[\"keyword\", \"belowright\"],\r\n\t[\"keyword\", \"bf\"],\r\n\t[\"keyword\", \"bfirst\"],\r\n\t[\"keyword\", \"bl\"],\r\n\t[\"keyword\", \"blast\"],\r\n\t[\"keyword\", \"bm\"],\r\n\t[\"keyword\", \"bmodified\"],\r\n\t[\"keyword\", \"bn\"],\r\n\t[\"keyword\", \"bnext\"],\r\n\t[\"keyword\", \"bN\"],\r\n\t[\"keyword\", \"bNext\"],\r\n\t[\"keyword\", \"bo\"],\r\n\t[\"keyword\", \"botright\"],\r\n\t[\"keyword\", \"bp\"],\r\n\t[\"keyword\", \"bprevious\"],\r\n\t[\"keyword\", \"brea\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"breaka\"],\r\n\t[\"keyword\", \"breakadd\"],\r\n\t[\"keyword\", \"breakd\"],\r\n\t[\"keyword\", \"breakdel\"],\r\n\t[\"keyword\", \"breakl\"],\r\n\t[\"keyword\", \"breaklist\"],\r\n\t[\"keyword\", \"br\"],\r\n\t[\"keyword\", \"brewind\"],\r\n\t[\"keyword\", \"bro\"],\r\n\t[\"keyword\", \"browse\"],\r\n\t[\"keyword\", \"bufdo\"],\r\n\t[\"keyword\", \"b\"],\r\n\t[\"keyword\", \"buffer\"],\r\n\t[\"keyword\", \"buffers\"],\r\n\t[\"keyword\", \"bun\"],\r\n\t[\"keyword\", \"bunload\"],\r\n\t[\"keyword\", \"bw\"],\r\n\t[\"keyword\", \"bwipeout\"],\r\n\t[\"keyword\", \"ca\"],\r\n\t[\"keyword\", \"cabbrev\"],\r\n\t[\"keyword\", \"cabc\"],\r\n\t[\"keyword\", \"cabclear\"],\r\n\t[\"keyword\", \"caddb\"],\r\n\t[\"keyword\", \"caddbuffer\"],\r\n\t[\"keyword\", \"cad\"],\r\n\t[\"keyword\", \"caddexpr\"],\r\n\t[\"keyword\", \"caddf\"],\r\n\t[\"keyword\", \"caddfile\"],\r\n\t[\"keyword\", \"cal\"],\r\n\t[\"keyword\", \"call\"],\r\n\t[\"keyword\", \"cat\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"cb\"],\r\n\t[\"keyword\", \"cbuffer\"],\r\n\t[\"keyword\", \"cc\"],\r\n\t[\"keyword\", \"ccl\"],\r\n\t[\"keyword\", \"cclose\"],\r\n\t[\"keyword\", \"cd\"],\r\n\t[\"keyword\", \"ce\"],\r\n\t[\"keyword\", \"center\"],\r\n\t[\"keyword\", \"cex\"],\r\n\t[\"keyword\", \"cexpr\"],\r\n\t[\"keyword\", \"cf\"],\r\n\t[\"keyword\", \"cfile\"],\r\n\t[\"keyword\", \"cfir\"],\r\n\t[\"keyword\", \"cfirst\"],\r\n\t[\"keyword\", \"cgetb\"],\r\n\t[\"keyword\", \"cgetbuffer\"],\r\n\t[\"keyword\", \"cgete\"],\r\n\t[\"keyword\", \"cgetexpr\"],\r\n\t[\"keyword\", \"cg\"],\r\n\t[\"keyword\", \"cgetfile\"],\r\n\t[\"keyword\", \"c\"],\r\n\t[\"keyword\", \"change\"],\r\n\t[\"keyword\", \"changes\"],\r\n\t[\"keyword\", \"chd\"],\r\n\t[\"keyword\", \"chdir\"],\r\n\t[\"keyword\", \"che\"],\r\n\t[\"keyword\", \"checkpath\"],\r\n\t[\"keyword\", \"checkt\"],\r\n\t[\"keyword\", \"checktime\"],\r\n\t[\"keyword\", \"cla\"],\r\n\t[\"keyword\", \"clast\"],\r\n\t[\"keyword\", \"cl\"],\r\n\t[\"keyword\", \"clist\"],\r\n\t[\"keyword\", \"clo\"],\r\n\t[\"keyword\", \"close\"],\r\n\t[\"keyword\", \"cmapc\"],\r\n\t[\"keyword\", \"cmapclear\"],\r\n\t[\"keyword\", \"cnew\"],\r\n\t[\"keyword\", \"cnewer\"],\r\n\t[\"keyword\", \"cn\"],\r\n\t[\"keyword\", \"cnext\"],\r\n\t[\"keyword\", \"cN\"],\r\n\t[\"keyword\", \"cNext\"],\r\n\t[\"keyword\", \"cnf\"],\r\n\t[\"keyword\", \"cnfile\"],\r\n\t[\"keyword\", \"cNfcNfile\"],\r\n\t[\"keyword\", \"cnorea\"],\r\n\t[\"keyword\", \"cnoreabbrev\"],\r\n\t[\"keyword\", \"col\"],\r\n\t[\"keyword\", \"colder\"],\r\n\t[\"keyword\", \"colo\"],\r\n\t[\"keyword\", \"colorscheme\"],\r\n\t[\"keyword\", \"comc\"],\r\n\t[\"keyword\", \"comclear\"],\r\n\t[\"keyword\", \"comp\"],\r\n\t[\"keyword\", \"compiler\"],\r\n\t[\"keyword\", \"conf\"],\r\n\t[\"keyword\", \"confirm\"],\r\n\t[\"keyword\", \"con\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"cope\"],\r\n\t[\"keyword\", \"copen\"],\r\n\t[\"keyword\", \"co\"],\r\n\t[\"keyword\", \"copy\"],\r\n\t[\"keyword\", \"cpf\"],\r\n\t[\"keyword\", \"cpfile\"],\r\n\t[\"keyword\", \"cp\"],\r\n\t[\"keyword\", \"cprevious\"],\r\n\t[\"keyword\", \"cq\"],\r\n\t[\"keyword\", \"cquit\"],\r\n\t[\"keyword\", \"cr\"],\r\n\t[\"keyword\", \"crewind\"],\r\n\t[\"keyword\", \"cuna\"],\r\n\t[\"keyword\", \"cunabbrev\"],\r\n\t[\"keyword\", \"cu\"],\r\n\t[\"keyword\", \"cunmap\"],\r\n\t[\"keyword\", \"cw\"],\r\n\t[\"keyword\", \"cwindow\"],\r\n\t[\"keyword\", \"debugg\"],\r\n\t[\"keyword\", \"debuggreedy\"],\r\n\t[\"keyword\", \"delc\"],\r\n\t[\"keyword\", \"delcommand\"],\r\n\t[\"keyword\", \"d\"],\r\n\t[\"keyword\", \"delete\"],\r\n\t[\"keyword\", \"delf\"],\r\n\t[\"keyword\", \"delfunction\"],\r\n\t[\"keyword\", \"delm\"],\r\n\t[\"keyword\", \"delmarks\"],\r\n\t[\"keyword\", \"diffg\"],\r\n\t[\"keyword\", \"diffget\"],\r\n\t[\"keyword\", \"diffoff\"],\r\n\t[\"keyword\", \"diffpatch\"],\r\n\t[\"keyword\", \"diffpu\"],\r\n\t[\"keyword\", \"diffput\"],\r\n\t[\"keyword\", \"diffsplit\"],\r\n\t[\"keyword\", \"diffthis\"],\r\n\t[\"keyword\", \"diffu\"],\r\n\t[\"keyword\", \"diffupdate\"],\r\n\t[\"keyword\", \"dig\"],\r\n\t[\"keyword\", \"digraphs\"],\r\n\t[\"keyword\", \"di\"],\r\n\t[\"keyword\", \"display\"],\r\n\t[\"keyword\", \"dj\"],\r\n\t[\"keyword\", \"djump\"],\r\n\t[\"keyword\", \"dl\"],\r\n\t[\"keyword\", \"dlist\"],\r\n\t[\"keyword\", \"dr\"],\r\n\t[\"keyword\", \"drop\"],\r\n\t[\"keyword\", \"ds\"],\r\n\t[\"keyword\", \"dsearch\"],\r\n\t[\"keyword\", \"dsp\"],\r\n\t[\"keyword\", \"dsplit\"],\r\n\t[\"keyword\", \"earlier\"],\r\n\t[\"keyword\", \"echoe\"],\r\n\t[\"keyword\", \"echoerr\"],\r\n\t[\"keyword\", \"echom\"],\r\n\t[\"keyword\", \"echomsg\"],\r\n\t[\"keyword\", \"echon\"],\r\n\t[\"keyword\", \"e\"],\r\n\t[\"keyword\", \"edit\"],\r\n\t[\"keyword\", \"el\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"elsei\"],\r\n\t[\"keyword\", \"elseif\"],\r\n\t[\"keyword\", \"em\"],\r\n\t[\"keyword\", \"emenu\"],\r\n\t[\"keyword\", \"endfo\"],\r\n\t[\"keyword\", \"endfor\"],\r\n\t[\"keyword\", \"endf\"],\r\n\t[\"keyword\", \"endfunction\"],\r\n\t[\"keyword\", \"endfun\"],\r\n\t[\"keyword\", \"en\"],\r\n\t[\"keyword\", \"endif\"],\r\n\t[\"keyword\", \"endt\"],\r\n\t[\"keyword\", \"endtry\"],\r\n\t[\"keyword\", \"endw\"],\r\n\t[\"keyword\", \"endwhile\"],\r\n\t[\"keyword\", \"ene\"],\r\n\t[\"keyword\", \"enew\"],\r\n\t[\"keyword\", \"ex\"],\r\n\t[\"keyword\", \"exi\"],\r\n\t[\"keyword\", \"exit\"],\r\n\t[\"keyword\", \"exu\"],\r\n\t[\"keyword\", \"exusage\"],\r\n\t[\"keyword\", \"f\"],\r\n\t[\"keyword\", \"file\"],\r\n\t[\"keyword\", \"files\"],\r\n\t[\"keyword\", \"filetype\"],\r\n\t[\"keyword\", \"fina\"],\r\n\t[\"keyword\", \"finally\"],\r\n\t[\"keyword\", \"fin\"],\r\n\t[\"keyword\", \"find\"],\r\n\t[\"keyword\", \"fini\"],\r\n\t[\"keyword\", \"finish\"],\r\n\t[\"keyword\", \"fir\"],\r\n\t[\"keyword\", \"first\"],\r\n\t[\"keyword\", \"fix\"],\r\n\t[\"keyword\", \"fixdel\"],\r\n\t[\"keyword\", \"fo\"],\r\n\t[\"keyword\", \"fold\"],\r\n\t[\"keyword\", \"foldc\"],\r\n\t[\"keyword\", \"foldclose\"],\r\n\t[\"keyword\", \"folddoc\"],\r\n\t[\"keyword\", \"folddoclosed\"],\r\n\t[\"keyword\", \"foldd\"],\r\n\t[\"keyword\", \"folddoopen\"],\r\n\t[\"keyword\", \"foldo\"],\r\n\t[\"keyword\", \"foldopen\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"fu\"],\r\n\t[\"keyword\", \"fun\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"go\"],\r\n\t[\"keyword\", \"goto\"],\r\n\t[\"keyword\", \"gr\"],\r\n\t[\"keyword\", \"grep\"],\r\n\t[\"keyword\", \"grepa\"],\r\n\t[\"keyword\", \"grepadd\"],\r\n\t[\"keyword\", \"ha\"],\r\n\t[\"keyword\", \"hardcopy\"],\r\n\t[\"keyword\", \"h\"],\r\n\t[\"keyword\", \"help\"],\r\n\t[\"keyword\", \"helpf\"],\r\n\t[\"keyword\", \"helpfind\"],\r\n\t[\"keyword\", \"helpg\"],\r\n\t[\"keyword\", \"helpgrep\"],\r\n\t[\"keyword\", \"helpt\"],\r\n\t[\"keyword\", \"helptags\"],\r\n\t[\"keyword\", \"hid\"],\r\n\t[\"keyword\", \"hide\"],\r\n\t[\"keyword\", \"his\"],\r\n\t[\"keyword\", \"history\"],\r\n\t[\"keyword\", \"ia\"],\r\n\t[\"keyword\", \"iabbrev\"],\r\n\t[\"keyword\", \"iabc\"],\r\n\t[\"keyword\", \"iabclear\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"ij\"],\r\n\t[\"keyword\", \"ijump\"],\r\n\t[\"keyword\", \"il\"],\r\n\t[\"keyword\", \"ilist\"],\r\n\t[\"keyword\", \"imapc\"],\r\n\t[\"keyword\", \"imapclear\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"inorea\"],\r\n\t[\"keyword\", \"inoreabbrev\"],\r\n\t[\"keyword\", \"isearch\"],\r\n\t[\"keyword\", \"isp\"],\r\n\t[\"keyword\", \"isplit\"],\r\n\t[\"keyword\", \"iuna\"],\r\n\t[\"keyword\", \"iunabbrev\"],\r\n\t[\"keyword\", \"iu\"],\r\n\t[\"keyword\", \"iunmap\"],\r\n\t[\"keyword\", \"j\"],\r\n\t[\"keyword\", \"join\"],\r\n\t[\"keyword\", \"ju\"],\r\n\t[\"keyword\", \"jumps\"],\r\n\t[\"keyword\", \"k\"],\r\n\t[\"keyword\", \"keepalt\"],\r\n\t[\"keyword\", \"keepj\"],\r\n\t[\"keyword\", \"keepjumps\"],\r\n\t[\"keyword\", \"kee\"],\r\n\t[\"keyword\", \"keepmarks\"],\r\n\t[\"keyword\", \"laddb\"],\r\n\t[\"keyword\", \"laddbuffer\"],\r\n\t[\"keyword\", \"lad\"],\r\n\t[\"keyword\", \"laddexpr\"],\r\n\t[\"keyword\", \"laddf\"],\r\n\t[\"keyword\", \"laddfile\"],\r\n\t[\"keyword\", \"lan\"],\r\n\t[\"keyword\", \"language\"],\r\n\t[\"keyword\", \"la\"],\r\n\t[\"keyword\", \"last\"],\r\n\t[\"keyword\", \"later\"],\r\n\t[\"keyword\", \"lb\"],\r\n\t[\"keyword\", \"lbuffer\"],\r\n\t[\"keyword\", \"lc\"],\r\n\t[\"keyword\", \"lcd\"],\r\n\t[\"keyword\", \"lch\"],\r\n\t[\"keyword\", \"lchdir\"],\r\n\t[\"keyword\", \"lcl\"],\r\n\t[\"keyword\", \"lclose\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"left\"],\r\n\t[\"keyword\", \"lefta\"],\r\n\t[\"keyword\", \"leftabove\"],\r\n\t[\"keyword\", \"lex\"],\r\n\t[\"keyword\", \"lexpr\"],\r\n\t[\"keyword\", \"lf\"],\r\n\t[\"keyword\", \"lfile\"],\r\n\t[\"keyword\", \"lfir\"],\r\n\t[\"keyword\", \"lfirst\"],\r\n\t[\"keyword\", \"lgetb\"],\r\n\t[\"keyword\", \"lgetbuffer\"],\r\n\t[\"keyword\", \"lgete\"],\r\n\t[\"keyword\", \"lgetexpr\"],\r\n\t[\"keyword\", \"lg\"],\r\n\t[\"keyword\", \"lgetfile\"],\r\n\t[\"keyword\", \"lgr\"],\r\n\t[\"keyword\", \"lgrep\"],\r\n\t[\"keyword\", \"lgrepa\"],\r\n\t[\"keyword\", \"lgrepadd\"],\r\n\t[\"keyword\", \"lh\"],\r\n\t[\"keyword\", \"lhelpgrep\"],\r\n\t[\"keyword\", \"l\"],\r\n\t[\"keyword\", \"list\"],\r\n\t[\"keyword\", \"ll\"],\r\n\t[\"keyword\", \"lla\"],\r\n\t[\"keyword\", \"llast\"],\r\n\t[\"keyword\", \"lli\"],\r\n\t[\"keyword\", \"llist\"],\r\n\t[\"keyword\", \"lmak\"],\r\n\t[\"keyword\", \"lmake\"],\r\n\t[\"keyword\", \"lm\"],\r\n\t[\"keyword\", \"lmap\"],\r\n\t[\"keyword\", \"lmapc\"],\r\n\t[\"keyword\", \"lmapclear\"],\r\n\t[\"keyword\", \"lnew\"],\r\n\t[\"keyword\", \"lnewer\"],\r\n\t[\"keyword\", \"lne\"],\r\n\t[\"keyword\", \"lnext\"],\r\n\t[\"keyword\", \"lN\"],\r\n\t[\"keyword\", \"lNext\"],\r\n\t[\"keyword\", \"lnf\"],\r\n\t[\"keyword\", \"lnfile\"],\r\n\t[\"keyword\", \"lNf\"],\r\n\t[\"keyword\", \"lNfile\"],\r\n\t[\"keyword\", \"ln\"],\r\n\t[\"keyword\", \"lnoremap\"],\r\n\t[\"keyword\", \"lo\"],\r\n\t[\"keyword\", \"loadview\"],\r\n\t[\"keyword\", \"loc\"],\r\n\t[\"keyword\", \"lockmarks\"],\r\n\t[\"keyword\", \"lockv\"],\r\n\t[\"keyword\", \"lockvar\"],\r\n\t[\"keyword\", \"lol\"],\r\n\t[\"keyword\", \"lolder\"],\r\n\t[\"keyword\", \"lop\"],\r\n\t[\"keyword\", \"lopen\"],\r\n\t[\"keyword\", \"lpf\"],\r\n\t[\"keyword\", \"lpfile\"],\r\n\t[\"keyword\", \"lp\"],\r\n\t[\"keyword\", \"lprevious\"],\r\n\t[\"keyword\", \"lr\"],\r\n\t[\"keyword\", \"lrewind\"],\r\n\t[\"keyword\", \"ls\"],\r\n\t[\"keyword\", \"lt\"],\r\n\t[\"keyword\", \"ltag\"],\r\n\t[\"keyword\", \"lu\"],\r\n\t[\"keyword\", \"lunmap\"],\r\n\t[\"keyword\", \"lv\"],\r\n\t[\"keyword\", \"lvimgrep\"],\r\n\t[\"keyword\", \"lvimgrepa\"],\r\n\t[\"keyword\", \"lvimgrepadd\"],\r\n\t[\"keyword\", \"lw\"],\r\n\t[\"keyword\", \"lwindow\"],\r\n\t[\"keyword\", \"mak\"],\r\n\t[\"keyword\", \"make\"],\r\n\t[\"keyword\", \"ma\"],\r\n\t[\"keyword\", \"mark\"],\r\n\t[\"keyword\", \"marks\"],\r\n\t[\"keyword\", \"mat\"],\r\n\t[\"keyword\", \"match\"],\r\n\t[\"keyword\", \"menut\"],\r\n\t[\"keyword\", \"menutranslate\"],\r\n\t[\"keyword\", \"mk\"],\r\n\t[\"keyword\", \"mkexrc\"],\r\n\t[\"keyword\", \"mks\"],\r\n\t[\"keyword\", \"mksession\"],\r\n\t[\"keyword\", \"mksp\"],\r\n\t[\"keyword\", \"mkspell\"],\r\n\t[\"keyword\", \"mkvie\"],\r\n\t[\"keyword\", \"mkview\"],\r\n\t[\"keyword\", \"mkv\"],\r\n\t[\"keyword\", \"mkvimrc\"],\r\n\t[\"keyword\", \"mod\"],\r\n\t[\"keyword\", \"mode\"],\r\n\t[\"keyword\", \"m\"],\r\n\t[\"keyword\", \"move\"],\r\n\t[\"keyword\", \"mzf\"],\r\n\t[\"keyword\", \"mzfile\"],\r\n\t[\"keyword\", \"mz\"],\r\n\t[\"keyword\", \"mzscheme\"],\r\n\t[\"keyword\", \"nbkey\"],\r\n\t[\"keyword\", \"new\"],\r\n\t[\"keyword\", \"n\"],\r\n\t[\"keyword\", \"next\"],\r\n\t[\"keyword\", \"N\"],\r\n\t[\"keyword\", \"Next\"],\r\n\t[\"keyword\", \"nmapc\"],\r\n\t[\"keyword\", \"nmapclear\"],\r\n\t[\"keyword\", \"noh\"],\r\n\t[\"keyword\", \"nohlsearch\"],\r\n\t[\"keyword\", \"norea\"],\r\n\t[\"keyword\", \"noreabbrev\"],\r\n\t[\"keyword\", \"nu\"],\r\n\t[\"keyword\", \"number\"],\r\n\t[\"keyword\", \"nun\"],\r\n\t[\"keyword\", \"nunmap\"],\r\n\t[\"keyword\", \"omapc\"],\r\n\t[\"keyword\", \"omapclear\"],\r\n\t[\"keyword\", \"on\"],\r\n\t[\"keyword\", \"only\"],\r\n\t[\"keyword\", \"o\"],\r\n\t[\"keyword\", \"open\"],\r\n\t[\"keyword\", \"opt\"],\r\n\t[\"keyword\", \"options\"],\r\n\t[\"keyword\", \"ou\"],\r\n\t[\"keyword\", \"ounmap\"],\r\n\t[\"keyword\", \"pc\"],\r\n\t[\"keyword\", \"pclose\"],\r\n\t[\"keyword\", \"ped\"],\r\n\t[\"keyword\", \"pedit\"],\r\n\t[\"keyword\", \"pe\"],\r\n\t[\"keyword\", \"perl\"],\r\n\t[\"keyword\", \"perld\"],\r\n\t[\"keyword\", \"perldo\"],\r\n\t[\"keyword\", \"po\"],\r\n\t[\"keyword\", \"pop\"],\r\n\t[\"keyword\", \"popu\"],\r\n\t[\"keyword\", \"popu\"],\r\n\t[\"keyword\", \"popup\"],\r\n\t[\"keyword\", \"pp\"],\r\n\t[\"keyword\", \"ppop\"],\r\n\t[\"keyword\", \"pre\"],\r\n\t[\"keyword\", \"preserve\"],\r\n\t[\"keyword\", \"prev\"],\r\n\t[\"keyword\", \"previous\"],\r\n\t[\"keyword\", \"p\"],\r\n\t[\"keyword\", \"print\"],\r\n\t[\"keyword\", \"P\"],\r\n\t[\"keyword\", \"Print\"],\r\n\t[\"keyword\", \"profd\"],\r\n\t[\"keyword\", \"profdel\"],\r\n\t[\"keyword\", \"prof\"],\r\n\t[\"keyword\", \"profile\"],\r\n\t[\"keyword\", \"promptf\"],\r\n\t[\"keyword\", \"promptfind\"],\r\n\t[\"keyword\", \"promptr\"],\r\n\t[\"keyword\", \"promptrepl\"],\r\n\t[\"keyword\", \"ps\"],\r\n\t[\"keyword\", \"psearch\"],\r\n\t[\"keyword\", \"pta\"],\r\n\t[\"keyword\", \"ptag\"],\r\n\t[\"keyword\", \"ptf\"],\r\n\t[\"keyword\", \"ptfirst\"],\r\n\t[\"keyword\", \"ptj\"],\r\n\t[\"keyword\", \"ptjump\"],\r\n\t[\"keyword\", \"ptl\"],\r\n\t[\"keyword\", \"ptlast\"],\r\n\t[\"keyword\", \"ptn\"],\r\n\t[\"keyword\", \"ptnext\"],\r\n\t[\"keyword\", \"ptN\"],\r\n\t[\"keyword\", \"ptNext\"],\r\n\t[\"keyword\", \"ptp\"],\r\n\t[\"keyword\", \"ptprevious\"],\r\n\t[\"keyword\", \"ptr\"],\r\n\t[\"keyword\", \"ptrewind\"],\r\n\t[\"keyword\", \"pts\"],\r\n\t[\"keyword\", \"ptselect\"],\r\n\t[\"keyword\", \"pu\"],\r\n\t[\"keyword\", \"put\"],\r\n\t[\"keyword\", \"pw\"],\r\n\t[\"keyword\", \"pwd\"],\r\n\t[\"keyword\", \"pyf\"],\r\n\t[\"keyword\", \"pyfile\"],\r\n\t[\"keyword\", \"py\"],\r\n\t[\"keyword\", \"python\"],\r\n\t[\"keyword\", \"qa\"],\r\n\t[\"keyword\", \"qall\"],\r\n\t[\"keyword\", \"q\"],\r\n\t[\"keyword\", \"quit\"],\r\n\t[\"keyword\", \"quita\"],\r\n\t[\"keyword\", \"quitall\"],\r\n\t[\"keyword\", \"r\"],\r\n\t[\"keyword\", \"read\"],\r\n\t[\"keyword\", \"rec\"],\r\n\t[\"keyword\", \"recover\"],\r\n\t[\"keyword\", \"redi\"],\r\n\t[\"keyword\", \"redir\"],\r\n\t[\"keyword\", \"red\"],\r\n\t[\"keyword\", \"redo\"],\r\n\t[\"keyword\", \"redr\"],\r\n\t[\"keyword\", \"redraw\"],\r\n\t[\"keyword\", \"redraws\"],\r\n\t[\"keyword\", \"redrawstatus\"],\r\n\t[\"keyword\", \"reg\"],\r\n\t[\"keyword\", \"registers\"],\r\n\t[\"keyword\", \"res\"],\r\n\t[\"keyword\", \"resize\"],\r\n\t[\"keyword\", \"ret\"],\r\n\t[\"keyword\", \"retab\"],\r\n\t[\"keyword\", \"retu\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"rew\"],\r\n\t[\"keyword\", \"rewind\"],\r\n\t[\"keyword\", \"ri\"],\r\n\t[\"keyword\", \"right\"],\r\n\t[\"keyword\", \"rightb\"],\r\n\t[\"keyword\", \"rightbelow\"],\r\n\t[\"keyword\", \"rub\"],\r\n\t[\"keyword\", \"ruby\"],\r\n\t[\"keyword\", \"rubyd\"],\r\n\t[\"keyword\", \"rubydo\"],\r\n\t[\"keyword\", \"rubyf\"],\r\n\t[\"keyword\", \"rubyfile\"],\r\n\t[\"keyword\", \"ru\"],\r\n\t[\"keyword\", \"runtime\"],\r\n\t[\"keyword\", \"rv\"],\r\n\t[\"keyword\", \"rviminfo\"],\r\n\t[\"keyword\", \"sal\"],\r\n\t[\"keyword\", \"sall\"],\r\n\t[\"keyword\", \"san\"],\r\n\t[\"keyword\", \"sandbox\"],\r\n\t[\"keyword\", \"sa\"],\r\n\t[\"keyword\", \"sargument\"],\r\n\t[\"keyword\", \"sav\"],\r\n\t[\"keyword\", \"saveas\"],\r\n\t[\"keyword\", \"sba\"],\r\n\t[\"keyword\", \"sball\"],\r\n\t[\"keyword\", \"sbf\"],\r\n\t[\"keyword\", \"sbfirst\"],\r\n\t[\"keyword\", \"sbl\"],\r\n\t[\"keyword\", \"sblast\"],\r\n\t[\"keyword\", \"sbm\"],\r\n\t[\"keyword\", \"sbmodified\"],\r\n\t[\"keyword\", \"sbn\"],\r\n\t[\"keyword\", \"sbnext\"],\r\n\t[\"keyword\", \"sbN\"],\r\n\t[\"keyword\", \"sbNext\"],\r\n\t[\"keyword\", \"sbp\"],\r\n\t[\"keyword\", \"sbprevious\"],\r\n\t[\"keyword\", \"sbr\"],\r\n\t[\"keyword\", \"sbrewind\"],\r\n\t[\"keyword\", \"sb\"],\r\n\t[\"keyword\", \"sbuffer\"],\r\n\t[\"keyword\", \"scripte\"],\r\n\t[\"keyword\", \"scriptencoding\"],\r\n\t[\"keyword\", \"scrip\"],\r\n\t[\"keyword\", \"scriptnames\"],\r\n\t[\"keyword\", \"se\"],\r\n\t[\"keyword\", \"set\"],\r\n\t[\"keyword\", \"setf\"],\r\n\t[\"keyword\", \"setfiletype\"],\r\n\t[\"keyword\", \"setg\"],\r\n\t[\"keyword\", \"setglobal\"],\r\n\t[\"keyword\", \"setl\"],\r\n\t[\"keyword\", \"setlocal\"],\r\n\t[\"keyword\", \"sf\"],\r\n\t[\"keyword\", \"sfind\"],\r\n\t[\"keyword\", \"sfir\"],\r\n\t[\"keyword\", \"sfirst\"],\r\n\t[\"keyword\", \"sh\"],\r\n\t[\"keyword\", \"shell\"],\r\n\t[\"keyword\", \"sign\"],\r\n\t[\"keyword\", \"sil\"],\r\n\t[\"keyword\", \"silent\"],\r\n\t[\"keyword\", \"sim\"],\r\n\t[\"keyword\", \"simalt\"],\r\n\t[\"keyword\", \"sla\"],\r\n\t[\"keyword\", \"slast\"],\r\n\t[\"keyword\", \"sl\"],\r\n\t[\"keyword\", \"sleep\"],\r\n\t[\"keyword\", \"sm\"],\r\n\t[\"keyword\", \"smagic\"],\r\n\t[\"keyword\", \"sm\"],\r\n\t[\"keyword\", \"smap\"],\r\n\t[\"keyword\", \"smapc\"],\r\n\t[\"keyword\", \"smapclear\"],\r\n\t[\"keyword\", \"sme\"],\r\n\t[\"keyword\", \"smenu\"],\r\n\t[\"keyword\", \"sn\"],\r\n\t[\"keyword\", \"snext\"],\r\n\t[\"keyword\", \"sN\"],\r\n\t[\"keyword\", \"sNext\"],\r\n\t[\"keyword\", \"sni\"],\r\n\t[\"keyword\", \"sniff\"],\r\n\t[\"keyword\", \"sno\"],\r\n\t[\"keyword\", \"snomagic\"],\r\n\t[\"keyword\", \"snor\"],\r\n\t[\"keyword\", \"snoremap\"],\r\n\t[\"keyword\", \"snoreme\"],\r\n\t[\"keyword\", \"snoremenu\"],\r\n\t[\"keyword\", \"sor\"],\r\n\t[\"keyword\", \"sort\"],\r\n\t[\"keyword\", \"so\"],\r\n\t[\"keyword\", \"source\"],\r\n\t[\"keyword\", \"spelld\"],\r\n\t[\"keyword\", \"spelldump\"],\r\n\t[\"keyword\", \"spe\"],\r\n\t[\"keyword\", \"spellgood\"],\r\n\t[\"keyword\", \"spelli\"],\r\n\t[\"keyword\", \"spellinfo\"],\r\n\t[\"keyword\", \"spellr\"],\r\n\t[\"keyword\", \"spellrepall\"],\r\n\t[\"keyword\", \"spellu\"],\r\n\t[\"keyword\", \"spellundo\"],\r\n\t[\"keyword\", \"spellw\"],\r\n\t[\"keyword\", \"spellwrong\"],\r\n\t[\"keyword\", \"sp\"],\r\n\t[\"keyword\", \"split\"],\r\n\t[\"keyword\", \"spr\"],\r\n\t[\"keyword\", \"sprevious\"],\r\n\t[\"keyword\", \"sre\"],\r\n\t[\"keyword\", \"srewind\"],\r\n\t[\"keyword\", \"sta\"],\r\n\t[\"keyword\", \"stag\"],\r\n\t[\"keyword\", \"startg\"],\r\n\t[\"keyword\", \"startgreplace\"],\r\n\t[\"keyword\", \"star\"],\r\n\t[\"keyword\", \"startinsert\"],\r\n\t[\"keyword\", \"startr\"],\r\n\t[\"keyword\", \"startreplace\"],\r\n\t[\"keyword\", \"stj\"],\r\n\t[\"keyword\", \"stjump\"],\r\n\t[\"keyword\", \"st\"],\r\n\t[\"keyword\", \"stop\"],\r\n\t[\"keyword\", \"stopi\"],\r\n\t[\"keyword\", \"stopinsert\"],\r\n\t[\"keyword\", \"sts\"],\r\n\t[\"keyword\", \"stselect\"],\r\n\t[\"keyword\", \"sun\"],\r\n\t[\"keyword\", \"sunhide\"],\r\n\t[\"keyword\", \"sunm\"],\r\n\t[\"keyword\", \"sunmap\"],\r\n\t[\"keyword\", \"sus\"],\r\n\t[\"keyword\", \"suspend\"],\r\n\t[\"keyword\", \"sv\"],\r\n\t[\"keyword\", \"sview\"],\r\n\t[\"keyword\", \"syncbind\"],\r\n\t[\"keyword\", \"t\"],\r\n\t[\"keyword\", \"tab\"],\r\n\t[\"keyword\", \"tabc\"],\r\n\t[\"keyword\", \"tabclose\"],\r\n\t[\"keyword\", \"tabd\"],\r\n\t[\"keyword\", \"tabdo\"],\r\n\t[\"keyword\", \"tabe\"],\r\n\t[\"keyword\", \"tabedit\"],\r\n\t[\"keyword\", \"tabf\"],\r\n\t[\"keyword\", \"tabfind\"],\r\n\t[\"keyword\", \"tabfir\"],\r\n\t[\"keyword\", \"tabfirst\"],\r\n\t[\"keyword\", \"tabl\"],\r\n\t[\"keyword\", \"tablast\"],\r\n\t[\"keyword\", \"tabm\"],\r\n\t[\"keyword\", \"tabmove\"],\r\n\t[\"keyword\", \"tabnew\"],\r\n\t[\"keyword\", \"tabn\"],\r\n\t[\"keyword\", \"tabnext\"],\r\n\t[\"keyword\", \"tabN\"],\r\n\t[\"keyword\", \"tabNext\"],\r\n\t[\"keyword\", \"tabo\"],\r\n\t[\"keyword\", \"tabonly\"],\r\n\t[\"keyword\", \"tabp\"],\r\n\t[\"keyword\", \"tabprevious\"],\r\n\t[\"keyword\", \"tabr\"],\r\n\t[\"keyword\", \"tabrewind\"],\r\n\t[\"keyword\", \"tabs\"],\r\n\t[\"keyword\", \"ta\"],\r\n\t[\"keyword\", \"tag\"],\r\n\t[\"keyword\", \"tags\"],\r\n\t[\"keyword\", \"tc\"],\r\n\t[\"keyword\", \"tcl\"],\r\n\t[\"keyword\", \"tcld\"],\r\n\t[\"keyword\", \"tcldo\"],\r\n\t[\"keyword\", \"tclf\"],\r\n\t[\"keyword\", \"tclfile\"],\r\n\t[\"keyword\", \"te\"],\r\n\t[\"keyword\", \"tearoff\"],\r\n\t[\"keyword\", \"tf\"],\r\n\t[\"keyword\", \"tfirst\"],\r\n\t[\"keyword\", \"th\"],\r\n\t[\"keyword\", \"throw\"],\r\n\t[\"keyword\", \"tj\"],\r\n\t[\"keyword\", \"tjump\"],\r\n\t[\"keyword\", \"tl\"],\r\n\t[\"keyword\", \"tlast\"],\r\n\t[\"keyword\", \"tm\"],\r\n\t[\"keyword\", \"tm\"],\r\n\t[\"keyword\", \"tmenu\"],\r\n\t[\"keyword\", \"tn\"],\r\n\t[\"keyword\", \"tnext\"],\r\n\t[\"keyword\", \"tN\"],\r\n\t[\"keyword\", \"tNext\"],\r\n\t[\"keyword\", \"to\"],\r\n\t[\"keyword\", \"topleft\"],\r\n\t[\"keyword\", \"tp\"],\r\n\t[\"keyword\", \"tprevious\"],\r\n\t[\"keyword\", \"tr\"],\r\n\t[\"keyword\", \"trewind\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"ts\"],\r\n\t[\"keyword\", \"tselect\"],\r\n\t[\"keyword\", \"tu\"],\r\n\t[\"keyword\", \"tu\"],\r\n\t[\"keyword\", \"tunmenu\"],\r\n\t[\"keyword\", \"una\"],\r\n\t[\"keyword\", \"unabbreviate\"],\r\n\t[\"keyword\", \"u\"],\r\n\t[\"keyword\", \"undo\"],\r\n\t[\"keyword\", \"undoj\"],\r\n\t[\"keyword\", \"undojoin\"],\r\n\t[\"keyword\", \"undol\"],\r\n\t[\"keyword\", \"undolist\"],\r\n\t[\"keyword\", \"unh\"],\r\n\t[\"keyword\", \"unhide\"],\r\n\t[\"keyword\", \"unlet\"],\r\n\t[\"keyword\", \"unlo\"],\r\n\t[\"keyword\", \"unlockvar\"],\r\n\t[\"keyword\", \"unm\"],\r\n\t[\"keyword\", \"unmap\"],\r\n\t[\"keyword\", \"up\"],\r\n\t[\"keyword\", \"update\"],\r\n\t[\"keyword\", \"verb\"],\r\n\t[\"keyword\", \"verbose\"],\r\n\t[\"keyword\", \"ve\"],\r\n\t[\"keyword\", \"version\"],\r\n\t[\"keyword\", \"vert\"],\r\n\t[\"keyword\", \"vertical\"],\r\n\t[\"keyword\", \"vie\"],\r\n\t[\"keyword\", \"view\"],\r\n\t[\"keyword\", \"vim\"],\r\n\t[\"keyword\", \"vimgrep\"],\r\n\t[\"keyword\", \"vimgrepa\"],\r\n\t[\"keyword\", \"vimgrepadd\"],\r\n\t[\"keyword\", \"vi\"],\r\n\t[\"keyword\", \"visual\"],\r\n\t[\"keyword\", \"viu\"],\r\n\t[\"keyword\", \"viusage\"],\r\n\t[\"keyword\", \"vmapc\"],\r\n\t[\"keyword\", \"vmapclear\"],\r\n\t[\"keyword\", \"vne\"],\r\n\t[\"keyword\", \"vnew\"],\r\n\t[\"keyword\", \"vs\"],\r\n\t[\"keyword\", \"vsplit\"],\r\n\t[\"keyword\", \"vu\"],\r\n\t[\"keyword\", \"vunmap\"],\r\n\t[\"keyword\", \"wa\"],\r\n\t[\"keyword\", \"wall\"],\r\n\t[\"keyword\", \"wh\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"keyword\", \"winc\"],\r\n\t[\"keyword\", \"wincmd\"],\r\n\t[\"keyword\", \"windo\"],\r\n\t[\"keyword\", \"winp\"],\r\n\t[\"keyword\", \"winpos\"],\r\n\t[\"keyword\", \"win\"],\r\n\t[\"keyword\", \"winsize\"],\r\n\t[\"keyword\", \"wn\"],\r\n\t[\"keyword\", \"wnext\"],\r\n\t[\"keyword\", \"wN\"],\r\n\t[\"keyword\", \"wNext\"],\r\n\t[\"keyword\", \"wp\"],\r\n\t[\"keyword\", \"wprevious\"],\r\n\t[\"keyword\", \"wq\"],\r\n\t[\"keyword\", \"wqa\"],\r\n\t[\"keyword\", \"wqall\"],\r\n\t[\"keyword\", \"w\"],\r\n\t[\"keyword\", \"write\"],\r\n\t[\"keyword\", \"ws\"],\r\n\t[\"keyword\", \"wsverb\"],\r\n\t[\"keyword\", \"wv\"],\r\n\t[\"keyword\", \"wviminfo\"],\r\n\t[\"keyword\", \"X\"],\r\n\t[\"keyword\", \"xa\"],\r\n\t[\"keyword\", \"xall\"],\r\n\t[\"keyword\", \"x\"],\r\n\t[\"keyword\", \"xit\"],\r\n\t[\"keyword\", \"xm\"],\r\n\t[\"keyword\", \"xmap\"],\r\n\t[\"keyword\", \"xmapc\"],\r\n\t[\"keyword\", \"xmapclear\"],\r\n\t[\"keyword\", \"xme\"],\r\n\t[\"keyword\", \"xmenu\"],\r\n\t[\"keyword\", \"XMLent\"],\r\n\t[\"keyword\", \"XMLns\"],\r\n\t[\"keyword\", \"xn\"],\r\n\t[\"keyword\", \"xnoremap\"],\r\n\t[\"keyword\", \"xnoreme\"],\r\n\t[\"keyword\", \"xnoremenu\"],\r\n\t[\"keyword\", \"xu\"],\r\n\t[\"keyword\", \"xunmap\"],\r\n\t[\"keyword\", \"y\"],\r\n\t[\"keyword\", \"yank\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/vim/number_feature.test",
    "content": "0xBadFace\r\n42\r\n3.14159\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/vim/operator_feature.test",
    "content": "|| &&\r\n? * / %\r\n+ +=\r\n- -=\r\n. .=\r\n= == =~\r\n==# =~# ==? =~?\r\n! != !~\r\n!=# !~# !=? !~?\r\n< <=\r\n<# <=# <? <=?\r\n> >=\r\n># >=# >? >=?\r\nis isnot\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"||\"], [\"operator\", \"&&\"],\r\n\t[\"operator\", \"?\"], [\"operator\", \"*\"], [\"operator\", \"/\"], [\"operator\", \"%\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"+=\"],\r\n\t[\"operator\", \"-\"], [\"operator\", \"-=\"],\r\n\t[\"operator\", \".\"], [\"operator\", \".=\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"=~\"],\r\n\t[\"operator\", \"==#\"], [\"operator\", \"=~#\"], [\"operator\", \"==?\"], [\"operator\", \"=~?\"],\r\n\t[\"operator\", \"!\"], [\"operator\", \"!=\"], [\"operator\", \"!~\"],\r\n\t[\"operator\", \"!=#\"], [\"operator\", \"!~#\"], [\"operator\", \"!=?\"], [\"operator\", \"!~?\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \"<#\"], [\"operator\", \"<=#\"], [\"operator\", \"<?\"], [\"operator\", \"<=?\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \">#\"], [\"operator\", \">=#\"], [\"operator\", \">?\"], [\"operator\", \">=?\"],\r\n\t[\"operator\", \"is\"], [\"operator\", \"isnot\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators."
  },
  {
    "path": "tests/languages/vim/string_feature.test",
    "content": "\"\"\r\n\"Fo\\\"ob'ar\"\r\n''\r\n'\\'\r\n'Foo''bar'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Fo\\\\\\\"ob'ar\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'\\\\'\"],\r\n\t[\"string\", \"'Foo''bar'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/visual-basic/boolean_feature.test",
    "content": "True\r\nFalse\r\nNothing\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"True\"],\r\n\t[\"boolean\", \"False\"],\r\n\t[\"boolean\", \"Nothing\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/visual-basic/comment_feature.test",
    "content": "'\r\n' Foo \"bar\"\r\n‘\r\n‘ Foobar\r\n’\r\n’ Foobar\r\nREM\r\nREM Foobar\r\n\r\n' multi-line _\r\n  comment\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", [\"'\"]],\r\n\t[\"comment\", [\"' Foo \\\"bar\\\"\"]],\r\n\t[\"comment\", [\"‘\"]],\r\n\t[\"comment\", [\"‘ Foobar\"]],\r\n\t[\"comment\", [\"’\"]],\r\n\t[\"comment\", [\"’ Foobar\"]],\r\n\t[\"comment\", [[\"keyword\", \"REM\"]]],\r\n\t[\"comment\", [[\"keyword\", \"REM\"], \" Foobar\"]],\r\n\t[\"comment\", [\"' multi-line _\\r\\n  comment\"]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/visual-basic/date_feature.test",
    "content": "# 8/23/1970 3:45:39AM #\r\n#8/23/1970 #\r\n# 3:45:39AM #\r\n# 3:45:39#\r\n# 13:45:39 #\r\n# 1AM #\r\n# 13:45:39PM #\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"date\", \"# 8/23/1970 3:45:39AM #\"],\r\n\t[\"date\", \"#8/23/1970 #\"],\r\n\t[\"date\", \"# 3:45:39AM #\"],\r\n\t[\"date\", \"# 3:45:39#\"],\r\n\t[\"date\", \"# 13:45:39 #\"],\r\n\t[\"date\", \"# 1AM #\"],\r\n\t[\"date\", \"# 13:45:39PM #\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for dates and times."
  },
  {
    "path": "tests/languages/visual-basic/directive_feature.test",
    "content": "#Const DebugCode = True\r\n#If DebugCode Then\r\n#End If\r\n#ExternalSource(\"c:\\wwwroot\\inetpub\\test.aspx\", 30)\r\n#End ExternalSource\r\n#ExternalChecksum(\"c:\\wwwroot\\inetpub\\test.aspx\", _\r\n    \"{12345678-1234-1234-1234-123456789abc}\", _\r\n    \"1a2b3c4e5f617239a49b9a9c0391849d34950f923fab9484\")\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"#Const DebugCode = True\"],\r\n\t[\"directive\", \"#If DebugCode Then\"],\r\n\t[\"directive\", \"#End If\"],\r\n\t[\"directive\", \"#ExternalSource(\\\"c:\\\\wwwroot\\\\inetpub\\\\test.aspx\\\", 30)\"],\r\n\t[\"directive\", \"#End ExternalSource\"],\r\n\t[\"directive\", \"#ExternalChecksum(\\\"c:\\\\wwwroot\\\\inetpub\\\\test.aspx\\\", _\\r\\n    \\\"{12345678-1234-1234-1234-123456789abc}\\\", _\\r\\n    \\\"1a2b3c4e5f617239a49b9a9c0391849d34950f923fab9484\\\")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for preprocessing directives."
  },
  {
    "path": "tests/languages/visual-basic/keyword_feature.test",
    "content": "AddHandler\r\nAddressOf\r\nAlias\r\nAnd\r\nAndAlso\r\nAs\r\nBoolean\r\nByRef\r\nByte\r\nByVal\r\nCall\r\nCase\r\nCatch\r\nCBool\r\nCByte\r\nCChar\r\nCDate\r\nCDbl\r\nCDec\r\nChar\r\nCInt\r\nClass\r\nCLng\r\nCObj\r\nConst\r\nContinue\r\nCSByte\r\nCShort\r\nCSng\r\nCStr\r\nCType\r\nCUInt\r\nCULng\r\nCUShort\r\nCurrency\r\nDate\r\nDecimal\r\nDeclare\r\nDefault\r\nDelegate\r\nDim\r\nDirectCast\r\nDo\r\nDouble\r\nEach\r\nElse\r\nElseIf\r\nEnd\r\nEndIf\r\nEnum\r\nErase\r\nError\r\nEvent\r\nExit\r\nFinally\r\nFor\r\nFriend\r\nFunction\r\nGet\r\nGetType\r\nGetXMLNamespace\r\nGlobal\r\nGoSub\r\nGoTo\r\nHandles\r\nIf\r\nImplements\r\nImports\r\nIn\r\nInherits\r\nInteger\r\nInterface\r\nIs\r\nIsNot\r\nLet\r\nLib\r\nLike\r\nLong\r\nLoop\r\nMe\r\nMod\r\nModule\r\nMustInherit\r\nMustOverride\r\nMyBase\r\nMyClass\r\nNamespace\r\nNarrowing\r\nNew\r\nNext\r\nNot\r\nNotInheritable\r\nNotOverridable\r\nObject\r\nOf\r\nOn\r\nOperator\r\nOption\r\nOptional\r\nOr\r\nOrElse\r\nOut\r\nOverloads\r\nOverridable\r\nOverrides\r\nParamArray\r\nPartial\r\nPrivate\r\nProperty\r\nProtected\r\nPublic\r\nRaiseEvent\r\nReadOnly\r\nReDim\r\nRemoveHandler\r\nResume\r\nReturn\r\nSByte\r\nSelect\r\nSet\r\nShadows\r\nShared\r\nshort\r\nSingle\r\nStatic\r\nStep\r\nStop\r\nString\r\nStructure\r\nSub\r\nSyncLock\r\nThen\r\nThrow\r\nTo\r\nTry\r\nTryCast\r\nType\r\nTypeOf\r\nUInteger\r\nULong\r\nUShort\r\nUsing\r\nVariant\r\nWend\r\nWhen\r\nWhile\r\nWidening\r\nWith\r\nWithEvents\r\nWriteOnly\r\nUntil\r\nXor\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"AddHandler\"],\r\n\t[\"keyword\", \"AddressOf\"],\r\n\t[\"keyword\", \"Alias\"],\r\n\t[\"keyword\", \"And\"],\r\n\t[\"keyword\", \"AndAlso\"],\r\n\t[\"keyword\", \"As\"],\r\n\t[\"keyword\", \"Boolean\"],\r\n\t[\"keyword\", \"ByRef\"],\r\n\t[\"keyword\", \"Byte\"],\r\n\t[\"keyword\", \"ByVal\"],\r\n\t[\"keyword\", \"Call\"],\r\n\t[\"keyword\", \"Case\"],\r\n\t[\"keyword\", \"Catch\"],\r\n\t[\"keyword\", \"CBool\"],\r\n\t[\"keyword\", \"CByte\"],\r\n\t[\"keyword\", \"CChar\"],\r\n\t[\"keyword\", \"CDate\"],\r\n\t[\"keyword\", \"CDbl\"],\r\n\t[\"keyword\", \"CDec\"],\r\n\t[\"keyword\", \"Char\"],\r\n\t[\"keyword\", \"CInt\"],\r\n\t[\"keyword\", \"Class\"],\r\n\t[\"keyword\", \"CLng\"],\r\n\t[\"keyword\", \"CObj\"],\r\n\t[\"keyword\", \"Const\"],\r\n\t[\"keyword\", \"Continue\"],\r\n\t[\"keyword\", \"CSByte\"],\r\n\t[\"keyword\", \"CShort\"],\r\n\t[\"keyword\", \"CSng\"],\r\n\t[\"keyword\", \"CStr\"],\r\n\t[\"keyword\", \"CType\"],\r\n\t[\"keyword\", \"CUInt\"],\r\n\t[\"keyword\", \"CULng\"],\r\n\t[\"keyword\", \"CUShort\"],\r\n\t[\"keyword\", \"Currency\"],\r\n\t[\"keyword\", \"Date\"],\r\n\t[\"keyword\", \"Decimal\"],\r\n\t[\"keyword\", \"Declare\"],\r\n\t[\"keyword\", \"Default\"],\r\n\t[\"keyword\", \"Delegate\"],\r\n\t[\"keyword\", \"Dim\"],\r\n\t[\"keyword\", \"DirectCast\"],\r\n\t[\"keyword\", \"Do\"],\r\n\t[\"keyword\", \"Double\"],\r\n\t[\"keyword\", \"Each\"],\r\n\t[\"keyword\", \"Else\"],\r\n\t[\"keyword\", \"ElseIf\"],\r\n\t[\"keyword\", \"End\"],\r\n\t[\"keyword\", \"EndIf\"],\r\n\t[\"keyword\", \"Enum\"],\r\n\t[\"keyword\", \"Erase\"],\r\n\t[\"keyword\", \"Error\"],\r\n\t[\"keyword\", \"Event\"],\r\n\t[\"keyword\", \"Exit\"],\r\n\t[\"keyword\", \"Finally\"],\r\n\t[\"keyword\", \"For\"],\r\n\t[\"keyword\", \"Friend\"],\r\n\t[\"keyword\", \"Function\"],\r\n\t[\"keyword\", \"Get\"],\r\n\t[\"keyword\", \"GetType\"],\r\n\t[\"keyword\", \"GetXMLNamespace\"],\r\n\t[\"keyword\", \"Global\"],\r\n\t[\"keyword\", \"GoSub\"],\r\n\t[\"keyword\", \"GoTo\"],\r\n\t[\"keyword\", \"Handles\"],\r\n\t[\"keyword\", \"If\"],\r\n\t[\"keyword\", \"Implements\"],\r\n\t[\"keyword\", \"Imports\"],\r\n\t[\"keyword\", \"In\"],\r\n\t[\"keyword\", \"Inherits\"],\r\n\t[\"keyword\", \"Integer\"],\r\n\t[\"keyword\", \"Interface\"],\r\n\t[\"keyword\", \"Is\"],\r\n\t[\"keyword\", \"IsNot\"],\r\n\t[\"keyword\", \"Let\"],\r\n\t[\"keyword\", \"Lib\"],\r\n\t[\"keyword\", \"Like\"],\r\n\t[\"keyword\", \"Long\"],\r\n\t[\"keyword\", \"Loop\"],\r\n\t[\"keyword\", \"Me\"],\r\n\t[\"keyword\", \"Mod\"],\r\n\t[\"keyword\", \"Module\"],\r\n\t[\"keyword\", \"MustInherit\"],\r\n\t[\"keyword\", \"MustOverride\"],\r\n\t[\"keyword\", \"MyBase\"],\r\n\t[\"keyword\", \"MyClass\"],\r\n\t[\"keyword\", \"Namespace\"],\r\n\t[\"keyword\", \"Narrowing\"],\r\n\t[\"keyword\", \"New\"],\r\n\t[\"keyword\", \"Next\"],\r\n\t[\"keyword\", \"Not\"],\r\n\t[\"keyword\", \"NotInheritable\"],\r\n\t[\"keyword\", \"NotOverridable\"],\r\n\t[\"keyword\", \"Object\"],\r\n\t[\"keyword\", \"Of\"],\r\n\t[\"keyword\", \"On\"],\r\n\t[\"keyword\", \"Operator\"],\r\n\t[\"keyword\", \"Option\"],\r\n\t[\"keyword\", \"Optional\"],\r\n\t[\"keyword\", \"Or\"],\r\n\t[\"keyword\", \"OrElse\"],\r\n\t[\"keyword\", \"Out\"],\r\n\t[\"keyword\", \"Overloads\"],\r\n\t[\"keyword\", \"Overridable\"],\r\n\t[\"keyword\", \"Overrides\"],\r\n\t[\"keyword\", \"ParamArray\"],\r\n\t[\"keyword\", \"Partial\"],\r\n\t[\"keyword\", \"Private\"],\r\n\t[\"keyword\", \"Property\"],\r\n\t[\"keyword\", \"Protected\"],\r\n\t[\"keyword\", \"Public\"],\r\n\t[\"keyword\", \"RaiseEvent\"],\r\n\t[\"keyword\", \"ReadOnly\"],\r\n\t[\"keyword\", \"ReDim\"],\r\n\t[\"keyword\", \"RemoveHandler\"],\r\n\t[\"keyword\", \"Resume\"],\r\n\t[\"keyword\", \"Return\"],\r\n\t[\"keyword\", \"SByte\"],\r\n\t[\"keyword\", \"Select\"],\r\n\t[\"keyword\", \"Set\"],\r\n\t[\"keyword\", \"Shadows\"],\r\n\t[\"keyword\", \"Shared\"],\r\n\t[\"keyword\", \"short\"],\r\n\t[\"keyword\", \"Single\"],\r\n\t[\"keyword\", \"Static\"],\r\n\t[\"keyword\", \"Step\"],\r\n\t[\"keyword\", \"Stop\"],\r\n\t[\"keyword\", \"String\"],\r\n\t[\"keyword\", \"Structure\"],\r\n\t[\"keyword\", \"Sub\"],\r\n\t[\"keyword\", \"SyncLock\"],\r\n\t[\"keyword\", \"Then\"],\r\n\t[\"keyword\", \"Throw\"],\r\n\t[\"keyword\", \"To\"],\r\n\t[\"keyword\", \"Try\"],\r\n\t[\"keyword\", \"TryCast\"],\r\n\t[\"keyword\", \"Type\"],\r\n\t[\"keyword\", \"TypeOf\"],\r\n\t[\"keyword\", \"UInteger\"],\r\n\t[\"keyword\", \"ULong\"],\r\n\t[\"keyword\", \"UShort\"],\r\n\t[\"keyword\", \"Using\"],\r\n\t[\"keyword\", \"Variant\"],\r\n\t[\"keyword\", \"Wend\"],\r\n\t[\"keyword\", \"When\"],\r\n\t[\"keyword\", \"While\"],\r\n\t[\"keyword\", \"Widening\"],\r\n\t[\"keyword\", \"With\"],\r\n\t[\"keyword\", \"WithEvents\"],\r\n\t[\"keyword\", \"WriteOnly\"],\r\n\t[\"keyword\", \"Until\"],\r\n\t[\"keyword\", \"Xor\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords.\r\n"
  },
  {
    "path": "tests/languages/visual-basic/number_feature.test",
    "content": "42\r\n42S\r\n42US\r\n&O157I\r\n&O157UI\r\n&HBADFACE42L\r\n&HBADFACE42UL\r\n4F\r\n0.4\r\n3.1415R\r\n.24\r\n4E7D\r\n12.87E-8\r\n.369E+14\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"42S\"],\r\n\t[\"number\", \"42US\"],\r\n\t[\"number\", \"&O157I\"],\r\n\t[\"number\", \"&O157UI\"],\r\n\t[\"number\", \"&HBADFACE42L\"],\r\n\t[\"number\", \"&HBADFACE42UL\"],\r\n\t[\"number\", \"4F\"],\r\n\t[\"number\", \"0.4\"],\r\n\t[\"number\", \"3.1415R\"],\r\n\t[\"number\", \".24\"],\r\n\t[\"number\", \"4E7D\"],\r\n\t[\"number\", \"12.87E-8\"],\r\n\t[\"number\", \".369E+14\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/visual-basic/operator_feature.test",
    "content": "+ -\r\n* /\r\n\\ ^\r\n< = >\r\n& # @\r\n$ % !\r\nSub Print( _\r\n    Param1 As Integer, _\r\n    Param2 As Integer )\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"], [\"operator\", \"/\"],\r\n\t[\"operator\", \"\\\\\"], [\"operator\", \"^\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"=\"], [\"operator\", \">\"],\r\n\t[\"operator\", \"&\"], [\"operator\", \"#\"], [\"operator\", \"@\"],\r\n\t[\"operator\", \"$\"], [\"operator\", \"%\"], [\"operator\", \"!\"],\r\n\t[\"keyword\", \"Sub\"],\r\n\t\" Print\",\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"operator\", \"_\"],\r\n\t\"\\r\\n    Param1 \",\r\n\t[\"keyword\", \"As\"],\r\n\t[\"keyword\", \"Integer\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"operator\", \"_\"],\r\n\t\"\\r\\n    Param2 \",\r\n\t[\"keyword\", \"As\"],\r\n\t[\"keyword\", \"Integer\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators and type characters."
  },
  {
    "path": "tests/languages/visual-basic/string_feature.test",
    "content": "\"\"\r\n\"Foobar\"\r\n\"Foo\"\"bar\"\r\n“”\r\n“Foo\r\nbar”\r\n“Foo\"\"bar”\r\n““\r\n””\r\n”“\r\n“\"\r\n\"Foo”“ba\r\nr\"\r\n\"a\"c\r\n$\"Foobar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Foobar\\\"\"],\r\n\t[\"string\", \"\\\"Foo\\\"\\\"bar\\\"\"],\r\n\t[\"string\", \"“”\"],\r\n\t[\"string\", \"“Foo\\r\\nbar”\"],\r\n\t[\"string\", \"“Foo\\\"\\\"bar”\"],\r\n\t[\"string\", \"““\"],\r\n\t[\"string\", \"””\"],\r\n\t[\"string\", \"”“\"],\r\n\t[\"string\", \"“\\\"\"],\r\n\t[\"string\", \"\\\"Foo”“ba\\r\\nr\\\"\"],\r\n\t[\"string\", \"\\\"a\\\"c\"],\r\n\t[\"string\", \"$\\\"Foobar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/warpscript/boolean_feature.test",
    "content": "false\r\ntrue\r\nF\r\nT\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"false\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"boolean\", \"F\"],\r\n\t[\"boolean\", \"T\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/warpscript/comment_feature.test",
    "content": "# Python style comments, starting with a '#' and extending to the end of the line\r\n\r\n// Java style comments, extending to the end of the line after the '//'\r\n\r\n/*\r\n C style block comments, possibly spanning multiple lines\r\n*/\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"# Python style comments, starting with a '#' and extending to the end of the line\"],\r\n\t[\"comment\", \"// Java style comments, extending to the end of the line after the '//'\"],\r\n\t[\"comment\", \"/*\\r\\n C style block comments, possibly spanning multiple lines\\r\\n*/\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments.\r\n"
  },
  {
    "path": "tests/languages/warpscript/keyword_feature.test",
    "content": "BREAK\nCHECKMACRO\nCONTINUE\nCUDF\nDEFINED\nDEFINEDMACRO\nEVAL\nFAIL\nFOR\nFOREACH\nFORSTEP\nIFT\nIFTE\nMSGFAIL\nNRETURN\nRETHROW\nRETURN\nSWITCH\nTRY\nUDF\nUNTIL\nWHILE\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"BREAK\"],\n\t[\"keyword\", \"CHECKMACRO\"],\n\t[\"keyword\", \"CONTINUE\"],\n\t[\"keyword\", \"CUDF\"],\n\t[\"keyword\", \"DEFINED\"],\n\t[\"keyword\", \"DEFINEDMACRO\"],\n\t[\"keyword\", \"EVAL\"],\n\t[\"keyword\", \"FAIL\"],\n\t[\"keyword\", \"FOR\"],\n\t[\"keyword\", \"FOREACH\"],\n\t[\"keyword\", \"FORSTEP\"],\n\t[\"keyword\", \"IFT\"],\n\t[\"keyword\", \"IFTE\"],\n\t[\"keyword\", \"MSGFAIL\"],\n\t[\"keyword\", \"NRETURN\"],\n\t[\"keyword\", \"RETHROW\"],\n\t[\"keyword\", \"RETURN\"],\n\t[\"keyword\", \"SWITCH\"],\n\t[\"keyword\", \"TRY\"],\n\t[\"keyword\", \"UDF\"],\n\t[\"keyword\", \"UNTIL\"],\n\t[\"keyword\", \"WHILE\"]\n]\n"
  },
  {
    "path": "tests/languages/warpscript/macro_feature.test",
    "content": "@foo\n\n----------------------------------------------------\n\n[\n\t[\"macro\", \"@foo\"]\n]\n"
  },
  {
    "path": "tests/languages/warpscript/number_feature.test",
    "content": "123\r\n-123\r\n5e4\r\n5e-4\r\n123.546\r\n123.546E-5\r\n\r\n0xFFF\r\n0b10101\r\n\r\nNaN\r\nInfinity\r\n-Infinity\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"-123\"],\r\n\t[\"number\", \"5e4\"],\r\n\t[\"number\", \"5e-4\"],\r\n\t[\"number\", \"123.546\"],\r\n\t[\"number\", \"123.546E-5\"],\r\n\r\n\t[\"number\", \"0xFFF\"],\r\n\t[\"number\", \"0b10101\"],\r\n\r\n\t[\"number\", \"NaN\"],\r\n\t[\"number\", \"Infinity\"],\r\n\t[\"number\", \"-Infinity\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/warpscript/operator_feature.test",
    "content": "!= < > ~= <= == >=\r\n% * + - / **\r\n! && AND OR NOT ||\r\n& ^ | >>> ~ << >>\r\n+!\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"~=\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \">=\"],\r\n\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"**\"],\r\n\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"&&\"],\r\n\t[\"operator\", \"AND\"],\r\n\t[\"operator\", \"OR\"],\r\n\t[\"operator\", \"NOT\"],\r\n\t[\"operator\", \"||\"],\r\n\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \">>>\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \">>\"],\r\n\r\n\t[\"operator\", \"+!\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/warpscript/punctuation_feature.test",
    "content": "<% %>\r\n( ) [ ] { }\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"<%\"],\r\n\t[\"punctuation\", \"%>\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for punctuation.\r\n"
  },
  {
    "path": "tests/languages/warpscript/string_feature.test",
    "content": "'Caf%C3%A9'\r\n\r\n\"foo\"\r\n\r\n<'\r\n foo\r\n'>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"'Caf%C3%A9'\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"<'\\r\\n foo\\r\\n'>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/warpscript/variable_feature.test",
    "content": "$foo\n\n----------------------------------------------------\n\n[\n\t[\"variable\", \"$foo\"]\n]\n"
  },
  {
    "path": "tests/languages/wasm/comment_feature.test",
    "content": ";;\r\n;; Foobar\r\n;; (; foobar ;)\r\n(;;)\r\n(;Foobar;)\r\n(;Foo ;;bar\r\nbaz;)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \";;\"],\r\n\t[\"comment\", \";; Foobar\"],\r\n\t[\"comment\", \";; (; foobar ;)\"],\r\n\t[\"comment\", \"(;;)\"],\r\n\t[\"comment\", \"(;Foobar;)\"],\r\n\t[\"comment\", \"(;Foo ;;bar\\r\\nbaz;)\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/wasm/keyword_feature.test",
    "content": "align=\r\noffset=\r\n\r\nf32\r\nf64\r\ni32\r\ni64\r\ni32.load\r\ni64.load\r\nf32.load\r\nf64.load\r\ni32.load8_s\r\ni32.load8_u\r\ni32.load16_s\r\ni32.load16_u\r\ni64.load8_s\r\ni64.load8_u\r\ni64.load16_s\r\ni64.load16_u\r\ni64.load32_s\r\ni64.load32_u\r\ni32.store\r\ni64.store\r\nf32.store\r\nf64.store\r\ni32.store8\r\ni32.store16\r\ni64.store8\r\ni64.store16\r\ni64.store32\r\ni32.const\r\ni64.const\r\nf32.const\r\nf64.const\r\ni32.clz\r\ni32.ctz\r\ni32.popcnt\r\ni32.add\r\ni32.sub\r\ni32.mul\r\ni32.div_s\r\ni32.div_u\r\ni32.rem_s\r\ni32.rem_u\r\ni32.and\r\ni32.or\r\ni32.xor\r\ni32.shl\r\ni32.shr_s\r\ni32.shr_u\r\ni32.rotl\r\ni32.rotr\r\ni64.clz\r\ni64.ctz\r\ni64.popcnt\r\ni64.add\r\ni64.sub\r\ni64.mul\r\ni64.div_s\r\ni64.div_u\r\ni64.rem_s\r\ni64.rem_u\r\ni64.and\r\ni64.or\r\ni64.xor\r\ni64.shl\r\ni64.shr_s\r\ni64.shr_u\r\ni64.rotl\r\ni64.rotr\r\nf32.abs\r\nf32.neg\r\nf32.ceil\r\nf32.floor\r\nf32.trunc\r\nf32.nearest\r\nf32.sqrt\r\nf32.add\r\nf32.sub\r\nf32.mul\r\nf32.div\r\nf32.min\r\nf32.max\r\nf32.copysign\r\nf64.abs\r\nf64.neg\r\nf64.ceil\r\nf64.floor\r\nf64.trunc\r\nf64.nearest\r\nf64.sqrt\r\nf64.add\r\nf64.sub\r\nf64.mul\r\nf64.div\r\nf64.min\r\nf64.max\r\nf64.copysign\r\ni32.eqz\r\ni32.eq\r\ni32.ne\r\ni32.lt_s\r\ni32.lt_u\r\ni32.gt_s\r\ni32.gt_u\r\ni32.le_s\r\ni32.le_u\r\ni32.ge_s\r\ni32.ge_u\r\ni64.eqz\r\ni64.eq\r\ni64.ne\r\ni64.lt_s\r\ni64.lt_u\r\ni64.gt_s\r\ni64.gt_u\r\ni64.le_s\r\ni64.le_u\r\ni64.ge_s\r\ni64.ge_u\r\nf32.eq\r\nf32.ne\r\nf32.lt\r\nf32.gt\r\nf32.le\r\nf32.ge\r\nf64.eq\r\nf64.ne\r\nf64.lt\r\nf64.gt\r\nf64.le\r\nf64.ge\r\ni32.wrap/i64\r\ni32.trunc_s/f32\r\ni32.trunc_u/f32\r\ni32.trunc_s/f64\r\ni32.trunc_u/f64\r\ni64.extend_s/i32\r\ni64.extend_u/i32\r\ni64.trunc_s/f32\r\ni64.trunc_u/f32\r\ni64.trunc_s/f64\r\ni64.trunc_u/f64\r\nf32.convert_s/i32\r\nf32.convert_u/i32\r\nf32.convert_s/i64\r\nf32.convert_u/i64\r\nf32.demote/f64\r\nf64.convert_s/i32\r\nf64.convert_u/i32\r\nf64.convert_s/i64\r\nf64.convert_u/i64\r\nf64.promote/f32\r\ni32.reinterpret/f32\r\ni64.reinterpret/f64\r\nf32.reinterpret/i32\r\nf64.reinterpret/i64\r\n\r\nmemory.size\r\nmemory.grow\r\n\r\nanyfunc\r\nblock\r\nbr\r\nbr_if\r\nbr_table\r\ncall\r\ncall_indirect\r\ndata\r\ndrop\r\nelem\r\nelse\r\nend\r\nexport\r\nfunc\r\nget_global\r\nget_local\r\nglobal\r\nif\r\nimport\r\nlocal\r\nloop\r\nmemory\r\nmodule\r\nmut\r\nnop\r\noffset\r\nparam\r\nresult\r\nreturn\r\nselect\r\nset_global\r\nset_local\r\nstart\r\ntable\r\ntee_local\r\nthen\r\ntype\r\nunreachable\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", [\"align\", [\"operator\", \"=\"]]],\r\n\t[\"keyword\", [\"offset\", [\"operator\", \"=\"]]],\r\n\r\n\t[\"keyword\", [\"f32\"]],\r\n\t[\"keyword\", [\"f64\"]],\r\n\t[\"keyword\", [\"i32\"]],\r\n\t[\"keyword\", [\"i64\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"load\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"load\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"load\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"load\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"load8_s\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"load8_u\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"load16_s\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"load16_u\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"load8_s\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"load8_u\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"load16_s\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"load16_u\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"load32_s\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"load32_u\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"store\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"store\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"store\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"store\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"store8\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"store16\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"store8\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"store16\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"store32\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"const\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"const\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"const\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"const\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"clz\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"ctz\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"popcnt\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"add\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"sub\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"mul\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"div_s\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"div_u\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"rem_s\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"rem_u\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"and\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"or\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"xor\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"shl\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"shr_s\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"shr_u\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"rotl\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"rotr\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"clz\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"ctz\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"popcnt\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"add\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"sub\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"mul\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"div_s\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"div_u\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"rem_s\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"rem_u\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"and\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"or\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"xor\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"shl\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"shr_s\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"shr_u\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"rotl\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"rotr\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"abs\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"neg\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"ceil\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"floor\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"trunc\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"nearest\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"sqrt\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"add\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"sub\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"mul\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"div\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"min\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"max\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"copysign\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"abs\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"neg\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"ceil\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"floor\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"trunc\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"nearest\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"sqrt\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"add\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"sub\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"mul\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"div\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"min\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"max\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"copysign\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"eqz\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"eq\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"ne\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"lt_s\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"lt_u\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"gt_s\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"gt_u\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"le_s\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"le_u\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"ge_s\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"ge_u\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"eqz\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"eq\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"ne\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"lt_s\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"lt_u\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"gt_s\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"gt_u\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"le_s\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"le_u\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"ge_s\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"ge_u\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"eq\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"ne\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"lt\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"gt\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"le\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"ge\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"eq\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"ne\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"lt\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"gt\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"le\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"ge\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"wrap/i64\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"trunc_s/f32\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"trunc_u/f32\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"trunc_s/f64\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"trunc_u/f64\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"extend_s/i32\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"extend_u/i32\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"trunc_s/f32\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"trunc_u/f32\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"trunc_s/f64\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"trunc_u/f64\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"convert_s/i32\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"convert_u/i32\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"convert_s/i64\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"convert_u/i64\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"demote/f64\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"convert_s/i32\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"convert_u/i32\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"convert_s/i64\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"convert_u/i64\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"promote/f32\"]],\r\n\t[\"keyword\", [\"i32\", [\"punctuation\", \".\"], \"reinterpret/f32\"]],\r\n\t[\"keyword\", [\"i64\", [\"punctuation\", \".\"], \"reinterpret/f64\"]],\r\n\t[\"keyword\", [\"f32\", [\"punctuation\", \".\"], \"reinterpret/i32\"]],\r\n\t[\"keyword\", [\"f64\", [\"punctuation\", \".\"], \"reinterpret/i64\"]],\r\n\r\n\t[\"keyword\", [\"memory\", [\"punctuation\", \".\"], \"size\"]],\r\n\t[\"keyword\", [\"memory\", [\"punctuation\", \".\"], \"grow\"]],\r\n\t\r\n\t[\"keyword\", \"anyfunc\"],\r\n\t[\"keyword\", \"block\"],\r\n\t[\"keyword\", \"br\"],\r\n\t[\"keyword\", \"br_if\"],\r\n\t[\"keyword\", \"br_table\"],\r\n\t[\"keyword\", \"call\"],\r\n\t[\"keyword\", \"call_indirect\"],\r\n\t[\"keyword\", \"data\"],\r\n\t[\"keyword\", \"drop\"],\r\n\t[\"keyword\", \"elem\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"end\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"func\"],\r\n\t[\"keyword\", \"get_global\"],\r\n\t[\"keyword\", \"get_local\"],\r\n\t[\"keyword\", \"global\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"local\"],\r\n\t[\"keyword\", \"loop\"],\r\n\t[\"keyword\", \"memory\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"keyword\", \"mut\"],\r\n\t[\"keyword\", \"nop\"],\r\n\t[\"keyword\", \"offset\"],\r\n\t[\"keyword\", \"param\"],\r\n\t[\"keyword\", \"result\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"select\"],\r\n\t[\"keyword\", \"set_global\"],\r\n\t[\"keyword\", \"set_local\"],\r\n\t[\"keyword\", \"start\"],\r\n\t[\"keyword\", \"table\"],\r\n\t[\"keyword\", \"tee_local\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"type\"],\r\n\t[\"keyword\", \"unreachable\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all keywords."
  },
  {
    "path": "tests/languages/wasm/number_feature.test",
    "content": "0\r\n42_147\r\n+42\r\n+4_2\r\n-3.1415\r\n-3.1_41_5\r\n4e2\r\n4_7e2\r\n-7E+8\r\n-7E+1_8\r\n+8.004e-12\r\n+8.0_04e-12\r\n0xBadFace\r\n0xB_adF_a_c_e\r\n-0x4E.F8d\r\n-0x4_E.F8_d\r\n+0xff\r\n0xefp4\r\n0xe_fp4_2\r\n+0x5CP+12\r\n+0x5_CP+12\r\n-0xef.efp-7\r\n-0xef_14.00_0_Ap-1_7\r\ninf\r\nnan\r\nnan:0xF_4\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"42_147\"],\r\n\t[\"number\", \"+42\"],\r\n\t[\"number\", \"+4_2\"],\r\n\t[\"number\", \"-3.1415\"],\r\n\t[\"number\", \"-3.1_41_5\"],\r\n\t[\"number\", \"4e2\"],\r\n\t[\"number\", \"4_7e2\"],\r\n\t[\"number\", \"-7E+8\"],\r\n\t[\"number\", \"-7E+1_8\"],\r\n\t[\"number\", \"+8.004e-12\"],\r\n\t[\"number\", \"+8.0_04e-12\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0xB_adF_a_c_e\"],\r\n\t[\"number\", \"-0x4E.F8d\"],\r\n\t[\"number\", \"-0x4_E.F8_d\"],\r\n\t[\"number\", \"+0xff\"],\r\n\t[\"number\", \"0xefp4\"],\r\n\t[\"number\", \"0xe_fp4_2\"],\r\n\t[\"number\", \"+0x5CP+12\"],\r\n\t[\"number\", \"+0x5_CP+12\"],\r\n\t[\"number\", \"-0xef.efp-7\"],\r\n\t[\"number\", \"-0xef_14.00_0_Ap-1_7\"],\r\n\t[\"number\", \"inf\"],\r\n\t[\"number\", \"nan\"],\r\n\t[\"number\", \"nan:0xF_4\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for decimal and hexadecimal numbers."
  },
  {
    "path": "tests/languages/wasm/string_feature.test",
    "content": "\"\"\r\n\"Foo\\\"\\\\bar\"\r\n\"\\t\\n\\r\\\"\\'\\\\\\u{004e}\\u{0_0_4_e}\"\r\n\"foo\r\nbar\"\r\n\";; foo\"\r\n\"(; foo bar ;)\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Foo\\\\\\\"\\\\\\\\bar\\\"\"],\r\n\t[\"string\", \"\\\"\\\\t\\\\n\\\\r\\\\\\\"\\\\'\\\\\\\\\\\\u{004e}\\\\u{0_0_4_e}\\\"\"],\r\n\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"],\r\n\t[\"string\", \"\\\";; foo\\\"\"],\r\n\t[\"string\", \"\\\"(; foo bar ;)\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/wasm/variable_feature.test",
    "content": "$Foo\r\n$foo_42!\r\n$$\r\n$!#$%&'*+-./:<=>?@\\^_`|~\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$Foo\"],\r\n\t[\"variable\", \"$foo_42!\"],\r\n\t[\"variable\", \"$$\"],\r\n\t[\"variable\", \"$!#$%&'*+-./:<=>?@\\\\^_`|~\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/web-idl/boolean_feature.test",
    "content": "true\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n"
  },
  {
    "path": "tests/languages/web-idl/builtin_feature.test",
    "content": "ArrayBuffer\nBigInt64Array\nBigUint64Array\nByteString\nDOMString\nDataView\nFloat32Array\nFloat64Array\nFrozenArray\nInt16Array\nInt32Array\nInt8Array\nObservableArray\nPromise\nUSVString\nUint16Array\nUint32Array\nUint8Array\nUint8ClampedArray\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"ArrayBuffer\"],\n\t[\"builtin\", \"BigInt64Array\"],\n\t[\"builtin\", \"BigUint64Array\"],\n\t[\"builtin\", \"ByteString\"],\n\t[\"builtin\", \"DOMString\"],\n\t[\"builtin\", \"DataView\"],\n\t[\"builtin\", \"Float32Array\"],\n\t[\"builtin\", \"Float64Array\"],\n\t[\"builtin\", \"FrozenArray\"],\n\t[\"builtin\", \"Int16Array\"],\n\t[\"builtin\", \"Int32Array\"],\n\t[\"builtin\", \"Int8Array\"],\n\t[\"builtin\", \"ObservableArray\"],\n\t[\"builtin\", \"Promise\"],\n\t[\"builtin\", \"USVString\"],\n\t[\"builtin\", \"Uint16Array\"],\n\t[\"builtin\", \"Uint32Array\"],\n\t[\"builtin\", \"Uint8Array\"],\n\t[\"builtin\", \"Uint8ClampedArray\"]\n]\n"
  },
  {
    "path": "tests/languages/web-idl/class-name_feature.test",
    "content": "// names\ninterface interface_identifier { /* interface_members... */ };\npartial interface interface_identifier { /* interface_members... */ };\ndictionary dictionary_identifier { /* dictionary_members... */ };\npartial dictionary dictionary_identifier { /* dictionary_members... */ };\nenum enumeration_identifier { \"enum\", \"values\" /* , ... */ };\ncallback callback_identifier = return_type (/* arguments... */);\ncallback interface callback_interface_identifier { /* interface_members... */ };\n\n// interfaces\n\ninterface interface_identifier {\n  return_type identifier([extended_attributes] type identifier, [extended_attributes] type identifier);\n};\ninterface interface_identifier {\n  return_type identifier(type... identifier);\n  return_type identifier(type identifier, type... identifier);\n};\ninterface SolidColor : Paint {\n  constructor(double radius);\n  attribute double red;\n  readonly attribute unsigned long width;\n  undefined drawText(double x, double y, DOMString text);\n  getter DOMString (DOMString keyName);\n  getter DOMString foo(DOMString keyName);\n  boolean hasAddressForName(USVString name, optional LookupOptions options = {});\n  const unsigned long BIT_MASK = 0x0000fc00;\n  iterable<DOMString, Session>;\n};\n\n// dictionary\n\ndictionary identifier {\n  type identifier;\n};\ndictionary identifier {\n  type identifier = \"value\";\n};\ndictionary identifier {\n  required type identifier;\n};\ndictionary B : A {\n  long b;\n  long a;\n};\n\n// callback\n\ncallback AsyncOperationCallback = undefined (DOMString status);\n\n// enum\n\nenum MealType { \"rice\", \"noodles\", \"other\" };\n\n// typedef\n\ntypedef sequence<Point> Points;\n\n// includes and implements\nFoo includes Bar;\nFoo implements Bar;\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// names\"],\n\n\t[\"keyword\", \"interface\"],\n\t[\"class-name\", \"interface_identifier\"],\n\t[\"punctuation\", \"{\"],\n\t[\"comment\", \"/* interface_members... */\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"partial\"],\n\t[\"keyword\", \"interface\"],\n\t[\"class-name\", \"interface_identifier\"],\n\t[\"punctuation\", \"{\"],\n\t[\"comment\", \"/* interface_members... */\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"dictionary\"],\n\t[\"class-name\", \"dictionary_identifier\"],\n\t[\"punctuation\", \"{\"],\n\t[\"comment\", \"/* dictionary_members... */\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"partial\"],\n\t[\"keyword\", \"dictionary\"],\n\t[\"class-name\", \"dictionary_identifier\"],\n\t[\"punctuation\", \"{\"],\n\t[\"comment\", \"/* dictionary_members... */\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"enum\"],\n\t[\"class-name\", \"enumeration_identifier\"],\n\t[\"punctuation\", \"{\"],\n\t[\"string\", \"\\\"enum\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"values\\\"\"],\n\t[\"comment\", \"/* , ... */\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"callback\"],\n\t[\"class-name\", \"callback_identifier\"],\n\t[\"operator\", \"=\"],\n\t[\"class-name\", [\"return_type\"]],\n\t[\"punctuation\", \"(\"],\n\t[\"comment\", \"/* arguments... */\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"callback\"],\n\t[\"keyword\", \"interface\"],\n\t[\"class-name\", \"callback_interface_identifier\"],\n\t[\"punctuation\", \"{\"],\n\t[\"comment\", \"/* interface_members... */\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// interfaces\"],\n\n\t[\"keyword\", \"interface\"],\n\t[\"class-name\", \"interface_identifier\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"class-name\", [\"return_type\"]],\n\t\" identifier\",\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \"[\"],\n\t\"extended_attributes\",\n\t[\"punctuation\", \"]\"],\n\t[\"class-name\", [\"type\"]],\n\t\" identifier\",\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \"[\"],\n\t\"extended_attributes\",\n\t[\"punctuation\", \"]\"],\n\t[\"class-name\", [\"type\"]],\n\t\" identifier\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"interface\"],\n\t[\"class-name\", \"interface_identifier\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"class-name\", [\"return_type\"]],\n\t\" identifier\",\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\"type\"]],\n\t[\"operator\", \"...\"],\n\t\" identifier\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\"return_type\"]],\n\t\" identifier\",\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\"type\"]],\n\t\" identifier\",\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\"type\"]],\n\t[\"operator\", \"...\"],\n\t\" identifier\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"interface\"],\n\t[\"class-name\", \"SolidColor\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"Paint\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"constructor\"],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"double\"]\n\t]],\n\t\" radius\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"attribute\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"double\"]\n\t]],\n\t\" red\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"readonly\"],\n\t[\"keyword\", \"attribute\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"unsigned\"],\n\t\t[\"keyword\", \"long\"]\n\t]],\n\t\" width\",\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\n\t\t[\"keyword\", \"undefined\"]\n\t]],\n\t\" drawText\",\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"double\"]\n\t]],\n\t\" x\",\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"double\"]\n\t]],\n\t\" y\",\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", [\n\t\t[\"builtin\", \"DOMString\"]\n\t]],\n\t\" text\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"getter\"],\n\t[\"class-name\", [\n\t\t[\"builtin\", \"DOMString\"]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"builtin\", \"DOMString\"]\n\t]],\n\t\" keyName\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"getter\"],\n\t[\"class-name\", [\n\t\t[\"builtin\", \"DOMString\"]\n\t]],\n\t\" foo\",\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"builtin\", \"DOMString\"]\n\t]],\n\t\" keyName\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\n\t\t[\"keyword\", \"boolean\"]\n\t]],\n\t\" hasAddressForName\",\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"builtin\", \"USVString\"]\n\t]],\n\t\" name\",\n\t[\"punctuation\", \",\"],\n\t[\"keyword\", \"optional\"],\n\t[\"class-name\", [\"LookupOptions\"]],\n\t\" options \",\n\t[\"operator\", \"=\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"const\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"unsigned\"],\n\t\t[\"keyword\", \"long\"]\n\t]],\n\t\" BIT_MASK \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0x0000fc00\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\n\t\t[\"keyword\", \"iterable\"],\n\t\t[\"operator\", \"<\"],\n\t\t[\"builtin\", \"DOMString\"],\n\t\t[\"punctuation\", \",\"],\n\t\t\" Session\",\n\t\t[\"operator\", \">\"]\n\t]],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// dictionary\"],\n\n\t[\"keyword\", \"dictionary\"],\n\t[\"class-name\", \"identifier\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"class-name\", [\"type\"]],\n\t\" identifier\",\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"dictionary\"],\n\t[\"class-name\", \"identifier\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"class-name\", [\"type\"]],\n\t\" identifier \",\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"value\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"dictionary\"],\n\t[\"class-name\", \"identifier\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"required\"],\n\t[\"class-name\", [\"type\"]],\n\t\" identifier\",\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"dictionary\"],\n\t[\"class-name\", \"B\"],\n\t[\"operator\", \":\"],\n\t[\"class-name\", \"A\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"class-name\", [\n\t\t[\"keyword\", \"long\"]\n\t]],\n\t\" b\",\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", [\n\t\t[\"keyword\", \"long\"]\n\t]],\n\t\" a\",\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// callback\"],\n\n\t[\"keyword\", \"callback\"],\n\t[\"class-name\", \"AsyncOperationCallback\"],\n\t[\"operator\", \"=\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"undefined\"]\n\t]],\n\t[\"punctuation\", \"(\"],\n\t[\"class-name\", [\n\t\t[\"builtin\", \"DOMString\"]\n\t]],\n\t\" status\",\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// enum\"],\n\n\t[\"keyword\", \"enum\"],\n\t[\"class-name\", \"MealType\"],\n\t[\"punctuation\", \"{\"],\n\t[\"string\", \"\\\"rice\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"noodles\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"other\\\"\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// typedef\"],\n\n\t[\"keyword\", \"typedef\"],\n\t[\"class-name\", [\n\t\t[\"keyword\", \"sequence\"],\n\t\t[\"operator\", \"<\"],\n\t\t\"Point\",\n\t\t[\"operator\", \">\"]\n\t]],\n\t\" Points\",\n\t[\"punctuation\", \";\"],\n\n\t[\"comment\", \"// includes and implements\"],\n\n\t[\"class-name\", \"Foo\"],\n\t[\"keyword\", \"includes\"],\n\t[\"class-name\", \"Bar\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"class-name\", \"Foo\"],\n\t[\"keyword\", \"implements\"],\n\t[\"class-name\", \"Bar\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/web-idl/comment_feature.test",
    "content": "// comment\n/* comment */\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// comment\"],\n\t[\"comment\", \"/* comment */\"]\n]\n"
  },
  {
    "path": "tests/languages/web-idl/keyword_feature.test",
    "content": "async;\nattribute;\ncallback;\nconst;\nconstructor;\ndeleter;\ndictionary;\nenum;\ngetter;\nincludes;\ninherit;\ninterface;\nmixin;\nnamespace;\nnull;\noptional;\nor;\npartial;\nreadonly;\nrequired;\nsetter;\nstatic;\nstringifier;\ntypedef;\nunrestricted;\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"async\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"attribute\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"callback\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"const\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"constructor\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"deleter\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"dictionary\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"enum\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"getter\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"includes\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"inherit\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"interface\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"mixin\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"namespace\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"null\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"optional\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"or\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"partial\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"readonly\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"required\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"setter\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"stringifier\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"typedef\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"unrestricted\"], [\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/web-idl/namespace_feature.test",
    "content": "namespace SomeNamespace {\n  /* namespace_members... */\n};\n\npartial namespace SomeNamespace {\n  /* namespace_members... */\n};\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"namespace\"],\n\t[\"namespace\", \"SomeNamespace\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"comment\", \"/* namespace_members... */\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"partial\"],\n\t[\"keyword\", \"namespace\"],\n\t[\"namespace\", \"SomeNamespace\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"comment\", \"/* namespace_members... */\"],\n\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/web-idl/number_feature.test",
    "content": "0xfff\n123423\n-123423\n\n123.456\n123.e64\n123.324e-4\n.324e+4\n\nNaN\nInfinity\n-Infinity\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0xfff\"],\n\t[\"number\", \"123423\"],\n\t[\"number\", \"-123423\"],\n\n\t[\"number\", \"123.456\"],\n\t[\"number\", \"123.e64\"],\n\t[\"number\", \"123.324e-4\"],\n\t[\"number\", \".324e+4\"],\n\n\t[\"number\", \"NaN\"],\n\t[\"number\", \"Infinity\"],\n\t[\"number\", \"-Infinity\"]\n]\n"
  },
  {
    "path": "tests/languages/web-idl/operator_feature.test",
    "content": "...\n= : ? < >\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"...\"],\n\n\t[\"operator\", \"=\"],\n\t[\"operator\", \":\"],\n\t[\"operator\", \"?\"],\n\t[\"operator\", \"<\"],\n\t[\"operator\", \">\"]\n]\n"
  },
  {
    "path": "tests/languages/web-idl/primitive-type_feature.test",
    "content": "any\nbigint\nboolean\nbyte\ndouble\nfloat\niterable\nlong\nmaplike\nobject\noctet\nrecord\nsequence\nsetlike\nshort\nsymbol\nundefined\nunsigned\nvoid\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"any\"],\n\t[\"keyword\", \"bigint\"],\n\t[\"keyword\", \"boolean\"],\n\t[\"keyword\", \"byte\"],\n\t[\"keyword\", \"double\"],\n\t[\"keyword\", \"float\"],\n\t[\"keyword\", \"iterable\"],\n\t[\"keyword\", \"long\"],\n\t[\"keyword\", \"maplike\"],\n\t[\"keyword\", \"object\"],\n\t[\"keyword\", \"octet\"],\n\t[\"keyword\", \"record\"],\n\t[\"keyword\", \"sequence\"],\n\t[\"keyword\", \"setlike\"],\n\t[\"keyword\", \"short\"],\n\t[\"keyword\", \"symbol\"],\n\t[\"keyword\", \"undefined\"],\n\t[\"keyword\", \"unsigned\"],\n\t[\"keyword\", \"void\"]\n]\n"
  },
  {
    "path": "tests/languages/web-idl/punctuation_feature.test",
    "content": "( ) [ ] { }\n. , ;\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/languages/web-idl/string_feature.test",
    "content": "\"\"\n\"foo\"\n\"\\\"\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\\"\"],\n\t[\"string\", \"\\\"foo\\\"\"],\n\t[\"string\", \"\\\"\\\\\\\"\"]\n]\n"
  },
  {
    "path": "tests/languages/wgsl/attributes_feature.test",
    "content": "@notAnAttribute\n@align()\n@binding()\n\n@builtin()\n\n@builtin(vertex_index)\n@builtin(instance_index)\n@builtin(position)\n\n@builtin(front_facing)\n@builtin(frag_depth)\n@builtin(sample_index)\n@builtin(sample_mask)\n\n@builtin(local_invocation_id)\n@builtin(local_invocation_index)\n@builtin(global_invocation_id)\n@builtin(workgroup_id)\n@builtin(num_workgroups)\n\n@builtin(notABuiltInValue)\nsomething.vertex_index;\n\n@const\n@group()\n@id()\n@interpolate()\n@invariant\n@location()\n@size()\n@workgroup_size()\n\n@vertex\n@fragment\n@compute\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"@\"],\n\t\"notAnAttribute\\r\\n\",\n\n\t[\"punctuation\", \"@\"],\n\t[\"attributes\", \"align\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"@\"],\n\t[\"attributes\", \"binding\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"vertex_index\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"instance_index\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"position\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"front_facing\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"frag_depth\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"sample_index\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"sample_mask\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"local_invocation_id\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"local_invocation_index\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"global_invocation_id\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"workgroup_id\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t[\"built-in-values\", \"num_workgroups\"],\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t[\"punctuation\", \"@\"],\n\t[\"builtin-attribute\", [\n\t\t[\"attribute\", \"builtin\"],\n\t\t[\"punctuation\", \"(\"],\n\t\t\"notABuiltInValue\",\n\t\t[\"punctuation\", \")\"]\n\t]],\n\n\t\"\\r\\nsomething\",\n\t[\"punctuation\", \".\"],\n\t\"vertex_index\",\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"@\"],\n\t[\"attributes\", \"const\"],\n\n\t[\"punctuation\", \"@\"],\n\t[\"attributes\", \"group\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"@\"],\n\t[\"attributes\", \"id\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"@\"],\n\t[\"attributes\", \"interpolate\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"@\"],\n\t[\"attributes\", \"invariant\"],\n\n\t[\"punctuation\", \"@\"],\n\t[\"attributes\", \"location\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"@\"],\n\t[\"attributes\", \"size\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"@\"],\n\t[\"attributes\", \"workgroup_size\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \"@\"], [\"attributes\", \"vertex\"],\n\t[\"punctuation\", \"@\"], [\"attributes\", \"fragment\"],\n\t[\"punctuation\", \"@\"], [\"attributes\", \"compute\"]\n]\n"
  },
  {
    "path": "tests/languages/wgsl/builtin_feature.test",
    "content": "bool\ni32\nu32\nf32\ni64\nu64\nf64\nvec2\nvec3\nvec4\nmat2x2\nmat2x3\nmat2x4\nmat3x2\nmat3x3\nmat3x4\nmat4x2\nmat4x3\nmat4x4\n\natomic\narray\n\noverride\nptr\n\nsampler\nsampler_comparison\nstaticAssert\n\ntexture_1d\ntexture_2d\ntexture_2d_array\ntexture_3d\ntexture_cube\ntexture_cube_array\ntexture_multisampled_2d\ntexture_storage_1d\ntexture_storage_2d\ntexture_storage_2d_array\ntexture_storage_3d\ntexture_depth_2d\ntexture_depth_2d_array\ntexture_depth_cube\ntexture_depth_cube_array\ntexture_depth_multisampled_2d\n\nstaticAssert()\n\nall\nany\nselect\nabs\nacos\nacosh\nasin\nasinh\natan\natanh\natan2\nceil\nclamp\ncos\ncosh\ncross\ndegrees\ndistance\nexp\nexp2\nfaceForward\nfloor\nfma\nfract\nfrexp\ninverseSqrt\nldexp\nlength\nlog\nlog2\nmax\nmin\nmix\nmodf\nnormalize\npow\nquantizeToF16\nradians\nreflect\nrefract\nround\nsign\nsin\nsinh\nsmoothstep\nsqrt\nstep\ntan\ntanh\ntrunc\ncountLeadingZeros\ncountOneBits\ncountTrailingZeros\nfirstLeadingBit\nextractBits\ninsertBits\nreverseBits\nshiftLeft\nshiftRight\ndeterminant\ntranspose\ndot\ndpdx\ndpdxCoarse\ndpdxFine\ndpdy\ndpdyCoarse\ndpdyFine\nfwidth\nfwidthCoarse\nfwidthFine\ntextureDimensions\ntextureGather\ntextureGatherCompare\ntextureLoad\ntextureNumLayers\ntextureNumLevels\ntextureNumSamples\ntextureSample\ntextureSampleBias\ntextureSampleCompare\ntextureSampleCompareLevel\ntextureSampleGrad\ntextureSampleLevel\ntextureStore\natomicLoad\natomicStore\natomicAdd\natomicSub\natomicMax\natomicMin\natomicAnd\natomicOr\natomicXor\natomicExchange\natomicCompareExchangeWeak\npack4x8snorm\npack4x8unorm\npack2x16snorm\npack2x16unorm\npack2x16float\nunpack4x8snorm\nunpack4x8unorm\nunpack2x16snorm\nunpack2x16unorm\nunpack2x16float\nstorageBarrier\nworkgroupBarrier\n\n----------------------------------------------------\n\n[\n\t[\"builtin\", \"bool\"],\n\t[\"builtin\", \"i32\"],\n\t[\"builtin\", \"u32\"],\n\t[\"builtin\", \"f32\"],\n\t[\"builtin\", \"i64\"],\n\t[\"builtin\", \"u64\"],\n\t[\"builtin\", \"f64\"],\n\t[\"builtin\", \"vec2\"],\n\t[\"builtin\", \"vec3\"],\n\t[\"builtin\", \"vec4\"],\n\t[\"builtin\", \"mat2x2\"],\n\t[\"builtin\", \"mat2x3\"],\n\t[\"builtin\", \"mat2x4\"],\n\t[\"builtin\", \"mat3x2\"],\n\t[\"builtin\", \"mat3x3\"],\n\t[\"builtin\", \"mat3x4\"],\n\t[\"builtin\", \"mat4x2\"],\n\t[\"builtin\", \"mat4x3\"],\n\t[\"builtin\", \"mat4x4\"],\n\n\t[\"builtin\", \"atomic\"],\n\t[\"builtin\", \"array\"],\n\n\t[\"builtin\", \"override\"],\n\t[\"builtin\", \"ptr\"],\n\n\t[\"builtin\", \"sampler\"],\n\t[\"builtin\", \"sampler_comparison\"],\n\t[\"builtin\", \"staticAssert\"],\n\n\t[\"builtin\", \"texture_1d\"],\n\t[\"builtin\", \"texture_2d\"],\n\t[\"builtin\", \"texture_2d_array\"],\n\t[\"builtin\", \"texture_3d\"],\n\t[\"builtin\", \"texture_cube\"],\n\t[\"builtin\", \"texture_cube_array\"],\n\t[\"builtin\", \"texture_multisampled_2d\"],\n\t[\"builtin\", \"texture_storage_1d\"],\n\t[\"builtin\", \"texture_storage_2d\"],\n\t[\"builtin\", \"texture_storage_2d_array\"],\n\t[\"builtin\", \"texture_storage_3d\"],\n\t[\"builtin\", \"texture_depth_2d\"],\n\t[\"builtin\", \"texture_depth_2d_array\"],\n\t[\"builtin\", \"texture_depth_cube\"],\n\t[\"builtin\", \"texture_depth_cube_array\"],\n\t[\"builtin\", \"texture_depth_multisampled_2d\"],\n\n\t[\"builtin\", \"staticAssert\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"builtin\", \"all\"],\n\t[\"builtin\", \"any\"],\n\t[\"builtin\", \"select\"],\n\t[\"builtin\", \"abs\"],\n\t[\"builtin\", \"acos\"],\n\t[\"builtin\", \"acosh\"],\n\t[\"builtin\", \"asin\"],\n\t[\"builtin\", \"asinh\"],\n\t[\"builtin\", \"atan\"],\n\t[\"builtin\", \"atanh\"],\n\t[\"builtin\", \"atan2\"],\n\t[\"builtin\", \"ceil\"],\n\t[\"builtin\", \"clamp\"],\n\t[\"builtin\", \"cos\"],\n\t[\"builtin\", \"cosh\"],\n\t[\"builtin\", \"cross\"],\n\t[\"builtin\", \"degrees\"],\n\t[\"builtin\", \"distance\"],\n\t[\"builtin\", \"exp\"],\n\t[\"builtin\", \"exp2\"],\n\t[\"builtin\", \"faceForward\"],\n\t[\"builtin\", \"floor\"],\n\t[\"builtin\", \"fma\"],\n\t[\"builtin\", \"fract\"],\n\t[\"builtin\", \"frexp\"],\n\t[\"builtin\", \"inverseSqrt\"],\n\t[\"builtin\", \"ldexp\"],\n\t[\"builtin\", \"length\"],\n\t[\"builtin\", \"log\"],\n\t[\"builtin\", \"log2\"],\n\t[\"builtin\", \"max\"],\n\t[\"builtin\", \"min\"],\n\t[\"builtin\", \"mix\"],\n\t[\"builtin\", \"modf\"],\n\t[\"builtin\", \"normalize\"],\n\t[\"builtin\", \"pow\"],\n\t[\"builtin\", \"quantizeToF16\"],\n\t[\"builtin\", \"radians\"],\n\t[\"builtin\", \"reflect\"],\n\t[\"builtin\", \"refract\"],\n\t[\"builtin\", \"round\"],\n\t[\"builtin\", \"sign\"],\n\t[\"builtin\", \"sin\"],\n\t[\"builtin\", \"sinh\"],\n\t[\"builtin\", \"smoothstep\"],\n\t[\"builtin\", \"sqrt\"],\n\t[\"builtin\", \"step\"],\n\t[\"builtin\", \"tan\"],\n\t[\"builtin\", \"tanh\"],\n\t[\"builtin\", \"trunc\"],\n\t[\"builtin\", \"countLeadingZeros\"],\n\t[\"builtin\", \"countOneBits\"],\n\t[\"builtin\", \"countTrailingZeros\"],\n\t[\"builtin\", \"firstLeadingBit\"],\n\t[\"builtin\", \"extractBits\"],\n\t[\"builtin\", \"insertBits\"],\n\t[\"builtin\", \"reverseBits\"],\n\t[\"builtin\", \"shiftLeft\"],\n\t[\"builtin\", \"shiftRight\"],\n\t[\"builtin\", \"determinant\"],\n\t[\"builtin\", \"transpose\"],\n\t[\"builtin\", \"dot\"],\n\t[\"builtin\", \"dpdx\"],\n\t[\"builtin\", \"dpdxCoarse\"],\n\t[\"builtin\", \"dpdxFine\"],\n\t[\"builtin\", \"dpdy\"],\n\t[\"builtin\", \"dpdyCoarse\"],\n\t[\"builtin\", \"dpdyFine\"],\n\t[\"builtin\", \"fwidth\"],\n\t[\"builtin\", \"fwidthCoarse\"],\n\t[\"builtin\", \"fwidthFine\"],\n\t[\"builtin\", \"textureDimensions\"],\n\t[\"builtin\", \"textureGather\"],\n\t[\"builtin\", \"textureGatherCompare\"],\n\t[\"builtin\", \"textureLoad\"],\n\t[\"builtin\", \"textureNumLayers\"],\n\t[\"builtin\", \"textureNumLevels\"],\n\t[\"builtin\", \"textureNumSamples\"],\n\t[\"builtin\", \"textureSample\"],\n\t[\"builtin\", \"textureSampleBias\"],\n\t[\"builtin\", \"textureSampleCompare\"],\n\t[\"builtin\", \"textureSampleCompareLevel\"],\n\t[\"builtin\", \"textureSampleGrad\"],\n\t[\"builtin\", \"textureSampleLevel\"],\n\t[\"builtin\", \"textureStore\"],\n\t[\"builtin\", \"atomicLoad\"],\n\t[\"builtin\", \"atomicStore\"],\n\t[\"builtin\", \"atomicAdd\"],\n\t[\"builtin\", \"atomicSub\"],\n\t[\"builtin\", \"atomicMax\"],\n\t[\"builtin\", \"atomicMin\"],\n\t[\"builtin\", \"atomicAnd\"],\n\t[\"builtin\", \"atomicOr\"],\n\t[\"builtin\", \"atomicXor\"],\n\t[\"builtin\", \"atomicExchange\"],\n\t[\"builtin\", \"atomicCompareExchangeWeak\"],\n\t[\"builtin\", \"pack4x8snorm\"],\n\t[\"builtin\", \"pack4x8unorm\"],\n\t[\"builtin\", \"pack2x16snorm\"],\n\t[\"builtin\", \"pack2x16unorm\"],\n\t[\"builtin\", \"pack2x16float\"],\n\t[\"builtin\", \"unpack4x8snorm\"],\n\t[\"builtin\", \"unpack4x8unorm\"],\n\t[\"builtin\", \"unpack2x16snorm\"],\n\t[\"builtin\", \"unpack2x16unorm\"],\n\t[\"builtin\", \"unpack2x16float\"],\n\t[\"builtin\", \"storageBarrier\"],\n\t[\"builtin\", \"workgroupBarrier\"]\n]\n"
  },
  {
    "path": "tests/languages/wgsl/class_name_feature.test",
    "content": "ClassName\nnotAClassName\n\n----------------------------------------------------\n\n[\n\t[\"class-name\", \"ClassName\"],\n\t\"\\r\\nnotAClassName\"\n]\n"
  },
  {
    "path": "tests/languages/wgsl/comment_feature.test",
    "content": "//test\n// test\n\n/* multi\n   line\n   comment */\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"//test\"],\n\t[\"comment\", \"// test\"],\n\n\t[\"comment\", \"/* multi\\r\\n   line\\r\\n   comment */\"]\n]\n"
  },
  {
    "path": "tests/languages/wgsl/function_feature.test",
    "content": "fn my_function() -> bool {\n\tmy_function();\n    return true;\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"fn\"],\n\t[\"functions\", \"my_function\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"->\"],\n\t[\"builtin\", \"bool\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"function-calls\", \"my_function\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"return\"],\n\t[\"bool-literal\", \"true\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/wgsl/keyword_feature.test",
    "content": "bitcast\nbreak\ncase\nconst\ncontinue\ncontinuing\ndefault\ndiscard\nelse\nenable\nfallthrough\nfn\nfor\nfunction\nif\nlet\nloop\nprivate\nreturn\nstorage\nstruct\nswitch\ntype\nuniform\nvar\nwhile\nworkgroup\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"bitcast\"],\n\t[\"keyword\", \"break\"],\n\t[\"keyword\", \"case\"],\n\t[\"keyword\", \"const\"],\n\t[\"keyword\", \"continue\"],\n\t[\"keyword\", \"continuing\"],\n\t[\"keyword\", \"default\"],\n\t[\"keyword\", \"discard\"],\n\t[\"keyword\", \"else\"],\n\t[\"keyword\", \"enable\"],\n\t[\"keyword\", \"fallthrough\"],\n\t[\"keyword\", \"fn\"],\n\t[\"keyword\", \"for\"],\n\t[\"keyword\", \"function\"],\n\t[\"keyword\", \"if\"],\n\t[\"keyword\", \"let\"],\n\t[\"keyword\", \"loop\"],\n\t[\"keyword\", \"private\"],\n\t[\"keyword\", \"return\"],\n\t[\"keyword\", \"storage\"],\n\t[\"keyword\", \"struct\"],\n\t[\"keyword\", \"switch\"],\n\t[\"keyword\", \"type\"],\n\t[\"keyword\", \"uniform\"],\n\t[\"keyword\", \"var\"],\n\t[\"keyword\", \"while\"],\n\t[\"keyword\", \"workgroup\"]\n]\n"
  },
  {
    "path": "tests/languages/wgsl/literal_feature.test",
    "content": "0x123\n0X123u\n1u\n123\n0\n0i\n0x3f\n\n0.e+4f\n01.\n.01\n12.34\n.0f\n0h\n1e-3\n0xa.fp+2\n0x1P+4f\n0X.3\n0x3p+2h\n0X1.fp-4\n0x3.2p+2h\n\ntrue\nfalse\n\nnotALiteral20x3f\n\n----------------------------------------------------\n\n[\n\t[\"hex-int-literal\", \"0x123\"],\n\t[\"hex-int-literal\", \"0X123u\"],\n\t[\"int-literal\", \"1u\"],\n\t[\"int-literal\", \"123\"],\n\t[\"int-literal\", \"0\"],\n\t[\"int-literal\", \"0i\"],\n\t[\"hex-int-literal\", \"0x3f\"],\n\n\t[\"decimal-float-literal\", \"0.e+4f\"],\n\t[\"decimal-float-literal\", \"01.\"],\n\t[\"decimal-float-literal\", \".01\"],\n\t[\"decimal-float-literal\", \"12.34\"],\n\t[\"decimal-float-literal\", \".0f\"],\n\t[\"decimal-float-literal\", \"0h\"],\n\t[\"decimal-float-literal\", \"1e-3\"],\n\t[\"hex-float-literal\", \"0xa.fp+2\"],\n\t[\"hex-float-literal\", \"0x1P+4f\"],\n\t[\"hex-float-literal\", \"0X.3\"],\n\t[\"hex-float-literal\", \"0x3p+2h\"],\n\t[\"hex-float-literal\", \"0X1.fp-4\"],\n\t[\"hex-float-literal\", \"0x3.2p+2h\"],\n\n\t[\"bool-literal\", \"true\"],\n\t[\"bool-literal\", \"false\"],\n\n\t\"\\r\\n\\r\\nnotALiteral20x3f\"\n]\n"
  },
  {
    "path": "tests/languages/wgsl/operator_feature.test",
    "content": "^\n~\n|\n||\n&&\n<<\n>>\n!\n&\n+=\n-=\n*=\n/=\n%=\n^=\n&=\n|=\n<<=\n>>=\n=\n==\n!=\n<=\n>=\n+\n++\n%\n*\n-\n--\n/\n->\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"|\"],\n\t[\"operator\", \"||\"],\n\t[\"operator\", \"&&\"],\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \">>\"],\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"+=\"],\n\t[\"operator\", \"-=\"],\n\t[\"operator\", \"*=\"],\n\t[\"operator\", \"/=\"],\n\t[\"operator\", \"%=\"],\n\t[\"operator\", \"^=\"],\n\t[\"operator\", \"&=\"],\n\t[\"operator\", \"|=\"],\n\t[\"operator\", \"<<=\"],\n\t[\"operator\", \">>=\"],\n\t[\"operator\", \"=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"++\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"-\"],\n\t[\"operator\", \"--\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"->\"]\n]\n"
  },
  {
    "path": "tests/languages/wgsl/punctuation_feature.test",
    "content": "@\n(\n)\n{\n}\n[\n]\n,\n;\n<\n>\n:\n.\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"@\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"<\"],\n\t[\"punctuation\", \">\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \".\"]\n]\n"
  },
  {
    "path": "tests/languages/wiki/block-comment_feature.test",
    "content": "/**/\r\n/* foo */\r\n/* foo\r\nbar */\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"block-comment\", \"/**/\"],\r\n\t[\"block-comment\", \"/* foo */\"],\r\n\t[\"block-comment\", \"/* foo\\r\\nbar */\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/wiki/emphasis_feature.test",
    "content": "'''''foo'''''\r\n'''bar'''\r\n''baz''\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"emphasis\", [\r\n\t\t[\"punctuation\", \"'''''\"],\r\n\t\t[\"bold-italic\", \"foo\"],\r\n\t\t[\"punctuation\", \"'''''\"]\r\n\t]],\r\n\t[\"emphasis\", [\r\n\t\t[\"punctuation\", \"'''\"],\r\n\t\t[\"bold\", \"bar\"],\r\n\t\t[\"punctuation\", \"'''\"]\r\n\t]],\r\n\t[\"emphasis\", [\r\n\t\t[\"punctuation\", \"''\"],\r\n\t\t[\"italic\", \"baz\"],\r\n\t\t[\"punctuation\", \"''\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for bold and italic.\r\n"
  },
  {
    "path": "tests/languages/wiki/heading_feature.test",
    "content": "= Header 1 =\r\n== Header 2 ==\r\n=== Header 3 ===\r\n==== Header 4 ====\r\n===== Header 5 =====\r\n====== Header 6 ======\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"heading\", [\r\n\t\t[\"punctuation\", \"=\"], [\"important\", \" Header 1 \"], [\"punctuation\", \"=\"]\r\n\t]],\r\n\t[\"heading\", [\r\n\t\t[\"punctuation\", \"==\"], [\"important\", \" Header 2 \"], [\"punctuation\", \"==\"]\r\n\t]],\r\n\t[\"heading\", [\r\n\t\t[\"punctuation\", \"===\"], [\"important\", \" Header 3 \"], [\"punctuation\", \"===\"]\r\n\t]],\r\n\t[\"heading\", [\r\n\t\t[\"punctuation\", \"====\"], [\"important\", \" Header 4 \"], [\"punctuation\", \"====\"]\r\n\t]],\r\n\t[\"heading\", [\r\n\t\t[\"punctuation\", \"=====\"], [\"important\", \" Header 5 \"], [\"punctuation\", \"=====\"]\r\n\t]],\r\n\t[\"heading\", [\r\n\t\t[\"punctuation\", \"======\"], [\"important\", \" Header 6 \"], [\"punctuation\", \"======\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for titles."
  },
  {
    "path": "tests/languages/wiki/hr_feature.test",
    "content": "----\r\n-----\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"hr\", \"----\"],\r\n\t[\"hr\", \"-----\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for horizontal rows."
  },
  {
    "path": "tests/languages/wiki/nowiki_feature.test",
    "content": "<nowiki>{{foo}} ''bar'' <baz></nowiki>\r\n<source>{{foo}} ''bar'' <baz></source>\r\n<pre>{{foo}} ''bar'' <baz></pre>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"nowiki\", [\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"nowiki\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]],\r\n\t\t\"{{foo}} ''bar'' <baz>\",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"nowiki\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"nowiki\", [\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"source\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]],\r\n\t\t\"{{foo}} ''bar'' <baz>\",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"source\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]],\r\n\t[\"nowiki\", [\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"<\"],\r\n\t\t\t[\"tag\", [\"pre\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]],\r\n\t\t\"{{foo}} ''bar'' <baz>\",\r\n\t\t[\"tag\", [\r\n\t\t\t[\"punctuation\", \"</\"],\r\n\t\t\t[\"tag\", [\"pre\"]],\r\n\t\t\t[\"punctuation\", \">\"]\r\n\t\t]]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks that no highlighting is done inside <nowiki>, <pre> and <source> tags.\r\n"
  },
  {
    "path": "tests/languages/wiki/symbol_feature.test",
    "content": "#REDIRECT [[somewhere]]\r\n~~~\r\n~~~~\r\n~~~~~\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"symbol\", \"#REDIRECT\"], [\"url\", \"[[somewhere]]\"],\r\n\t[\"symbol\", \"~~~\"],\r\n\t[\"symbol\", \"~~~~\"],\r\n\t[\"symbol\", \"~~~~~\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for redirects and signatures."
  },
  {
    "path": "tests/languages/wiki/url_feature.test",
    "content": "[[w:en:Formal_grammar|Formal grammar]]\r\n[http://www.cl.cam.ac.uk/~mgk25/iso-ebnf.html EBNF help]\r\n\r\nISBN 1234567890\r\nISBN 123456789x\r\nISBN      1 2 3-4-5 6789 X\r\nISBN 978-9999999999\r\n\r\nRFC 822\r\nPMID 822\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"url\", \"[[w:en:Formal_grammar|Formal grammar]]\"],\r\n\t[\"url\", \"[http://www.cl.cam.ac.uk/~mgk25/iso-ebnf.html EBNF help]\"],\r\n\r\n\t[\"url\", \"ISBN 1234567890\"],\r\n\t[\"url\", \"ISBN 123456789x\"],\r\n\t[\"url\", \"ISBN      1 2 3-4-5 6789 X\"],\r\n\t[\"url\", \"ISBN 978-9999999999\"],\r\n\r\n\t[\"url\", \"RFC 822\"],\r\n\t[\"url\", \"PMID 822\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for links, ISBN, RFC and PMID."
  },
  {
    "path": "tests/languages/wiki/variable_feature.test",
    "content": "__NOTOC__\r\n{{{1}}}\r\n{{!}}\r\n{{SITENAME}}\r\n{{#ifexists:foo}}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"__NOTOC__\"],\r\n\t[\"variable\", \"{{{1}}}\"],\r\n\t[\"variable\", \"{{!}}\"],\r\n\t[\"variable\", \"{{SITENAME}}\"],\r\n\t[\"variable\", \"{{#ifexists:foo}}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables and magic words."
  },
  {
    "path": "tests/languages/wolfram/black_feature.test",
    "content": "__\nx__\n\n----------------------------------------------------\n\n[\n\t[\"blank\", \"__\"],\n\t[\"blank\", \"x__\"]\n]\n"
  },
  {
    "path": "tests/languages/wolfram/boolean_feature.test",
    "content": "True\r\nFalse\r\n0\r\n1\r\nNone\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"boolean\", \"True\"],\r\n\t[\"boolean\", \"False\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"keyword\", \"None\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans.\r\n"
  },
  {
    "path": "tests/languages/wolfram/context_feature.test",
    "content": "Global`\nSystem`Foo\n\n----------------------------------------------------\n\n[\n\t[\"context\", \"Global`\"],\n\t[\"context\", \"System`Foo\"]\n]\n"
  },
  {
    "path": "tests/languages/wolfram/keyword_feature.test",
    "content": "Abs\nAbsArg\nAccuracy\nBlock\nDo\nFor\nFunction\nIf\nManipulate\nModule\nNest\nNestList\nNone\nReturn\nSwitch\nTable\nWhich\nWhile\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"Abs\"],\n\t[\"keyword\", \"AbsArg\"],\n\t[\"keyword\", \"Accuracy\"],\n\t[\"keyword\", \"Block\"],\n\t[\"keyword\", \"Do\"],\n\t[\"keyword\", \"For\"],\n\t[\"keyword\", \"Function\"],\n\t[\"keyword\", \"If\"],\n\t[\"keyword\", \"Manipulate\"],\n\t[\"keyword\", \"Module\"],\n\t[\"keyword\", \"Nest\"],\n\t[\"keyword\", \"NestList\"],\n\t[\"keyword\", \"None\"],\n\t[\"keyword\", \"Return\"],\n\t[\"keyword\", \"Switch\"],\n\t[\"keyword\", \"Table\"],\n\t[\"keyword\", \"Which\"],\n\t[\"keyword\", \"While\"]\n]\n"
  },
  {
    "path": "tests/languages/wolfram/operator_feature.test",
    "content": "@ //\r\n/@ @@ @@@ \r\n/ /=  //=\r\n> >= <=\r\n>> <<\r\n+ - ^ *\r\n= == ===\r\n:= =.\r\n!= =!=\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"@\"], [\"operator\", \"//\"],\r\n\t[\"operator\", \"/@\"], [\"operator\", \"@@\"], [\"operator\", \"@@@\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"/=\"], [\"operator\", \"//=\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \"<=\"],\r\n\t[\"operator\", \">>\"], [\"operator\", \"<<\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"^\"], [\"operator\", \"*\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"==\"], [\"operator\", \"===\"],\r\n\t[\"operator\", \":=\"], [\"operator\", \"=.\"],\r\n\t[\"operator\", \"!=\"], [\"operator\", \"=!=\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for all operators.\r\n"
  },
  {
    "path": "tests/languages/wolfram/punctuation_feature.test",
    "content": "{ } [ ] ( )\n, ; . :\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"operator\", \";\"],\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \":\"]\n]\n"
  },
  {
    "path": "tests/languages/wolfram/string_feature.test",
    "content": "\"\"\r\n\"foo\"\r\n\"fo\\\"obar\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings.\r\n"
  },
  {
    "path": "tests/languages/wren/attribute_feature.test",
    "content": "#hidden = true\nclass Example {}\n\n#key\n#key = value\n#group(\n  multiple,\n  lines = true,\n  lines = 0\n)\nclass Example {\n  #test(skip = true, iterations = 32)\n  doStuff() {}\n}\n\n#doc = \"not runtime data\"\n#!runtimeAccess = true\n#!maxIterations = 16\n\n----------------------------------------------------\n\n[\n\t[\"attribute\", \"#hidden\"],\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"Example\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"attribute\", \"#key\"],\n\n\t[\"attribute\", \"#key\"],\n\t[\"operator\", \"=\"],\n\t\" value\\r\\n\",\n\n\t[\"attribute\", \"#group\"],\n\t[\"punctuation\", \"(\"],\n\n\t\"\\r\\n  multiple\",\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n  lines \",\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\t[\"punctuation\", \",\"],\n\n\t\"\\r\\n  lines \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"0\"],\n\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"Example\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"attribute\", \"#test\"],\n\t[\"punctuation\", \"(\"],\n\t\"skip \",\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\t[\"punctuation\", \",\"],\n\t\" iterations \",\n\t[\"operator\", \"=\"],\n\t[\"number\", \"32\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"function\", \"doStuff\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"attribute\", \"#doc\"],\n\t[\"operator\", \"=\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"not runtime data\\\"\"]\n\t]],\n\n\t[\"attribute\", \"#!runtimeAccess\"],\n\t[\"operator\", \"=\"],\n\t[\"boolean\", \"true\"],\n\n\t[\"attribute\", \"#!maxIterations\"],\n\t[\"operator\", \"=\"],\n\t[\"number\", \"16\"]\n]\n"
  },
  {
    "path": "tests/languages/wren/boolean_feature.test",
    "content": "true\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"boolean\", \"true\"],\n\t[\"boolean\", \"false\"]\n]\n"
  },
  {
    "path": "tests/languages/wren/class-name_feature.test",
    "content": "Foo.bar()\n\nimport \"beverages\" for Coffee, Tea\n\nclass Foo {}\nclass foo {}\n\n----------------------------------------------------\n\n[\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"bar\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\n\t[\"keyword\", \"import\"],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"beverages\\\"\"]\n\t]],\n\t[\"keyword\", \"for\"],\n\t[\"class-name\", \"Coffee\"],\n\t[\"punctuation\", \",\"],\n\t[\"class-name\", \"Tea\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"Foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"class\"],\n\t[\"class-name\", \"foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/wren/comment_feature.test",
    "content": "// comment\n\n/**/\n/* comment */\n\n/*\n/*\nnested comment\n*/\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// comment\"],\n\n\t[\"comment\", \"/**/\"],\n\t[\"comment\", \"/* comment */\"],\n\n\t[\"comment\", \"/*\\r\\n/*\\r\\nnested comment\\r\\n*/\\r\\n*/\"]\n]\n"
  },
  {
    "path": "tests/languages/wren/constant_feature.test",
    "content": "FOO\n\n----------------------------------------------------\n\n[\n\t[\"constant\", \"FOO\"]\n]\n"
  },
  {
    "path": "tests/languages/wren/function_feature.test",
    "content": "foo()\n\nfoo {|x| x * 2}\n\n----------------------------------------------------\n\n[\n\t[\"function\", \"foo\"], [\"punctuation\", \"(\"], [\"punctuation\", \")\"],\n\n\t[\"function\", \"foo\"],\n\t[\"punctuation\", \"{\"],\n\t[\"operator\", \"|\"],\n\t\"x\",\n\t[\"operator\", \"|\"],\n\t\" x \",\n\t[\"operator\", \"*\"],\n\t[\"number\", \"2\"],\n\t[\"punctuation\", \"}\"]\n]\n"
  },
  {
    "path": "tests/languages/wren/hashbang_feature.test",
    "content": "#!/usr/bin/env wren\n\n----------------------------------------------------\n\n[\n\t[\"hashbang\", \"#!/usr/bin/env wren\"]\n]\n"
  },
  {
    "path": "tests/languages/wren/keyword_feature.test",
    "content": "as;\nbreak;\nclass;\nconstruct;\ncontinue;\nelse;\nfor;\nforeign;\nif;\nimport;\nin;\nis;\nreturn;\nstatic;\nsuper;\nthis;\nvar;\nwhile;\n\nnull\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"as\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"break\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"class\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"construct\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"continue\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"else\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"for\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"foreign\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"if\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"import\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"in\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"is\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"return\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"static\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"super\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"this\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"var\"], [\"punctuation\", \";\"],\n\t[\"keyword\", \"while\"], [\"punctuation\", \";\"],\n\n\t[\"null\", \"null\"]\n]\n"
  },
  {
    "path": "tests/languages/wren/number_feature.test",
    "content": "0\n1234\n-5678\n3.14159\n1.0\n-12.34\n0.0314159e02\n0.0314159e+02\n314.159e-02\n0xcaffe2\n\n----------------------------------------------------\n\n[\n\t[\"number\", \"0\"],\n\t[\"number\", \"1234\"],\n\t[\"operator\", \"-\"], [\"number\", \"5678\"],\n\t[\"number\", \"3.14159\"],\n\t[\"number\", \"1.0\"],\n\t[\"operator\", \"-\"], [\"number\", \"12.34\"],\n\t[\"number\", \"0.0314159e02\"],\n\t[\"number\", \"0.0314159e+02\"],\n\t[\"number\", \"314.159e-02\"],\n\t[\"number\", \"0xcaffe2\"]\n]\n"
  },
  {
    "path": "tests/languages/wren/operator_feature.test",
    "content": "! ~ -\n* / % + -\n.. ...\n<< >>\n< <= > >= == !=\n& ^ |\n=\n\n&& ||\n? :\n\n1..2 1...3\n\n----------------------------------------------------\n\n[\n\t[\"operator\", \"!\"],\n\t[\"operator\", \"~\"],\n\t[\"operator\", \"-\"],\n\n\t[\"operator\", \"*\"],\n\t[\"operator\", \"/\"],\n\t[\"operator\", \"%\"],\n\t[\"operator\", \"+\"],\n\t[\"operator\", \"-\"],\n\n\t[\"operator\", \"..\"],\n\t[\"operator\", \"...\"],\n\n\t[\"operator\", \"<<\"],\n\t[\"operator\", \">>\"],\n\n\t[\"operator\", \"<\"],\n\t[\"operator\", \"<=\"],\n\t[\"operator\", \">\"],\n\t[\"operator\", \">=\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"!=\"],\n\n\t[\"operator\", \"&\"],\n\t[\"operator\", \"^\"],\n\t[\"operator\", \"|\"],\n\n\t[\"operator\", \"=\"],\n\n\t[\"operator\", \"&&\"], [\"operator\", \"||\"],\n\t[\"operator\", \"?\"], [\"operator\", \":\"],\n\n\t[\"number\", \"1\"],\n\t[\"operator\", \"..\"],\n\t[\"number\", \"2\"],\n\t[\"number\", \"1\"],\n\t[\"operator\", \"...\"],\n\t[\"number\", \"3\"]\n]\n"
  },
  {
    "path": "tests/languages/wren/punctuation_feature.test",
    "content": "( ) [ ] { }\n, ; .\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \"[\"],\n\t[\"punctuation\", \"]\"],\n\t[\"punctuation\", \"{\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \".\"]\n]\n"
  },
  {
    "path": "tests/languages/wren/string_feature.test",
    "content": "\"\"\n\"\\\"\\\\\"\n\"foo\nbar\"\n\n\"\"\"\"\"\"\n\"\"\"\nfoo\nbar\n\"\"\"\n\"\"\"\n  {\n    \"hello\": \"wren\",\n    \"from\" : \"json\"\n  }\n\"\"\"\n\n\"foo %(bar)\"\n\"foo * %(1 + 2) ~= bar\"\n\n----------------------------------------------------\n\n[\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"\\\\\\\"\\\\\\\\\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"foo\\r\\nbar\\\"\"]\n\t]],\n\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"\\\"\\\"\\\"\"],\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"\\r\\nfoo\\r\\nbar\\r\\n\\\"\\\"\\\"\"],\n\t[\"triple-quoted-string\", \"\\\"\\\"\\\"\\r\\n  {\\r\\n    \\\"hello\\\": \\\"wren\\\",\\r\\n    \\\"from\\\" : \\\"json\\\"\\r\\n  }\\r\\n\\\"\\\"\\\"\"],\n\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"foo \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"%(\"],\n\t\t\t[\"expression\", [\"bar\"]],\n\t\t\t[\"interpolation-punctuation\", \")\"]\n\t\t]],\n\t\t[\"string\", \"\\\"\"]\n\t]],\n\t[\"string-literal\", [\n\t\t[\"string\", \"\\\"foo * \"],\n\t\t[\"interpolation\", [\n\t\t\t[\"interpolation-punctuation\", \"%(\"],\n\t\t\t[\"expression\", [\n\t\t\t\t[\"number\", \"1\"],\n\t\t\t\t[\"operator\", \"+\"],\n\t\t\t\t[\"number\", \"2\"]\n\t\t\t]],\n\t\t\t[\"interpolation-punctuation\", \")\"]\n\t\t]],\n\t\t[\"string\", \" ~= bar\\\"\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/xeora/constant_feature.test",
    "content": "$DomainContents$\r\n$PageRenderDuration$\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"constant\", [\r\n\t\t[\"punctuation\", \"$\"], \"DomainContents\", [\"punctuation\", \"$\"]]],\r\n\t[\"constant\", [\r\n\t\t[\"punctuation\", \"$\"], \"PageRenderDuration\", [\"punctuation\", \"$\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for constants."
  },
  {
    "path": "tests/languages/xeora/directive-block-close_feature.test",
    "content": "}:Control3$\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive-block-close\", [\r\n\t\t[\"punctuation\", \"}\"], [\"punctuation\", \":\"], \"Control3\", [\"punctuation\", \"$\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directive-block-closes.\r\n"
  },
  {
    "path": "tests/languages/xeora/directive-block-open_feature.test",
    "content": "$C:Control2:{\r\n$C#1:Control2:{\r\n$C[ParentControl]:Control2:{\r\n$C#1[ParentControl]:Control2:{\r\n$S:Statement:{!NOCACHE\r\n$H:HttpRequest:{!RENDERONREQUEST\r\n$C:Control2:{!MESSAGETEMPLATE\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive-block-open\", [\r\n\t\t[\"punctuation\", [\"$C:\"]], \"Control2\", [\"punctuation\", [\":\"]], [\"punctuation\", [\"{\"]]]],\r\n\t[\"directive-block-open\", [\r\n\t\t[\"punctuation\", [\"$C\", [\"tag\", \"#1\"]]], [\"punctuation\", [\":\"]], \"Control2\", [\"punctuation\", [\":\"]], [\"punctuation\", [\"{\"]]]],\r\n\t[\"directive-block-open\", [\r\n\t\t[\"punctuation\", [\"$C[\"]], \"ParentControl\", [\"punctuation\", [\"]\"]], [\"punctuation\", [\":\"]], \"Control2\", [\"punctuation\", [\":\"]], [\"punctuation\", [\"{\"]]]],\r\n\t[\"directive-block-open\", [\r\n\t\t[\"punctuation\", [\"$C\", [\"tag\", \"#1\"]]], [\"punctuation\", [\"[\"]], \"ParentControl\", [\"punctuation\", [\"]\"]], [\"punctuation\", [\":\"]], \"Control2\", [\"punctuation\", [\":\"]], [\"punctuation\", [\"{\"]]]],\r\n\t[\"directive-block-open\", [\r\n\t\t[\"punctuation\", [\"$S:\"]], \"Statement\", [\"punctuation\", [\":\"]], [\"punctuation\", [\"{\"]], [\"attribute\", [[\"punctuation\", \"!\"], \"NOCACHE\"]]]],\r\n\t[\"directive-block-open\", [\r\n\t\t[\"punctuation\", [\"$H:\"]], \"HttpRequest\", [\"punctuation\", [\":\"]], [\"punctuation\", [\"{\"]], [\"attribute\", [[\"punctuation\", \"!\"], \"RENDERONREQUEST\"]]]],\r\n\t[\"directive-block-open\", [\r\n\t\t[\"punctuation\", [\"$C:\"]], \"Control2\", [\"punctuation\", [\":\"]], [\"punctuation\", [\"{\"]], [\"attribute\", [[\"punctuation\", \"!\"], \"MESSAGETEMPLATE\"]]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directive-block-opens."
  },
  {
    "path": "tests/languages/xeora/directive-block-separator_feature.test",
    "content": "}:Control3:{\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive-block-separator\", [\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"Control3\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"punctuation\", \"{\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/xeora/directive-inline_feature.test",
    "content": "$C:Control2$\r\n$C#1:Control2$\r\n$C[ParentControl]:Control2$\r\n$C#1[ParentControl]:Control2$\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive-inline\", [\r\n\t\t[\"punctuation\", [\"$C:\"]], \"Control2\", [\"punctuation\", [\"$\"]]]],\r\n\t[\"directive-inline\", [\r\n\t\t[\"punctuation\", [\"$C\", [\"tag\", \"#1\"]]], [\"punctuation\", [\":\"]], \"Control2\", [\"punctuation\", [\"$\"]]]],\r\n\t[\"directive-inline\", [\r\n\t\t[\"punctuation\", [\"$C[\"]], \"ParentControl\", [\"punctuation\", [\"]\"]], [\"punctuation\", [\":\"]], \"Control2\", [\"punctuation\", [\"$\"]]]],\r\n\t[\"directive-inline\", [\r\n\t\t[\"punctuation\", [\"$C\", [\"tag\", \"#1\"]]], [\"punctuation\", [\"[\"]], \"ParentControl\", [\"punctuation\", [\"]\"]], [\"punctuation\", [\":\"]], \"Control2\", [\"punctuation\", [\"$\"]]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directive-inlines."
  },
  {
    "path": "tests/languages/xeora/function-block_feature.test",
    "content": "$XF:{Library?ClassName.FuncName}:XF$\r\n$XF:{Library?ClassName.FuncName,=Param1|~Param2}:XF$\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function-block\", [\r\n\t\t[\"punctuation\", \"$\"],\r\n\t\t\"XF\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t\"Library\",\r\n\t\t[\"punctuation\", \"?\"],\r\n\t\t\"ClassName\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"FuncName\",\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"XF\",\r\n\t\t[\"punctuation\", \"$\"]\r\n\t]],\r\n\t[\"function-block\", [\r\n\t\t[\"punctuation\", \"$\"],\r\n\t\t\"XF\",\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t[\"punctuation\", \"{\"],\r\n\t\t\"Library\",\r\n\t\t[\"punctuation\", \"?\"],\r\n\t\t\"ClassName\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"FuncName\",\r\n\t\t[\"variable\", [[\"punctuation\", \",\"], [\"operator\", \"=\"], \"Param1\"]],\r\n\t\t[\"variable\", [[\"punctuation\", \"|\"], [\"operator\", \"~\"], \"Param2\"]],\r\n\t\t[\"punctuation\", \"}\"],\r\n\t\t[\"punctuation\", \":\"],\r\n\t\t\"XF\",\r\n\t\t[\"punctuation\", \"$\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for function-inlines."
  },
  {
    "path": "tests/languages/xeora/function-inline_feature.test",
    "content": "$F:Library?ClassName.FuncName$\r\n$F:Library?ClassName.FuncName,=Param1|~Param2$\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function-inline\", [\r\n\t\t[\"punctuation\", \"$F:\"],\r\n\t\t\"Library\",\r\n\t\t[\"punctuation\", \"?\"],\r\n\t\t\"ClassName\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"FuncName\",\r\n\t\t[\"punctuation\", \"$\"]\r\n\t]],\r\n\t[\"function-inline\", [\r\n\t\t[\"punctuation\", \"$F:\"],\r\n\t\t\"Library\",\r\n\t\t[\"punctuation\", \"?\"],\r\n\t\t\"ClassName\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"FuncName\",\r\n\t\t[\"variable\", [[\"punctuation\", \",\"], [\"operator\", \"=\"], \"Param1\"]],\r\n\t\t[\"variable\", [[\"punctuation\", \"|\"], [\"operator\", \"~\"], \"Param2\"]],\r\n\t\t[\"punctuation\", \"$\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for function-inlines."
  },
  {
    "path": "tests/languages/xeora/variable_feature.test",
    "content": "$SearchKey$\r\n$^SearchKey$\r\n$~SearchKey$\r\n$-SearchKey$\r\n$+SearchKey$\r\n$=SearchKey$\r\n$#SearchKey$\r\n$*SearchKey$\r\n$@SearchObject.SearchProperty$\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", [\r\n\t\t[\"punctuation\", \"$\"], \"SearchKey\", [\"punctuation\", \"$\"]]],\r\n\t[\"variable\", [\r\n\t\t[\"punctuation\", \"$\"], [\"operator\", \"^\"], \"SearchKey\", [\"punctuation\", \"$\"]]],\r\n\t[\"variable\", [\r\n\t\t[\"punctuation\", \"$\"], [\"operator\", \"~\"], \"SearchKey\", [\"punctuation\", \"$\"]]],\r\n\t[\"variable\", [\r\n\t\t[\"punctuation\", \"$\"], [\"operator\", \"-\"], \"SearchKey\", [\"punctuation\", \"$\"]]],\r\n\t[\"variable\", [\r\n\t\t[\"punctuation\", \"$\"], [\"operator\", \"+\"], \"SearchKey\", [\"punctuation\", \"$\"]]],\r\n\t[\"variable\", [\r\n\t\t[\"punctuation\", \"$\"], [\"operator\", \"=\"], \"SearchKey\", [\"punctuation\", \"$\"]]],\r\n\t[\"variable\", [\r\n\t\t[\"punctuation\", \"$\"], [\"operator\", \"#\"], \"SearchKey\", [\"punctuation\", \"$\"]]],\r\n\t[\"variable\", [\r\n\t\t[\"punctuation\", \"$\"], [\"operator\", \"*\"], \"SearchKey\", [\"punctuation\", \"$\"]]],\r\n\t[\"variable\", [\r\n\t\t[\"punctuation\", \"$\"], [\"operator\", \"@\"], \"SearchObject\", [\"punctuation\", \".\"], \"SearchProperty\", [\"punctuation\", \"$\"]]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/xml/cdata_feature.test",
    "content": "<![CDATA[ foo bar baz ]]>\n<![CDATA[\nfoo bar baz\n]]>\n\n----------------------------------------------------\n\n[\n\t[\"cdata\", \"<![CDATA[ foo bar baz ]]>\"],\n\t[\"cdata\", \"<![CDATA[\\r\\nfoo bar baz\\r\\n]]>\"]\n]\n\n----------------------------------------------------\n\nChecks for CDATA sections, single-line and multi-line."
  },
  {
    "path": "tests/languages/xml/comment_feature.test",
    "content": "<!---->\n<!-- foo bar -->\n<!-- foo bar\nbaz -->\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"<!---->\"],\n\t[\"comment\", \"<!-- foo bar -->\"],\n\t[\"comment\", \"<!-- foo bar\\r\\nbaz -->\"]\n]\n\n----------------------------------------------------\n\nChecks for empty comment, single-line comment and multi-line comment."
  },
  {
    "path": "tests/languages/xml/doctype_feature.test",
    "content": "<!DOCTYPE html>\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<!DOCTYPE greeting SYSTEM \"hello.dtd\">\n<!DOCTYPE greeting [\n\t<!ELEMENT greeting (#PCDATA)>\n]>\n<!DOCTYPE greeting [\n\t<!ELEMENT greeting (#PCDATA)>\n\t<!ELEMENT subject (#PCDATA)>\n\t<!-- comment ]> -->\n]>\n\n----------------------------------------------------\n\n[\n\t[\"doctype\", [\n\t\t[\"punctuation\", \"<!\"],\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\n\t\t[\"name\", \"html\"],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"doctype\", [\n\t\t[\"punctuation\", \"<!\"],\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\n\t\t[\"name\", \"HTML\"],\n\t\t[\"name\", \"PUBLIC\"],\n\t\t[\"string\", \"\\\"-//W3C//DTD HTML 4.01//EN\\\"\"],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"doctype\", [\n\t\t[\"punctuation\", \"<!\"],\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\n\t\t[\"name\", \"html\"],\n\t\t[\"name\", \"PUBLIC\"],\n\t\t[\"string\", \"\\\"-//W3C//DTD XHTML 1.0 Strict//EN\\\"\"],\n\n\t\t[\"string\", \"\\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\\\"\"],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"doctype\", [\n\t\t[\"punctuation\", \"<!\"],\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\n\t\t[\"name\", \"greeting\"],\n\t\t[\"name\", \"SYSTEM\"],\n\t\t[\"string\", \"\\\"hello.dtd\\\"\"],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"doctype\", [\n\t\t[\"punctuation\", \"<!\"],\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\n\t\t[\"name\", \"greeting\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"internal-subset\", [\n\t\t\t[\"tag\", [\n\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t[\"tag\", [\"!ELEMENT\"]],\n\t\t\t\t[\"attr-name\", [\"greeting\"]],\n\t\t\t\t[\"attr-name\", [\"(#PCDATA)\"]],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]]\n\t\t]],\n\t\t[\"punctuation\", \"]\"],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"doctype\", [\n\t\t[\"punctuation\", \"<!\"],\n\t\t[\"doctype-tag\", \"DOCTYPE\"],\n\t\t[\"name\", \"greeting\"],\n\t\t[\"punctuation\", \"[\"],\n\t\t[\"internal-subset\", [\n\t\t\t[\"tag\", [\n\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t[\"tag\", [\"!ELEMENT\"]],\n\t\t\t\t[\"attr-name\", [\"greeting\"]],\n\t\t\t\t[\"attr-name\", [\"(#PCDATA)\"]],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]],\n\t\t\t[\"tag\", [\n\t\t\t\t[\"punctuation\", \"<\"],\n\t\t\t\t[\"tag\", [\"!ELEMENT\"]],\n\t\t\t\t[\"attr-name\", [\"subject\"]],\n\t\t\t\t[\"attr-name\", [\"(#PCDATA)\"]],\n\t\t\t\t[\"punctuation\", \">\"]\n\t\t\t]],\n\t\t\t[\"comment\", \"<!-- comment ]> -->\"]\n\t\t]],\n\t\t[\"punctuation\", \"]\"],\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for different doctypes, single-line and multi-line.\n"
  },
  {
    "path": "tests/languages/xml/entity_feature.html.test",
    "content": "&amp;\n&thetasym;\n&#65;\n&#x41;\n&#x26f5;\n\n----------------------------------------------------\n\n<span class=\"token entity named-entity\" title=\"&amp;\">&amp;amp;</span>\n<span class=\"token entity named-entity\" title=\"&thetasym;\">&amp;thetasym;</span>\n<span class=\"token entity\" title=\"&#65;\">&amp;#65;</span>\n<span class=\"token entity\" title=\"&#x41;\">&amp;#x41;</span>\n<span class=\"token entity\" title=\"&#x26f5;\">&amp;#x26f5;</span>\n\n----------------------------------------------------\n\nChecks for HTML/XML character entity references.\n"
  },
  {
    "path": "tests/languages/xml/issue3441.test",
    "content": "<google-chart data='[[\"Month\", \"Days\"], [\"Jan\", 31]]'></google-chart>\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"google-chart\"]],\n\t\t[\"attr-name\", [\"data\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"'\"],\n\t\t\t\"[[\\\"Month\\\", \\\"Days\\\"], [\\\"Jan\\\", 31]]\",\n\t\t\t[\"punctuation\", \"'\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"google-chart\"]],\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/xml/issue585.test",
    "content": "<Läufer>foo</Läufer>\n<tag läufer=\"läufer\">\n<läufer:tag>baz</läufer:tag>\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"Läufer\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\"foo\",\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"Läufer\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"tag\"]],\n\t\t[\"attr-name\", [\"läufer\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\"läufer\",\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\n\t\t\t[\"namespace\", \"läufer:\"],\n\t\t\t\"tag\"\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\"baz\",\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\n\t\t\t[\"namespace\", \"läufer:\"],\n\t\t\t\"tag\"\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for tags, attributes and namespaces containing unicode characters.\nSee #585 for details.\n"
  },
  {
    "path": "tests/languages/xml/issue888.test",
    "content": "<android.support.v7.widget.CardView>\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"android.support.v7.widget.CardView\"]],\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for tag names containing dots.\nSee #888 for details.\n"
  },
  {
    "path": "tests/languages/xml/prolog_feature.test",
    "content": "<?xml version=\"1.0\"?>\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<?xml-stylesheet href=\"tei2html.xsl\"\ntype=\"text/xsl\"?>\n\n----------------------------------------------------\n\n[\n\t[\"prolog\", \"<?xml version=\\\"1.0\\\"?>\"],\n\t[\"prolog\", \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\"],\n\t[\"prolog\", \"<?xml-stylesheet href=\\\"tei2html.xsl\\\"\\r\\ntype=\\\"text/xsl\\\"?>\"]\n]\n\n----------------------------------------------------\n\nChecks for different XML prologs, single-line and multi-line."
  },
  {
    "path": "tests/languages/xml/tag_attribute_feature.test",
    "content": "<div class=\"test\" foo bar=baz>\n<div foo='bar'>\n<div class=\"foo\nbar\nbaz\">\n<div foo:bar=42>\n<div foo = 42 bar = \"42\">\n<div foo=\"=\\\"bar=baz/>\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"attr-name\", [\"class\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\"test\",\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"attr-name\", [\"foo\"]],\n\t\t[\"attr-name\", [\"bar\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\"baz\"\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"attr-name\", [\"foo\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"'\"],\n\t\t\t\"bar\",\n\t\t\t[\"punctuation\", \"'\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"attr-name\", [\"class\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\"foo\\r\\nbar\\r\\nbaz\",\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"attr-name\", [\n\t\t\t[\"namespace\", \"foo:\"],\n\t\t\t\"bar\"\n\t\t]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\"42\"\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"attr-name\", [\"foo\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\" 42\"\n\t\t]],\n\t\t[\"attr-name\", [\"bar\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\"42\",\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"attr-name\", [\"foo\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t[\"punctuation\", \"\\\"\"],\n\t\t\t\"=\\\\\",\n\t\t\t[\"punctuation\", \"\\\"\"]\n\t\t]],\n\t\t[\"attr-name\", [\"bar\"]],\n\t\t[\"attr-value\", [\n\t\t\t[\"punctuation\", \"=\"],\n\t\t\t\"baz/\"\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for single-quoted, double-quoted and unquoted attributes, attributes without value and\nnamespaced attributes.\n"
  },
  {
    "path": "tests/languages/xml/tag_feature.test",
    "content": "<p></p>\n<div>dummy</div>\n<div\n> </div\n>\n<foo:bar> </foo:bar>\n<div\n\n----------------------------------------------------\n\n[\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"p\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t\"dummy\",\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\"div\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"], [\"tag\", [\"div\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"], [\"tag\", [\"div\"]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t[\"tag\", [\n\t\t[\"punctuation\", \"<\"],\n\t\t[\"tag\", [\n\t\t\t[\"namespace\", \"foo:\"],\n\t\t\t\"bar\"\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\t[\"tag\", [\n\t\t[\"punctuation\", \"</\"],\n\t\t[\"tag\", [\n\t\t\t[\"namespace\", \"foo:\"],\n\t\t\t\"bar\"\n\t\t]],\n\t\t[\"punctuation\", \">\"]\n\t]],\n\n\t\"\\r\\n<div\"\n]\n\n----------------------------------------------------\n\nChecks for empty tags, tags that span multiple lines and namespaces in tag names.\nAlso checks that unclosed tags (e.g. \"<div\") are not highlighted.\n"
  },
  {
    "path": "tests/languages/xml+http/issue2733.test",
    "content": "HTTP/1.1 200 OK\nconnection: keep-alive\ncontent-type: application/xml\ndate: Sat, 23 Jan 2021 20:36:14 GMT\nkeep-alive: timeout=60\ntransfer-encoding: chunked\n\n<xml>\n    <one>Data</one>\n    <two>More Data</two>\n</xml>\n\n----------------------------------------------------\n\n[\n\t[\"response-status\", [\n\t\t[\"http-version\", \"HTTP/1.1\"],\n\t\t[\"status-code\", \"200\"],\n\t\t[\"reason-phrase\", \"OK\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"connection\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"keep-alive\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"content-type\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"application/xml\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"date\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"Sat, 23 Jan 2021 20:36:14 GMT\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"keep-alive\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"timeout=60\"]\n\t]],\n\n\t[\"header\", [\n\t\t[\"header-name\", \"transfer-encoding\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"chunked\"]\n\t]],\n\n\t[\"application-xml\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t[\"tag\", [\"xml\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]],\n\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t[\"tag\", [\"one\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]],\n\t\t\"Data\",\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"</\"],\n\t\t\t[\"tag\", [\"one\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]],\n\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t[\"tag\", [\"two\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]],\n\t\t\"More Data\",\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"</\"],\n\t\t\t[\"tag\", [\"two\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]],\n\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"</\"],\n\t\t\t[\"tag\", [\"xml\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/xml+http/text-xml_inclusion.test",
    "content": "Content-type: text/xml\n\n<foo></foo>\n\n----------------------------------------------------\n\n[\n\t[\"header\", [\n\t\t[\"header-name\", \"Content-type\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"text/xml\"]\n\t]],\n\t[\"text-xml\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t[\"tag\", [\"foo\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]],\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"</\"],\n\t\t\t[\"tag\", [\"foo\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for XML content in HTTP.\n"
  },
  {
    "path": "tests/languages/xml+http/xml-suffix_inclusion.test",
    "content": "Content-type: text/x.anything+something-else+xml\n\n<foo></foo>\n\n----------------------------------------------------\n\n[\n\t[\"header\", [\n\t\t[\"header-name\", \"Content-type\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"text/x.anything+something-else+xml\"]\n\t]],\n\t[\"application-xml\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t[\"tag\", [\"foo\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]],\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"</\"],\n\t\t\t[\"tag\", [\"foo\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for content with XML suffix in HTTP.\n"
  },
  {
    "path": "tests/languages/xml+http/xml_inclusion.test",
    "content": "Content-type: application/xml\n\n<foo></foo>\n\n----------------------------------------------------\n\n[\n\t[\"header\", [\n\t\t[\"header-name\", \"Content-type\"],\n\t\t[\"punctuation\", \":\"],\n\t\t[\"header-value\", \"application/xml\"]\n\t]],\n\t[\"application-xml\", [\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"<\"],\n\t\t\t[\"tag\", [\"foo\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]],\n\t\t[\"tag\", [\n\t\t\t[\"punctuation\", \"</\"],\n\t\t\t[\"tag\", [\"foo\"]],\n\t\t\t[\"punctuation\", \">\"]\n\t\t]]\n\t]]\n]\n\n----------------------------------------------------\n\nChecks for XML content in HTTP.\n"
  },
  {
    "path": "tests/languages/xojo/comment_feature.test",
    "content": "' Foobar\r\n// Foobar\r\nRem Foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"' Foobar\"],\r\n\t[\"comment\", \"// Foobar\"],\r\n\t[\"comment\", \"Rem Foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments and remarks."
  },
  {
    "path": "tests/languages/xojo/directive_feature.test",
    "content": "#If\n#Else\n#ElseIf\n#Endif\n#Pragma\n\n----------------------------------------------------\n\n[\n\t[\"directive\", \"#If\"],\n\t[\"directive\", \"#Else\"],\n\t[\"directive\", \"#ElseIf\"],\n\t[\"directive\", \"#Endif\"],\n\t[\"directive\", \"#Pragma\"]\n]\n\n----------------------------------------------------\n\nChecks for conditional compilation and pragma.\n"
  },
  {
    "path": "tests/languages/xojo/keyword_feature.test",
    "content": "AddHandler\r\nApp\r\nArray\r\nAs\r\nAssigns\r\nAuto\r\nBoolean\r\nByRef\r\nByte\r\nByVal\r\nBreak\r\nCall\r\nCase\r\nCatch\r\nCFStringRef\r\nCGFloat\r\nClass\r\nColor\r\nConst\r\nContinue\r\nCString\r\nCurrency\r\nCurrentMethodName\r\nDeclare\r\nDelegate\r\nDim\r\nDo\r\nDouble\r\nDownTo\r\nEach\r\nElse\r\nElseIf\r\nEnd\r\nEnumeration\r\nEvent\r\nException\r\nExit\r\nExtends\r\nFalse\r\nFinally\r\nFor\r\nFunction\r\nGet\r\nGetTypeInfo\r\nGlobal\r\nGOTO\r\nIf\r\nImplements\r\nIn\r\nInherits\r\nInteger\r\nInterface\r\nInt8\r\nInt16\r\nInt32\r\nInt64\r\nLib\r\nLoop\r\nMe\r\nModule\r\nNext\r\nNil\r\nObject\r\nOptional\r\nParamArray\r\nPrivate\r\nProperty\r\nProtected\r\nPString\r\nPtr\r\nRaise\r\nRaiseEvent\r\nReDim\r\nRemoveHandler\r\nReturn\r\nSelect\r\nSelector\r\nSelf\r\nSet\r\nSingle\r\nShared\r\nShort\r\nSoft\r\nStatic\r\nStep\r\nString\r\nSub\r\nSuper\r\nText\r\nThen\r\nTo\r\nTrue\r\nTry\r\nUbound\r\nUInteger\r\nUInt8\r\nUInt16\r\nUInt32\r\nUInt64\r\nUntil\r\nUsing\r\nVar\r\nVariant\r\nWend\r\nWhile\r\nWindowPtr\r\nWString\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"AddHandler\"],\r\n\t[\"keyword\", \"App\"],\r\n\t[\"keyword\", \"Array\"],\r\n\t[\"keyword\", \"As\"],\r\n\t[\"keyword\", \"Assigns\"],\r\n\t[\"keyword\", \"Auto\"],\r\n\t[\"keyword\", \"Boolean\"],\r\n\t[\"keyword\", \"ByRef\"],\r\n\t[\"keyword\", \"Byte\"],\r\n\t[\"keyword\", \"ByVal\"],\r\n\t[\"keyword\", \"Break\"],\r\n\t[\"keyword\", \"Call\"],\r\n\t[\"keyword\", \"Case\"],\r\n\t[\"keyword\", \"Catch\"],\r\n\t[\"keyword\", \"CFStringRef\"],\r\n\t[\"keyword\", \"CGFloat\"],\r\n\t[\"keyword\", \"Class\"],\r\n\t[\"keyword\", \"Color\"],\r\n\t[\"keyword\", \"Const\"],\r\n\t[\"keyword\", \"Continue\"],\r\n\t[\"keyword\", \"CString\"],\r\n\t[\"keyword\", \"Currency\"],\r\n\t[\"keyword\", \"CurrentMethodName\"],\r\n\t[\"keyword\", \"Declare\"],\r\n\t[\"keyword\", \"Delegate\"],\r\n\t[\"keyword\", \"Dim\"],\r\n\t[\"keyword\", \"Do\"],\r\n\t[\"keyword\", \"Double\"],\r\n\t[\"keyword\", \"DownTo\"],\r\n\t[\"keyword\", \"Each\"],\r\n\t[\"keyword\", \"Else\"],\r\n\t[\"keyword\", \"ElseIf\"],\r\n\t[\"keyword\", \"End\"],\r\n\t[\"keyword\", \"Enumeration\"],\r\n\t[\"keyword\", \"Event\"],\r\n\t[\"keyword\", \"Exception\"],\r\n\t[\"keyword\", \"Exit\"],\r\n\t[\"keyword\", \"Extends\"],\r\n\t[\"keyword\", \"False\"],\r\n\t[\"keyword\", \"Finally\"],\r\n\t[\"keyword\", \"For\"],\r\n\t[\"keyword\", \"Function\"],\r\n\t[\"keyword\", \"Get\"],\r\n\t[\"keyword\", \"GetTypeInfo\"],\r\n\t[\"keyword\", \"Global\"],\r\n\t[\"keyword\", \"GOTO\"],\r\n\t[\"keyword\", \"If\"],\r\n\t[\"keyword\", \"Implements\"],\r\n\t[\"keyword\", \"In\"],\r\n\t[\"keyword\", \"Inherits\"],\r\n\t[\"keyword\", \"Integer\"],\r\n\t[\"keyword\", \"Interface\"],\r\n\t[\"keyword\", \"Int8\"],\r\n\t[\"keyword\", \"Int16\"],\r\n\t[\"keyword\", \"Int32\"],\r\n\t[\"keyword\", \"Int64\"],\r\n\t[\"keyword\", \"Lib\"],\r\n\t[\"keyword\", \"Loop\"],\r\n\t[\"keyword\", \"Me\"],\r\n\t[\"keyword\", \"Module\"],\r\n\t[\"keyword\", \"Next\"],\r\n\t[\"keyword\", \"Nil\"],\r\n\t[\"keyword\", \"Object\"],\r\n\t[\"keyword\", \"Optional\"],\r\n\t[\"keyword\", \"ParamArray\"],\r\n\t[\"keyword\", \"Private\"],\r\n\t[\"keyword\", \"Property\"],\r\n\t[\"keyword\", \"Protected\"],\r\n\t[\"keyword\", \"PString\"],\r\n\t[\"keyword\", \"Ptr\"],\r\n\t[\"keyword\", \"Raise\"],\r\n\t[\"keyword\", \"RaiseEvent\"],\r\n\t[\"keyword\", \"ReDim\"],\r\n\t[\"keyword\", \"RemoveHandler\"],\r\n\t[\"keyword\", \"Return\"],\r\n\t[\"keyword\", \"Select\"],\r\n\t[\"keyword\", \"Selector\"],\r\n\t[\"keyword\", \"Self\"],\r\n\t[\"keyword\", \"Set\"],\r\n\t[\"keyword\", \"Single\"],\r\n\t[\"keyword\", \"Shared\"],\r\n\t[\"keyword\", \"Short\"],\r\n\t[\"keyword\", \"Soft\"],\r\n\t[\"keyword\", \"Static\"],\r\n\t[\"keyword\", \"Step\"],\r\n\t[\"keyword\", \"String\"],\r\n\t[\"keyword\", \"Sub\"],\r\n\t[\"keyword\", \"Super\"],\r\n\t[\"keyword\", \"Text\"],\r\n\t[\"keyword\", \"Then\"],\r\n\t[\"keyword\", \"To\"],\r\n\t[\"keyword\", \"True\"],\r\n\t[\"keyword\", \"Try\"],\r\n\t[\"keyword\", \"Ubound\"],\r\n\t[\"keyword\", \"UInteger\"],\r\n\t[\"keyword\", \"UInt8\"],\r\n\t[\"keyword\", \"UInt16\"],\r\n\t[\"keyword\", \"UInt32\"],\r\n\t[\"keyword\", \"UInt64\"],\r\n\t[\"keyword\", \"Until\"],\r\n\t[\"keyword\", \"Using\"],\r\n\t[\"keyword\", \"Var\"],\r\n\t[\"keyword\", \"Variant\"],\r\n\t[\"keyword\", \"Wend\"],\r\n\t[\"keyword\", \"While\"],\r\n\t[\"keyword\", \"WindowPtr\"],\r\n\t[\"keyword\", \"WString\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/xojo/number_feature.test",
    "content": "42\r\n3.14159\r\n0.5e8\r\n5.7e-74\r\n&b0110\r\n&cBadFace0\r\n&hBadFace\r\n&o742\r\n&u9\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"42\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"0.5e8\"],\r\n\t[\"number\", \"5.7e-74\"],\r\n\t[\"number\", \"&b0110\"],\r\n\t[\"number\", \"&cBadFace0\"],\r\n\t[\"number\", \"&hBadFace\"],\r\n\t[\"number\", \"&o742\"],\r\n\t[\"number\", \"&u9\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers and colors."
  },
  {
    "path": "tests/languages/xojo/operator_feature.test",
    "content": "< <= <>\r\n> >=\r\n+ - *\r\n/ \\ ^\r\n=\r\nAddressOf And\r\nCtype Is IsA\r\nMod New Not\r\nOr Xor WeakAddressOf\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<>\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"],\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"], [\"operator\", \"\\\\\"], [\"operator\", \"^\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"AddressOf\"], [\"operator\", \"And\"],\r\n\t[\"operator\", \"Ctype\"], [\"operator\", \"Is\"], [\"operator\", \"IsA\"],\r\n\t[\"operator\", \"Mod\"], [\"operator\", \"New\"], [\"operator\", \"Not\"],\r\n\t[\"operator\", \"Or\"], [\"operator\", \"Xor\"], [\"operator\", \"WeakAddressOf\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/xojo/punctuation_feature.test",
    "content": ". , ; : ( )\n\n----------------------------------------------------\n\n[\n\t[\"punctuation\", \".\"],\n\t[\"punctuation\", \",\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \":\"],\n\t[\"punctuation\", \"(\"],\n\t[\"punctuation\", \")\"]\n]\n"
  },
  {
    "path": "tests/languages/xojo/string_feature.test",
    "content": "\"\"\r\n\"\"\"\"\r\n\"Foo \"\"bar\"\"\"\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"\\\"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Foo \\\"\\\"bar\\\"\\\"\\\"\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/xquery/axis_feature.test",
    "content": "self::\r\nchild::\r\ndescendant::\r\ndescendant-or-self::\r\nattribute::\r\nfollowing::\r\nfollowing-sibling::\r\nparent::\r\nancestor::\r\nancestor-or-self::\r\npreceding::\r\npreceding-sibling::\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"axis\", \"self\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"],\r\n\t[\"axis\", \"child\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"],\r\n\t[\"axis\", \"descendant\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"],\r\n\t[\"axis\", \"descendant-or-self\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"],\r\n\t[\"axis\", \"attribute\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"],\r\n\t[\"axis\", \"following\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"],\r\n\t[\"axis\", \"following-sibling\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"],\r\n\t[\"axis\", \"parent\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"],\r\n\t[\"axis\", \"ancestor\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"],\r\n\t[\"axis\", \"ancestor-or-self\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"],\r\n\t[\"axis\", \"preceding\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"],\r\n\t[\"axis\", \"preceding-sibling\"], [\"punctuation\", \":\"], [\"punctuation\", \":\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for axes."
  },
  {
    "path": "tests/languages/xquery/builtin_feature.test",
    "content": "attribute foo\r\ncomment\r\ndocument\r\nelement foo\r\nprocessing-instruction\r\ntext\r\nxs:anyAtomicType\r\nxs:anyType\r\nxs:anyURI\r\nxs:base64Binary\r\nxs:boolean\r\nxs:byte\r\nxs:date\r\nxs:dateTime\r\nxs:dayTimeDuration\r\nxs:decimal\r\nxs:double\r\nxs:duration\r\nxs:ENTITIES\r\nxs:ENTITY\r\nxs:float\r\nxs:gDay\r\nxs:gMonth\r\nxs:gMonthDay\r\nxs:gYear\r\nxs:gYearMonth\r\nxs:hexBinary\r\nxs:ID\r\nxs:IDREF\r\nxs:IDREFS\r\nxs:int\r\nxs:integer\r\nxs:language\r\nxs:long\r\nxs:Name\r\nxs:NCName\r\nxs:negativeInteger\r\nxs:NMTOKEN\r\nxs:NMTOKENS\r\nxs:nonNegativeInteger\r\nxs:nonPositiveInteger\r\nxs:normalizedString\r\nxs:NOTATION\r\nxs:positiveInteger\r\nxs:QName\r\nxs:short\r\nxs:string\r\nxs:time\r\nxs:token\r\nxs:unsignedByte\r\nxs:unsignedInt\r\nxs:unsignedLong\r\nxs:unsignedShort\r\nxs:untyped\r\nxs:untypedAtomic\r\nxs:yearMonthDuration\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"attribute\"],\r\n\t[\"xquery-attribute\", \"foo\"],\r\n\t[\"builtin\", \"comment\"],\r\n\t[\"builtin\", \"document\"],\r\n\t[\"builtin\", \"element\"],\r\n\t[\"xquery-element\", \"foo\"],\r\n\t[\"builtin\", \"processing-instruction\"],\r\n\t[\"builtin\", \"text\"],\r\n\t[\"builtin\", \"xs:anyAtomicType\"],\r\n\t[\"builtin\", \"xs:anyType\"],\r\n\t[\"builtin\", \"xs:anyURI\"],\r\n\t[\"builtin\", \"xs:base64Binary\"],\r\n\t[\"builtin\", \"xs:boolean\"],\r\n\t[\"builtin\", \"xs:byte\"],\r\n\t[\"builtin\", \"xs:date\"],\r\n\t[\"builtin\", \"xs:dateTime\"],\r\n\t[\"builtin\", \"xs:dayTimeDuration\"],\r\n\t[\"builtin\", \"xs:decimal\"],\r\n\t[\"builtin\", \"xs:double\"],\r\n\t[\"builtin\", \"xs:duration\"],\r\n\t[\"builtin\", \"xs:ENTITIES\"],\r\n\t[\"builtin\", \"xs:ENTITY\"],\r\n\t[\"builtin\", \"xs:float\"],\r\n\t[\"builtin\", \"xs:gDay\"],\r\n\t[\"builtin\", \"xs:gMonth\"],\r\n\t[\"builtin\", \"xs:gMonthDay\"],\r\n\t[\"builtin\", \"xs:gYear\"],\r\n\t[\"builtin\", \"xs:gYearMonth\"],\r\n\t[\"builtin\", \"xs:hexBinary\"],\r\n\t[\"builtin\", \"xs:ID\"],\r\n\t[\"builtin\", \"xs:IDREF\"],\r\n\t[\"builtin\", \"xs:IDREFS\"],\r\n\t[\"builtin\", \"xs:int\"],\r\n\t[\"builtin\", \"xs:integer\"],\r\n\t[\"builtin\", \"xs:language\"],\r\n\t[\"builtin\", \"xs:long\"],\r\n\t[\"builtin\", \"xs:Name\"],\r\n\t[\"builtin\", \"xs:NCName\"],\r\n\t[\"builtin\", \"xs:negativeInteger\"],\r\n\t[\"builtin\", \"xs:NMTOKEN\"],\r\n\t[\"builtin\", \"xs:NMTOKENS\"],\r\n\t[\"builtin\", \"xs:nonNegativeInteger\"],\r\n\t[\"builtin\", \"xs:nonPositiveInteger\"],\r\n\t[\"builtin\", \"xs:normalizedString\"],\r\n\t[\"builtin\", \"xs:NOTATION\"],\r\n\t[\"builtin\", \"xs:positiveInteger\"],\r\n\t[\"builtin\", \"xs:QName\"],\r\n\t[\"builtin\", \"xs:short\"],\r\n\t[\"builtin\", \"xs:string\"],\r\n\t[\"builtin\", \"xs:time\"],\r\n\t[\"builtin\", \"xs:token\"],\r\n\t[\"builtin\", \"xs:unsignedByte\"],\r\n\t[\"builtin\", \"xs:unsignedInt\"],\r\n\t[\"builtin\", \"xs:unsignedLong\"],\r\n\t[\"builtin\", \"xs:unsignedShort\"],\r\n\t[\"builtin\", \"xs:untyped\"],\r\n\t[\"builtin\", \"xs:untypedAtomic\"],\r\n\t[\"builtin\", \"xs:yearMonthDuration\"]\r\n]\r\n\r\n----------------------------------------------------\r\nChecks for builtin types."
  },
  {
    "path": "tests/languages/xquery/extension_feature.test",
    "content": "(# datypic:timeOut 200 #)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"extension\", \"(# datypic:timeOut 200 #)\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for extensions."
  },
  {
    "path": "tests/languages/xquery/function_feature.test",
    "content": "doc(\"catalog.xml\")\r\ngenerate-id($prod)\r\nxs:QName(\"strings:trim\")\r\ndeclare function prod:countProds ($prods as element(product)*) as xs:string\r\nfalse()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"function\", \"doc\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\"catalog.xml\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"function\", \"generate-id\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"$prod\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"function\", \"xs:QName\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\"strings:trim\\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"declare\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"function\", \"prod:countProds\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"$prods\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"function\", \"element\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"product\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"as\"],\r\n\t[\"builtin\", \"xs:string\"],\r\n\t[\"function\", \"false\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for functions."
  },
  {
    "path": "tests/languages/xquery/keyword-operator_feature.test",
    "content": "and\r\ncastable as\r\ndiv\r\neq\r\nexcept\r\nge\r\ngt\r\nidiv\r\ninstance of\r\nintersect\r\nis\r\nle\r\nlt\r\nmod\r\nne\r\nor\r\nunion\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword-operator\", \"and\"],\r\n\t[\"keyword-operator\", \"castable as\"],\r\n\t[\"keyword-operator\", \"div\"],\r\n\t[\"keyword-operator\", \"eq\"],\r\n\t[\"keyword-operator\", \"except\"],\r\n\t[\"keyword-operator\", \"ge\"],\r\n\t[\"keyword-operator\", \"gt\"],\r\n\t[\"keyword-operator\", \"idiv\"],\r\n\t[\"keyword-operator\", \"instance of\"],\r\n\t[\"keyword-operator\", \"intersect\"],\r\n\t[\"keyword-operator\", \"is\"],\r\n\t[\"keyword-operator\", \"le\"],\r\n\t[\"keyword-operator\", \"lt\"],\r\n\t[\"keyword-operator\", \"mod\"],\r\n\t[\"keyword-operator\", \"ne\"],\r\n\t[\"keyword-operator\", \"or\"],\r\n\t[\"keyword-operator\", \"union\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keyword operators."
  },
  {
    "path": "tests/languages/xquery/keyword_feature.test",
    "content": "as\r\nascending\r\nat\r\nbase-uri\r\nboundary-space\r\ncase\r\ncast as\r\ncollation\r\nconstruction\r\ncopy-namespaces\r\ndeclare\r\ndefault\r\ndescending\r\nelse\r\nempty greatest\r\nempty least\r\nencoding\r\nevery\r\nexternal\r\nfor\r\nfunction\r\nif\r\nimport\r\nin\r\ninherit\r\nlax\r\nlet\r\nmap\r\nmodule\r\nnamespace\r\nno-inherit\r\nno-preserve\r\noption\r\norder\r\norder by\r\nordered\r\nordering\r\npreserve\r\nreturn\r\nsatisfies\r\nschema\r\nsome\r\nstable\r\nstrict\r\nstrip\r\nthen\r\nto\r\ntreat as\r\ntypeswitch\r\nunordered\r\nvalidate\r\nvariable\r\nversion\r\nwhere\r\nxquery\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"as\"],\r\n\t[\"keyword\", \"ascending\"],\r\n\t[\"keyword\", \"at\"],\r\n\t[\"keyword\", \"base-uri\"],\r\n\t[\"keyword\", \"boundary-space\"],\r\n\t[\"keyword\", \"case\"],\r\n\t[\"keyword\", \"cast as\"],\r\n\t[\"keyword\", \"collation\"],\r\n\t[\"keyword\", \"construction\"],\r\n\t[\"keyword\", \"copy-namespaces\"],\r\n\t[\"keyword\", \"declare\"],\r\n\t[\"keyword\", \"default\"],\r\n\t[\"keyword\", \"descending\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"empty greatest\"],\r\n\t[\"keyword\", \"empty least\"],\r\n\t[\"keyword\", \"encoding\"],\r\n\t[\"keyword\", \"every\"],\r\n\t[\"keyword\", \"external\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"function\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"import\"],\r\n\t[\"keyword\", \"in\"],\r\n\t[\"keyword\", \"inherit\"],\r\n\t[\"keyword\", \"lax\"],\r\n\t[\"keyword\", \"let\"],\r\n\t[\"keyword\", \"map\"],\r\n\t[\"keyword\", \"module\"],\r\n\t[\"keyword\", \"namespace\"],\r\n\t[\"keyword\", \"no-inherit\"],\r\n\t[\"keyword\", \"no-preserve\"],\r\n\t[\"keyword\", \"option\"],\r\n\t[\"keyword\", \"order\"],\r\n\t[\"keyword\", \"order by\"],\r\n\t[\"keyword\", \"ordered\"],\r\n\t[\"keyword\", \"ordering\"],\r\n\t[\"keyword\", \"preserve\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"satisfies\"],\r\n\t[\"keyword\", \"schema\"],\r\n\t[\"keyword\", \"some\"],\r\n\t[\"keyword\", \"stable\"],\r\n\t[\"keyword\", \"strict\"],\r\n\t[\"keyword\", \"strip\"],\r\n\t[\"keyword\", \"then\"],\r\n\t[\"keyword\", \"to\"],\r\n\t[\"keyword\", \"treat as\"],\r\n\t[\"keyword\", \"typeswitch\"],\r\n\t[\"keyword\", \"unordered\"],\r\n\t[\"keyword\", \"validate\"],\r\n\t[\"keyword\", \"variable\"],\r\n\t[\"keyword\", \"version\"],\r\n\t[\"keyword\", \"where\"],\r\n\t[\"keyword\", \"xquery\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords."
  },
  {
    "path": "tests/languages/xquery/number_feature.test",
    "content": "0\r\n3.14159\r\n42E8\r\n3.25E-4\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"0\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"number\", \"42E8\"],\r\n\t[\"number\", \"3.25E-4\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/xquery/operator_feature.test",
    "content": "+ - *\r\n= ? | @\r\n. ..\r\n:= !=\r\n< <= <<\r\n> >= >>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"operator\", \"+\"], [\"operator\", \"-\"], [\"operator\", \"*\"],\r\n\t[\"operator\", \"=\"], [\"operator\", \"?\"], [\"operator\", \"|\"], [\"operator\", \"@\"],\r\n\t[\"operator\", \".\"], [\"operator\", \"..\"],\r\n\t[\"operator\", \":=\"], [\"operator\", \"!=\"],\r\n\t[\"operator\", \"<\"], [\"operator\", \"<=\"], [\"operator\", \"<<\"],\r\n\t[\"operator\", \">\"], [\"operator\", \">=\"], [\"operator\", \">>\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators."
  },
  {
    "path": "tests/languages/xquery/plain-text_feature.test",
    "content": "return <ul>\r\n<!-- {concat(\" List of \", $count, \" products \")} -->\r\nplaintext\r\n{comment{concat(\" List of \", $count, \" products \")}}\r\n</ul>\r\n\r\n<h1>data($prod/name){data($prod/name)}{{data($prod/name)}}</h1>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"return\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"ul\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"comment\", \"<!-- {concat(\\\" List of \\\", $count, \\\" products \\\")} -->\"],\r\n\t[\"plain-text\", \"\\r\\nplaintext\\r\\n\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"builtin\", \"comment\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"function\", \"concat\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"string\", \"\\\" List of \\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"variable\", \"$count\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"string\", \"\\\" products \\\"\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"ul\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"h1\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"data($prod/name)\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"function\", \"data\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"$prod\"],\r\n\t[\"punctuation\", \"/\"],\r\n\t\"name\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"plain-text\", \"{{data($prod/name)}}\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"h1\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for plain-text between tags.\r\n"
  },
  {
    "path": "tests/languages/xquery/string_feature.test",
    "content": "\"\"\r\n\"Foo\"\"bar\"\r\n\"Foo'\r\nbar\"\"\r\nbaz\"\r\n''\r\n'Foo''bar'\r\n'Foo\"\r\nbar''\r\nbaz'\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"string\", \"\\\"Foo\\\"\\\"bar\\\"\"],\r\n\t[\"string\", \"\\\"Foo'\\r\\nbar\\\"\\\"\\r\\nbaz\\\"\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"string\", \"'Foo''bar'\"],\r\n\t[\"string\", \"'Foo\\\"\\r\\nbar''\\r\\nbaz'\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/xquery/tag_feature.test",
    "content": "<li dep=\"{$prod/@dept}\">number: {data($prod/number)\r\n}, name: {data($prod/name)}</li>\r\n\r\nreturn <item num=\"{$item/@num}\"\r\nname=\"{$name}\"\r\nquan=\"{$item/@quantity}\"/>\r\n\r\n<li dep=\"{substring-after($prod/@dept, \"-\")}\"/>\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"li\"]],\r\n\t\t[\"attr-name\", [\"dep\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\\\"\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\t[\"variable\", \"$prod\"],\r\n\t\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\t[\"operator\", \"@\"],\r\n\t\t\t\t\"dept\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\t[\"plain-text\", \"number: \"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"function\", \"data\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"$prod\"],\r\n\t[\"punctuation\", \"/\"],\r\n\t\"number\",\r\n\t[\"punctuation\", \")\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"plain-text\", \", name: \"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"function\", \"data\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"variable\", \"$prod\"],\r\n\t[\"punctuation\", \"/\"],\r\n\t\"name\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"</\"],\r\n\t\t[\"tag\", [\"li\"]],\r\n\t\t[\"punctuation\", \">\"]\r\n\t]],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"item\"]],\r\n\t\t[\"attr-name\", [\"num\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\\\"\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\t[\"variable\", \"$item\"],\r\n\t\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\t[\"operator\", \"@\"],\r\n\t\t\t\t\"num\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"name\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\\\"\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\t[\"variable\", \"$name\"],\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\r\n\t\t[\"attr-name\", [\"quan\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\\\"\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\t[\"variable\", \"$item\"],\r\n\t\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\t[\"operator\", \"@\"],\r\n\t\t\t\t\"quantity\",\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]],\r\n\r\n\t[\"tag\", [\r\n\t\t[\"punctuation\", \"<\"],\r\n\t\t[\"tag\", [\"li\"]],\r\n\t\t[\"attr-name\", [\"dep\"]],\r\n\t\t[\"attr-value\", [\r\n\t\t\t[\"punctuation\", \"=\\\"\"],\r\n\t\t\t[\"expression\", [\r\n\t\t\t\t[\"punctuation\", \"{\"],\r\n\t\t\t\t[\"function\", \"substring-after\"],\r\n\t\t\t\t[\"punctuation\", \"(\"],\r\n\t\t\t\t[\"variable\", \"$prod\"],\r\n\t\t\t\t[\"punctuation\", \"/\"],\r\n\t\t\t\t[\"operator\", \"@\"],\r\n\t\t\t\t\"dept\",\r\n\t\t\t\t[\"punctuation\", \",\"],\r\n\t\t\t\t[\"string\", \"\\\"-\\\"\"],\r\n\t\t\t\t[\"punctuation\", \")\"],\r\n\t\t\t\t[\"punctuation\", \"}\"]\r\n\t\t\t]],\r\n\t\t\t[\"punctuation\", \"\\\"\"]\r\n\t\t]],\r\n\t\t[\"punctuation\", \"/>\"]\r\n\t]]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for XQuery inside tags.\r\n"
  },
  {
    "path": "tests/languages/xquery/variable_feature.test",
    "content": "$foo\r\n$foo-bar\r\n$strings:LetterA\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"variable\", \"$foo\"],\r\n\t[\"variable\", \"$foo-bar\"],\r\n\t[\"variable\", \"$strings:LetterA\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for variables."
  },
  {
    "path": "tests/languages/xquery/xquery-attribute_feature.test",
    "content": "attribute foo\r\nattribute foo-bar\r\nattribute foo:bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"attribute\"],\r\n\t[\"xquery-attribute\", \"foo\"],\r\n\t[\"builtin\", \"attribute\"],\r\n\t[\"xquery-attribute\", \"foo-bar\"],\r\n\t[\"builtin\", \"attribute\"],\r\n\t[\"xquery-attribute\", \"foo:bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for XQuery attribute constructor."
  },
  {
    "path": "tests/languages/xquery/xquery-comment_feature.test",
    "content": "(::)\r\n(: Single line comment :)\r\n(:Multi\r\nline\r\ncomment:)\r\n(: <html> :)\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"xquery-comment\", \"(::)\"],\r\n\t[\"xquery-comment\", \"(: Single line comment :)\"],\r\n\t[\"xquery-comment\", \"(:Multi\\r\\nline\\r\\ncomment:)\"],\r\n\t[\"xquery-comment\", \"(: <html> :)\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for XQuery comments."
  },
  {
    "path": "tests/languages/xquery/xquery-element_feature.test",
    "content": "element html\r\nelement foo-bar\r\nelement foo:bar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"element\"],\r\n\t[\"xquery-element\", \"html\"],\r\n\t[\"builtin\", \"element\"],\r\n\t[\"xquery-element\", \"foo-bar\"],\r\n\t[\"builtin\", \"element\"],\r\n\t[\"xquery-element\", \"foo:bar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for XQuery element constructors."
  },
  {
    "path": "tests/languages/yaml/anchor_and_alias_feature.test",
    "content": "x-number: &num-ber 13\nx-string: &stri_ng \"good\"\nx-null: &nu-ll null\nx-boolean: &boo-lean true\nx-datetime: &date-time 2001-12-15T02:59:43.1Z\nx-scalar: &sca-lar |\n\tfoo\n\tbar\n\nx-utf8: &アンカー \"japanese anchor\"\n\nx-tag-string: &tag-string !!tag-string \"13\"\nx-tag-number: &tag-number !!tag-number 42\nx-tag-null: &tag-null !!tag-null null\nx-tag-boolean: &tag-bool !!tag-bool true\nx-tag-datetime: &tag-date !!tag-date 2001-12-15T02:59:43.1Z\nx-tag-scalar: &tag-scalar !!tag-scalar |\n\tfoo\n\tbar\n\nx-tag-string: !!tag-string &tag-string \"13\"\nx-tag-number: !!tag-number &tag-number 42\nx-tag-null: !!tag-null &tag-null null\nx-tag-boolean: !!tag-bool &tag-bool true\nx-tag-datetime: !!tag-date &tag-date 2001-12-15T02:59:43.1Z\nx-tag-scalar: !!tag-scalar &tag-scalar |\n\tfoo\n\tbar\n\nfoobar: *num-ber\nfubar: *stri_ng\njapanese: *アンカー\ntaga: *tag-a !!taga\ntagb: !!tagb *tag-b\n\n# https://yaml.org/spec/1.2/spec.html#id2783797\n\n!!str &a1 \"foo\":\n\t!!str bar\n&a2 baz : *a1\n\n----------------------------------------------------\n\n[\n\t[\"key\", \"x-number\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&num-ber\"],\n\t[\"number\", \"13\"],\n\n\t[\"key\", \"x-string\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&stri_ng\"],\n\t[\"string\", \"\\\"good\\\"\"],\n\n\t[\"key\", \"x-null\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&nu-ll\"],\n\t[\"null\", \"null\"],\n\n\t[\"key\", \"x-boolean\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&boo-lean\"],\n\t[\"boolean\", \"true\"],\n\n\t[\"key\", \"x-datetime\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&date-time\"],\n\t[\"datetime\", \"2001-12-15T02:59:43.1Z\"],\n\n\t[\"key\", \"x-scalar\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&sca-lar\"],\n\t[\"punctuation\", \"|\"],\n\t[\"scalar\", \"\\r\\n\\tfoo\\r\\n\\tbar\"],\n\n\t[\"key\", \"x-utf8\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&アンカー\"],\n\t[\"string\", \"\\\"japanese anchor\\\"\"],\n\n\t[\"key\", \"x-tag-string\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&tag-string\"],\n\t[\"tag\", \"!!tag-string\"],\n\t[\"string\", \"\\\"13\\\"\"],\n\n\t[\"key\", \"x-tag-number\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&tag-number\"],\n\t[\"tag\", \"!!tag-number\"],\n\t[\"number\", \"42\"],\n\n\t[\"key\", \"x-tag-null\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&tag-null\"],\n\t[\"tag\", \"!!tag-null\"],\n\t[\"null\", \"null\"],\n\n\t[\"key\", \"x-tag-boolean\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&tag-bool\"],\n\t[\"tag\", \"!!tag-bool\"],\n\t[\"boolean\", \"true\"],\n\n\t[\"key\", \"x-tag-datetime\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&tag-date\"],\n\t[\"tag\", \"!!tag-date\"],\n\t[\"datetime\", \"2001-12-15T02:59:43.1Z\"],\n\n\t[\"key\", \"x-tag-scalar\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"&tag-scalar\"],\n\t[\"tag\", \"!!tag-scalar\"],\n\t[\"punctuation\", \"|\"],\n\t[\"scalar\", \"\\r\\n\\tfoo\\r\\n\\tbar\"],\n\n\t[\"key\", \"x-tag-string\"],\n\t[\"punctuation\", \":\"],\n\t[\"tag\", \"!!tag-string\"],\n\t[\"important\", \"&tag-string\"],\n\t[\"string\", \"\\\"13\\\"\"],\n\n\t[\"key\", \"x-tag-number\"],\n\t[\"punctuation\", \":\"],\n\t[\"tag\", \"!!tag-number\"],\n\t[\"important\", \"&tag-number\"],\n\t[\"number\", \"42\"],\n\n\t[\"key\", \"x-tag-null\"],\n\t[\"punctuation\", \":\"],\n\t[\"tag\", \"!!tag-null\"],\n\t[\"important\", \"&tag-null\"],\n\t[\"null\", \"null\"],\n\n\t[\"key\", \"x-tag-boolean\"],\n\t[\"punctuation\", \":\"],\n\t[\"tag\", \"!!tag-bool\"],\n\t[\"important\", \"&tag-bool\"],\n\t[\"boolean\", \"true\"],\n\n\t[\"key\", \"x-tag-datetime\"],\n\t[\"punctuation\", \":\"],\n\t[\"tag\", \"!!tag-date\"],\n\t[\"important\", \"&tag-date\"],\n\t[\"datetime\", \"2001-12-15T02:59:43.1Z\"],\n\n\t[\"key\", \"x-tag-scalar\"],\n\t[\"punctuation\", \":\"],\n\t[\"tag\", \"!!tag-scalar\"],\n\t[\"important\", \"&tag-scalar\"],\n\t[\"punctuation\", \"|\"],\n\t[\"scalar\", \"\\r\\n\\tfoo\\r\\n\\tbar\"],\n\n\t[\"key\", \"foobar\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"*num-ber\"],\n\n\t[\"key\", \"fubar\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"*stri_ng\"],\n\n\t[\"key\", \"japanese\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"*アンカー\"],\n\n\t[\"key\", \"taga\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"*tag-a\"],\n\t[\"tag\", \"!!taga\"],\n\n\t[\"key\", \"tagb\"],\n\t[\"punctuation\", \":\"],\n\t[\"tag\", \"!!tagb\"],\n\t[\"important\", \"*tag-b\"],\n\n\t[\"comment\", \"# https://yaml.org/spec/1.2/spec.html#id2783797\"],\n\n\t[\"tag\", \"!!str\"],\n\t[\"important\", \"&a1\"],\n\t[\"key\", \"\\\"foo\\\"\"],\n\t[\"punctuation\", \":\"],\n\n\t[\"tag\", \"!!str\"],\n\t\" bar\\r\\n\",\n\n\t[\"important\", \"&a2\"],\n\t[\"key\", \"baz\"],\n\t[\"punctuation\", \":\"],\n\t[\"important\", \"*a1\"]\n]\n\n----------------------------------------------------\n\nChecks for anchors and aliases.\n"
  },
  {
    "path": "tests/languages/yaml/boolean_feature.test",
    "content": "---\r\nfoo: true\r\nbar: false\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"---\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"boolean\", \"false\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for booleans."
  },
  {
    "path": "tests/languages/yaml/comment_feature.test",
    "content": "#\r\n# foobar\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"comment\", \"#\"],\r\n\t[\"comment\", \"# foobar\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for comments."
  },
  {
    "path": "tests/languages/yaml/datetime_feature.test",
    "content": "---\r\ncanonical: 2001-12-15T02:59:43.1Z\r\niso8601: 2001-12-14t21:59:43.10-05:00\r\nspaced: 2001-12-14 21:59:43.10 -5\r\ndate: 2002-12-14\r\ntimes:\r\n\t- 10:53\r\n\t- 10:53:20.53\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"---\"],\r\n\t[\"key\", \"canonical\"], [\"punctuation\", \":\"],\r\n\t[\"datetime\", \"2001-12-15T02:59:43.1Z\"],\r\n\t[\"key\", \"iso8601\"], [\"punctuation\", \":\"],\r\n\t[\"datetime\", \"2001-12-14t21:59:43.10-05:00\"],\r\n\t[\"key\", \"spaced\"], [\"punctuation\", \":\"],\r\n\t[\"datetime\", \"2001-12-14 21:59:43.10 -5\"],\r\n\t[\"key\", \"date\"], [\"punctuation\", \":\"],\r\n\t[\"datetime\", \"2002-12-14\"],\r\n\t[\"key\", \"times\"], [\"punctuation\", \":\"],\r\n\t[\"punctuation\", \"-\"],\r\n\t[\"datetime\", \"10:53\"],\r\n\t[\"punctuation\", \"-\"],\r\n\t[\"datetime\", \"10:53:20.53\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for dates, times and datetimes."
  },
  {
    "path": "tests/languages/yaml/directive_feature.test",
    "content": "%YAML 1.2\r\n%TAG\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"directive\", \"%YAML 1.2\"],\r\n\t[\"directive\", \"%TAG\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for directives."
  },
  {
    "path": "tests/languages/yaml/important_feature.test",
    "content": "&B1\r\n&A\r\n*A\r\n&SS\r\n*SS\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"important\", \"&B1\"],\r\n\t[\"important\", \"&A\"],\r\n\t[\"important\", \"*A\"],\r\n\t[\"important\", \"&SS\"],\r\n\t[\"important\", \"*SS\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for important."
  },
  {
    "path": "tests/languages/yaml/key_feature.test",
    "content": "---\r\nfoo: 4\r\nFooBar : 5\r\nhello the-world: 23\r\n\"\\\"foo# : {}[]\": 23\r\n'\\'foo# : {}[]': 23\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"---\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"], [\"number\", \"4\"],\r\n\t[\"key\", \"FooBar\"], [\"punctuation\", \":\"], [\"number\", \"5\"],\r\n\t[\"key\", \"hello the-world\"], [\"punctuation\", \":\"], [\"number\", \"23\"],\r\n\t[\"key\", \"\\\"\\\\\\\"foo# : {}[]\\\"\"], [\"punctuation\", \":\"], [\"number\", \"23\"],\r\n\t[\"key\", \"'\\\\'foo# : {}[]'\"], [\"punctuation\", \":\"], [\"number\", \"23\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keys.\r\n"
  },
  {
    "path": "tests/languages/yaml/null_feature.test",
    "content": "---\r\nfoo: null\r\nbar: ~\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"---\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"null\", \"null\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"null\", \"~\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for null and ~."
  },
  {
    "path": "tests/languages/yaml/number_feature.test",
    "content": "---\r\nfoo: 0xBadFace\r\nbar: 0o754\r\nbaz: 42\r\nfoo: 3.14159\r\nbar: 4e8\r\nbaz: 3.1E-7\r\nfoo: 0.4e+2\r\nbar: -0xFF\r\nbaz: +0o123\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"---\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"0o754\"],\r\n\t[\"key\", \"baz\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"42\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"3.14159\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"4e8\"],\r\n\t[\"key\", \"baz\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"3.1E-7\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"0.4e+2\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"-0xFF\"],\r\n\t[\"key\", \"baz\"], [\"punctuation\", \":\"],\r\n\t[\"number\", \"+0o123\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers."
  },
  {
    "path": "tests/languages/yaml/scalar_feature.test",
    "content": "---\r\nfoo: >\r\n\tFoo bar\r\n\tbaz\r\nbar: |\r\n\tFoo bar\r\n\tbaz\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"---\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"punctuation\", \">\"],\r\n\t[\"scalar\", \"\\r\\n\\tFoo bar\\r\\n\\tbaz\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"punctuation\", \"|\"],\r\n\t[\"scalar\", \"\\r\\n\\tFoo bar\\r\\n\\tbaz\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for scalars."
  },
  {
    "path": "tests/languages/yaml/string_feature.test",
    "content": "---\r\nfoo: \"\"\r\nbar: \"fo\\\"obar\"\r\nfoo: ''\r\nbar: 'fo\\'obar'\r\nfoo: \"foo\" # bar\r\nbar: 'bar' # foo\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \"---\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"\\\"\\\"\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"\\\"fo\\\\\\\"obar\\\"\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"''\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"'fo\\\\'obar'\"],\r\n\t[\"key\", \"foo\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"\\\"foo\\\"\"], [\"comment\", \"# bar\"],\r\n\t[\"key\", \"bar\"], [\"punctuation\", \":\"],\r\n\t[\"string\", \"'bar'\"], [\"comment\", \"# foo\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for strings."
  },
  {
    "path": "tests/languages/yaml/tag_feature.test",
    "content": "!!map\r\n!!str\r\n!!seq\r\n\r\n# https://yaml.org/spec/1.2/spec.html#c-ns-tag-property\r\n\r\n!<tag:yaml.org,2002:str> foo : !<!bar> baz\r\n\r\n- !local foo\r\n- !!str bar\r\n- !e!tag%21 baz\r\n\r\n!!seq [\r\n  !<!local> \"foo\",\r\n  !<tag:yaml.org,2002:str> \"bar\",\r\n  !<tag:example.com,2000:app/tag!> \"baz\"\r\n]\r\n\r\n# Assuming conventional resolution:\r\n- \"12\"\r\n- 12\r\n- ! 12\r\n\r\n!!seq [\r\n  !<tag:yaml.org,2002:str> \"12\",\r\n  !<tag:yaml.org,2002:int> \"12\",\r\n  !<tag:yaml.org,2002:str> \"12\",\r\n]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"tag\", \"!!map\"],\r\n\t[\"tag\", \"!!str\"],\r\n\t[\"tag\", \"!!seq\"],\r\n\r\n\t[\"comment\", \"# https://yaml.org/spec/1.2/spec.html#c-ns-tag-property\"],\r\n\r\n\t[\"tag\", \"!<tag:yaml.org,2002:str>\"],\r\n\t[\"key\", \"foo\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"tag\", \"!<!bar>\"],\r\n\t\" baz\\r\\n\\r\\n\",\r\n\r\n\t[\"punctuation\", \"-\"],\r\n\t[\"tag\", \"!local\"],\r\n\t\" foo\\r\\n\",\r\n\t[\"punctuation\", \"-\"],\r\n\t[\"tag\", \"!!str\"],\r\n\t\" bar\\r\\n\",\r\n\t[\"punctuation\", \"-\"],\r\n\t[\"tag\", \"!e!tag%21\"],\r\n\t\" baz\\r\\n\\r\\n\",\r\n\r\n\t[\"tag\", \"!!seq\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"tag\", \"!<!local>\"],\r\n\t[\"string\", \"\\\"foo\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"tag\", \"!<tag:yaml.org,2002:str>\"],\r\n\t[\"string\", \"\\\"bar\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"tag\", \"!<tag:example.com,2000:app/tag!>\"],\r\n\t[\"string\", \"\\\"baz\\\"\"],\r\n\t[\"punctuation\", \"]\"],\r\n\r\n\t[\"comment\", \"# Assuming conventional resolution:\"],\r\n\t[\"punctuation\", \"-\"],\r\n\t[\"string\", \"\\\"12\\\"\"],\r\n\t[\"punctuation\", \"-\"],\r\n\t[\"number\", \"12\"],\r\n\t[\"punctuation\", \"-\"],\r\n\t[\"tag\", \"!\"],\r\n\t[\"number\", \"12\"],\r\n\r\n\t[\"tag\", \"!!seq\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"tag\", \"!<tag:yaml.org,2002:str>\"],\r\n\t[\"string\", \"\\\"12\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"tag\", \"!<tag:yaml.org,2002:int>\"],\r\n\t[\"string\", \"\\\"12\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"tag\", \"!<tag:yaml.org,2002:str>\"],\r\n\t[\"string\", \"\\\"12\\\"\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for tags\r\n"
  },
  {
    "path": "tests/languages/yaml+markdown/front-matter_feature.test",
    "content": "---\nlayout: post\ntitle: Blogging Like a Hacker\n---\n\n# Title\n\n----------------------------------------------------\n\n[\n\t[\"front-matter-block\", [\n\t\t[\"punctuation\", \"---\"],\n\t\t[\"front-matter\", [\n\t\t\t[\"key\", \"layout\"], [\"punctuation\", \":\"], \" post\\r\\n\",\n\t\t\t[\"key\", \"title\"], [\"punctuation\", \":\"], \" Blogging Like a Hacker\"\n\t\t]],\n\t\t[\"punctuation\", \"---\"]\n\t]],\n\n\t[\"title\", [\n\t\t[\"punctuation\", \"#\"],\n\t\t\" Title\"\n\t]]\n]\n"
  },
  {
    "path": "tests/languages/yang/boolean_feature.test",
    "content": "true\nfalse\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"true\"],\n\t[\"keyword\", \"false\"]\n]\n\n----------------------------------------------------\n\nChecks for booleans.\n"
  },
  {
    "path": "tests/languages/yang/comment_feature.test",
    "content": "// comment\n/*\n comment\n*/\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// comment\"],\n\t[\"comment\", \"/*\\r\\n comment\\r\\n*/\"]\n]\n\n----------------------------------------------------\n\nChecks for comments.\n"
  },
  {
    "path": "tests/languages/yang/keyword_feature.test",
    "content": "submodule execd-ntp {\n\n\tkey name;\n\n\tleaf stratum { type ntpStratum; default 10; }\n\n\tleaf version { type int8 { range \"1..4\"; } default 4; }\n\n}\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"submodule\"],\n\t\" execd-ntp \",\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"key\"],\n\t\" name\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"leaf\"],\n\t\" stratum \",\n\t[\"punctuation\", \"{\"],\n\t[\"keyword\", \"type\"],\n\t\" ntpStratum\",\n\t[\"punctuation\", \";\"],\n\t[\"keyword\", \"default\"],\n\t\" 10\",\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"leaf\"],\n\t\" version \",\n\t[\"punctuation\", \"{\"],\n\t[\"keyword\", \"type\"],\n\t\" int8 \",\n\t[\"punctuation\", \"{\"],\n\t[\"keyword\", \"range\"],\n\t[\"string\", \"\\\"1..4\\\"\"],\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"}\"],\n\t[\"keyword\", \"default\"],\n\t\" 4\",\n\t[\"punctuation\", \";\"],\n\t[\"punctuation\", \"}\"],\n\n\t[\"punctuation\", \"}\"]\n]\n\n----------------------------------------------------\n\nChecks for keywords.\n"
  },
  {
    "path": "tests/languages/yang/namespace_feature.test",
    "content": "type foo:type\ntype _foo.-bar:type\n\n----------------------------------------------------\n\n[\n\t[\"keyword\", \"type\"],\n\t[\"namespace\", \"foo\"],\n\t[\"punctuation\", \":\"],\n\t\"type\\r\\n\",\n\n\t[\"keyword\", \"type\"],\n\t[\"namespace\", \"_foo.-bar\"],\n\t[\"punctuation\", \":\"],\n\t\"type\"\n]\n\n----------------------------------------------------\n\nChecks for namespace prefixes.\n"
  },
  {
    "path": "tests/languages/yang/string_feature.test",
    "content": "\"\n\n\\\"'foo'\\\"\n\n\"\n'fo\n\"\"\no'\n\n----------------------------------------------------\n\n[\n\t[\"string\", \"\\\"\\r\\n\\r\\n\\\\\\\"'foo'\\\\\\\"\\r\\n\\r\\n\\\"\"],\n\t[\"string\", \"'fo\\r\\n\\\"\\\"\\r\\no'\"]\n]\n\n----------------------------------------------------\n\nChecks for string.\n"
  },
  {
    "path": "tests/languages/zig/builtin-type_feature.test",
    "content": "i8\nu8\ni16\nu16\ni32\nu32\ni64\nu64\ni128\nu128\nisize\nusize\nc_short\nc_ushort\nc_int\nc_uint\nc_long\nc_ulong\nc_longlong\nc_ulonglong\nc_longdouble\nc_void\nf16\nf32\nf64\nf128\nbool\nvoid\nnoreturn\ntype\nanyerror\ncomptime_int\ncomptime_float\n\n----------------------------------------------------\n\n[\n\t[\"builtin-type\", \"i8\"],\n\t[\"builtin-type\", \"u8\"],\n\t[\"builtin-type\", \"i16\"],\n\t[\"builtin-type\", \"u16\"],\n\t[\"builtin-type\", \"i32\"],\n\t[\"builtin-type\", \"u32\"],\n\t[\"builtin-type\", \"i64\"],\n\t[\"builtin-type\", \"u64\"],\n\t[\"builtin-type\", \"i128\"],\n\t[\"builtin-type\", \"u128\"],\n\t[\"builtin-type\", \"isize\"],\n\t[\"builtin-type\", \"usize\"],\n\t[\"builtin-type\", \"c_short\"],\n\t[\"builtin-type\", \"c_ushort\"],\n\t[\"builtin-type\", \"c_int\"],\n\t[\"builtin-type\", \"c_uint\"],\n\t[\"builtin-type\", \"c_long\"],\n\t[\"builtin-type\", \"c_ulong\"],\n\t[\"builtin-type\", \"c_longlong\"],\n\t[\"builtin-type\", \"c_ulonglong\"],\n\t[\"builtin-type\", \"c_longdouble\"],\n\t[\"builtin-type\", \"c_void\"],\n\t[\"builtin-type\", \"f16\"],\n\t[\"builtin-type\", \"f32\"],\n\t[\"builtin-type\", \"f64\"],\n\t[\"builtin-type\", \"f128\"],\n\t[\"builtin-type\", \"bool\"],\n\t[\"builtin-type\", \"void\"],\n\t[\"builtin-type\", \"noreturn\"],\n\t[\"builtin-type\", \"type\"],\n\t[\"builtin-type\", \"anyerror\"],\n\t[\"builtin-type\", \"comptime_int\"],\n\t[\"builtin-type\", \"comptime_float\"]\n]\n\n----------------------------------------------------\n\nChecks for builtin types.\n"
  },
  {
    "path": "tests/languages/zig/builtin_feature.test",
    "content": "@addWithOverflow()\r\n@alignCast()\r\n@alignOf()\r\n@ArgType()\r\n@atomicLoad()\r\n@atomicRmw()\r\n@bitCast()\r\n@bitOffsetOf()\r\n@boolToInt()\r\n@breakpoint()\r\n@mulAdd()\r\n@byteSwap()\r\n@bitReverse()\r\n@byteOffsetOf()\r\n@bytesToSlice()\r\n@cDefine()\r\n@cImport()\r\n@cInclude()\r\n@clz()\r\n@cmpxchgStrong()\r\n@cmpxchgWeak()\r\n@compileError()\r\n@compileLog()\r\n@ctz()\r\n@cUndef()\r\n@divExact()\r\n@divFloor()\r\n@divTrunc()\r\n@embedFile()\r\n@enumToInt()\r\n@errorName()\r\n@errorReturnTrace()\r\n@errorToInt()\r\n@errSetCast()\r\n@export()\r\n@fence()\r\n@field()\r\n@fieldParentPtr()\r\n@floatCast()\r\n@floatToInt()\r\n@frameAddress()\r\n@handle()\r\n@hasDecl()\r\n@hasField()\r\n@import()\r\n@inlineCall()\r\n@intCast()\r\n@intToEnum()\r\n@intToError()\r\n@intToFloat()\r\n@intToPtr()\r\n@IntType()\r\n@memberCount()\r\n@memberName()\r\n@memberType()\r\n@memcpy()\r\n@memset()\r\n@mod()\r\n@mulWithOverflow()\r\n@newStackCall()\r\n@noInlineCall()\r\n@OpaqueType()\r\n@panic()\r\n@popCount()\r\n@ptrCast()\r\n@ptrToInt()\r\n@rem()\r\n@returnAddress()\r\n@setAlignStack()\r\n@setCold()\r\n@setEvalBranchQuota()\r\n@setFloatMode()\r\n@setRuntimeSafety()\r\n@shlExact()\r\n@shlWithOverflow()\r\n@shrExact()\r\n@sizeOf()\r\n@sliceToBytes()\r\n@sqrt()\r\n@sin()\r\n@cos()\r\n@exp()\r\n@exp2()\r\n@ln()\r\n@log2()\r\n@log10()\r\n@fabs()\r\n@floor()\r\n@ceil()\r\n@trunc()\r\n@round()\r\n@subWithOverflow()\r\n@tagName()\r\n@TagType()\r\n@This()\r\n@truncate()\r\n@typeId()\r\n@typeInfo()\r\n@typeName()\r\n@typeOf()\r\n@unionInit()\r\n@Vector()\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"builtin\", \"@addWithOverflow\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@alignCast\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@alignOf\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@ArgType\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@atomicLoad\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@atomicRmw\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@bitCast\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@bitOffsetOf\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@boolToInt\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@breakpoint\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@mulAdd\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@byteSwap\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@bitReverse\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@byteOffsetOf\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@bytesToSlice\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@cDefine\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@cImport\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@cInclude\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@clz\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@cmpxchgStrong\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@cmpxchgWeak\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@compileError\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@compileLog\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@ctz\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@cUndef\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@divExact\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@divFloor\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@divTrunc\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@embedFile\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@enumToInt\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@errorName\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@errorReturnTrace\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@errorToInt\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@errSetCast\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@export\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@fence\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@field\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@fieldParentPtr\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@floatCast\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@floatToInt\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@frameAddress\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@handle\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@hasDecl\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@hasField\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@import\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@inlineCall\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@intCast\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@intToEnum\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@intToError\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@intToFloat\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@intToPtr\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@IntType\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@memberCount\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@memberName\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@memberType\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@memcpy\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@memset\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@mod\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@mulWithOverflow\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@newStackCall\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@noInlineCall\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@OpaqueType\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@panic\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@popCount\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@ptrCast\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@ptrToInt\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@rem\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@returnAddress\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@setAlignStack\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@setCold\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@setEvalBranchQuota\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@setFloatMode\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@setRuntimeSafety\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@shlExact\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@shlWithOverflow\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@shrExact\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@sizeOf\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@sliceToBytes\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@sqrt\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@sin\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@cos\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@exp\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@exp2\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@ln\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@log2\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@log10\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@fabs\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@floor\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@ceil\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@trunc\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@round\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@subWithOverflow\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@tagName\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@TagType\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@This\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@truncate\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@typeId\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@typeInfo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@typeName\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@typeOf\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@unionInit\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"builtin\", \"@Vector\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for builtin functions.\r\n"
  },
  {
    "path": "tests/languages/zig/class-name_feature.test",
    "content": "const Timestamp = struct {\r\n\tseconds: i64,\r\n\tnanos: u32,\r\n\tpub fn unixEpoch() Timestamp {\r\n\t\treturn Timestamp{\r\n\t\t\t.seconds = 0,\r\n\t\t\t.nanos = 0,\r\n\t\t};\r\n\t}\r\n};\r\n\r\nconst one_plus_one: i32 = 1 + 1;\r\nvar x: i32;\r\nconst value: ?u32 = null;\r\nvar optional_value: ?[]const u8 = null;\r\nvar number_or_error: anyerror!i32 = error.ArgNotFound;\r\nconst array1 = [_]u32{1,2};\r\nvar foo: S align(4) = undefined;\r\n\r\nfn add(a: i32, b: i32) i32 {\r\n\treturn a + b;\r\n}\r\nextern fn foo(x: f64) f64;\r\nfn noop4() align(4) void {}\r\nfn derp() align(@sizeOf(usize) * 2) i32 { return 1234; }\r\n\r\nfn eventuallyNullSequence() ?u32 {\r\n\treturn if (numbers_left == 0) null else blk: {\r\n\t\tnumbers_left -= 1;\r\n\t\tbreak :blk numbers_left;\r\n\t};\r\n}\r\n\r\nconst message = [_]u8{ 'h', 'e', 'l', 'l', 'o' };\r\n\r\nconst mat4x4 = [4][4]f32{\r\n\t[_]f32{ 1.0, 0.0, 0.0, 0.0 },\r\n\t[_]f32{ 0.0, 1.0, 0.0, 1.0 },\r\n\t[_]f32{ 0.0, 0.0, 1.0, 0.0 },\r\n\t[_]f32{ 0.0, 0.0, 0.0, 1.0 },\r\n};\r\n\r\nconst Point = struct {};\r\nconst Point2 = packed struct {};\r\nconst Type = enum {};\r\nconst Value = enum(u2) {};\r\nconst Number = packed enum(u8) {};\r\nconst Foo = extern enum { A, B, C };\r\nconst Foo = extern enum { A, B, C };\r\nconst Payload = union {};\r\nconst ComplexType = union(ComplexTypeTag) {};\r\n\r\nvar node = ListOfInts.Node {};\r\nvar list2 = LinkedList(i32) {};\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", \"Timestamp\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t\"\\r\\n\\tseconds\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"i64\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t\"\\r\\n\\tnanos\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"u32\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"keyword\", \"pub\"],\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function\", \"unixEpoch\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"class-name\", [\"Timestamp\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"class-name\", [\"Timestamp\"]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"punctuation\", \".\"],\r\n\t\"seconds \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"punctuation\", \".\"],\r\n\t\"nanos \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t\" one_plus_one\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"i32\"]\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"operator\", \"+\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t\" x\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"i32\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t\" value\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"operator\", \"?\"],\r\n\t\t[\"builtin-type\", \"u32\"]\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t\" optional_value\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"operator\", \"?\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"keyword\", \"const\"],\r\n\t\t[\"builtin-type\", \"u8\"]\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t\" number_or_error\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"anyerror\"],\r\n\t\t[\"operator\", \"!\"],\r\n\t\t[\"builtin-type\", \"i32\"]\r\n\t]],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"error\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"ArgNotFound\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t\" array1 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"_\",\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"builtin-type\", \"u32\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t\" foo\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\"S\"]],\r\n\t[\"keyword\", \"align\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"undefined\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function\", \"add\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"a\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"i32\"]\r\n\t]],\r\n\t[\"punctuation\", \",\"],\r\n\t\" b\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"i32\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"i32\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t\" a \",\r\n\t[\"operator\", \"+\"],\r\n\t\" b\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function\", \"foo\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"x\",\r\n\t[\"punctuation\", \":\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"f64\"]\r\n\t]],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"f64\"]\r\n\t]],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function\", \"noop4\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"align\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"number\", \"4\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"void\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function\", \"derp\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"align\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin\", \"@sizeOf\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin-type\", \"usize\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"number\", \"2\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"i32\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"number\", \"1234\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function\", \"eventuallyNullSequence\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"class-name\", [\r\n\t\t[\"operator\", \"?\"],\r\n\t\t[\"builtin-type\", \"u32\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"numbers_left \",\r\n\t[\"operator\", \"==\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"label\", \"blk\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t\"\\r\\n\\t\\tnumbers_left \",\r\n\t[\"operator\", \"-=\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"break\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"label\", \"blk\"],\r\n\t\" numbers_left\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t\" message \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"_\",\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"builtin-type\", \"u8\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"char\", \"'h'\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"char\", \"'e'\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"char\", \"'l'\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"char\", \"'l'\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"char\", \"'o'\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t\" mat4x4 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t[\"number\", \"4\"],\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"builtin-type\", \"f32\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"_\",\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"builtin-type\", \"f32\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"number\", \"1.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0.0\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"_\",\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"builtin-type\", \"f32\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"number\", \"0.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"1.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"1.0\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"_\",\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"builtin-type\", \"f32\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"number\", \"0.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"1.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0.0\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"class-name\", [\r\n\t\t[\"punctuation\", \"[\"],\r\n\t\t\"_\",\r\n\t\t[\"punctuation\", \"]\"],\r\n\t\t[\"builtin-type\", \"f32\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"number\", \"0.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"0.0\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"number\", \"1.0\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \",\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", \"Point\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", \"Point2\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"packed\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", \"Type\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", \"Value\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"u2\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", \"Number\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"packed\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin-type\", \"u8\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" A\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" B\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" C \",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", \"Foo\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t\" A\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" B\",\r\n\t[\"punctuation\", \",\"],\r\n\t\" C \",\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", \"Payload\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"union\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"const\"],\r\n\t[\"class-name\", \"ComplexType\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"keyword\", \"union\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"ComplexTypeTag\",\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t\" node \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"class-name\", [\r\n\t\t\"ListOfInts\",\r\n\t\t[\"punctuation\", \".\"],\r\n\t\t\"Node\"\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"var\"],\r\n\t\" list2 \",\r\n\t[\"operator\", \"=\"],\r\n\t[\"function\", \"LinkedList\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"builtin-type\", \"i32\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for class names.\r\n"
  },
  {
    "path": "tests/languages/zig/comment_feature.test",
    "content": "// normal comment\n\n/// A structure for storing a timestamp, with nanosecond precision (this is a\n/// multiline doc comment).\n\n//! This module provides functions for retrieving the current date and\n//! time with varying degrees of precision and accuracy. It does not\n//! depend on libc, but will use functions from it if available.\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// normal comment\"],\n\n\t[\"comment\", \"/// A structure for storing a timestamp, with nanosecond precision (this is a\"],\n\t[\"comment\", \"/// multiline doc comment).\"],\n\n\t[\"comment\", \"//! This module provides functions for retrieving the current date and\"],\n\t[\"comment\", \"//! time with varying degrees of precision and accuracy. It does not\"],\n\t[\"comment\", \"//! depend on libc, but will use functions from it if available.\"]\n]\n"
  },
  {
    "path": "tests/languages/zig/keyword_feature.test",
    "content": "align\r\nallowzero\r\nand\r\nanyframe\r\nanytype\r\nasm\r\nasync\r\nawait\r\nbreak\r\ncancel\r\ncatch\r\ncomptime\r\nconst\r\ncontinue\r\ndefer\r\nelse\r\nenum\r\nerrdefer\r\nerror\r\nexport\r\nextern\r\nfn\r\nfor\r\nif\r\ninline\r\nlinksection\r\nnakedcc\r\nnoalias\r\nnosuspend\r\nnull\r\nor\r\norelse\r\npacked\r\npromise\r\npub\r\nresume\r\nreturn\r\nstdcallcc\r\nstruct\r\nsuspend\r\nswitch\r\ntest\r\nthreadlocal\r\ntry\r\nundefined\r\nunion\r\nunreachable\r\nusingnamespace\r\nvar\r\nvolatile\r\nwhile\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"keyword\", \"align\"],\r\n\t[\"keyword\", \"allowzero\"],\r\n\t[\"keyword\", \"and\"],\r\n\t[\"keyword\", \"anyframe\"],\r\n\t[\"keyword\", \"anytype\"],\r\n\t[\"keyword\", \"asm\"],\r\n\t[\"keyword\", \"async\"],\r\n\t[\"keyword\", \"await\"],\r\n\t[\"keyword\", \"break\"],\r\n\t[\"keyword\", \"cancel\"],\r\n\t[\"keyword\", \"catch\"],\r\n\t[\"keyword\", \"comptime\"],\r\n\t[\"keyword\", \"const\"],\r\n\t[\"keyword\", \"continue\"],\r\n\t[\"keyword\", \"defer\"],\r\n\t[\"keyword\", \"else\"],\r\n\t[\"keyword\", \"enum\"],\r\n\t[\"keyword\", \"errdefer\"],\r\n\t[\"keyword\", \"error\"],\r\n\t[\"keyword\", \"export\"],\r\n\t[\"keyword\", \"extern\"],\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"keyword\", \"for\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"keyword\", \"inline\"],\r\n\t[\"keyword\", \"linksection\"],\r\n\t[\"keyword\", \"nakedcc\"],\r\n\t[\"keyword\", \"noalias\"],\r\n\t[\"keyword\", \"nosuspend\"],\r\n\t[\"keyword\", \"null\"],\r\n\t[\"keyword\", \"or\"],\r\n\t[\"keyword\", \"orelse\"],\r\n\t[\"keyword\", \"packed\"],\r\n\t[\"keyword\", \"promise\"],\r\n\t[\"keyword\", \"pub\"],\r\n\t[\"keyword\", \"resume\"],\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"stdcallcc\"],\r\n\t[\"keyword\", \"struct\"],\r\n\t[\"keyword\", \"suspend\"],\r\n\t[\"keyword\", \"switch\"],\r\n\t[\"keyword\", \"test\"],\r\n\t[\"keyword\", \"threadlocal\"],\r\n\t[\"keyword\", \"try\"],\r\n\t[\"keyword\", \"undefined\"],\r\n\t[\"keyword\", \"union\"],\r\n\t[\"keyword\", \"unreachable\"],\r\n\t[\"keyword\", \"usingnamespace\"],\r\n\t[\"keyword\", \"var\"],\r\n\t[\"keyword\", \"volatile\"],\r\n\t[\"keyword\", \"while\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for keywords.\r\n"
  },
  {
    "path": "tests/languages/zig/label_feature.test",
    "content": "outer: while (true) {\r\n\twhile (true) {\r\n\t\tbreak :outer;\r\n\t}\r\n}\r\n\r\nfn eventuallyErrorSequence() anyerror!u32 {\r\n\treturn if (numbers_left == 0) error.ReachedZero else blk: {\r\n\t\tnumbers_left -= 1;\r\n\t\tbreak :blk numbers_left;\r\n\t};\r\n}\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"label\", \"outer\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"keyword\", \"while\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"while\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"boolean\", \"true\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"break\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"label\", \"outer\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\r\n\t[\"keyword\", \"fn\"],\r\n\t[\"function\", \"eventuallyErrorSequence\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"class-name\", [\r\n\t\t[\"builtin-type\", \"anyerror\"],\r\n\t\t[\"operator\", \"!\"],\r\n\t\t[\"builtin-type\", \"u32\"]\r\n\t]],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t[\"keyword\", \"return\"],\r\n\t[\"keyword\", \"if\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t\"numbers_left \",\r\n\t[\"operator\", \"==\"],\r\n\t[\"number\", \"0\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"keyword\", \"error\"],\r\n\t[\"punctuation\", \".\"],\r\n\t\"ReachedZero \",\r\n\t[\"keyword\", \"else\"],\r\n\t[\"label\", \"blk\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"punctuation\", \"{\"],\r\n\r\n\t\"\\r\\n\\t\\tnumbers_left \",\r\n\t[\"operator\", \"-=\"],\r\n\t[\"number\", \"1\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"keyword\", \"break\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"label\", \"blk\"],\r\n\t\" numbers_left\",\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \";\"],\r\n\r\n\t[\"punctuation\", \"}\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for labels.\r\n"
  },
  {
    "path": "tests/languages/zig/number_feature.test",
    "content": "123\r\n123.456e-7\r\n\r\n0xBadFace\r\n0xBAD.FACEp+F\r\n\r\n0b1001\r\n0o377\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"number\", \"123\"],\r\n\t[\"number\", \"123.456e-7\"],\r\n\t[\"number\", \"0xBadFace\"],\r\n\t[\"number\", \"0xBAD.FACEp+F\"],\r\n\t[\"number\", \"0b1001\"],\r\n\t[\"number\", \"0o377\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for numbers.\r\n"
  },
  {
    "path": "tests/languages/zig/operator_feature.test",
    "content": "+  -  *  /  %\r\n+= -= *= /= %=\r\n\r\n&  |  ^\r\n&= |= ^=\r\n\r\n+%  -%  *%\r\n+%= -%= *%=\r\n\r\n** ++\r\n\r\n< > <= >= ! != == =\r\n~ << <<= >> >>=\r\n\r\n.* .?\r\n.. ...\r\n\r\n=> ->\r\n?\r\n||\r\n\r\n----------------------------------------------------\r\n[\r\n\t[\"operator\", \"+\"],\r\n\t[\"operator\", \"-\"],\r\n\t[\"operator\", \"*\"],\r\n\t[\"operator\", \"/\"],\r\n\t[\"operator\", \"%\"],\r\n\t[\"operator\", \"+=\"],\r\n\t[\"operator\", \"-=\"],\r\n\t[\"operator\", \"*=\"],\r\n\t[\"operator\", \"/=\"],\r\n\t[\"operator\", \"%=\"],\r\n\t[\"operator\", \"&\"],\r\n\t[\"operator\", \"|\"],\r\n\t[\"operator\", \"^\"],\r\n\t[\"operator\", \"&=\"],\r\n\t[\"operator\", \"|=\"],\r\n\t[\"operator\", \"^=\"],\r\n\t[\"operator\", \"+%\"],\r\n\t[\"operator\", \"-%\"],\r\n\t[\"operator\", \"*%\"],\r\n\t[\"operator\", \"+%=\"],\r\n\t[\"operator\", \"-%=\"],\r\n\t[\"operator\", \"*%=\"],\r\n\t[\"operator\", \"**\"],\r\n\t[\"operator\", \"++\"],\r\n\t[\"operator\", \"<\"],\r\n\t[\"operator\", \">\"],\r\n\t[\"operator\", \"<=\"],\r\n\t[\"operator\", \">=\"],\r\n\t[\"operator\", \"!\"],\r\n\t[\"operator\", \"!=\"],\r\n\t[\"operator\", \"==\"],\r\n\t[\"operator\", \"=\"],\r\n\t[\"operator\", \"~\"],\r\n\t[\"operator\", \"<<\"],\r\n\t[\"operator\", \"<<=\"],\r\n\t[\"operator\", \">>\"],\r\n\t[\"operator\", \">>=\"],\r\n\t[\"operator\", \".*\"],\r\n\t[\"operator\", \".?\"],\r\n\t[\"operator\", \"..\"],\r\n\t[\"operator\", \"...\"],\r\n\t[\"operator\", \"=>\"],\r\n\t[\"operator\", \"->\"],\r\n\t[\"operator\", \"?\"],\r\n\t[\"operator\", \"||\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for operators.\r\n"
  },
  {
    "path": "tests/languages/zig/punctuation_feature.test",
    "content": ". : , ;\r\n( ) { } [ ]\r\n\r\n----------------------------------------------------\r\n\r\n[\r\n\t[\"punctuation\", \".\"],\r\n\t[\"punctuation\", \":\"],\r\n\t[\"punctuation\", \",\"],\r\n\t[\"punctuation\", \";\"],\r\n\t[\"punctuation\", \"(\"],\r\n\t[\"punctuation\", \")\"],\r\n\t[\"punctuation\", \"{\"],\r\n\t[\"punctuation\", \"}\"],\r\n\t[\"punctuation\", \"[\"],\r\n\t[\"punctuation\", \"]\"]\r\n]\r\n\r\n----------------------------------------------------\r\n\r\nChecks for punctuation.\r\n"
  },
  {
    "path": "tests/languages/zig/string_char_feature.test",
    "content": "// source: https://ziglang.org/documentation/master/#String-Literals-and-Character-Literals\n\nconst expect = @import(\"std\").testing.expect;\nconst mem = @import(\"std\").mem;\n\ntest \"string literals\" {\n    const bytes = \"hello\";\n    expect(@TypeOf(bytes) == *const [5:0]u8);\n    expect(bytes.len == 5);\n    expect(bytes[1] == 'e');\n    expect(bytes[5] == 0);\n    expect('e' == '\\x65');\n    expect('\\u{1f4a9}' == 128169);\n    expect('💯' == 128175);\n    expect(mem.eql(u8, \"hello\", \"h\\x65llo\"));\n}\n\nconst hello_world_in_c =\n    \\\\#include <stdio.h>\n    \\\\\n    \\\\int main(int argc, char **argv) {\n    \\\\    printf(\"hello world\\n\");\n    \\\\    return 0;\n    \\\\}\n;\n\n----------------------------------------------------\n\n[\n\t[\"comment\", \"// source: https://ziglang.org/documentation/master/#String-Literals-and-Character-Literals\"],\n\n\t[\"keyword\", \"const\"],\n\t\" expect \",\n\t[\"operator\", \"=\"],\n\t[\"builtin\", \"@import\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"std\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \".\"],\n\t\"testing\",\n\t[\"punctuation\", \".\"],\n\t\"expect\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"const\"],\n\t\" mem \",\n\t[\"operator\", \"=\"],\n\t[\"builtin\", \"@import\"],\n\t[\"punctuation\", \"(\"],\n\t[\"string\", \"\\\"std\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \".\"],\n\t\"mem\",\n\t[\"punctuation\", \";\"],\n\n\t[\"keyword\", \"test\"],\n\t[\"string\", \"\\\"string literals\\\"\"],\n\t[\"punctuation\", \"{\"],\n\n\t[\"keyword\", \"const\"],\n\t\" bytes \",\n\t[\"operator\", \"=\"],\n\t[\"string\", \"\\\"hello\\\"\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"expect\"],\n\t[\"punctuation\", \"(\"],\n\t[\"builtin\", \"@TypeOf\"],\n\t[\"punctuation\", \"(\"],\n\t\"bytes\",\n\t[\"punctuation\", \")\"],\n\t[\"operator\", \"==\"],\n\t[\"operator\", \"*\"],\n\t[\"keyword\", \"const\"],\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"5\"],\n\t[\"punctuation\", \":\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \"]\"],\n\t[\"builtin-type\", \"u8\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"expect\"],\n\t[\"punctuation\", \"(\"],\n\t\"bytes\",\n\t[\"punctuation\", \".\"],\n\t\"len \",\n\t[\"operator\", \"==\"],\n\t[\"number\", \"5\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"expect\"],\n\t[\"punctuation\", \"(\"],\n\t\"bytes\",\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"1\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"==\"],\n\t[\"char\", \"'e'\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"expect\"],\n\t[\"punctuation\", \"(\"],\n\t\"bytes\",\n\t[\"punctuation\", \"[\"],\n\t[\"number\", \"5\"],\n\t[\"punctuation\", \"]\"],\n\t[\"operator\", \"==\"],\n\t[\"number\", \"0\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"expect\"],\n\t[\"punctuation\", \"(\"],\n\t[\"char\", \"'e'\"],\n\t[\"operator\", \"==\"],\n\t[\"char\", \"'\\\\x65'\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"expect\"],\n\t[\"punctuation\", \"(\"],\n\t[\"char\", \"'\\\\u{1f4a9}'\"],\n\t[\"operator\", \"==\"],\n\t[\"number\", \"128169\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"expect\"],\n\t[\"punctuation\", \"(\"],\n\t[\"char\", \"'💯'\"],\n\t[\"operator\", \"==\"],\n\t[\"number\", \"128175\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"function\", \"expect\"],\n\t[\"punctuation\", \"(\"],\n\t\"mem\",\n\t[\"punctuation\", \".\"],\n\t[\"function\", \"eql\"],\n\t[\"punctuation\", \"(\"],\n\t[\"builtin-type\", \"u8\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"hello\\\"\"],\n\t[\"punctuation\", \",\"],\n\t[\"string\", \"\\\"h\\\\x65llo\\\"\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \")\"],\n\t[\"punctuation\", \";\"],\n\n\t[\"punctuation\", \"}\"],\n\n\t[\"keyword\", \"const\"], \" hello_world_in_c \", [\"operator\", \"=\"],\n\t[\"string\", \"    \\\\\\\\#include <stdio.h>\\r\\n    \\\\\\\\\\r\\n    \\\\\\\\int main(int argc, char **argv) {\\r\\n    \\\\\\\\    printf(\\\"hello world\\\\n\\\");\\r\\n    \\\\\\\\    return 0;\\r\\n    \\\\\\\\}\"],\n\t[\"punctuation\", \";\"]\n]\n"
  },
  {
    "path": "tests/pattern-tests.js",
    "content": "import { assert } from 'chai';\nimport {\n\tcombineTransformers,\n\tgetIntersectionWordSets,\n\tisDisjointWith,\n\tJS,\n\tNFA,\n\ttransform,\n\tTransformers,\n\tWords,\n} from 'refa';\nimport * as RAA from 'regexp-ast-analysis';\nimport { visitRegExpAST } from 'regexpp';\nimport * as scslre from 'scslre';\nimport { lazy } from '../src/shared/util.js';\nimport { toArray } from '../src/util/iterables.js';\nimport * as args from './helper/args.js';\nimport { createInstance, getComponent, getLanguageIds } from './helper/prism-loader.js';\nimport { parseLanguageNames, TestCaseFile } from './helper/test-case.js';\nimport { loadAllTests } from './helper/test-discovery.js';\nimport { BFS, BFSPathToPrismTokenPath, isRegExp, parseRegex } from './helper/util.js';\n\n/**\n * A map from language id to a list of code snippets in that language.\n *\n * @type {Map<string, string[]>}\n */\nconst testSnippets = new Map();\nconst testSuite = loadAllTests();\nfor (const [languageIdentifier, files] of testSuite) {\n\tconst lang = parseLanguageNames(languageIdentifier).mainLanguage;\n\tlet snippets = testSnippets.get(lang);\n\tif (snippets === undefined) {\n\t\tsnippets = [];\n\t\ttestSnippets.set(lang, snippets);\n\t}\n\n\tfor (const file of files) {\n\t\tsnippets.push(TestCaseFile.readFromFile(file).code);\n\t}\n}\n\nconst argsLanguage = new Set(toArray(args.language));\nfor (const lang of getLanguageIds()) {\n\tif (argsLanguage.size > 0 && !argsLanguage.has(lang)) {\n\t\tcontinue;\n\t}\n\n\tdescribe(`Patterns of '${lang}'`, () => {\n\t\tconst create = lazy(() => createInstance(lang));\n\t\ttestPatterns(create, lang);\n\t});\n\n\tdescribe(`Patterns of '${lang}' with optional dependencies`, () => {\n\t\tconst create = lazy(async () => {\n\t\t\tconst component = await getComponent(lang);\n\t\t\tconst optional = toArray(\n\t\t\t\t/** @type {string | string[] | null | undefined} */ (component.optional)\n\t\t\t);\n\t\t\tif (optional.length === 0) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn createInstance([lang, ...optional]);\n\t\t});\n\t\ttestPatterns(create, lang);\n\t});\n}\n\n/**\n * Tests all patterns in the given Prism instance.\n *\n * @param {() => Promise<Prism | undefined>} getPrism\n * @param {string} mainLanguage\n */\nfunction testPatterns (getPrism, mainLanguage) {\n\t/**\n\t * Returns a list of relevant languages in the Prism instance.\n\t *\n\t * The list does not included readonly dependencies and aliases.\n\t *\n\t * @returns {string[]}\n\t */\n\tfunction getRelevantLanguages () {\n\t\treturn [mainLanguage];\n\t}\n\n\t/**\n\t *\n\t * @param {(values: ForEachPatternCallbackValue) => void} callback\n\t * @returns\n\t */\n\tasync function forEachPattern (callback) {\n\t\tconst visited = new Set();\n\t\tconst errors = [];\n\n\t\t/**\n\t\t *\n\t\t * @param {Grammar} grammar\n\t\t * @param {string} rootStr\n\t\t * @returns {void}\n\t\t */\n\t\tfunction traverse (grammar, rootStr) {\n\t\t\tif (visited.has(grammar)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvisited.add(grammar);\n\n\t\t\tBFS(grammar, path => {\n\t\t\t\tconst { key, value } = path[path.length - 1];\n\t\t\t\tconst tokenPath = BFSPathToPrismTokenPath(path, rootStr);\n\t\t\t\tvisited.add(value);\n\n\t\t\t\tif (key && isRegExp(value)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet ast;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tast = parseRegex(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (error) {\n\t\t\t\t\t\t\tthrow new SyntaxError(\n\t\t\t\t\t\t\t\t`Invalid RegExp at ${tokenPath}\\n\\n${asError(error).message}`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst parent = path.length > 1 ? path[path.length - 2].value : undefined;\n\t\t\t\t\t\tconst lookbehind = key === 'pattern' && !!parent && !!parent.lookbehind;\n\t\t\t\t\t\tconst lookbehindGroup = lookbehind\n\t\t\t\t\t\t\t? getFirstCapturingGroup(ast.pattern)\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tpattern: value,\n\t\t\t\t\t\t\tast,\n\t\t\t\t\t\t\ttokenPath,\n\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\tparent,\n\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\tlookbehind,\n\t\t\t\t\t\t\tlookbehindGroup,\n\t\t\t\t\t\t\treportError: message => errors.push(message),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tcatch (error) {\n\t\t\t\t\t\terrors.push(asError(error));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst Prism = await getPrism();\n\t\tif (!Prism) {\n\t\t\treturn;\n\t\t}\n\n\t\t// static analysis\n\t\tfor (const id of Object.keys(Prism.languages)) {\n\t\t\tconst grammar = Prism.languageRegistry.getLanguage(id)?.resolvedGrammar;\n\t\t\tif (grammar) {\n\t\t\t\ttraverse(grammar, id);\n\t\t\t}\n\t\t}\n\n\t\t// dynamic analysis\n\t\tfor (const lang of getRelevantLanguages()) {\n\t\t\tconst snippets = testSnippets.get(lang);\n\t\t\tconst grammar = Prism.languageRegistry.getLanguage(lang)?.resolvedGrammar;\n\n\t\t\tconst oldTokenize = Prism.tokenize;\n\t\t\tPrism.tokenize = function (code, grammar) {\n\t\t\t\tconst result = oldTokenize.call(this, code, grammar);\n\t\t\t\ttraverse(grammar, lang + ': <Unknown>');\n\t\t\t\treturn result;\n\t\t\t};\n\n\t\t\tfor (const snippet of snippets || []) {\n\t\t\t\tPrism.highlight(snippet, lang, { grammar });\n\t\t\t}\n\n\t\t\tPrism.tokenize = oldTokenize;\n\t\t}\n\n\t\tif (errors.length > 0) {\n\t\t\tthrow new Error(errors.map(e => (typeof e === 'string' ? e : e.message)).join('\\n\\n'));\n\t\t}\n\t}\n\n\t/**\n\t * Invokes the given callback for all capturing groups in the given pattern in left to right order.\n\t *\n\t * @param {Pattern} pattern\n\t * @param {(values: ForEachCapturingGroupCallbackValue) => void} callback\n\t * @returns {void}\n\t */\n\tfunction forEachCapturingGroup (pattern, callback) {\n\t\tlet number = 0;\n\t\tvisitRegExpAST(pattern, {\n\t\t\tonCapturingGroupEnter (node) {\n\t\t\t\tcallback({\n\t\t\t\t\tgroup: node,\n\t\t\t\t\tnumber: ++number,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\tit('- should not match the empty string', async () => {\n\t\tawait forEachPattern(({ ast, pattern, tokenPath }) => {\n\t\t\t// test for empty string\n\t\t\tconst empty = RAA.isPotentiallyZeroLength(ast.pattern.alternatives);\n\t\t\tassert.isFalse(\n\t\t\t\tempty,\n\t\t\t\t`${tokenPath}: ${String(pattern)} should not match the empty string.\\n\\n` +\n\t\t\t\t\t`Patterns that do match the empty string can potentially cause infinitely many empty tokens. ` +\n\t\t\t\t\t`Make sure that all patterns always consume at least one character.`\n\t\t\t);\n\t\t});\n\t});\n\n\tit('- should have a capturing group if lookbehind is set to true', async () => {\n\t\tawait forEachPattern(({ ast, tokenPath, lookbehind }) => {\n\t\t\tif (lookbehind) {\n\t\t\t\tlet hasCapturingGroup = false;\n\t\t\t\tforEachCapturingGroup(ast.pattern, () => {\n\t\t\t\t\thasCapturingGroup = true;\n\t\t\t\t});\n\n\t\t\t\tif (!hasCapturingGroup) {\n\t\t\t\t\tassert.fail(\n\t\t\t\t\t\t`${tokenPath}: The pattern is set to 'lookbehind: true' but does not have a capturing group.\\n\\n` +\n\t\t\t\t\t\t\t`Prism lookbehind groups use the captured text of the first capturing group to simulate a lookbehind. ` +\n\t\t\t\t\t\t\t`Without a capturing group, a lookbehind is not possible.\\n` +\n\t\t\t\t\t\t\t`To fix this, either add a capturing group for the lookbehind or remove the 'lookbehind' property.`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\tit('- should not have lookbehind groups that can be preceded by other some characters', async () => {\n\t\tawait forEachPattern(({ tokenPath, lookbehindGroup }) => {\n\t\t\tif (lookbehindGroup && !isFirstMatch(lookbehindGroup)) {\n\t\t\t\tassert.fail(\n\t\t\t\t\t`${tokenPath}: The lookbehind group ${lookbehindGroup.raw} might be preceded by some characters.\\n\\n` +\n\t\t\t\t\t\t`Prism assumes that the lookbehind group, if captured, is the first thing matched by the regex. ` +\n\t\t\t\t\t\t`If characters might precede the lookbehind group (e.g. /a?(b)c/), then Prism cannot correctly apply the lookbehind correctly in all cases.\\n` +\n\t\t\t\t\t\t`To fix this, either remove the preceding characters or include them in the lookbehind group.`\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t});\n\n\tit('- should not have lookbehind groups that only have zero-width alternatives', async () => {\n\t\tawait forEachPattern(({ tokenPath, lookbehindGroup, reportError }) => {\n\t\t\tif (lookbehindGroup && RAA.isZeroLength(lookbehindGroup)) {\n\t\t\t\tconst groupContent = lookbehindGroup.raw.substr(1, lookbehindGroup.raw.length - 2);\n\t\t\t\tconst replacement =\n\t\t\t\t\tlookbehindGroup.alternatives.length === 1\n\t\t\t\t\t\t? groupContent\n\t\t\t\t\t\t: `(?:${groupContent})`;\n\t\t\t\treportError(\n\t\t\t\t\t`${tokenPath}: The lookbehind group ${lookbehindGroup.raw} does not consume characters.\\n\\n` +\n\t\t\t\t\t\t`Therefor it is not necessary to use a lookbehind group.\\n` +\n\t\t\t\t\t\t`To fix this, replace the lookbehind group with ${replacement} and remove the 'lookbehind' property.`\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t});\n\n\tit('- should not have unused capturing groups', async () => {\n\t\tawait forEachPattern(({ ast, tokenPath, lookbehindGroup, reportError }) => {\n\t\t\tforEachCapturingGroup(ast.pattern, ({ group, number }) => {\n\t\t\t\tconst isLookbehindGroup = group === lookbehindGroup;\n\t\t\t\tif (group.references.length === 0 && !isLookbehindGroup) {\n\t\t\t\t\tconst fixes = [];\n\t\t\t\t\tfixes.push(\n\t\t\t\t\t\t`Make this group a non-capturing group ('(?:...)' instead of '(...)'). (It's usually this option.)`\n\t\t\t\t\t);\n\t\t\t\t\tfixes.push(\n\t\t\t\t\t\t`Reference this group with a backreference (use '\\\\${number}' for this).`\n\t\t\t\t\t);\n\t\t\t\t\tif (number === 1 && !lookbehindGroup) {\n\t\t\t\t\t\tif (isFirstMatch(group)) {\n\t\t\t\t\t\t\tfixes.push(`Add a 'lookbehind: true' declaration.`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfixes.push(\n\t\t\t\t\t\t\t\t`Add a 'lookbehind: true' declaration. (This group is not a valid lookbehind group because it can be preceded by some characters.)`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treportError(\n\t\t\t\t\t\t`${tokenPath}: Unused capturing group ${group.raw}.\\n\\n` +\n\t\t\t\t\t\t\t`Unused capturing groups generally degrade the performance of regular expressions. ` +\n\t\t\t\t\t\t\t`They might also be a sign that a backreference is incorrect or that a 'lookbehind: true' declaration in missing.\\n` +\n\t\t\t\t\t\t\t`To fix this, do one of the following:\\n` +\n\t\t\t\t\t\t\tfixes.map(f => '- ' + f).join('\\n')\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\n\tit('- should have nice names and aliases', async () => {\n\t\tconst niceName = /^[a-z][a-z\\d]*(?:-[a-z\\d]+)*$/;\n\t\t/**\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {string} [desc='token name']\n\t\t * @returns {void}\n\t\t */\n\t\tfunction testName (name, desc = 'token name') {\n\t\t\tif (!niceName.test(name)) {\n\t\t\t\tassert.fail(\n\t\t\t\t\t`The ${desc} '${name}' does not match ${String(niceName)}.\\n\\n` +\n\t\t\t\t\t\t`To fix this, choose a name that matches the above regular expression.`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tawait forEachPattern(({ name, parent, tokenPath, path }) => {\n\t\t\t// token name\n\t\t\tlet offset = 1;\n\t\t\tif (name === 'pattern') {\n\t\t\t\t// regex can be inside an object\n\t\t\t\toffset++;\n\t\t\t}\n\t\t\tif (Array.isArray(path[path.length - 1 - offset].value)) {\n\t\t\t\t// regex/regex object can be inside an array\n\t\t\t\toffset++;\n\t\t\t}\n\t\t\tconst patternName = path[path.length - offset].key;\n\t\t\tif (patternName) {\n\t\t\t\ttestName(patternName);\n\t\t\t}\n\n\t\t\t// check alias\n\t\t\tif (name === 'pattern' && 'alias' in parent) {\n\t\t\t\tconst alias = parent.alias;\n\t\t\t\tif (typeof alias === 'string') {\n\t\t\t\t\ttestName(alias, `alias of '${tokenPath}'`);\n\t\t\t\t}\n\t\t\t\telse if (Array.isArray(alias)) {\n\t\t\t\t\talias.forEach(name => testName(name, `alias of '${tokenPath}'`));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\tit('- should not use octal escapes', async () => {\n\t\tawait forEachPattern(({ ast, tokenPath, reportError }) => {\n\t\t\tvisitRegExpAST(ast.pattern, {\n\t\t\t\tonCharacterEnter (node) {\n\t\t\t\t\tif (/^\\\\(?:[1-9]|\\d{2,})$/.test(node.raw)) {\n\t\t\t\t\t\treportError(\n\t\t\t\t\t\t\t`${tokenPath}: Octal escape ${node.raw}.\\n\\n` +\n\t\t\t\t\t\t\t\t`Octal escapes can be confused with backreferences, so please do not use them.\\n` +\n\t\t\t\t\t\t\t\t`To fix this, use a different escape method. ` +\n\t\t\t\t\t\t\t\t`Note that this could also be an invalid backreference, so be sure to carefully analyse the pattern.`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t});\n\n\tit('- should not cause exponential backtracking', async () => {\n\t\tawait replaceRegExpProto(\n\t\t\texec => {\n\t\t\t\treturn function (input) {\n\t\t\t\t\tcheckExponentialBacktracking('<Unknown>', this);\n\t\t\t\t\treturn exec.call(this, input);\n\t\t\t\t};\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tawait forEachPattern(({ pattern, ast, tokenPath }) => {\n\t\t\t\t\tcheckExponentialBacktracking(tokenPath, pattern, ast);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t});\n\n\tit('- should not cause polynomial backtracking', async () => {\n\t\tawait replaceRegExpProto(\n\t\t\texec => {\n\t\t\t\treturn function (input) {\n\t\t\t\t\tcheckPolynomialBacktracking('<Unknown>', this);\n\t\t\t\t\treturn exec.call(this, input);\n\t\t\t\t};\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tawait forEachPattern(({ pattern, ast, tokenPath }) => {\n\t\t\t\t\tcheckPolynomialBacktracking(tokenPath, pattern, ast);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t});\n}\n\n/**\n * Returns the first capturing group in the given pattern.\n *\n * @param {Pattern} pattern\n * @returns {CapturingGroup | undefined}\n */\nfunction getFirstCapturingGroup (pattern) {\n\tlet cap = undefined;\n\n\ttry {\n\t\tvisitRegExpAST(pattern, {\n\t\t\tonCapturingGroupEnter (node) {\n\t\t\t\tcap = node;\n\t\t\t\tthrow new Error('stop');\n\t\t\t},\n\t\t});\n\t}\n\tcatch {\n\t\t// ignore errors\n\t}\n\n\treturn cap;\n}\n\n/**\n * Returns whether the given element will always at the start of the whole match.\n *\n * @param {Element} element\n * @returns {boolean}\n */\nfunction isFirstMatch (element) {\n\tconst parent = element.parent;\n\tswitch (parent.type) {\n\t\tcase 'Alternative': {\n\t\t\t// all elements before this element have to of zero length\n\t\t\tif (\n\t\t\t\t!parent.elements.slice(0, parent.elements.indexOf(element)).every(RAA.isZeroLength)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst grandParent = parent.parent;\n\t\t\tif (grandParent.type === 'Pattern') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn isFirstMatch(grandParent);\n\t\t\t}\n\t\t}\n\n\t\tcase 'Quantifier':\n\t\t\tif (parent.max >= 2) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn isFirstMatch(parent);\n\t\t\t}\n\n\t\tdefault:\n\t\t\tthrow new Error(`Internal error: The given node should not be a '${element.type}'.`);\n\t}\n}\n\n/**\n * Returns whether the given node either is or is a child of what is effectively a Kleene star.\n *\n * @param {Node} node\n * @returns {boolean}\n */\nfunction underAStar (node) {\n\treturn RAA.getEffectiveMaximumRepetition(node) > 10;\n}\n\n/**\n * @template T\n * @param {Iterable<T>} iter\n * @returns {T | undefined}\n */\nfunction firstOf (iter) {\n\tconst [first] = iter;\n\treturn first;\n}\n\n/**\n * A set of all safe (non-exponentially backtracking) RegExp literals (string).\n *\n * @type {Set<string | RegExp>}\n */\nconst expoSafeRegexes = new Set();\n\n/** @type {Transformers.CreationOptions} */\nconst options = {\n\tignoreOrder: true,\n\tignoreAmbiguity: true,\n};\nconst transformer = combineTransformers([\n\tTransformers.inline(options),\n\tTransformers.removeDeadBranches(options),\n\tTransformers.unionCharacters(options),\n\tTransformers.moveUpEmpty(options),\n\tTransformers.nestedQuantifiers(options),\n\tTransformers.sortAssertions(options),\n\tTransformers.removeUnnecessaryAssertions(options),\n\tTransformers.applyAssertions(options),\n]);\n\n/** @type {Map<string, Map<string, Error | null>>} */\nconst resultCache = new Map();\n\n/**\n *\n * @param {string} cacheName\n * @returns {Map<string, Error | null>}\n */\nfunction getResultCache (cacheName) {\n\tlet cache = resultCache.get(cacheName);\n\tif (cache === undefined) {\n\t\tcache = new Map();\n\t\tresultCache.set(cacheName, cache);\n\t}\n\treturn cache;\n}\n\n/**\n * @template {Node} T\n * @param {string} cacheName\n * @param {T} cacheKey\n * @param {(node: T) => void} compute\n * @returns {void}\n */\nfunction withResultCache (cacheName, cacheKey, compute) {\n\tconst hasBackRef = RAA.hasSomeDescendant(cacheKey, n => n.type === 'Backreference');\n\tif (hasBackRef) {\n\t\tcompute(cacheKey);\n\t\treturn;\n\t}\n\n\tconst cache = getResultCache(cacheName);\n\tlet cached = cache.get(cacheKey.raw);\n\tif (cached === undefined) {\n\t\ttry {\n\t\t\tcompute(cacheKey);\n\t\t\tcached = null;\n\t\t}\n\t\tcatch (error) {\n\t\t\tcached = asError(error);\n\t\t}\n\t\tcache.set(cacheKey.raw, cached);\n\t}\n\n\tif (cached) {\n\t\tthrow cached;\n\t}\n}\n\n/**\n *\n * @param {*} error\n * @returns {Error}\n */\nfunction asError (error) {\n\tif (error instanceof Error) {\n\t\treturn error;\n\t}\n\telse {\n\t\treturn new Error(String(error));\n\t}\n}\n\n/**\n *\n * @param {string} path\n * @param {RegExp} pattern\n * @param {LiteralAST} [ast]\n * @returns {void}\n */\nfunction checkExponentialBacktracking (path, pattern, ast) {\n\tif (expoSafeRegexes.has(pattern)) {\n\t\t// we know that the pattern won't cause exp backtracking because we checked before\n\t\treturn;\n\t}\n\tconst patternStr = String(pattern);\n\tif (expoSafeRegexes.has(patternStr)) {\n\t\t// we know that the pattern won't cause exp backtracking because we checked before\n\t\treturn;\n\t}\n\n\tif (!ast) {\n\t\tast = parseRegex(pattern);\n\t}\n\n\tconst parser = JS.Parser.fromAst(ast);\n\t/**\n\t * Parses the given element and creates its NFA.\n\t *\n\t * @param {JS.ParsableElement} element\n\t * @returns {NFA}\n\t */\n\tfunction toNFA (element) {\n\t\tconst { expression, maxCharacter } = parser.parseElement(element, {\n\t\t\tmaxBackreferenceWords: 1000,\n\t\t\tbackreferences: 'disable',\n\t\t});\n\n\t\treturn NFA.fromRegex(\n\t\t\ttransform(transformer, expression),\n\t\t\t{ maxCharacter },\n\t\t\t{ assertions: 'disable' }\n\t\t);\n\t}\n\n\t/**\n\t * Checks whether the alternatives of the given node are disjoint. If the alternatives are not disjoint\n\t * and the give node is a descendant of an effective Kleene star, then an error will be thrown.\n\t *\n\t * @param {CapturingGroup | Group | LookaroundAssertion} node\n\t * @returns {void}\n\t */\n\tfunction checkDisjointAlternatives (node) {\n\t\tif (!underAStar(node) || node.alternatives.length < 2) {\n\t\t\treturn;\n\t\t}\n\n\t\twithResultCache('disjointAlternatives', node, () => {\n\t\t\tconst alternatives = node.alternatives;\n\n\t\t\tconst total = toNFA(alternatives[0]);\n\t\t\ttotal.withoutEmptyWord();\n\t\t\tfor (let i = 1, l = alternatives.length; i < l; i++) {\n\t\t\t\tconst a = alternatives[i];\n\t\t\t\tconst current = toNFA(a);\n\t\t\t\tcurrent.withoutEmptyWord();\n\n\t\t\t\tif (!isDisjointWith(total, current)) {\n\t\t\t\t\tassert.fail(\n\t\t\t\t\t\t`${path}: The alternative \\`${a.raw}\\` is not disjoint with at least one previous alternative.` +\n\t\t\t\t\t\t\t` This will cause exponential backtracking.` +\n\t\t\t\t\t\t\t`\\n\\nTo fix this issue, you have to rewrite the ${node.type} \\`${node.raw}\\`.` +\n\t\t\t\t\t\t\t` The goal is that all of its alternatives are disjoint.` +\n\t\t\t\t\t\t\t` This means that if a (sub-)string is matched by the ${node.type}, then only one of its alternatives can match the (sub-)string.` +\n\t\t\t\t\t\t\t`\\n\\nExample: \\`(?:[ab]|\\\\w|::)+\\`` +\n\t\t\t\t\t\t\t`\\nThe alternatives of the group are not disjoint because the string \"a\" can be matched by both \\`[ab]\\` and \\`\\\\w\\`.` +\n\t\t\t\t\t\t\t` In this example, the pattern can easily be fixed because the \\`[ab]\\` is a subset of the \\`\\\\w\\`, so its enough to remove the \\`[ab]\\` alternative to get \\`(?:\\\\w|::)+\\` as the fixed pattern.` +\n\t\t\t\t\t\t\t`\\nIn the real world, patterns can be a lot harder to fix.` +\n\t\t\t\t\t\t\t` If you are trying to make the tests pass for a pull request but can\\'t fix the issue yourself, then make the pull request (or commit) anyway.` +\n\t\t\t\t\t\t\t` A maintainer will help you.` +\n\t\t\t\t\t\t\t`\\n\\nFull pattern:\\n${String(pattern)}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse if (i !== l - 1) {\n\t\t\t\t\ttotal.union(current);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tvisitRegExpAST(ast.pattern, {\n\t\tonCapturingGroupLeave: checkDisjointAlternatives,\n\t\tonGroupLeave: checkDisjointAlternatives,\n\t\tonAssertionLeave (node) {\n\t\t\tif (node.kind === 'lookahead' || node.kind === 'lookbehind') {\n\t\t\t\tcheckDisjointAlternatives(node);\n\t\t\t}\n\t\t},\n\n\t\tonQuantifierLeave (node) {\n\t\t\tif (node.max < 10) {\n\t\t\t\treturn; // not a star\n\t\t\t}\n\t\t\tif (node.element.type !== 'CapturingGroup' && node.element.type !== 'Group') {\n\t\t\t\treturn; // not a group\n\t\t\t}\n\n\t\t\twithResultCache('2star', node, () => {\n\t\t\t\t// The idea here is the following:\n\t\t\t\t//\n\t\t\t\t// We have found a part `A*` of the regex (`A` is assumed to not accept the empty word). Let `I` be\n\t\t\t\t// the intersection of `A` and `A{2,}`. If `I` is not empty, then there exists a non-empty word `w`\n\t\t\t\t// that is accepted by both `A` and `A{2,}`. That means that there exists some `m>1` for which `w`\n\t\t\t\t// is accepted by `A{m}`.\n\t\t\t\t// This means that there are at least two ways `A*` can accept `w`. It can be accepted as `A` or as\n\t\t\t\t// `A{m}`. Hence there are at least 2^n ways for `A*` to accept the word `w{n}`. This is the main\n\t\t\t\t// requirement for exponential backtracking.\n\t\t\t\t//\n\t\t\t\t// This is actually only a crude approximation for the real analysis that would have to be done. We\n\t\t\t\t// would actually have to check the intersection `A{p}` and `A{p+1,}` for all p>0. However, in most\n\t\t\t\t// cases, the approximation is good enough.\n\n\t\t\t\tconst nfa = toNFA(node.element);\n\t\t\t\tnfa.withoutEmptyWord();\n\t\t\t\tconst twoStar = nfa.copy();\n\t\t\t\ttwoStar.quantify(2, Infinity);\n\n\t\t\t\tif (!isDisjointWith(nfa, twoStar)) {\n\t\t\t\t\tconst exampleWordSet = firstOf(getIntersectionWordSets(nfa, twoStar));\n\t\t\t\t\tif (!exampleWordSet) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst word = Words.pickMostReadableWord(exampleWordSet);\n\t\t\t\t\tconst example = Words.fromUnicodeToString(word);\n\t\t\t\t\tassert.fail(\n\t\t\t\t\t\t`${path}: The quantifier \\`${node.raw}\\` ambiguous for all words ${JSON.stringify(example)}.repeat(n) for any n>1.` +\n\t\t\t\t\t\t\t` This will cause exponential backtracking.` +\n\t\t\t\t\t\t\t`\\n\\nTo fix this issue, you have to rewrite the element (let's call it E) of the quantifier.` +\n\t\t\t\t\t\t\t` The goal is modify E such that it is disjoint with repetitions of itself.` +\n\t\t\t\t\t\t\t` This means that if a (sub-)string is matched by E, then it must not be possible for E{2}, E{3}, E{4}, etc. to match that (sub-)string.` +\n\t\t\t\t\t\t\t`\\n\\nExample 1: \\`(?:\\\\w+|::)+\\`` +\n\t\t\t\t\t\t\t`\\nThe problem lies in \\`\\\\w+\\` because \\`\\\\w+\\` and \\`(?:\\\\w+){2}\\` are not disjoint as the string \"aa\" is fully matched by both.` +\n\t\t\t\t\t\t\t` In this example, the pattern can easily be fixed by changing \\`\\\\w+\\` to \\`\\\\w\\`.` +\n\t\t\t\t\t\t\t`\\nExample 2: \\`(?:\\\\w|Foo)+\\`` +\n\t\t\t\t\t\t\t`\\nThe problem lies in \\`\\\\w\\` and \\`Foo\\` because the string \"Foo\" can be matched as either repeating \\`\\\\w\\` 3 times or by using the \\`Foo\\` alternative once.` +\n\t\t\t\t\t\t\t` In this example, the pattern can easily be fixed because the \\`Foo\\` alternative is redundant can can be removed.` +\n\t\t\t\t\t\t\t`\\nExample 3: \\`(?:\\\\.\\\\w+(?:<.*?>)?)+\\`` +\n\t\t\t\t\t\t\t`\\nThe problem lies in \\`<.*?>\\`. The string \".a<>.a<>\" can be matched as either \\`\\\\. \\\\w < . . . . >\\` or \\`\\\\. \\\\w < > \\\\. \\\\w < >\\`.` +\n\t\t\t\t\t\t\t` When it comes to exponential backtracking, it doesn't matter whether a quantifier is greedy or lazy.` +\n\t\t\t\t\t\t\t` This means that the lazy \\`.*?\\` can jump over \\`>\\`.` +\n\t\t\t\t\t\t\t` In this example, the pattern can easily be fixed because we just have to prevent \\`.*?\\` jumping over \\`>\\`.` +\n\t\t\t\t\t\t\t` This can done by replacing \\`<.*?>\\` with \\`<[^\\\\r\\\\n>]*>\\`.` +\n\t\t\t\t\t\t\t`\\n\\nIn the real world, patterns can be a lot harder to fix.` +\n\t\t\t\t\t\t\t` If you are trying to make this test pass for a pull request but can\\'t fix the issue yourself, then make the pull request (or commit) anyway, a maintainer will help you.` +\n\t\t\t\t\t\t\t`\\n\\nFull pattern:\\n${String(pattern)}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t});\n\n\texpoSafeRegexes.add(pattern);\n\texpoSafeRegexes.add(patternStr);\n}\n\n/**\n * A set of all safe (non-polynomially backtracking) RegExp literals (string).\n *\n * @type {Set<string | RegExp>}\n */\nconst polySafeRegexes = new Set();\n\n/**\n * @param {string} path\n * @param {RegExp} pattern\n * @param {LiteralAST} [ast]\n * @returns {void}\n */\nfunction checkPolynomialBacktracking (path, pattern, ast) {\n\tif (polySafeRegexes.has(pattern)) {\n\t\t// we know that the pattern won't cause poly backtracking because we checked before\n\t\treturn;\n\t}\n\tconst patternStr = String(pattern);\n\tif (polySafeRegexes.has(patternStr)) {\n\t\t// we know that the pattern won't cause poly backtracking because we checked before\n\t\treturn;\n\t}\n\n\tif (!ast) {\n\t\tast = parseRegex(pattern);\n\t}\n\n\tconst result = scslre.analyse(/** @type {scslre.ParsedLiteral} */ (ast), {\n\t\tmaxReports: 1,\n\t\treportTypes: { 'Move': false },\n\t});\n\tif (result.reports.length > 0) {\n\t\tconst report = result.reports[0];\n\n\t\tlet rangeOffset;\n\t\tlet rangeStr;\n\t\tlet rangeHighlight;\n\n\t\tswitch (report.type) {\n\t\t\tcase 'Trade': {\n\t\t\t\tconst start = Math.min(report.startQuant.start, report.endQuant.start);\n\t\t\t\tconst end = Math.max(report.startQuant.end, report.endQuant.end);\n\t\t\t\trangeOffset = start + 1;\n\t\t\t\trangeStr = patternStr.substring(start + 1, end + 1);\n\t\t\t\trangeHighlight = highlight(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ ...report.startQuant, label: 'start' },\n\t\t\t\t\t\t{ ...report.endQuant, label: 'end' },\n\t\t\t\t\t],\n\t\t\t\t\t-start\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Self': {\n\t\t\t\trangeOffset = report.parentQuant.start + 1;\n\t\t\t\trangeStr = patternStr.substring(\n\t\t\t\t\treport.parentQuant.start + 1,\n\t\t\t\t\treport.parentQuant.end + 1\n\t\t\t\t);\n\t\t\t\trangeHighlight = highlight(\n\t\t\t\t\t[{ ...report.quant, label: 'self' }],\n\t\t\t\t\t-report.parentQuant.start\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Move': {\n\t\t\t\trangeOffset = 1;\n\t\t\t\trangeStr = patternStr.substring(1, report.quant.end + 1);\n\t\t\t\trangeHighlight = highlight([report.quant]);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error('Invalid report type. This should never happen.');\n\t\t}\n\n\t\tconst attackChar = `/${report.character.literal.source}/${report.character.literal.flags}`;\n\t\tconst fixed = report.fix();\n\n\t\tassert.fail(\n\t\t\t`${path}: ${report.exponential ? 'Exponential' : 'Polynomial'} backtracking. ` +\n\t\t\t\t`By repeating any character that matches ${attackChar}, an attack string can be created.` +\n\t\t\t\t`\\n` +\n\t\t\t\t`\\n${indent(rangeStr)}` +\n\t\t\t\t`\\n${indent(rangeHighlight)}` +\n\t\t\t\t`\\n` +\n\t\t\t\t`\\nFull pattern:` +\n\t\t\t\t`\\n${patternStr}` +\n\t\t\t\t`\\n${indent(rangeHighlight, ' '.repeat(rangeOffset))}` +\n\t\t\t\t`\\n` +\n\t\t\t\t`\\n` +\n\t\t\t\t(fixed ? `Fixed:\\n/${fixed.source}/${fixed.flags}` : `Fix not available.`)\n\t\t);\n\t}\n\n\tpolySafeRegexes.add(pattern);\n\tpolySafeRegexes.add(patternStr);\n}\n\n/**\n * @typedef {object} Highlight\n * @property {number} start\n * @property {number} end\n * @property {string} [label]\n */\n\n/**\n *\n * @param {Highlight[]} highlights\n * @param {number} [offset=0]\n * @returns {string}\n */\nfunction highlight (highlights, offset = 0) {\n\thighlights.sort((a, b) => a.start - b.start);\n\n\tconst lines = [];\n\twhile (highlights.length > 0) {\n\t\tconst newHighlights = [];\n\t\tlet l = '';\n\t\tfor (const highlight of highlights) {\n\t\t\tconst start = highlight.start + offset;\n\t\t\tconst end = highlight.end + offset;\n\t\t\tif (start < l.length) {\n\t\t\t\tnewHighlights.push(highlight);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tl += ' '.repeat(start - l.length);\n\t\t\t\tl += '^';\n\t\t\t\tl += '~'.repeat(end - start - 1);\n\t\t\t\tif (highlight.label) {\n\t\t\t\t\tl += '[' + highlight.label + ']';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlines.push(l);\n\t\thighlights = newHighlights;\n\t}\n\n\treturn lines.join('\\n');\n}\n\n/**\n *\n * @param {string} str\n * @param {string} [amount='    ']\n * @returns {string}\n */\nfunction indent (str, amount = '    ') {\n\treturn str\n\t\t.split(/\\r?\\n/)\n\t\t.map(m => (m === '' ? '' : amount + m))\n\t\t.join('\\n');\n}\n\n/**\n *\n * @param {(exec: RegExp['exec']) => (this: RegExp, input: string) => RegExpExecArray | null} execSupplier\n * @param {() => Promise<void>} fn\n */\nasync function replaceRegExpProto (execSupplier, fn) {\n\tconst oldExec = RegExp.prototype.exec;\n\tconst oldTest = RegExp.prototype.test;\n\tconst newExec = execSupplier(oldExec);\n\n\tRegExp.prototype.exec = newExec;\n\tRegExp.prototype.test = function (input) {\n\t\treturn newExec.call(this, input) !== null;\n\t};\n\n\tlet error;\n\ttry {\n\t\tawait fn();\n\t}\n\tcatch (e) {\n\t\terror = e;\n\t}\n\n\tRegExp.prototype.exec = oldExec;\n\tRegExp.prototype.test = oldTest;\n\n\tif (error) {\n\t\tthrow error;\n\t}\n}\n\n/**\n * @typedef {import('regexpp/ast').CapturingGroup} CapturingGroup\n * @typedef {import('regexpp/ast').Element} Element\n * @typedef {import('regexpp/ast').Group} Group\n * @typedef {import('regexpp/ast').LookaroundAssertion} LookaroundAssertion\n * @typedef {import('regexpp/ast').Node} Node\n * @typedef {import('regexpp/ast').Pattern} Pattern\n */\n\n/**\n * @typedef {import('../src/core.js').Prism} Prism\n * @typedef {import('../src/types.d.ts').Grammar} Grammar\n * @typedef {import('./helper/util.js').LiteralAST} LiteralAST\n * @typedef {import('./helper/util.js').PathItem} PathItem\n */\n\n/**\n * @typedef {object} ForEachCapturingGroupCallbackValue\n * @property {CapturingGroup} group\n * @property {number} number - Note: Starts at 1.\n */\n\n/**\n * @typedef {object} ForEachPatternCallbackValue\n * @property {RegExp} pattern\n * @property {LiteralAST} ast\n * @property {string} tokenPath\n * @property {string} name\n * @property {any} parent\n * @property {boolean} lookbehind\n * @property {CapturingGroup | undefined} lookbehindGroup\n * @property {PathItem[]} path\n * @property {(message: string) => void} reportError\n */\n"
  },
  {
    "path": "tests/plugins/autolinker/__snapshots__/basic-functionality.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Autolinker In CSS code 1`] = `\n\"<span class=\\\\\"token atrule\\\\\"><span class=\\\\\"token rule\\\\\">@font-face</span></span>\n<span class=\\\\\"token punctuation\\\\\">{</span>\n<span class=\\\\\"token property\\\\\">src</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n<span class=\\\\\"token url\\\\\">\n\t<span class=\\\\\"token function\\\\\">url</span>\n\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\t<a class=\\\\\"token url-link\\\\\" href=\\\\\"http://lea.verou.me/logo.otf\\\\\">http://lea.verou.me/logo.otf</a>\n\t<span class=\\\\\"token punctuation\\\\\">)</span>\n</span>\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token property\\\\\">font-family</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n<span class=\\\\\"token string\\\\\">'LeaVerou'</span>\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token punctuation\\\\\">}</span>\n\"\n`;\n\nexports[`Autolinker In HTML code 1`] = `\n\"<span class=\\\\\"token comment\\\\\">\n\t&lt;!-- Links in HTML, woo! Lea Verou\n\t<a class=\\\\\"token url-link\\\\\" href=\\\\\"http://lea.verou.me\\\\\">http://lea.verou.me</a>\n\tor, with Markdown, [Lea Verou](\n\t<a class=\\\\\"token url-link\\\\\" href=\\\\\"http://lea.verou.me\\\\\">http://lea.verou.me</a>\n\t) --&gt;\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<span class=\\\\\"token tag\\\\\">img</span>\n\t<span class=\\\\\"token attr-name\\\\\">src</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t<a class=\\\\\"token url-link\\\\\" href=\\\\\"https://prismjs.com/assets/img/spectrum.png\\\\\">\n\t\t\thttps://prismjs.com/assets/img/spectrum.png\n\t\t</a>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token attr-name\\\\\">alt</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\tIn attributes too!\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">/&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<span class=\\\\\"token tag\\\\\">p</span>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\nAutolinking in raw text:\n<a class=\\\\\"token url-link\\\\\" href=\\\\\"http://prismjs.com\\\\\">http://prismjs.com</a>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;/</span>\n\t<span class=\\\\\"token tag\\\\\">p</span>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n\"\n`;\n\nexports[`Autolinker In JS code 1`] = `\n\"<span class=\\\\\"token doc-comment\\\\\">\n\t/** * Prism: Lightweight, robust, elegant syntax highlighting * MIT license\n\t<a class=\\\\\"token url-link\\\\\" href=\\\\\"http://www.opensource.org/licenses/mit-license.php/\\\\\">\n\t\thttp://www.opensource.org/licenses/mit-license.php/\n\t</a>\n\t* @author Lea Verou\n\t<a class=\\\\\"token url-link\\\\\" href=\\\\\"http://lea.verou.me\\\\\">http://lea.verou.me</a>\n\t* Reach Lea at\n\t<a class=\\\\\"token email-link\\\\\" href=\\\\\"mailto:fake@email.com\\\\\">fake@email.com</a>\n\t(no, not really) * And this is [a Markdown link](\n\t<a class=\\\\\"token url-link\\\\\" href=\\\\\"http://prismjs.com\\\\\">http://prismjs.com</a>\n\t). Sweet, huh? */\n</span>\n<span class=\\\\\"token keyword\\\\\">var</span>\nfoo\n<span class=\\\\\"token operator\\\\\">=</span>\n<span class=\\\\\"token number\\\\\">5</span>\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token comment\\\\\">\n\t// And a single line comment\n\t<a class=\\\\\"token url-link\\\\\" href=\\\\\"http://google.com\\\\\">http://google.com</a>\n</span>\n\"\n`;\n"
  },
  {
    "path": "tests/plugins/autolinker/basic-functionality.js",
    "content": "import { createTestSuite } from '../../helper/prism-dom-util.js';\n\ndescribe('Autolinker', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: ['javascript', 'markup', 'css'],\n\t\tplugins: 'autolinker',\n\t});\n\n\tit('In JS code', ({ util }) => {\n\t\tutil.assert.highlightElement({\n\t\t\tlanguage: 'javascript',\n\t\t\tcode: String.raw`\n/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n * MIT license http://www.opensource.org/licenses/mit-license.php/\n * @author Lea Verou http://lea.verou.me\n * Reach Lea at fake@email.com (no, not really)\n * And this is [a Markdown link](http://prismjs.com). Sweet, huh?\n */\nvar foo = 5;\n// And a single line comment http://google.com\n`,\n\t\t});\n\t});\n\tit('In CSS code', ({ util }) => {\n\t\tutil.assert.highlightElement({\n\t\t\tlanguage: 'css',\n\t\t\tcode: String.raw`\n@font-face {\n\tsrc: url(http://lea.verou.me/logo.otf);\n\tfont-family: 'LeaVerou';\n}\n`,\n\t\t});\n\t});\n\tit('In HTML code', ({ util }) => {\n\t\tutil.assert.highlightElement({\n\t\t\tlanguage: 'html',\n\t\t\tcode: String.raw`\n<!-- Links in HTML, woo!\nLea Verou http://lea.verou.me or, with Markdown, [Lea Verou](http://lea.verou.me) -->\n<img src=\"https://prismjs.com/assets/img/spectrum.png\" alt=\"In attributes too!\" />\n<p>Autolinking in raw text: http://prismjs.com</p>\n`,\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/plugins/copy-to-clipboard/basic-functionality.js",
    "content": "import { assert } from 'chai';\nimport { createTestSuite } from '../../helper/prism-dom-util.js';\n\nclass DummyClipboard {\n\ttext = '';\n\treadText () {\n\t\treturn Promise.resolve(this.text);\n\t}\n\t/**\n\t * @param {string} data\n\t * @returns {Promise<void>}\n\t */\n\twriteText (data) {\n\t\tthis.text = data;\n\t\treturn Promise.resolve();\n\t}\n\n\t/**\n\t *\n\t * @param {Navigator} navigator\n\t */\n\tassign (navigator) {\n\t\t/** @type {any} */ (navigator).clipboard = this;\n\t}\n}\n\ndescribe('Copy to Clipboard', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: 'javascript',\n\t\tplugins: 'copy-to-clipboard',\n\t});\n\n\tit('should work', ({ Prism, window, document }) => {\n\t\tconst clipboard = new DummyClipboard();\n\t\tclipboard.assign(window.navigator);\n\n\t\tdocument.body.innerHTML = `<pre class=\"language-none\"><code>foo</code></pre>`;\n\t\tPrism.highlightAll();\n\n\t\tconst button = document.querySelector('button');\n\t\tif (!button) {\n\t\t\tassert.fail('Expected button to be non-null');\n\t\t}\n\n\t\tbutton.click();\n\n\t\tassert.strictEqual(clipboard.text, 'foo');\n\t});\n\n\tit('should copy the current text even after the code block changes its text', ({\n\t\tPrism,\n\t\twindow,\n\t\tdocument,\n\t}) => {\n\t\tconst clipboard = new DummyClipboard();\n\t\tclipboard.assign(window.navigator);\n\n\t\tdocument.body.innerHTML = `<pre class=\"language-none\"><code>foo</code></pre>`;\n\t\tPrism.highlightAll();\n\n\t\tconst button = document.querySelector('button');\n\t\tif (!button) {\n\t\t\tassert.fail('Expected button to be non-null');\n\t\t}\n\n\t\tbutton.click();\n\n\t\tassert.strictEqual(clipboard.text, 'foo');\n\n\t\t// change text\n\t\tdocument.querySelector('code').textContent = 'bar';\n\t\t// and click\n\t\tbutton.click();\n\n\t\tassert.strictEqual(clipboard.text, 'bar');\n\n\t\t// change text\n\t\tdocument.querySelector('code').textContent = 'baz';\n\t\tPrism.highlightAll();\n\t\t// and click\n\t\tbutton.click();\n\n\t\tassert.strictEqual(clipboard.text, 'baz');\n\t});\n});\n"
  },
  {
    "path": "tests/plugins/custom-class/__snapshots__/basic-functionality.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Custom class should map class names using a function 1`] = `\n\"<span class=\\\\\"token-suffix keyword-suffix\\\\\">var</span>\na\n<span class=\\\\\"token-suffix operator-suffix\\\\\">=</span>\n<span class=\\\\\"token-suffix boolean-suffix\\\\\">true</span>\n<span class=\\\\\"token-suffix punctuation-suffix\\\\\">;</span>\n\"\n`;\n\nexports[`Custom class should map class names using an object 1`] = `\n\"<span class=\\\\\"token kw\\\\\">var</span>\na\n<span class=\\\\\"token op\\\\\">=</span>\n<span class=\\\\\"token b\\\\\">true</span>\n<span class=\\\\\"token p\\\\\">;</span>\n\"\n`;\n\nexports[`Custom class should reset map 1`] = `\n\"<span class=\\\\\"token keyword\\\\\">var</span>\na\n<span class=\\\\\"token operator\\\\\">=</span>\n<span class=\\\\\"token boolean\\\\\">true</span>\n<span class=\\\\\"token punctuation\\\\\">;</span>\n\"\n`;\n\nexports[`Custom class should reset prefix 1`] = `\n\"<span class=\\\\\"token keyword\\\\\">var</span>\na\n<span class=\\\\\"token operator\\\\\">=</span>\n<span class=\\\\\"token boolean\\\\\">true</span>\n<span class=\\\\\"token punctuation\\\\\">;</span>\n\"\n`;\n\nexports[`Custom class should set prefix 1`] = `\n\"<span class=\\\\\"prism-token prism-keyword\\\\\">var</span>\na\n<span class=\\\\\"prism-token prism-operator\\\\\">=</span>\n<span class=\\\\\"prism-token prism-boolean\\\\\">true</span>\n<span class=\\\\\"prism-token prism-punctuation\\\\\">;</span>\n\"\n`;\n"
  },
  {
    "path": "tests/plugins/custom-class/basic-functionality.js",
    "content": "import { createTestSuite } from '../../helper/prism-dom-util.js';\n\ndescribe('Custom class', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: 'javascript',\n\t\tplugins: 'custom-class',\n\t});\n\n\tit('should set prefix', ({ Prism, util }) => {\n\t\t/** @type {CustomClass} */\n\t\tconst customClass = Prism.pluginRegistry.peek('custom-class')?.plugin;\n\t\tcustomClass.prefix = 'prism-';\n\n\t\tutil.assert.highlight({\n\t\t\tlanguage: 'javascript',\n\t\t\tcode: `var a = true;`,\n\t\t});\n\t});\n\n\tit('should reset prefix', ({ Prism, util }) => {\n\t\t/** @type {CustomClass} */\n\t\tconst customClass = Prism.pluginRegistry.peek('custom-class')?.plugin;\n\t\tcustomClass.prefix = '';\n\n\t\tutil.assert.highlight({\n\t\t\tlanguage: 'javascript',\n\t\t\tcode: `var a = true;`,\n\t\t});\n\t});\n\n\tit('should map class names using a function', ({ Prism, util }) => {\n\t\t/** @type {CustomClass} */\n\t\tconst customClass = Prism.pluginRegistry.peek('custom-class')?.plugin;\n\t\tcustomClass.map(cls => {\n\t\t\treturn `${cls}-suffix`;\n\t\t});\n\n\t\tutil.assert.highlight({\n\t\t\tlanguage: 'javascript',\n\t\t\tcode: `var a = true;`,\n\t\t});\n\t});\n\n\tit('should map class names using an object', ({ Prism, util }) => {\n\t\t/** @type {CustomClass} */\n\t\tconst customClass = Prism.pluginRegistry.peek('custom-class')?.plugin;\n\t\tcustomClass.map({\n\t\t\tboolean: 'b',\n\t\t\tkeyword: 'kw',\n\t\t\toperator: 'op',\n\t\t\tpunctuation: 'p',\n\t\t});\n\n\t\tutil.assert.highlight({\n\t\t\tlanguage: 'javascript',\n\t\t\tcode: `var a = true;`,\n\t\t});\n\t});\n\n\tit('should reset map', ({ Prism, util }) => {\n\t\t/** @type {CustomClass} */\n\t\tconst customClass = Prism.pluginRegistry.peek('custom-class')?.plugin;\n\t\tcustomClass.map({});\n\n\t\tutil.assert.highlight({\n\t\t\tlanguage: 'javascript',\n\t\t\tcode: `var a = true;`,\n\t\t});\n\t});\n});\n\n/**\n * @typedef {import('../../../src/plugins/custom-class/custom-class.js').CustomClass} CustomClass\n */\n"
  },
  {
    "path": "tests/plugins/data-uri-highlight/__snapshots__/basic-functionality.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Data-URI Highlight should set prefix 1`] = `\n\"<span class=\\\\\"token selector\\\\\">div</span>\n<span class=\\\\\"token punctuation\\\\\">{</span>\n<span class=\\\\\"token property\\\\\">border</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n40px solid transparent\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token property\\\\\">border-image</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n33.334%\n<span class=\\\\\"token url\\\\\">\n\t<span class=\\\\\"token function\\\\\">url</span>\n\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\t<span class=\\\\\"token string url\\\\\">\n\t\t'\n\t\t<span class=\\\\\"token data-uri\\\\\">\n\t\t\tdata:image/svg+xml,\n\t\t\t<span class=\\\\\"token language-markup\\\\\">\n\t\t\t\t<span class=\\\\\"token tag\\\\\">\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t\t\t\t\t<span class=\\\\\"token tag\\\\\">svg</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">xmlns</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\thttp://www.w3.org/2000/svg\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">width</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t30\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">height</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t30\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">></span>\n\t\t\t\t</span>\n\t\t\t\t\\\\\\\\\n\t\t\t\t<span class=\\\\\"token tag\\\\\">\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t\t\t\t\t<span class=\\\\\"token tag\\\\\">circle</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cx</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cy</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">r</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">fill</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t%23ab4\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">/></span>\n\t\t\t\t</span>\n\t\t\t\t<span class=\\\\\"token tag\\\\\">\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t\t\t\t\t<span class=\\\\\"token tag\\\\\">circle</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cx</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t15\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cy</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">r</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">fill</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t%23655\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">/></span>\n\t\t\t\t</span>\n\t\t\t\t\\\\\\\\\n\t\t\t\t<span class=\\\\\"token tag\\\\\">\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t\t\t\t\t<span class=\\\\\"token tag\\\\\">circle</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cx</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t25\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cy</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">r</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">fill</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t%23e07\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">/></span>\n\t\t\t\t</span>\n\t\t\t\t<span class=\\\\\"token tag\\\\\">\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t\t\t\t\t<span class=\\\\\"token tag\\\\\">circle</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cx</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cy</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t15\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">r</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">fill</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t%23655\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">/></span>\n\t\t\t\t</span>\n\t\t\t\t\\\\\\\\\n\t\t\t\t<span class=\\\\\"token tag\\\\\">\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t\t\t\t\t<span class=\\\\\"token tag\\\\\">circle</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cx</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t15\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cy</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t15\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">r</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">fill</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\thsl(15, 25%, 75%)\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">/></span>\n\t\t\t\t</span>\n\t\t\t\t\\\\\\\\\n\t\t\t\t<span class=\\\\\"token tag\\\\\">\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t\t\t\t\t<span class=\\\\\"token tag\\\\\">circle</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cx</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t25\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cy</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t15\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">r</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">fill</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t%23655\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">/></span>\n\t\t\t\t</span>\n\t\t\t\t<span class=\\\\\"token tag\\\\\">\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t\t\t\t\t<span class=\\\\\"token tag\\\\\">circle</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cx</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cy</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t25\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">r</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">fill</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t%23fb3\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">/></span>\n\t\t\t\t</span>\n\t\t\t\t\\\\\\\\\n\t\t\t\t<span class=\\\\\"token tag\\\\\">\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t\t\t\t\t<span class=\\\\\"token tag\\\\\">circle</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cx</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t15\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cy</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t25\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">r</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">fill</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t%23655\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">/></span>\n\t\t\t\t</span>\n\t\t\t\t<span class=\\\\\"token tag\\\\\">\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t\t\t\t\t<span class=\\\\\"token tag\\\\\">circle</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cx</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t25\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">cy</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t25\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">r</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t5\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token attr-name\\\\\">fill</span>\n\t\t\t\t\t<span class=\\\\\"token attr-value\\\\\">\n\t\t\t\t\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t\t%2358a\n\t\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">/></span>\n\t\t\t\t</span>\n\t\t\t\t<span class=\\\\\"token tag\\\\\">\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">&lt;/</span>\n\t\t\t\t\t<span class=\\\\\"token tag\\\\\">svg</span>\n\t\t\t\t\t<span class=\\\\\"token punctuation\\\\\">></span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t</span>\n\t\t'\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">)</span>\n</span>\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token property\\\\\">padding</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n1em\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token property\\\\\">max-width</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n20em\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token property\\\\\">font</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n130%/1.6 Baskerville\n<span class=\\\\\"token punctuation\\\\\">,</span>\nPalatino\n<span class=\\\\\"token punctuation\\\\\">,</span>\nserif\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token punctuation\\\\\">}</span>\n\"\n`;\n"
  },
  {
    "path": "tests/plugins/data-uri-highlight/basic-functionality.js",
    "content": "import { createTestSuite } from '../../helper/prism-dom-util.js';\n\ndescribe('Data-URI Highlight', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: ['css', 'markup'],\n\t\tplugins: 'data-uri-highlight',\n\t});\n\n\tit('should set prefix', ({ util }) => {\n\t\tutil.assert.highlight({\n\t\t\tlanguage: 'css',\n\t\t\tcode: String.raw`\ndiv {\n    border: 40px solid transparent;\n    border-image: 33.334% url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\"> \\\n                          <circle cx=\"5\" cy=\"5\" r=\"5\" fill=\"%23ab4\"/><circle cx=\"15\" cy=\"5\" r=\"5\" fill=\"%23655\"/> \\\n                          <circle cx=\"25\" cy=\"5\" r=\"5\" fill=\"%23e07\"/><circle cx=\"5\" cy=\"15\" r=\"5\" fill=\"%23655\"/> \\\n                          <circle cx=\"15\" cy=\"15\" r=\"5\" fill=\"hsl(15, 25%, 75%)\"/> \\\n                          <circle cx=\"25\" cy=\"15\" r=\"5\" fill=\"%23655\"/><circle cx=\"5\" cy=\"25\" r=\"5\" fill=\"%23fb3\"/> \\\n                          <circle cx=\"15\" cy=\"25\" r=\"5\" fill=\"%23655\"/><circle cx=\"25\" cy=\"25\" r=\"5\" fill=\"%2358a\"/></svg>');\n    padding: 1em;\n    max-width: 20em;\n    font: 130%/1.6 Baskerville, Palatino, serif;\n}\n`,\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/plugins/diff-highlight/__snapshots__/basic-functionality.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Diff Highlight should work with aliases 1`] = `\n\"<span class=\\\\\"token coord\\\\\">@@ -4,6 +4,5 @@</span>\n<span class=\\\\\"token deleted-sign deleted\\\\\">\n\t<span class=\\\\\"token prefix deleted\\\\\">-</span>\n\t<span class=\\\\\"token keyword\\\\\">let</span>\n\tfoo\n\t<span class=\\\\\"token operator\\\\\">=</span>\n\tbar\n\t<span class=\\\\\"token punctuation\\\\\">.</span>\n\t<span class=\\\\\"token function\\\\\">baz</span>\n\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\t<span class=\\\\\"token punctuation\\\\\">[</span>\n\t<span class=\\\\\"token number\\\\\">1</span>\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\t<span class=\\\\\"token number\\\\\">2</span>\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\t<span class=\\\\\"token number\\\\\">3</span>\n\t<span class=\\\\\"token punctuation\\\\\">]</span>\n\t<span class=\\\\\"token punctuation\\\\\">)</span>\n\t<span class=\\\\\"token punctuation\\\\\">;</span>\n\t<span class=\\\\\"token prefix deleted\\\\\">-</span>\n\tfoo\n\t<span class=\\\\\"token operator\\\\\">=</span>\n\tfoo\n\t<span class=\\\\\"token operator\\\\\">+</span>\n\t<span class=\\\\\"token number\\\\\">1</span>\n\t<span class=\\\\\"token punctuation\\\\\">;</span>\n</span>\n<span class=\\\\\"token inserted-sign inserted\\\\\">\n\t<span class=\\\\\"token prefix inserted\\\\\">+</span>\n\t<span class=\\\\\"token keyword\\\\\">const</span>\n\tfoo\n\t<span class=\\\\\"token operator\\\\\">=</span>\n\tbar\n\t<span class=\\\\\"token punctuation\\\\\">.</span>\n\t<span class=\\\\\"token function\\\\\">baz</span>\n\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\t<span class=\\\\\"token punctuation\\\\\">[</span>\n\t<span class=\\\\\"token number\\\\\">1</span>\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\t<span class=\\\\\"token number\\\\\">2</span>\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\t<span class=\\\\\"token number\\\\\">3</span>\n\t<span class=\\\\\"token punctuation\\\\\">]</span>\n\t<span class=\\\\\"token punctuation\\\\\">)</span>\n\t<span class=\\\\\"token operator\\\\\">+</span>\n\t<span class=\\\\\"token number\\\\\">1</span>\n\t<span class=\\\\\"token punctuation\\\\\">;</span>\n</span>\n<span class=\\\\\"token unchanged\\\\\">\n\t<span class=\\\\\"token prefix unchanged\\\\\"></span>\n\tconsole\n\t<span class=\\\\\"token punctuation\\\\\">.</span>\n\t<span class=\\\\\"token function\\\\\">log</span>\n\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\t<span class=\\\\\"token template-string\\\\\">\n\t\t<span class=\\\\\"token template-punctuation string\\\\\">\\`</span>\n\t\t<span class=\\\\\"token string\\\\\">foo:</span>\n\t\t<span class=\\\\\"token interpolation\\\\\">\n\t\t\t<span class=\\\\\"token interpolation-punctuation punctuation\\\\\">\\${</span>\n\t\t\tfoo\n\t\t\t<span class=\\\\\"token interpolation-punctuation punctuation\\\\\">}</span>\n\t\t</span>\n\t\t<span class=\\\\\"token template-punctuation string\\\\\">\\`</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">)</span>\n\t<span class=\\\\\"token punctuation\\\\\">;</span>\n</span>\n\"\n`;\n\nexports[`Diff Highlight should work with language-diff 1`] = `\n\"<span class=\\\\\"token coord\\\\\">@@ -4,6 +4,5 @@</span>\n<span class=\\\\\"token deleted-sign deleted\\\\\">\n\t<span class=\\\\\"token prefix deleted\\\\\">-</span>\n\tlet foo = bar.baz([1, 2, 3]);\n\t<span class=\\\\\"token prefix deleted\\\\\">-</span>\n\tfoo = foo + 1;\n</span>\n<span class=\\\\\"token inserted-sign inserted\\\\\">\n\t<span class=\\\\\"token prefix inserted\\\\\">+</span>\n\tconst foo = bar.baz([1, 2, 3]) + 1;\n</span>\n<span class=\\\\\"token unchanged\\\\\">\n\t<span class=\\\\\"token prefix unchanged\\\\\"></span>\n\tconsole.log(\\`foo: \\${foo}\\`);\n</span>\n\"\n`;\n\nexports[`Diff Highlight should work with language-diff-javascript 1`] = `\n\"<span class=\\\\\"token coord\\\\\">@@ -4,6 +4,5 @@</span>\n<span class=\\\\\"token deleted-sign deleted\\\\\">\n\t<span class=\\\\\"token prefix deleted\\\\\">-</span>\n\t<span class=\\\\\"token keyword\\\\\">let</span>\n\tfoo\n\t<span class=\\\\\"token operator\\\\\">=</span>\n\tbar\n\t<span class=\\\\\"token punctuation\\\\\">.</span>\n\t<span class=\\\\\"token function\\\\\">baz</span>\n\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\t<span class=\\\\\"token punctuation\\\\\">[</span>\n\t<span class=\\\\\"token number\\\\\">1</span>\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\t<span class=\\\\\"token number\\\\\">2</span>\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\t<span class=\\\\\"token number\\\\\">3</span>\n\t<span class=\\\\\"token punctuation\\\\\">]</span>\n\t<span class=\\\\\"token punctuation\\\\\">)</span>\n\t<span class=\\\\\"token punctuation\\\\\">;</span>\n\t<span class=\\\\\"token prefix deleted\\\\\">-</span>\n\tfoo\n\t<span class=\\\\\"token operator\\\\\">=</span>\n\tfoo\n\t<span class=\\\\\"token operator\\\\\">+</span>\n\t<span class=\\\\\"token number\\\\\">1</span>\n\t<span class=\\\\\"token punctuation\\\\\">;</span>\n</span>\n<span class=\\\\\"token inserted-sign inserted\\\\\">\n\t<span class=\\\\\"token prefix inserted\\\\\">+</span>\n\t<span class=\\\\\"token keyword\\\\\">const</span>\n\tfoo\n\t<span class=\\\\\"token operator\\\\\">=</span>\n\tbar\n\t<span class=\\\\\"token punctuation\\\\\">.</span>\n\t<span class=\\\\\"token function\\\\\">baz</span>\n\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\t<span class=\\\\\"token punctuation\\\\\">[</span>\n\t<span class=\\\\\"token number\\\\\">1</span>\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\t<span class=\\\\\"token number\\\\\">2</span>\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\t<span class=\\\\\"token number\\\\\">3</span>\n\t<span class=\\\\\"token punctuation\\\\\">]</span>\n\t<span class=\\\\\"token punctuation\\\\\">)</span>\n\t<span class=\\\\\"token operator\\\\\">+</span>\n\t<span class=\\\\\"token number\\\\\">1</span>\n\t<span class=\\\\\"token punctuation\\\\\">;</span>\n</span>\n<span class=\\\\\"token unchanged\\\\\">\n\t<span class=\\\\\"token prefix unchanged\\\\\"></span>\n\tconsole\n\t<span class=\\\\\"token punctuation\\\\\">.</span>\n\t<span class=\\\\\"token function\\\\\">log</span>\n\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\t<span class=\\\\\"token template-string\\\\\">\n\t\t<span class=\\\\\"token template-punctuation string\\\\\">\\`</span>\n\t\t<span class=\\\\\"token string\\\\\">foo:</span>\n\t\t<span class=\\\\\"token interpolation\\\\\">\n\t\t\t<span class=\\\\\"token interpolation-punctuation punctuation\\\\\">\\${</span>\n\t\t\tfoo\n\t\t\t<span class=\\\\\"token interpolation-punctuation punctuation\\\\\">}</span>\n\t\t</span>\n\t\t<span class=\\\\\"token template-punctuation string\\\\\">\\`</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">)</span>\n\t<span class=\\\\\"token punctuation\\\\\">;</span>\n</span>\n\"\n`;\n"
  },
  {
    "path": "tests/plugins/diff-highlight/basic-functionality.js",
    "content": "import { createTestSuite } from '../../helper/prism-dom-util.js';\n\nconst jsCode = `\n@@ -4,6 +4,5 @@\n-    let foo = bar.baz([1, 2, 3]);\n-    foo = foo + 1;\n+    const foo = bar.baz([1, 2, 3]) + 1;\n     console.log(\\`foo: \\${foo}\\`);\n`.trim();\n\ndescribe('Diff Highlight', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: ['javascript'],\n\t\tplugins: 'diff-highlight',\n\t});\n\n\tit('should work with language-diff', ({ util }) => {\n\t\tutil.assert.highlight({\n\t\t\tlanguage: 'diff',\n\t\t\tcode: jsCode,\n\t\t});\n\t});\n\n\tit('should work with language-diff-javascript', ({ util }) => {\n\t\tutil.assert.highlight({\n\t\t\tlanguage: 'diff-javascript',\n\t\t\tcode: jsCode,\n\t\t});\n\t});\n\n\tit('should work with aliases', ({ util }) => {\n\t\tutil.assert.highlight({\n\t\t\tlanguage: 'diff-js',\n\t\t\tcode: jsCode,\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/plugins/highlight-keywords/__snapshots__/basic-functionality.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Highlight Keywords should highlight keywords 1`] = `\n\"<span class=\\\\\"token keyword module keyword-import\\\\\">import</span>\n<span class=\\\\\"token operator\\\\\">*</span>\n<span class=\\\\\"token keyword module keyword-from\\\\\">from</span>\n<span class=\\\\\"token string\\\\\">''</span>\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token keyword keyword-const\\\\\">const</span>\nfoo\n<span class=\\\\\"token punctuation\\\\\">;</span>\n\"\n`;\n"
  },
  {
    "path": "tests/plugins/highlight-keywords/basic-functionality.js",
    "content": "import { createTestSuite } from '../../helper/prism-dom-util.js';\n\ndescribe('Highlight Keywords', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: 'javascript',\n\t\tplugins: 'highlight-keywords',\n\t});\n\n\tit('should highlight keywords', ({ util }) => {\n\t\tutil.assert.highlightElement({\n\t\t\tlanguage: 'javascript',\n\t\t\tcode: `import * from ''; const foo;`,\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/plugins/keep-markup/test.js",
    "content": "import { assert } from 'chai';\nimport { createTestSuite } from '../../helper/prism-dom-util.js';\n\ndescribe('Keep Markup', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: 'javascript',\n\t\tplugins: 'keep-markup',\n\t});\n\n\t/**\n\t *\n\t * @param {PrismDOM<{}>} dom\n\t * @param {string} html\n\t * @param {string} [language='none']\n\t * @returns {string}\n\t */\n\tfunction highlightInElement ({ Prism, document }, html, language = 'none') {\n\t\tconst pre = document.createElement('pre');\n\t\tpre.className = `language-${language}`;\n\t\tpre.innerHTML = `<code>${html}</code>`;\n\t\tconst code = pre.children[0];\n\n\t\tPrism.highlightElement(code);\n\n\t\treturn code.innerHTML;\n\t}\n\n\t/**\n\t *\n\t * @param {PrismDOM<{}>} dom\n\t * @param {string} html\n\t * @param {string} [language='none']\n\t */\n\tfunction keepMarkup (dom, html, language = 'none') {\n\t\tassert.equal(highlightInElement(dom, html, language), html);\n\t}\n\n\tit('should keep <span> markup', dom => {\n\t\tkeepMarkup(dom, `x<span>a</span>y`);\n\t});\n\tit('should preserve markup order', dom => {\n\t\tkeepMarkup(dom, `x<a></a><b></b>y`);\n\t});\n\n\tit('should keep last markup', dom => {\n\t\tkeepMarkup(dom, `xy<span>a</span>`);\n\t\tkeepMarkup(dom, `xy<a>a</a>`);\n\t});\n\n\tit('should support double highlighting', ({ Prism, document }) => {\n\t\tconst pre = document.createElement('pre');\n\t\tpre.className = 'language-javascript drop-tokens';\n\t\tpre.innerHTML = '<code>var <mark>a = 42</mark>;</code>';\n\t\tconst code = pre.children[0];\n\t\tconst initial = code.innerHTML;\n\n\t\tPrism.highlightElement(code);\n\t\tconst firstPass = code.innerHTML;\n\n\t\tPrism.highlightElement(code);\n\t\tconst secondPass = code.innerHTML;\n\n\t\t// check that we actually did some highlighting\n\t\tassert.notStrictEqual(initial, firstPass);\n\t\t// check that the highlighting persists\n\t\tassert.strictEqual(firstPass, secondPass);\n\t});\n\n\tit('should not clone markup nodes', ({ Prism, document }) => {\n\t\tconst pre = document.createElement('pre');\n\t\tpre.className = 'language-javascript drop-tokens';\n\t\tpre.innerHTML = '<code>var <mark>a = <mark>42</mark></mark>;</code>';\n\t\tconst code = pre.children[0];\n\t\tconst firstNodeRefBefore = code.querySelector('mark');\n\t\tconst secondNodeRefBefore = firstNodeRefBefore?.querySelector('mark');\n\n\t\tPrism.highlightElement(code);\n\t\tconst firstNodeRefAfter = code.querySelector('mark');\n\t\tconst secondNodeRefAfter = firstNodeRefAfter?.querySelector('mark');\n\n\t\tassert.strictEqual(firstNodeRefBefore, firstNodeRefAfter);\n\t\tassert.strictEqual(secondNodeRefBefore, secondNodeRefAfter);\n\t});\n\n\t// The markup is removed if it's the last element and the element's name is a single letter: a(nchor), b(old), i(talic)...\n\t// https://github.com/PrismJS/prism/issues/1618\n\t/*\n\tit('should keep last single letter empty markup', function () {\n\t\tconst result = execute(`<code class=\"language-none\">xy<a></a></code>`)\n\t\texpect(result.start.length).to.equal(1)\n\t\texpect(result.end.length).to.equal(1)\n\t\texpect(result.nodes.length).to.equal(1)\n\t\texpect(result.nodes[0].nodeName).to.equal('A')\n\t})\n\t*/\n});\n\n/**\n * @template T\n * @typedef {import('../../types.d.ts').PrismDOM<T>} PrismDOM\n */\n"
  },
  {
    "path": "tests/plugins/line-highlight/__snapshots__/basic-functionality.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Line Highlight multiple ranges 1`] = `\n\"<pre data-line=\\\\\"1, 3-5, 8\\\\\" class=\\\\\"language-none\\\\\" tabindex=\\\\\"0\\\\\"><code class=\\\\\"language-none\\\\\">// foo\nvar foo = 0;\nvar bar = 1;\nvar baz = foo + bar;\nfunction add(a, b) {\n\treturn a + b;\n}\nconst sub = (a, b) =&gt; a - b;\n<div aria-hidden=\\\\\"true\\\\\" data-range=\\\\\"1\\\\\" class=\\\\\" line-highlight\\\\\" data-start=\\\\\"1\\\\\" style=\\\\\"width: 0px;\\\\\"> \n</div><div aria-hidden=\\\\\"true\\\\\" data-range=\\\\\"3-5\\\\\" class=\\\\\" line-highlight\\\\\" data-start=\\\\\"3\\\\\" data-end=\\\\\"5\\\\\" style=\\\\\"width: 0px;\\\\\"> \n \n \n</div><div aria-hidden=\\\\\"true\\\\\" data-range=\\\\\"8\\\\\" class=\\\\\" line-highlight\\\\\" data-start=\\\\\"8\\\\\" style=\\\\\"width: 0px;\\\\\"> \n</div></code></pre>\"\n`;\n\nexports[`Line Highlight offset 1`] = `\n\"<pre data-line=\\\\\"42\\\\\" data-line-offset=\\\\\"40\\\\\" class=\\\\\"language-none\\\\\" tabindex=\\\\\"0\\\\\"><code class=\\\\\"language-none\\\\\">// foo\nvar foo = 0;\nvar bar = 1;\nvar baz = foo + bar;\nfunction add(a, b) {\n\treturn a + b;\n}\nconst sub = (a, b) =&gt; a - b;\n<div aria-hidden=\\\\\"true\\\\\" data-range=\\\\\"42\\\\\" class=\\\\\" line-highlight\\\\\" data-start=\\\\\"42\\\\\" style=\\\\\"width: 0px;\\\\\"> \n</div></code></pre>\"\n`;\n\nexports[`Line Highlight offset 2`] = `\n\"<pre data-line=\\\\\"41, 43-45, 48\\\\\" data-line-offset=\\\\\"40\\\\\" class=\\\\\"language-none\\\\\" tabindex=\\\\\"0\\\\\"><code class=\\\\\"language-none\\\\\">// foo\nvar foo = 0;\nvar bar = 1;\nvar baz = foo + bar;\nfunction add(a, b) {\n\treturn a + b;\n}\nconst sub = (a, b) =&gt; a - b;\n<div aria-hidden=\\\\\"true\\\\\" data-range=\\\\\"41\\\\\" class=\\\\\" line-highlight\\\\\" data-start=\\\\\"41\\\\\" style=\\\\\"width: 0px;\\\\\"> \n</div><div aria-hidden=\\\\\"true\\\\\" data-range=\\\\\"43-45\\\\\" class=\\\\\" line-highlight\\\\\" data-start=\\\\\"43\\\\\" data-end=\\\\\"45\\\\\" style=\\\\\"width: 0px;\\\\\"> \n \n \n</div><div aria-hidden=\\\\\"true\\\\\" data-range=\\\\\"48\\\\\" class=\\\\\" line-highlight\\\\\" data-start=\\\\\"48\\\\\" style=\\\\\"width: 0px;\\\\\"> \n</div></code></pre>\"\n`;\n\nexports[`Line Highlight out of bounds ranges 1`] = `\n\"<pre data-line=\\\\\"400\\\\\" class=\\\\\"language-none\\\\\" tabindex=\\\\\"0\\\\\"><code class=\\\\\"language-none\\\\\">// foo\nvar foo = 0;\nvar bar = 1;\nvar baz = foo + bar;\nfunction add(a, b) {\n\treturn a + b;\n}\nconst sub = (a, b) =&gt; a - b;\n</code></pre>\"\n`;\n\nexports[`Line Highlight out of bounds ranges 2`] = `\n\"<pre data-line=\\\\\"4-400\\\\\" class=\\\\\"language-none\\\\\" tabindex=\\\\\"0\\\\\"><code class=\\\\\"language-none\\\\\">// foo\nvar foo = 0;\nvar bar = 1;\nvar baz = foo + bar;\nfunction add(a, b) {\n\treturn a + b;\n}\nconst sub = (a, b) =&gt; a - b;\n<div aria-hidden=\\\\\"true\\\\\" data-range=\\\\\"4-400\\\\\" class=\\\\\" line-highlight\\\\\" data-start=\\\\\"4\\\\\" data-end=\\\\\"8\\\\\" style=\\\\\"width: 0px;\\\\\"> \n \n \n \n \n</div></code></pre>\"\n`;\n\nexports[`Line Highlight single line 1`] = `\n\"<pre data-line=\\\\\"2\\\\\" class=\\\\\"language-none\\\\\" tabindex=\\\\\"0\\\\\"><code class=\\\\\"language-none\\\\\">// foo\nvar foo = 0;\nvar bar = 1;\nvar baz = foo + bar;\nfunction add(a, b) {\n\treturn a + b;\n}\nconst sub = (a, b) =&gt; a - b;\n<div aria-hidden=\\\\\"true\\\\\" data-range=\\\\\"2\\\\\" class=\\\\\" line-highlight\\\\\" data-start=\\\\\"2\\\\\" style=\\\\\"width: 0px;\\\\\"> \n</div></code></pre>\"\n`;\n\nexports[`Line Highlight single range 1`] = `\n\"<pre data-line=\\\\\"3-5\\\\\" class=\\\\\"language-none\\\\\" tabindex=\\\\\"0\\\\\"><code class=\\\\\"language-none\\\\\">// foo\nvar foo = 0;\nvar bar = 1;\nvar baz = foo + bar;\nfunction add(a, b) {\n\treturn a + b;\n}\nconst sub = (a, b) =&gt; a - b;\n<div aria-hidden=\\\\\"true\\\\\" data-range=\\\\\"3-5\\\\\" class=\\\\\" line-highlight\\\\\" data-start=\\\\\"3\\\\\" data-end=\\\\\"5\\\\\" style=\\\\\"width: 0px;\\\\\"> \n \n \n</div></code></pre>\"\n`;\n"
  },
  {
    "path": "tests/plugins/line-highlight/basic-functionality.js",
    "content": "import { createTestSuite } from '../../helper/prism-dom-util.js';\n\n// just a few lines of JS code, so we have something to highlight\nconst exampleCode = String.raw`// foo\nvar foo = 0;\nvar bar = 1;\nvar baz = foo + bar;\nfunction add(a, b) {\n\treturn a + b;\n}\nconst sub = (a, b) => a - b;\n`;\n\ndescribe('Line Highlight', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: 'javascript',\n\t\tplugins: 'line-highlight',\n\t});\n\n\tit('single line', ({ util }) => {\n\t\tutil.assert.highlightPreElement({\n\t\t\tlanguage: 'none',\n\t\t\tcode: exampleCode,\n\t\t\tattributes: { 'data-line': '2' },\n\t\t});\n\t});\n\n\tit('single range', ({ util }) => {\n\t\tutil.assert.highlightPreElement({\n\t\t\tlanguage: 'none',\n\t\t\tcode: exampleCode,\n\t\t\tattributes: { 'data-line': '3-5' },\n\t\t});\n\t});\n\n\tit('multiple ranges', ({ util }) => {\n\t\tutil.assert.highlightPreElement({\n\t\t\tlanguage: 'none',\n\t\t\tcode: exampleCode,\n\t\t\tattributes: { 'data-line': '1, 3-5, 8' },\n\t\t});\n\t});\n\n\t// Fixed by https://github.com/PrismJS/prism/pull/3518\n\tit('offset', ({ util }) => {\n\t\tutil.assert.highlightPreElement({\n\t\t\tlanguage: 'none',\n\t\t\tcode: exampleCode,\n\t\t\tattributes: { 'data-line': '42', 'data-line-offset': '40' },\n\t\t});\n\t\tutil.assert.highlightPreElement({\n\t\t\tlanguage: 'none',\n\t\t\tcode: exampleCode,\n\t\t\tattributes: { 'data-line': '41, 43-45, 48', 'data-line-offset': '40' },\n\t\t});\n\t});\n\n\tit('out of bounds ranges', ({ util }) => {\n\t\tutil.assert.highlightPreElement({\n\t\t\tlanguage: 'none',\n\t\t\tcode: exampleCode,\n\t\t\tattributes: { 'data-line': '400' },\n\t\t});\n\t\tutil.assert.highlightPreElement({\n\t\t\tlanguage: 'none',\n\t\t\tcode: exampleCode,\n\t\t\tattributes: { 'data-line': '4-400' },\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/plugins/show-invisibles/__snapshots__/basic-functionality.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Show Invisibles should show invisible characters 1`] = `\n\"<span class=\\\\\"token space\\\\\"> </span><span class=\\\\\"token space\\\\\"> </span><span class=\\\\\"token tab\\\\\">\t</span><span class=\\\\\"token lf\\\\\">\n</span><span class=\\\\\"token crlf\\\\\">\n</span><span class=\\\\\"token tab\\\\\">\t</span><span class=\\\\\"token tab\\\\\">\t</span>\"\n`;\n\nexports[`Show Invisibles should show invisible characters inside tokens 1`] = `\n\"<span class=\\\\\"token comment\\\\\">/*<span class=\\\\\"token space\\\\\"> </span><span class=\\\\\"token lf\\\\\">\n</span><span class=\\\\\"token space\\\\\"> </span>*/</span>\"\n`;\n"
  },
  {
    "path": "tests/plugins/show-invisibles/basic-functionality.js",
    "content": "import { createTestSuite } from '../../helper/prism-dom-util.js';\n\ndescribe('Show Invisibles', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: 'javascript',\n\t\tplugins: 'show-invisibles',\n\t});\n\n\tit('should show invisible characters', ({ util }) => {\n\t\tutil.assert.highlightElement({\n\t\t\tlanguage: 'javascript',\n\t\t\tcode: `  \\t\\n\\r\\n\\t\\t`,\n\t\t\tformat: false,\n\t\t});\n\t});\n\n\tit('should show invisible characters inside tokens', ({ util }) => {\n\t\tutil.assert.highlightElement({\n\t\t\tlanguage: 'javascript',\n\t\t\tcode: `/* \\n */`,\n\t\t\tformat: false,\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/plugins/show-language/basic-functionality.js",
    "content": "import { assert } from 'chai';\nimport { knownTitles } from '../../../src/shared/meta/title-data.js';\nimport { createTestSuite } from '../../helper/prism-dom-util.js';\n\ndescribe('Show language', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: ['markup', 'javascript'],\n\t\tplugins: 'show-language',\n\t});\n\n\tconst titles = knownTitles;\n\ttitles['js'] = 'JavaScript';\n\ttitles['html'] = 'HTML';\n\ttitles['svg'] = 'SVG';\n\n\t/**\n\t *\n\t * @param {import('../../types.d.ts').PrismDOM<{}>} dom\n\t * @param {string} expectedLanguage\n\t * @param {string} code\n\t */\n\tfunction test ({ document, Prism }, expectedLanguage, code) {\n\t\tdocument.body.innerHTML = code;\n\t\tPrism.highlightAll();\n\n\t\tassert.strictEqual(\n\t\t\tdocument.querySelector('.toolbar-item > span')?.textContent,\n\t\t\texpectedLanguage\n\t\t);\n\t}\n\n\tit('should work with component titles', dom => {\n\t\t// simple title\n\t\ttest(dom, 'JavaScript', `<pre class=\"language-javascript\"><code>foo</code></pre>`);\n\t\ttest(dom, 'Markup', `<pre class=\"language-markup\"><code>foo</code></pre>`);\n\n\t\t// aliases with the same title\n\t\ttest(dom, 'JavaScript', `<pre class=\"language-js\"><code>foo</code></pre>`);\n\n\t\t// aliases with a different title\n\t\ttest(dom, 'HTML', `<pre class=\"language-html\"><code>foo</code></pre>`);\n\t\ttest(dom, 'SVG', `<pre class=\"language-svg\"><code>foo</code></pre>`);\n\t});\n\n\tit('should work with custom titles', dom => {\n\t\ttest(\n\t\t\tdom,\n\t\t\t'Foo',\n\t\t\t`<pre class=\"language-javascript\" data-language=\"Foo\"><code>foo</code></pre>`\n\t\t);\n\t});\n});\n"
  },
  {
    "path": "tests/plugins/unescaped-markup/basic-functionality.js",
    "content": "import { assert } from 'chai';\nimport { createTestSuite } from '../../helper/prism-dom-util.js';\n\ndescribe('Show language', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: 'markup',\n\t\tplugins: 'unescaped-markup',\n\t});\n\n\t/**\n\t *\n\t * @param {import('../../types.d.ts').PrismDOM<{}>} dom\n\t * @param {string} expectedText\n\t * @param {string} code\n\t */\n\tfunction test ({ Prism, document }, expectedText, code) {\n\t\tdocument.body.innerHTML = code;\n\t\tPrism.highlightAll();\n\n\t\tassert.strictEqual(document.querySelector('code')?.textContent, expectedText);\n\t}\n\n\tit('should work with comments', dom => {\n\t\ttest(\n\t\t\tdom,\n\t\t\t'\\n<p>Example</p>\\n',\n\t\t\t`<pre class=\"language-javascript\"><code><!--\n<p>Example</p>\n--></code></pre>`\n\t\t);\n\n\t\ttest(\n\t\t\tdom,\n\t\t\t'\\n<p>Example 2</p>\\n',\n\t\t\t`<pre><code class=\"language-javascript\"><!--\n<p>Example 2</p>\n--></code></pre>`\n\t\t);\n\t});\n\n\tit('should work with script tags', dom => {\n\t\ttest(\n\t\t\tdom,\n\t\t\t'<p>Example</p>',\n\t\t\t`<script class=\"language-javascript\" type=\"text/plain\"><p>Example</p></script>`\n\t\t);\n\n\t\t// inherit language\n\t\ttest(\n\t\t\tdom,\n\t\t\t'<p>Example 2</p>',\n\t\t\t`<div class=\"language-javascript\"><script type=\"text/plain\"><p>Example 2</p></script></div>`\n\t\t);\n\t});\n});\n"
  },
  {
    "path": "tests/plugins/wpd/__snapshots__/basic-functionality.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`WPD should work with CSS 1`] = `\n\"<span class=\\\\\"token atrule\\\\\">\n\t<a\n\t\tclass=\\\\\"token rule\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/css/atrules/import\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\t@import\n\t</a>\n\t<span class=\\\\\"token url\\\\\">\n\t\t<span class=\\\\\"token function\\\\\">url</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\t\thttps://fonts.googleapis.com/css?family=Questrial\n\t\t<span class=\\\\\"token punctuation\\\\\">)</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">;</span>\n</span>\n<span class=\\\\\"token atrule\\\\\">\n\t<a\n\t\tclass=\\\\\"token rule\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/css/atrules/import\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\t@import\n\t</a>\n\t<span class=\\\\\"token url\\\\\">\n\t\t<span class=\\\\\"token function\\\\\">url</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\t\thttps://fonts.googleapis.com/css?family=Arvo\n\t\t<span class=\\\\\"token punctuation\\\\\">)</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">;</span>\n</span>\n\n<span class=\\\\\"token atrule\\\\\">\n\t<a\n\t\tclass=\\\\\"token rule\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/css/atrules/font-face\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\t@font-face\n\t</a>\n</span>\n<span class=\\\\\"token punctuation\\\\\">{</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/src\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\tsrc\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n<span class=\\\\\"token url\\\\\">\n\t<span class=\\\\\"token function\\\\\">url</span>\n\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\thttps://lea.verou.me/logo.otf\n\t<span class=\\\\\"token punctuation\\\\\">)</span>\n</span>\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/font-family\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\tfont-family\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n<span class=\\\\\"token string\\\\\">'LeaVerou'</span>\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token punctuation\\\\\">}</span>\n\n<span class=\\\\\"token comment\\\\\">/* Shared styles */</span>\n\n<span class=\\\\\"token selector\\\\\">\n\tsection h1\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\t<span class=\\\\\"token id\\\\\">#features</span>\n\tli strong\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\theader h2\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\tfooter p\n</span>\n<span class=\\\\\"token punctuation\\\\\">{</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/font\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\tfont\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n100% Rockwell\n<span class=\\\\\"token punctuation\\\\\">,</span>\nArvo\n<span class=\\\\\"token punctuation\\\\\">,</span>\nserif\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token punctuation\\\\\">}</span>\n\n<span class=\\\\\"token selector\\\\\">\n\tcode\n\t<span class=\\\\\"token attribute\\\\\">\n\t\t<span class=\\\\\"token punctuation\\\\\">[</span>\n\t\t<span class=\\\\\"token attr-name\\\\\">class</span>\n\t\t<span class=\\\\\"token operator\\\\\">*=</span>\n\t\t<span class=\\\\\"token attr-value\\\\\">\\\\\"language-\\\\\"</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">]</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\tpre\n\t<span class=\\\\\"token attribute\\\\\">\n\t\t<span class=\\\\\"token punctuation\\\\\">[</span>\n\t\t<span class=\\\\\"token attr-name\\\\\">class</span>\n\t\t<span class=\\\\\"token operator\\\\\">*=</span>\n\t\t<span class=\\\\\"token attr-value\\\\\">\\\\\"language-\\\\\"</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">]</span>\n\t</span>\n</span>\n<span class=\\\\\"token punctuation\\\\\">{</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/color\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\tcolor\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\nblack\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/background\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\tbackground\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\nnone\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/text-shadow\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\ttext-shadow\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n0 1px white\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/font-family\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\tfont-family\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\nConsolas\n<span class=\\\\\"token punctuation\\\\\">,</span>\nMonaco\n<span class=\\\\\"token punctuation\\\\\">,</span>\n<span class=\\\\\"token string\\\\\">'Andale Mono'</span>\n<span class=\\\\\"token punctuation\\\\\">,</span>\n<span class=\\\\\"token string\\\\\">'Ubuntu Mono'</span>\n<span class=\\\\\"token punctuation\\\\\">,</span>\nmonospace\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/font-size\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\tfont-size\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n1em\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/text-align\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\ttext-align\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\nleft\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/white-space\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\twhite-space\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\npre\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/word-spacing\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\tword-spacing\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\nnormal\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/word-break\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\tword-break\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\nnormal\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/word-wrap\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\tword-wrap\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\nnormal\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/line-height\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\tline-height\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n1.5\n<span class=\\\\\"token punctuation\\\\\">;</span>\n\n<span class=\\\\\"token property\\\\\">-moz-tab-size</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n4\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token property\\\\\">-o-tab-size</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n4\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/tab-size\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\ttab-size\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\n4\n<span class=\\\\\"token punctuation\\\\\">;</span>\n\n<span class=\\\\\"token property\\\\\">-webkit-hyphens</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\nnone\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token property\\\\\">-moz-hyphens</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\nnone\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token property\\\\\">-ms-hyphens</span>\n<span class=\\\\\"token punctuation\\\\\">:</span>\nnone\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<a\n\tclass=\\\\\"token property\\\\\"\n\thref=\\\\\"https://webplatform.github.io/docs/css/properties/hyphens\\\\\"\n\ttarget=\\\\\"_blank\\\\\"\n>\n\thyphens\n</a>\n<span class=\\\\\"token punctuation\\\\\">:</span>\nnone\n<span class=\\\\\"token punctuation\\\\\">;</span>\n<span class=\\\\\"token punctuation\\\\\">}</span>\n\"\n`;\n\nexports[`WPD should work with SVG 1`] = `\n\"<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a class=\\\\\"token tag\\\\\" href=\\\\\"https://webplatform.github.io/docs/svg/elements/svg\\\\\" target=\\\\\"_blank\\\\\">\n\t\tsvg\n\t</a>\n\t<span class=\\\\\"token attr-name\\\\\">xmlns</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\thttp://www.w3.org/2000/svg\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token attr-name\\\\\">viewBox</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t0 0 200 170\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<span class=\\\\\"token tag\\\\\">path</span>\n\t<span class=\\\\\"token attr-name\\\\\">fill</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\t#fff\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token attr-name\\\\\">d</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\tM55.37 131.5H48.4v9.13h6.97c1.67 0 2.92-.4 3.78-1.22.85 -.8 1.28-1.92\n\t\t1.28-3.33s-.43-2.54-1.28-3.35c-.86-.8-2.12-1.2-3.78-1.2m29.52 6.4c.3-.53.47-1.2.47-2.04\n\t\t0-1.35-.45-2.4-1.37-3.2-.92-.76-2.14-1.15-3.65 -1.15H72.9v8.52h7.32c2.26 0 3.82-.7\n\t\t4.67-2.1M100 0L0 170h200L100 0M60.86 141.03c-1.3 1.22-3.1 1.84-5.33\n\t\t1.84H48.4v7.55H46v-21.2h9.53c2.24 0 4.02.63 5.34 1.87 1.3 1.23 1.96 2.88 1.96 4.95 0 2.1-.66\n\t\t3.75-1.97 4.98m24.5 9.4l -5.1-8.14h-7.37v8.12h-2.4v-21.2h10.14c2.15 0 3.88.6 5.18 1.8 1.3\n\t\t1.18 1.95 2.8 1.95 4.84 0 2.64-1.1 4.44-3.3 5.4-.6.28-1.22.5-1.82.6l5.57 8.56h-2.85m 13.43\n\t\t0h-2.4v-21.2h2.4v21.2m23.56-1.32c-1.48 1.05-3.53 1.57-6.16 1.57-2.96 0\n\t\t-5.23-.6-6.78-1.85-1.4-1.1-2.18-2.7-2.37-4.74h2.5c.08 1.45.78 2.56 2.1 3.33 1.16.67 2.68 1\n\t\t4.58 1 3.97 0 5.95-1.25 5.95-3.74 0-.86-.35-1.53-1.07-2.02-.7\n\t\t-.5-1.6-.9-2.68-1.2-1.07-.33-2.24-.63-3.48-.9s-2.4-.65-3.5-1.08-1.97-1.02\n\t\t-2.68-1.73c-.7-.72-1.07-1.68-1.07-2.9 0-1.73.65-3.13 1.97-4.22 1.32-1.08 3.32-1.62 6-1.62\n\t\t2.67 0 4.75.6 6.23 1.85 1.34 1.1 2.05 2.5 2.14 4.2h-2.46c\n\t\t-.22-1.76-1.35-2.92-3.4-3.5-.72-.2-1.62-.3-2.7-.3s-1.98.1-2.72.35c-.74.25\n\t\t-1.3.55-1.7.9-.42.35-.7.74-.83 1.17s-.2.88-.2 1.36c0 .5.2.93.62 1.33s.96.75 1.65 1.03c.68.28\n\t\t1.46.52 2.33.73.88.2 1.77.43 2.67.65.9.22 1.8.48 2.68.77.87 .3 1.65.65 2.33 1.1 1.53.96 2.28\n\t\t2.27 2.28 3.94 0 2-.74 3.5-2.22 4.55m28.84 1.32v-17.54l-7.84\n\t\t10.08-7.97-10.08v17.54H133v-21.2h2.78l7.58 10.06 7.45 -10.05h2.8v21.2h-2.4\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">/&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;/</span>\n\t<a class=\\\\\"token tag\\\\\" href=\\\\\"https://webplatform.github.io/docs/svg/elements/svg\\\\\" target=\\\\\"_blank\\\\\">\n\t\tsvg\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n\"\n`;\n\nexports[`WPD should work with markup 1`] = `\n\"<span class=\\\\\"token doctype\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;!</span>\n\t<span class=\\\\\"token doctype-tag\\\\\">DOCTYPE</span>\n\t<span class=\\\\\"token name\\\\\">html</span>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/html\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\thtml\n\t</a>\n\t<span class=\\\\\"token attr-name\\\\\">lang</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\ten\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/head\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\thead\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/script\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tscript\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token script\\\\\">\n\t<span class=\\\\\"token language-javascript\\\\\">\n\t\t<span class=\\\\\"token comment\\\\\">\n\t\t\t// Just a lil' script to show off that inline JS gets highlighted\n\t\t</span>\n\t\twindow\n\t\t<span class=\\\\\"token punctuation\\\\\">.</span>\n\t\tconsole\n\t\t<span class=\\\\\"token operator\\\\\">&amp;&amp;</span>\n\t\tconsole\n\t\t<span class=\\\\\"token punctuation\\\\\">.</span>\n\t\t<span class=\\\\\"token function\\\\\">log</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">(</span>\n\t\t<span class=\\\\\"token string\\\\\">'foo'</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">)</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">;</span>\n\t</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;/</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/script\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tscript\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/meta\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tmeta\n\t</a>\n\t<span class=\\\\\"token attr-name\\\\\">charset</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\tutf-8\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">/&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/link\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tlink\n\t</a>\n\t<span class=\\\\\"token attr-name\\\\\">rel</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\ticon\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token attr-name\\\\\">href</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\tassets/favicon.png\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">/&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/title\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\ttitle\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\nPrism\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;/</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/title\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\ttitle\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/link\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tlink\n\t</a>\n\t<span class=\\\\\"token attr-name\\\\\">rel</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\tstylesheet\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token attr-name\\\\\">href</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\tassets/style.css\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">/&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/link\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tlink\n\t</a>\n\t<span class=\\\\\"token attr-name\\\\\">rel</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\tstylesheet\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token attr-name\\\\\">href</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\tthemes/prism.css\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token attr-name\\\\\">data-noprefix</span>\n\t<span class=\\\\\"token punctuation\\\\\">/&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/script\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tscript\n\t</a>\n\t<span class=\\\\\"token attr-name\\\\\">src</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\tassets/vendor/prefixfree.min.js\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token script\\\\\"></span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;/</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/script\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tscript\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/script\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tscript\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token script\\\\\">\n\t<span class=\\\\\"token language-javascript\\\\\">\n\t\t<span class=\\\\\"token keyword\\\\\">var</span>\n\t\t_gaq\n\t\t<span class=\\\\\"token operator\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">[</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">[</span>\n\t\t<span class=\\\\\"token string\\\\\">'_setAccount'</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\t\t<span class=\\\\\"token string\\\\\">'UA-33746269-1'</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">]</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">,</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">[</span>\n\t\t<span class=\\\\\"token string\\\\\">'_trackPageview'</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">]</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">]</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">;</span>\n\t</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;/</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/script\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tscript\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/script\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tscript\n\t</a>\n\t<span class=\\\\\"token attr-name\\\\\">src</span>\n\t<span class=\\\\\"token attr-value\\\\\">\n\t\t<span class=\\\\\"token punctuation attr-equals\\\\\">=</span>\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t\thttps://www.google-analytics.com/ga.js\n\t\t<span class=\\\\\"token punctuation\\\\\">\\\\\"</span>\n\t</span>\n\t<span class=\\\\\"token attr-name\\\\\">async</span>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token script\\\\\"></span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;/</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/script\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tscript\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;/</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/head\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\thead\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n<span class=\\\\\"token tag\\\\\">\n\t<span class=\\\\\"token punctuation\\\\\">&lt;</span>\n\t<a\n\t\tclass=\\\\\"token tag\\\\\"\n\t\thref=\\\\\"https://webplatform.github.io/docs/html/elements/body\\\\\"\n\t\ttarget=\\\\\"_blank\\\\\"\n\t>\n\t\tbody\n\t</a>\n\t<span class=\\\\\"token punctuation\\\\\">&gt;</span>\n</span>\n\"\n`;\n"
  },
  {
    "path": "tests/plugins/wpd/basic-functionality.js",
    "content": "import { createTestSuite } from '../../helper/prism-dom-util.js';\n\ndescribe('WPD', () => {\n\tconst { it } = createTestSuite({\n\t\tlanguages: ['markup', 'javascript', 'css', 'scss'],\n\t\tplugins: 'wpd',\n\t});\n\n\tit('should work with CSS', ({ util }) => {\n\t\tutil.assert.highlightElement({\n\t\t\tlanguage: 'css',\n\t\t\tcode: `\n@import url(https://fonts.googleapis.com/css?family=Questrial);\n@import url(https://fonts.googleapis.com/css?family=Arvo);\n\n@font-face {\n\tsrc: url(https://lea.verou.me/logo.otf);\n\tfont-family: 'LeaVerou';\n}\n\n/*\n Shared styles\n */\n\nsection h1,\n#features li strong,\nheader h2,\nfooter p {\n\tfont: 100% Rockwell, Arvo, serif;\n}\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: black;\n\tbackground: none;\n\ttext-shadow: 0 1px white;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n`,\n\t\t});\n\t});\n\n\tit('should work with markup', ({ util }) => {\n\t\tutil.assert.highlightElement({\n\t\t\tlanguage: 'markup',\n\t\t\tcode: `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\n<script>\n\t// Just a lil' script to show off that inline JS gets highlighted\n\twindow.console && console.log('foo');\n</script>\n<meta charset=\"utf-8\" />\n<link rel=\"icon\" href=\"assets/favicon.png\" />\n<title>Prism</title>\n<link rel=\"stylesheet\" href=\"assets/style.css\" />\n<link rel=\"stylesheet\" href=\"themes/prism.css\" data-noprefix />\n<script src=\"assets/vendor/prefixfree.min.js\"></script>\n\n<script>var _gaq = [['_setAccount', 'UA-33746269-1'], ['_trackPageview']];</script>\n<script src=\"https://www.google-analytics.com/ga.js\" async></script>\n</head>\n<body>\n`,\n\t\t});\n\t});\n\n\tit('should work with SVG', ({ util }) => {\n\t\tutil.assert.highlightElement({\n\t\t\tlanguage: 'svg',\n\t\t\tcode: `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200 170\">\n\t<path fill=\"#fff\" d=\"M55.37 131.5H48.4v9.13h6.97c1.67 0 2.92-.4 3.78-1.22.85\n\t-.8 1.28-1.92 1.28-3.33s-.43-2.54-1.28-3.35c-.86-.8-2.12-1.2-3.78-1.2m29.52\n\t6.4c.3-.53.47-1.2.47-2.04 0-1.35-.45-2.4-1.37-3.2-.92-.76-2.14-1.15-3.65\n\t-1.15H72.9v8.52h7.32c2.26 0 3.82-.7 4.67-2.1M100 0L0 170h200L100 0M60.86\n\t141.03c-1.3 1.22-3.1 1.84-5.33 1.84H48.4v7.55H46v-21.2h9.53c2.24 0 4.02.63\n\t5.34 1.87 1.3 1.23 1.96 2.88 1.96 4.95 0 2.1-.66 3.75-1.97 4.98m24.5 9.4l\n\t-5.1-8.14h-7.37v8.12h-2.4v-21.2h10.14c2.15 0 3.88.6 5.18 1.8 1.3 1.18 1.95\n\t2.8 1.95 4.84 0 2.64-1.1 4.44-3.3 5.4-.6.28-1.22.5-1.82.6l5.57 8.56h-2.85m\n\t13.43 0h-2.4v-21.2h2.4v21.2m23.56-1.32c-1.48 1.05-3.53 1.57-6.16 1.57-2.96 0\n\t-5.23-.6-6.78-1.85-1.4-1.1-2.18-2.7-2.37-4.74h2.5c.08 1.45.78 2.56 2.1 3.33\n\t1.16.67 2.68 1 4.58 1 3.97 0 5.95-1.25 5.95-3.74 0-.86-.35-1.53-1.07-2.02-.7\n\t-.5-1.6-.9-2.68-1.2-1.07-.33-2.24-.63-3.48-.9s-2.4-.65-3.5-1.08-1.97-1.02\n\t-2.68-1.73c-.7-.72-1.07-1.68-1.07-2.9 0-1.73.65-3.13 1.97-4.22 1.32-1.08\n\t3.32-1.62 6-1.62 2.67 0 4.75.6 6.23 1.85 1.34 1.1 2.05 2.5 2.14 4.2h-2.46c\n\t-.22-1.76-1.35-2.92-3.4-3.5-.72-.2-1.62-.3-2.7-.3s-1.98.1-2.72.35c-.74.25\n\t-1.3.55-1.7.9-.42.35-.7.74-.83 1.17s-.2.88-.2 1.36c0 .5.2.93.62 1.33s.96.75\n\t1.65 1.03c.68.28 1.46.52 2.33.73.88.2 1.77.43 2.67.65.9.22 1.8.48 2.68.77.87\n\t.3 1.65.65 2.33 1.1 1.53.96 2.28 2.27 2.28 3.94 0 2-.74 3.5-2.22 4.55m28.84\n\t1.32v-17.54l-7.84 10.08-7.97-10.08v17.54H133v-21.2h2.78l7.58 10.06 7.45\n\t-10.05h2.8v21.2h-2.4\"/>\n</svg>\n`,\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/run.js",
    "content": "import path from 'path';\nimport { language, update } from './helper/args.js';\nimport * as TestCase from './helper/test-case.js';\nimport * as TestDiscovery from './helper/test-discovery.js';\n\nconst testSuite = language\n\t? TestDiscovery.loadSomeTests(language)\n\t: // load complete test suite\n\t\tTestDiscovery.loadAllTests();\n\n// define tests for all tests in all languages in the test suite\nfor (const [languageIdentifier, files] of testSuite) {\n\tdescribe(\"Testing language '\" + languageIdentifier + \"'\", function () {\n\t\tthis.timeout(10000);\n\n\t\tfor (const filePath of files) {\n\t\t\tconst fileName = path.basename(filePath, path.extname(filePath));\n\n\t\t\tit(\"– should pass test case '\" + fileName + \"'\", async () => {\n\t\t\t\tawait TestCase.runTestCase(\n\t\t\t\t\tlanguageIdentifier,\n\t\t\t\t\tfilePath,\n\t\t\t\t\tupdate ? 'update' : 'insert'\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t});\n}\n"
  },
  {
    "path": "tests/testrunner-tests.js",
    "content": "import { assert } from 'chai';\nimport { parseLanguageNames } from './helper/test-case.js';\nimport { simplify } from './helper/token-stream-transformer.js';\n\ndescribe('The token stream transformer', () => {\n\tit('should handle all kinds of simple transformations', () => {\n\t\tconst tokens = [{ type: 'type', content: 'content' }, 'string'];\n\n\t\tassert.deepEqual(simplify(tokens), [['type', 'content'], 'string']);\n\t});\n\n\tit('should handle nested structures', () => {\n\t\tconst tokens = [\n\t\t\t{\n\t\t\t\ttype: 'type',\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'insideType',\n\t\t\t\t\t\tcontent: [{ type: 'insideInsideType', content: 'content' }],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t];\n\n\t\tassert.deepEqual(simplify(tokens), [\n\t\t\t['type', [['insideType', [['insideInsideType', 'content']]]]],\n\t\t]);\n\t});\n\n\tit('should strip empty tokens', () => {\n\t\tconst tokenStream = ['', '\\r\\n', '\\t', ' '];\n\n\t\tassert.deepEqual(simplify(tokenStream), []);\n\t});\n\n\tit('should strip empty token tree branches', () => {\n\t\tconst tokenStream = [\n\t\t\t{\n\t\t\t\ttype: 'type',\n\t\t\t\tcontent: ['', { type: 'nested', content: [''] }, ''],\n\t\t\t},\n\t\t\t'',\n\t\t];\n\n\t\tassert.deepEqual(simplify(tokenStream), [['type', [['nested', []]]]]);\n\t});\n\n\tit('should ignore all properties in tokens except value and content', () => {\n\t\tconst tokenStream = [{ type: 'type', content: 'content', alias: 'alias' }];\n\n\t\tassert.deepEqual(simplify(tokenStream), [['type', 'content']]);\n\t});\n});\n\ndescribe('The language name parsing', () => {\n\tit('should use the last language as the main language if no language is specified', () => {\n\t\tassert.deepEqual(parseLanguageNames('a'), {\n\t\t\tlanguages: ['a'],\n\t\t\tmainLanguage: 'a',\n\t\t});\n\n\t\tassert.deepEqual(parseLanguageNames('a+b+c'), {\n\t\t\tlanguages: ['a', 'b', 'c'],\n\t\t\tmainLanguage: 'c',\n\t\t});\n\t});\n\n\tit('should use the specified language as main language', () => {\n\t\tassert.deepEqual(parseLanguageNames('a+b!+c'), {\n\t\t\tlanguages: ['a', 'b', 'c'],\n\t\t\tmainLanguage: 'b',\n\t\t});\n\t});\n\n\tit('should throw an error if there are multiple main languages', () => {\n\t\tassert.throw(() => {\n\t\t\tparseLanguageNames('a+b!+c!');\n\t\t}, 'There are multiple main languages defined.');\n\t});\n});\n"
  },
  {
    "path": "tests/tsconfig.json",
    "content": "{\n\t\"extends\": \"../tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t/* Visit https://aka.ms/tsconfig to read more about this file */\n\n\t\t/* Projects */\n\t\t// \"incremental\": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */\n\t\t// \"composite\": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */\n\t\t// \"tsBuildInfoFile\": \"./.tsbuildinfo\",              /* Specify the path to .tsbuildinfo incremental compilation file. */\n\t\t// \"disableSourceOfProjectReferenceRedirect\": true,  /* Disable preferring source files instead of declaration files when referencing composite projects. */\n\t\t// \"disableSolutionSearching\": true,                 /* Opt a project out of multi-project reference checking when editing. */\n\t\t// \"disableReferencedProjectLoad\": true,             /* Reduce the number of projects loaded automatically by TypeScript. */\n\n\t\t/* Language and Environment */\n\t\t\"target\": \"ES2022\" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,\n\t\t// \"lib\": [],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */\n\t\t// \"jsx\": \"preserve\",                                /* Specify what JSX code is generated. */\n\t\t// \"experimentalDecorators\": true,                   /* Enable experimental support for TC39 stage 2 draft decorators. */\n\t\t// \"emitDecoratorMetadata\": true,                    /* Emit design-type metadata for decorated declarations in source files. */\n\t\t// \"jsxFactory\": \"\",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */\n\t\t// \"jsxFragmentFactory\": \"\",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */\n\t\t// \"jsxImportSource\": \"\",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */\n\t\t// \"reactNamespace\": \"\",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */\n\t\t// \"noLib\": true,                                    /* Disable including any library files, including the default lib.d.ts. */\n\t\t// \"useDefineForClassFields\": true,                  /* Emit ECMAScript-standard-compliant class fields. */\n\t\t// \"moduleDetection\": \"auto\",                        /* Control what method is used to detect module-format JS files. */\n\n\t\t/* Modules */\n\t\t\"module\": \"ES2022\" /* Specify what module code is generated. */,\n\t\t// \"rootDir\": \"./\",                                  /* Specify the root folder within your source files. */\n\t\t// \"moduleResolution\": \"node\",                       /* Specify how TypeScript looks up a file from a given module specifier. */\n\t\t// \"baseUrl\": \"./\",                                  /* Specify the base directory to resolve non-relative module names. */\n\t\t// \"paths\": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */\n\t\t// \"rootDirs\": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */\n\t\t// \"typeRoots\": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */\n\t\t// \"types\": [],                                      /* Specify type package names to be included without being referenced in a source file. */\n\t\t// \"allowUmdGlobalAccess\": true,                     /* Allow accessing UMD globals from modules. */\n\t\t// \"moduleSuffixes\": [],                             /* List of file name suffixes to search when resolving a module. */\n\t\t// \"resolveJsonModule\": true,                        /* Enable importing .json files. */\n\t\t// \"noResolve\": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */\n\n\t\t/* JavaScript Support */\n\t\t\"allowJs\": true /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */,\n\t\t\"checkJs\": true /* Enable error reporting in type-checked JavaScript files. */,\n\t\t// \"maxNodeModuleJsDepth\": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */\n\n\t\t/* Emit */\n\t\t// \"declaration\": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */\n\t\t// \"declarationMap\": true,                           /* Create sourcemaps for d.ts files. */\n\t\t// \"emitDeclarationOnly\": true,                      /* Only output d.ts files and not JavaScript files. */\n\t\t// \"sourceMap\": true,                                /* Create source map files for emitted JavaScript files. */\n\t\t// \"outFile\": \"./\",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */\n\t\t// \"outDir\": \"./\",                                   /* Specify an output folder for all emitted files. */\n\t\t// \"removeComments\": true,                           /* Disable emitting comments. */\n\t\t\"noEmit\": true /* Disable emitting files from a compilation. */,\n\t\t// \"importHelpers\": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */\n\t\t// \"importsNotUsedAsValues\": \"remove\",               /* Specify emit/checking behavior for imports that are only used for types. */\n\t\t// \"downlevelIteration\": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */\n\t\t// \"sourceRoot\": \"\",                                 /* Specify the root path for debuggers to find the reference source code. */\n\t\t// \"mapRoot\": \"\",                                    /* Specify the location where debugger should locate map files instead of generated locations. */\n\t\t// \"inlineSourceMap\": true,                          /* Include sourcemap files inside the emitted JavaScript. */\n\t\t// \"inlineSources\": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */\n\t\t// \"emitBOM\": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */\n\t\t// \"newLine\": \"crlf\",                                /* Set the newline character for emitting files. */\n\t\t// \"stripInternal\": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */\n\t\t// \"noEmitHelpers\": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */\n\t\t// \"noEmitOnError\": true,                            /* Disable emitting files if any type checking errors are reported. */\n\t\t// \"preserveConstEnums\": true,                       /* Disable erasing 'const enum' declarations in generated code. */\n\t\t// \"declarationDir\": \"./\",                           /* Specify the output directory for generated declaration files. */\n\t\t// \"preserveValueImports\": true,                     /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */\n\n\t\t/* Interop Constraints */\n\t\t// \"isolatedModules\": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */\n\t\t// \"allowSyntheticDefaultImports\": true,             /* Allow 'import x from y' when a module doesn't have a default export. */\n\t\t\"esModuleInterop\": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,\n\n\t\t/* Type Checking */\n\t\t\"strict\": true /* Enable all strict type-checking options. */,\n\t\t\"noImplicitAny\": false /* Enable error reporting for expressions and declarations with an implied 'any' type. */\n\t},\n\t\"include\": [\"./**/*\"]\n}\n"
  },
  {
    "path": "tests/types.d.ts",
    "content": "import { createUtil } from './helper/prism-dom-util.js';\nimport { useSnapshot } from './helper/snapshot.js';\nimport type { KebabToCamelCase } from '../src/types.d.ts';\nimport type { PrismDOM, PrismWindow } from './prism-loader.js';\nimport type { DOMWindow, JSDOM } from 'jsdom';\n\nexport type PrismWindow<T> = DOMWindow & { Prism: Prism & T };\n\nexport interface PrismDOM<T> {\n\tdom: JSDOM;\n\twindow: PrismWindow<T>;\n\tdocument: Document;\n\tPrism: Prism & T;\n\tloadLanguages: (languages: string | string[]) => Promise<void>;\n\tloadPlugins: (plugins: string | string[]) => Promise<void>;\n\twithGlobals: (fn: () => void) => void;\n}\n\nexport interface AssertOptions {\n\tlanguage?: string;\n\tcode: string;\n\tformat?: boolean;\n\texpected?: string | typeof useSnapshot;\n}\n\nexport type TestSuiteDom<T extends string> = PrismDOM<{\n\tplugins: Record<KebabToCamelCase<T>, {}>;\n}> & { util: ReturnType<typeof createUtil> };\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t/* Visit https://aka.ms/tsconfig to read more about this file */\n\n\t\t/* Projects */\n\t\t// \"incremental\": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */\n\t\t// \"composite\": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */\n\t\t// \"tsBuildInfoFile\": \"./.tsbuildinfo\",              /* Specify the path to .tsbuildinfo incremental compilation file. */\n\t\t// \"disableSourceOfProjectReferenceRedirect\": true,  /* Disable preferring source files instead of declaration files when referencing composite projects. */\n\t\t// \"disableSolutionSearching\": true,                 /* Opt a project out of multi-project reference checking when editing. */\n\t\t// \"disableReferencedProjectLoad\": true,             /* Reduce the number of projects loaded automatically by TypeScript. */\n\n\t\t/* Language and Environment */\n\t\t\"target\": \"ES2022\" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,\n\t\t// \"lib\": [],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */\n\t\t// \"jsx\": \"preserve\",                                /* Specify what JSX code is generated. */\n\t\t// \"experimentalDecorators\": true,                   /* Enable experimental support for TC39 stage 2 draft decorators. */\n\t\t// \"emitDecoratorMetadata\": true,                    /* Emit design-type metadata for decorated declarations in source files. */\n\t\t// \"jsxFactory\": \"\",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */\n\t\t// \"jsxFragmentFactory\": \"\",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */\n\t\t// \"jsxImportSource\": \"\",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */\n\t\t// \"reactNamespace\": \"\",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */\n\t\t// \"noLib\": true,                                    /* Disable including any library files, including the default lib.d.ts. */\n\t\t// \"useDefineForClassFields\": true,                  /* Emit ECMAScript-standard-compliant class fields. */\n\t\t// \"moduleDetection\": \"auto\",                        /* Control what method is used to detect module-format JS files. */\n\n\t\t/* Modules */\n\t\t\"module\": \"ES2022\" /* Specify what module code is generated. */,\n\t\t// \"rootDir\": \"./\",                                  /* Specify the root folder within your source files. */\n\t\t\"moduleResolution\": \"node\" /* Specify how TypeScript looks up a file from a given module specifier. */,\n\t\t// \"baseUrl\": \"./\",                                  /* Specify the base directory to resolve non-relative module names. */\n\t\t// \"paths\": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */\n\t\t// \"rootDirs\": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */\n\t\t// \"typeRoots\": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */\n\t\t// \"types\": [],                                      /* Specify type package names to be included without being referenced in a source file. */\n\t\t// \"allowUmdGlobalAccess\": true,                     /* Allow accessing UMD globals from modules. */\n\t\t// \"moduleSuffixes\": [],                             /* List of file name suffixes to search when resolving a module. */\n\t\t// \"resolveJsonModule\": true,                        /* Enable importing .json files. */\n\t\t// \"noResolve\": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */\n\n\t\t/* JavaScript Support */\n\t\t\"allowJs\": true /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */,\n\t\t\"checkJs\": true /* Enable error reporting in type-checked JavaScript files. */,\n\t\t// \"maxNodeModuleJsDepth\": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */\n\n\t\t/* Emit */\n\t\t// \"declaration\": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */\n\t\t// \"declarationMap\": true,                           /* Create sourcemaps for d.ts files. */\n\t\t// \"emitDeclarationOnly\": true,                      /* Only output d.ts files and not JavaScript files. */\n\t\t// \"sourceMap\": true,                                /* Create source map files for emitted JavaScript files. */\n\t\t// \"outFile\": \"./\",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */\n\t\t// \"outDir\": \"./\",                                   /* Specify an output folder for all emitted files. */\n\t\t// \"removeComments\": true,                           /* Disable emitting comments. */\n\t\t\"noEmit\": true /* Disable emitting files from a compilation. */,\n\t\t// \"importHelpers\": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */\n\t\t// \"importsNotUsedAsValues\": \"remove\",               /* Specify emit/checking behavior for imports that are only used for types. */\n\t\t// \"downlevelIteration\": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */\n\t\t// \"sourceRoot\": \"\",                                 /* Specify the root path for debuggers to find the reference source code. */\n\t\t// \"mapRoot\": \"\",                                    /* Specify the location where debugger should locate map files instead of generated locations. */\n\t\t// \"inlineSourceMap\": true,                          /* Include sourcemap files inside the emitted JavaScript. */\n\t\t// \"inlineSources\": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */\n\t\t// \"emitBOM\": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */\n\t\t// \"newLine\": \"crlf\",                                /* Set the newline character for emitting files. */\n\t\t// \"stripInternal\": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */\n\t\t// \"noEmitHelpers\": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */\n\t\t// \"noEmitOnError\": true,                            /* Disable emitting files if any type checking errors are reported. */\n\t\t// \"preserveConstEnums\": true,                       /* Disable erasing 'const enum' declarations in generated code. */\n\t\t// \"declarationDir\": \"./\",                           /* Specify the output directory for generated declaration files. */\n\t\t// \"preserveValueImports\": true,                     /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */\n\n\t\t/* Interop Constraints */\n\t\t// \"isolatedModules\": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */\n\t\t// \"allowSyntheticDefaultImports\": true,             /* Allow 'import x from y' when a module doesn't have a default export. */\n\t\t\"esModuleInterop\": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,\n\t\t// \"preserveSymlinks\": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */\n\t\t\"forceConsistentCasingInFileNames\": true /* Ensure that casing is correct in imports. */,\n\n\t\t/* Type Checking */\n\t\t\"strict\": true /* Enable all strict type-checking options. */,\n\t\t\"noImplicitAny\": false /* Enable error reporting for expressions and declarations with an implied 'any' type. */,\n\t\t// \"strictNullChecks\": true,                         /* When type checking, take into account 'null' and 'undefined'. */\n\t\t// \"strictFunctionTypes\": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */\n\t\t// \"strictBindCallApply\": true,                      /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */\n\t\t// \"strictPropertyInitialization\": true,             /* Check for class properties that are declared but not set in the constructor. */\n\t\t// \"noImplicitThis\": true,                           /* Enable error reporting when 'this' is given the type 'any'. */\n\t\t// \"useUnknownInCatchVariables\": true,               /* Default catch clause variables as 'unknown' instead of 'any'. */\n\t\t// \"alwaysStrict\": true,                             /* Ensure 'use strict' is always emitted. */\n\t\t// \"noUnusedLocals\": true,                           /* Enable error reporting when local variables aren't read. */\n\t\t// \"noUnusedParameters\": true,                       /* Raise an error when a function parameter isn't read. */\n\t\t// \"exactOptionalPropertyTypes\": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */\n\t\t// \"noImplicitReturns\": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */\n\t\t// \"noFallthroughCasesInSwitch\": true,               /* Enable error reporting for fallthrough cases in switch statements. */\n\t\t// \"noUncheckedIndexedAccess\": true,                 /* Add 'undefined' to a type when accessed using an index. */\n\t\t// \"noImplicitOverride\": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */\n\t\t// \"noPropertyAccessFromIndexSignature\": true,       /* Enforces using indexed accessors for keys declared using an indexed type. */\n\t\t// \"allowUnusedLabels\": true,                        /* Disable error reporting for unused labels. */\n\t\t// \"allowUnreachableCode\": true,                     /* Disable error reporting for unreachable code. */\n\n\t\t/* Completeness */\n\t\t// \"skipDefaultLibCheck\": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */\n\t\t\"skipLibCheck\": true /* Skip type checking all .d.ts files. */\n\t},\n\t\"include\": [\"./src/**/*\"],\n\t\"exclude\": [\"./src/plugins/**/demo.js\"]\n}\n"
  }
]