[
  {
    "path": ".gitattributes",
    "content": "/.github/ export-ignore\n/tests/ export-ignore\n/.gitattributes export-ignore\n/.gitignore export-ignore\n/.scrutinizer.yml export-ignore\n/Makefile export-ignore\n/composer.lock export-ignore\n/phive.xml export-ignore\n/phpcs.xml.dist export-ignore\n/phpmd.xml.dist export-ignore\n/phpstan.neon export-ignore\n/phpunit.xml.dist export-ignore\n/psalm.xml export-ignore\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: \"composer\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n    open-pull-requests-limit: 10\n\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n"
  },
  {
    "path": ".github/workflows/integrate.yaml",
    "content": "# https://docs.github.com/en/actions\n\nname: \"Integrate\"\n\non: # yamllint disable-line rule:truthy\n  push:\n    branches:\n      - \"5.x\"\n  pull_request: null\n  # Allow manually triggering the workflow.\n  workflow_dispatch: null\n\njobs:\n  code-coverage:\n    name: \"Code Coverage\"\n    uses: \"phpDocumentor/.github/.github/workflows/code-coverage.yml@main\"\n    with:\n      composer-root-version: \"2.x-dev\"\n\n  coding-standards:\n    name: \"Coding Standards\"\n    uses: \"phpDocumentor/.github/.github/workflows/coding-standards.yml@v0.8\"\n    with:\n      composer-root-version: \"2.x-dev\"\n\n  lint-root:\n    name: \"Lint root\"\n    uses: \"phpDocumentor/.github/.github/workflows/lint.yml@main\"\n    with:\n      composer-options: \"--no-check-publish --ansi\"\n\n  static-analysis:\n    name: \"Static analysis\"\n    uses: \"phpDocumentor/.github/.github/workflows/static-analysis.yml@v0.9\"\n    with:\n      php-extensions: \"none, ctype, dom, json, mbstring, phar, simplexml, tokenizer, xml, xmlwriter, fileinfo, pcntl, posix\"\n      composer-root-version: \"2.x-dev\"\n\n  unit-tests:\n    name: \"Unit test\"\n    uses: \"phpDocumentor/.github/.github/workflows/continuous-integration.yml@v0.9\"\n    with:\n      composer-root-version: \"2.x-dev\"\n      php-versions: \"['7.4', '8.0', '8.1', '8.2', '8.3', '8.4']\"\n"
  },
  {
    "path": ".gitignore",
    "content": "# IDE Shizzle; it is recommended to use a global .gitignore for this but since this is an OSS project we want to make\n# it easy to contribute\n.idea\n/nbproject/private/\n.buildpath\n.project\n.settings\n\n# Build folder and vendor folder are generated code; no need to version this\nbuild/\ntemp/\ntools/\nvendor/\n*.phar\n\n# By default the phpunit.xml.dist is provided; you can override this using a local config file\nphpunit.xml\n.phpunit.result.cache\n"
  },
  {
    "path": ".yamllint.yaml",
    "content": "extends: \"default\"\n\nignore: |\n  .build/\n  .notes/\n  vendor/\nrules:\n  braces:\n    max-spaces-inside-empty: 0\n    max-spaces-inside: 1\n    min-spaces-inside-empty: 0\n    min-spaces-inside: 1\n  brackets:\n    max-spaces-inside-empty: 0\n    max-spaces-inside: 0\n    min-spaces-inside-empty: 0\n    min-spaces-inside: 0\n  colons:\n    max-spaces-after: 1\n    max-spaces-before: 0\n  commas:\n    max-spaces-after: 1\n    max-spaces-before: 0\n    min-spaces-after: 1\n  comments:\n    ignore-shebangs: true\n    min-spaces-from-content: 1\n    require-starting-space: true\n  comments-indentation: \"enable\"\n  document-end:\n    present: false\n  document-start:\n    present: false\n  indentation:\n    check-multi-line-strings: false\n    indent-sequences: true\n    spaces: 2\n  empty-lines:\n    max-end: 0\n    max-start: 0\n    max: 1\n  empty-values:\n    forbid-in-block-mappings: true\n    forbid-in-flow-mappings: true\n  hyphens:\n    max-spaces-after: 2\n  key-duplicates: \"enable\"\n  key-ordering: \"disable\"\n  line-length: \"disable\"\n  new-line-at-end-of-file: \"enable\"\n  new-lines:\n    type: \"unix\"\n  octal-values:\n    forbid-implicit-octal: true\n  quoted-strings:\n    quote-type: \"double\"\n  trailing-spaces: \"enable\"\n  truthy:\n    allowed-values:\n      - \"false\"\n      - \"true\"\n\nyaml-files:\n  - \"*.yaml\"\n  - \"*.yml\"\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 phpDocumentor\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 all\ncopies 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 THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Makefile",
    "content": ".PHONY: help\nhelp: ## Displays this list of targets with descriptions\n\t@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = \":.*?## \"}; {printf \"\\033[32m%-30s\\033[0m %s\\n\", $$1, $$2}'\n\n.PHONY: code-style\ncode-style:\n\tdocker run -it --rm -v${PWD}:/opt/project -w /opt/project phpdoc/phpcs-ga:latest -d memory_limit=1024M -s\n\n.PHONY: fix-code-style\nfix-code-style:\n\tdocker run -it --rm -v${PWD}:/opt/project -w /opt/project phpdoc/phpcs-ga:latest phpcbf\n\n.PHONY: static-code-analysis\nstatic-code-analysis: vendor ## Runs a static code analysis with phpstan/phpstan and vimeo/psalm\n\tdocker run -it --rm -v${PWD}:/opt/project -w /opt/project php:7.4 vendor/bin/phpstan --configuration=phpstan.neon\n\tdocker run -it --rm -v${PWD}:/opt/project -w /opt/project php:7.4 vendor/bin/psalm\n\n.PHONY: test\ntest: test-unit ## Runs all test suites with phpunit/phpunit\n\tdocker run -it --rm -v${PWD}:/opt/project -w /opt/project php:7.4 vendor/bin/phpunit\n\n.PHONY: test-unit\ntest-unit: ## Runs unit tests with phpunit/phpunit\n\tdocker run -it --rm -v${PWD}:/opt/project -w /opt/project php:7.4 vendor/bin/phpunit --testsuite=unit\n\n.PHONY: dependency-analysis\ndependency-analysis: vendor ## Runs a dependency analysis with maglnet/composer-require-checker\n\tdocker run -it --rm -v${PWD}:/opt/project -w /opt/project php:7.4 .phive/composer-require-checker check --config-file=/opt/project/composer-require-checker.json\n\nvendor: composer.json composer.lock\n\tcomposer validate --no-check-publish\n\tcomposer install --no-interaction --no-progress\n\n.PHONY: rector\nrector: ## Refactor code using rector\n\tdocker run -it --rm -v${PWD}:/opt/project -w /opt/project php:7.4 vendor/bin/rector process\n\n.PHONY: pre-commit-test\npre-commit-test: fix-code-style test code-style static-code-analysis\n"
  },
  {
    "path": "README.md",
    "content": "[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n![Qa workflow](https://github.com/phpDocumentor/ReflectionCommon/workflows/Qa%20workflow/badge.svg)\n[![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionCommon.svg)](https://coveralls.io/github/phpDocumentor/ReflectionCommon?branch=master)\n[![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master)\n[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master)\n[![Stable Version](https://img.shields.io/packagist/v/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common)\n[![Unstable Version](https://img.shields.io/packagist/vpre/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common)\n\n\nReflectionCommon\n================\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"phpdocumentor/reflection-common\",\n    \"keywords\": [\"phpdoc\", \"phpDocumentor\", \"reflection\", \"static analysis\", \"FQSEN\"],\n    \"homepage\": \"https://www.phpdoc.org\",\n    \"description\": \"Common reflection classes used by phpdocumentor to reflect the code structure\",\n    \"license\": \"MIT\",\n    \"minimum-stability\": \"stable\",\n    \"authors\": [\n        {\n            \"name\": \"Jaap van Otterdijk\",\n            \"email\": \"opensource@ijaap.nl\"\n        }\n    ],\n    \"require\": {\n        \"php\": \"^7.4 || ^8.0\"\n    },\n    \"autoload\" : {\n      \"psr-4\" : {\n        \"phpDocumentor\\\\Reflection\\\\\": \"src/\"\n      }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-2.x\": \"2.x-dev\"\n        }\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"^9.5\",\n        \"phpstan/phpstan\": \"^1.8\",\n        \"vimeo/psalm\": \"^4.25\"\n    },\n    \"config\": {\n        \"platform\": {\n            \"php\": \"7.4.1\"\n        }\n    }\n}\n"
  },
  {
    "path": "phive.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phive xmlns=\"https://phar.io/phive\">\n  <phar name=\"phpunit\" version=\"^9.5.0\" installed=\"9.5.8\" location=\"./tools/phpunit\" copy=\"false\"/>\n</phive>\n"
  },
  {
    "path": "phpcs.xml.dist",
    "content": "<?xml version=\"1.0\"?>\n<ruleset name=\"ReflectionCommon\">\n <description>The coding standard for this library.</description>\n\n    <file>src</file>\n    <file>tests/unit</file>\n    <arg value=\"p\"/>\n\n    <!-- Set the minimum PHP version for PHPCompatibility.\n         This should be kept in sync with the requirements in the composer.json file. -->\n    <config name=\"testVersion\" value=\"7.4-\"/>\n\n    <rule ref=\"phpDocumentor\">\n    </rule>\n</ruleset>\n"
  },
  {
    "path": "phpmd.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<ruleset\n    name=\"ProxyManager rules\"\n    xmlns=\"http://pmd.sf.net/ruleset/1.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd\"\n    xsi:noNamespaceSchemaLocation=\"http://pmd.sf.net/ruleset_xml_schema.xsd\"\n>\n    <rule ref=\"rulesets/codesize.xml\"/>\n    <rule ref=\"rulesets/unusedcode.xml\"/>\n    <rule ref=\"rulesets/design.xml\">\n        <!-- eval is needed to generate runtime classes -->\n        <exclude name=\"EvalExpression\"/>\n    </rule>\n    <rule ref=\"rulesets/naming.xml\">\n        <exclude name=\"LongVariable\"/>\n    </rule>\n    <rule ref=\"rulesets/naming.xml/LongVariable\">\n        <properties>\n            <property name=\"minimum\">40</property>\n        </properties>\n    </rule>\n</ruleset>\n"
  },
  {
    "path": "phpstan.neon",
    "content": "parameters:\n    level: max\n    paths:\n     - src\n     - tests\n"
  },
  {
    "path": "phpunit.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<phpunit\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xsi:noNamespaceSchemaLocation=\"https://schema.phpunit.de/8.0/phpunit.xsd\"\n        colors=\"true\"\n        bootstrap=\"vendor/autoload.php\"\n        convertDeprecationsToExceptions=\"true\"\n>\n    <testsuites>\n        <testsuite name=\"unit\">\n            <directory>./tests/unit/</directory>\n        </testsuite>\n    </testsuites>\n    <filter>\n        <whitelist>\n            <directory suffix=\".php\">src</directory>\n        </whitelist>\n    </filter>\n    <logging>\n        <log type=\"coverage-html\"\n            title=\"phpDocumentor Reflection Common\"\n            target=\"build/coverage\"\n            charset=\"UTF-8\"\n            yui=\"true\"\n            highlight=\"false\"\n            lowUpperBound=\"35\"\n            highLowerBound=\"70\" />\n        <log type=\"coverage-clover\" target=\"build/logs/clover.xml\"/>\n        <log type=\"junit\" target=\"build/logs/junit.xml\" logIncompleteSkipped=\"false\" />\n    </logging>\n</phpunit>\n"
  },
  {
    "path": "psalm.xml",
    "content": "<?xml version=\"1.0\"?>\n<psalm\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xmlns=\"https://getpsalm.org/schema/config\"\n    xsi:schemaLocation=\"https://getpsalm.org/schema/config file:///composer/vendor/vimeo/psalm/config.xsd\"\n    errorLevel=\"1\"\n>\n    <projectFiles>\n        <directory name=\"src\" />\n        <ignoreFiles>\n            <directory name=\"vendor\" />\n        </ignoreFiles>\n    </projectFiles>\n</psalm>\n"
  },
  {
    "path": "src/Element.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/**\n * phpDocumentor\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n *\n * @link      http://phpdoc.org\n */\n\nnamespace phpDocumentor\\Reflection;\n\n/**\n * Interface for Api Elements\n */\ninterface Element\n{\n    /**\n     * Returns the Fqsen of the element.\n     */\n    public function getFqsen(): Fqsen;\n\n    /**\n     * Returns the name of the element.\n     */\n    public function getName(): string;\n}\n"
  },
  {
    "path": "src/File.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/**\n * This file is part of phpDocumentor.\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n *\n * @link      http://phpdoc.org\n */\n\nnamespace phpDocumentor\\Reflection;\n\n/**\n * Interface for files processed by the ProjectFactory\n */\ninterface File\n{\n    /**\n     * Returns the content of the file as a string.\n     */\n    public function getContents(): string;\n\n    /**\n     * Returns md5 hash of the file.\n     */\n    public function md5(): string;\n\n    /**\n     * Returns an relative path to the file.\n     */\n    public function path(): string;\n}\n"
  },
  {
    "path": "src/Fqsen.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/**\n * phpDocumentor\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n *\n * @link      http://phpdoc.org\n */\n\nnamespace phpDocumentor\\Reflection;\n\nuse InvalidArgumentException;\n\nuse function end;\nuse function explode;\nuse function preg_match;\nuse function sprintf;\nuse function trim;\n\n/**\n * Value Object for Fqsen.\n *\n * @link https://github.com/phpDocumentor/fig-standards/blob/master/proposed/phpdoc-meta.md\n *\n * @psalm-immutable\n */\nfinal class Fqsen\n{\n    /** @var string full quallified class name */\n    private $fqsen;\n\n    /** @var string name of the element without path. */\n    private $name;\n\n    /**\n     * Initializes the object.\n     *\n     * @throws InvalidArgumentException when $fqsen is not matching the format.\n     */\n    public function __construct(string $fqsen)\n    {\n        $matches = [];\n\n        $result = preg_match(\n            //phpcs:ignore Generic.Files.LineLength.TooLong\n            '/^\\\\\\\\([a-zA-Z_\\\\x7f-\\\\xff][a-zA-Z0-9_\\\\x7f-\\\\xff\\\\\\\\]*)?(?:[:]{2}\\\\$?([a-zA-Z_\\\\x7f-\\\\xff][a-zA-Z0-9_\\\\x7f-\\\\xff]*))?(?:\\\\(\\\\))?$/',\n            $fqsen,\n            $matches\n        );\n\n        if ($result === 0) {\n            throw new InvalidArgumentException(\n                sprintf('\"%s\" is not a valid Fqsen.', $fqsen)\n            );\n        }\n\n        $this->fqsen = $fqsen;\n\n        if (isset($matches[2])) {\n            $this->name = $matches[2];\n        } elseif ($fqsen === '\\\\') {\n            $this->name = '';\n        } else {\n            $matches = explode('\\\\', $fqsen);\n            $name = end($matches);\n            $this->name = trim($name, '()');\n        }\n    }\n\n    /**\n     * converts this class to string.\n     */\n    public function __toString(): string\n    {\n        return $this->fqsen;\n    }\n\n    /**\n     * Returns the name of the element without path.\n     */\n    public function getName(): string\n    {\n        return $this->name;\n    }\n}\n"
  },
  {
    "path": "src/Location.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/**\n * This file is part of phpDocumentor.\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n *\n * @link      http://phpdoc.org\n */\n\nnamespace phpDocumentor\\Reflection;\n\n/**\n * The location where an element occurs within a file.\n *\n * @psalm-immutable\n */\nfinal class Location\n{\n    /** @var int */\n    private $lineNumber = 0;\n\n    /** @var int */\n    private $columnNumber = 0;\n\n    /**\n     * Initializes the location for an element using its line number in the file and optionally the column number.\n     */\n    public function __construct(int $lineNumber, int $columnNumber = 0)\n    {\n        $this->lineNumber = $lineNumber;\n        $this->columnNumber = $columnNumber;\n    }\n\n    /**\n     * Returns the line number that is covered by this location.\n     */\n    public function getLineNumber(): int\n    {\n        return $this->lineNumber;\n    }\n\n    /**\n     * Returns the column number (character position on a line) for this location object.\n     */\n    public function getColumnNumber(): int\n    {\n        return $this->columnNumber;\n    }\n}\n"
  },
  {
    "path": "src/Project.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/**\n * phpDocumentor\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n *\n * @link      http://phpdoc.org\n */\n\nnamespace phpDocumentor\\Reflection;\n\n/**\n * Interface for project. Since the definition of a project can be different per factory this interface will be small.\n */\ninterface Project\n{\n    /**\n     * Returns the name of the project.\n     */\n    public function getName(): string;\n}\n"
  },
  {
    "path": "src/ProjectFactory.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/**\n * phpDocumentor\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n *\n * @link      http://phpdoc.org\n */\n\nnamespace phpDocumentor\\Reflection;\n\n/**\n * Interface for project factories. A project factory shall convert a set of files\n * into an object implementing the Project interface.\n */\ninterface ProjectFactory\n{\n    /**\n     * Creates a project from the set of files.\n     *\n     * @param File[] $files\n     */\n    public function create(string $name, array $files): Project;\n}\n"
  },
  {
    "path": "tests/unit/FqsenTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/**\n * phpDocumentor\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n *\n * @link      http://phpdoc.org\n */\n\nnamespace phpDocumentor\\Reflection;\n\nuse InvalidArgumentException;\nuse PHPUnit\\Framework\\TestCase;\n\n/**\n * @coversDefaultClass \\phpDocumentor\\Reflection\\Fqsen\n */\nclass FqsenTest extends TestCase\n{\n    /**\n     * @covers ::__construct\n     * @covers ::getName\n     * @dataProvider validFqsenProvider\n     */\n    public function testValidFormats(string $fqsen, string $name): void\n    {\n        $instance = new Fqsen($fqsen);\n        $this->assertEquals($name, $instance->getName());\n    }\n\n    /**\n     * Data provider for ValidFormats tests. Contains a complete list from psr-5 draft.\n     *\n     * @return array<array<string>>\n     */\n    public function validFqsenProvider(): array\n    {\n        return [\n            ['\\\\', ''],\n            ['\\My\\Space', 'Space'],\n            ['\\My\\Space\\myFunction()', 'myFunction'],\n            ['\\My\\Space\\MY_CONSTANT', 'MY_CONSTANT'],\n            ['\\My\\Space\\MY_CONSTANT2', 'MY_CONSTANT2'],\n            ['\\My\\Space\\MyClass', 'MyClass'],\n            ['\\My\\Space\\MyInterface', 'MyInterface'],\n            ['\\My\\Space\\Option«T»', 'Option«T»'],\n            ['\\My\\Space\\MyTrait', 'MyTrait'],\n            ['\\My\\Space\\MyClass::myMethod()', 'myMethod'],\n            ['\\My\\Space\\MyClass::$my_property', 'my_property'],\n            ['\\My\\Space\\MyClass::MY_CONSTANT', 'MY_CONSTANT'],\n        ];\n    }\n\n    /**\n     * @covers ::__construct\n     * @dataProvider invalidFqsenProvider\n     */\n    public function testInValidFormats(string $fqsen): void\n    {\n        $this->expectException(InvalidArgumentException::class);\n        new Fqsen($fqsen);\n    }\n\n    /**\n     * Data provider for invalidFormats tests. Contains a complete list from psr-5 draft.\n     *\n     * @return array<array<string>>\n     */\n    public function invalidFqsenProvider(): array\n    {\n        return [\n            ['\\My\\*'],\n            ['\\My\\Space\\.()'],\n            ['My\\Space'],\n            ['1_function()'],\n        ];\n    }\n\n    /**\n     * @covers ::__construct\n     * @covers ::__toString\n     */\n    public function testToString(): void\n    {\n        $className = new Fqsen('\\\\phpDocumentor\\\\Application');\n\n        $this->assertEquals('\\\\phpDocumentor\\\\Application', (string) $className);\n    }\n}\n"
  }
]